From 4612655c46bf271324f7ddafa40483da75408258 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 23 Nov 2019 15:21:07 -0500 Subject: [PATCH 001/302] update django code examples --- .../django/django-code-examples.markdown | 8 + .../django/django-forms-choicefield.markdown | 1492 +++++++++++++++++ content/pages/meta/00-change-log.markdown | 1 + 3 files changed, 1501 insertions(+) create mode 100644 content/pages/examples/django/django-forms-choicefield.markdown diff --git a/content/pages/examples/django/django-code-examples.markdown b/content/pages/examples/django/django-code-examples.markdown index 1cfa3c709..a703a3266 100644 --- a/content/pages/examples/django/django-code-examples.markdown +++ b/content/pages/examples/django/django-code-examples.markdown @@ -479,6 +479,14 @@ The code for django-wiki is provided as open source under the [GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). +### dmd-interpreter +[dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) +([running web app](http://www.dmd.nl/DOVE)) +is a Python tool to aggregate clinically relevant information related +to variants in the DMD gene and display that [data](/data.html) to a user +with a [Django](/django.html) web application. + + ### drf-action-serializer [drf-action-serializer](https://github.com/gregschmit/drf-action-serializer) ([PyPI page](https://pypi.org/project/drf-action-serializer/)) diff --git a/content/pages/examples/django/django-forms-choicefield.markdown b/content/pages/examples/django/django-forms-choicefield.markdown new file mode 100644 index 000000000..356021487 --- /dev/null +++ b/content/pages/examples/django/django-forms-choicefield.markdown @@ -0,0 +1,1492 @@ +title: django.forms ChoiceField Python Code Examples +category: page +slug: django-forms-choicefield-examples +sortorder: 50092 +toc: False +sidebartitle: django.forms ChoiceField +meta: Python code examples to show how to use the ChoiceField class within the forms module of the Django open source project. + + +The [ChoiceField](https://github.com/django/django/blob/master/django/forms/fields.py) +([documentation](https://docs.djangoproject.com/en/stable/ref/forms/fields/#choicefield)) +class in the `django.forms` module in the [Django](/django.html) +[web framework](/web-frameworks.html) provides a mechanism for safely handling +input from an HTTP POST request. The request is typically generated by an +[HTML](/hypertext-markup-language-html.html) form from the Django +[web application](/web-development.html). + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair/forms.py) + +```python +from django import forms +from django.contrib.auth import get_user_model +from django.db.models import Q +from django.utils.translation import ugettext_lazy as _ + +from conferences.models import Conference +from gears.widgets import CustomCheckboxSelectMultiple, CustomFileInput +from review.models import Reviewer, Review +from submissions.models import Submission +from users.models import Profile + + +User = get_user_model() + + +COMPLETION_STATUS = [ + ('EMPTY', 'Empty submissions'), + ('INCOMPLETE', 'Incomplete submissions'), + ('COMPLETE', 'Complete submissions'), +] + + +class FilterSubmissionsForm(forms.ModelForm): + class Meta: + model = Conference + fields = [] + + term = forms.CharField(required=False) + + completion = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + choices=COMPLETION_STATUS, + ) + + types = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + ) + + topics = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + ) + + status = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + choices=Submission.STATUS_CHOICE + ) + + countries = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + ) + + affiliations = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert isinstance(self.instance, Conference) + + self.fields['types'].choices = [ + (st.pk, st) for st in self.instance.submissiontype_set.all() + ] + self.fields['topics'].choices = [ + (topic.pk, topic) for topic in self.instance.topic_set.all() + ] + + # Getting profiles of all participants: + profiles = Profile.objects.filter( + user__authorship__submission__conference__pk=self.instance.pk + ).distinct() + + # Extracting all the different countries: + countries = list(set(p.country for p in profiles)) + countries.sort(key=lambda cnt: cnt.name) + self.fields['countries'].choices = [ + (cnt.code, cnt.name) for cnt in countries + ] + + # Extracting all the different affiliations: + affs = [item['affiliation'] for item in profiles.values('affiliation')] + affs.sort() + self.fields['affiliations'].choices = [(item, item) for item in affs] + + def apply(self, submissions): + term = self.cleaned_data['term'] + completion = self.cleaned_data['completion'] + types = [int(t) for t in self.cleaned_data['types']] + topics = [int(topic) for topic in self.cleaned_data['topics']] + status = self.cleaned_data['status'] + countries = self.cleaned_data['countries'] + affiliations = self.cleaned_data['affiliations'] + + auth_prs = { + sub: Profile.objects.filter(user__authorship__submission=sub) + for sub in submissions + } + + if term: + words = term.lower().split() + submissions = [ + sub for sub in submissions + if all(word in sub.title.lower() or + any(word in pr.get_full_name().lower() + for pr in auth_prs[sub]) or + any(word in pr.get_full_name_rus().lower() + for pr in auth_prs[sub]) + for word in words) + ] + + if completion: + _show_incomplete = 'INCOMPLETE' in completion + _show_complete = 'COMPLETE' in completion + _show_empty = 'EMPTY' in completion + + _sub_warnings = {sub: sub.warnings() for sub in submissions} + + submissions = [ + sub for sub in submissions + if (_sub_warnings[sub] and _show_incomplete or + not _sub_warnings[sub] and _show_complete or + not sub.title and _show_empty) + ] + + if topics: + _sub_topics = { + sub: set(x[0] for x in sub.topics.values_list('pk')) + for sub in submissions + } + submissions = [ + sub for sub in submissions + if any(topic in _sub_topics[sub] for topic in topics) + ] + + if types: + submissions = [sub for sub in submissions + if sub.stype and sub.stype.pk in types] + + if status: + submissions = [sub for sub in submissions if sub.status in status] + + if countries: + submissions = [ + sub for sub in submissions + if any(pr.country.code in countries for pr in auth_prs[sub]) + ] + + if affiliations: + submissions = [ + sub for sub in submissions + if any(pr.affiliation in affiliations for pr in auth_prs[sub]) + ] + + return submissions + + +ATTENDING_STATUS = ( + ('YES', 'Attending'), + ('NO', 'Not attending'), +) + + +class FilterUsersForm(forms.ModelForm): + class Meta: + model = Conference + fields = [] + + term = forms.CharField(required=False) + + attending_status = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + choices=ATTENDING_STATUS, + ) + + countries = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + ) + + affiliations = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert isinstance(self.instance, Conference) + + # Getting profiles of all participants: + profiles = Profile.objects.filter( + user__authorship__submission__conference__pk=self.instance.pk + ).distinct() + + # Extracting all the different countries: + countries = list(set(p.country for p in profiles)) + countries.sort(key=lambda cnt: cnt.name) + self.fields['countries'].choices = [ + (cnt.code, cnt.name) for cnt in countries + ] + + # Extracting all the different affiliations: + affs = [item['affiliation'] for item in profiles.values('affiliation')] + affs.sort() + self.fields['affiliations'].choices = [(item, item) for item in affs] + + def apply(self, users): + term = self.cleaned_data['term'] + attending_status = self.cleaned_data['attending_status'] + countries = self.cleaned_data['countries'] + affiliations = self.cleaned_data['affiliations'] + + # + # Here we map users list to profiles, then work with profiles and + # finally map filtered profiles back to users. + # + # This is done for performance reasons to avoid huge number of + # duplicated SQL queries when requesting foreign key object via + # `user.profile` call. + # + # This optimization allowed to increase the filter speed more than + # 10 times. + # + profiles = list(Profile.objects.filter(user__in=users)) + + if term: + words = term.lower().split() + profiles = [ + profile for profile in profiles + if all(any(word in string for string in [ + profile.get_full_name().lower(), + profile.get_full_name_rus().lower(), + profile.affiliation.lower(), + profile.get_country_display().lower() + ]) for word in words) + ] + + if attending_status: + _show_attending = 'YES' in attending_status + _show_not_attending = 'NO' in attending_status + + attending_profiles = Profile.objects.filter( + user__authorship__submission__conference=self.instance + ).distinct() + + profiles = [ + profile for profile in profiles + if (profile in attending_profiles and _show_attending or + profile not in attending_profiles and _show_not_attending) + ] + + if countries: + profiles = [ + profile for profile in profiles + if profile.country.code in countries + ] + + if affiliations: + profiles = [ + profile for profile in profiles + if profile.affiliation in affiliations + ] + + users = User.objects.filter(profile__in=profiles) + + return users + + +class ChairUploadReviewManuscriptForm(forms.ModelForm): + class Meta: + model = Submission + fields = ('review_manuscript',) + widgets = { + 'review_manuscript': CustomFileInput(attrs={ + 'accept': '.pdf', + 'show_file_name': True, + 'btn_class': 'btn-outline-secondary', + 'label': _('Review manuscript PDF file') + }) + } + + +class AssignReviewerForm(forms.Form): + reviewer = forms.ChoiceField(required=True, label=_('Assign reviewer')) + + def __init__(self, *args, submission=None): + super().__init__(*args) + self.submission = submission + + # Fill available reviewers - neither already assigned, nor authors: + reviews = submission.reviews.all() + assigned_reviewers = reviews.values_list('reviewer', flat=True) + authors_users = submission.authors.values_list('user', flat=True) + available_reviewers = Reviewer.objects.exclude( + Q(pk__in=assigned_reviewers) | Q(user__in=authors_users) + ) + profiles = { + rev: rev.user.profile for rev in available_reviewers + } + reviewers = list(available_reviewers) + reviewers.sort(key=lambda r: r.reviews.count()) + self.fields['reviewer'].choices = ( + (rev.pk, + f'{profiles[rev].get_full_name()} ({rev.reviews.count()}) - ' + f'{profiles[rev].affiliation}, ' + f'{profiles[rev].get_country_display()}') + for rev in reviewers + ) + + def save(self): + reviewer = Reviewer.objects.get(pk=self.cleaned_data['reviewer']) + review = Review.objects.create(reviewer=reviewer, paper=self.submission) + return review + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / forms / fields.py**](https://github.com/divio/django-cms/blob/develop/cms/forms/fields.py) + +```python +# -*- coding: utf-8 -*- +from django import forms +from django.contrib.admin.widgets import RelatedFieldWidgetWrapper +from django.forms.fields import EMPTY_VALUES +from django.utils.translation import ugettext_lazy as _ + +from cms.forms.utils import get_site_choices, get_page_choices +from cms.forms.validators import validate_url +from cms.forms.widgets import PageSelectWidget, PageSmartLinkWidget +from cms.models.pagemodel import Page + + +class SuperLazyIterator(object): + def __init__(self, func): + self.func = func + + def __iter__(self): + return iter(self.func()) + + +class LazyChoiceField(forms.ChoiceField): + def _set_choices(self, value): + # we overwrite this function so no list(value) is called + self._choices = self.widget.choices = value + + choices = property(forms.ChoiceField._get_choices, _set_choices) + + +class PageSelectFormField(forms.MultiValueField): + widget = PageSelectWidget + default_error_messages = { + 'invalid_site': _(u'Select a valid site'), + 'invalid_page': _(u'Select a valid page'), + } + + def __init__(self, queryset=None, empty_label=u"---------", cache_choices=False, + required=True, widget=None, to_field_name=None, limit_choices_to=None, + *args, **kwargs): + errors = self.default_error_messages.copy() + if 'error_messages' in kwargs: + errors.update(kwargs['error_messages']) + site_choices = SuperLazyIterator(get_site_choices) + page_choices = SuperLazyIterator(get_page_choices) + self.limit_choices_to = limit_choices_to + kwargs['required'] = required + fields = ( + LazyChoiceField(choices=site_choices, required=False, error_messages={'invalid': errors['invalid_site']}), + LazyChoiceField(choices=page_choices, required=False, error_messages={'invalid': errors['invalid_page']}), + ) + super(PageSelectFormField, self).__init__(fields, *args, **kwargs) + + def compress(self, data_list): + if data_list: + page_id = data_list[1] + + if page_id in EMPTY_VALUES: + if not self.required: + return None + raise forms.ValidationError(self.error_messages['invalid_page']) + return Page.objects.get(pk=page_id) + return None + + def has_changed(self, initial, data): + is_empty = data and (len(data) >= 2 and data[1] in [None, '']) + + if isinstance(self.widget, RelatedFieldWidgetWrapper): + self.widget.decompress = self.widget.widget.decompress + + if is_empty and initial is None: + # when empty data will have [u'1', u'', u''] as value + # this will cause django to always return True because of the '1' + # so we simply follow django's default behavior when initial is None and data is "empty" + data = ['' for x in range(0, len(data))] + return super(PageSelectFormField, self).has_changed(initial, data) + + def _has_changed(self, initial, data): + return self.has_changed(initial, data) + + +class PageSmartLinkField(forms.CharField): + widget = PageSmartLinkWidget + default_validators = [validate_url] + + def __init__(self, max_length=None, min_length=None, placeholder_text=None, + ajax_view=None, *args, **kwargs): + self.placeholder_text = placeholder_text + widget = self.widget(ajax_view=ajax_view) + super(PageSmartLinkField, self).__init__(max_length=max_length, min_length=min_length, + widget=widget, *args, **kwargs) + + def widget_attrs(self, widget): + attrs = super(PageSmartLinkField, self).widget_attrs(widget) + attrs.update({'placeholder_text': self.placeholder_text}) + return attrs + + def clean(self, value): + value = self.to_python(value).strip() + return super(PageSmartLinkField, self).clean(value) + +``` + + +## Example 3 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / dashboard / modules.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/dashboard/modules.py) + +```python +import json +from django import forms +from django.contrib.admin.models import LogEntry +from django.db.models import Q +from django.template.loader import render_to_string +from django.utils.translation import ugettext_lazy as _ +from jet.utils import get_app_list, LazyDateTimeEncoder, context_to_dict +import datetime + + +class DashboardModule(object): + """ + Base dashboard module class. All dashboard modules (widgets) should inherit it. + """ + + #: Path to widget's template. There is no need to extend such templates from any base templates. + template = 'jet.dashboard/module.html' + enabled = True + + #: Specify if module can be draggable or has static position. + draggable = True + + #: Specify if module can be collapsed. + collapsible = True + + #: Specify if module can be deleted. + deletable = True + show_title = True + + #: Default widget title that will be displayed for widget in the dashboard. User can change it later + #: for every widget. + title = '' + + #: Specify title url. ``None`` if title shouldn't be clickable. + title_url = None + css_classes = None + + #: HTML content that will be displayed before widget content. + pre_content = None + + #: HTML content that will be displayed after widget content. + post_content = None + children = None + + #: A ``django.forms.Form`` class which may contain custom widget settings. Not required. + settings_form = None + + #: A ``django.forms.Form`` class which may contain custom widget child settings, if it has any. Not required. + child_form = None + + #: Child name that will be displayed when editing module contents. Required if ``child_form`` set. + child_name = None + + #: Same as child name, but plural. + child_name_plural = None + settings = None + column = None + order = None + + #: A boolean field which specify if widget should be rendered on dashboard page load or fetched + #: later via AJAX. + ajax_load = False + + #: A boolean field which makes widget ui color contrast. + contrast = False + + #: Optional style attributes which will be applied to widget content container. + style = False + + class Media: + css = () + js = () + + def __init__(self, title=None, model=None, context=None, **kwargs): + if title is not None: + self.title = title + self.model = model + self.context = context or {} + + for key in kwargs: + if hasattr(self.__class__, key): + setattr(self, key, kwargs[key]) + + self.children = self.children or [] + + if self.model: + self.load_from_model() + + def fullname(self): + return self.__module__ + "." + self.__class__.__name__ + + def load_settings(self, settings): + """ + Should be implemented to restore saved in database settings. Required if you have custom settings. + """ + pass + + def load_children(self, children): + self.children = children + + def store_children(self): + """ + Specify if children field should be saved to database. + """ + return False + + def settings_dict(self): + """ + Should be implemented to save settings to database. This method should return ``dict`` which will be serialized + using ``json``. Required if you have custom settings. + """ + pass + + def dump_settings(self, settings=None): + settings = settings or self.settings_dict() + if settings: + return json.dumps(settings, cls=LazyDateTimeEncoder) + else: + return '' + + def dump_children(self): + if self.store_children(): + return json.dumps(self.children, cls=LazyDateTimeEncoder) + else: + return '' + + def load_from_model(self): + self.title = self.model.title + + if self.model.settings: + try: + self.settings = json.loads(self.model.settings) + self.load_settings(self.settings) + except ValueError: + pass + + if self.store_children() and self.model.children: + try: + children = json.loads(self.model.children) + self.load_children(children) + except ValueError: + pass + + def init_with_context(self, context): + """ + Allows you to load data and initialize module's state. + """ + pass + + def get_context_data(self): + context = context_to_dict(self.context) + context.update({ + 'module': self + }) + return context + + def render(self): + self.init_with_context(self.context) + return render_to_string(self.template, self.get_context_data()) + + +class LinkListItemForm(forms.Form): + url = forms.CharField(label=_('URL')) + title = forms.CharField(label=_('Title')) + external = forms.BooleanField(label=_('External link'), required=False) + + +class LinkListSettingsForm(forms.Form): + layout = forms.ChoiceField(label=_('Layout'), choices=(('stacked', _('Stacked')), ('inline', _('Inline')))) + + +class LinkList(DashboardModule): + """ + List of links widget. + + Usage example: + + .. code-block:: python + + from django.utils.translation import ugettext_lazy as _ + from jet.dashboard import modules + from jet.dashboard.dashboard import Dashboard, AppIndexDashboard + + + class CustomIndexDashboard(Dashboard): + columns = 3 + + def init_with_context(self, context): + self.available_children.append(modules.LinkList) + self.children.append(modules.LinkList( + _('Support'), + children=[ + { + 'title': _('Django documentation'), + 'url': 'http://docs.djangoproject.com/', + 'external': True, + }, + { + 'title': _('Django "django-users" mailing list'), + 'url': 'http://groups.google.com/group/django-users', + 'external': True, + }, + { + 'title': _('Django irc channel'), + 'url': 'irc://irc.freenode.net/django', + 'external': True, + }, + ], + column=0, + order=0 + )) + + """ + + title = _('Links') + template = 'jet.dashboard/modules/link_list.html' + + #: Specify widget layout. + #: Allowed values ``stacked`` and ``inline``. + layout = 'stacked' + + #: Links are contained in ``children`` attribute which you can pass as constructor parameter + #: to make your own preinstalled link lists. + #: + #: ``children`` is an array of dictinaries:: + #: + #: [ + #: { + #: 'title': _('Django documentation'), + #: 'url': 'http://docs.djangoproject.com/', + #: 'external': True, + #: }, + #: ... + #: ] + children = [] + settings_form = LinkListSettingsForm + child_form = LinkListItemForm + child_name = _('Link') + child_name_plural = _('Links') + + def __init__(self, title=None, children=list(), **kwargs): + children = list(map(self.parse_link, children)) + kwargs.update({'children': children}) + super(LinkList, self).__init__(title, **kwargs) + + def settings_dict(self): + return { + 'draggable': self.draggable, + 'deletable': self.deletable, + 'collapsible': self.collapsible, + 'layout': self.layout + } + + def load_settings(self, settings): + self.draggable = settings.get('draggable', self.draggable) + self.deletable = settings.get('deletable', self.deletable) + self.collapsible = settings.get('collapsible', self.collapsible) + self.layout = settings.get('layout', self.layout) + + def store_children(self): + return True + + def parse_link(self, link): + if isinstance(link, (tuple, list)): + link_dict = {'title': link[0], 'url': link[1]} + if len(link) >= 3: + link_dict['external'] = link[2] + return link_dict + elif isinstance(link, (dict,)): + return link + + +class AppList(DashboardModule): + """ + Shows applications and containing models links. For each model "created" and "change" links are displayed. + + Usage example: + + .. code-block:: python + + from django.utils.translation import ugettext_lazy as _ + from jet.dashboard import modules + from jet.dashboard.dashboard import Dashboard, AppIndexDashboard + + + class CustomIndexDashboard(Dashboard): + columns = 3 + + def init_with_context(self, context): + self.children.append(modules.AppList( + _('Applications'), + exclude=('auth.*',), + column=0, + order=0 + )) + + """ + + title = _('Applications') + template = 'jet.dashboard/modules/app_list.html' + + #: Specify models which should be displayed. ``models`` is an array of string formatted as ``app_label.model``. + #: Also its possible to specify all application models with * sign (e.g. ``auth.*``). + models = None + + #: Specify models which should NOT be displayed. ``exclude`` is an array of string formatted as ``app_label.model``. + #: Also its possible to specify all application models with * sign (e.g. ``auth.*``). + exclude = None + hide_empty = True + + def settings_dict(self): + return { + 'models': self.models, + 'exclude': self.exclude + } + + def load_settings(self, settings): + self.models = settings.get('models') + self.exclude = settings.get('exclude') + + def init_with_context(self, context): + app_list = get_app_list(context) + app_to_remove = [] + + for app in app_list: + app_name = app.get('app_label', app.get('name', '')) + app['models'] = filter( + lambda model: self.models is None or ('%s.%s' % (app_name, model['object_name'])) in self.models or ('%s.*' % app_name) in self.models, + app['models'] + ) + app['models'] = filter( + lambda model: self.exclude is None or (('%s.%s' % (app_name, model['object_name'])) not in self.exclude and ('%s.*' % app_name) not in self.exclude), + app['models'] + ) + app['models'] = list(app['models']) + + if self.hide_empty and len(list(app['models'])) == 0: + app_to_remove.append(app) + + for app in app_to_remove: + app_list.remove(app) + + self.children = app_list + + +class ModelList(DashboardModule): + """ + Shows models links. For each model "created" and "change" links are displayed. + + Usage example: + + .. code-block:: python + + from django.utils.translation import ugettext_lazy as _ + from jet.dashboard import modules + from jet.dashboard.dashboard import Dashboard, AppIndexDashboard + + + class CustomIndexDashboard(Dashboard): + columns = 3 + + def init_with_context(self, context): + self.children.append(modules.ModelList( + _('Models'), + exclude=('auth.*',), + column=0, + order=0 + )) + + """ + + title = _('Models') + template = 'jet.dashboard/modules/model_list.html' + + #: Specify models which should be displayed. ``models`` is an array of string formatted as ``app_label.model``. + #: Also its possible to specify all application models with * sign (e.g. ``auth.*``). + models = None + + #: Specify models which should NOT be displayed. ``exclude`` is an array of string formatted as ``app_label.model``. + #: Also its possible to specify all application models with * sign (e.g. ``auth.*``). + exclude = None + hide_empty = True + + def settings_dict(self): + return { + 'models': self.models, + 'exclude': self.exclude + } + + def load_settings(self, settings): + self.models = settings.get('models') + self.exclude = settings.get('exclude') + + def init_with_context(self, context): + app_list = get_app_list(context) + models = [] + + for app in app_list: + app_name = app.get('app_label', app.get('name', '')) + app['models'] = filter( + lambda model: self.models is None or ('%s.%s' % (app_name, model['object_name'])) in self.models or ('%s.*' % app_name) in self.models, + app['models'] + ) + app['models'] = filter( + lambda model: self.exclude is None or (('%s.%s' % (app_name, model['object_name'])) not in self.exclude and ('%s.*' % app_name) not in self.exclude), + app['models'] + ) + app['models'] = list(app['models']) + + models.extend(app['models']) + + self.children = models + + +class RecentActionsSettingsForm(forms.Form): + limit = forms.IntegerField(label=_('Items limit'), min_value=1) + + +class RecentActions(DashboardModule): + """ + Display list of most recent admin actions with following information: + entity name, type of action, author, date + + Usage example: + + .. code-block:: python + + from django.utils.translation import ugettext_lazy as _ + from jet.dashboard import modules + from jet.dashboard.dashboard import Dashboard, AppIndexDashboard + + + class CustomIndexDashboard(Dashboard): + columns = 3 + + def init_with_context(self, context): + self.children.append(modules.RecentActions( + _('Recent Actions'), + 10, + column=0, + order=0 + )) + + """ + + title = _('Recent Actions') + template = 'jet.dashboard/modules/recent_actions.html' + + #: Number if entries to be shown (may be changed by each user personally). + limit = 10 + + #: Specify actions of which models should be displayed. ``include_list`` is an array of string + #: formatted as ``app_label.model``. Also its possible to specify all application models + #: with * sign (e.g. ``auth.*``). + include_list = None + + #: Specify actions of which models should NOT be displayed. ``exclude_list`` is an array of string + #: formatted as ``app_label.model``. Also its possible to specify all application models + #: with * sign (e.g. ``auth.*``). + exclude_list = None + settings_form = RecentActionsSettingsForm + user = None + + def __init__(self, title=None, limit=10, **kwargs): + kwargs.update({'limit': limit}) + super(RecentActions, self).__init__(title, **kwargs) + + def settings_dict(self): + return { + 'limit': self.limit, + 'include_list': self.include_list, + 'exclude_list': self.exclude_list, + 'user': self.user + } + + def load_settings(self, settings): + self.limit = settings.get('limit', self.limit) + self.include_list = settings.get('include_list') + self.exclude_list = settings.get('exclude_list') + self.user = settings.get('user', None) + + def init_with_context(self, context): + def get_qset(list): + qset = None + for contenttype in list: + try: + app_label, model = contenttype.split('.') + + if model == '*': + current_qset = Q( + content_type__app_label=app_label + ) + else: + current_qset = Q( + content_type__app_label=app_label, + content_type__model=model + ) + except: + raise ValueError('Invalid contenttype: "%s"' % contenttype) + + if qset is None: + qset = current_qset + else: + qset = qset | current_qset + return qset + + qs = LogEntry.objects + + if self.user: + qs = qs.filter( + user__pk=int(self.user) + ) + + if self.include_list: + qs = qs.filter(get_qset(self.include_list)) + if self.exclude_list: + qs = qs.exclude(get_qset(self.exclude_list)) + + self.children = qs.select_related('content_type', 'user')[:int(self.limit)] + + +class FeedSettingsForm(forms.Form): + limit = forms.IntegerField(label=_('Items limit'), min_value=1) + feed_url = forms.URLField(label=_('Feed URL')) + + +class Feed(DashboardModule): + """ + Display RSS Feed entries with following information: + entry title, date and link to the full version + + Usage example: + + .. code-block:: python + + from django.utils.translation import ugettext_lazy as _ + from jet.dashboard import modules + from jet.dashboard.dashboard import Dashboard, AppIndexDashboard + + + class CustomIndexDashboard(Dashboard): + columns = 3 + + def init_with_context(self, context): + self.children.append(modules.Feed( + _('Latest Django News'), + feed_url='http://www.djangoproject.com/rss/weblog/', + limit=5, + column=0, + order=0 + )) + + """ + + title = _('RSS Feed') + template = 'jet.dashboard/modules/feed.html' + + #: URL of the RSS feed (may be changed by each user personally). + feed_url = None + + #: Number if entries to be shown (may be changed by each user personally). + limit = None + settings_form = FeedSettingsForm + ajax_load = True + + def __init__(self, title=None, feed_url=None, limit=None, **kwargs): + kwargs.update({'feed_url': feed_url, 'limit': limit}) + super(Feed, self).__init__(title, **kwargs) + + def settings_dict(self): + return { + 'feed_url': self.feed_url, + 'limit': self.limit + } + + def load_settings(self, settings): + self.feed_url = settings.get('feed_url') + self.limit = settings.get('limit') + + def init_with_context(self, context): + if self.feed_url is not None: + try: + import feedparser + + feed = feedparser.parse(self.feed_url) + + if self.limit is not None: + entries = feed['entries'][:self.limit] + else: + entries = feed['entries'] + + for entry in entries: + try: + entry.date = datetime.date(*entry.published_parsed[0:3]) + except: + pass + + self.children.append(entry) + except ImportError: + self.children.append({ + 'title': _('You must install the FeedParser python module'), + 'warning': True, + }) + else: + self.children.append({ + 'title': _('You must provide a valid feed URL'), + 'warning': True, + }) + + +``` + + +## Example 4 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / forms / form_mixins.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/forms/form_mixins.py) + +```python +# -*- coding: utf-8 -*- + +import six +from copy import deepcopy + +from django import forms +from mongoengine.base import BaseList +from mongoengine.base import TopLevelDocumentMetaclass +from mongoengine.fields import Document +from mongoengine.fields import EmbeddedDocumentField +from mongoengine.fields import ListField +from mongoengine.fields import ReferenceField + +from .form_utils import FieldTuple +from .form_utils import has_digit +from .form_utils import make_key +from .widgets import get_form_field_class +from mongonaut.utils import trim_field_key + +try: + # OrderedDict New in version 2.7 + from collections import OrderedDict +except ImportError: + OrderedDict = dict + +CHECK_ATTRS = {'required': 'required', + 'help_text': 'help_text', + 'name': 'name'} + + +def get_document_unicode(document): + """Safely converts MongoDB document strings to unicode.""" + try: + return document.__unicode__() + except AttributeError: + return six.text_type(document) + + +class MongoModelFormBaseMixin(object): + """ + For use with mongoengine. + + This mixin should not be used alone it should be used to inherit from. + + This mixin provides functionality for generating a form. Provides 4 methods + useful for putting data on a form: + + get_form_field_dict -- creates a keyed tuple representation of a model field used + to create form fields + set_form_fields -- takes the form field dictionary and sets all values on a form + set_form_field -- sets an individual form field + get_field_value -- returns the value for the field + + If you inherit from this class you will need to call the above methods + with the correct values, see forms.py for an example. + """ + + def __init__(self, model, instance=None, form_post_data=None): + """ + Params: + model -- The model class to create the form with + instance -- An instance of the model class can be used to + initialize data. + form_post_data -- Values given by request.POST + """ + self.model = model + self.model_instance = instance + self.post_data_dict = form_post_data + # Preferred for symantic checks of model_instance + self.is_initialized = False if instance is None else True + self.form = forms.Form() + + if not isinstance(self.model, TopLevelDocumentMetaclass): + raise TypeError(u"The model supplied must be a mongoengine Document") + + if self.is_initialized and not isinstance(self.model_instance, self.model): + raise TypeError(u"The provided instance must be an instance of the given model") + + if self.post_data_dict is not None and not isinstance(self.post_data_dict, dict): + raise TypeError(u"You must pass in a dictionary for form_post_data") + + def get_form_field_dict(self, model_dict): + """ + Takes a model dictionary representation and creates a dictionary + keyed by form field. Each value is a keyed 4 tuple of: + (widget, mode_field_instance, model_field_type, field_key) + """ + return_dict = OrderedDict() + # Workaround: mongoengine doesn't preserve form fields ordering from metaclass __new__ + if hasattr(self.model, 'Meta') and hasattr(self.model.Meta, 'form_fields_ordering'): + field_order_list = tuple(form_field for form_field + in self.model.Meta.form_fields_ordering + if form_field in model_dict.iterkeys()) + order_dict = OrderedDict.fromkeys(field_order_list) + return_dict = order_dict + + for field_key, field_dict in sorted(model_dict.items()): + if not field_key.startswith("_"): + widget = field_dict.get('_widget', None) + if widget is None: + return_dict[field_key] = self.get_form_field_dict(field_dict) + return_dict[field_key].update({'_field_type': field_dict.get('_field_type', None)}) + else: + return_dict[field_key] = FieldTuple(widget, + field_dict.get('_document_field', None), + field_dict.get('_field_type', None), + field_dict.get('_key', None)) + return return_dict + + def set_form_fields(self, form_field_dict, parent_key=None, field_type=None): + """ + Set the form fields for every key in the form_field_dict. + + Params: + form_field_dict -- a dictionary created by get_form_field_dict + parent_key -- the key for the previous key in the recursive call + field_type -- used to determine what kind of field we are setting + """ + for form_key, field_value in form_field_dict.items(): + form_key = make_key(parent_key, form_key) if parent_key is not None else form_key + if isinstance(field_value, tuple): + + set_list_class = False + base_key = form_key + + # Style list fields + if ListField in (field_value.field_type, field_type): + + # Nested lists/embedded docs need special care to get + # styles to work out nicely. + if parent_key is None or ListField == field_value.field_type: + if field_type != EmbeddedDocumentField: + field_value.widget.attrs['class'] += ' listField {0}'.format(form_key) + set_list_class = True + else: + field_value.widget.attrs['class'] += ' listField' + + # Compute number value for list key + list_keys = [field_key for field_key in self.form.fields.keys() + if has_digit(field_key)] + + key_int = 0 + while form_key in list_keys: + key_int += 1 + form_key = make_key(form_key, key_int) + + if parent_key is not None: + + # Get the base key for our embedded field class + valid_base_keys = [model_key for model_key in self.model_map_dict.keys() + if not model_key.startswith("_")] + while base_key not in valid_base_keys and base_key: + base_key = make_key(base_key, exclude_last_string=True) + + # We need to remove the trailing number from the key + # so that grouping will occur on the front end when we have a list. + embedded_key_class = None + if set_list_class: + field_value.widget.attrs['class'] += " listField".format(base_key) + embedded_key_class = make_key(field_key, exclude_last_string=True) + + field_value.widget.attrs['class'] += " embeddedField" + + # Setting the embedded key correctly allows to visually nest the + # embedded documents on the front end. + if base_key == parent_key: + field_value.widget.attrs['class'] += ' {0}'.format(base_key) + else: + field_value.widget.attrs['class'] += ' {0} {1}'.format(base_key, parent_key) + + if embedded_key_class is not None: + field_value.widget.attrs['class'] += ' {0}'.format(embedded_key_class) + + default_value = self.get_field_value(form_key) + + # Style embedded documents + if isinstance(default_value, list) and len(default_value) > 0: + key_index = int(form_key.split("_")[-1]) + new_base_key = make_key(form_key, exclude_last_string=True) + + for list_value in default_value: + # Note, this is copied every time so each widget gets a different class + list_widget = deepcopy(field_value.widget) + new_key = make_key(new_base_key, six.text_type(key_index)) + list_widget.attrs['class'] += " {0}".format(make_key(base_key, key_index)) + self.set_form_field(list_widget, field_value.document_field, new_key, list_value) + key_index += 1 + else: + self.set_form_field(field_value.widget, field_value.document_field, + form_key, default_value) + + elif isinstance(field_value, dict): + self.set_form_fields(field_value, form_key, field_value.get("_field_type", None)) + + def set_form_field(self, widget, model_field, field_key, default_value): + """ + Parmams: + widget -- the widget to use for displyaing the model_field + model_field -- the field on the model to create a form field with + field_key -- the name for the field on the form + default_value -- the value to give for the field + Default: None + """ + # Empty lists cause issues on form validation + if default_value == []: + default_value = None + + if widget and isinstance(widget, forms.widgets.Select): + self.form.fields[field_key] = forms.ChoiceField(label=model_field.name, + required=model_field.required, + widget=widget) + else: + field_class = get_form_field_class(model_field) + self.form.fields[field_key] = field_class(label=model_field.name, + required=model_field.required, + widget=widget) + + if default_value is not None: + if isinstance(default_value, Document): + # Probably a reference field, therefore, add id + self.form.fields[field_key].initial = getattr(default_value, 'id', None) + else: + self.form.fields[field_key].initial = default_value + else: + self.form.fields[field_key].initial = getattr(model_field, 'default', None) + + if isinstance(model_field, ReferenceField): + self.form.fields[field_key].choices = [(six.text_type(x.id), get_document_unicode(x)) + for x in model_field.document_type.objects.all()] + # Adding in blank choice so a reference field can be deleted by selecting blank + self.form.fields[field_key].choices.insert(0, ("", "")) + + elif model_field.choices: + self.form.fields[field_key].choices = model_field.choices + + for key, form_attr in CHECK_ATTRS.items(): + if hasattr(model_field, key): + value = getattr(model_field, key) + setattr(self.form.fields[field_key], key, value) + + def get_field_value(self, field_key): + """ + Given field_key will return value held at self.model_instance. If + model_instance has not been provided will return None. + """ + + def get_value(document, field_key): + # Short circuit the function if we do not have a document + if document is None: + return None + + current_key, new_key_array = trim_field_key(document, field_key) + key_array_digit = int(new_key_array[-1]) if new_key_array and has_digit(new_key_array) else None + new_key = make_key(new_key_array) + + if key_array_digit is not None and len(new_key_array) > 0: + # Handleing list fields + if len(new_key_array) == 1: + return_data = document._data.get(current_key, []) + elif isinstance(document, BaseList): + return_list = [] + if len(document) > 0: + return_list = [get_value(doc, new_key) for doc in document] + return_data = return_list + else: + return_data = get_value(getattr(document, current_key), new_key) + + elif len(new_key_array) > 0: + return_data = get_value(document._data.get(current_key), new_key) + else: + # Handeling all other fields and id + try: # Added try except otherwise we get "TypeError: getattr(): attribute name must be string" error from mongoengine/base/datastructures.py + return_data = (document._data.get(None, None) if current_key == "id" else + document._data.get(current_key, None)) + except: + return_data = document._data.get(current_key, None) + + return return_data + + if self.is_initialized: + return get_value(self.model_instance, field_key) + else: + return None + +``` + + +## Example 5 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / images / forms.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/forms.py) + +```python +from django import forms +from django.forms.models import modelform_factory +from django.utils.text import capfirst +from django.utils.translation import ugettext as _ + +from wagtail.admin import widgets +from wagtail.admin.forms.collections import ( + BaseCollectionMemberForm, collection_member_permission_formset_factory) +from wagtail.images.fields import WagtailImageField +from wagtail.images.formats import get_image_formats +from wagtail.images.models import Image +from wagtail.images.permissions import permission_policy as images_permission_policy + + +# Callback to allow us to override the default form field for the image file field +def formfield_for_dbfield(db_field, **kwargs): + # Check if this is the file field + if db_field.name == 'file': + return WagtailImageField(label=capfirst(db_field.verbose_name), **kwargs) + + # For all other fields, just call its formfield() method. + return db_field.formfield(**kwargs) + + +class BaseImageForm(BaseCollectionMemberForm): + permission_policy = images_permission_policy + + +def get_image_form(model): + fields = model.admin_form_fields + if 'collection' not in fields: + # force addition of the 'collection' field, because leaving it out can + # cause dubious results when multiple collections exist (e.g adding the + # document to the root collection where the user may not have permission) - + # and when only one collection exists, it will get hidden anyway. + fields = list(fields) + ['collection'] + + return modelform_factory( + model, + form=BaseImageForm, + fields=fields, + formfield_callback=formfield_for_dbfield, + # set the 'file' widget to a FileInput rather than the default ClearableFileInput + # so that when editing, we don't get the 'currently: ...' banner which is + # a bit pointless here + widgets={ + 'tags': widgets.AdminTagWidget, + 'file': forms.FileInput(), + 'focal_point_x': forms.HiddenInput(attrs={'class': 'focal_point_x'}), + 'focal_point_y': forms.HiddenInput(attrs={'class': 'focal_point_y'}), + 'focal_point_width': forms.HiddenInput(attrs={'class': 'focal_point_width'}), + 'focal_point_height': forms.HiddenInput(attrs={'class': 'focal_point_height'}), + }) + + +class ImageInsertionForm(forms.Form): + """ + Form for selecting parameters of the image (e.g. format) prior to insertion + into a rich text area + """ + format = forms.ChoiceField( + choices=[(format.name, format.label) for format in get_image_formats()], + widget=forms.RadioSelect + ) + alt_text = forms.CharField() + + +class URLGeneratorForm(forms.Form): + filter_method = forms.ChoiceField( + label=_("Filter"), + choices=( + ('original', _("Original size")), + ('width', _("Resize to width")), + ('height', _("Resize to height")), + ('min', _("Resize to min")), + ('max', _("Resize to max")), + ('fill', _("Resize to fill")), + ), + ) + width = forms.IntegerField(label=_("Width"), min_value=0) + height = forms.IntegerField(label=_("Height"), min_value=0) + closeness = forms.IntegerField(label=_("Closeness"), min_value=0, initial=0) + + +GroupImagePermissionFormSet = collection_member_permission_formset_factory( + Image, + [ + ('add_image', _("Add"), _("Add/edit images you own")), + ('change_image', _("Edit"), _("Edit any image")), + ], + 'wagtailimages/permissions/includes/image_permissions_formset.html' +) + +``` + + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 53af30b59..7d5c45fb6 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -21,6 +21,7 @@ on GitHub. * Added new Django code example pages: * [django.forms BooleanField](/django-forms-booleanfield-examples.html) * [django.forms CharField](/django-forms-charfield-examples.html) + * [django.forms ChoiceField](/django-forms-choicefield-examples.html) ### October * Removed a bunch of outdated content from the From 049ce9884818d42a87a48fa44e05b07b4ef5d007 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 25 Nov 2019 07:18:00 -0500 Subject: [PATCH 002/302] adding new css resource --- content/pages/04-web-development/17-css.markdown | 5 +++++ theme/templates/table-of-contents.html | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/content/pages/04-web-development/17-css.markdown b/content/pages/04-web-development/17-css.markdown index d9aa5e8a1..273d04119 100644 --- a/content/pages/04-web-development/17-css.markdown +++ b/content/pages/04-web-development/17-css.markdown @@ -156,6 +156,11 @@ web application's design. * [Can I Use...](http://caniuse.com/) is a compatibility table that shows which versions of browsers implement specific CSS features. +* [How do you remove unused CSS from a site?](https://css-tricks.com/how-do-you-remove-unused-css-from-a-site/) + covers tools for identifying unnecessary CSS and the process for eliminating + rules that are overwritten by other rules and therefore do not need to + be sent to the client. + * The [Web Design Museum](https://www.webdesignmuseum.org/) is an amazing look back at how web design has evolved over the past 25+ years. Some of the designs can still be seen in their current site's presentation such diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index ed4c67bfc..d225d7ab1 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -76,7 +76,8 @@

django.db.models

django.dispatch.dispatcher Signal

django.forms BooleanField, - CharField + CharField, + ChoiceField

django.http HttpResponse From e65aa376cbf6a425eac09b531f01d62c85987841 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 25 Nov 2019 15:38:39 -0500 Subject: [PATCH 003/302] finish highlighting in forms.ChoicesField django example code --- .../django/django-forms-choicefield.markdown | 1165 +---------------- 1 file changed, 61 insertions(+), 1104 deletions(-) diff --git a/content/pages/examples/django/django-forms-choicefield.markdown b/content/pages/examples/django/django-forms-choicefield.markdown index 356021487..c7cf51558 100644 --- a/content/pages/examples/django/django-forms-choicefield.markdown +++ b/content/pages/examples/django/django-forms-choicefield.markdown @@ -24,7 +24,8 @@ system built with [Django](/django.html). The code is open source under the [**dccnsys / wwwdccn / chair / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair/forms.py) ```python -from django import forms +# forms.py +~~from django import forms from django.contrib.auth import get_user_model from django.db.models import Q from django.utils.translation import ugettext_lazy as _ @@ -46,264 +47,11 @@ COMPLETION_STATUS = [ ] -class FilterSubmissionsForm(forms.ModelForm): - class Meta: - model = Conference - fields = [] - - term = forms.CharField(required=False) - - completion = forms.MultipleChoiceField( - widget=CustomCheckboxSelectMultiple, required=False, - choices=COMPLETION_STATUS, - ) - - types = forms.MultipleChoiceField( - widget=CustomCheckboxSelectMultiple, required=False, - ) - - topics = forms.MultipleChoiceField( - widget=CustomCheckboxSelectMultiple, required=False, - ) - - status = forms.MultipleChoiceField( - widget=CustomCheckboxSelectMultiple, required=False, - choices=Submission.STATUS_CHOICE - ) - - countries = forms.MultipleChoiceField( - widget=CustomCheckboxSelectMultiple, required=False, - ) - - affiliations = forms.MultipleChoiceField( - widget=CustomCheckboxSelectMultiple, required=False, - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - assert isinstance(self.instance, Conference) - - self.fields['types'].choices = [ - (st.pk, st) for st in self.instance.submissiontype_set.all() - ] - self.fields['topics'].choices = [ - (topic.pk, topic) for topic in self.instance.topic_set.all() - ] - - # Getting profiles of all participants: - profiles = Profile.objects.filter( - user__authorship__submission__conference__pk=self.instance.pk - ).distinct() - - # Extracting all the different countries: - countries = list(set(p.country for p in profiles)) - countries.sort(key=lambda cnt: cnt.name) - self.fields['countries'].choices = [ - (cnt.code, cnt.name) for cnt in countries - ] - - # Extracting all the different affiliations: - affs = [item['affiliation'] for item in profiles.values('affiliation')] - affs.sort() - self.fields['affiliations'].choices = [(item, item) for item in affs] - - def apply(self, submissions): - term = self.cleaned_data['term'] - completion = self.cleaned_data['completion'] - types = [int(t) for t in self.cleaned_data['types']] - topics = [int(topic) for topic in self.cleaned_data['topics']] - status = self.cleaned_data['status'] - countries = self.cleaned_data['countries'] - affiliations = self.cleaned_data['affiliations'] - - auth_prs = { - sub: Profile.objects.filter(user__authorship__submission=sub) - for sub in submissions - } - - if term: - words = term.lower().split() - submissions = [ - sub for sub in submissions - if all(word in sub.title.lower() or - any(word in pr.get_full_name().lower() - for pr in auth_prs[sub]) or - any(word in pr.get_full_name_rus().lower() - for pr in auth_prs[sub]) - for word in words) - ] - - if completion: - _show_incomplete = 'INCOMPLETE' in completion - _show_complete = 'COMPLETE' in completion - _show_empty = 'EMPTY' in completion - - _sub_warnings = {sub: sub.warnings() for sub in submissions} - - submissions = [ - sub for sub in submissions - if (_sub_warnings[sub] and _show_incomplete or - not _sub_warnings[sub] and _show_complete or - not sub.title and _show_empty) - ] - - if topics: - _sub_topics = { - sub: set(x[0] for x in sub.topics.values_list('pk')) - for sub in submissions - } - submissions = [ - sub for sub in submissions - if any(topic in _sub_topics[sub] for topic in topics) - ] - - if types: - submissions = [sub for sub in submissions - if sub.stype and sub.stype.pk in types] - - if status: - submissions = [sub for sub in submissions if sub.status in status] - - if countries: - submissions = [ - sub for sub in submissions - if any(pr.country.code in countries for pr in auth_prs[sub]) - ] - - if affiliations: - submissions = [ - sub for sub in submissions - if any(pr.affiliation in affiliations for pr in auth_prs[sub]) - ] - - return submissions - - -ATTENDING_STATUS = ( - ('YES', 'Attending'), - ('NO', 'Not attending'), -) - - -class FilterUsersForm(forms.ModelForm): - class Meta: - model = Conference - fields = [] - - term = forms.CharField(required=False) - - attending_status = forms.MultipleChoiceField( - widget=CustomCheckboxSelectMultiple, required=False, - choices=ATTENDING_STATUS, - ) - - countries = forms.MultipleChoiceField( - widget=CustomCheckboxSelectMultiple, required=False, - ) - - affiliations = forms.MultipleChoiceField( - widget=CustomCheckboxSelectMultiple, required=False, - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - assert isinstance(self.instance, Conference) - - # Getting profiles of all participants: - profiles = Profile.objects.filter( - user__authorship__submission__conference__pk=self.instance.pk - ).distinct() - - # Extracting all the different countries: - countries = list(set(p.country for p in profiles)) - countries.sort(key=lambda cnt: cnt.name) - self.fields['countries'].choices = [ - (cnt.code, cnt.name) for cnt in countries - ] - - # Extracting all the different affiliations: - affs = [item['affiliation'] for item in profiles.values('affiliation')] - affs.sort() - self.fields['affiliations'].choices = [(item, item) for item in affs] - - def apply(self, users): - term = self.cleaned_data['term'] - attending_status = self.cleaned_data['attending_status'] - countries = self.cleaned_data['countries'] - affiliations = self.cleaned_data['affiliations'] - - # - # Here we map users list to profiles, then work with profiles and - # finally map filtered profiles back to users. - # - # This is done for performance reasons to avoid huge number of - # duplicated SQL queries when requesting foreign key object via - # `user.profile` call. - # - # This optimization allowed to increase the filter speed more than - # 10 times. - # - profiles = list(Profile.objects.filter(user__in=users)) - - if term: - words = term.lower().split() - profiles = [ - profile for profile in profiles - if all(any(word in string for string in [ - profile.get_full_name().lower(), - profile.get_full_name_rus().lower(), - profile.affiliation.lower(), - profile.get_country_display().lower() - ]) for word in words) - ] - - if attending_status: - _show_attending = 'YES' in attending_status - _show_not_attending = 'NO' in attending_status - - attending_profiles = Profile.objects.filter( - user__authorship__submission__conference=self.instance - ).distinct() - - profiles = [ - profile for profile in profiles - if (profile in attending_profiles and _show_attending or - profile not in attending_profiles and _show_not_attending) - ] - - if countries: - profiles = [ - profile for profile in profiles - if profile.country.code in countries - ] - - if affiliations: - profiles = [ - profile for profile in profiles - if profile.affiliation in affiliations - ] - - users = User.objects.filter(profile__in=profiles) - - return users - - -class ChairUploadReviewManuscriptForm(forms.ModelForm): - class Meta: - model = Submission - fields = ('review_manuscript',) - widgets = { - 'review_manuscript': CustomFileInput(attrs={ - 'accept': '.pdf', - 'show_file_name': True, - 'btn_class': 'btn-outline-secondary', - 'label': _('Review manuscript PDF file') - }) - } +## ... source file abbreviated to get to ChoiceField example ... class AssignReviewerForm(forms.Form): - reviewer = forms.ChoiceField(required=True, label=_('Assign reviewer')) +~~ reviewer = forms.ChoiceField(required=True, label=_('Assign reviewer')) def __init__(self, *args, submission=None): super().__init__(*args) @@ -319,21 +67,20 @@ class AssignReviewerForm(forms.Form): profiles = { rev: rev.user.profile for rev in available_reviewers } - reviewers = list(available_reviewers) - reviewers.sort(key=lambda r: r.reviews.count()) - self.fields['reviewer'].choices = ( - (rev.pk, - f'{profiles[rev].get_full_name()} ({rev.reviews.count()}) - ' - f'{profiles[rev].affiliation}, ' - f'{profiles[rev].get_country_display()}') - for rev in reviewers - ) - - def save(self): - reviewer = Reviewer.objects.get(pk=self.cleaned_data['reviewer']) - review = Review.objects.create(reviewer=reviewer, paper=self.submission) - return review - +~~ reviewers = list(available_reviewers) +~~ reviewers.sort(key=lambda r: r.reviews.count()) +~~ self.fields['reviewer'].choices = ( +~~ (rev.pk, +~~ f'{profiles[rev].get_full_name()} ({rev.reviews.count()}) - ' +~~ f'{profiles[rev].affiliation}, ' +~~ f'{profiles[rev].get_country_display()}') +~~ for rev in reviewers +~~ ) + +~~ def save(self): +~~ reviewer = Reviewer.objects.get(pk=self.cleaned_data['reviewer']) +~~ review = Review.objects.create(reviewer=reviewer, paper=self.submission) +~~ return review ``` @@ -349,7 +96,7 @@ license. ```python # -*- coding: utf-8 -*- -from django import forms +~~from django import forms from django.contrib.admin.widgets import RelatedFieldWidgetWrapper from django.forms.fields import EMPTY_VALUES from django.utils.translation import ugettext_lazy as _ @@ -368,85 +115,15 @@ class SuperLazyIterator(object): return iter(self.func()) -class LazyChoiceField(forms.ChoiceField): - def _set_choices(self, value): - # we overwrite this function so no list(value) is called - self._choices = self.widget.choices = value - - choices = property(forms.ChoiceField._get_choices, _set_choices) - - -class PageSelectFormField(forms.MultiValueField): - widget = PageSelectWidget - default_error_messages = { - 'invalid_site': _(u'Select a valid site'), - 'invalid_page': _(u'Select a valid page'), - } - - def __init__(self, queryset=None, empty_label=u"---------", cache_choices=False, - required=True, widget=None, to_field_name=None, limit_choices_to=None, - *args, **kwargs): - errors = self.default_error_messages.copy() - if 'error_messages' in kwargs: - errors.update(kwargs['error_messages']) - site_choices = SuperLazyIterator(get_site_choices) - page_choices = SuperLazyIterator(get_page_choices) - self.limit_choices_to = limit_choices_to - kwargs['required'] = required - fields = ( - LazyChoiceField(choices=site_choices, required=False, error_messages={'invalid': errors['invalid_site']}), - LazyChoiceField(choices=page_choices, required=False, error_messages={'invalid': errors['invalid_page']}), - ) - super(PageSelectFormField, self).__init__(fields, *args, **kwargs) - - def compress(self, data_list): - if data_list: - page_id = data_list[1] - - if page_id in EMPTY_VALUES: - if not self.required: - return None - raise forms.ValidationError(self.error_messages['invalid_page']) - return Page.objects.get(pk=page_id) - return None +~~class LazyChoiceField(forms.ChoiceField): +~~ def _set_choices(self, value): +~~ # we overwrite this function so no list(value) is called +~~ self._choices = self.widget.choices = value - def has_changed(self, initial, data): - is_empty = data and (len(data) >= 2 and data[1] in [None, '']) +~~ choices = property(forms.ChoiceField._get_choices, _set_choices) - if isinstance(self.widget, RelatedFieldWidgetWrapper): - self.widget.decompress = self.widget.widget.decompress - - if is_empty and initial is None: - # when empty data will have [u'1', u'', u''] as value - # this will cause django to always return True because of the '1' - # so we simply follow django's default behavior when initial is None and data is "empty" - data = ['' for x in range(0, len(data))] - return super(PageSelectFormField, self).has_changed(initial, data) - - def _has_changed(self, initial, data): - return self.has_changed(initial, data) - - -class PageSmartLinkField(forms.CharField): - widget = PageSmartLinkWidget - default_validators = [validate_url] - - def __init__(self, max_length=None, min_length=None, placeholder_text=None, - ajax_view=None, *args, **kwargs): - self.placeholder_text = placeholder_text - widget = self.widget(ajax_view=ajax_view) - super(PageSmartLinkField, self).__init__(max_length=max_length, min_length=min_length, - widget=widget, *args, **kwargs) - - def widget_attrs(self, widget): - attrs = super(PageSmartLinkField, self).widget_attrs(widget) - attrs.update({'placeholder_text': self.placeholder_text}) - return attrs - - def clean(self, value): - value = self.to_python(value).strip() - return super(PageSmartLinkField, self).clean(value) +## ... source file continues with no further ChoiceField examples ... ``` @@ -464,7 +141,7 @@ The django-jet project is open source under the ```python import json -from django import forms +~~from django import forms from django.contrib.admin.models import LogEntry from django.db.models import Q from django.template.loader import render_to_string @@ -473,606 +150,17 @@ from jet.utils import get_app_list, LazyDateTimeEncoder, context_to_dict import datetime -class DashboardModule(object): - """ - Base dashboard module class. All dashboard modules (widgets) should inherit it. - """ - - #: Path to widget's template. There is no need to extend such templates from any base templates. - template = 'jet.dashboard/module.html' - enabled = True - - #: Specify if module can be draggable or has static position. - draggable = True - - #: Specify if module can be collapsed. - collapsible = True - - #: Specify if module can be deleted. - deletable = True - show_title = True - - #: Default widget title that will be displayed for widget in the dashboard. User can change it later - #: for every widget. - title = '' - - #: Specify title url. ``None`` if title shouldn't be clickable. - title_url = None - css_classes = None - - #: HTML content that will be displayed before widget content. - pre_content = None - - #: HTML content that will be displayed after widget content. - post_content = None - children = None - - #: A ``django.forms.Form`` class which may contain custom widget settings. Not required. - settings_form = None - - #: A ``django.forms.Form`` class which may contain custom widget child settings, if it has any. Not required. - child_form = None - - #: Child name that will be displayed when editing module contents. Required if ``child_form`` set. - child_name = None - - #: Same as child name, but plural. - child_name_plural = None - settings = None - column = None - order = None - - #: A boolean field which specify if widget should be rendered on dashboard page load or fetched - #: later via AJAX. - ajax_load = False - - #: A boolean field which makes widget ui color contrast. - contrast = False - - #: Optional style attributes which will be applied to widget content container. - style = False - - class Media: - css = () - js = () - - def __init__(self, title=None, model=None, context=None, **kwargs): - if title is not None: - self.title = title - self.model = model - self.context = context or {} - - for key in kwargs: - if hasattr(self.__class__, key): - setattr(self, key, kwargs[key]) - - self.children = self.children or [] - - if self.model: - self.load_from_model() - - def fullname(self): - return self.__module__ + "." + self.__class__.__name__ - - def load_settings(self, settings): - """ - Should be implemented to restore saved in database settings. Required if you have custom settings. - """ - pass - - def load_children(self, children): - self.children = children - - def store_children(self): - """ - Specify if children field should be saved to database. - """ - return False - - def settings_dict(self): - """ - Should be implemented to save settings to database. This method should return ``dict`` which will be serialized - using ``json``. Required if you have custom settings. - """ - pass - - def dump_settings(self, settings=None): - settings = settings or self.settings_dict() - if settings: - return json.dumps(settings, cls=LazyDateTimeEncoder) - else: - return '' - - def dump_children(self): - if self.store_children(): - return json.dumps(self.children, cls=LazyDateTimeEncoder) - else: - return '' - - def load_from_model(self): - self.title = self.model.title - - if self.model.settings: - try: - self.settings = json.loads(self.model.settings) - self.load_settings(self.settings) - except ValueError: - pass - - if self.store_children() and self.model.children: - try: - children = json.loads(self.model.children) - self.load_children(children) - except ValueError: - pass - - def init_with_context(self, context): - """ - Allows you to load data and initialize module's state. - """ - pass - - def get_context_data(self): - context = context_to_dict(self.context) - context.update({ - 'module': self - }) - return context - - def render(self): - self.init_with_context(self.context) - return render_to_string(self.template, self.get_context_data()) - - -class LinkListItemForm(forms.Form): - url = forms.CharField(label=_('URL')) - title = forms.CharField(label=_('Title')) - external = forms.BooleanField(label=_('External link'), required=False) - - -class LinkListSettingsForm(forms.Form): - layout = forms.ChoiceField(label=_('Layout'), choices=(('stacked', _('Stacked')), ('inline', _('Inline')))) - - -class LinkList(DashboardModule): - """ - List of links widget. - - Usage example: - - .. code-block:: python - - from django.utils.translation import ugettext_lazy as _ - from jet.dashboard import modules - from jet.dashboard.dashboard import Dashboard, AppIndexDashboard - - - class CustomIndexDashboard(Dashboard): - columns = 3 - - def init_with_context(self, context): - self.available_children.append(modules.LinkList) - self.children.append(modules.LinkList( - _('Support'), - children=[ - { - 'title': _('Django documentation'), - 'url': 'http://docs.djangoproject.com/', - 'external': True, - }, - { - 'title': _('Django "django-users" mailing list'), - 'url': 'http://groups.google.com/group/django-users', - 'external': True, - }, - { - 'title': _('Django irc channel'), - 'url': 'irc://irc.freenode.net/django', - 'external': True, - }, - ], - column=0, - order=0 - )) - - """ - - title = _('Links') - template = 'jet.dashboard/modules/link_list.html' - - #: Specify widget layout. - #: Allowed values ``stacked`` and ``inline``. - layout = 'stacked' - - #: Links are contained in ``children`` attribute which you can pass as constructor parameter - #: to make your own preinstalled link lists. - #: - #: ``children`` is an array of dictinaries:: - #: - #: [ - #: { - #: 'title': _('Django documentation'), - #: 'url': 'http://docs.djangoproject.com/', - #: 'external': True, - #: }, - #: ... - #: ] - children = [] - settings_form = LinkListSettingsForm - child_form = LinkListItemForm - child_name = _('Link') - child_name_plural = _('Links') - - def __init__(self, title=None, children=list(), **kwargs): - children = list(map(self.parse_link, children)) - kwargs.update({'children': children}) - super(LinkList, self).__init__(title, **kwargs) - - def settings_dict(self): - return { - 'draggable': self.draggable, - 'deletable': self.deletable, - 'collapsible': self.collapsible, - 'layout': self.layout - } - - def load_settings(self, settings): - self.draggable = settings.get('draggable', self.draggable) - self.deletable = settings.get('deletable', self.deletable) - self.collapsible = settings.get('collapsible', self.collapsible) - self.layout = settings.get('layout', self.layout) - - def store_children(self): - return True - - def parse_link(self, link): - if isinstance(link, (tuple, list)): - link_dict = {'title': link[0], 'url': link[1]} - if len(link) >= 3: - link_dict['external'] = link[2] - return link_dict - elif isinstance(link, (dict,)): - return link - - -class AppList(DashboardModule): - """ - Shows applications and containing models links. For each model "created" and "change" links are displayed. - - Usage example: - - .. code-block:: python - - from django.utils.translation import ugettext_lazy as _ - from jet.dashboard import modules - from jet.dashboard.dashboard import Dashboard, AppIndexDashboard - - - class CustomIndexDashboard(Dashboard): - columns = 3 - - def init_with_context(self, context): - self.children.append(modules.AppList( - _('Applications'), - exclude=('auth.*',), - column=0, - order=0 - )) - - """ - - title = _('Applications') - template = 'jet.dashboard/modules/app_list.html' - - #: Specify models which should be displayed. ``models`` is an array of string formatted as ``app_label.model``. - #: Also its possible to specify all application models with * sign (e.g. ``auth.*``). - models = None +## ... source file abbreviated to get to the ChoiceField examples ... - #: Specify models which should NOT be displayed. ``exclude`` is an array of string formatted as ``app_label.model``. - #: Also its possible to specify all application models with * sign (e.g. ``auth.*``). - exclude = None - hide_empty = True - def settings_dict(self): - return { - 'models': self.models, - 'exclude': self.exclude - } - - def load_settings(self, settings): - self.models = settings.get('models') - self.exclude = settings.get('exclude') - - def init_with_context(self, context): - app_list = get_app_list(context) - app_to_remove = [] - - for app in app_list: - app_name = app.get('app_label', app.get('name', '')) - app['models'] = filter( - lambda model: self.models is None or ('%s.%s' % (app_name, model['object_name'])) in self.models or ('%s.*' % app_name) in self.models, - app['models'] - ) - app['models'] = filter( - lambda model: self.exclude is None or (('%s.%s' % (app_name, model['object_name'])) not in self.exclude and ('%s.*' % app_name) not in self.exclude), - app['models'] - ) - app['models'] = list(app['models']) - - if self.hide_empty and len(list(app['models'])) == 0: - app_to_remove.append(app) - - for app in app_to_remove: - app_list.remove(app) - - self.children = app_list - - -class ModelList(DashboardModule): - """ - Shows models links. For each model "created" and "change" links are displayed. - - Usage example: - - .. code-block:: python - - from django.utils.translation import ugettext_lazy as _ - from jet.dashboard import modules - from jet.dashboard.dashboard import Dashboard, AppIndexDashboard - - - class CustomIndexDashboard(Dashboard): - columns = 3 - - def init_with_context(self, context): - self.children.append(modules.ModelList( - _('Models'), - exclude=('auth.*',), - column=0, - order=0 - )) - - """ - - title = _('Models') - template = 'jet.dashboard/modules/model_list.html' - - #: Specify models which should be displayed. ``models`` is an array of string formatted as ``app_label.model``. - #: Also its possible to specify all application models with * sign (e.g. ``auth.*``). - models = None - - #: Specify models which should NOT be displayed. ``exclude`` is an array of string formatted as ``app_label.model``. - #: Also its possible to specify all application models with * sign (e.g. ``auth.*``). - exclude = None - hide_empty = True - - def settings_dict(self): - return { - 'models': self.models, - 'exclude': self.exclude - } - - def load_settings(self, settings): - self.models = settings.get('models') - self.exclude = settings.get('exclude') - - def init_with_context(self, context): - app_list = get_app_list(context) - models = [] - - for app in app_list: - app_name = app.get('app_label', app.get('name', '')) - app['models'] = filter( - lambda model: self.models is None or ('%s.%s' % (app_name, model['object_name'])) in self.models or ('%s.*' % app_name) in self.models, - app['models'] - ) - app['models'] = filter( - lambda model: self.exclude is None or (('%s.%s' % (app_name, model['object_name'])) not in self.exclude and ('%s.*' % app_name) not in self.exclude), - app['models'] - ) - app['models'] = list(app['models']) - - models.extend(app['models']) - - self.children = models - - -class RecentActionsSettingsForm(forms.Form): - limit = forms.IntegerField(label=_('Items limit'), min_value=1) - - -class RecentActions(DashboardModule): - """ - Display list of most recent admin actions with following information: - entity name, type of action, author, date - - Usage example: - - .. code-block:: python - - from django.utils.translation import ugettext_lazy as _ - from jet.dashboard import modules - from jet.dashboard.dashboard import Dashboard, AppIndexDashboard - - - class CustomIndexDashboard(Dashboard): - columns = 3 - - def init_with_context(self, context): - self.children.append(modules.RecentActions( - _('Recent Actions'), - 10, - column=0, - order=0 - )) - - """ - - title = _('Recent Actions') - template = 'jet.dashboard/modules/recent_actions.html' - - #: Number if entries to be shown (may be changed by each user personally). - limit = 10 - - #: Specify actions of which models should be displayed. ``include_list`` is an array of string - #: formatted as ``app_label.model``. Also its possible to specify all application models - #: with * sign (e.g. ``auth.*``). - include_list = None - - #: Specify actions of which models should NOT be displayed. ``exclude_list`` is an array of string - #: formatted as ``app_label.model``. Also its possible to specify all application models - #: with * sign (e.g. ``auth.*``). - exclude_list = None - settings_form = RecentActionsSettingsForm - user = None - - def __init__(self, title=None, limit=10, **kwargs): - kwargs.update({'limit': limit}) - super(RecentActions, self).__init__(title, **kwargs) - - def settings_dict(self): - return { - 'limit': self.limit, - 'include_list': self.include_list, - 'exclude_list': self.exclude_list, - 'user': self.user - } - - def load_settings(self, settings): - self.limit = settings.get('limit', self.limit) - self.include_list = settings.get('include_list') - self.exclude_list = settings.get('exclude_list') - self.user = settings.get('user', None) - - def init_with_context(self, context): - def get_qset(list): - qset = None - for contenttype in list: - try: - app_label, model = contenttype.split('.') - - if model == '*': - current_qset = Q( - content_type__app_label=app_label - ) - else: - current_qset = Q( - content_type__app_label=app_label, - content_type__model=model - ) - except: - raise ValueError('Invalid contenttype: "%s"' % contenttype) - - if qset is None: - qset = current_qset - else: - qset = qset | current_qset - return qset +~~class LinkListSettingsForm(forms.Form): +~~ layout = forms.ChoiceField(label=_('Layout'), +~~ choices=(('stacked', _('Stacked')), +~~ ('inline', _('Inline')))) - qs = LogEntry.objects - - if self.user: - qs = qs.filter( - user__pk=int(self.user) - ) - - if self.include_list: - qs = qs.filter(get_qset(self.include_list)) - if self.exclude_list: - qs = qs.exclude(get_qset(self.exclude_list)) - - self.children = qs.select_related('content_type', 'user')[:int(self.limit)] - - -class FeedSettingsForm(forms.Form): - limit = forms.IntegerField(label=_('Items limit'), min_value=1) - feed_url = forms.URLField(label=_('Feed URL')) - - -class Feed(DashboardModule): - """ - Display RSS Feed entries with following information: - entry title, date and link to the full version - - Usage example: - - .. code-block:: python - - from django.utils.translation import ugettext_lazy as _ - from jet.dashboard import modules - from jet.dashboard.dashboard import Dashboard, AppIndexDashboard - - - class CustomIndexDashboard(Dashboard): - columns = 3 - - def init_with_context(self, context): - self.children.append(modules.Feed( - _('Latest Django News'), - feed_url='http://www.djangoproject.com/rss/weblog/', - limit=5, - column=0, - order=0 - )) - - """ - - title = _('RSS Feed') - template = 'jet.dashboard/modules/feed.html' - - #: URL of the RSS feed (may be changed by each user personally). - feed_url = None - - #: Number if entries to be shown (may be changed by each user personally). - limit = None - settings_form = FeedSettingsForm - ajax_load = True - - def __init__(self, title=None, feed_url=None, limit=None, **kwargs): - kwargs.update({'feed_url': feed_url, 'limit': limit}) - super(Feed, self).__init__(title, **kwargs) - - def settings_dict(self): - return { - 'feed_url': self.feed_url, - 'limit': self.limit - } - - def load_settings(self, settings): - self.feed_url = settings.get('feed_url') - self.limit = settings.get('limit') - - def init_with_context(self, context): - if self.feed_url is not None: - try: - import feedparser - - feed = feedparser.parse(self.feed_url) - - if self.limit is not None: - entries = feed['entries'][:self.limit] - else: - entries = feed['entries'] - - for entry in entries: - try: - entry.date = datetime.date(*entry.published_parsed[0:3]) - except: - pass - - self.children.append(entry) - except ImportError: - self.children.append({ - 'title': _('You must install the FeedParser python module'), - 'warning': True, - }) - else: - self.children.append({ - 'title': _('You must provide a valid feed URL'), - 'warning': True, - }) +## ... no further ChoiceField examples in this source file .. ``` @@ -1102,7 +190,7 @@ and it is maintained by the developer community group import six from copy import deepcopy -from django import forms +~~from django import forms from mongoengine.base import BaseList from mongoengine.base import TopLevelDocumentMetaclass from mongoengine.fields import Document @@ -1169,145 +257,13 @@ class MongoModelFormBaseMixin(object): self.is_initialized = False if instance is None else True self.form = forms.Form() - if not isinstance(self.model, TopLevelDocumentMetaclass): - raise TypeError(u"The model supplied must be a mongoengine Document") - - if self.is_initialized and not isinstance(self.model_instance, self.model): - raise TypeError(u"The provided instance must be an instance of the given model") - - if self.post_data_dict is not None and not isinstance(self.post_data_dict, dict): - raise TypeError(u"You must pass in a dictionary for form_post_data") - - def get_form_field_dict(self, model_dict): - """ - Takes a model dictionary representation and creates a dictionary - keyed by form field. Each value is a keyed 4 tuple of: - (widget, mode_field_instance, model_field_type, field_key) - """ - return_dict = OrderedDict() - # Workaround: mongoengine doesn't preserve form fields ordering from metaclass __new__ - if hasattr(self.model, 'Meta') and hasattr(self.model.Meta, 'form_fields_ordering'): - field_order_list = tuple(form_field for form_field - in self.model.Meta.form_fields_ordering - if form_field in model_dict.iterkeys()) - order_dict = OrderedDict.fromkeys(field_order_list) - return_dict = order_dict - - for field_key, field_dict in sorted(model_dict.items()): - if not field_key.startswith("_"): - widget = field_dict.get('_widget', None) - if widget is None: - return_dict[field_key] = self.get_form_field_dict(field_dict) - return_dict[field_key].update({'_field_type': field_dict.get('_field_type', None)}) - else: - return_dict[field_key] = FieldTuple(widget, - field_dict.get('_document_field', None), - field_dict.get('_field_type', None), - field_dict.get('_key', None)) - return return_dict - - def set_form_fields(self, form_field_dict, parent_key=None, field_type=None): - """ - Set the form fields for every key in the form_field_dict. - Params: - form_field_dict -- a dictionary created by get_form_field_dict - parent_key -- the key for the previous key in the recursive call - field_type -- used to determine what kind of field we are setting - """ - for form_key, field_value in form_field_dict.items(): - form_key = make_key(parent_key, form_key) if parent_key is not None else form_key - if isinstance(field_value, tuple): - - set_list_class = False - base_key = form_key - - # Style list fields - if ListField in (field_value.field_type, field_type): - - # Nested lists/embedded docs need special care to get - # styles to work out nicely. - if parent_key is None or ListField == field_value.field_type: - if field_type != EmbeddedDocumentField: - field_value.widget.attrs['class'] += ' listField {0}'.format(form_key) - set_list_class = True - else: - field_value.widget.attrs['class'] += ' listField' - - # Compute number value for list key - list_keys = [field_key for field_key in self.form.fields.keys() - if has_digit(field_key)] - - key_int = 0 - while form_key in list_keys: - key_int += 1 - form_key = make_key(form_key, key_int) - - if parent_key is not None: - - # Get the base key for our embedded field class - valid_base_keys = [model_key for model_key in self.model_map_dict.keys() - if not model_key.startswith("_")] - while base_key not in valid_base_keys and base_key: - base_key = make_key(base_key, exclude_last_string=True) - - # We need to remove the trailing number from the key - # so that grouping will occur on the front end when we have a list. - embedded_key_class = None - if set_list_class: - field_value.widget.attrs['class'] += " listField".format(base_key) - embedded_key_class = make_key(field_key, exclude_last_string=True) - - field_value.widget.attrs['class'] += " embeddedField" - - # Setting the embedded key correctly allows to visually nest the - # embedded documents on the front end. - if base_key == parent_key: - field_value.widget.attrs['class'] += ' {0}'.format(base_key) - else: - field_value.widget.attrs['class'] += ' {0} {1}'.format(base_key, parent_key) - - if embedded_key_class is not None: - field_value.widget.attrs['class'] += ' {0}'.format(embedded_key_class) - - default_value = self.get_field_value(form_key) - - # Style embedded documents - if isinstance(default_value, list) and len(default_value) > 0: - key_index = int(form_key.split("_")[-1]) - new_base_key = make_key(form_key, exclude_last_string=True) - - for list_value in default_value: - # Note, this is copied every time so each widget gets a different class - list_widget = deepcopy(field_value.widget) - new_key = make_key(new_base_key, six.text_type(key_index)) - list_widget.attrs['class'] += " {0}".format(make_key(base_key, key_index)) - self.set_form_field(list_widget, field_value.document_field, new_key, list_value) - key_index += 1 - else: - self.set_form_field(field_value.widget, field_value.document_field, - form_key, default_value) +## ... source file abbreviated to get to the ChoiceField examples ... - elif isinstance(field_value, dict): - self.set_form_fields(field_value, form_key, field_value.get("_field_type", None)) - - def set_form_field(self, widget, model_field, field_key, default_value): - """ - Parmams: - widget -- the widget to use for displyaing the model_field - model_field -- the field on the model to create a form field with - field_key -- the name for the field on the form - default_value -- the value to give for the field - Default: None - """ - # Empty lists cause issues on form validation - if default_value == []: - default_value = None - - if widget and isinstance(widget, forms.widgets.Select): - self.form.fields[field_key] = forms.ChoiceField(label=model_field.name, - required=model_field.required, - widget=widget) +~~ if widget and isinstance(widget, forms.widgets.Select): +~~ self.form.fields[field_key] = forms.ChoiceField(label=model_field.name, +~~ required=model_field.required, +~~ widget=widget) else: field_class = get_form_field_class(model_field) self.form.fields[field_key] = field_class(label=model_field.name, @@ -1394,7 +350,8 @@ under the [**wagtail / wagtail / images / forms.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/forms.py) ```python -from django import forms +# forms.py +~~from django import forms from django.forms.models import modelform_factory from django.utils.text import capfirst from django.utils.translation import ugettext as _ @@ -1449,30 +406,30 @@ def get_image_form(model): }) -class ImageInsertionForm(forms.Form): - """ - Form for selecting parameters of the image (e.g. format) prior to insertion - into a rich text area - """ - format = forms.ChoiceField( - choices=[(format.name, format.label) for format in get_image_formats()], - widget=forms.RadioSelect - ) - alt_text = forms.CharField() +~~class ImageInsertionForm(forms.Form): +~~ """ +~~ Form for selecting parameters of the image (e.g. format) prior to insertion +~~ into a rich text area +~~ """ +~~ format = forms.ChoiceField( +~~ choices=[(format.name, format.label) for format in get_image_formats()], +~~ widget=forms.RadioSelect +~~ ) +~~ alt_text = forms.CharField() class URLGeneratorForm(forms.Form): - filter_method = forms.ChoiceField( - label=_("Filter"), - choices=( - ('original', _("Original size")), - ('width', _("Resize to width")), - ('height', _("Resize to height")), - ('min', _("Resize to min")), - ('max', _("Resize to max")), - ('fill', _("Resize to fill")), - ), - ) +~~ filter_method = forms.ChoiceField( +~~ label=_("Filter"), +~~ choices=( +~~ ('original', _("Original size")), +~~ ('width', _("Resize to width")), +~~ ('height', _("Resize to height")), +~~ ('min', _("Resize to min")), +~~ ('max', _("Resize to max")), +~~ ('fill', _("Resize to fill")), +~~ ), +~~ ) width = forms.IntegerField(label=_("Width"), min_value=0) height = forms.IntegerField(label=_("Height"), min_value=0) closeness = forms.IntegerField(label=_("Closeness"), min_value=0, initial=0) From 070df034c8f738aa0094b30c8c10dee818eb699b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 27 Nov 2019 06:24:42 -0500 Subject: [PATCH 004/302] new resources for drf and numpy --- content/pages/03-data/17-scipy-numpy.markdown | 5 +++++ .../04-web-development/50-django-rest-framework-drf.markdown | 4 ++++ theme/templates/table-of-contents.html | 3 ++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/content/pages/03-data/17-scipy-numpy.markdown b/content/pages/03-data/17-scipy-numpy.markdown index f8e052fb5..dc8311102 100644 --- a/content/pages/03-data/17-scipy-numpy.markdown +++ b/content/pages/03-data/17-scipy-numpy.markdown @@ -56,6 +56,11 @@ following resources are broader walkthroughs for the SciPy ecosystem: is an awesome resource that shows how to use your basic Python knowledge to learn how to do vectorization with NumPy. +* [The ultimate beginner's guide to NumPy](https://towardsdatascience.com/the-ultimate-beginners-guide-to-numpy-f5a2f99aef54) + explains how to install and import NumPy, then digs into using arrays for + computation and how to perform operations that get the results you need + for your data analysis. + * [101 NumPy Exercises for Data Analysis](https://www.machinelearningplus.com/101-numpy-exercises-python/) * [NumPy: creating and manipulating numerical data](http://www.scipy-lectures.org/intro/numpy/index.html) diff --git a/content/pages/04-web-development/50-django-rest-framework-drf.markdown b/content/pages/04-web-development/50-django-rest-framework-drf.markdown index b4f4ce9ab..5824966bc 100644 --- a/content/pages/04-web-development/50-django-rest-framework-drf.markdown +++ b/content/pages/04-web-development/50-django-rest-framework-drf.markdown @@ -54,6 +54,10 @@ typically abbreviated "DRF", is a Python library for building web gives a great walkthrough for creating a question polling application backend with code and the explanation as you build it. +* [Django REST Framework Permissions in Depth](https://nezhar.com/blog/django-rest-framework-permissions-in-depth/) + has code examples and explains permission classes versus authentication + classes in DRF. + * [Optimizing slow Django REST Framework performance](https://ses4j.github.io/2015/11/23/optimizing-slow-django-rest-framework-performance/) * [TLT: Serializing Authenticated User Data With Django REST Framework](http://gregblogs.com/tlt-serializing-authenticated-user-data-with-django-rest-framework/) diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index d225d7ab1..d1b5e26ae 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -77,7 +77,8 @@

django

django.forms BooleanField, CharField, - ChoiceField + ChoiceField, + TypedChoiceField

django.http HttpResponse From e7b988bbe7e95210f6d77eb38219e4e54c147391 Mon Sep 17 00:00:00 2001 From: Michael Herman Date: Fri, 29 Nov 2019 11:21:46 -0700 Subject: [PATCH 005/302] add django courses --- content/pages/04-web-development/02-django.markdown | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index 4b3b41c69..263a6daef 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -129,6 +129,11 @@ the framework. * [2 Scoops of Django](https://www.twoscoopspress.com/collections/django/products/two-scoops-of-django-1-11) by Daniel Greenfeld and Audrey Roy is well worth the price of admission if you're serious about learning how to correctly develop Django websites. + +* The [Test-Driven Development with Django, Django REST Framework, and Docker](https://testdriven.io/courses/tdd-django/?utm_source=fsp) + course details how to set up a development environment with Docker in + order to build and deploy a RESTful API powered by Python, Django, + and Django REST Framework. * This 3-part Django project optimization guide covers a wide range of advanced topics such as @@ -234,7 +239,13 @@ based on [WebSockets](/websockets.html). [channels examples repository](https://github.com/andrewgodwin/channels-examples) contains a couple of good starter projects such as a live blog and a chat application to use as base code. - + +* The [Developing a Real-Time Taxi App with Django Channels and Angular](https://testdriven.io/courses/real-time-app-with-django-channels-and-angular/?utm_source=fsp) + course details how to create a ride-sharing app with Django Channels, + Angular, and Docker. Along the way, you'll learn how to manage + client/server communication with Django Channels, control flow and + routing with Angular, and build a RESTful API with Django REST + Framework. ## Django testing * [Integrating Front End Tools with Django](https://lincolnloop.com/blog/integrating-front-end-tools-your-django-project/) From 710b6385c460b9fe13ba0fa8e209ad7c5e47e59b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 1 Dec 2019 10:58:24 -0500 Subject: [PATCH 006/302] add emailfield forms examples for django --- .../django/django-forms-emailfield.markdown | 1278 +++++++++++++++++ content/pages/meta/00-change-log.markdown | 4 + theme/templates/table-of-contents.html | 7 +- 3 files changed, 1288 insertions(+), 1 deletion(-) create mode 100644 content/pages/examples/django/django-forms-emailfield.markdown diff --git a/content/pages/examples/django/django-forms-emailfield.markdown b/content/pages/examples/django/django-forms-emailfield.markdown new file mode 100644 index 000000000..69a33814b --- /dev/null +++ b/content/pages/examples/django/django-forms-emailfield.markdown @@ -0,0 +1,1278 @@ +title: django.forms EmailField Python Code Examples +category: page +slug: django-forms-emailfield-examples +sortorder: 50097 +toc: False +sidebartitle: django.forms EmailField +meta: View Python code examples that show how to use the EmailField class within the forms module of the Django open source project. + + +[EmailField](https://github.com/django/django/blob/master/django/forms/fields.py) +([documentation](https://docs.djangoproject.com/en/2.2/ref/forms/fields/#emailfield)), +from the [Django](/django.html) `forms` module, enables safe handling of +text intended to be stored and used as valid email addresses. The email address +data is collected via an HTTP POST request from an +[HTML](/hypertext-markup-language-html.html) form submission. + +Note that EmailField can either be imported from `django.forms` or +`django.forms.fields`. `django.forms` is more commonly used because it +is less characters to type for the equivalent effect. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / users / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/users/forms.py) + +```python +import re + +~~from django import forms +from django.core.exceptions import ValidationError +from django.forms import Form +from django.utils.translation import ugettext_lazy as _ + +from users.models import Profile, User, Subscriptions, generate_avatar + + +def has_cyrillic(text): + return bool(re.search('[\u0400-\u04FF]', text)) + + +def only_cyrillic(text): + return bool(re.fullmatch('[\u0400-\u04FF\-]*', text)) + + +class PersonalForm(forms.ModelForm): + class Meta: + model = Profile + fields = ( + 'first_name', 'last_name', 'first_name_rus', 'middle_name_rus', + 'last_name_rus', 'country', 'city', 'birthday', 'preferred_language' + ) + widgets = { + 'birthday': forms.TextInput(attrs={'class': 'datepicker'}) + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + placeholders = { + 'first_name': 'e.g.: Ivan', + 'last_name': 'e.g.: Petrov', + 'first_name_rus': 'пр.: Иван', + 'middle_name_rus': 'пр.: Дмитриевич', + 'last_name_rus': 'пр.: Петров', + 'city': 'e.g.: Moscow', + 'birthday': 'e.g.: 1980-02-20', + } + for key, value in placeholders.items(): + self.fields[key].widget.attrs['placeholder'] = value + + def clean_first_name(self): + if has_cyrillic(self.cleaned_data['first_name']): + raise ValidationError( + _('This field should be written in English'), + code='invalid_language' + ) + return self.cleaned_data['first_name'] + + def clean_last_name(self): + if has_cyrillic(self.cleaned_data['last_name']): + raise ValidationError( + _('This field should be written in English'), + code='invalid_language' + ) + return self.cleaned_data['last_name'] + + def clean_city(self): + if has_cyrillic(self.cleaned_data['city']): + raise ValidationError( + _('This field should be written in English'), + code='invalid_language' + ) + return self.cleaned_data['city'] + + def clean_first_name_rus(self): + if not only_cyrillic(self.cleaned_data['first_name_rus']): + raise ValidationError( + _('Field should contain only cyrillic characters'), + code='invalid_language' + ) + return self.cleaned_data['first_name_rus'] + + def clean_middle_name_rus(self): + if not only_cyrillic(self.cleaned_data['middle_name_rus']): + raise ValidationError( + _('Field should contain only cyrillic characters'), + code='invalid_language' + ) + return self.cleaned_data['middle_name_rus'] + + def clean_last_name_rus(self): + if not only_cyrillic(self.cleaned_data['last_name_rus']): + raise ValidationError( + _('Field should contain only cyrillic characters'), + code='invalid_language' + ) + return self.cleaned_data['last_name_rus'] + + +class ProfessionalForm(forms.ModelForm): + class Meta: + model = Profile + fields = ('affiliation', 'degree', 'role', 'ieee_member') + + def clean_affiliation(self): + if has_cyrillic(self.cleaned_data['affiliation']): + raise ValidationError( + _('This field should be written in English'), + code='invalid_language' + ) + return self.cleaned_data['affiliation'] + + +class SubscriptionsForm(forms.ModelForm): + class Meta: + model = Subscriptions + fields = ('trans_email', 'info_email') + + +class PasswordProtectedForm(Form): + password = forms.CharField( + strip=False, + label=_('Enter your password'), + widget=forms.PasswordInput(attrs={'placeholder': _('Password')}) + ) + + def clean_password(self): + """Validate that the entered password is correct. + """ + password = self.cleaned_data['password'] + if not self.user.check_password(password): + raise forms.ValidationError( + _("The password is incorrect"), + code='password_incorrect' + ) + return password + + +class DeleteUserForm(PasswordProtectedForm): + def __init__(self, user, *args, **kwargs): + super().__init__(*args, **kwargs) + self.user = user + + def save(self): + self.user.delete() + + +~~class UpdateEmailForm(PasswordProtectedForm): +~~ email = forms.EmailField(label=_('Enter your new email')) + +~~ def __init__(self, user, *args, **kwargs): +~~ super().__init__(*args, **kwargs) +~~ self.user = user + +~~ def save(self): +~~ self.user.email = self.cleaned_data['email'] +~~ self.user.save() + + +class DeleteAvatarForm(forms.ModelForm): + class Meta: + model = Profile + fields = () + + def save(self, commit=True): + if self.instance.avatar: + self.instance.avatar.delete() + self.instance.avatar_version += 1 + self.instance.avatar = generate_avatar(self.instance) + return super().save(commit) + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / forms.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py) + +```python +from __future__ import absolute_import + +import warnings +from importlib import import_module + +~~from django import forms +from django.contrib.auth.tokens import PasswordResetTokenGenerator +from django.contrib.sites.shortcuts import get_current_site +from django.core import exceptions, validators +from django.urls import reverse +from django.utils.translation import pgettext + +from allauth.compat import ugettext, ugettext_lazy as _ + +from ..utils import ( + build_absolute_uri, + get_username_max_length, + set_form_field_order, +) +from . import app_settings +from .adapter import get_adapter +from .app_settings import AuthenticationMethod +from .models import EmailAddress +from .utils import ( + filter_users_by_email, + get_user_model, + perform_login, + setup_user_email, + sync_user_email_addresses, + url_str_to_user_pk, + user_email, + user_pk_to_url_str, + user_username, +) + + +class EmailAwarePasswordResetTokenGenerator(PasswordResetTokenGenerator): + + def _make_hash_value(self, user, timestamp): + ret = super( + EmailAwarePasswordResetTokenGenerator, self)._make_hash_value( + user, timestamp) + sync_user_email_addresses(user) + emails = set([user.email] if user.email else []) + emails.update( + EmailAddress.objects + .filter(user=user) + .values_list('email', flat=True)) + ret += '|'.join(sorted(emails)) + return ret + + +default_token_generator = EmailAwarePasswordResetTokenGenerator() + + +class PasswordVerificationMixin(object): + def clean(self): + cleaned_data = super(PasswordVerificationMixin, self).clean() + password1 = cleaned_data.get('password1') + password2 = cleaned_data.get('password2') + if (password1 and password2) and password1 != password2: + self.add_error( + 'password2', _("You must type the same password each time.") + ) + return cleaned_data + + +class PasswordField(forms.CharField): + + def __init__(self, *args, **kwargs): + render_value = kwargs.pop('render_value', + app_settings.PASSWORD_INPUT_RENDER_VALUE) + kwargs['widget'] = forms.PasswordInput(render_value=render_value, + attrs={'placeholder': + kwargs.get("label")}) + super(PasswordField, self).__init__(*args, **kwargs) + + +class SetPasswordField(PasswordField): + + def __init__(self, *args, **kwargs): + super(SetPasswordField, self).__init__(*args, **kwargs) + self.user = None + + def clean(self, value): + value = super(SetPasswordField, self).clean(value) + value = get_adapter().clean_password(value, user=self.user) + return value + + +class LoginForm(forms.Form): + + password = PasswordField(label=_("Password")) + remember = forms.BooleanField(label=_("Remember Me"), + required=False) + + user = None + error_messages = { + 'account_inactive': + _("This account is currently inactive."), + + 'email_password_mismatch': + _("The e-mail address and/or password you specified are not correct."), + + 'username_password_mismatch': + _("The username and/or password you specified are not correct."), + } + + def __init__(self, *args, **kwargs): + self.request = kwargs.pop('request', None) + super(LoginForm, self).__init__(*args, **kwargs) + if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: + login_widget = forms.TextInput(attrs={'type': 'email', + 'placeholder': + _('E-mail address'), + 'autofocus': 'autofocus'}) +~~ login_field = forms.EmailField(label=_("E-mail"), +~~ widget=login_widget) + elif app_settings.AUTHENTICATION_METHOD \ + == AuthenticationMethod.USERNAME: + login_widget = forms.TextInput(attrs={'placeholder': + _('Username'), + 'autofocus': 'autofocus'}) + login_field = forms.CharField( + label=_("Username"), + widget=login_widget, + max_length=get_username_max_length()) + else: + assert app_settings.AUTHENTICATION_METHOD \ + == AuthenticationMethod.USERNAME_EMAIL + login_widget = forms.TextInput(attrs={'placeholder': + _('Username or e-mail'), + 'autofocus': 'autofocus'}) + login_field = forms.CharField(label=pgettext("field label", + "Login"), + widget=login_widget) +~~ self.fields["login"] = login_field + set_form_field_order(self, ["login", "password", "remember"]) + if app_settings.SESSION_REMEMBER is not None: + del self.fields['remember'] + + def user_credentials(self): + """ + Provides the credentials required to authenticate the user for + login. + """ + credentials = {} + login = self.cleaned_data["login"] + if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: + credentials["email"] = login + elif ( + app_settings.AUTHENTICATION_METHOD == + AuthenticationMethod.USERNAME): + credentials["username"] = login + else: + if self._is_login_email(login): + credentials["email"] = login + credentials["username"] = login + credentials["password"] = self.cleaned_data["password"] + return credentials + + def clean_login(self): + login = self.cleaned_data['login'] + return login.strip() + + def _is_login_email(self, login): + try: + validators.validate_email(login) + ret = True + except exceptions.ValidationError: + ret = False + return ret + + def clean(self): + super(LoginForm, self).clean() + if self._errors: + return + credentials = self.user_credentials() + user = get_adapter(self.request).authenticate( + self.request, + **credentials) + if user: + self.user = user + else: + auth_method = app_settings.AUTHENTICATION_METHOD + if auth_method == app_settings.AuthenticationMethod.USERNAME_EMAIL: + login = self.cleaned_data['login'] + if self._is_login_email(login): + auth_method = app_settings.AuthenticationMethod.EMAIL + else: + auth_method = app_settings.AuthenticationMethod.USERNAME + raise forms.ValidationError( + self.error_messages['%s_password_mismatch' % auth_method]) + return self.cleaned_data + + def login(self, request, redirect_url=None): + ret = perform_login(request, self.user, + email_verification=app_settings.EMAIL_VERIFICATION, + redirect_url=redirect_url) + remember = app_settings.SESSION_REMEMBER + if remember is None: + remember = self.cleaned_data['remember'] + if remember: + request.session.set_expiry(app_settings.SESSION_COOKIE_AGE) + else: + request.session.set_expiry(0) + return ret + + +class _DummyCustomSignupForm(forms.Form): + + def signup(self, request, user): + """ + Invoked at signup time to complete the signup of the user. + """ + pass + + +def _base_signup_form_class(): + """ + Currently, we inherit from the custom form, if any. This is all + not very elegant, though it serves a purpose: + + - There are two signup forms: one for local accounts, and one for + social accounts + - Both share a common base (BaseSignupForm) + + - Given the above, how to put in a custom signup form? Which form + would your custom form derive from, the local or the social one? + """ + if not app_settings.SIGNUP_FORM_CLASS: + return _DummyCustomSignupForm + try: + fc_module, fc_classname = app_settings.SIGNUP_FORM_CLASS.rsplit('.', 1) + except ValueError: + raise exceptions.ImproperlyConfigured('%s does not point to a form' + ' class' + % app_settings.SIGNUP_FORM_CLASS) + try: + mod = import_module(fc_module) + except ImportError as e: + raise exceptions.ImproperlyConfigured('Error importing form class %s:' + ' "%s"' % (fc_module, e)) + try: + fc_class = getattr(mod, fc_classname) + except AttributeError: + raise exceptions.ImproperlyConfigured('Module "%s" does not define a' + ' "%s" class' % (fc_module, + fc_classname)) + if not hasattr(fc_class, 'signup'): + if hasattr(fc_class, 'save'): + warnings.warn("The custom signup form must offer" + " a `def signup(self, request, user)` method", + DeprecationWarning) + else: + raise exceptions.ImproperlyConfigured( + 'The custom signup form must implement a "signup" method') + return fc_class + + +class BaseSignupForm(_base_signup_form_class()): + username = forms.CharField(label=_("Username"), + min_length=app_settings.USERNAME_MIN_LENGTH, + widget=forms.TextInput( + attrs={'placeholder': + _('Username'), + 'autofocus': 'autofocus'})) +~~ email = forms.EmailField(widget=forms.TextInput( +~~ attrs={'type': 'email', +~~ 'placeholder': _('E-mail address')})) + + def __init__(self, *args, **kwargs): + email_required = kwargs.pop('email_required', + app_settings.EMAIL_REQUIRED) + self.username_required = kwargs.pop('username_required', + app_settings.USERNAME_REQUIRED) + super(BaseSignupForm, self).__init__(*args, **kwargs) + username_field = self.fields['username'] + username_field.max_length = get_username_max_length() + username_field.validators.append( + validators.MaxLengthValidator(username_field.max_length)) + username_field.widget.attrs['maxlength'] = str( + username_field.max_length) + + default_field_order = [ + 'email', + 'email2', # ignored when not present + 'username', + 'password1', + 'password2' # ignored when not present + ] +~~ if app_settings.SIGNUP_EMAIL_ENTER_TWICE: +~~ self.fields["email2"] = forms.EmailField( +~~ label=_("E-mail (again)"), +~~ widget=forms.TextInput( +~~ attrs={ +~~ 'type': 'email', +~~ 'placeholder': _('E-mail address confirmation') +~~ } +~~ ) +~~ ) +~~ if email_required: +~~ self.fields['email'].label = ugettext("E-mail") +~~ self.fields['email'].required = True +~~ else: +~~ self.fields['email'].label = ugettext("E-mail (optional)") +~~ self.fields['email'].required = False +~~ self.fields['email'].widget.is_required = False +~~ if self.username_required: +~~ default_field_order = [ +~~ 'username', +~~ 'email', +~~ 'email2', # ignored when not present +~~ 'password1', +~~ 'password2' # ignored when not present +~~ ] + + if not self.username_required: + del self.fields["username"] + + set_form_field_order( + self, + getattr(self, 'field_order', None) or default_field_order) + + def clean_username(self): + value = self.cleaned_data["username"] + value = get_adapter().clean_username(value) + return value + +~~ def clean_email(self): +~~ value = self.cleaned_data['email'] +~~ value = get_adapter().clean_email(value) +~~ if value and app_settings.UNIQUE_EMAIL: +~~ value = self.validate_unique_email(value) +~~ return value + +~~ def validate_unique_email(self, value): +~~ return get_adapter().validate_unique_email(value) + +~~ def clean(self): +~~ cleaned_data = super(BaseSignupForm, self).clean() +~~ if app_settings.SIGNUP_EMAIL_ENTER_TWICE: +~~ email = cleaned_data.get('email') +~~ email2 = cleaned_data.get('email2') +~~ if (email and email2) and email != email2: +~~ self.add_error( +~~ 'email2', _("You must type the same email each time.") +~~ ) +~~ return cleaned_data + + def custom_signup(self, request, user): + custom_form = super(BaseSignupForm, self) + if hasattr(custom_form, 'signup') and callable(custom_form.signup): + custom_form.signup(request, user) + else: + warnings.warn("The custom signup form must offer" + " a `def signup(self, request, user)` method", + DeprecationWarning) + # Historically, it was called .save, but this is confusing + # in case of ModelForm + custom_form.save(user) + + +class SignupForm(BaseSignupForm): + def __init__(self, *args, **kwargs): + super(SignupForm, self).__init__(*args, **kwargs) + self.fields['password1'] = PasswordField(label=_("Password")) + if app_settings.SIGNUP_PASSWORD_ENTER_TWICE: + self.fields['password2'] = PasswordField( + label=_("Password (again)")) + + if hasattr(self, 'field_order'): + set_form_field_order(self, self.field_order) + + def clean(self): + super(SignupForm, self).clean() + + # `password` cannot be of type `SetPasswordField`, as we don't + # have a `User` yet. So, let's populate a dummy user to be used + # for password validaton. + dummy_user = get_user_model() + user_username(dummy_user, self.cleaned_data.get("username")) + user_email(dummy_user, self.cleaned_data.get("email")) + password = self.cleaned_data.get('password1') + if password: + try: + get_adapter().clean_password( + password, + user=dummy_user) + except forms.ValidationError as e: + self.add_error('password1', e) + + if app_settings.SIGNUP_PASSWORD_ENTER_TWICE \ + and "password1" in self.cleaned_data \ + and "password2" in self.cleaned_data: + if self.cleaned_data["password1"] \ + != self.cleaned_data["password2"]: + self.add_error( + 'password2', + _("You must type the same password each time.")) + return self.cleaned_data + + def save(self, request): + adapter = get_adapter(request) + user = adapter.new_user(request) + adapter.save_user(request, user, self) + self.custom_signup(request, user) + # TODO: Move into adapter `save_user` ? + setup_user_email(request, user, []) + return user + + +class UserForm(forms.Form): + + def __init__(self, user=None, *args, **kwargs): + self.user = user + super(UserForm, self).__init__(*args, **kwargs) + + +class AddEmailForm(UserForm): + +~~ email = forms.EmailField( +~~ label=_("E-mail"), +~~ required=True, +~~ widget=forms.TextInput( +~~ attrs={"type": "email", +~~ "size": "30", +~~ "placeholder": _('E-mail address')})) + +~~ def clean_email(self): +~~ value = self.cleaned_data["email"] +~~ value = get_adapter().clean_email(value) +~~ errors = { +~~ "this_account": _("This e-mail address is already associated" +~~ " with this account."), +~~ "different_account": _("This e-mail address is already associated" +~~ " with another account."), +~~ } +~~ users = filter_users_by_email(value) +~~ on_this_account = [u for u in users if u.pk == self.user.pk] +~~ on_diff_account = [u for u in users if u.pk != self.user.pk] + + ~~ if on_this_account: + ~~ raise forms.ValidationError(errors["this_account"]) + ~~ if on_diff_account and app_settings.UNIQUE_EMAIL: + ~~ raise forms.ValidationError(errors["different_account"]) + ~~ return value + +~~ def save(self, request): +~~ return EmailAddress.objects.add_email(request, +~~ self.user, +~~ self.cleaned_data["email"], +~~ confirm=True) + + +class ChangePasswordForm(PasswordVerificationMixin, UserForm): + + oldpassword = PasswordField(label=_("Current Password")) + password1 = SetPasswordField(label=_("New Password")) + password2 = PasswordField(label=_("New Password (again)")) + + def __init__(self, *args, **kwargs): + super(ChangePasswordForm, self).__init__(*args, **kwargs) + self.fields['password1'].user = self.user + + def clean_oldpassword(self): + if not self.user.check_password(self.cleaned_data.get("oldpassword")): + raise forms.ValidationError(_("Please type your current" + " password.")) + return self.cleaned_data["oldpassword"] + + def save(self): + get_adapter().set_password(self.user, self.cleaned_data["password1"]) + + +class SetPasswordForm(PasswordVerificationMixin, UserForm): + + password1 = SetPasswordField(label=_("Password")) + password2 = PasswordField(label=_("Password (again)")) + + def __init__(self, *args, **kwargs): + super(SetPasswordForm, self).__init__(*args, **kwargs) + self.fields['password1'].user = self.user + + def save(self): + get_adapter().set_password(self.user, self.cleaned_data["password1"]) + + +~~class ResetPasswordForm(forms.Form): + +~~ email = forms.EmailField( +~~ label=_("E-mail"), +~~ required=True, +~~ widget=forms.TextInput(attrs={ +~~ "type": "email", +~~ "size": "30", +~~ "placeholder": _("E-mail address"), +~~ }) +~~ ) + +~~ def clean_email(self): +~~ email = self.cleaned_data["email"] +~~ email = get_adapter().clean_email(email) +~~ self.users = filter_users_by_email(email) +~~ if not self.users: +~~ raise forms.ValidationError(_("The e-mail address is not assigned" +~~ " to any user account")) +~~ return self.cleaned_data["email"] + + def save(self, request, **kwargs): + current_site = get_current_site(request) + email = self.cleaned_data["email"] + token_generator = kwargs.get("token_generator", + default_token_generator) + + for user in self.users: + + temp_key = token_generator.make_token(user) + + # save it to the password reset model + # password_reset = PasswordReset(user=user, temp_key=temp_key) + # password_reset.save() + + # send the password reset email + path = reverse("account_reset_password_from_key", + kwargs=dict(uidb36=user_pk_to_url_str(user), + key=temp_key)) + url = build_absolute_uri( + request, path) + + context = {"current_site": current_site, + "user": user, + "password_reset_url": url, + "request": request} + + if app_settings.AUTHENTICATION_METHOD \ + != AuthenticationMethod.EMAIL: + context['username'] = user_username(user) + get_adapter(request).send_mail( + 'account/email/password_reset_key', + email, + context) + return self.cleaned_data["email"] + + +## ... source file continues with no further EmailField examples ... + +``` + + +## Example 3 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / forms / widgets.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/forms/widgets.py) + +```python +# -*- coding: utf-8 -*- + +""" Widgets for mongonaut forms""" + +~~from django import forms + +from mongoengine.base import ObjectIdField +from mongoengine.fields import BooleanField +from mongoengine.fields import DateTimeField +from mongoengine.fields import EmbeddedDocumentField +from mongoengine.fields import ListField +from mongoengine.fields import ReferenceField +from mongoengine.fields import FloatField +from mongoengine.fields import EmailField +from mongoengine.fields import DecimalField +from mongoengine.fields import URLField +from mongoengine.fields import IntField +from mongoengine.fields import StringField +from mongoengine.fields import GeoPointField + + +def get_widget(model_field, disabled=False): + """Choose which widget to display for a field.""" + + attrs = get_attrs(model_field, disabled) + + if hasattr(model_field, "max_length") and not model_field.max_length: + return forms.Textarea(attrs=attrs) + + elif isinstance(model_field, DateTimeField): + return forms.DateTimeInput(attrs=attrs) + + elif isinstance(model_field, BooleanField): + return forms.CheckboxInput(attrs=attrs) + + elif isinstance(model_field, ReferenceField) or model_field.choices: + return forms.Select(attrs=attrs) + + elif (isinstance(model_field, ListField) or + isinstance(model_field, EmbeddedDocumentField) or + isinstance(model_field, GeoPointField)): + return None + + else: + return forms.TextInput(attrs=attrs) + + +def get_attrs(model_field, disabled=False): + """Set attributes on the display widget.""" + attrs = {} + attrs['class'] = 'span6 xlarge' + if disabled or isinstance(model_field, ObjectIdField): + attrs['class'] += ' disabled' + attrs['readonly'] = 'readonly' + return attrs + + +def get_form_field_class(model_field): + """Gets the default form field for a mongoenigne field.""" + + FIELD_MAPPING = { + IntField: forms.IntegerField, + StringField: forms.CharField, + FloatField: forms.FloatField, + BooleanField: forms.BooleanField, + DateTimeField: forms.DateTimeField, + DecimalField: forms.DecimalField, + URLField: forms.URLField, +~~ EmailField: forms.EmailField + } + + return FIELD_MAPPING.get(model_field.__class__, forms.CharField) + +``` + + +## Example 4 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / users / forms.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/users/forms.py) + +```python +import warnings +from itertools import groupby +from operator import itemgetter + +from django import forms +from django.conf import settings +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group, Permission +from django.contrib.auth.password_validation import ( + password_validators_help_text_html, validate_password) +from django.db import transaction +from django.db.models.fields import BLANK_CHOICE_DASH +from django.template.loader import render_to_string +from django.utils.html import mark_safe +from django.utils.translation import ugettext_lazy as _ + +from wagtail.admin.locale import get_available_admin_languages, get_available_admin_time_zones +from wagtail.admin.widgets import AdminPageChooser +from wagtail.core import hooks +from wagtail.core.models import ( + PAGE_PERMISSION_TYPE_CHOICES, PAGE_PERMISSION_TYPES, GroupPagePermission, Page, + UserPagePermissionsProxy) +from wagtail.users.models import UserProfile +from wagtail.utils import l18n + +User = get_user_model() + +# The standard fields each user model is expected to have, as a minimum. +standard_fields = set(['email', 'first_name', 'last_name', 'is_superuser', 'groups']) +# Custom fields +if hasattr(settings, 'WAGTAIL_USER_CUSTOM_FIELDS'): + custom_fields = set(settings.WAGTAIL_USER_CUSTOM_FIELDS) +else: + custom_fields = set() + + +class UsernameForm(forms.ModelForm): + """ + Intelligently sets up the username field if it is in fact a username. If the + User model has been swapped out, and the username field is an email or + something else, don't touch it. + """ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if User.USERNAME_FIELD == 'username': + field = self.fields['username'] + field.regex = r"^[\w.@+-]+$" + field.help_text = _("Required. 30 characters or fewer. Letters, " + "digits and @/./+/-/_ only.") + field.error_messages = field.error_messages.copy() + field.error_messages.update({ + 'invalid': _("This value may contain only letters, numbers " + "and @/./+/-/_ characters.")}) + + @property + def username_field(self): + return self[User.USERNAME_FIELD] + + def separate_username_field(self): + return User.USERNAME_FIELD not in standard_fields + + +class UserForm(UsernameForm): + required_css_class = "required" + + @property + def password_required(self): + return getattr(settings, 'WAGTAILUSERS_PASSWORD_REQUIRED', True) + + @property + def password_enabled(self): + return getattr(settings, 'WAGTAILUSERS_PASSWORD_ENABLED', True) + + error_messages = { + 'duplicate_username': _("A user with that username already exists."), + 'password_mismatch': _("The two password fields didn't match."), + } + +~~ email = forms.EmailField(required=True, label=_('Email')) + first_name = forms.CharField(required=True, label=_('First Name')) + last_name = forms.CharField(required=True, label=_('Last Name')) + + password1 = forms.CharField( + label=_('Password'), required=False, + widget=forms.PasswordInput, + help_text=_("Leave blank if not changing.")) + password2 = forms.CharField( + label=_("Password confirmation"), required=False, + widget=forms.PasswordInput, + help_text=_("Enter the same password as above, for verification.")) + + is_superuser = forms.BooleanField( + label=_("Administrator"), required=False, + help_text=_('Administrators have full access to manage any object ' + 'or setting.')) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if self.password_enabled: + if self.password_required: + self.fields['password1'].help_text = mark_safe(password_validators_help_text_html()) + self.fields['password1'].required = True + self.fields['password2'].required = True + else: + del self.fields['password1'] + del self.fields['password2'] + + # We cannot call this method clean_username since this the name of the + # username field may be different, so clean_username would not be reliably + # called. We therefore call _clean_username explicitly in _clean_fields. + def _clean_username(self): + username_field = User.USERNAME_FIELD + # This method is called even if username if empty, contrary to clean_* + # methods, so we have to check again here that data is defined. + if username_field not in self.cleaned_data: + return + username = self.cleaned_data[username_field] + + users = User._default_manager.all() + if self.instance.pk is not None: + users = users.exclude(pk=self.instance.pk) + if users.filter(**{username_field: username}).exists(): + self.add_error(User.USERNAME_FIELD, forms.ValidationError( + self.error_messages['duplicate_username'], + code='duplicate_username', + )) + return username + + def clean_password2(self): + password1 = self.cleaned_data.get("password1") + password2 = self.cleaned_data.get("password2") + if password2 != password1: + self.add_error('password2', forms.ValidationError( + self.error_messages['password_mismatch'], + code='password_mismatch', + )) + + return password2 + + def validate_password(self): + """ + Run the Django password validators against the new password. This must + be called after the user instance in self.instance is populated with + the new data from the form, as some validators rely on attributes on + the user model. + """ + password1 = self.cleaned_data.get("password1") + password2 = self.cleaned_data.get("password2") + if password1 and password2 and password1 == password2: + validate_password(password1, user=self.instance) + + def _post_clean(self): + super()._post_clean() + try: + self.validate_password() + except forms.ValidationError as e: + self.add_error('password2', e) + + def _clean_fields(self): + super()._clean_fields() + self._clean_username() + + def save(self, commit=True): + user = super().save(commit=False) + + if self.password_enabled: + password = self.cleaned_data['password1'] + if password: + user.set_password(password) + + if commit: + user.save() + self.save_m2m() + return user + + +class UserCreationForm(UserForm): + class Meta: + model = User + fields = set([User.USERNAME_FIELD]) | standard_fields | custom_fields + widgets = { + 'groups': forms.CheckboxSelectMultiple + } + + +class UserEditForm(UserForm): + password_required = False + + def __init__(self, *args, **kwargs): + editing_self = kwargs.pop('editing_self', False) + super().__init__(*args, **kwargs) + + if editing_self: + del self.fields["is_active"] + del self.fields["is_superuser"] + + class Meta: + model = User + fields = set([User.USERNAME_FIELD, "is_active"]) | standard_fields | custom_fields + widgets = { + 'groups': forms.CheckboxSelectMultiple + } + + +class GroupForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.registered_permissions = Permission.objects.none() + for fn in hooks.get_hooks('register_permissions'): + self.registered_permissions = self.registered_permissions | fn() + self.fields['permissions'].queryset = self.registered_permissions.select_related('content_type') + + required_css_class = "required" + + error_messages = { + 'duplicate_name': _("A group with that name already exists."), + } + + is_superuser = forms.BooleanField( + label=_("Administrator"), + required=False, + help_text=_("Administrators have full access to manage any object or setting.") + ) + + class Meta: + model = Group + fields = ("name", "permissions", ) + widgets = { + 'permissions': forms.CheckboxSelectMultiple(), + } + + def clean_name(self): + # Since Group.name is unique, this check is redundant, + # but it sets a nicer error message than the ORM. See #13147. + name = self.cleaned_data["name"] + try: + Group._default_manager.exclude(pk=self.instance.pk).get(name=name) + except Group.DoesNotExist: + return name + raise forms.ValidationError(self.error_messages['duplicate_name']) + + def save(self): + # We go back to the object to read (in order to reapply) the + # permissions which were set on this group, but which are not + # accessible in the wagtail admin interface, as otherwise these would + # be clobbered by this form. + try: + untouchable_permissions = self.instance.permissions.exclude(pk__in=self.registered_permissions) + bool(untouchable_permissions) # force this to be evaluated, as it's about to change + except ValueError: + # this form is not bound; we're probably creating a new group + untouchable_permissions = [] + group = super().save() + group.permissions.add(*untouchable_permissions) + return group + + +class PagePermissionsForm(forms.Form): + """ + Note 'Permissions' (plural). A single instance of this form defines the permissions + that are assigned to an entity (i.e. group or user) for a specific page. + """ + page = forms.ModelChoiceField( + queryset=Page.objects.all(), + widget=AdminPageChooser(show_edit_link=False, can_choose_root=True) + ) + permission_types = forms.MultipleChoiceField( + choices=PAGE_PERMISSION_TYPE_CHOICES, + required=False, + widget=forms.CheckboxSelectMultiple + ) + + +class BaseGroupPagePermissionFormSet(forms.BaseFormSet): + permission_types = PAGE_PERMISSION_TYPES # defined here for easy access from templates + + def __init__(self, data=None, files=None, instance=None, prefix='page_permissions'): + if instance is None: + instance = Group() + + self.instance = instance + + initial_data = [] + + for page, page_permissions in groupby( + instance.page_permissions.select_related('page').order_by('page'), lambda pp: pp.page + ): + initial_data.append({ + 'page': page, + 'permission_types': [pp.permission_type for pp in page_permissions] + }) + + super().__init__( + data, files, initial=initial_data, prefix=prefix + ) + for form in self.forms: + form.fields['DELETE'].widget = forms.HiddenInput() + + @property + def empty_form(self): + empty_form = super().empty_form + empty_form.fields['DELETE'].widget = forms.HiddenInput() + return empty_form + + def clean(self): + """Checks that no two forms refer to the same page object""" + if any(self.errors): + # Don't bother validating the formset unless each form is valid on its own + return + + pages = [ + form.cleaned_data['page'] + for form in self.forms + # need to check for presence of 'page' in cleaned_data, + # because a completely blank form passes validation + if form not in self.deleted_forms and 'page' in form.cleaned_data + ] + if len(set(pages)) != len(pages): + # pages list contains duplicates + raise forms.ValidationError(_("You cannot have multiple permission records for the same page.")) + + @transaction.atomic + def save(self): + if self.instance.pk is None: + raise Exception( + "Cannot save a GroupPagePermissionFormSet for an unsaved group instance" + ) + + # get a set of (page, permission_type) tuples for all ticked permissions + forms_to_save = [ + form for form in self.forms + if form not in self.deleted_forms and 'page' in form.cleaned_data + ] + + final_permission_records = set() + for form in forms_to_save: + for permission_type in form.cleaned_data['permission_types']: + final_permission_records.add((form.cleaned_data['page'], permission_type)) + + # fetch the group's existing page permission records, and from that, build a list + # of records to be created / deleted + permission_ids_to_delete = [] + permission_records_to_keep = set() + + for pp in self.instance.page_permissions.all(): + if (pp.page, pp.permission_type) in final_permission_records: + permission_records_to_keep.add((pp.page, pp.permission_type)) + else: + permission_ids_to_delete.append(pp.pk) + + self.instance.page_permissions.filter(pk__in=permission_ids_to_delete).delete() + + permissions_to_add = final_permission_records - permission_records_to_keep + GroupPagePermission.objects.bulk_create([ + GroupPagePermission( + group=self.instance, page=page, permission_type=permission_type + ) + for (page, permission_type) in permissions_to_add + ]) + + def as_admin_panel(self): + return render_to_string('wagtailusers/groups/includes/page_permissions_formset.html', { + 'formset': self + }) + + +GroupPagePermissionFormSet = forms.formset_factory( + PagePermissionsForm, formset=BaseGroupPagePermissionFormSet, extra=0, can_delete=True +) + + +class NotificationPreferencesForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + user_perms = UserPagePermissionsProxy(self.instance.user) + if not user_perms.can_publish_pages(): + del self.fields['submitted_notifications'] + if not user_perms.can_edit_pages(): + del self.fields['approved_notifications'] + del self.fields['rejected_notifications'] + + class Meta: + model = UserProfile + fields = ("submitted_notifications", "approved_notifications", "rejected_notifications") + + +def _get_language_choices(): + return sorted(BLANK_CHOICE_DASH + get_available_admin_languages(), + key=lambda l: l[1].lower()) + + +class PreferredLanguageForm(forms.ModelForm): + preferred_language = forms.ChoiceField( + required=False, choices=_get_language_choices, + label=_('Preferred language') + ) + + class Meta: + model = UserProfile + fields = ("preferred_language",) + + +~~class EmailForm(forms.ModelForm): +~~ email = forms.EmailField(required=True, label=_('Email')) + +~~ class Meta: +~~ model = User +~~ fields = ("email",) + + +## ... source file continues with no further EmailField examples ... +``` + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 7d5c45fb6..58b547ab3 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,10 @@ on GitHub. ## 2019 +### December +* Added new Django code example pages: + * [django.forms EmailField](/django-forms-emailfield-examples.html) + ### November * Added new resources to [RQ](/redis-queue-rq.html), [Sanic](/sanic.html) and [networking](/networking.html) pages. diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index d1b5e26ae..53fbdc2cb 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -78,7 +78,12 @@

django.forms BooleanField, CharField, ChoiceField, - TypedChoiceField + TypedChoiceField, + DateField, + DateTimeField, + DecimalField, + DurationField, + EmailField

django.http HttpResponse From 0a0daabded6507d78660b48d75f076db44119615 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 2 Dec 2019 14:49:38 -0500 Subject: [PATCH 007/302] fix link in forms.emailfield from 2.2 to stable docs --- content/pages/examples/django/django-forms-emailfield.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/pages/examples/django/django-forms-emailfield.markdown b/content/pages/examples/django/django-forms-emailfield.markdown index 69a33814b..79abbab95 100644 --- a/content/pages/examples/django/django-forms-emailfield.markdown +++ b/content/pages/examples/django/django-forms-emailfield.markdown @@ -8,7 +8,7 @@ meta: View Python code examples that show how to use the EmailField class within [EmailField](https://github.com/django/django/blob/master/django/forms/fields.py) -([documentation](https://docs.djangoproject.com/en/2.2/ref/forms/fields/#emailfield)), +([documentation](https://docs.djangoproject.com/en/stable/ref/forms/fields/#emailfield)), from the [Django](/django.html) `forms` module, enables safe handling of text intended to be stored and used as valid email addresses. The email address data is collected via an HTTP POST request from an From eb404d9a09c982d5e42993575d9c906c199ad03f Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 3 Dec 2019 06:59:01 -0500 Subject: [PATCH 008/302] add new textfield example --- .../django-db-models-textfield.markdown | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/content/pages/examples/django/django-db-models-textfield.markdown b/content/pages/examples/django/django-db-models-textfield.markdown index 9e8a3da03..193d20be6 100644 --- a/content/pages/examples/django/django-db-models-textfield.markdown +++ b/content/pages/examples/django/django-db-models-textfield.markdown @@ -1,4 +1,4 @@ -title: django.db.models TextField Example Code +title: django.db.models TextField Python Example Code category: page slug: django-db-models-textfield-examples sortorder: 50102 @@ -575,3 +575,45 @@ auditlog.register(PostgresArrayFieldModel) auditlog.register(NoDeleteHistoryModel) ``` + +## Example 4 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / migrations / 0002_auto_20150501_1515.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/migrations/0002_auto_20150501_1515.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +~~from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('explorer', '0001_initial'), + ] + +~~ operations = [ +~~ migrations.RemoveField( +~~ model_name='querylog', +~~ name='is_playground', +~~ ), +~~ migrations.AlterField( +~~ model_name='querylog', +~~ name='sql', +~~ field=models.TextField(null=True, blank=True), +~~ ), +~~ ] + +``` + + From a18ca68ddd46d2e5e5ea3201b491c7f8cb2eebe9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 4 Dec 2019 09:42:47 -0500 Subject: [PATCH 009/302] add integerfield forms django example code --- .../django/django-forms-integerfield.markdown | 771 ++++++++++++++++++ content/pages/meta/00-change-log.markdown | 1 + theme/templates/table-of-contents.html | 3 +- 3 files changed, 774 insertions(+), 1 deletion(-) create mode 100644 content/pages/examples/django/django-forms-integerfield.markdown diff --git a/content/pages/examples/django/django-forms-integerfield.markdown b/content/pages/examples/django/django-forms-integerfield.markdown new file mode 100644 index 000000000..b449a8887 --- /dev/null +++ b/content/pages/examples/django/django-forms-integerfield.markdown @@ -0,0 +1,771 @@ +title: django.forms IntegerField Python Code Examples +category: page +slug: django-forms-integerfield-examples +sortorder: 50105 +toc: False +sidebartitle: django.forms IntegerField +meta: View Python code examples that show how to use the IntegerField class within the forms module of the Django open source project. + + +[IntegerField](https://github.com/django/django/blob/master/django/forms/fields.py) +([documentation](https://docs.djangoproject.com/en/stable/ref/forms/fields/#integerfield)), +from the [Django](/django.html) `forms` module, enables safe handling of +integer numbers data collected via an HTTP POST request from an +[HTML](/hypertext-markup-language-html.html) form submission. + +Note that IntegerField can either be imported from `django.forms` or +`django.forms.fields`. `django.forms` is more commonly used because it +is less characters to type for the equivalent effect. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / forms.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/forms.py) + +```python +# -*- coding: utf-8 -*- +~~from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model, get_permission_codename +from django.contrib.auth.models import Permission +from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.models import Site +from django.core.exceptions import ValidationError, ObjectDoesNotExist +from django.forms.utils import ErrorList +from django.forms.widgets import HiddenInput +from django.template.defaultfilters import slugify +from django.utils.encoding import force_text +from django.utils.translation import ugettext, ugettext_lazy as _ + +from cms import api +from cms.apphook_pool import apphook_pool +from cms.cache.permissions import clear_permission_cache +from cms.exceptions import PluginLimitReached +from cms.extensions import extension_pool +from cms.constants import PAGE_TYPES_ID, PUBLISHER_STATE_DIRTY, ROOT_USER_LEVEL +from cms.forms.validators import validate_relative_url, validate_url_uniqueness +from cms.forms.widgets import UserSelectAdminWidget, AppHookSelect, ApplicationConfigSelect +from cms.models import (CMSPlugin, Page, PageType, PagePermission, PageUser, PageUserGroup, Title, + Placeholder, GlobalPagePermission, TreeNode) +from cms.models.permissionmodels import User +from cms.plugin_pool import plugin_pool +from cms.signals.apphook import set_restart_trigger +from cms.utils.conf import get_cms_setting +from cms.utils.compat.forms import UserChangeForm +from cms.utils.i18n import get_language_list, get_language_object +from cms.utils.permissions import ( + get_current_user, + get_subordinate_users, + get_subordinate_groups, + get_user_permission_level, +) +from menus.menu_pool import menu_pool + + +## ... source file abbreviated to get to IntegerField examples ... + + +~~class AdvancedSettingsForm(forms.ModelForm): + from cms.forms.fields import PageSmartLinkField + + _user = None + _site = None + _language = None + + application_urls = forms.ChoiceField(label=_('Application'), + choices=(), required=False, + help_text=_('Hook application to this page.')) + overwrite_url = forms.CharField(label=_('Overwrite URL'), max_length=255, required=False, + help_text=_('Keep this field empty if standard path should be used.')) + + xframe_options = forms.ChoiceField( + choices=Page._meta.get_field('xframe_options').choices, + label=_('X Frame Options'), + help_text=_('Whether this page can be embedded in other pages or websites'), + initial=Page._meta.get_field('xframe_options').default, + required=False + ) + + redirect = PageSmartLinkField(label=_('Redirect'), required=False, + help_text=_('Redirects to this URL.'), + placeholder_text=_('Start typing...'), + ajax_view='admin:cms_page_get_published_pagelist', + ) + + # This is really a 'fake' field which does not correspond to any Page attribute + # But creates a stub field to be populate by js + application_configs = forms.CharField( + label=_('Application configurations'), + required=False, + widget=ApplicationConfigSelect, + ) + fieldsets = ( + (None, { + 'fields': ('overwrite_url', 'redirect'), + }), + (_('Language independent options'), { + 'fields': ('template', 'reverse_id', 'soft_root', 'navigation_extenders', + 'application_urls', 'application_namespace', 'application_configs', + 'xframe_options',) + }) + ) + + class Meta: + model = Page + fields = [ + 'template', 'reverse_id', 'overwrite_url', 'redirect', 'soft_root', 'navigation_extenders', + 'application_urls', 'application_namespace', "xframe_options", + ] + + def __init__(self, *args, **kwargs): + super(AdvancedSettingsForm, self).__init__(*args, **kwargs) + self.title_obj = self.instance.get_title_obj( + language=self._language, + fallback=False, + force_reload=True, + ) + + if 'navigation_extenders' in self.fields: + navigation_extenders = self.get_navigation_extenders() + self.fields['navigation_extenders'].widget = forms.Select( + {}, [('', "---------")] + navigation_extenders) + if 'application_urls' in self.fields: + # Prepare a dict mapping the apps by class name ('PollApp') to + # their app_name attribute ('polls'), if any. + app_namespaces = {} + app_configs = {} + for hook in apphook_pool.get_apphooks(): + app = apphook_pool.get_apphook(hook[0]) + if app.app_name: + app_namespaces[hook[0]] = app.app_name + if app.app_config: + app_configs[hook[0]] = app + + self.fields['application_urls'].widget = AppHookSelect( + attrs={'id': 'application_urls'}, + app_namespaces=app_namespaces + ) + self.fields['application_urls'].choices = [('', "---------")] + apphook_pool.get_apphooks() + + page_data = self.data if self.data else self.initial + if app_configs: + self.fields['application_configs'].widget = ApplicationConfigSelect( + attrs={'id': 'application_configs'}, + app_configs=app_configs, + ) + + if page_data.get('application_urls', False) and page_data['application_urls'] in app_configs: + configs = app_configs[page_data['application_urls']].get_configs() + self.fields['application_configs'].widget.choices = [(config.pk, force_text(config)) for config in configs] + + try: + config = configs.get(namespace=self.initial['application_namespace']) + self.fields['application_configs'].initial = config.pk + except ObjectDoesNotExist: + # Provided apphook configuration doesn't exist (anymore), + # just skip it + # The user will choose another value anyway + pass + + if 'redirect' in self.fields: + self.fields['redirect'].widget.language = self._language + self.fields['redirect'].initial = self.title_obj.redirect + + if 'overwrite_url' in self.fields and self.title_obj.has_url_overwrite: + self.fields['overwrite_url'].initial = self.title_obj.path + + def get_apphooks(self): + for hook in apphook_pool.get_apphooks(): + yield (hook[0], apphook_pool.get_apphook(hook[0])) + + def get_apphooks_with_config(self): + return {key: app for key, app in self.get_apphooks() if app.app_config} + + def get_navigation_extenders(self): + return menu_pool.get_menus_by_attribute("cms_enabled", True) + + def _check_unique_namespace_instance(self, namespace): + return Page.objects.drafts().on_site(self._site).filter( + application_namespace=namespace + ).exclude(pk=self.instance.pk).exists() + + def clean(self): + cleaned_data = super(AdvancedSettingsForm, self).clean() + + if self._errors: + # Fail fast if there's errors in the form + return cleaned_data + + # Language has been validated already + # so we know it exists. + language_name = get_language_object( + self._language, + site_id=self._site.pk, + )['name'] + + if not self.title_obj.slug: + # This covers all cases where users try to edit + # page advanced settings without setting a title slug + # for page titles that already exist. + message = _("Please set the %(language)s slug " + "before editing its advanced settings.") + raise ValidationError(message % {'language': language_name}) + + if 'reverse_id' in self.fields: + reverse_id = cleaned_data['reverse_id'] + if reverse_id: + lookup = Page.objects.drafts().on_site(self._site).filter(reverse_id=reverse_id) + if lookup.exclude(pk=self.instance.pk).exists(): + self._errors['reverse_id'] = self.error_class( + [_('A page with this reverse URL id exists already.')]) +~~ apphook = cleaned_data.get('application_urls', None) +~~ # The field 'application_namespace' is a misnomer. It should be +~~ # 'instance_namespace'. +~~ instance_namespace = cleaned_data.get('application_namespace', None) +~~ application_config = cleaned_data.get('application_configs', None) +~~ if apphook: +~~ apphooks_with_config = self.get_apphooks_with_config() + +~~ # application_config wins over application_namespace +~~ if apphook in apphooks_with_config and application_config: +~~ # the value of the application config namespace is saved in +~~ # the 'usual' namespace field to be backward compatible +~~ # with existing apphooks +~~ try: +~~ appconfig_pk = forms.IntegerField(required=True).to_python(application_config) +~~ except ValidationError: +~~ self._errors['application_configs'] = ErrorList([ +~~ _('Invalid application config value') +~~ ]) +~~ return self.cleaned_data + +~~ try: +~~ config = apphooks_with_config[apphook].get_configs().get(pk=appconfig_pk) +~~ except ObjectDoesNotExist: +~~ self._errors['application_configs'] = ErrorList([ +~~ _('Invalid application config value') +~~ ]) +~~ return self.cleaned_data + +~~ if self._check_unique_namespace_instance(config.namespace): +~~ # Looks like there's already one with the default instance +~~ # namespace defined. +~~ self._errors['application_configs'] = ErrorList([ +~~ _('An application instance using this configuration already exists.') +~~ ]) +~~ else: +~~ self.cleaned_data['application_namespace'] = config.namespace +~~ else: +~~ if instance_namespace: +~~ if self._check_unique_namespace_instance(instance_namespace): +~~ self._errors['application_namespace'] = ErrorList([ +~~ _('An application instance with this name already exists.') +~~ ]) +~~ else: +~~ # The attribute on the apps 'app_name' is a misnomer, it should be +~~ # 'application_namespace'. +~~ application_namespace = apphook_pool.get_apphook(apphook).app_name +~~ if application_namespace and not instance_namespace: +~~ if self._check_unique_namespace_instance(application_namespace): +~~ # Looks like there's already one with the default instance +~~ # namespace defined. +~~ self._errors['application_namespace'] = ErrorList([ +~~ _('An application instance with this name already exists.') +~~ ]) +~~ else: +~~ # OK, there are zero instances of THIS app that use the +~~ # default instance namespace, so, since the user didn't +~~ # provide one, we'll use the default. NOTE: The following +~~ # line is really setting the "instance namespace" of the +~~ # new app to the app’s "application namespace", which is +~~ # the default instance namespace. +~~ self.cleaned_data['application_namespace'] = application_namespace + +~~ if instance_namespace and not apphook: +~~ self.cleaned_data['application_namespace'] = None + +~~ if application_config and not apphook: +~~ self.cleaned_data['application_configs'] = None +~~ return self.cleaned_data + + +## ... source file abbreviated to get to IntegerField examples ... + + +class PageTreeForm(forms.Form): + +~~ position = forms.IntegerField(initial=0, required=True) + target = forms.ModelChoiceField(queryset=Page.objects.none(), required=False) + + def __init__(self, *args, **kwargs): + self.page = kwargs.pop('page') + self._site = kwargs.pop('site', Site.objects.get_current()) + super(PageTreeForm, self).__init__(*args, **kwargs) + self.fields['target'].queryset = Page.objects.drafts().filter( + node__site=self._site, + is_page_type=self.page.is_page_type, + ) + + def get_root_nodes(self): + # TODO: this needs to avoid using the pages accessor directly + nodes = TreeNode.get_root_nodes() + return nodes.exclude(cms_pages__is_page_type=not(self.page.is_page_type)) + +~~ def get_tree_options(self): +~~ position = self.cleaned_data['position'] +~~ target_page = self.cleaned_data.get('target') +~~ parent_node = target_page.node if target_page else None + +~~ if parent_node: +~~ return self._get_tree_options_for_parent(parent_node, position) +~~ return self._get_tree_options_for_root(position) + + def _get_tree_options_for_root(self, position): + siblings = self.get_root_nodes().filter(site=self._site) + + try: + target_node = siblings[position] + except IndexError: + # The position requested is not occupied. + # Add the node as the last root node, + # relative to the current site. + return (siblings.reverse()[0], 'right') + return (target_node, 'left') + + def _get_tree_options_for_parent(self, parent_node, position): + if position == 0: + return (parent_node, 'first-child') + + siblings = parent_node.get_children().filter(site=self._site) + + try: + target_node = siblings[position] + except IndexError: + # The position requested is not occupied. + # Add the node to be the parent's first child + return (parent_node, 'last-child') + return (target_node, 'left') + + +## ... source file continues with no further IntegerField examples ... + +``` + + +## Example 2 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / dashboard / forms.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/dashboard/forms.py) + +```python +import json +~~from django import forms +from django.core.exceptions import ValidationError +from jet.dashboard.models import UserDashboardModule +from jet.dashboard.utils import get_current_dashboard +from jet.utils import user_is_authenticated + + +class UpdateDashboardModulesForm(forms.Form): + app_label = forms.CharField(required=False) + modules = forms.CharField() + modules_objects = [] + + def __init__(self, request, *args, **kwargs): + self.request = request + super(UpdateDashboardModulesForm, self).__init__(*args, **kwargs) + + def clean(self): + data = super(UpdateDashboardModulesForm, self).clean() + + if not user_is_authenticated(self.request.user) or not self.request.user.is_staff: + raise ValidationError('error') + + try: + modules = json.loads(data['modules']) + + for module in modules: + db_module = UserDashboardModule.objects.get( + user=self.request.user.pk, + app_label=data['app_label'] if data['app_label'] else None, + pk=module['id'] + ) + + column = module['column'] + order = module['order'] + + if db_module.column != column or db_module.order != order: + db_module.column = column + db_module.order = order + + self.modules_objects.append(db_module) + except Exception: + raise ValidationError('error') + + return data + + def save(self): + for module in self.modules_objects: + module.save() + + +class AddUserDashboardModuleForm(forms.ModelForm): + type = forms.CharField() +~~ module = forms.IntegerField() + module_cls = None + + def __init__(self, request, *args, **kwargs): + self.request = request + super(AddUserDashboardModuleForm, self).__init__(*args, **kwargs) + + class Meta: + model = UserDashboardModule + fields = ['app_label'] + + def clean_app_label(self): + data = self.cleaned_data['app_label'] + return data if data != '' else None + + def clean(self): + data = super(AddUserDashboardModuleForm, self).clean() + + if not user_is_authenticated(self.request.user) or not self.request.user.is_staff: + raise ValidationError('error') + + if 'app_label' in data: + index_dashboard_cls = get_current_dashboard('app_index' if data['app_label'] else 'index') + index_dashboard = index_dashboard_cls({'request': self.request}, app_label=data['app_label']) + +~~ if 'type' in data: +~~ if data['type'] == 'children': +~~ module = index_dashboard.children[data['module']] +~~ elif data['type'] == 'available_children': +~~ module = index_dashboard.available_children[data['module']]() +~~ else: +~~ raise ValidationError('error') + +~~ self.module_cls = module + return data + + def save(self, commit=True): + self.instance.title = self.module_cls.title + self.instance.module = self.module_cls.fullname() + self.instance.user = self.request.user.pk + self.instance.column = 0 + self.instance.order = -1 + self.instance.settings = self.module_cls.dump_settings() + self.instance.children = self.module_cls.dump_children() + + return super(AddUserDashboardModuleForm, self).save(commit) + +## ... source file continues with no further IntegerField examples ... + +``` + + +## Example 3 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / submissions / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/submissions/forms.py) + +```python +# forms.py +~~from django import forms +from django.conf import settings +from django.contrib.auth import get_user_model +from django.core.mail import send_mail +from django.db.models import Max +from django.template.loader import render_to_string +from django.utils import timezone +from django.utils.translation import ugettext_lazy as _ +from django.core.exceptions import ValidationError + +from gears.widgets import CustomFileInput +from .models import Submission, Author + +User = get_user_model() + + +MIN_TOPICS_REQUIRED = 1 +MAX_TOPICS_REQUIRED = 3 + + +## ... source file abbreviated to get to IntegerField examples ... + + +class AuthorCreateForm(forms.Form): +~~ user_pk = forms.IntegerField() + + def __init__(self, submission, *args, **kwargs): + super().__init__(*args, **kwargs) + self.submission = submission + self.user = None + +~~ def clean_user_pk(self): +~~ user_pk = self.cleaned_data['user_pk'] +~~ self.user = User.objects.get(pk=user_pk) +~~ for author in self.submission.authors.all(): +~~ if author.user.pk == self.user.pk: +~~ raise ValidationError(f'Author already added') +~~ return self.cleaned_data['user_pk'] + + def save(self, commit=True): + authors = self.submission.authors + max_order = authors.aggregate(Max('order'))['order__max'] + author = Author.objects.create( + user=self.user, + submission=self.submission, + order=1 if max_order is None else max_order + 1 + ) + if commit: + author.save() + return author + + +class AuthorDeleteForm(forms.Form): +~~ author_pk = forms.IntegerField() + + def __init__(self, submission, *args, **kwargs): + super().__init__(*args, **kwargs) + self.submission = submission + self.author = None + +~~ def clean_author_pk(self): +~~ # Check that we are not deleting the creator +~~ author_pk = self.cleaned_data['author_pk'] +~~ self.author = Author.objects.get(pk=author_pk) +~~ creator = self.submission.created_by +~~ if self.author.user.pk == creator.pk: +~~ raise ValidationError(_('Can not delete submission creator')) +~~ if self.author.submission.pk != self.submission.pk: +~~ raise ValidationError(_('Can not delete alien author')) +~~ return self.cleaned_data['author_pk'] + + def save(self, commit=True): + if commit: + self.author.delete() + +## ... source file continues with no further IntegerField examples ... +``` + + + +## Example 4 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / forms / widgets.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/forms/widgets.py) + +```python +# -*- coding: utf-8 -*- + +""" Widgets for mongonaut forms""" + +~~from django import forms + +from mongoengine.base import ObjectIdField +from mongoengine.fields import BooleanField +from mongoengine.fields import DateTimeField +from mongoengine.fields import EmbeddedDocumentField +from mongoengine.fields import ListField +from mongoengine.fields import ReferenceField +from mongoengine.fields import FloatField +from mongoengine.fields import EmailField +from mongoengine.fields import DecimalField +from mongoengine.fields import URLField +from mongoengine.fields import IntField +from mongoengine.fields import StringField +from mongoengine.fields import GeoPointField + + +def get_widget(model_field, disabled=False): + """Choose which widget to display for a field.""" + + attrs = get_attrs(model_field, disabled) + + if hasattr(model_field, "max_length") and not model_field.max_length: + return forms.Textarea(attrs=attrs) + + elif isinstance(model_field, DateTimeField): + return forms.DateTimeInput(attrs=attrs) + + elif isinstance(model_field, BooleanField): + return forms.CheckboxInput(attrs=attrs) + + elif isinstance(model_field, ReferenceField) or model_field.choices: + return forms.Select(attrs=attrs) + + elif (isinstance(model_field, ListField) or + isinstance(model_field, EmbeddedDocumentField) or + isinstance(model_field, GeoPointField)): + return None + + else: + return forms.TextInput(attrs=attrs) + + +def get_attrs(model_field, disabled=False): + """Set attributes on the display widget.""" + attrs = {} + attrs['class'] = 'span6 xlarge' + if disabled or isinstance(model_field, ObjectIdField): + attrs['class'] += ' disabled' + attrs['readonly'] = 'readonly' + return attrs + + +def get_form_field_class(model_field): + """Gets the default form field for a mongoenigne field.""" + + FIELD_MAPPING = { +~~ IntField: forms.IntegerField, + StringField: forms.CharField, + FloatField: forms.FloatField, + BooleanField: forms.BooleanField, + DateTimeField: forms.DateTimeField, + DecimalField: forms.DecimalField, + URLField: forms.URLField, + EmailField: forms.EmailField + } + + return FIELD_MAPPING.get(model_field.__class__, forms.CharField) + +``` + + +## Example 5 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / images / forms.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/forms.py) + +```python +# forms.py +~~from django import forms +from django.forms.models import modelform_factory +from django.utils.text import capfirst +from django.utils.translation import ugettext as _ + +from wagtail.admin import widgets +from wagtail.admin.forms.collections import ( + BaseCollectionMemberForm, collection_member_permission_formset_factory) +from wagtail.images.fields import WagtailImageField +from wagtail.images.formats import get_image_formats +from wagtail.images.models import Image +from wagtail.images.permissions import permission_policy as images_permission_policy + + +# Callback to allow us to override the default form field for the image file field +def formfield_for_dbfield(db_field, **kwargs): + # Check if this is the file field + if db_field.name == 'file': + return WagtailImageField(label=capfirst(db_field.verbose_name), **kwargs) + + # For all other fields, just call its formfield() method. + return db_field.formfield(**kwargs) + + +class BaseImageForm(BaseCollectionMemberForm): + permission_policy = images_permission_policy + + +def get_image_form(model): + fields = model.admin_form_fields + if 'collection' not in fields: + # force addition of the 'collection' field, because leaving it out can + # cause dubious results when multiple collections exist (e.g adding the + # document to the root collection where the user may not have permission) - + # and when only one collection exists, it will get hidden anyway. + fields = list(fields) + ['collection'] + + return modelform_factory( + model, + form=BaseImageForm, + fields=fields, + formfield_callback=formfield_for_dbfield, + # set the 'file' widget to a FileInput rather than the default ClearableFileInput + # so that when editing, we don't get the 'currently: ...' banner which is + # a bit pointless here + widgets={ + 'tags': widgets.AdminTagWidget, + 'file': forms.FileInput(), + 'focal_point_x': forms.HiddenInput(attrs={'class': 'focal_point_x'}), + 'focal_point_y': forms.HiddenInput(attrs={'class': 'focal_point_y'}), + 'focal_point_width': forms.HiddenInput(attrs={'class': 'focal_point_width'}), + 'focal_point_height': forms.HiddenInput(attrs={'class': 'focal_point_height'}), + }) + + +class ImageInsertionForm(forms.Form): + """ + Form for selecting parameters of the image (e.g. format) prior to insertion + into a rich text area + """ + format = forms.ChoiceField( + choices=[(format.name, format.label) for format in get_image_formats()], + widget=forms.RadioSelect + ) + alt_text = forms.CharField() + + +class URLGeneratorForm(forms.Form): + filter_method = forms.ChoiceField( + label=_("Filter"), + choices=( + ('original', _("Original size")), + ('width', _("Resize to width")), + ('height', _("Resize to height")), + ('min', _("Resize to min")), + ('max', _("Resize to max")), + ('fill', _("Resize to fill")), + ), + ) +~~ width = forms.IntegerField(label=_("Width"), min_value=0) +~~ height = forms.IntegerField(label=_("Height"), min_value=0) +~~ closeness = forms.IntegerField(label=_("Closeness"), min_value=0, initial=0) + + +GroupImagePermissionFormSet = collection_member_permission_formset_factory( + Image, + [ + ('add_image', _("Add"), _("Add/edit images you own")), + ('change_image', _("Edit"), _("Edit any image")), + ], + 'wagtailimages/permissions/includes/image_permissions_formset.html' +) + +``` + + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 58b547ab3..381cd5bd7 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -18,6 +18,7 @@ on GitHub. ### December * Added new Django code example pages: * [django.forms EmailField](/django-forms-emailfield-examples.html) + * [django.forms IntegerField](/django-forms-integerfield-examples.html) ### November * Added new resources to [RQ](/redis-queue-rq.html), [Sanic](/sanic.html) diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index 53fbdc2cb..4d999f2d3 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -83,7 +83,8 @@

django.forms DateTimeField, DecimalField, DurationField, - EmailField + EmailField, + IntegerField

django.http HttpResponse From b3a914e3732dfe7f5397089fbd6c3bbe939f0a6b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 6 Dec 2019 06:57:21 -0500 Subject: [PATCH 010/302] add new rq resource --- content/pages/04-web-development/29-rq-redis-queue.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/pages/04-web-development/29-rq-redis-queue.markdown b/content/pages/04-web-development/29-rq-redis-queue.markdown index 5708b2620..1b2fbc74b 100644 --- a/content/pages/04-web-development/29-rq-redis-queue.markdown +++ b/content/pages/04-web-development/29-rq-redis-queue.markdown @@ -17,6 +17,12 @@ track of tasks in the queue that need to be executed. ### RQ resources +* [Asynchronous Tasks in Python with Redis Queue](https://www.twilio.com/blog/asynchronous-tasks-in-python-with-redis-queue) + is a quickstart-style tutorial that shows how to use RQ to fetch data + from the + [Mars Rover web API](https://data.nasa.gov/Space-Science/Mars-Rover-Photos-API/929k-jizu) + and process URLs for each of the photos taken by NASA's Mars rover. + * The [RQ intro post](http://nvie.com/posts/introducing-rq/) contains information on design decisions and how to use RQ in your projects. From a9d139215edffcc4b44ae722f96b7d2f1c5bca29 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 6 Dec 2019 07:07:50 -0500 Subject: [PATCH 011/302] adding new rq resource and updating changelog --- content/pages/04-web-development/29-rq-redis-queue.markdown | 4 ++++ content/pages/meta/00-change-log.markdown | 2 ++ 2 files changed, 6 insertions(+) diff --git a/content/pages/04-web-development/29-rq-redis-queue.markdown b/content/pages/04-web-development/29-rq-redis-queue.markdown index 1b2fbc74b..55979bf3c 100644 --- a/content/pages/04-web-development/29-rq-redis-queue.markdown +++ b/content/pages/04-web-development/29-rq-redis-queue.markdown @@ -22,6 +22,10 @@ track of tasks in the queue that need to be executed. from the [Mars Rover web API](https://data.nasa.gov/Space-Science/Mars-Rover-Photos-API/929k-jizu) and process URLs for each of the photos taken by NASA's Mars rover. + There is also a follow-up post on + [Scheduling Tasks in Python with Redis Queue and RQ Scheduler](https://www.twilio.com/blog/scheduling-tasks-in-python-with-redis-queue-and-rq-scheduler) + that shows how to schedule tasks in advance, which is a common way of + working with [task queues](/task-queues.html). * The [RQ intro post](http://nvie.com/posts/introducing-rq/) contains information on design decisions and how to use RQ in your projects. diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 381cd5bd7..6c70a92ae 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -16,6 +16,8 @@ on GitHub. ## 2019 ### December +* Updated the [RQ](/redis-queue-rq.html) page with a couple of new fresh + resources. * Added new Django code example pages: * [django.forms EmailField](/django-forms-emailfield-examples.html) * [django.forms IntegerField](/django-forms-integerfield-examples.html) From 31b6c7b86f875afcd0f754c1650bcc850f3bd7af Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 7 Dec 2019 08:34:06 -0500 Subject: [PATCH 012/302] new kubernetes resource --- content/pages/05-deployment/37-kubernetes.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/pages/05-deployment/37-kubernetes.markdown b/content/pages/05-deployment/37-kubernetes.markdown index 2828abcc5..20f8578f8 100644 --- a/content/pages/05-deployment/37-kubernetes.markdown +++ b/content/pages/05-deployment/37-kubernetes.markdown @@ -36,6 +36,10 @@ applications. is a good starting place for more information on getting started with Skaffold. +* [kubethanos](https://github.com/berkay-dincer/kubethanos) is a tool to kill + half of your Kubernetes pods at random, to test the resilience of your + infrastructure under highly chaotic scenarios. + ### Kubernetes background and retrospectives * [Borg, Omega and Kubernetes](https://queue.acm.org/detail.cfm?id=2898444) From eac74d9954b850b13f94d55dbad58b59642a0460 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 7 Dec 2019 08:43:32 -0500 Subject: [PATCH 013/302] new ci resource --- .../pages/05-deployment/27-continuous-integration.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/pages/05-deployment/27-continuous-integration.markdown b/content/pages/05-deployment/27-continuous-integration.markdown index 41ba7ddb8..2c93e2f56 100644 --- a/content/pages/05-deployment/27-continuous-integration.markdown +++ b/content/pages/05-deployment/27-continuous-integration.markdown @@ -131,6 +131,11 @@ programming language agnostic. Learn more via the following resources or on is a retrospective on learning CI from a Rackspace intern on how she learned the subject. +* [The real difference between CI and CD](https://fire.ci/blog/the-difference-between-ci-and-cd/) + explains what advantages CI provides, what constraints it operates under + (such as total build time) to work well, and how that is different from + the related but distinct concept of continuous delivery. + * [6 top continuous integration tools](https://opensource.com/business/15/7/six-continuous-integration-tools) gives a high level overview of six CI tools from a programming language agnostic perspective. From 03b85a970e976b44e867a9dd54957a986688b71a Mon Sep 17 00:00:00 2001 From: Michael Herman Date: Sat, 7 Dec 2019 08:56:25 -0700 Subject: [PATCH 014/302] add bit about Masonite --- .../10-other-web-frameworks.markdown | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/content/pages/04-web-development/10-other-web-frameworks.markdown b/content/pages/04-web-development/10-other-web-frameworks.markdown index 89635e140..d4f680e6f 100644 --- a/content/pages/04-web-development/10-other-web-frameworks.markdown +++ b/content/pages/04-web-development/10-other-web-frameworks.markdown @@ -82,6 +82,20 @@ requests and responses via Python objects and does not integrate session handling or [database](/databases.html) access. +## Masonite + +[Masonite](https://docs.masoniteproject.com/) is a modern, developer +centric, batteries-included Python web framework. It uses the MVC +(Model-View-Controller) architecture pattern and comes with a lot of +functionality out of the box with an extremely extendable architecture. + +Check out the following resources to lean more: + +1. [5 reasons why people are choosing Masonite over Django](https://dev.to/masonite/5-reasons-why-people-are-choosing-masonite-over-django-ic3) +1. [MasoniteCasts](https://masonitecasts.com/) +1. [Dockerizing Masonite with Postgres, Gunicorn, and Nginx](https://testdriven.io/blog/dockerizing-masonite-with-postgres-gunicorn-and-nginx/) + + ### Other web framework resources * This [roundup of 14 minimal Python frameworks](http://codecondo.com/14-minimal-web-frameworks-for-python/) contains both familiar and less known Python libraries. From 7586ee38d141e6eb148293d3f79ec7a3d0eef652 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 8 Dec 2019 08:10:58 -0500 Subject: [PATCH 015/302] adding prometheus resource --- .../06-jupyter-notebook.markdown | 6 ++++++ content/pages/06-devops/02-prometheus.markdown | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/content/pages/02-development-environments/06-jupyter-notebook.markdown b/content/pages/02-development-environments/06-jupyter-notebook.markdown index cd7c5c1f9..239c55e5c 100644 --- a/content/pages/02-development-environments/06-jupyter-notebook.markdown +++ b/content/pages/02-development-environments/06-jupyter-notebook.markdown @@ -163,6 +163,12 @@ like advanced interactive visualizations. uses a freely-available Bitcoin API as a source data set for a data analysis and visualization project in Jupyter. +* [nbdev: use Jupyter Notebooks for everything](https://www.fast.ai/2019/12/02/nbdev/) + shows how to use the [nbdev](https://nbdev.fast.ai/) tool to create a literate + programming environment within a Jupyter Notebook so that you can do + all of your debugging and refactoring there rather than switching between + a more traditional IDE and Jupyter. + * [Running Jupyter Notebooks on GPU on AWS: a starter guide](https://blog.keras.io/running-jupyter-notebooks-on-gpu-on-aws-a-starter-guide.html) explains how to run notebooks on Amazon Web Services using a graphics-processing unit (video card), which for some machine learning diff --git a/content/pages/06-devops/02-prometheus.markdown b/content/pages/06-devops/02-prometheus.markdown index 2e542d867..d8f3114cb 100644 --- a/content/pages/06-devops/02-prometheus.markdown +++ b/content/pages/06-devops/02-prometheus.markdown @@ -43,3 +43,9 @@ and report on Python [web applications](/web-development.html). * [A gentle introduction to the wonderful world of metrics](https://tech.showmax.com/2019/10/prometheus-introduction/) has a quick summary that compares Prometheus with Nagios, then digs into the logging format and what you can visualize with this tool. + +* [From Graphite to Prometheus](https://engineering.nanit.com/from-graphite-to-prometheus-things-ive-learned-e1d1e4b97fc) + explains some of the differences between using a StatsD / Graphite + monitoring stack and Prometheus, such as how Prometheus scrapes data + instead of the applications pushing data to a metrics aggregator, + and the query languages for each tool. From 5c3146c60223f27c0b3ce1cafa9a8d938cf82708 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 8 Dec 2019 10:34:17 -0500 Subject: [PATCH 016/302] update changelog --- content/pages/meta/00-change-log.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 6c70a92ae..56eb814f9 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -16,6 +16,9 @@ on GitHub. ## 2019 ### December +* Merged PR [#224](https://github.com/mattmakai/fullstackpython.com/pull/224) + with information and resources on the Masonite web framework for the + [other.web frameworks](/other-web-frameworks.html) page. * Updated the [RQ](/redis-queue-rq.html) page with a couple of new fresh resources. * Added new Django code example pages: From f8fbaa1ecb17e68e363d0ad2fa5583510460787b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 9 Dec 2019 16:09:46 -0500 Subject: [PATCH 017/302] working on foreignkey django page --- .../pages/05-deployment/17-freebsd.markdown | 13 +- .../django-db-models-foreignkey.markdown | 1968 +++++++++++++++++ content/pages/meta/00-change-log.markdown | 1 + theme/templates/table-of-contents.html | 1 + 4 files changed, 1982 insertions(+), 1 deletion(-) create mode 100644 content/pages/examples/django/django-db-models-foreignkey.markdown diff --git a/content/pages/05-deployment/17-freebsd.markdown b/content/pages/05-deployment/17-freebsd.markdown index d24233402..e66083c73 100644 --- a/content/pages/05-deployment/17-freebsd.markdown +++ b/content/pages/05-deployment/17-freebsd.markdown @@ -19,4 +19,15 @@ within the Unix family tree that can be used used for ### FreeBSD Python resources * [How to Get Started with FreeBSD](https://www.digitalocean.com/community/tutorials/how-to-get-started-with-freebsd) covers the first steps of logging into a FreeBSD server with SSH, - updating the `root` password and setting your default shell. + updating the `root` password and setting your default shell. There is also + a follow-up post for setting up your + [SSH keys on FreeBSD](https://www.digitalocean.com/community/tutorials/how-to-configure-ssh-key-based-authentication-on-a-freebsd-server). + +* The + [FreeBSD Developer's Handbook](https://www.freebsd.org/doc/en/books/developers-handbook/book.html) + shows the extensive documentation available to you as you work with Python + and other programming languages on this operating system. + +* [Recommended Steps For New FreeBSD 12.0 Servers](https://www.digitalocean.com/community/tutorials/recommended-steps-for-new-freebsd-12-0-servers) + explains setting time zones, setting up the IPFW Firewall and configuring + NTP for accurate time. diff --git a/content/pages/examples/django/django-db-models-foreignkey.markdown b/content/pages/examples/django/django-db-models-foreignkey.markdown new file mode 100644 index 000000000..7d67a4e70 --- /dev/null +++ b/content/pages/examples/django/django-db-models-foreignkey.markdown @@ -0,0 +1,1968 @@ +title: django.db.models ForeignKey Python Code Examples +category: page +slug: django-db-models-foreignkey-examples +sortorder: 50132 +toc: False +sidebartitle: django.db.models ForeignKey +meta: Python code examples for the ForeignKey class used in the Django ORM, found within the django.db.models module of the Django project. + + +[ForeignKey](https://github.com/django/django/blob/master/django/db/models/fields/related.py) +is a [Django ORM](/django-orm.html) field-to-column mapping for +creating and working with relationships between tables in +[relational databases](/databases.html). + +`ForeignKey` is defined within the +[django.db.models.related](https://github.com/django/django/blob/master/django/db/models/fields/related.py) +module but is typically referenced from +[django.db.models](https://github.com/django/django/tree/master/django/db/models) +rather than using the `related` module reference. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog_tests / models.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog_tests/models.py) + +```python +import uuid + +from django.contrib.postgres.fields import ArrayField +~~from django.db import models +from auditlog.models import AuditlogHistoryField +from auditlog.registry import auditlog + +from multiselectfield import MultiSelectField + + +## ... source file abbreviated to get to the ForeignKey examples ... + + +class RelatedModel(models.Model): + """ + A model with a foreign key. + """ + +~~ related = models.ForeignKey(to='self', on_delete=models.CASCADE) + + history = AuditlogHistoryField() + + +class ManyRelatedModel(models.Model): + """ + A model with a many to many relation. + """ + + related = models.ManyToManyField('self') + + history = AuditlogHistoryField() + + +@auditlog.register(include_fields=['label']) +class SimpleIncludeModel(models.Model): + """ + A simple model used for register's include_fields kwarg + """ + + label = models.CharField(max_length=100) + text = models.TextField(blank=True) + + history = AuditlogHistoryField() + + +class SimpleExcludeModel(models.Model): + """ + A simple model used for register's exclude_fields kwarg + """ + + label = models.CharField(max_length=100) + text = models.TextField(blank=True) + + history = AuditlogHistoryField() + + +class SimpleMappingModel(models.Model): + """ + A simple model used for register's mapping_fields kwarg + """ + + sku = models.CharField(max_length=100) + vtxt = models.CharField(verbose_name='Version', max_length=100) + not_mapped = models.CharField(max_length=100) + + history = AuditlogHistoryField() + + +class AdditionalDataIncludedModel(models.Model): + """ + A model where get_additional_data is defined which allows for logging extra + information about the model in JSON + """ + + label = models.CharField(max_length=100) + text = models.TextField(blank=True) +~~ related = models.ForeignKey(to=SimpleModel, on_delete=models.CASCADE) + + history = AuditlogHistoryField() + + def get_additional_data(self): + """ + Returns JSON that captures a snapshot of additional details of the + model instance. This method, if defined, is accessed by auditlog + manager and added to each logentry instance on creation. + """ + object_details = { + 'related_model_id': self.related.id, + 'related_model_text': self.related.text + } + return object_details + + +# ... source file continues with no further ForeignKey examples ... + +``` + +## Example 2 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / review / models.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/review/models.py) + +```python +from django.conf import settings +from django.core.mail import send_mail +~~from django.db import models +from django.db.models.signals import post_save, post_delete +from django.dispatch import receiver +from django.template.loader import render_to_string +from django.utils.translation import ugettext_lazy as _ + +from conferences.models import Conference +from submissions.models import Submission +from users.models import User + + +# Create your models here. +class Reviewer(models.Model): +~~ user = models.ForeignKey(User, on_delete=models.CASCADE) +~~ conference = models.ForeignKey(Conference, on_delete=models.CASCADE) + + +SCORE = ( + ('1', _('1 - Very Poor')), + ('2', _('2 - Below Average')), + ('3', _('3 - Average')), + ('4', _('4 - Good')), + ('5', _('5 - Excellent')), +) + + +class Review(models.Model): + NUM_SCORES = 4 + + # Score choices codes: + POOR = 1 + BELOW_AVERAGE = 2 + AVERAGE = 3 + GOOD = 4 + EXCELLENT = 5 + + SCORE_CHOICES = ( + ('', _('Choose your score')), + (str(POOR), _('1 - Very Poor')), + (str(BELOW_AVERAGE), _('2 - Below Average')), + (str(AVERAGE), _('3 - Average')), + (str(GOOD), _('4 - Good')), + (str(EXCELLENT), _('5 - Excellent')) + ) + +~~ reviewer = models.ForeignKey( +~~ Reviewer, +~~ on_delete=models.CASCADE, +~~ related_name='reviews', +~~ ) + +~~ paper = models.ForeignKey( +~~ Submission, +~~ on_delete=models.CASCADE, +~~ related_name='reviews', +~~ ) + + technical_merit = models.CharField( + choices=SCORE_CHOICES, + max_length=1, + blank=True, + ) + + clarity = models.CharField( + choices=SCORE_CHOICES, + max_length=1, + blank=True, + ) + + relevance = models.CharField( + choices=SCORE_CHOICES, + max_length=1, + blank=True, + ) + + originality = models.CharField( + choices=SCORE_CHOICES, + max_length=1, + blank=True, + ) + + details = models.TextField() + + submitted = models.BooleanField(default=False) + +~~ def __str__(self): +~~ name = self.reviewer.user.profile.get_full_name() +~~ return f'Review for submission #{self.paper.pk} by {name}' + + def check_details(self): + return check_review_details(self.details, self.paper.stype) + + def score_fields(self): + return { + 'technical_merit': self.technical_merit, + 'clarity': self.clarity, + 'originality': self.originality, + 'relevance': self.relevance, + } + + def missing_score_fields(self): + return tuple(k for k, v in self.score_fields().items() if v == '') + + def all_scores_filled(self): + return self.num_scores_missing() == 0 + + def num_scores_missing(self): + return len(self.missing_score_fields()) + + def warnings(self): + num_missing = self.num_scores_missing() + warnings = [] + if num_missing == Review.NUM_SCORES and not self.details: + warnings.append('Please, start the review') + else: + filled_details = self.check_details() + filled_scores = num_missing == 0 + + if not filled_scores: + warnings.append( + f'{num_missing} of {Review.NUM_SCORES} scores not filled' + ) + if not filled_details: + warnings.append('Review details are incomplete') + if filled_scores and filled_details and not self.submitted: + warnings.append('Review is not submitted yet') + return warnings + + def average_score(self): + if self.all_scores_filled(): + fields = self.score_fields() + return sum(int(x) for x in fields.values()) / len(fields) + return 0 + +## ... source file continues with no further ForeignKey examples ... + +``` + + +## Example 3 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / models.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/models.py) + +```python +from __future__ import absolute_import + +from django.contrib.auth import authenticate +from django.contrib.sites.models import Site +from django.contrib.sites.shortcuts import get_current_site +from django.core.exceptions import PermissionDenied +from django.db import models +from django.utils.crypto import get_random_string + +import allauth.app_settings +from allauth.account.models import EmailAddress +from allauth.account.utils import get_next_redirect_url, setup_user_email +from allauth.compat import ( + force_str, + python_2_unicode_compatible, + ugettext_lazy as _, +) +from allauth.utils import get_user_model + +from ..utils import get_request_param +from . import app_settings, providers +from .adapter import get_adapter +from .fields import JSONField + + +class SocialAppManager(models.Manager): + def get_current(self, provider, request=None): + cache = {} + if request: + cache = getattr(request, '_socialapp_cache', {}) + request._socialapp_cache = cache + app = cache.get(provider) + if not app: + site = get_current_site(request) + app = self.get( + sites__id=site.id, + provider=provider) + cache[provider] = app + return app + + +@python_2_unicode_compatible +class SocialApp(models.Model): + objects = SocialAppManager() + + provider = models.CharField(verbose_name=_('provider'), + max_length=30, + choices=providers.registry.as_choices()) + name = models.CharField(verbose_name=_('name'), + max_length=40) + client_id = models.CharField(verbose_name=_('client id'), + max_length=191, + help_text=_('App ID, or consumer key')) + secret = models.CharField(verbose_name=_('secret key'), + max_length=191, + help_text=_('API secret, client secret, or' + ' consumer secret')) + key = models.CharField(verbose_name=_('key'), + max_length=191, + blank=True, + help_text=_('Key')) + # Most apps can be used across multiple domains, therefore we use + # a ManyToManyField. Note that Facebook requires an app per domain + # (unless the domains share a common base name). + # blank=True allows for disabling apps without removing them + sites = models.ManyToManyField(Site, blank=True) + + class Meta: + verbose_name = _('social application') + verbose_name_plural = _('social applications') + + def __str__(self): + return self.name + + +@python_2_unicode_compatible +class SocialAccount(models.Model): + user = models.ForeignKey(allauth.app_settings.USER_MODEL, + on_delete=models.CASCADE) + provider = models.CharField(verbose_name=_('provider'), + max_length=30, + choices=providers.registry.as_choices()) + # Just in case you're wondering if an OpenID identity URL is going + # to fit in a 'uid': + # + # Ideally, URLField(max_length=1024, unique=True) would be used + # for identity. However, MySQL has a max_length limitation of 191 + # for URLField (in case of utf8mb4). How about + # models.TextField(unique=True) then? Well, that won't work + # either for MySQL due to another bug[1]. So the only way out + # would be to drop the unique constraint, or switch to shorter + # identity URLs. Opted for the latter, as [2] suggests that + # identity URLs are supposed to be short anyway, at least for the + # old spec. + # + # [1] http://code.djangoproject.com/ticket/2495. + # [2] http://openid.net/specs/openid-authentication-1_1.html#limits + + uid = models.CharField(verbose_name=_('uid'), + max_length=app_settings.UID_MAX_LENGTH) + last_login = models.DateTimeField(verbose_name=_('last login'), + auto_now=True) + date_joined = models.DateTimeField(verbose_name=_('date joined'), + auto_now_add=True) + extra_data = JSONField(verbose_name=_('extra data'), default=dict) + + class Meta: + unique_together = ('provider', 'uid') + verbose_name = _('social account') + verbose_name_plural = _('social accounts') + + def authenticate(self): + return authenticate(account=self) + + def __str__(self): + return force_str(self.user) + + def get_profile_url(self): + return self.get_provider_account().get_profile_url() + + def get_avatar_url(self): + return self.get_provider_account().get_avatar_url() + + def get_provider(self): + return providers.registry.by_id(self.provider) + + def get_provider_account(self): + return self.get_provider().wrap_account(self) + + +@python_2_unicode_compatible +class SocialToken(models.Model): + app = models.ForeignKey(SocialApp, on_delete=models.CASCADE) + account = models.ForeignKey(SocialAccount, on_delete=models.CASCADE) + token = models.TextField( + verbose_name=_('token'), + help_text=_( + '"oauth_token" (OAuth1) or access token (OAuth2)')) + token_secret = models.TextField( + blank=True, + verbose_name=_('token secret'), + help_text=_( + '"oauth_token_secret" (OAuth1) or refresh token (OAuth2)')) + expires_at = models.DateTimeField(blank=True, null=True, + verbose_name=_('expires at')) + + class Meta: + unique_together = ('app', 'account') + verbose_name = _('social application token') + verbose_name_plural = _('social application tokens') + + def __str__(self): + return self.token + + +class SocialLogin(object): + """ + Represents a social user that is in the process of being logged + in. This consists of the following information: + + `account` (`SocialAccount` instance): The social account being + logged in. Providers are not responsible for checking whether or + not an account already exists or not. Therefore, a provider + typically creates a new (unsaved) `SocialAccount` instance. The + `User` instance pointed to by the account (`account.user`) may be + prefilled by the provider for use as a starting point later on + during the signup process. + + `token` (`SocialToken` instance): An optional access token token + that results from performing a successful authentication + handshake. + + `state` (`dict`): The state to be preserved during the + authentication handshake. Note that this state may end up in the + url -- do not put any secrets in here. It currently only contains + the url to redirect to after login. + + `email_addresses` (list of `EmailAddress`): Optional list of + e-mail addresses retrieved from the provider. + """ + + def __init__(self, user=None, account=None, token=None, + email_addresses=[]): + if token: + assert token.account is None or token.account == account + self.token = token + self.user = user + self.account = account + self.email_addresses = email_addresses + self.state = {} + + def connect(self, request, user): + self.user = user + self.save(request, connect=True) + + def serialize(self): + serialize_instance = get_adapter().serialize_instance + ret = dict(account=serialize_instance(self.account), + user=serialize_instance(self.user), + state=self.state, + email_addresses=[serialize_instance(ea) + for ea in self.email_addresses]) + if self.token: + ret['token'] = serialize_instance(self.token) + return ret + + @classmethod + def deserialize(cls, data): + deserialize_instance = get_adapter().deserialize_instance + account = deserialize_instance(SocialAccount, data['account']) + user = deserialize_instance(get_user_model(), data['user']) + if 'token' in data: + token = deserialize_instance(SocialToken, data['token']) + else: + token = None + email_addresses = [] + for ea in data['email_addresses']: + email_address = deserialize_instance(EmailAddress, ea) + email_addresses.append(email_address) + ret = cls() + ret.token = token + ret.account = account + ret.user = user + ret.email_addresses = email_addresses + ret.state = data['state'] + return ret + + def save(self, request, connect=False): + """ + Saves a new account. Note that while the account is new, + the user may be an existing one (when connecting accounts) + """ + assert not self.is_existing + user = self.user + user.save() + self.account.user = user + self.account.save() + if app_settings.STORE_TOKENS and self.token: + self.token.account = self.account + self.token.save() + if connect: + # TODO: Add any new email addresses automatically? + pass + else: + setup_user_email(request, user, self.email_addresses) + + @property + def is_existing(self): + """ + Account is temporary, not yet backed by a database record. + """ + return self.account.pk is not None + + def lookup(self): + """ + Lookup existing account, if any. + """ + assert not self.is_existing + try: + a = SocialAccount.objects.get(provider=self.account.provider, + uid=self.account.uid) + # Update account + a.extra_data = self.account.extra_data + self.account = a + self.user = self.account.user + a.save() + # Update token + if app_settings.STORE_TOKENS and self.token: + assert not self.token.pk + try: + t = SocialToken.objects.get(account=self.account, + app=self.token.app) + t.token = self.token.token + if self.token.token_secret: + # only update the refresh token if we got one + # many oauth2 providers do not resend the refresh token + t.token_secret = self.token.token_secret + t.expires_at = self.token.expires_at + t.save() + self.token = t + except SocialToken.DoesNotExist: + self.token.account = a + self.token.save() + except SocialAccount.DoesNotExist: + pass + + def get_redirect_url(self, request): + url = self.state.get('next') + return url + + @classmethod + def state_from_request(cls, request): + state = {} + next_url = get_next_redirect_url(request) + if next_url: + state['next'] = next_url + state['process'] = get_request_param(request, 'process', 'login') + state['scope'] = get_request_param(request, 'scope', '') + state['auth_params'] = get_request_param(request, 'auth_params', '') + return state + + @classmethod + def stash_state(cls, request): + state = cls.state_from_request(request) + verifier = get_random_string() + request.session['socialaccount_state'] = (state, verifier) + return verifier + + @classmethod + def unstash_state(cls, request): + if 'socialaccount_state' not in request.session: + raise PermissionDenied() + state, verifier = request.session.pop('socialaccount_state') + return state + + @classmethod + def verify_and_unstash_state(cls, request, verifier): + if 'socialaccount_state' not in request.session: + raise PermissionDenied() + state, verifier2 = request.session.pop('socialaccount_state') + if verifier != verifier2: + raise PermissionDenied() + return state + +``` + + +## Example 4 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / migrations / 0018_create_pagenode.py**](https://github.com/divio/django-cms/blob/develop/cms/migrations/0018_create_pagenode.py) + +```python +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-01-03 19:50 +from __future__ import unicode_literals + +import django +import django.contrib.auth.models +from django.db import migrations, models +import django.db.models.deletion + +from . import IrreversibleMigration + + +def get_descendants(root): + """ + Returns the a generator of primary keys which represent + descendants of the given page ID (root_id) + """ + # Note this is done because get_descendants() can't be trusted + # as the tree can be corrupt. + + for child in root.children.order_by('path').iterator(): + yield child + + for child in get_descendants(child): + yield child + + +def create_page_nodes(apps, schema_editor): + Page = apps.get_model('cms', 'Page') + TreeNode = apps.get_model('cms', 'TreeNode') + db_alias = schema_editor.connection.alias + root_draft_pages = Page.objects.using(db_alias).filter( + publisher_is_draft=True, + parent__isnull=True, + ) + + create_node = TreeNode.objects.using(db_alias).create + + nodes_by_page = {} + + for root in root_draft_pages: + node = create_node( + site_id=root.site_id, + path=root.path, + depth=root.depth, + numchild=root.numchild, + parent=None, + ) + + nodes_by_page[root.pk] = node + + for descendant in get_descendants(root): + node = create_node( + site_id=descendant.site_id, + path=descendant.path, + depth=descendant.depth, + numchild=descendant.numchild, + parent=nodes_by_page[descendant.parent_id], + ) + nodes_by_page[descendant.pk] = node + + +class Migration(IrreversibleMigration): + + dependencies = [ + ('sites', '0001_initial'), + ('cms', '0017_pagetype'), + ] + replaces = [('cms', '0018_pagenode')] + + operations = [ + migrations.CreateModel( + name='TreeNode', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('path', models.CharField(max_length=255, unique=True)), + ('depth', models.PositiveIntegerField()), + ('numchild', models.PositiveIntegerField(default=0)), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='cms.TreeNode')), + ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='djangocms_nodes', to='sites.Site', verbose_name='site')), + ], + options={ + 'ordering': ('path',), + 'default_permissions': [], + }, + ), + migrations.RunPython(create_page_nodes), + migrations.AddField( + model_name='page', + name='node', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cms_pages', + to='cms.TreeNode'), + ), + migrations.AddField( + model_name='page', + name='migration_0018_control', + field=models.PositiveIntegerField(null=True), + ), + migrations.AlterUniqueTogether( + name='page', + unique_together=set([('node', 'publisher_is_draft')]), + ), + migrations.AlterModelManagers( + name='pageusergroup', + managers=[ + ('objects', django.contrib.auth.models.GroupManager()), + ], + ), + ] + +``` + + +## Example 5 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / admin / __init__.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/__init__.py) + +```python +# -*- coding: utf-8 -*- +# +# Autocomplete feature for admin panel +# +import six +import operator +from functools import update_wrapper +from six.moves import reduce +from typing import Tuple, Dict, Callable # NOQA + +from django.apps import apps +from django.http import HttpResponse, HttpResponseNotFound +from django.conf import settings +from django.db import models +from django.db.models.query import QuerySet +from django.utils.encoding import smart_str +from django.utils.translation import ugettext as _ +from django.utils.text import get_text_list +from django.contrib import admin + +from django_extensions.admin.widgets import ForeignKeySearchInput + + +class ForeignKeyAutocompleteAdminMixin(object): + """ + Admin class for models using the autocomplete feature. + + There are two additional fields: + - related_search_fields: defines fields of managed model that + have to be represented by autocomplete input, together with + a list of target model fields that are searched for + input string, e.g.: + + related_search_fields = { + 'author': ('first_name', 'email'), + } + + - related_string_functions: contains optional functions which + take target model instance as only argument and return string + representation. By default __unicode__() method of target + object is used. + + And also an optional additional field to set the limit on the + results returned by the autocomplete query. You can set this integer + value in your settings file using FOREIGNKEY_AUTOCOMPLETE_LIMIT or + you can set this per ForeignKeyAutocompleteAdmin basis. If any value + is set the results will not be limited. + """ + + related_search_fields = {} # type: Dict[str, Tuple[str]] + related_string_functions = {} # type: Dict[str, Callable] + autocomplete_limit = getattr(settings, 'FOREIGNKEY_AUTOCOMPLETE_LIMIT', None) + + def get_urls(self): + from django.conf.urls import url + + def wrap(view): + def wrapper(*args, **kwargs): + return self.admin_site.admin_view(view)(*args, **kwargs) + return update_wrapper(wrapper, view) + + return [ + url(r'foreignkey_autocomplete/$', wrap(self.foreignkey_autocomplete), + name='%s_%s_autocomplete' % (self.model._meta.app_label, self.model._meta.model_name)) + ] + super(ForeignKeyAutocompleteAdminMixin, self).get_urls() + + def foreignkey_autocomplete(self, request): + """ + Search in the fields of the given related model and returns the + result as a simple string to be used by the jQuery Autocomplete plugin + """ + query = request.GET.get('q', None) + app_label = request.GET.get('app_label', None) + model_name = request.GET.get('model_name', None) + search_fields = request.GET.get('search_fields', None) + object_pk = request.GET.get('object_pk', None) + + try: + to_string_function = self.related_string_functions[model_name] + except KeyError: + if six.PY3: + to_string_function = lambda x: x.__str__() + else: + to_string_function = lambda x: x.__unicode__() + + if search_fields and app_label and model_name and (query or object_pk): + def construct_search(field_name): + # use different lookup methods depending on the notation + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + elif field_name.startswith('@'): + return "%s__search" % field_name[1:] + else: + return "%s__icontains" % field_name + + model = apps.get_model(app_label, model_name) + + queryset = model._default_manager.all() + data = '' + if query: + for bit in query.split(): + or_queries = [models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)}) for field_name in search_fields.split(',')] + other_qs = QuerySet(model) + other_qs.query.select_related = queryset.query.select_related + other_qs = other_qs.filter(reduce(operator.or_, or_queries)) + queryset = queryset & other_qs + + additional_filter = self.get_related_filter(model, request) + if additional_filter: + queryset = queryset.filter(additional_filter) + + if self.autocomplete_limit: + queryset = queryset[:self.autocomplete_limit] + + data = ''.join([six.u('%s|%s\n') % (to_string_function(f), f.pk) for f in queryset]) + elif object_pk: + try: + obj = queryset.get(pk=object_pk) + except Exception: # FIXME: use stricter exception checking + pass + else: + data = to_string_function(obj) + return HttpResponse(data, content_type='text/plain') + return HttpResponseNotFound() + + def get_related_filter(self, model, request): + """ + Given a model class and current request return an optional Q object + that should be applied as an additional filter for autocomplete query. + If no additional filtering is needed, this method should return + None. + """ + return None + + def get_help_text(self, field_name, model_name): + searchable_fields = self.related_search_fields.get(field_name, None) + if searchable_fields: + help_kwargs = { + 'model_name': model_name, + 'field_list': get_text_list(searchable_fields, _('and')), + } + return _('Use the left field to do %(model_name)s lookups in the fields %(field_list)s.') % help_kwargs + return '' + + def formfield_for_dbfield(self, db_field, **kwargs): + """ + Override the default widget for Foreignkey fields if they are + specified in the related_search_fields class attribute. + """ + if isinstance(db_field, models.ForeignKey) and db_field.name in self.related_search_fields: + help_text = self.get_help_text(db_field.name, db_field.remote_field.model._meta.object_name) + if kwargs.get('help_text'): + help_text = six.u('%s %s' % (kwargs['help_text'], help_text)) + kwargs['widget'] = ForeignKeySearchInput(db_field.remote_field, self.related_search_fields[db_field.name]) + kwargs['help_text'] = help_text + return super(ForeignKeyAutocompleteAdminMixin, self).formfield_for_dbfield(db_field, **kwargs) + + +class ForeignKeyAutocompleteAdmin(ForeignKeyAutocompleteAdminMixin, admin.ModelAdmin): + pass + + +class ForeignKeyAutocompleteTabularInline(ForeignKeyAutocompleteAdminMixin, admin.TabularInline): + pass + + +class ForeignKeyAutocompleteStackedInline(ForeignKeyAutocompleteAdminMixin, admin.StackedInline): + pass + +``` + + +## Example 6 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / migrations / 0002_auto_20150606_2003.py**](https://github.com/divio/django-filer/blob/develop/filer/migrations/0002_auto_20150606_2003.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('filer', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='file', + name='polymorphic_ctype', + field=models.ForeignKey(related_name='polymorphic_filer.file_set+', editable=False, to='contenttypes.ContentType', null=True, on_delete=django.db.models.deletion.CASCADE), + preserve_default=True, + ), + ] + +``` + + +## Example 7 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / __future__ / models.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/__future__/models.py) + +```python +# flake8: noqa +import django +from django.db import models as db_models +from django.forms.models import (ModelForm as _ModelForm, + ModelFormMetaclass as _ModelFormMetaclass, + modelform_factory as _modelform_factory, + modelformset_factory as _modelformset_factory, + inlineformset_factory as _inlineformset_factory, + model_to_dict, fields_for_model, BaseModelForm, + BaseModelFormSet, + BaseInlineFormSet) +if django.VERSION < (1, 9): + from django.forms.models import save_instance +from django.utils import six + +from floppyforms import fields +from floppyforms.forms import LayoutRenderer +from floppyforms.models import (ModelChoiceField, ModelMultipleChoiceField) +from floppyforms.widgets import Textarea + + +__all__ = ( + 'ModelForm', 'BaseModelForm', 'model_to_dict', 'fields_for_model', + 'ModelChoiceField', 'ModelMultipleChoiceField', + 'BaseModelFormSet', 'modelformset_factory', 'BaseInlineFormSet', + 'inlineformset_factory', +) +if django.VERSION < (1, 9): + __all__ += ('save_instance',) + + +if django.VERSION > (1, 7): + from django.forms.models import ALL_FIELDS + + __all__ = __all__ + ('ALL_FIELDS',) + + +FORMFIELD_OVERRIDES = { + db_models.BooleanField: {'form_class': fields.BooleanField}, + db_models.CharField: {'form_class': fields.CharField}, + db_models.CommaSeparatedIntegerField: {'form_class': fields.CharField}, + db_models.DateField: {'form_class': fields.DateField}, + db_models.DateTimeField: {'form_class': fields.DateTimeField}, + db_models.DecimalField: {'form_class': fields.DecimalField}, + db_models.EmailField: {'form_class': fields.EmailField}, + db_models.FilePathField: {'form_class': fields.FilePathField}, + db_models.FloatField: {'form_class': fields.FloatField}, + db_models.IntegerField: {'form_class': fields.IntegerField}, + db_models.BigIntegerField: {'form_class': fields.IntegerField}, + db_models.GenericIPAddressField: {'form_class': fields.GenericIPAddressField}, + db_models.NullBooleanField: {'form_class': fields.NullBooleanField}, + db_models.PositiveIntegerField: {'form_class': fields.IntegerField}, + db_models.PositiveSmallIntegerField: {'form_class': fields.IntegerField}, + db_models.SlugField: {'form_class': fields.SlugField}, + db_models.SmallIntegerField: {'form_class': fields.IntegerField}, + db_models.TextField: {'form_class': fields.CharField, 'widget': Textarea}, + db_models.TimeField: {'form_class': fields.TimeField}, + db_models.URLField: {'form_class': fields.URLField}, + # Binary field is never editable, so we don't need to convert it. + + db_models.FileField: {'form_class': fields.FileField}, + db_models.ImageField: {'form_class': fields.ImageField}, + + db_models.ForeignKey: {'form_class': ModelChoiceField}, + db_models.ManyToManyField: {'form_class': ModelMultipleChoiceField}, + db_models.OneToOneField: {'form_class': ModelChoiceField}, +} +if django.VERSION < (1, 9): + FORMFIELD_OVERRIDES[db_models.IPAddressField] = {'form_class': fields.IPAddressField} + +for value in FORMFIELD_OVERRIDES.values(): + value['choices_form_class'] = fields.TypedChoiceField + + +def formfield_callback(db_field, **kwargs): + defaults = FORMFIELD_OVERRIDES.get(db_field.__class__, {}).copy() + defaults.update(kwargs) + return db_field.formfield(**defaults) + + +class ModelFormMetaclass(_ModelFormMetaclass): + def __new__(mcs, name, bases, attrs): + if not attrs.get('formfield_callback'): + attrs['formfield_callback'] = formfield_callback + return super(ModelFormMetaclass, mcs).__new__(mcs, name, bases, attrs) + + +class ModelForm(six.with_metaclass(ModelFormMetaclass, LayoutRenderer, _ModelForm)): + pass + + +def modelform_factory(model, form=ModelForm, fields=None, exclude=None, + formfield_callback=formfield_callback, *args, **kwargs): + return _modelform_factory(model, form, fields, exclude, formfield_callback, + *args, **kwargs) + + +def modelformset_factory(model, form=ModelForm, + formfield_callback=formfield_callback, + *args, **kwargs): + return _modelformset_factory(model, form, formfield_callback, + *args, **kwargs) + + +def inlineformset_factory(parent_model, model, form=ModelForm, + formset=BaseInlineFormSet, fk_name=None, + fields=None, exclude=None, extra=3, can_order=False, + can_delete=True, max_num=None, + formfield_callback=formfield_callback, + *args, **kwargs): + return _inlineformset_factory(parent_model, model, form, formset, fk_name, + fields, exclude, extra, can_order, + can_delete, max_num, formfield_callback, + *args, **kwargs) + +``` + + +## Example 8 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / migrations / 0001_initial.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/migrations/0001_initial.py) + +```python +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0001_initial'), + ('auth', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='GroupObjectPermission', + fields=[ + ('id', models.AutoField(primary_key=True, + serialize=False, auto_created=True, verbose_name='ID')), + ('object_pk', models.CharField( + max_length=255, verbose_name='object ID')), + ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), + ('group', models.ForeignKey(to='auth.Group', on_delete=models.CASCADE)), + ('permission', models.ForeignKey(to='auth.Permission', on_delete=models.CASCADE)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='UserObjectPermission', + fields=[ + ('id', models.AutoField(primary_key=True, + serialize=False, auto_created=True, verbose_name='ID')), + ('object_pk', models.CharField( + max_length=255, verbose_name='object ID')), + ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), + ('permission', models.ForeignKey(to='auth.Permission', on_delete=models.CASCADE)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='userobjectpermission', + unique_together=set([('user', 'permission', 'object_pk')]), + ), + migrations.AlterUniqueTogether( + name='groupobjectpermission', + unique_together=set([('group', 'permission', 'object_pk')]), + ), + ] + +``` + + +## Example 9 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / tests / models.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/tests/models.py) + +```python +from django.db import models +from django.utils.encoding import python_2_unicode_compatible + + +@python_2_unicode_compatible +class TestModel(models.Model): + field1 = models.CharField(max_length=255) + field2 = models.IntegerField() + + def __str__(self): + return '%s%d' % (self.field1, self.field2) + + +@python_2_unicode_compatible +class RelatedToTestModel(models.Model): + field = models.ForeignKey(TestModel, on_delete=models.CASCADE) + + def __str__(self): + return self.field + + +@python_2_unicode_compatible +class SearchableTestModel(models.Model): + field1 = models.CharField(max_length=255) + field2 = models.IntegerField() + + def __str__(self): + return '%s%d' % (self.field1, self.field2) + + @staticmethod + def autocomplete_search_fields(): + return 'field1' + +``` + + +## Example 10 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / migrations / 0001_initial.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/migrations/0001_initial.py) + +```python +from django.conf import settings +import django.db.models.deletion +from django.db import migrations, models + +import oauth2_provider.generators +import oauth2_provider.validators +from oauth2_provider.settings import oauth2_settings + + +class Migration(migrations.Migration): + """ + The following migrations are squashed here: + - 0001_initial.py + - 0002_08_updates.py + - 0003_auto_20160316_1503.py + - 0004_auto_20160525_1623.py + - 0005_auto_20170514_1141.py + - 0006_auto_20171214_2232.py + """ + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL) + ] + + operations = [ + migrations.CreateModel( + name='Application', + fields=[ + ('id', models.BigAutoField(serialize=False, primary_key=True)), + ('client_id', models.CharField(default=oauth2_provider.generators.generate_client_id, unique=True, max_length=100, db_index=True)), + ('redirect_uris', models.TextField(help_text='Allowed URIs list, space separated', blank=True)), + ('client_type', models.CharField(max_length=32, choices=[('confidential', 'Confidential'), ('public', 'Public')])), + ('authorization_grant_type', models.CharField(max_length=32, choices=[('authorization-code', 'Authorization code'), ('implicit', 'Implicit'), ('password', 'Resource owner password-based'), ('client-credentials', 'Client credentials')])), + ('client_secret', models.CharField(default=oauth2_provider.generators.generate_client_secret, max_length=255, db_index=True, blank=True)), + ('name', models.CharField(max_length=255, blank=True)), + ('user', models.ForeignKey(related_name="oauth2_provider_application", blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), + ('skip_authorization', models.BooleanField(default=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ], + options={ + 'abstract': False, + 'swappable': 'OAUTH2_PROVIDER_APPLICATION_MODEL', + }, + ), + migrations.CreateModel( + name='AccessToken', + fields=[ + ('id', models.BigAutoField(serialize=False, primary_key=True)), + ('token', models.CharField(unique=True, max_length=255)), + ('expires', models.DateTimeField()), + ('scope', models.TextField(blank=True)), + ('application', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=oauth2_settings.APPLICATION_MODEL)), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='oauth2_provider_accesstoken', to=settings.AUTH_USER_MODEL)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + # Circular reference. Can't add it here. + #('source_refresh_token', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=oauth2_settings.REFRESH_TOKEN_MODEL, related_name="refreshed_access_token")), + ], + options={ + 'abstract': False, + 'swappable': 'OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL', + }, + ), + migrations.CreateModel( + name='Grant', + fields=[ + ('id', models.BigAutoField(serialize=False, primary_key=True)), + ('code', models.CharField(unique=True, max_length=255)), + ('expires', models.DateTimeField()), + ('redirect_uri', models.CharField(max_length=255)), + ('scope', models.TextField(blank=True)), + ('application', models.ForeignKey(to=oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='oauth2_provider_grant', to=settings.AUTH_USER_MODEL)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ], + options={ + 'abstract': False, + 'swappable': 'OAUTH2_PROVIDER_GRANT_MODEL', + }, + ), + migrations.CreateModel( + name='RefreshToken', + fields=[ + ('id', models.BigAutoField(serialize=False, primary_key=True)), + ('token', models.CharField(max_length=255)), + ('access_token', models.OneToOneField(blank=True, null=True, related_name="refresh_token", to=oauth2_settings.ACCESS_TOKEN_MODEL, on_delete=models.SET_NULL)), + ('application', models.ForeignKey(to=oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='oauth2_provider_refreshtoken', to=settings.AUTH_USER_MODEL)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('revoked', models.DateTimeField(null=True)), + ], + options={ + 'abstract': False, + 'swappable': 'OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL', + 'unique_together': set([("token", "revoked")]), + }, + ), + migrations.AddField( + model_name='AccessToken', + name='source_refresh_token', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=oauth2_settings.REFRESH_TOKEN_MODEL, related_name="refreshed_access_token"), + ), + ] + +``` + + +## Example 11 from django-push-notifications +[django-push-notifications](https://github.com/jazzband/django-push-notifications) +is a [Django](/django.html) app for storing and interacting with +push notification services such as +[Google's Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/) +and +[Apple Notifications](https://developer.apple.com/notifications/). +The django-push-notification project's source code is available +open source under the +[MIT license](https://github.com/jazzband/django-push-notifications/blob/master/LICENSE). + +[**django-push-notifications / push_notifications / migrations / 0001_initial.py**](https://github.com/jazzband/django-push-notifications/blob/master/push_notifications/migrations/0001_initial.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models + +import push_notifications.fields + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='APNSDevice', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=255, null=True, verbose_name='Name', blank=True)), + ('active', models.BooleanField(default=True, help_text='Inactive devices will not be sent notifications', verbose_name='Is active')), + ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date', null=True)), + ('device_id', models.UUIDField(help_text='UDID / UIDevice.identifierForVendor()', max_length=32, null=True, verbose_name='Device ID', blank=True, db_index=True)), + ('registration_id', models.CharField(unique=True, max_length=64, verbose_name='Registration ID')), + ('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'APNS device', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='GCMDevice', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=255, null=True, verbose_name='Name', blank=True)), + ('active', models.BooleanField(default=True, help_text='Inactive devices will not be sent notifications', verbose_name='Is active')), + ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date', null=True)), + ('device_id', push_notifications.fields.HexIntegerField(help_text='ANDROID_ID / TelephonyManager.getDeviceId() (always as hex)', null=True, verbose_name='Device ID', blank=True, db_index=True)), + ('registration_id', models.TextField(verbose_name='Registration ID')), + ('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'GCM device', + }, + bases=(models.Model,), + ), + ] + +``` + + +## Example 12 from django-smithy +[django-smithy](https://github.com/jamiecounsell/django-smithy) is +a [Django](/django.html) code library that allows users to send +HTTP requests from the Django admin user interface. The code for +the project is open source under the +[MIT license](https://github.com/jamiecounsell/django-smithy/blob/master/LICENSE). + +[**django-smithy / smithy / migrations / 0002_auto_20190317_1052_squashed_0008_auto_20190317_1213.py**](https://github.com/jamiecounsell/django-smithy/blob/master/smithy/migrations/0002_auto_20190317_1052_squashed_0008_auto_20190317_1213.py) + +```python +# Generated by Django 2.1.5 on 2019-03-17 17:14 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import model_utils.fields + + +class Migration(migrations.Migration): + + replaces = [('smithy', '0002_auto_20190317_1052'), ('smithy', '0003_auto_20190317_1103'), ('smithy', '0004_auto_20190317_1104'), ('smithy', '0005_auto_20190317_1107'), ('smithy', '0006_request_body_type'), ('smithy', '0007_auto_20190317_1159'), ('smithy', '0008_auto_20190317_1213')] + + dependencies = [ + ('smithy', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='BodyParameter', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), + ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), + ('name', models.CharField(max_length=200)), + ('value', models.TextField()), + ('request', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='body_parameters', to='smithy.RequestBlueprint')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='requestrecord', + name='raw_request', + field=models.TextField(default=''), + ), + migrations.RemoveField( + model_name='requestrecord', + name='response', + ), + migrations.AddField( + model_name='requestrecord', + name='status', + field=models.PositiveIntegerField(null=True), + ), + migrations.AddField( + model_name='requestrecord', + name='raw_response', + field=models.TextField(default=''), + preserve_default=False, + ), + migrations.AddField( + model_name='request', + name='content_type', + field=models.CharField(blank=True, choices=[('', 'Other'), ('application/x-www-form-urlencoded', 'x-www-form-urlencoded'), ('application/json', 'JSON'), ('text/plain', 'Text'), ('application/javascript', 'JavaScript'), ('application/xml', 'XML (application/xml)'), ('text/xml', 'XML (text/xml)'), ('text/html', 'HTML')], default='', max_length=100, null=True), + ), + ] + +``` + + +## Example 13 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / migrations / 0001_initial.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/migrations/0001_initial.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Query', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=255)), + ('sql', models.TextField()), + ('description', models.TextField(null=True, blank=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('last_run_date', models.DateTimeField(auto_now=True)), + ('created_by_user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), + ], + options={ + 'ordering': ['title'], + 'verbose_name_plural': 'Queries', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='QueryLog', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('sql', models.TextField()), + ('is_playground', models.BooleanField(default=False)), + ('run_at', models.DateTimeField(auto_now_add=True)), + ('query', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='explorer.Query', null=True)), + ('run_by_user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), + ], + options={ + 'ordering': ['-run_at'], + }, + bases=(models.Model,), + ), + ] + +``` + + +## Example 14 from django-taggit +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([source code](https://github.com/jazzband/django-debug-toolbar) and +[PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / migrations / 0001_initial.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/migrations/0001_initial.py) + +```python +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [("contenttypes", "0001_initial")] + + operations = [ + migrations.CreateModel( + name="Tag", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + help_text="", + verbose_name="ID", + ), + ), + ( + "name", + models.CharField( + help_text="", unique=True, max_length=100, verbose_name="Name" + ), + ), + ( + "slug", + models.SlugField( + help_text="", unique=True, max_length=100, verbose_name="Slug" + ), + ), + ], + options={"verbose_name": "Tag", "verbose_name_plural": "Tags"}, + bases=(models.Model,), + ), + migrations.CreateModel( + name="TaggedItem", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + help_text="", + verbose_name="ID", + ), + ), + ( + "object_id", + models.IntegerField( + help_text="", verbose_name="Object id", db_index=True + ), + ), + ( + "content_type", + models.ForeignKey( + related_name="taggit_taggeditem_tagged_items", + verbose_name="Content type", + to="contenttypes.ContentType", + help_text="", + on_delete=models.CASCADE, + ), + ), + ( + "tag", + models.ForeignKey( + related_name="taggit_taggeditem_items", + to="taggit.Tag", + help_text="", + on_delete=models.CASCADE, + ), + ), + ], + options={ + "verbose_name": "Tagged Item", + "verbose_name_plural": "Tagged Items", + }, + bases=(models.Model,), + ), + ] + +``` + + +## Example 15 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / migrations / 0001_initial.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/migrations/0001_initial.py) + +```python +import django.db.models.deletion +import mptt.fields +from django.conf import settings +from django.db import migrations, models +from django.db.models.fields import GenericIPAddressField as IPAddressField +from wiki.conf.settings import GROUP_MODEL + + +class Migration(migrations.Migration): + + dependencies = [ + ('sites', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0001_initial'), + ('auth', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('created', models.DateTimeField(verbose_name='created', auto_now_add=True)), + ('modified', models.DateTimeField(verbose_name='modified', auto_now=True, help_text='Article properties last modified')), + ('group_read', models.BooleanField(default=True, verbose_name='group read access')), + ('group_write', models.BooleanField(default=True, verbose_name='group write access')), + ('other_read', models.BooleanField(default=True, verbose_name='others read access')), + ('other_write', models.BooleanField(default=True, verbose_name='others write access')), + ], + options={ + 'permissions': (('moderate', 'Can edit all articles and lock/unlock/restore'), ('assign', 'Can change ownership of any article'), ('grant', 'Can assign permissions to other users')), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ArticleForObject', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('object_id', models.PositiveIntegerField(verbose_name='object ID')), + ('is_mptt', models.BooleanField(default=False, editable=False)), + ('article', models.ForeignKey(to='wiki.Article', on_delete=models.CASCADE)), + ('content_type', models.ForeignKey(related_name='content_type_set_for_articleforobject', verbose_name='content type', to='contenttypes.ContentType', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name_plural': 'Articles for object', + 'verbose_name': 'Article for object', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ArticlePlugin', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('deleted', models.BooleanField(default=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ArticleRevision', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), + ('user_message', models.TextField(blank=True)), + ('automatic_log', models.TextField(blank=True, editable=False)), + ('ip_address', IPAddressField(null=True, verbose_name='IP address', blank=True, editable=False)), + ('modified', models.DateTimeField(auto_now=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('deleted', models.BooleanField(default=False, verbose_name='deleted')), + ('locked', models.BooleanField(default=False, verbose_name='locked')), + ('content', models.TextField(blank=True, verbose_name='article contents')), + ('title', models.CharField(max_length=512, verbose_name='article title', help_text='Each revision contains a title field that must be filled out, even if the title has not changed')), + ('article', models.ForeignKey(to='wiki.Article', verbose_name='article', on_delete=models.CASCADE)), + ('previous_revision', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wiki.ArticleRevision')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'get_latest_by': 'revision_number', + 'ordering': ('created',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ReusablePlugin', + fields=[ + ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), + ('articles', models.ManyToManyField(related_name='shared_plugins_set', to='wiki.Article')), + ], + options={ + }, + bases=('wiki.articleplugin',), + ), + migrations.CreateModel( + name='RevisionPlugin', + fields=[ + ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), + ], + options={ + }, + bases=('wiki.articleplugin',), + ), + migrations.CreateModel( + name='RevisionPluginRevision', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), + ('user_message', models.TextField(blank=True)), + ('automatic_log', models.TextField(blank=True, editable=False)), + ('ip_address', IPAddressField(null=True, verbose_name='IP address', blank=True, editable=False)), + ('modified', models.DateTimeField(auto_now=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('deleted', models.BooleanField(default=False, verbose_name='deleted')), + ('locked', models.BooleanField(default=False, verbose_name='locked')), + ('plugin', models.ForeignKey(related_name='revision_set', to='wiki.RevisionPlugin', on_delete=models.CASCADE)), + ('previous_revision', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wiki.RevisionPluginRevision')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'get_latest_by': 'revision_number', + 'ordering': ('-created',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SimplePlugin', + fields=[ + ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), + ('article_revision', models.ForeignKey(to='wiki.ArticleRevision', on_delete=models.CASCADE)), + ], + options={ + }, + bases=('wiki.articleplugin',), + ), + migrations.CreateModel( + name='URLPath', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('slug', models.SlugField(null=True, blank=True, verbose_name='slug')), + ('lft', models.PositiveIntegerField(db_index=True, editable=False)), + ('rght', models.PositiveIntegerField(db_index=True, editable=False)), + ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), + ('level', models.PositiveIntegerField(db_index=True, editable=False)), + ('article', models.ForeignKey(help_text='This field is automatically updated, but you need to populate it when creating a new URL path.', on_delete=django.db.models.deletion.CASCADE, to='wiki.Article', verbose_name='article')), + ('parent', mptt.fields.TreeForeignKey(blank=True, help_text='Position of URL path in the tree.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='wiki.URLPath')), + ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site')), + ], + options={ + 'verbose_name_plural': 'URL paths', + 'verbose_name': 'URL path', + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='urlpath', + unique_together=set([('site', 'parent', 'slug')]), + ), + migrations.AddField( + model_name='revisionplugin', + name='current_revision', + field=models.OneToOneField(related_name='plugin_set', null=True, help_text='The revision being displayed for this plugin. If you need to do a roll-back, simply change the value of this field.', blank=True, to='wiki.RevisionPluginRevision', verbose_name='current revision', on_delete=models.CASCADE), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='articlerevision', + unique_together=set([('article', 'revision_number')]), + ), + migrations.AddField( + model_name='articleplugin', + name='article', + field=models.ForeignKey(to='wiki.Article', verbose_name='article', on_delete=models.CASCADE), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='articleforobject', + unique_together=set([('content_type', 'object_id')]), + ), + migrations.AddField( + model_name='article', + name='current_revision', + field=models.OneToOneField(related_name='current_set', null=True, help_text='The revision being displayed for this article. If you need to do a roll-back, simply change the value of this field.', blank=True, to='wiki.ArticleRevision', verbose_name='current revision', on_delete=models.CASCADE), + preserve_default=True, + ), + migrations.AddField( + model_name='article', + name='group', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, help_text='Like in a UNIX file system, permissions can be given to a user according to group membership. Groups are handled through the Django auth system.', blank=True, to=GROUP_MODEL, verbose_name='group'), + preserve_default=True, + ), + migrations.AddField( + model_name='article', + name='owner', + field=models.ForeignKey(related_name='owned_articles', null=True, on_delete=django.db.models.deletion.SET_NULL, help_text='The owner of the article, usually the creator. The owner always has both read and write access.', blank=True, to=settings.AUTH_USER_MODEL, verbose_name='owner'), + preserve_default=True, + ), + ] + +``` + + +## Example 16 from dmd-interpreter +[dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) +([running web app](http://www.dmd.nl/DOVE)) +is a Python tool to aggregate clinically relevant information related +to variants in the DMD gene and display that [data](/data.html) to a user +with a [Django](/django.html) web application. + +[**dmd-interpreter / interpreter / migrations / 0001_initial.py**](https://github.com/mitchalexbailey/dmd-interpreter/blob/master/interpreter/migrations/0001_initial.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Choice', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('choice_text', models.CharField(max_length=200)), + ('votes', models.IntegerField(default=0)), + ], + ), + migrations.CreateModel( + name='Question', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('question_text', models.CharField(max_length=200)), + ('pub_date', models.DateTimeField(verbose_name=b'Date Published')), + ], + ), + migrations.AddField( + model_name='choice', + name='question', + field=models.ForeignKey(to='interpreter.Question'), + ), + ] + +``` + + +## Example 17 from gadget-board +[gadget-board](https://github.com/mik4el/gadget-board) is a +[Django](/django.html), +[Django REST Framework (DRF)](/django-rest-framework-drf.html) and +[Angular](/angular.html) web application that is open source under the +[Apache2 license](https://github.com/mik4el/gadget-board/blob/master/LICENSE). + +[**gadget-board / web / gadgets / models.py**](https://github.com/mik4el/gadget-board/blob/master/web/gadgets/models.py) + +```python +from django.db import models +from django.contrib.postgres.fields import JSONField +from django.template.defaultfilters import slugify +from authentication.models import Account + + +class Gadget(models.Model): + name = models.CharField(max_length=40, unique=True) + slug = models.SlugField(null=True, blank=True) + description = models.TextField() + users_can_upload = models.ManyToManyField(Account) + image_name = models.CharField(max_length=140, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + @property + def image_url(self): + if self.image_name != "": + return "backend/static/media/{}".format(self.image_name) + else: + return "backend/static/dashboard_icon_big.png" + + def __str__(self): + return self.name + + def save(self, *args, **kwargs): + if not self.id: + self.slug = slugify(self.name) + + super(Gadget, self).save(*args, **kwargs) + + +class GadgetData(models.Model): + gadget = models.ForeignKey(Gadget, db_index=True, on_delete=models.DO_NOTHING) # Add index on filtered fields + data = JSONField() + added_by = models.ForeignKey(Account, on_delete=models.DO_NOTHING) + timestamp = models.DateTimeField(null=True, blank=True, db_index=True) # Add index on filtered fields + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return '{} {} {}'.format(self.gadget, self.timestamp, self.added_by) + +``` + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 56eb814f9..1f3af5b64 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -22,6 +22,7 @@ on GitHub. * Updated the [RQ](/redis-queue-rq.html) page with a couple of new fresh resources. * Added new Django code example pages: + * [django.db.models.related ForeignKey](/django-db-models-related-foreignkey-examples.html) * [django.forms EmailField](/django-forms-emailfield-examples.html) * [django.forms IntegerField](/django-forms-integerfield-examples.html) diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index 4d999f2d3..9128ae0fb 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -67,6 +67,7 @@

django.db.models DateField, DateTimeField, FileField, + ForeignKey, IntegerField, Model, signal, From 80e2085627355a1b78c7833d075a324dafa1061f Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 10 Dec 2019 05:44:42 -0500 Subject: [PATCH 018/302] link to freebsd stub page in toc --- theme/templates/article-sidebar.html | 2 ++ theme/templates/book-chapters.html | 2 +- theme/templates/sponsor.html | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/theme/templates/article-sidebar.html b/theme/templates/article-sidebar.html index 9b0203bb9..e25cfab10 100644 --- a/theme/templates/article-sidebar.html +++ b/theme/templates/article-sidebar.html @@ -1,4 +1,6 @@ +{% if article.author == "Kevin Whinnery" %} {% include "sponsor/twilioquest.html" %} +{% endif %} {% include "sponsor/carbon.html" %}
diff --git a/theme/templates/book-chapters.html b/theme/templates/book-chapters.html index 0fe0159ba..8adef12f5 100644 --- a/theme/templates/book-chapters.html +++ b/theme/templates/book-chapters.html @@ -137,7 +137,7 @@

5.3 Platform-as-a-Service

5.4 Operating systems

-
FreeBSD
+

5.5 Web servers

diff --git a/theme/templates/sponsor.html b/theme/templates/sponsor.html index 8abb0f3e9..bc378aee8 100644 --- a/theme/templates/sponsor.html +++ b/theme/templates/sponsor.html @@ -1,5 +1,4 @@ {% if page.sortorder[0:2] == "01" or page.sortorder[0:2] == "02" or page.sortorder[0:2] == "03" or page.sortorder[0:2] == "04" or page.sortorder[0:2] == "05" or page.sortorder[0:2] == "06" or page.sortorder[0:2] == "50" %} -{% include "sponsor/twilioquest.html" %} {% include "sponsor/carbon.html" %} {% endif %} {% if false %} From f4e727aad68394e6380c450ad4ceae650861f322 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 11 Dec 2019 06:01:45 -0500 Subject: [PATCH 019/302] working on foreignkey django examples --- .../django-db-models-foreignkey.markdown | 232 +----------------- content/pages/meta/00-change-log.markdown | 2 +- 2 files changed, 10 insertions(+), 224 deletions(-) diff --git a/content/pages/examples/django/django-db-models-foreignkey.markdown b/content/pages/examples/django/django-db-models-foreignkey.markdown index 7d67a4e70..29a47298c 100644 --- a/content/pages/examples/django/django-db-models-foreignkey.markdown +++ b/content/pages/examples/django/django-db-models-foreignkey.markdown @@ -293,7 +293,7 @@ from django.contrib.auth import authenticate from django.contrib.sites.models import Site from django.contrib.sites.shortcuts import get_current_site from django.core.exceptions import PermissionDenied -from django.db import models +~~from django.db import models from django.utils.crypto import get_random_string import allauth.app_settings @@ -312,60 +312,13 @@ from .adapter import get_adapter from .fields import JSONField -class SocialAppManager(models.Manager): - def get_current(self, provider, request=None): - cache = {} - if request: - cache = getattr(request, '_socialapp_cache', {}) - request._socialapp_cache = cache - app = cache.get(provider) - if not app: - site = get_current_site(request) - app = self.get( - sites__id=site.id, - provider=provider) - cache[provider] = app - return app - - -@python_2_unicode_compatible -class SocialApp(models.Model): - objects = SocialAppManager() - - provider = models.CharField(verbose_name=_('provider'), - max_length=30, - choices=providers.registry.as_choices()) - name = models.CharField(verbose_name=_('name'), - max_length=40) - client_id = models.CharField(verbose_name=_('client id'), - max_length=191, - help_text=_('App ID, or consumer key')) - secret = models.CharField(verbose_name=_('secret key'), - max_length=191, - help_text=_('API secret, client secret, or' - ' consumer secret')) - key = models.CharField(verbose_name=_('key'), - max_length=191, - blank=True, - help_text=_('Key')) - # Most apps can be used across multiple domains, therefore we use - # a ManyToManyField. Note that Facebook requires an app per domain - # (unless the domains share a common base name). - # blank=True allows for disabling apps without removing them - sites = models.ManyToManyField(Site, blank=True) - - class Meta: - verbose_name = _('social application') - verbose_name_plural = _('social applications') - - def __str__(self): - return self.name +## ... source file abbreviated to get to ForeignKey examples ... @python_2_unicode_compatible class SocialAccount(models.Model): - user = models.ForeignKey(allauth.app_settings.USER_MODEL, - on_delete=models.CASCADE) +~~ user = models.ForeignKey(allauth.app_settings.USER_MODEL, +~~ on_delete=models.CASCADE) provider = models.CharField(verbose_name=_('provider'), max_length=30, choices=providers.registry.as_choices()) @@ -401,8 +354,8 @@ class SocialAccount(models.Model): def authenticate(self): return authenticate(account=self) - def __str__(self): - return force_str(self.user) +~~ def __str__(self): +~~ return force_str(self.user) def get_profile_url(self): return self.get_provider_account().get_profile_url() @@ -419,8 +372,8 @@ class SocialAccount(models.Model): @python_2_unicode_compatible class SocialToken(models.Model): - app = models.ForeignKey(SocialApp, on_delete=models.CASCADE) - account = models.ForeignKey(SocialAccount, on_delete=models.CASCADE) +~~ app = models.ForeignKey(SocialApp, on_delete=models.CASCADE) +~~ account = models.ForeignKey(SocialAccount, on_delete=models.CASCADE) token = models.TextField( verbose_name=_('token'), help_text=_( @@ -442,174 +395,7 @@ class SocialToken(models.Model): return self.token -class SocialLogin(object): - """ - Represents a social user that is in the process of being logged - in. This consists of the following information: - - `account` (`SocialAccount` instance): The social account being - logged in. Providers are not responsible for checking whether or - not an account already exists or not. Therefore, a provider - typically creates a new (unsaved) `SocialAccount` instance. The - `User` instance pointed to by the account (`account.user`) may be - prefilled by the provider for use as a starting point later on - during the signup process. - - `token` (`SocialToken` instance): An optional access token token - that results from performing a successful authentication - handshake. - - `state` (`dict`): The state to be preserved during the - authentication handshake. Note that this state may end up in the - url -- do not put any secrets in here. It currently only contains - the url to redirect to after login. - - `email_addresses` (list of `EmailAddress`): Optional list of - e-mail addresses retrieved from the provider. - """ - - def __init__(self, user=None, account=None, token=None, - email_addresses=[]): - if token: - assert token.account is None or token.account == account - self.token = token - self.user = user - self.account = account - self.email_addresses = email_addresses - self.state = {} - - def connect(self, request, user): - self.user = user - self.save(request, connect=True) - - def serialize(self): - serialize_instance = get_adapter().serialize_instance - ret = dict(account=serialize_instance(self.account), - user=serialize_instance(self.user), - state=self.state, - email_addresses=[serialize_instance(ea) - for ea in self.email_addresses]) - if self.token: - ret['token'] = serialize_instance(self.token) - return ret - - @classmethod - def deserialize(cls, data): - deserialize_instance = get_adapter().deserialize_instance - account = deserialize_instance(SocialAccount, data['account']) - user = deserialize_instance(get_user_model(), data['user']) - if 'token' in data: - token = deserialize_instance(SocialToken, data['token']) - else: - token = None - email_addresses = [] - for ea in data['email_addresses']: - email_address = deserialize_instance(EmailAddress, ea) - email_addresses.append(email_address) - ret = cls() - ret.token = token - ret.account = account - ret.user = user - ret.email_addresses = email_addresses - ret.state = data['state'] - return ret - - def save(self, request, connect=False): - """ - Saves a new account. Note that while the account is new, - the user may be an existing one (when connecting accounts) - """ - assert not self.is_existing - user = self.user - user.save() - self.account.user = user - self.account.save() - if app_settings.STORE_TOKENS and self.token: - self.token.account = self.account - self.token.save() - if connect: - # TODO: Add any new email addresses automatically? - pass - else: - setup_user_email(request, user, self.email_addresses) - - @property - def is_existing(self): - """ - Account is temporary, not yet backed by a database record. - """ - return self.account.pk is not None - - def lookup(self): - """ - Lookup existing account, if any. - """ - assert not self.is_existing - try: - a = SocialAccount.objects.get(provider=self.account.provider, - uid=self.account.uid) - # Update account - a.extra_data = self.account.extra_data - self.account = a - self.user = self.account.user - a.save() - # Update token - if app_settings.STORE_TOKENS and self.token: - assert not self.token.pk - try: - t = SocialToken.objects.get(account=self.account, - app=self.token.app) - t.token = self.token.token - if self.token.token_secret: - # only update the refresh token if we got one - # many oauth2 providers do not resend the refresh token - t.token_secret = self.token.token_secret - t.expires_at = self.token.expires_at - t.save() - self.token = t - except SocialToken.DoesNotExist: - self.token.account = a - self.token.save() - except SocialAccount.DoesNotExist: - pass - - def get_redirect_url(self, request): - url = self.state.get('next') - return url - - @classmethod - def state_from_request(cls, request): - state = {} - next_url = get_next_redirect_url(request) - if next_url: - state['next'] = next_url - state['process'] = get_request_param(request, 'process', 'login') - state['scope'] = get_request_param(request, 'scope', '') - state['auth_params'] = get_request_param(request, 'auth_params', '') - return state - - @classmethod - def stash_state(cls, request): - state = cls.state_from_request(request) - verifier = get_random_string() - request.session['socialaccount_state'] = (state, verifier) - return verifier - - @classmethod - def unstash_state(cls, request): - if 'socialaccount_state' not in request.session: - raise PermissionDenied() - state, verifier = request.session.pop('socialaccount_state') - return state - - @classmethod - def verify_and_unstash_state(cls, request, verifier): - if 'socialaccount_state' not in request.session: - raise PermissionDenied() - state, verifier2 = request.session.pop('socialaccount_state') - if verifier != verifier2: - raise PermissionDenied() - return state +## ... source file continues with no further ForeignKey examples ... ``` diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 1f3af5b64..43baafab4 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -18,7 +18,7 @@ on GitHub. ### December * Merged PR [#224](https://github.com/mattmakai/fullstackpython.com/pull/224) with information and resources on the Masonite web framework for the - [other.web frameworks](/other-web-frameworks.html) page. + [other web frameworks](/other-web-frameworks.html) page. * Updated the [RQ](/redis-queue-rq.html) page with a couple of new fresh resources. * Added new Django code example pages: From 86715a31760c9ff70507f6c0987eb75b9737d7ab Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 11 Dec 2019 06:10:39 -0500 Subject: [PATCH 020/302] cleaning up foreignkey django example code --- .../django-db-models-foreignkey.markdown | 1050 +---------------- 1 file changed, 34 insertions(+), 1016 deletions(-) diff --git a/content/pages/examples/django/django-db-models-foreignkey.markdown b/content/pages/examples/django/django-db-models-foreignkey.markdown index 29a47298c..87f1152b1 100644 --- a/content/pages/examples/django/django-db-models-foreignkey.markdown +++ b/content/pages/examples/django/django-db-models-foreignkey.markdown @@ -417,7 +417,7 @@ from __future__ import unicode_literals import django import django.contrib.auth.models -from django.db import migrations, models +~~from django.db import migrations, models import django.db.models.deletion from . import IrreversibleMigration @@ -489,8 +489,8 @@ class Migration(IrreversibleMigration): ('path', models.CharField(max_length=255, unique=True)), ('depth', models.PositiveIntegerField()), ('numchild', models.PositiveIntegerField(default=0)), - ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='cms.TreeNode')), - ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='djangocms_nodes', to='sites.Site', verbose_name='site')), +~~ ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='cms.TreeNode')), +~~ ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='djangocms_nodes', to='sites.Site', verbose_name='site')), ], options={ 'ordering': ('path',), @@ -498,12 +498,12 @@ class Migration(IrreversibleMigration): }, ), migrations.RunPython(create_page_nodes), - migrations.AddField( - model_name='page', - name='node', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cms_pages', - to='cms.TreeNode'), - ), +~~ migrations.AddField( +~~ model_name='page', +~~ name='node', +~~ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cms_pages', +~~ to='cms.TreeNode'), +~~ ), migrations.AddField( model_name='page', name='migration_0018_control', @@ -524,366 +524,7 @@ class Migration(IrreversibleMigration): ``` -## Example 5 from django-extensions -[django-extensions](https://github.com/django-extensions/django-extensions) -([project documentation](https://django-extensions.readthedocs.io/en/latest/) -and [PyPI page](https://pypi.org/project/django-extensions/)) -is a [Django](/django.html) project that adds a bunch of additional -useful commands to the `manage.py` interface. This -[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a -quick overview of what you get when you install it into your Python -environment. - -The django-extensions project is open sourced under the -[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). - -[**django-extensions / django_extensions / admin / __init__.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/__init__.py) - -```python -# -*- coding: utf-8 -*- -# -# Autocomplete feature for admin panel -# -import six -import operator -from functools import update_wrapper -from six.moves import reduce -from typing import Tuple, Dict, Callable # NOQA - -from django.apps import apps -from django.http import HttpResponse, HttpResponseNotFound -from django.conf import settings -from django.db import models -from django.db.models.query import QuerySet -from django.utils.encoding import smart_str -from django.utils.translation import ugettext as _ -from django.utils.text import get_text_list -from django.contrib import admin - -from django_extensions.admin.widgets import ForeignKeySearchInput - - -class ForeignKeyAutocompleteAdminMixin(object): - """ - Admin class for models using the autocomplete feature. - - There are two additional fields: - - related_search_fields: defines fields of managed model that - have to be represented by autocomplete input, together with - a list of target model fields that are searched for - input string, e.g.: - - related_search_fields = { - 'author': ('first_name', 'email'), - } - - - related_string_functions: contains optional functions which - take target model instance as only argument and return string - representation. By default __unicode__() method of target - object is used. - - And also an optional additional field to set the limit on the - results returned by the autocomplete query. You can set this integer - value in your settings file using FOREIGNKEY_AUTOCOMPLETE_LIMIT or - you can set this per ForeignKeyAutocompleteAdmin basis. If any value - is set the results will not be limited. - """ - - related_search_fields = {} # type: Dict[str, Tuple[str]] - related_string_functions = {} # type: Dict[str, Callable] - autocomplete_limit = getattr(settings, 'FOREIGNKEY_AUTOCOMPLETE_LIMIT', None) - - def get_urls(self): - from django.conf.urls import url - - def wrap(view): - def wrapper(*args, **kwargs): - return self.admin_site.admin_view(view)(*args, **kwargs) - return update_wrapper(wrapper, view) - - return [ - url(r'foreignkey_autocomplete/$', wrap(self.foreignkey_autocomplete), - name='%s_%s_autocomplete' % (self.model._meta.app_label, self.model._meta.model_name)) - ] + super(ForeignKeyAutocompleteAdminMixin, self).get_urls() - - def foreignkey_autocomplete(self, request): - """ - Search in the fields of the given related model and returns the - result as a simple string to be used by the jQuery Autocomplete plugin - """ - query = request.GET.get('q', None) - app_label = request.GET.get('app_label', None) - model_name = request.GET.get('model_name', None) - search_fields = request.GET.get('search_fields', None) - object_pk = request.GET.get('object_pk', None) - - try: - to_string_function = self.related_string_functions[model_name] - except KeyError: - if six.PY3: - to_string_function = lambda x: x.__str__() - else: - to_string_function = lambda x: x.__unicode__() - - if search_fields and app_label and model_name and (query or object_pk): - def construct_search(field_name): - # use different lookup methods depending on the notation - if field_name.startswith('^'): - return "%s__istartswith" % field_name[1:] - elif field_name.startswith('='): - return "%s__iexact" % field_name[1:] - elif field_name.startswith('@'): - return "%s__search" % field_name[1:] - else: - return "%s__icontains" % field_name - - model = apps.get_model(app_label, model_name) - - queryset = model._default_manager.all() - data = '' - if query: - for bit in query.split(): - or_queries = [models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)}) for field_name in search_fields.split(',')] - other_qs = QuerySet(model) - other_qs.query.select_related = queryset.query.select_related - other_qs = other_qs.filter(reduce(operator.or_, or_queries)) - queryset = queryset & other_qs - - additional_filter = self.get_related_filter(model, request) - if additional_filter: - queryset = queryset.filter(additional_filter) - - if self.autocomplete_limit: - queryset = queryset[:self.autocomplete_limit] - - data = ''.join([six.u('%s|%s\n') % (to_string_function(f), f.pk) for f in queryset]) - elif object_pk: - try: - obj = queryset.get(pk=object_pk) - except Exception: # FIXME: use stricter exception checking - pass - else: - data = to_string_function(obj) - return HttpResponse(data, content_type='text/plain') - return HttpResponseNotFound() - - def get_related_filter(self, model, request): - """ - Given a model class and current request return an optional Q object - that should be applied as an additional filter for autocomplete query. - If no additional filtering is needed, this method should return - None. - """ - return None - - def get_help_text(self, field_name, model_name): - searchable_fields = self.related_search_fields.get(field_name, None) - if searchable_fields: - help_kwargs = { - 'model_name': model_name, - 'field_list': get_text_list(searchable_fields, _('and')), - } - return _('Use the left field to do %(model_name)s lookups in the fields %(field_list)s.') % help_kwargs - return '' - - def formfield_for_dbfield(self, db_field, **kwargs): - """ - Override the default widget for Foreignkey fields if they are - specified in the related_search_fields class attribute. - """ - if isinstance(db_field, models.ForeignKey) and db_field.name in self.related_search_fields: - help_text = self.get_help_text(db_field.name, db_field.remote_field.model._meta.object_name) - if kwargs.get('help_text'): - help_text = six.u('%s %s' % (kwargs['help_text'], help_text)) - kwargs['widget'] = ForeignKeySearchInput(db_field.remote_field, self.related_search_fields[db_field.name]) - kwargs['help_text'] = help_text - return super(ForeignKeyAutocompleteAdminMixin, self).formfield_for_dbfield(db_field, **kwargs) - - -class ForeignKeyAutocompleteAdmin(ForeignKeyAutocompleteAdminMixin, admin.ModelAdmin): - pass - - -class ForeignKeyAutocompleteTabularInline(ForeignKeyAutocompleteAdminMixin, admin.TabularInline): - pass - - -class ForeignKeyAutocompleteStackedInline(ForeignKeyAutocompleteAdminMixin, admin.StackedInline): - pass - -``` - - -## Example 6 from django-filer -[django-filer](https://github.com/divio/django-filer) -([project documentation](https://django-filer.readthedocs.io/en/latest/)) -is a file management library for uploading and organizing files and images -in Django's admin interface. The project's code is available under the -[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). - -[**django-filer / filer / migrations / 0002_auto_20150606_2003.py**](https://github.com/divio/django-filer/blob/develop/filer/migrations/0002_auto_20150606_2003.py) - -```python -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('filer', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='file', - name='polymorphic_ctype', - field=models.ForeignKey(related_name='polymorphic_filer.file_set+', editable=False, to='contenttypes.ContentType', null=True, on_delete=django.db.models.deletion.CASCADE), - preserve_default=True, - ), - ] - -``` - - -## Example 7 from django-floppyforms -[django-floppyforms](https://github.com/jazzband/django-floppyforms) -([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) -and -[PyPI page](https://pypi.org/project/django-floppyforms/)) -is a [Django](/django.html) code library for better control -over rendering HTML forms in your [templates](/template-engines.html). - -The django-floppyforms code is provided as -[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) -and maintained by the collaborative developer community group -[Jazzband](https://jazzband.co/). - -[**django-floppyforms / floppyforms / __future__ / models.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/__future__/models.py) - -```python -# flake8: noqa -import django -from django.db import models as db_models -from django.forms.models import (ModelForm as _ModelForm, - ModelFormMetaclass as _ModelFormMetaclass, - modelform_factory as _modelform_factory, - modelformset_factory as _modelformset_factory, - inlineformset_factory as _inlineformset_factory, - model_to_dict, fields_for_model, BaseModelForm, - BaseModelFormSet, - BaseInlineFormSet) -if django.VERSION < (1, 9): - from django.forms.models import save_instance -from django.utils import six - -from floppyforms import fields -from floppyforms.forms import LayoutRenderer -from floppyforms.models import (ModelChoiceField, ModelMultipleChoiceField) -from floppyforms.widgets import Textarea - - -__all__ = ( - 'ModelForm', 'BaseModelForm', 'model_to_dict', 'fields_for_model', - 'ModelChoiceField', 'ModelMultipleChoiceField', - 'BaseModelFormSet', 'modelformset_factory', 'BaseInlineFormSet', - 'inlineformset_factory', -) -if django.VERSION < (1, 9): - __all__ += ('save_instance',) - - -if django.VERSION > (1, 7): - from django.forms.models import ALL_FIELDS - - __all__ = __all__ + ('ALL_FIELDS',) - - -FORMFIELD_OVERRIDES = { - db_models.BooleanField: {'form_class': fields.BooleanField}, - db_models.CharField: {'form_class': fields.CharField}, - db_models.CommaSeparatedIntegerField: {'form_class': fields.CharField}, - db_models.DateField: {'form_class': fields.DateField}, - db_models.DateTimeField: {'form_class': fields.DateTimeField}, - db_models.DecimalField: {'form_class': fields.DecimalField}, - db_models.EmailField: {'form_class': fields.EmailField}, - db_models.FilePathField: {'form_class': fields.FilePathField}, - db_models.FloatField: {'form_class': fields.FloatField}, - db_models.IntegerField: {'form_class': fields.IntegerField}, - db_models.BigIntegerField: {'form_class': fields.IntegerField}, - db_models.GenericIPAddressField: {'form_class': fields.GenericIPAddressField}, - db_models.NullBooleanField: {'form_class': fields.NullBooleanField}, - db_models.PositiveIntegerField: {'form_class': fields.IntegerField}, - db_models.PositiveSmallIntegerField: {'form_class': fields.IntegerField}, - db_models.SlugField: {'form_class': fields.SlugField}, - db_models.SmallIntegerField: {'form_class': fields.IntegerField}, - db_models.TextField: {'form_class': fields.CharField, 'widget': Textarea}, - db_models.TimeField: {'form_class': fields.TimeField}, - db_models.URLField: {'form_class': fields.URLField}, - # Binary field is never editable, so we don't need to convert it. - - db_models.FileField: {'form_class': fields.FileField}, - db_models.ImageField: {'form_class': fields.ImageField}, - - db_models.ForeignKey: {'form_class': ModelChoiceField}, - db_models.ManyToManyField: {'form_class': ModelMultipleChoiceField}, - db_models.OneToOneField: {'form_class': ModelChoiceField}, -} -if django.VERSION < (1, 9): - FORMFIELD_OVERRIDES[db_models.IPAddressField] = {'form_class': fields.IPAddressField} - -for value in FORMFIELD_OVERRIDES.values(): - value['choices_form_class'] = fields.TypedChoiceField - - -def formfield_callback(db_field, **kwargs): - defaults = FORMFIELD_OVERRIDES.get(db_field.__class__, {}).copy() - defaults.update(kwargs) - return db_field.formfield(**defaults) - - -class ModelFormMetaclass(_ModelFormMetaclass): - def __new__(mcs, name, bases, attrs): - if not attrs.get('formfield_callback'): - attrs['formfield_callback'] = formfield_callback - return super(ModelFormMetaclass, mcs).__new__(mcs, name, bases, attrs) - - -class ModelForm(six.with_metaclass(ModelFormMetaclass, LayoutRenderer, _ModelForm)): - pass - - -def modelform_factory(model, form=ModelForm, fields=None, exclude=None, - formfield_callback=formfield_callback, *args, **kwargs): - return _modelform_factory(model, form, fields, exclude, formfield_callback, - *args, **kwargs) - - -def modelformset_factory(model, form=ModelForm, - formfield_callback=formfield_callback, - *args, **kwargs): - return _modelformset_factory(model, form, formfield_callback, - *args, **kwargs) - - -def inlineformset_factory(parent_model, model, form=ModelForm, - formset=BaseInlineFormSet, fk_name=None, - fields=None, exclude=None, extra=3, can_order=False, - can_delete=True, max_num=None, - formfield_callback=formfield_callback, - *args, **kwargs): - return _inlineformset_factory(parent_model, model, form, formset, fk_name, - fields, exclude, extra, can_order, - can_delete, max_num, formfield_callback, - *args, **kwargs) - -``` - - -## Example 8 from django-guardian +## Example 5 from django-guardian [django-guardian](https://github.com/django-guardian/django-guardian) ([project documentation](https://django-guardian.readthedocs.io/en/stable/) and @@ -896,7 +537,8 @@ is open source under the [**django-guardian / guardian / migrations / 0001_initial.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/migrations/0001_initial.py) ```python -from django.db import models, migrations +# 0001_initial.py +~~from django.db import models, migrations from django.conf import settings @@ -916,9 +558,9 @@ class Migration(migrations.Migration): serialize=False, auto_created=True, verbose_name='ID')), ('object_pk', models.CharField( max_length=255, verbose_name='object ID')), - ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), - ('group', models.ForeignKey(to='auth.Group', on_delete=models.CASCADE)), - ('permission', models.ForeignKey(to='auth.Permission', on_delete=models.CASCADE)), +~~ ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), +~~ ('group', models.ForeignKey(to='auth.Group', on_delete=models.CASCADE)), +~~ ('permission', models.ForeignKey(to='auth.Permission', on_delete=models.CASCADE)), ], options={ }, @@ -931,9 +573,9 @@ class Migration(migrations.Migration): serialize=False, auto_created=True, verbose_name='ID')), ('object_pk', models.CharField( max_length=255, verbose_name='object ID')), - ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), - ('permission', models.ForeignKey(to='auth.Permission', on_delete=models.CASCADE)), - ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), +~~ ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), +~~ ('permission', models.ForeignKey(to='auth.Permission', on_delete=models.CASCADE)), +~~ ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], options={ }, @@ -952,7 +594,7 @@ class Migration(migrations.Migration): ``` -## Example 9 from django-jet +## Example 6 from django-jet [django-jet](https://github.com/geex-arts/django-jet) ([project documentation](https://jet.readthedocs.io/en/latest/), [PyPI project page](https://pypi.org/project/django-jet/) and @@ -965,7 +607,8 @@ The django-jet project is open source under the [**django-jet / jet / tests / models.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/tests/models.py) ```python -from django.db import models +# models.py +~~from django.db import models from django.utils.encoding import python_2_unicode_compatible @@ -980,10 +623,10 @@ class TestModel(models.Model): @python_2_unicode_compatible class RelatedToTestModel(models.Model): - field = models.ForeignKey(TestModel, on_delete=models.CASCADE) +~~ field = models.ForeignKey(TestModel, on_delete=models.CASCADE) - def __str__(self): - return self.field +~~ def __str__(self): +~~ return self.field @python_2_unicode_compatible @@ -1001,199 +644,7 @@ class SearchableTestModel(models.Model): ``` -## Example 10 from django-oauth-toolkit -[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) -([project website](http://dot.evonove.it/) and -[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) -is a code library for adding and handling [OAuth2](https://oauth.net/) -flows within your [Django](/django.html) web application and -[API](/application-programming-interfaces.html). - -The django-oauth-toolkit project is open sourced under the -[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) -and it is maintained by the developer community group -[Jazzband](https://jazzband.co/). - -[**django-oauth-toolkit / oauth2_provider / migrations / 0001_initial.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/migrations/0001_initial.py) - -```python -from django.conf import settings -import django.db.models.deletion -from django.db import migrations, models - -import oauth2_provider.generators -import oauth2_provider.validators -from oauth2_provider.settings import oauth2_settings - - -class Migration(migrations.Migration): - """ - The following migrations are squashed here: - - 0001_initial.py - - 0002_08_updates.py - - 0003_auto_20160316_1503.py - - 0004_auto_20160525_1623.py - - 0005_auto_20170514_1141.py - - 0006_auto_20171214_2232.py - """ - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL) - ] - - operations = [ - migrations.CreateModel( - name='Application', - fields=[ - ('id', models.BigAutoField(serialize=False, primary_key=True)), - ('client_id', models.CharField(default=oauth2_provider.generators.generate_client_id, unique=True, max_length=100, db_index=True)), - ('redirect_uris', models.TextField(help_text='Allowed URIs list, space separated', blank=True)), - ('client_type', models.CharField(max_length=32, choices=[('confidential', 'Confidential'), ('public', 'Public')])), - ('authorization_grant_type', models.CharField(max_length=32, choices=[('authorization-code', 'Authorization code'), ('implicit', 'Implicit'), ('password', 'Resource owner password-based'), ('client-credentials', 'Client credentials')])), - ('client_secret', models.CharField(default=oauth2_provider.generators.generate_client_secret, max_length=255, db_index=True, blank=True)), - ('name', models.CharField(max_length=255, blank=True)), - ('user', models.ForeignKey(related_name="oauth2_provider_application", blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), - ('skip_authorization', models.BooleanField(default=False)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ], - options={ - 'abstract': False, - 'swappable': 'OAUTH2_PROVIDER_APPLICATION_MODEL', - }, - ), - migrations.CreateModel( - name='AccessToken', - fields=[ - ('id', models.BigAutoField(serialize=False, primary_key=True)), - ('token', models.CharField(unique=True, max_length=255)), - ('expires', models.DateTimeField()), - ('scope', models.TextField(blank=True)), - ('application', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=oauth2_settings.APPLICATION_MODEL)), - ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='oauth2_provider_accesstoken', to=settings.AUTH_USER_MODEL)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - # Circular reference. Can't add it here. - #('source_refresh_token', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=oauth2_settings.REFRESH_TOKEN_MODEL, related_name="refreshed_access_token")), - ], - options={ - 'abstract': False, - 'swappable': 'OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL', - }, - ), - migrations.CreateModel( - name='Grant', - fields=[ - ('id', models.BigAutoField(serialize=False, primary_key=True)), - ('code', models.CharField(unique=True, max_length=255)), - ('expires', models.DateTimeField()), - ('redirect_uri', models.CharField(max_length=255)), - ('scope', models.TextField(blank=True)), - ('application', models.ForeignKey(to=oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='oauth2_provider_grant', to=settings.AUTH_USER_MODEL)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ], - options={ - 'abstract': False, - 'swappable': 'OAUTH2_PROVIDER_GRANT_MODEL', - }, - ), - migrations.CreateModel( - name='RefreshToken', - fields=[ - ('id', models.BigAutoField(serialize=False, primary_key=True)), - ('token', models.CharField(max_length=255)), - ('access_token', models.OneToOneField(blank=True, null=True, related_name="refresh_token", to=oauth2_settings.ACCESS_TOKEN_MODEL, on_delete=models.SET_NULL)), - ('application', models.ForeignKey(to=oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='oauth2_provider_refreshtoken', to=settings.AUTH_USER_MODEL)), - ('created', models.DateTimeField(auto_now_add=True)), - ('updated', models.DateTimeField(auto_now=True)), - ('revoked', models.DateTimeField(null=True)), - ], - options={ - 'abstract': False, - 'swappable': 'OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL', - 'unique_together': set([("token", "revoked")]), - }, - ), - migrations.AddField( - model_name='AccessToken', - name='source_refresh_token', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=oauth2_settings.REFRESH_TOKEN_MODEL, related_name="refreshed_access_token"), - ), - ] - -``` - - -## Example 11 from django-push-notifications -[django-push-notifications](https://github.com/jazzband/django-push-notifications) -is a [Django](/django.html) app for storing and interacting with -push notification services such as -[Google's Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/) -and -[Apple Notifications](https://developer.apple.com/notifications/). -The django-push-notification project's source code is available -open source under the -[MIT license](https://github.com/jazzband/django-push-notifications/blob/master/LICENSE). - -[**django-push-notifications / push_notifications / migrations / 0001_initial.py**](https://github.com/jazzband/django-push-notifications/blob/master/push_notifications/migrations/0001_initial.py) - -```python -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models - -import push_notifications.fields - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='APNSDevice', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('name', models.CharField(max_length=255, null=True, verbose_name='Name', blank=True)), - ('active', models.BooleanField(default=True, help_text='Inactive devices will not be sent notifications', verbose_name='Is active')), - ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date', null=True)), - ('device_id', models.UUIDField(help_text='UDID / UIDevice.identifierForVendor()', max_length=32, null=True, verbose_name='Device ID', blank=True, db_index=True)), - ('registration_id', models.CharField(unique=True, max_length=64, verbose_name='Registration ID')), - ('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), - ], - options={ - 'verbose_name': 'APNS device', - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='GCMDevice', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('name', models.CharField(max_length=255, null=True, verbose_name='Name', blank=True)), - ('active', models.BooleanField(default=True, help_text='Inactive devices will not be sent notifications', verbose_name='Is active')), - ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Creation date', null=True)), - ('device_id', push_notifications.fields.HexIntegerField(help_text='ANDROID_ID / TelephonyManager.getDeviceId() (always as hex)', null=True, verbose_name='Device ID', blank=True, db_index=True)), - ('registration_id', models.TextField(verbose_name='Registration ID')), - ('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), - ], - options={ - 'verbose_name': 'GCM device', - }, - bases=(models.Model,), - ), - ] - -``` - - -## Example 12 from django-smithy +## Example 7 from django-smithy [django-smithy](https://github.com/jamiecounsell/django-smithy) is a [Django](/django.html) code library that allows users to send HTTP requests from the Django admin user interface. The code for @@ -1205,7 +656,7 @@ the project is open source under the ```python # Generated by Django 2.1.5 on 2019-03-17 17:14 -from django.db import migrations, models +~~from django.db import migrations, models import django.db.models.deletion import django.utils.timezone import model_utils.fields @@ -1228,7 +679,7 @@ class Migration(migrations.Migration): ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), ('name', models.CharField(max_length=200)), ('value', models.TextField()), - ('request', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='body_parameters', to='smithy.RequestBlueprint')), +~~ ('request', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='body_parameters', to='smithy.RequestBlueprint')), ], options={ 'abstract': False, @@ -1264,441 +715,7 @@ class Migration(migrations.Migration): ``` -## Example 13 from django-sql-explorer -[django-sql-explorer](https://github.com/groveco/django-sql-explorer) -([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), -also referred to as "SQL Explorer", -is a code library for the [Django](/django.html) Admin that allows -approved, authenticated users to view and execute direct database SQL -queries. The tool keeps track of executed queries so users can share them -with each other, as well as export results to downloadable formats. -django-sql-explorer is provided as open source under the -[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). - -[**django-sql-explorer / explorer / migrations / 0001_initial.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/migrations/0001_initial.py) - -```python -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations -import django.db.models.deletion -from django.conf import settings - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Query', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('title', models.CharField(max_length=255)), - ('sql', models.TextField()), - ('description', models.TextField(null=True, blank=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('last_run_date', models.DateTimeField(auto_now=True)), - ('created_by_user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), - ], - options={ - 'ordering': ['title'], - 'verbose_name_plural': 'Queries', - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='QueryLog', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('sql', models.TextField()), - ('is_playground', models.BooleanField(default=False)), - ('run_at', models.DateTimeField(auto_now_add=True)), - ('query', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='explorer.Query', null=True)), - ('run_by_user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), - ], - options={ - 'ordering': ['-run_at'], - }, - bases=(models.Model,), - ), - ] - -``` - - -## Example 14 from django-taggit -[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) -([source code](https://github.com/jazzband/django-debug-toolbar) and -[PyPI page](https://pypi.org/project/django-taggit/)) provides a way -to create, store, manage and use tags in a [Django](/django.html) project. -The code for django-taggit is -[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) -and maintained by the collaborative developer community group -[Jazzband](https://jazzband.co/). - -[**django-taggit / taggit / migrations / 0001_initial.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/migrations/0001_initial.py) - -```python -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("contenttypes", "0001_initial")] - - operations = [ - migrations.CreateModel( - name="Tag", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - help_text="", - verbose_name="ID", - ), - ), - ( - "name", - models.CharField( - help_text="", unique=True, max_length=100, verbose_name="Name" - ), - ), - ( - "slug", - models.SlugField( - help_text="", unique=True, max_length=100, verbose_name="Slug" - ), - ), - ], - options={"verbose_name": "Tag", "verbose_name_plural": "Tags"}, - bases=(models.Model,), - ), - migrations.CreateModel( - name="TaggedItem", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - help_text="", - verbose_name="ID", - ), - ), - ( - "object_id", - models.IntegerField( - help_text="", verbose_name="Object id", db_index=True - ), - ), - ( - "content_type", - models.ForeignKey( - related_name="taggit_taggeditem_tagged_items", - verbose_name="Content type", - to="contenttypes.ContentType", - help_text="", - on_delete=models.CASCADE, - ), - ), - ( - "tag", - models.ForeignKey( - related_name="taggit_taggeditem_items", - to="taggit.Tag", - help_text="", - on_delete=models.CASCADE, - ), - ), - ], - options={ - "verbose_name": "Tagged Item", - "verbose_name_plural": "Tagged Items", - }, - bases=(models.Model,), - ), - ] - -``` - - -## Example 15 from django-wiki -[django-wiki](https://github.com/django-wiki/django-wiki) -([project documentation](https://django-wiki.readthedocs.io/en/master/), -[demo](https://demo.django-wiki.org/), -and [PyPI page](https://pypi.org/project/django-wiki/)) -is a wiki system code library for [Django](/django.html) -projects that makes it easier to create user-editable content. -The project aims to provide necessary core features and then -have an easy plugin format for additional features, rather than -having every exhaustive feature built into the core system. -django-wiki is a rewrite of an earlier now-defunct project -named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). - -The code for django-wiki is provided as open source under the -[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). - -[**django-wiki / src/wiki / migrations / 0001_initial.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/migrations/0001_initial.py) - -```python -import django.db.models.deletion -import mptt.fields -from django.conf import settings -from django.db import migrations, models -from django.db.models.fields import GenericIPAddressField as IPAddressField -from wiki.conf.settings import GROUP_MODEL - - -class Migration(migrations.Migration): - - dependencies = [ - ('sites', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('contenttypes', '0001_initial'), - ('auth', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Article', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('created', models.DateTimeField(verbose_name='created', auto_now_add=True)), - ('modified', models.DateTimeField(verbose_name='modified', auto_now=True, help_text='Article properties last modified')), - ('group_read', models.BooleanField(default=True, verbose_name='group read access')), - ('group_write', models.BooleanField(default=True, verbose_name='group write access')), - ('other_read', models.BooleanField(default=True, verbose_name='others read access')), - ('other_write', models.BooleanField(default=True, verbose_name='others write access')), - ], - options={ - 'permissions': (('moderate', 'Can edit all articles and lock/unlock/restore'), ('assign', 'Can change ownership of any article'), ('grant', 'Can assign permissions to other users')), - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='ArticleForObject', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('object_id', models.PositiveIntegerField(verbose_name='object ID')), - ('is_mptt', models.BooleanField(default=False, editable=False)), - ('article', models.ForeignKey(to='wiki.Article', on_delete=models.CASCADE)), - ('content_type', models.ForeignKey(related_name='content_type_set_for_articleforobject', verbose_name='content type', to='contenttypes.ContentType', on_delete=models.CASCADE)), - ], - options={ - 'verbose_name_plural': 'Articles for object', - 'verbose_name': 'Article for object', - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='ArticlePlugin', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('deleted', models.BooleanField(default=False)), - ('created', models.DateTimeField(auto_now_add=True)), - ], - options={ - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='ArticleRevision', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), - ('user_message', models.TextField(blank=True)), - ('automatic_log', models.TextField(blank=True, editable=False)), - ('ip_address', IPAddressField(null=True, verbose_name='IP address', blank=True, editable=False)), - ('modified', models.DateTimeField(auto_now=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('deleted', models.BooleanField(default=False, verbose_name='deleted')), - ('locked', models.BooleanField(default=False, verbose_name='locked')), - ('content', models.TextField(blank=True, verbose_name='article contents')), - ('title', models.CharField(max_length=512, verbose_name='article title', help_text='Each revision contains a title field that must be filled out, even if the title has not changed')), - ('article', models.ForeignKey(to='wiki.Article', verbose_name='article', on_delete=models.CASCADE)), - ('previous_revision', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wiki.ArticleRevision')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='user')), - ], - options={ - 'get_latest_by': 'revision_number', - 'ordering': ('created',), - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='ReusablePlugin', - fields=[ - ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), - ('articles', models.ManyToManyField(related_name='shared_plugins_set', to='wiki.Article')), - ], - options={ - }, - bases=('wiki.articleplugin',), - ), - migrations.CreateModel( - name='RevisionPlugin', - fields=[ - ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), - ], - options={ - }, - bases=('wiki.articleplugin',), - ), - migrations.CreateModel( - name='RevisionPluginRevision', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), - ('user_message', models.TextField(blank=True)), - ('automatic_log', models.TextField(blank=True, editable=False)), - ('ip_address', IPAddressField(null=True, verbose_name='IP address', blank=True, editable=False)), - ('modified', models.DateTimeField(auto_now=True)), - ('created', models.DateTimeField(auto_now_add=True)), - ('deleted', models.BooleanField(default=False, verbose_name='deleted')), - ('locked', models.BooleanField(default=False, verbose_name='locked')), - ('plugin', models.ForeignKey(related_name='revision_set', to='wiki.RevisionPlugin', on_delete=models.CASCADE)), - ('previous_revision', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wiki.RevisionPluginRevision')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='user')), - ], - options={ - 'get_latest_by': 'revision_number', - 'ordering': ('-created',), - }, - bases=(models.Model,), - ), - migrations.CreateModel( - name='SimplePlugin', - fields=[ - ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), - ('article_revision', models.ForeignKey(to='wiki.ArticleRevision', on_delete=models.CASCADE)), - ], - options={ - }, - bases=('wiki.articleplugin',), - ), - migrations.CreateModel( - name='URLPath', - fields=[ - ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), - ('slug', models.SlugField(null=True, blank=True, verbose_name='slug')), - ('lft', models.PositiveIntegerField(db_index=True, editable=False)), - ('rght', models.PositiveIntegerField(db_index=True, editable=False)), - ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), - ('level', models.PositiveIntegerField(db_index=True, editable=False)), - ('article', models.ForeignKey(help_text='This field is automatically updated, but you need to populate it when creating a new URL path.', on_delete=django.db.models.deletion.CASCADE, to='wiki.Article', verbose_name='article')), - ('parent', mptt.fields.TreeForeignKey(blank=True, help_text='Position of URL path in the tree.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='wiki.URLPath')), - ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site')), - ], - options={ - 'verbose_name_plural': 'URL paths', - 'verbose_name': 'URL path', - }, - bases=(models.Model,), - ), - migrations.AlterUniqueTogether( - name='urlpath', - unique_together=set([('site', 'parent', 'slug')]), - ), - migrations.AddField( - model_name='revisionplugin', - name='current_revision', - field=models.OneToOneField(related_name='plugin_set', null=True, help_text='The revision being displayed for this plugin. If you need to do a roll-back, simply change the value of this field.', blank=True, to='wiki.RevisionPluginRevision', verbose_name='current revision', on_delete=models.CASCADE), - preserve_default=True, - ), - migrations.AlterUniqueTogether( - name='articlerevision', - unique_together=set([('article', 'revision_number')]), - ), - migrations.AddField( - model_name='articleplugin', - name='article', - field=models.ForeignKey(to='wiki.Article', verbose_name='article', on_delete=models.CASCADE), - preserve_default=True, - ), - migrations.AlterUniqueTogether( - name='articleforobject', - unique_together=set([('content_type', 'object_id')]), - ), - migrations.AddField( - model_name='article', - name='current_revision', - field=models.OneToOneField(related_name='current_set', null=True, help_text='The revision being displayed for this article. If you need to do a roll-back, simply change the value of this field.', blank=True, to='wiki.ArticleRevision', verbose_name='current revision', on_delete=models.CASCADE), - preserve_default=True, - ), - migrations.AddField( - model_name='article', - name='group', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, help_text='Like in a UNIX file system, permissions can be given to a user according to group membership. Groups are handled through the Django auth system.', blank=True, to=GROUP_MODEL, verbose_name='group'), - preserve_default=True, - ), - migrations.AddField( - model_name='article', - name='owner', - field=models.ForeignKey(related_name='owned_articles', null=True, on_delete=django.db.models.deletion.SET_NULL, help_text='The owner of the article, usually the creator. The owner always has both read and write access.', blank=True, to=settings.AUTH_USER_MODEL, verbose_name='owner'), - preserve_default=True, - ), - ] - -``` - - -## Example 16 from dmd-interpreter -[dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) -([running web app](http://www.dmd.nl/DOVE)) -is a Python tool to aggregate clinically relevant information related -to variants in the DMD gene and display that [data](/data.html) to a user -with a [Django](/django.html) web application. - -[**dmd-interpreter / interpreter / migrations / 0001_initial.py**](https://github.com/mitchalexbailey/dmd-interpreter/blob/master/interpreter/migrations/0001_initial.py) - -```python -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Choice', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('choice_text', models.CharField(max_length=200)), - ('votes', models.IntegerField(default=0)), - ], - ), - migrations.CreateModel( - name='Question', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('question_text', models.CharField(max_length=200)), - ('pub_date', models.DateTimeField(verbose_name=b'Date Published')), - ], - ), - migrations.AddField( - model_name='choice', - name='question', - field=models.ForeignKey(to='interpreter.Question'), - ), - ] - -``` - - -## Example 17 from gadget-board +## Example 8 from gadget-board [gadget-board](https://github.com/mik4el/gadget-board) is a [Django](/django.html), [Django REST Framework (DRF)](/django-rest-framework-drf.html) and @@ -1708,7 +725,8 @@ class Migration(migrations.Migration): [**gadget-board / web / gadgets / models.py**](https://github.com/mik4el/gadget-board/blob/master/web/gadgets/models.py) ```python -from django.db import models +# models.py +~~from django.db import models from django.contrib.postgres.fields import JSONField from django.template.defaultfilters import slugify from authentication.models import Account @@ -1741,14 +759,14 @@ class Gadget(models.Model): class GadgetData(models.Model): - gadget = models.ForeignKey(Gadget, db_index=True, on_delete=models.DO_NOTHING) # Add index on filtered fields +~~ gadget = models.ForeignKey(Gadget, db_index=True, on_delete=models.DO_NOTHING) # Add index on filtered fields data = JSONField() - added_by = models.ForeignKey(Account, on_delete=models.DO_NOTHING) +~~ added_by = models.ForeignKey(Account, on_delete=models.DO_NOTHING) timestamp = models.DateTimeField(null=True, blank=True, db_index=True) # Add index on filtered fields created_at = models.DateTimeField(auto_now_add=True) - def __str__(self): - return '{} {} {}'.format(self.gadget, self.timestamp, self.added_by) +~~ def __str__(self): +~~ return '{} {} {}'.format(self.gadget, self.timestamp, self.added_by) ``` From 1293dbac548be2ca7d88fcecfd98a82b101ba49a Mon Sep 17 00:00:00 2001 From: Samuel Huang Date: Wed, 11 Dec 2019 09:08:10 -0800 Subject: [PATCH 021/302] Update requests versioning --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9772046c8..1316c2624 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,5 +2,5 @@ boto3==1.4.4 bs4==0.0.1 Markdown==2.6.10 Pelican==3.6.3 -requests==2.20.0 +requests==2.22.0 urllib3==1.25.3 From eeab4c3ba9ef48c93e361347cbde421c86bac10d Mon Sep 17 00:00:00 2001 From: Samuel Huang Date: Wed, 11 Dec 2019 09:10:04 -0800 Subject: [PATCH 022/302] Remove bad links as of 2019-12-11 --- .../09-best-python-videos.markdown | 3 +- .../10-best-python-podcasts.markdown | 5 --- .../04-sublime-text.markdown | 4 -- content/pages/03-data/03-mysql.markdown | 4 -- .../01-web-frameworks.markdown | 7 ---- .../04-web-development/03-flask.markdown | 6 --- .../04-web-development/04-bottle.markdown | 3 -- .../04-web-development/08-morepath.markdown | 5 --- .../31-static-site-generator.markdown | 6 --- .../04-web-development/35-testing.markdown | 2 +- .../37-integration-testing.markdown | 2 +- .../04-web-development/42-websockets.markdown | 3 -- .../48-api-creation.markdown | 6 +-- .../51-api-integration.markdown | 3 -- .../04-web-development/53-stripe.markdown | 4 -- content/pages/05-deployment/04-cdns.markdown | 11 ++---- .../pages/05-deployment/14-ubuntu.markdown | 5 --- content/pages/05-deployment/20-caddy.markdown | 5 --- .../27-continuous-integration.markdown | 4 -- .../pages/05-deployment/36-docker.markdown | 4 -- .../pages/06-devops/01-monitoring.markdown | 2 +- .../06-devops/06-web-app-performance.markdown | 3 -- .../pages/06-devops/18-web-analytics.markdown | 3 -- .../django-conf-settings-examples.markdown | 2 +- ...jango-contrib-admin-site-register.markdown | 39 ------------------- ...django-dispatch-dispatcher-signal.markdown | 2 +- .../django/django-http-httpresponse.markdown | 2 +- .../170227-choose-devops-tools-talk.markdown | 4 +- ...171009-pycon-python-bytes-pelican.markdown | 1 - 29 files changed, 14 insertions(+), 136 deletions(-) diff --git a/content/pages/01-introduction/09-best-python-videos.markdown b/content/pages/01-introduction/09-best-python-videos.markdown index 1d75815a3..b265bc34b 100644 --- a/content/pages/01-introduction/09-best-python-videos.markdown +++ b/content/pages/01-introduction/09-best-python-videos.markdown @@ -82,8 +82,7 @@ topics of using [web frameworks](/web-frameworks.html) like [2017](https://www.youtube.com/playlist?list=PL2NFhrDSOxgXmA215-fo02djziShwLa6T), [2016](https://www.youtube.com/playlist?list=PL2NFhrDSOxgX-A4qpaf3rRaEnEe7166Ac), [2015](https://www.youtube.com/playlist?list=PL2NFhrDSOxgWvzf40lYJ8gohFciQqRx3K), - [2014](https://www.youtube.com/playlist?list=PLE7tQUdRKcybbNiuhLcc3h6WzmZGVBMr3), - [2013](http://www.youtube.com/user/TheOpenBastion/videos), are all available + [2014](https://www.youtube.com/playlist?list=PLE7tQUdRKcybbNiuhLcc3h6WzmZGVBMr3), are all available free of charge. * DjangoCon EU videos are also available from diff --git a/content/pages/01-introduction/10-best-python-podcasts.markdown b/content/pages/01-introduction/10-best-python-podcasts.markdown index c4a1f263e..b52a474a5 100644 --- a/content/pages/01-introduction/10-best-python-podcasts.markdown +++ b/content/pages/01-introduction/10-best-python-podcasts.markdown @@ -48,11 +48,6 @@ listen and learn. Python subjects. [All episodes are listed on a separate page](http://pgbovine.net/PG-Podcast-summary.htm). -* [Import This](https://www.kennethreitz.org/import-this/) is an occasional - podcast from [Kenneth Reitz](https://github.com/kennethreitz) and - [Alex Gaynor](https://github.com/alex) with very in-depth interviews with - influential [Python community](/python-community.html) members. - ## Favorite podcast episodes Here are a list of my favorite episodes from various Python podcasts before diff --git a/content/pages/02-development-environments/04-sublime-text.markdown b/content/pages/02-development-environments/04-sublime-text.markdown index 61ae79b66..841687737 100644 --- a/content/pages/02-development-environments/04-sublime-text.markdown +++ b/content/pages/02-development-environments/04-sublime-text.markdown @@ -136,10 +136,6 @@ you will want to take a look at adding to your installation. ["Hello, world!"-level example](http://www.sublimetext.com/docs/plugin-examples) that you can extend. -* The unofficial - [Sublime documentation's section on plugins](http://docs.sublimetext.info/en/latest/extensibility/plugins.html) - contains the steps to use plugins and how to write your first plugin. - * [Sublime Text plugin development basics](http://engineering.vinted.com/2016/06/27/how-to-write-sublime-plugin/) has some good advice and further resources. diff --git a/content/pages/03-data/03-mysql.markdown b/content/pages/03-data/03-mysql.markdown index b248bb6ef..87edda6a3 100644 --- a/content/pages/03-data/03-mysql.markdown +++ b/content/pages/03-data/03-mysql.markdown @@ -111,10 +111,6 @@ like [SQLAlchemy](/sqlalchemy.html) or the [Django ORM](/django-orm.html). MySQLdb driver to connect to a MySQL server instance and shows some examples for inserting and querying data. -* [Graph Data From MySQL Database in Python](http://moderndata.plot.ly/graph-data-from-mysql-database-in-python/) - is an interesting study with code of how to pull data out of MySQL and graph - the data with Plotly. - ### General MySQL resources There are many programming language agnostic tutorials for MySQL. diff --git a/content/pages/04-web-development/01-web-frameworks.markdown b/content/pages/04-web-development/01-web-frameworks.markdown index 50586d065..6b52e3680 100644 --- a/content/pages/04-web-development/01-web-frameworks.markdown +++ b/content/pages/04-web-development/01-web-frameworks.markdown @@ -177,13 +177,6 @@ frameworks, templating engines and The votes aren't as important as the list of the many frameworks that are available to Python developers. -* [Not Your Father’s Python: Amazing Powerful Frameworks](https://blog.signifai.io/not-your-fathers-python-amazing-powerful-frameworks/) - covers the rise of web frameworks, such as [Sanic](/sanic.html), that - are built on Python's - [asyncio](https://docs.python.org/3/library/asyncio.html) - functionality that was built into the standard library starting with - Python 3.4. - * [Django vs. Flask in 2019: Which Framework to Choose](https://testdriven.io/blog/django-vs-flask/) looks at the best use cases for Django and Flask along with what makes them unique, from an educational and development standpoint. diff --git a/content/pages/04-web-development/03-flask.markdown b/content/pages/04-web-development/03-flask.markdown index 6fc74396d..29bc0212a 100644 --- a/content/pages/04-web-development/03-flask.markdown +++ b/content/pages/04-web-development/03-flask.markdown @@ -236,12 +236,6 @@ combined with the example real-world projects listed in the next section. [application dependencies](/application-dependencies.html) and handle your [deployment](/deployment.html) workflow. -* [How to use Flask to upload files to Amazon S3](http://zabana.me/notes/upload-files-amazon-s3-flask.html) - provides all the code with detailed explanations on how to store files - using [boto](https://boto3.readthedocs.io/en/latest/) and - [Amazon Web Services' S3](https://aws.amazon.com/s3/) with a Flask - application. - * [Visualize your trip with Flask and Mapbox](http://kazuar.github.io/visualize-trip-with-flask-and-mapbox/) uses geographic GeoJSON data and presents it in a Flask application that uses [Mapbox](https://www.mapbox.com/). diff --git a/content/pages/04-web-development/04-bottle.markdown b/content/pages/04-web-development/04-bottle.markdown index 5150a96e0..1f40db51c 100644 --- a/content/pages/04-web-development/04-bottle.markdown +++ b/content/pages/04-web-development/04-bottle.markdown @@ -97,9 +97,6 @@ steps to more easily get your web application up and running. * Here's a short code snippet for [creating a RESTful API with Bottle and MongoDB](http://myadventuresincoding.wordpress.com/2011/01/02/creating-a-rest-api-in-python-using-bottle-and-mongodb/). -* This [tutorial](http://gotofritz.net/blog/weekly-challenge/restful-python-api-bottle/) - is another Bottle walkthrough for creating a RESTful web API. - * [Bottle, full stack without Django](http://www.avelino.xxx/2014/12/bottle-full-stack-without-django) does a nice job of connecting SQLAlchemy with Bottle and building an example application using the framework. diff --git a/content/pages/04-web-development/08-morepath.markdown b/content/pages/04-web-development/08-morepath.markdown index 3692287e8..ef36ae2a0 100644 --- a/content/pages/04-web-development/08-morepath.markdown +++ b/content/pages/04-web-development/08-morepath.markdown @@ -46,11 +46,6 @@ these resources below are a good place to get started. is a blog post by Startifact on how they use Morepath and some of the features of the framework. -* [A Summer with Morepath](http://blog.stacktrace.ch/post/132538261985) - describes the author's experience using Morepath, such as how he built - a framework around Morepath's core functionality. He eventually became - a core contributor to Morepath based on the application he created. - * [Build a better batching UI with Morepath and Jinja2](http://blog.startifact.com/posts/morepath-batching-example.html) is an introductory post on building a simple web application with the framework. The code for the application is also diff --git a/content/pages/04-web-development/31-static-site-generator.markdown b/content/pages/04-web-development/31-static-site-generator.markdown index 4e35ed9f1..7b07bc047 100644 --- a/content/pages/04-web-development/31-static-site-generator.markdown +++ b/content/pages/04-web-development/31-static-site-generator.markdown @@ -206,12 +206,6 @@ point a domain name to your site as well as provide HTTPS support. These guides walk through various ways of handling the static site deployment. -* Randall Degges' - [Ultimate Guide to Deploying Static Sites to Amazon Web Services](https://stormpath.com/blog/ultimate-guide-deploying-static-site-aws) - walks through all the steps you need to get your site up and running on - S3. The guide also shows how to set up SSL certificates to ensure - your site can be loaded via HTTPS. - * [Static site hosting with S3 and Cloudflare](https://wsvincent.com/static-site-hosting-with-s3-and-cloudflare/) shows how to set up an S3 bucket with Cloudflare in front as a CDN that serves the content with HTTPS. You should be able to accomplish roughly diff --git a/content/pages/04-web-development/35-testing.markdown b/content/pages/04-web-development/35-testing.markdown index 550ba494c..6822ef184 100644 --- a/content/pages/04-web-development/35-testing.markdown +++ b/content/pages/04-web-development/35-testing.markdown @@ -106,7 +106,7 @@ test runners, coverage reports and related libraries. and goes through a bunch of code samples for common situations. * [Using pytest with Django](http://engineroom.trackmaven.com/blog/using-pytest-with-django/) - shows how to get a basic [pytest](http://pytest.org/latest/) test + shows how to get a basic [pytest](https://docs.pytest.org/en/latest/) test running for a Django project and explains why the author prefers pytest over standard unittest testing. diff --git a/content/pages/04-web-development/37-integration-testing.markdown b/content/pages/04-web-development/37-integration-testing.markdown index 66bbc68d0..72d844b82 100644 --- a/content/pages/04-web-development/37-integration-testing.markdown +++ b/content/pages/04-web-development/37-integration-testing.markdown @@ -36,7 +36,7 @@ during development so they can be addressed immediately. gives an example of a system that needs integration tests and shows how context managers can be used to address the problem. -* Pytest has a page on [integration good practices](https://pytest.org/latest/goodpractices.html) +* Pytest has a page on [integration good practices](http://doc.pytest.org/en/latest/goodpractices.html) that you'll likely want to follow when testing your application. * [Integration testing, or how to sleep well at night](http://enterprisecraftsmanship.com/2015/07/13/integration-testing-or-how-to-sleep-well-at-nights/) diff --git a/content/pages/04-web-development/42-websockets.markdown b/content/pages/04-web-development/42-websockets.markdown index e497c258f..3125b4f5c 100644 --- a/content/pages/04-web-development/42-websockets.markdown +++ b/content/pages/04-web-development/42-websockets.markdown @@ -116,9 +116,6 @@ properly. * Nginx has [an official page for WebSocket proxying](http://nginx.org/en/docs/http/websocket.html). -* [WebSockets in Nginx](http://blog.martinfjordvald.com/2013/02/websockets-in-nginx/) - walks through the Nginx WebSockets configuration directives. - * [Proxying WebSockets with Nginx](https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/) shows how to proxy with Socket.io. diff --git a/content/pages/04-web-development/48-api-creation.markdown b/content/pages/04-web-development/48-api-creation.markdown index f36d9f701..d4fd9d0f3 100644 --- a/content/pages/04-web-development/48-api-creation.markdown +++ b/content/pages/04-web-development/48-api-creation.markdown @@ -21,9 +21,9 @@ applications through machine-to-machine communication. [successful Kickstarter campaign](https://www.kickstarter.com/projects/tomchristie/django-rest-framework-3). * [Flask-RESTful](http://flask-restful.readthedocs.org/en/latest/) is - widely used for creating web APIs with Flask. It was originally - [open sourced and explained in a blog post by Twilio](https://www.twilio.com/engineering/2012/10/18/open-sourcing-flask-restful) - then moved into its + widely used for creating web APIs with Flask. It was originally + open sourced by Twilio + then moved into its [own GitHub organization](https://github.com/flask-restful/flask-restful) so engineers from outside the company could be core contributors. diff --git a/content/pages/04-web-development/51-api-integration.markdown b/content/pages/04-web-development/51-api-integration.markdown index 6ef23437e..0477bb86b 100644 --- a/content/pages/04-web-development/51-api-integration.markdown +++ b/content/pages/04-web-development/51-api-integration.markdown @@ -48,9 +48,6 @@ across many implementation areas. [18F's API-All-the-X list](http://18f.github.io/API-All-the-X/). The list is updated whenever a new API comes online. -* If you use Requests check out this handy guide on gracefully - [handling HTTP errors with Python](http://www.mobify.com/blog/http-requests-are-hard/). - * John Sheehan's "[Zen and the Art of API Maintenance](https://speakerdeck.com/johnsheehan/zen-and-the-art-of-api-maintenance)" slides are relevant for API integration. diff --git a/content/pages/04-web-development/53-stripe.markdown b/content/pages/04-web-development/53-stripe.markdown index 137931937..85cf9eac0 100644 --- a/content/pages/04-web-development/53-stripe.markdown +++ b/content/pages/04-web-development/53-stripe.markdown @@ -38,10 +38,6 @@ for processing payments. ### Resources about Stripe -* [How Stripe Designs Beautiful Websites](https://www.leejamesrobinson.com/blog/how-stripe-designs-beautiful-websites/) - explains the process for how Stripe creates their gorgeous design that - makes people want to use the service and explore what else they can - build with it. * [Creating a Culture of Observability](http://onemogin.com/observability/stripe/culture/monitoring/monitorama/creating-a-culture-of-observability.html) is a technical talk about monitoring systems at scale. The presenter works diff --git a/content/pages/05-deployment/04-cdns.markdown b/content/pages/05-deployment/04-cdns.markdown index 204202428..027f064d6 100644 --- a/content/pages/05-deployment/04-cdns.markdown +++ b/content/pages/05-deployment/04-cdns.markdown @@ -18,7 +18,9 @@ servers to improve web app loading speed. * [MaxCDN vs CloudFlare vs Amazon CloudFront vs Akamai Edge vs Fastly](https://www.codeinwp.com/blog/maxcdn-vs-cloudflare-vs-cloudfront-vs-akamai-edge-vs-fastly/) compares and contrasts the most popular CDN services based on features, - performance and pricing. + performance and pricing. Note + that [Full Stack Python](https://www.fullstackpython.com/) uses Cloudflare + to serve all content. * [Crushing, caching and CDN deployment in Django](https://tech.marksblogg.com/crushing-caching-cdn-django.html) explains how to use the @@ -35,10 +37,3 @@ servers to improve web app loading speed. describes the security implications for CDNs with unexpectedly modified content and how Subresource Integrity in modern web browsers can mitigate this vulnerability if used properly. - -* [Put yourself on internet with Jekyll, GitHub and Cloudflare](https://adgllorente.com/2016/09/put-yourself-on-internet-with-jekyll-github-and-cloudflare/) - is not a Python-specific post but it gives language agnostic instructions - you can use for Python web applications that want to use - [Cloudflare](https://www.cloudflare.com/) as a CDN for static assets. Note - that [Full Stack Python](https://www.fullstackpython.com/) uses Cloudflare - to serve all content. diff --git a/content/pages/05-deployment/14-ubuntu.markdown b/content/pages/05-deployment/14-ubuntu.markdown index d8ef782ce..e3363f144 100644 --- a/content/pages/05-deployment/14-ubuntu.markdown +++ b/content/pages/05-deployment/14-ubuntu.markdown @@ -66,11 +66,6 @@ repository system packages. is described in this article about how [Ubuntu 16.04 proves even an LTS release can live at Linux's bleeding edge](http://arstechnica.com/information-technology/2016/05/ubuntu-16-04-proves-even-an-lts-release-can-live-at-linuxs-bleeding-edge/). -* [My First 10 Minutes On a Server - Primer for Securing Ubuntu](http://www.codelitt.com/blog/my-first-10-minutes-on-a-server-primer-for-securing-ubuntu/) - is based off an earlier post of the first five minutes on a Linux server. - This one is specific to Ubuntu Linux and goes into user accounts, sudo - privileges, SSH keys, security updates and 2-factor authentication. - * [What I learned while securing Ubuntu](https://major.io/2015/10/14/what-i-learned-while-securing-ubuntu/) explains how difficult it can be just to find correct information on how to secure an operating system. In this case, the author goes over diff --git a/content/pages/05-deployment/20-caddy.markdown b/content/pages/05-deployment/20-caddy.markdown index 8eff9031f..1b27e6d11 100644 --- a/content/pages/05-deployment/20-caddy.markdown +++ b/content/pages/05-deployment/20-caddy.markdown @@ -37,9 +37,4 @@ the [proxy directive](https://caddyserver.com/docs/proxy). shows how to use a self-signed certificate with Caddy to do local development with an HTTP/2 web server. -* [Is Caddy free?](https://caddyserver.com/blog/is-caddy-free) explains - the donation and sponsorships model that Caddy uses to continue development - on the server. The gist is that the server is free to clone, download and - use. Sponsors and optional donations are currently used to fund ongoing - development. diff --git a/content/pages/05-deployment/27-continuous-integration.markdown b/content/pages/05-deployment/27-continuous-integration.markdown index 2c93e2f56..835f5589a 100644 --- a/content/pages/05-deployment/27-continuous-integration.markdown +++ b/content/pages/05-deployment/27-continuous-integration.markdown @@ -127,10 +127,6 @@ programming language agnostic. Learn more via the following resources or on uses well done drawings to show how continuous integration and delivery works for testing and managing data. -* [Diving into continuous integration as a newbie](http://www.rackspace.com/blog/diving-into-continuous-integration-as-a-newbie/) - is a retrospective on learning CI from a Rackspace intern on how she learned - the subject. - * [The real difference between CI and CD](https://fire.ci/blog/the-difference-between-ci-and-cd/) explains what advantages CI provides, what constraints it operates under (such as total build time) to work well, and how that is different from diff --git a/content/pages/05-deployment/36-docker.markdown b/content/pages/05-deployment/36-docker.markdown index 758e74d1a..95f191d82 100644 --- a/content/pages/05-deployment/36-docker.markdown +++ b/content/pages/05-deployment/36-docker.markdown @@ -79,10 +79,6 @@ on Amazon Web Services, Google Compute Engine, Linode, Rackspace or elsewhere. is an explanation of the concepts and philosophy by the authors of the new Manning Docker book in early access format. -* [Eight Docker Development Patterns](http://www.hokstad.com/docker/patterns) - shares lessons learned and explains how to work with the containers so you - get more use out of them during development. - * [Building Docker containers from scratch](http://datakurre.pandala.org/2015/07/building-docker-containers-from-scratch.html) is a short tutorial for creating a Docker container with a specific configuration. diff --git a/content/pages/06-devops/01-monitoring.markdown b/content/pages/06-devops/01-monitoring.markdown index ba21424b4..95efe2cf4 100644 --- a/content/pages/06-devops/01-monitoring.markdown +++ b/content/pages/06-devops/01-monitoring.markdown @@ -86,7 +86,7 @@ application is read-heavy, write-heavy, or subject to rapid swings in traffic. be analyzed and visualized. Note this project is written in Perl so Perl 5 must be installed on the node collecting the data. -* [Bucky](http://github.hubspot.com/bucky/) measures the performance of a +* [Bucky](https://github.com/HubSpot/BuckyClient) measures the performance of a web application from end user's browsers and sends that data back to the server for collection. diff --git a/content/pages/06-devops/06-web-app-performance.markdown b/content/pages/06-devops/06-web-app-performance.markdown index ec1528a6e..c2224206d 100644 --- a/content/pages/06-devops/06-web-app-performance.markdown +++ b/content/pages/06-devops/06-web-app-performance.markdown @@ -32,9 +32,6 @@ database queries, page size and many other factors. ### Web app performance resources -* [A Primer in Web Performance](https://kiboit.com/performance) is a quick, - straightforward one pager on why the topic matters and what causes bad - website performance. * [Web Performance 101](https://3perf.com/talks/web-perf-101/) introduces web application loading performance. There is a ton of great information diff --git a/content/pages/06-devops/18-web-analytics.markdown b/content/pages/06-devops/18-web-analytics.markdown index d14b5bccc..c51330f04 100644 --- a/content/pages/06-devops/18-web-analytics.markdown +++ b/content/pages/06-devops/18-web-analytics.markdown @@ -104,9 +104,6 @@ application before taking some action, such as purchasing your service. of what Google Analytics can tell you about your site and how to configure it for better output. -* [Deconstructing the Google Analytics tracking script](https://billfranklin.svbtle.com/deconstructing-the-ga-script) - breaks down the JavaScript found in the Google Analytics script. - * [Roll your own analytics](https://www.pcmaffey.com/roll-your-own-analytics/) shows you how to use [AWS Lambda](/aws-lambda.html) and some custom JavaScript to create your own replacement for Google Analytics. This route diff --git a/content/pages/examples/django/django-conf-settings-examples.markdown b/content/pages/examples/django/django-conf-settings-examples.markdown index 6d89738ad..39309d5e6 100644 --- a/content/pages/examples/django/django-conf-settings-examples.markdown +++ b/content/pages/examples/django/django-conf-settings-examples.markdown @@ -409,7 +409,7 @@ library for enabling handling in your [Django](/django.html) web applications and appropriately dealing with HTTP headers for CORS requests. -[**django-cors-headers / corsheaders / conf.py**](https://github.com/ottoyiu/django-cors-headers/blob/master/corsheaders/conf.py) +[**django-cors-headers / src / corsheaders / conf.py**](https://github.com/ottoyiu/django-cors-headers/blob/master/src/corsheaders/conf.py) ```python ~~from django.conf import settings diff --git a/content/pages/examples/django/django-contrib-admin-site-register.markdown b/content/pages/examples/django/django-contrib-admin-site-register.markdown index cde0da482..c7dd01df0 100644 --- a/content/pages/examples/django/django-contrib-admin-site-register.markdown +++ b/content/pages/examples/django/django-contrib-admin-site-register.markdown @@ -336,42 +336,3 @@ Image = load_model(FILER_IMAGE_MODEL) ~~admin.site.register(FolderPermission, PermissionAdmin) ~~admin.site.register(ThumbnailOption, ThumbnailOptionAdmin) ``` - - -## Example 5 from wagtail -[wagtail](https://github.com/wagtail/wagtail) -([project website](https://wagtail.io/)) is a fantastic -[Django](/django.html)-based CMS with code that is open source -under the -[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). - -[**wagtail / wagtail / core / admin.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/admin.py) - -```python -~~from django.contrib import admin -from django.contrib.auth.admin import GroupAdmin -from django.contrib.auth.models import Group - -from wagtail.core.models import GroupPagePermission, Page, Site - -~~admin.site.register(Site) -~~admin.site.register(Page) - - -# Extend GroupAdmin to include page permissions as an inline -class GroupPagePermissionInline(admin.TabularInline): - model = GroupPagePermission - raw_id_fields = ['page'] - verbose_name = 'page permission' - verbose_name_plural = 'page permissions' - - -class GroupAdminWithPagePermissions(GroupAdmin): - inlines = GroupAdmin.inlines + [GroupPagePermissionInline] - - -~~if admin.site.is_registered(Group): -~~ admin.site.unregister(Group) -~~admin.site.register(Group, GroupAdminWithPagePermissions) -``` - diff --git a/content/pages/examples/django/django-dispatch-dispatcher-signal.markdown b/content/pages/examples/django/django-dispatch-dispatcher-signal.markdown index 00b62d5cf..300e87f4b 100644 --- a/content/pages/examples/django/django-dispatch-dispatcher-signal.markdown +++ b/content/pages/examples/django/django-dispatch-dispatcher-signal.markdown @@ -174,7 +174,7 @@ library for enabling handling in your [Django](/django.html) web applications and appropriately dealing with HTTP headers for CORS requests. -[**django-cors-headers / corsheaders / signals.py**](https://github.com/ottoyiu/django-cors-headers/blob/master/corsheaders/signals.py) +[**django-cors-headers / src / corsheaders / signals.py**](https://github.com/adamchainz/django-cors-headers/blob/master/src/corsheaders/signals.py) ```python ~~from django.dispatch import Signal diff --git a/content/pages/examples/django/django-http-httpresponse.markdown b/content/pages/examples/django/django-http-httpresponse.markdown index bc936f3a8..bb9d14ac8 100644 --- a/content/pages/examples/django/django-http-httpresponse.markdown +++ b/content/pages/examples/django/django-http-httpresponse.markdown @@ -136,7 +136,7 @@ class MiddlewareTest(TestCase): system built with [Django](/django.html). The code is open source under the [MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). -[**dccnsys / wwwdccn / chair / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair/views.py) +[**dccnsys / wwwdccn / chair / views**](https://github.com/dccnconf/dccnsys/tree/master/wwwdccn/chair/views) ```python import csv diff --git a/content/posts/170227-choose-devops-tools-talk.markdown b/content/posts/170227-choose-devops-tools-talk.markdown index d056bfb48..0beaedebb 100644 --- a/content/posts/170227-choose-devops-tools-talk.markdown +++ b/content/posts/170227-choose-devops-tools-talk.markdown @@ -10,9 +10,7 @@ headeralt: Comment bubble with code representing a technical talk-based blog pos This blog post contains a loose transcript along with the slides and -additional resources from my technical talk that will be given at -[Oracle Code SF 2017](https://developer.oracle.com/code/sanfrancisco) -and [DC Continuous Delivery](https://www.meetup.com/DC-continuous-delivery/) +additional resources from my technical talk that will be given at [DC Continuous Delivery](https://www.meetup.com/DC-continuous-delivery/) within the next couple of months. Additional resources to learn more about [deployments](/deployments.html), diff --git a/content/posts/171009-pycon-python-bytes-pelican.markdown b/content/posts/171009-pycon-python-bytes-pelican.markdown index a0577e29f..4a1859b8c 100644 --- a/content/posts/171009-pycon-python-bytes-pelican.markdown +++ b/content/posts/171009-pycon-python-bytes-pelican.markdown @@ -55,7 +55,6 @@ yourself: 1. [How to Create Your First Static Site with Pelican and Jinja2](/blog/generating-static-websites-pelican-jinja2-markdown.html) 1. [An overview of the Pelican static site generator](/pelican.html) -1. [The Ultimate Guide to Deploying Static Sites on AWS](https://stormpath.com/blog/ultimate-guide-deploying-static-site-aws) One last bit: [Python for Entrepreneurs](https://training.talkpython.fm/courses/explore_entrepreneurs/python-for-entrepreneurs-build-and-launch-your-online-business) From 6662b0dff6afb3fd64afb99a05a29712a4b94ce0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 12 Dec 2019 09:16:21 -0500 Subject: [PATCH 023/302] clearing broken links --- .../pages/01-introduction/10-best-python-podcasts.markdown | 5 ----- content/pages/03-data/18-data-visualization.markdown | 3 --- content/pages/04-web-development/04-bottle.markdown | 3 --- content/pages/04-web-development/24-react.markdown | 4 ---- content/pages/04-web-development/35-testing.markdown | 6 +++--- content/pages/04-web-development/48-api-creation.markdown | 3 +-- content/pages/04-web-development/53-stripe.markdown | 2 +- content/pages/05-deployment/14-ubuntu.markdown | 5 ----- .../pages/05-deployment/27-continuous-integration.markdown | 4 ---- content/pages/05-deployment/36-docker.markdown | 4 ---- 10 files changed, 5 insertions(+), 34 deletions(-) diff --git a/content/pages/01-introduction/10-best-python-podcasts.markdown b/content/pages/01-introduction/10-best-python-podcasts.markdown index c4a1f263e..b52a474a5 100644 --- a/content/pages/01-introduction/10-best-python-podcasts.markdown +++ b/content/pages/01-introduction/10-best-python-podcasts.markdown @@ -48,11 +48,6 @@ listen and learn. Python subjects. [All episodes are listed on a separate page](http://pgbovine.net/PG-Podcast-summary.htm). -* [Import This](https://www.kennethreitz.org/import-this/) is an occasional - podcast from [Kenneth Reitz](https://github.com/kennethreitz) and - [Alex Gaynor](https://github.com/alex) with very in-depth interviews with - influential [Python community](/python-community.html) members. - ## Favorite podcast episodes Here are a list of my favorite episodes from various Python podcasts before diff --git a/content/pages/03-data/18-data-visualization.markdown b/content/pages/03-data/18-data-visualization.markdown index 352e952da..80f74f0b7 100644 --- a/content/pages/03-data/18-data-visualization.markdown +++ b/content/pages/03-data/18-data-visualization.markdown @@ -147,9 +147,6 @@ visualization and gave me ideas for what to build. people worked with paper to build their visuals add fantastic context to the story. -* [dataviz.tools](http://dataviz.tools/) has a nice list of categorized - tools for working with data and visualizing it. - * [Xenographics](https://xeno.graphics/) presents uncommon and unusual visualization formats such as the [Manhattan Plot](https://xeno.graphics/manhattan-plot/) and diff --git a/content/pages/04-web-development/04-bottle.markdown b/content/pages/04-web-development/04-bottle.markdown index 5150a96e0..1f40db51c 100644 --- a/content/pages/04-web-development/04-bottle.markdown +++ b/content/pages/04-web-development/04-bottle.markdown @@ -97,9 +97,6 @@ steps to more easily get your web application up and running. * Here's a short code snippet for [creating a RESTful API with Bottle and MongoDB](http://myadventuresincoding.wordpress.com/2011/01/02/creating-a-rest-api-in-python-using-bottle-and-mongodb/). -* This [tutorial](http://gotofritz.net/blog/weekly-challenge/restful-python-api-bottle/) - is another Bottle walkthrough for creating a RESTful web API. - * [Bottle, full stack without Django](http://www.avelino.xxx/2014/12/bottle-full-stack-without-django) does a nice job of connecting SQLAlchemy with Bottle and building an example application using the framework. diff --git a/content/pages/04-web-development/24-react.markdown b/content/pages/04-web-development/24-react.markdown index 2b3025b42..18ca6555b 100644 --- a/content/pages/04-web-development/24-react.markdown +++ b/content/pages/04-web-development/24-react.markdown @@ -71,9 +71,5 @@ tack on React to build your client-side user interfaces. is a good quiz to see what you know or still need to learn about the fundamentals of using React. -* [Building a Serverless Stripe Analytics Dashboard](https://statsbot.co/blog/building-serverless-stripe-analytics-dashboard/) - shows how to work with the [Stripe](/stripe.html) API to build a - dashboard in React then serve the static assets from AWS S3. - * [Under-the-hood-ReactJS](https://bogdan-lyashenko.github.io/Under-the-hood-ReactJS/) examines the React codebase itself rather than teaching you how to use it. diff --git a/content/pages/04-web-development/35-testing.markdown b/content/pages/04-web-development/35-testing.markdown index 550ba494c..e0551b57d 100644 --- a/content/pages/04-web-development/35-testing.markdown +++ b/content/pages/04-web-development/35-testing.markdown @@ -106,9 +106,9 @@ test runners, coverage reports and related libraries. and goes through a bunch of code samples for common situations. * [Using pytest with Django](http://engineroom.trackmaven.com/blog/using-pytest-with-django/) - shows how to get a basic [pytest](http://pytest.org/latest/) test - running for a Django project and explains why the author prefers pytest - over standard unittest testing. + shows how to get a basic [pytest](https://docs.pytest.org/en/latest/) test + case running for a Django project and explains why the author prefers + pytest over standard unittest testing. * [Distributed Testing with Selenium Grid and Docker](https://testdriven.io/distributed-testing-with-selenium-grid) shows how to distribute automated, browser tests with Selenium Grid and diff --git a/content/pages/04-web-development/48-api-creation.markdown b/content/pages/04-web-development/48-api-creation.markdown index f36d9f701..992601a08 100644 --- a/content/pages/04-web-development/48-api-creation.markdown +++ b/content/pages/04-web-development/48-api-creation.markdown @@ -22,8 +22,7 @@ applications through machine-to-machine communication. * [Flask-RESTful](http://flask-restful.readthedocs.org/en/latest/) is widely used for creating web APIs with Flask. It was originally - [open sourced and explained in a blog post by Twilio](https://www.twilio.com/engineering/2012/10/18/open-sourcing-flask-restful) - then moved into its + open sourced by [Twilio](https://www.twilio.com/) then moved into its [own GitHub organization](https://github.com/flask-restful/flask-restful) so engineers from outside the company could be core contributors. diff --git a/content/pages/04-web-development/53-stripe.markdown b/content/pages/04-web-development/53-stripe.markdown index 137931937..03b01c986 100644 --- a/content/pages/04-web-development/53-stripe.markdown +++ b/content/pages/04-web-development/53-stripe.markdown @@ -38,7 +38,7 @@ for processing payments. ### Resources about Stripe -* [How Stripe Designs Beautiful Websites](https://www.leejamesrobinson.com/blog/how-stripe-designs-beautiful-websites/) +* [How Stripe Designs Beautiful Websites](https://leerob.io/blog/how-stripe-designs-beautiful-websites) explains the process for how Stripe creates their gorgeous design that makes people want to use the service and explore what else they can build with it. diff --git a/content/pages/05-deployment/14-ubuntu.markdown b/content/pages/05-deployment/14-ubuntu.markdown index d8ef782ce..e3363f144 100644 --- a/content/pages/05-deployment/14-ubuntu.markdown +++ b/content/pages/05-deployment/14-ubuntu.markdown @@ -66,11 +66,6 @@ repository system packages. is described in this article about how [Ubuntu 16.04 proves even an LTS release can live at Linux's bleeding edge](http://arstechnica.com/information-technology/2016/05/ubuntu-16-04-proves-even-an-lts-release-can-live-at-linuxs-bleeding-edge/). -* [My First 10 Minutes On a Server - Primer for Securing Ubuntu](http://www.codelitt.com/blog/my-first-10-minutes-on-a-server-primer-for-securing-ubuntu/) - is based off an earlier post of the first five minutes on a Linux server. - This one is specific to Ubuntu Linux and goes into user accounts, sudo - privileges, SSH keys, security updates and 2-factor authentication. - * [What I learned while securing Ubuntu](https://major.io/2015/10/14/what-i-learned-while-securing-ubuntu/) explains how difficult it can be just to find correct information on how to secure an operating system. In this case, the author goes over diff --git a/content/pages/05-deployment/27-continuous-integration.markdown b/content/pages/05-deployment/27-continuous-integration.markdown index 2c93e2f56..835f5589a 100644 --- a/content/pages/05-deployment/27-continuous-integration.markdown +++ b/content/pages/05-deployment/27-continuous-integration.markdown @@ -127,10 +127,6 @@ programming language agnostic. Learn more via the following resources or on uses well done drawings to show how continuous integration and delivery works for testing and managing data. -* [Diving into continuous integration as a newbie](http://www.rackspace.com/blog/diving-into-continuous-integration-as-a-newbie/) - is a retrospective on learning CI from a Rackspace intern on how she learned - the subject. - * [The real difference between CI and CD](https://fire.ci/blog/the-difference-between-ci-and-cd/) explains what advantages CI provides, what constraints it operates under (such as total build time) to work well, and how that is different from diff --git a/content/pages/05-deployment/36-docker.markdown b/content/pages/05-deployment/36-docker.markdown index 758e74d1a..7f2145044 100644 --- a/content/pages/05-deployment/36-docker.markdown +++ b/content/pages/05-deployment/36-docker.markdown @@ -144,10 +144,6 @@ on Amazon Web Services, Google Compute Engine, Linode, Rackspace or elsewhere. explains some of the concepts behind using Docker for Python deployments and shows how to specifically use it for deploying Django. -* [A Docker primer – from zero to a running Django app](https://ochronus.com/docker-primer-django/) - provides specific commands and expected output for running Django apps - with Docker and Vagrant. - * [Using Docker and Docker Compose to replace virtualenv](https://www.calazan.com/using-docker-and-docker-compose-for-local-django-development-replacing-virtualenv/) is a tutorial for using Docker instead of virtualenv for dependency isolation. From 9f8cd3f5a72b071bfc0c154d822703124c7e9367 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 14 Dec 2019 08:50:09 -0500 Subject: [PATCH 024/302] add imagefield django examples --- .../django-db-models-imagefield.markdown | 739 ++++++++++++++++++ content/pages/meta/00-change-log.markdown | 5 +- theme/templates/table-of-contents.html | 1 + 3 files changed, 744 insertions(+), 1 deletion(-) create mode 100644 content/pages/examples/django/django-db-models-imagefield.markdown diff --git a/content/pages/examples/django/django-db-models-imagefield.markdown b/content/pages/examples/django/django-db-models-imagefield.markdown new file mode 100644 index 000000000..a2a1652bd --- /dev/null +++ b/content/pages/examples/django/django-db-models-imagefield.markdown @@ -0,0 +1,739 @@ +title: django.db.models ImageField Python Code Examples +category: page +slug: django-db-models-imagefield-examples +sortorder: 50130 +toc: False +sidebartitle: django.db.models ImageField +meta: Python code examples for the ImageField class used in the Django ORM, found within the django.db.models module of the Django project. + + +[ImageField](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) +([documentation](https://docs.djangoproject.com/en/stable/ref/models/fields/#imagefield)) +is a [Django ORM](/django-orm.html) field-to-column mapping for +storing image files in a [Django](/django.html) application. This field is +a subclass of [FileField](/django-db-models-imagefield-examples.html) so +it has all of the attributes of that class, as well as a couple of new +optional attributes, `height_field` and `width_field`, to make it easier +to query the stored image data. + +`ImageField` is defined within the +[django.db.models.fields](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) +module but is typically referenced from +[django.db.models](https://github.com/django/django/tree/master/django/db/models) +rather than including the `fields` module reference. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / users / models.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/users/models.py) + +```python +import io +from datetime import date + +import pyavagen +from django.conf import settings +from django.contrib.auth.base_user import AbstractBaseUser +from django.contrib.auth.models import PermissionsMixin +from django.core.files.base import ContentFile +from django.db.models.signals import post_save +from django.dispatch import receiver +from django.utils.translation import ugettext_lazy as _ +~~from django.db import models +from django_countries.fields import CountryField + +from .managers import UserManager + + +## ... source file abbreviated to get to ImageField examples ... + + +class Profile(models.Model): + ROLES = ( + (None, _('Select your role')), + ('Student', _('Student')), + ('PhD Student', _('PhD Student')), + ('Assistant', _('Assistant')), + ('Researcher', _('Researcher')), + ('Assistant Professor', _('Assistant Professor')), + ('Associate Professor', _('Associate Professor')), + ('Professor', _('Professor')), + ('Head of Department', _('Head of Department')), + ('Head of Faculty', _('Head of Faculty')), + ('Head of Laboratory', _('Head of Laboratory')), + ('Vice Rector', _('Vice Rector')), + ('Rector', _('Rector')), + ('Software Developer', _('Software Developer')), + ('Engineer', _('Engineer')), + ('Technician', _('Technician')), + ('Economist', _('Economist')), + ('Lawyer', _('Lawyer')), + ('Instructor', _('Instructor')), + ('Consultant', _('Consultant')), + ('Manager', _('Manager')), + ('Administrator', _('Administrator')), + ('Analyst', _('Analyst')), + ('Journalist', _('Journalist')), + ('Writer', _('Writer')), + ('Editor', _('Editor')), + ('Librarian', _('Librarian')), + ('Vice Director', _('Vice Director')), + ('Chief Executive Officer', _('Chief Executive Officer')), + ('Retired', _('Retired')), + ('Other', _('Other')), + ) + + DEGREE = ( + (None, _('Select your degree')), + ('Undergraduate', _('Undergraduate')), + ('Bachelor', _('Bachelor')), + ('Master', _('Master')), + ('PhD', _('PhD')), + ('Candidate of Sciences', _('Candidate of Sciences')), + ('Doctor of Sciences', _('Doctor of Sciences')), + ) + + LANGUAGES = ( + ('ENG', _('English')), + ('RUS', _('Russian')), + ) + + user = models.OneToOneField(User, on_delete=models.CASCADE) + + first_name = models.CharField( + max_length=100, verbose_name=_("First Name in English") + ) + last_name = models.CharField( + max_length=100, verbose_name=_("Last Name in English") + ) + first_name_rus = models.CharField( + max_length=100, default="", verbose_name=_("First Name in Russian",), + blank=True, + ) + middle_name_rus = models.CharField( + max_length=100, default="", verbose_name=_("Middle Name in Russian"), + blank = True, + ) + last_name_rus = models.CharField( + max_length=100, default="", verbose_name=_("Last Name in Russian"), + blank=True, + ) + country = CountryField(null=True, verbose_name=_("Country")) + city = models.CharField(max_length=100, verbose_name=_("City in English")) + birthday = models.DateField(verbose_name=_("Birthday"), null=True) + affiliation = models.CharField( + max_length=100, verbose_name=_("Name of your organization in English"), + ) + role = models.CharField( + choices=ROLES, max_length=30, null=True, + verbose_name=_('Primary role in organization') + ) + degree = models.CharField( + choices=DEGREE, max_length=30, null=True, + verbose_name=_('Degree') + ) + ieee_member = models.BooleanField( + verbose_name=_('I am an IEEE Member'), default=False + ) + + preferred_language = models.CharField( + choices=LANGUAGES, max_length=3, default='ENG' + ) + +~~ avatar = models.ImageField(upload_to=get_avatar_full_path, blank=True) + avatar_version = models.IntegerField(default=0, blank=True, editable=False) + + @property + def email(self): + return self.user.email + + def get_short_name(self): + return self.first_name + + def get_full_name(self): + return f'{self.first_name} {self.last_name}' + + def get_full_name_rus(self): + return ' '.join( + (self.first_name_rus, self.middle_name_rus, self.last_name_rus) + ) + + def has_name_rus(self): + return bool(self.get_full_name_rus().strip()) + + def age(self): + today = date.today() + born = self.birthday + rest = 1 if (today.month, today.day) < (born.month, born.day) else 0 + return today.year - born.year - rest + + def __str__(self): + return self.get_full_name() + + +## ... source file continues with no further ImageField examples ... + +``` + + +## Example 2 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / images / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/models.py) + +```python +import hashlib +import os.path +from collections import OrderedDict +from contextlib import contextmanager +from io import BytesIO + +from django.conf import settings +from django.core import checks +from django.core.files import File +~~from django.db import models +from django.forms.utils import flatatt +from django.urls import reverse +from django.utils.functional import cached_property +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext_lazy as _ +from taggit.managers import TaggableManager +from unidecode import unidecode +from willow.image import Image as WillowImage + +from wagtail.admin.models import get_object_usage +from wagtail.core import hooks +from wagtail.core.models import CollectionMember +from wagtail.images.exceptions import InvalidFilterSpecError +from wagtail.images.rect import Rect +from wagtail.search import index +from wagtail.search.queryset import SearchableQuerySetMixin + + +class SourceImageIOError(IOError): + """ + Custom exception to distinguish IOErrors that were thrown while opening the source image + """ + pass + + +class ImageQuerySet(SearchableQuerySetMixin, models.QuerySet): + pass + + +def get_upload_to(instance, filename): + """ + Obtain a valid upload path for an image file. + + This needs to be a module-level function so that it can be referenced within migrations, + but simply delegates to the `get_upload_to` method of the instance, so that AbstractImage + subclasses can override it. + """ + return instance.get_upload_to(filename) + + +def get_rendition_upload_to(instance, filename): + """ + Obtain a valid upload path for an image rendition file. + + This needs to be a module-level function so that it can be referenced within migrations, + but simply delegates to the `get_upload_to` method of the instance, so that AbstractRendition + subclasses can override it. + """ + return instance.get_upload_to(filename) + + +class AbstractImage(CollectionMember, index.Indexed, models.Model): + title = models.CharField(max_length=255, verbose_name=_('title')) +~~ file = models.ImageField( +~~ verbose_name=_('file'), upload_to=get_upload_to, width_field='width', height_field='height' +~~ ) + width = models.IntegerField(verbose_name=_('width'), editable=False) + height = models.IntegerField(verbose_name=_('height'), editable=False) + created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True, db_index=True) + uploaded_by_user = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_('uploaded by user'), + null=True, blank=True, editable=False, on_delete=models.SET_NULL + ) + + tags = TaggableManager(help_text=None, blank=True, verbose_name=_('tags')) + + focal_point_x = models.PositiveIntegerField(null=True, blank=True) + focal_point_y = models.PositiveIntegerField(null=True, blank=True) + focal_point_width = models.PositiveIntegerField(null=True, blank=True) + focal_point_height = models.PositiveIntegerField(null=True, blank=True) + + file_size = models.PositiveIntegerField(null=True, editable=False) + # A SHA-1 hash of the file contents + file_hash = models.CharField(max_length=40, blank=True, editable=False) + + objects = ImageQuerySet.as_manager() + + def is_stored_locally(self): + """ + Returns True if the image is hosted on the local filesystem + """ +~~ try: +~~ self.file.path + +~~ return True +~~ except NotImplementedError: +~~ return False + + def get_file_size(self): + if self.file_size is None: + try: + self.file_size = self.file.size + except Exception as e: + # File not found + # + # Have to catch everything, because the exception + # depends on the file subclass, and therefore the + # storage being used. + raise SourceImageIOError(str(e)) + + self.save(update_fields=['file_size']) + + return self.file_size + + def _set_file_hash(self, file_contents): + self.file_hash = hashlib.sha1(file_contents).hexdigest() + + def get_file_hash(self): + if self.file_hash == '': + with self.open_file() as f: + self._set_file_hash(f.read()) + + self.save(update_fields=['file_hash']) + + return self.file_hash + + def get_upload_to(self, filename): + folder_name = 'original_images' + filename = self.file.field.storage.get_valid_name(filename) + + # do a unidecode in the filename and then + # replace non-ascii characters in filename with _ , to sidestep issues with filesystem encoding + filename = "".join((i if ord(i) < 128 else '_') for i in unidecode(filename)) + + # Truncate filename so it fits in the 100 character limit + # https://code.djangoproject.com/ticket/9893 + full_path = os.path.join(folder_name, filename) + if len(full_path) >= 95: + chars_to_trim = len(full_path) - 94 + prefix, extension = os.path.splitext(filename) + filename = prefix[:-chars_to_trim] + extension + full_path = os.path.join(folder_name, filename) + + return full_path + + def get_usage(self): + return get_object_usage(self) + + @property + def usage_url(self): + return reverse('wagtailimages:image_usage', + args=(self.id,)) + + search_fields = CollectionMember.search_fields + [ + index.SearchField('title', partial_match=True, boost=10), + index.AutocompleteField('title'), + index.FilterField('title'), + index.RelatedFields('tags', [ + index.SearchField('name', partial_match=True, boost=10), + index.AutocompleteField('name'), + ]), + index.FilterField('uploaded_by_user'), + ] + + def __str__(self): + return self.title + + @contextmanager + def open_file(self): + # Open file if it is closed + close_file = False + try: + image_file = self.file + + if self.file.closed: + # Reopen the file + if self.is_stored_locally(): + self.file.open('rb') + else: + # Some external storage backends don't allow reopening + # the file. Get a fresh file instance. #1397 + storage = self._meta.get_field('file').storage + image_file = storage.open(self.file.name, 'rb') + + close_file = True + except IOError as e: + # re-throw this as a SourceImageIOError so that calling code can distinguish + # these from IOErrors elsewhere in the process + raise SourceImageIOError(str(e)) + + # Seek to beginning + image_file.seek(0) + + try: + yield image_file + finally: + if close_file: + image_file.close() + + @contextmanager + def get_willow_image(self): + with self.open_file() as image_file: + yield WillowImage.open(image_file) + + def get_rect(self): + return Rect(0, 0, self.width, self.height) + + def get_focal_point(self): + if self.focal_point_x is not None and \ + self.focal_point_y is not None and \ + self.focal_point_width is not None and \ + self.focal_point_height is not None: + return Rect.from_point( + self.focal_point_x, + self.focal_point_y, + self.focal_point_width, + self.focal_point_height, + ) + + def has_focal_point(self): + return self.get_focal_point() is not None + + def set_focal_point(self, rect): + if rect is not None: + self.focal_point_x = rect.centroid_x + self.focal_point_y = rect.centroid_y + self.focal_point_width = rect.width + self.focal_point_height = rect.height + else: + self.focal_point_x = None + self.focal_point_y = None + self.focal_point_width = None + self.focal_point_height = None + + def get_suggested_focal_point(self): + with self.get_willow_image() as willow: + faces = willow.detect_faces() + + if faces: + # Create a bounding box around all faces + left = min(face[0] for face in faces) + top = min(face[1] for face in faces) + right = max(face[2] for face in faces) + bottom = max(face[3] for face in faces) + focal_point = Rect(left, top, right, bottom) + else: + features = willow.detect_features() + if features: + # Create a bounding box around all features + left = min(feature[0] for feature in features) + top = min(feature[1] for feature in features) + right = max(feature[0] for feature in features) + bottom = max(feature[1] for feature in features) + focal_point = Rect(left, top, right, bottom) + else: + return None + + # Add 20% to width and height and give it a minimum size + x, y = focal_point.centroid + width, height = focal_point.size + + width *= 1.20 + height *= 1.20 + + width = max(width, 100) + height = max(height, 100) + + return Rect.from_point(x, y, width, height) + + @classmethod + def get_rendition_model(cls): + """ Get the Rendition model for this Image model """ + return cls.renditions.rel.related_model + + def get_rendition(self, filter): + if isinstance(filter, str): + filter = Filter(spec=filter) + + cache_key = filter.get_cache_key(self) + Rendition = self.get_rendition_model() + + try: + rendition = self.renditions.get( + filter_spec=filter.spec, + focal_point_key=cache_key, + ) + except Rendition.DoesNotExist: + # Generate the rendition image + generated_image = filter.run(self, BytesIO()) + + # Generate filename + input_filename = os.path.basename(self.file.name) + input_filename_without_extension, input_extension = os.path.splitext(input_filename) + + # A mapping of image formats to extensions + FORMAT_EXTENSIONS = { + 'jpeg': '.jpg', + 'png': '.png', + 'gif': '.gif', + } + + output_extension = filter.spec.replace('|', '.') + FORMAT_EXTENSIONS[generated_image.format_name] + if cache_key: + output_extension = cache_key + '.' + output_extension + + # Truncate filename to prevent it going over 60 chars + output_filename_without_extension = input_filename_without_extension[:(59 - len(output_extension))] + output_filename = output_filename_without_extension + '.' + output_extension + + rendition, created = self.renditions.get_or_create( + filter_spec=filter.spec, + focal_point_key=cache_key, + defaults={'file': File(generated_image.f, name=output_filename)} + ) + + return rendition + + def is_portrait(self): + return (self.width < self.height) + + def is_landscape(self): + return (self.height < self.width) + + @property + def filename(self): + return os.path.basename(self.file.name) + + @property + def default_alt_text(self): + # by default the alt text field (used in rich text insertion) is populated + # from the title. Subclasses might provide a separate alt field, and + # override this + return self.title + + def is_editable_by_user(self, user): + from wagtail.images.permissions import permission_policy + return permission_policy.user_has_permission_for_instance(user, 'change', self) + + class Meta: + abstract = True + + +class Image(AbstractImage): + admin_form_fields = ( + 'title', + 'file', + 'collection', + 'tags', + 'focal_point_x', + 'focal_point_y', + 'focal_point_width', + 'focal_point_height', + ) + + class Meta: + verbose_name = _('image') + verbose_name_plural = _('images') + + +class Filter: + """ + Represents one or more operations that can be applied to an Image to produce a rendition + appropriate for final display on the website. Usually this would be a resize operation, + but could potentially involve colour processing, etc. + """ + + def __init__(self, spec=None): + # The spec pattern is operation1-var1-var2|operation2-var1 + self.spec = spec + + @cached_property + def operations(self): + # Search for operations + self._search_for_operations() + + # Build list of operation objects + operations = [] + for op_spec in self.spec.split('|'): + op_spec_parts = op_spec.split('-') + + if op_spec_parts[0] not in self._registered_operations: + raise InvalidFilterSpecError("Unrecognised operation: %s" % op_spec_parts[0]) + + op_class = self._registered_operations[op_spec_parts[0]] + operations.append(op_class(*op_spec_parts)) + return operations + + def run(self, image, output): + with image.get_willow_image() as willow: + original_format = willow.format_name + + # Fix orientation of image + willow = willow.auto_orient() + + env = { + 'original-format': original_format, + } + for operation in self.operations: + willow = operation.run(willow, image, env) or willow + + # Find the output format to use + if 'output-format' in env: + # Developer specified an output format + output_format = env['output-format'] + else: + # Default to outputting in original format + output_format = original_format + + # Convert BMP files to PNG + if original_format == 'bmp': + output_format = 'png' + + # Convert unanimated GIFs to PNG as well + if original_format == 'gif' and not willow.has_animation(): + output_format = 'png' + + if output_format == 'jpeg': + # Allow changing of JPEG compression quality + if 'jpeg-quality' in env: + quality = env['jpeg-quality'] + elif hasattr(settings, 'WAGTAILIMAGES_JPEG_QUALITY'): + quality = settings.WAGTAILIMAGES_JPEG_QUALITY + else: + quality = 85 + + # If the image has an alpha channel, give it a white background + if willow.has_alpha(): + willow = willow.set_background_color_rgb((255, 255, 255)) + + return willow.save_as_jpeg(output, quality=quality, progressive=True, optimize=True) + elif output_format == 'png': + return willow.save_as_png(output, optimize=True) + elif output_format == 'gif': + return willow.save_as_gif(output) + + def get_cache_key(self, image): + vary_parts = [] + + for operation in self.operations: + for field in getattr(operation, 'vary_fields', []): + value = getattr(image, field, '') + vary_parts.append(str(value)) + + vary_string = '-'.join(vary_parts) + + # Return blank string if there are no vary fields + if not vary_string: + return '' + + return hashlib.sha1(vary_string.encode('utf-8')).hexdigest()[:8] + + _registered_operations = None + + @classmethod + def _search_for_operations(cls): + if cls._registered_operations is not None: + return + + operations = [] + for fn in hooks.get_hooks('register_image_operations'): + operations.extend(fn()) + + cls._registered_operations = dict(operations) + + +class AbstractRendition(models.Model): + filter_spec = models.CharField(max_length=255, db_index=True) +~~ file = models.ImageField(upload_to=get_rendition_upload_to, width_field='width', height_field='height') + width = models.IntegerField(editable=False) + height = models.IntegerField(editable=False) + focal_point_key = models.CharField(max_length=16, blank=True, default='', editable=False) + +~~ @property +~~ def url(self): +~~ return self.file.url + +~~ @property +~~ def alt(self): +~~ return self.image.title + + @property + def attrs(self): + """ + The src, width, height, and alt attributes for an tag, as a HTML + string + """ + return flatatt(self.attrs_dict) + + @property + def attrs_dict(self): + """ + A dict of the src, width, height, and alt attributes for an tag. + """ + return OrderedDict([ + ('src', self.url), + ('width', self.width), + ('height', self.height), + ('alt', self.alt), + ]) + + def img_tag(self, extra_attributes={}): + attrs = self.attrs_dict.copy() + attrs.update(extra_attributes) + return mark_safe(''.format(flatatt(attrs))) + + def __html__(self): + return self.img_tag() + +~~ def get_upload_to(self, filename): +~~ folder_name = 'images' +~~ filename = self.file.field.storage.get_valid_name(filename) +~~ return os.path.join(folder_name, filename) + + @classmethod + def check(cls, **kwargs): + errors = super(AbstractRendition, cls).check(**kwargs) + if not cls._meta.abstract: + if not any( + set(constraint) == set(['image', 'filter_spec', 'focal_point_key']) + for constraint in cls._meta.unique_together + ): + errors.append( + checks.Error( + "Custom rendition model %r has an invalid unique_together setting" % cls, + hint="Custom rendition models must include the constraint " + "('image', 'filter_spec', 'focal_point_key') in their unique_together definition.", + obj=cls, + id='wagtailimages.E001', + ) + ) + + return errors + + class Meta: + abstract = True + + +class Rendition(AbstractRendition): + image = models.ForeignKey(Image, related_name='renditions', on_delete=models.CASCADE) + + class Meta: + unique_together = ( + ('image', 'filter_spec', 'focal_point_key'), + ) + +``` + + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 43baafab4..c0ee0cac3 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -16,12 +16,15 @@ on GitHub. ## 2019 ### December -* Merged PR [#224](https://github.com/mattmakai/fullstackpython.com/pull/224) +* Cleaned a bunch of dead links out thanks to + [PR #225](https://github.com/mattmakai/fullstackpython.com/pull/225). +* Merged [PR #224](https://github.com/mattmakai/fullstackpython.com/pull/224) with information and resources on the Masonite web framework for the [other web frameworks](/other-web-frameworks.html) page. * Updated the [RQ](/redis-queue-rq.html) page with a couple of new fresh resources. * Added new Django code example pages: + * [django.db.models ImageField](/django-db-models-imagefield-examples.html) * [django.db.models.related ForeignKey](/django-db-models-related-foreignkey-examples.html) * [django.forms EmailField](/django-forms-emailfield-examples.html) * [django.forms IntegerField](/django-forms-integerfield-examples.html) diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index 9128ae0fb..af183d2de 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -68,6 +68,7 @@

django.db.models DateTimeField, FileField, ForeignKey, + ImageField, IntegerField, Model, signal, From 9fc83577b112fbb0419d589ee451cad146631f89 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 15 Dec 2019 14:08:06 -0500 Subject: [PATCH 025/302] updating title page wording --- theme/templates/index.html | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/theme/templates/index.html b/theme/templates/index.html index 03c96e4dd..6272d17ef 100644 --- a/theme/templates/index.html +++ b/theme/templates/index.html @@ -31,11 +31,12 @@

Build, Deploy and Operate Python Applications

deploy and operate Python-powered applications.

This guide branches out on topic because your learning - requirements depend on what you're working on. Select one - of the buttons below or check out the full - table of contents. + requirements depend on what you're working on. Choose a + topic from the links below or view the full + table of contents + to see even more subjects you can learn for free on this website.

-

What do you need to learn to create your application?

+

What do you need to learn first?

{% include "index-sidebar.html" %}
From 775ecb9f56f8db284028a14110a3fe30fe7a1c2a Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 16 Dec 2019 07:10:45 -0500 Subject: [PATCH 026/302] add a few new resources --- content/pages/03-data/17-scipy-numpy.markdown | 5 +++++ content/pages/04-web-development/35-testing.markdown | 5 +++++ content/pages/06-devops/06-web-app-performance.markdown | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/content/pages/03-data/17-scipy-numpy.markdown b/content/pages/03-data/17-scipy-numpy.markdown index dc8311102..9259f5d89 100644 --- a/content/pages/03-data/17-scipy-numpy.markdown +++ b/content/pages/03-data/17-scipy-numpy.markdown @@ -75,6 +75,11 @@ following resources are broader walkthroughs for the SciPy ecosystem: that recommends how to prepare the scientific computing ecosystme for GPU, distributed and sparse arrays. +* [Probability distribution explorer](http://bois.caltech.edu/distribution_explorer/) + contains graphs for understanding how different probabilities look + when plotted. There is also code for implementing the visuals in NumPy + and SciPy. + ### Example NumPy code * [SmoothLife](https://github.com/duckythescientist/SmoothLife) is an diff --git a/content/pages/04-web-development/35-testing.markdown b/content/pages/04-web-development/35-testing.markdown index e0551b57d..1cc035882 100644 --- a/content/pages/04-web-development/35-testing.markdown +++ b/content/pages/04-web-development/35-testing.markdown @@ -129,6 +129,11 @@ test runners, coverage reports and related libraries. then your tests will be run to check that everything is still working as intended. +* [8 great pytest plugins](https://opensource.com/article/18/6/pytest-plugins) + is a list of plugins that go with PyTest and help with tasks like reducing + the friction around testing [Django](/django.html), as well as running + tests in parallel. + * This test-driven development series shows you how to write an interpreter in Python and contains a ton of great code samples to learn from: diff --git a/content/pages/06-devops/06-web-app-performance.markdown b/content/pages/06-devops/06-web-app-performance.markdown index c2224206d..cba1f4c0d 100644 --- a/content/pages/06-devops/06-web-app-performance.markdown +++ b/content/pages/06-devops/06-web-app-performance.markdown @@ -11,6 +11,10 @@ Web application performance is affected by network latency, bandwidth, database queries, page size and many other factors. +### Performance and load testing tools +* [Falco](https://github.com/theodo/falco) + + ### Load testing resources * [Load Testing with Locust.io & Docker Swarm](https://wheniwork.engineering/load-testing-with-locust-io-docker-swarm-d78a2602997a) shows you how to set up load tests using [Docker](/docker.html) containers From 1b07483db34296720d221678ad0f67d59be17adb Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 16 Dec 2019 15:19:32 -0500 Subject: [PATCH 027/302] add new genericipaddressfield django code examples --- .../04-web-development/15-web-design.markdown | 4 + .../18-responsive-design.markdown | 5 + ...o-db-models-genericipaddressfield.markdown | 347 ++++++++++++++++++ content/pages/meta/00-change-log.markdown | 1 + theme/templates/table-of-contents.html | 1 + 5 files changed, 358 insertions(+) create mode 100644 content/pages/examples/django/django-db-models-genericipaddressfield.markdown diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index 97736c870..4c97f3117 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -140,3 +140,7 @@ this short list as my absolute favorites that help developers become provides a high-level overview of many of the tools developers use in the browser and some other useful information on average salaries and where to search for front-end development jobs. + +* [Who Can Use](https://whocanuse.com/) shows how color contrast can affect different + people with visual impairments and can help you improve your site's accessibility + to these groups. diff --git a/content/pages/04-web-development/18-responsive-design.markdown b/content/pages/04-web-development/18-responsive-design.markdown index cf6264663..69cf94666 100644 --- a/content/pages/04-web-development/18-responsive-design.markdown +++ b/content/pages/04-web-development/18-responsive-design.markdown @@ -43,3 +43,8 @@ a broad range of devices that people use to read this site. * [Fundamentals of responsive images](https://www.lullabot.com/articles/fundamentals-of-responsive-images) shows the code behind several ways to make your web images resize according to browser window size. + +* [ResponsiveViewer](https://chrome.google.com/webstore/detail/responsiveviewer/inmopeiepgfljkpkidclfgbgbmfcennb) + is a Chrome plugin in that allows you to view multiple sizes and devices in the + same browser window. This is a handy tool to avoid constantly flipping between + tabs or resizing the same tab to see the changes you are making to a design. diff --git a/content/pages/examples/django/django-db-models-genericipaddressfield.markdown b/content/pages/examples/django/django-db-models-genericipaddressfield.markdown new file mode 100644 index 000000000..4f95d410c --- /dev/null +++ b/content/pages/examples/django/django-db-models-genericipaddressfield.markdown @@ -0,0 +1,347 @@ +title: django.db.models GenericIPAddressField Python Code Examples +category: page +slug: django-db-models-genericipaddressfield-examples +sortorder: 50127 +toc: False +sidebartitle: django.db.models GenericIPAddressField +meta: Python code examples for the GenericIPAddressField class used in the Django ORM, found within the django.db.models module of the Django project. + + +[GenericIPAddressField](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) +is a [Django ORM](/django-orm.html) for mapping from your Python code to an +database column that needs to store a valid IP address. + +The [Django](/django.html) project has great documentation for +[GenericIPAddressField](https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.GenericIPAddressField) +as well as all of the other column fields. + +Note that `GenericIPAddressField` is defined within the +[django.db.models.fields](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) +module but is typically referenced from +[django.db.models](https://github.com/django/django/tree/master/django/db/models) +rather than including the `fields` module reference. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / models.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/models.py) + +```python +from __future__ import unicode_literals + +import json +import ast + +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import FieldDoesNotExist +~~from django.db import models, DEFAULT_DB_ALIAS +from django.db.models import QuerySet, Q +from django.utils import formats, timezone +from django.utils.encoding import python_2_unicode_compatible, smart_text +from django.utils.six import iteritems, integer_types +from django.utils.translation import ugettext_lazy as _ + +from jsonfield.fields import JSONField +from dateutil import parser +from dateutil.tz import gettz + + +## ... source file abbreviated to get to GenericIPAddressExample ... + + +@python_2_unicode_compatible +class LogEntry(models.Model): + """ + Represents an entry in the audit log. The content type is saved along with the textual and numeric (if available) + primary key, as well as the textual representation of the object when it was saved. It holds the action performed + and the fields that were changed in the transaction. + + If AuditlogMiddleware is used, the actor will be set automatically. Keep in mind that editing / re-saving LogEntry + instances may set the actor to a wrong value - editing LogEntry instances is not recommended (and it should not be + necessary). + """ + + class Action: + """ + The actions that Auditlog distinguishes: creating, updating and deleting objects. Viewing objects is not logged. + The values of the actions are numeric, a higher integer value means a more intrusive action. This may be useful + in some cases when comparing actions because the ``__lt``, ``__lte``, ``__gt``, ``__gte`` lookup filters can be + used in queries. + + The valid actions are :py:attr:`Action.CREATE`, :py:attr:`Action.UPDATE` and :py:attr:`Action.DELETE`. + """ + CREATE = 0 + UPDATE = 1 + DELETE = 2 + + choices = ( + (CREATE, _("create")), + (UPDATE, _("update")), + (DELETE, _("delete")), + ) + + content_type = models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE, related_name='+', verbose_name=_("content type")) + object_pk = models.CharField(db_index=True, max_length=255, verbose_name=_("object pk")) + object_id = models.BigIntegerField(blank=True, db_index=True, null=True, verbose_name=_("object id")) + object_repr = models.TextField(verbose_name=_("object representation")) + action = models.PositiveSmallIntegerField(choices=Action.choices, verbose_name=_("action")) + changes = models.TextField(blank=True, verbose_name=_("change message")) + actor = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, blank=True, null=True, related_name='+', verbose_name=_("actor")) +~~ remote_addr = models.GenericIPAddressField(blank=True, null=True, verbose_name=_("remote address")) + timestamp = models.DateTimeField(auto_now_add=True, verbose_name=_("timestamp")) + additional_data = JSONField(blank=True, null=True, verbose_name=_("additional data")) + + objects = LogEntryManager() + + class Meta: + get_latest_by = 'timestamp' + ordering = ['-timestamp'] + verbose_name = _("log entry") + verbose_name_plural = _("log entries") + + def __str__(self): + if self.action == self.Action.CREATE: + fstring = _("Created {repr:s}") + elif self.action == self.Action.UPDATE: + fstring = _("Updated {repr:s}") + elif self.action == self.Action.DELETE: + fstring = _("Deleted {repr:s}") + else: + fstring = _("Logged {repr:s}") + + return fstring.format(repr=self.object_repr) + +## ... source file continues with no further GenericIPAddress examples ... +``` + + +## Example 2 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / migrations / 0002_auto_20151217_2044.py**](https://github.com/jazzband/django-axes/blob/master/axes/migrations/0002_auto_20151217_2044.py) + +```python +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('axes', '0001_initial'), + ] + + operations = [ +~~ migrations.AlterField( +~~ model_name='accessattempt', +~~ name='ip_address', +~~ field=models.GenericIPAddressField(db_index=True, null=True, verbose_name='IP Address'), +~~ ), + migrations.AlterField( + model_name='accessattempt', + name='trusted', + field=models.BooleanField(db_index=True, default=False), + ), + migrations.AlterField( + model_name='accessattempt', + name='user_agent', + field=models.CharField(db_index=True, max_length=255), + ), + migrations.AlterField( + model_name='accessattempt', + name='username', + field=models.CharField(db_index=True, max_length=255, null=True), + ), +~~ migrations.AlterField( +~~ model_name='accesslog', +~~ name='ip_address', +~~ field=models.GenericIPAddressField(db_index=True, null=True, verbose_name='IP Address'), +~~ ), + migrations.AlterField( + model_name='accesslog', + name='trusted', + field=models.BooleanField(db_index=True, default=False), + ), + migrations.AlterField( + model_name='accesslog', + name='user_agent', + field=models.CharField(db_index=True, max_length=255), + ), + migrations.AlterField( + model_name='accesslog', + name='username', + field=models.CharField(db_index=True, max_length=255, null=True), + ), + ] + +``` + + +## Example 3 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / migrations / 0001_initial.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/migrations/0001_initial.py) + +```python +import django.db.models.deletion +import mptt.fields +from django.conf import settings +from django.db import migrations, models +~~from django.db.models.fields import GenericIPAddressField as IPAddressField +from wiki.conf.settings import GROUP_MODEL + + +class Migration(migrations.Migration): + + dependencies = [ + ('sites', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0001_initial'), + ('auth', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('created', models.DateTimeField(verbose_name='created', auto_now_add=True)), + ('modified', models.DateTimeField(verbose_name='modified', auto_now=True, help_text='Article properties last modified')), + ('group_read', models.BooleanField(default=True, verbose_name='group read access')), + ('group_write', models.BooleanField(default=True, verbose_name='group write access')), + ('other_read', models.BooleanField(default=True, verbose_name='others read access')), + ('other_write', models.BooleanField(default=True, verbose_name='others write access')), + ], + options={ + 'permissions': (('moderate', 'Can edit all articles and lock/unlock/restore'), ('assign', 'Can change ownership of any article'), ('grant', 'Can assign permissions to other users')), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ArticleForObject', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('object_id', models.PositiveIntegerField(verbose_name='object ID')), + ('is_mptt', models.BooleanField(default=False, editable=False)), + ('article', models.ForeignKey(to='wiki.Article', on_delete=models.CASCADE)), + ('content_type', models.ForeignKey(related_name='content_type_set_for_articleforobject', verbose_name='content type', to='contenttypes.ContentType', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name_plural': 'Articles for object', + 'verbose_name': 'Article for object', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ArticlePlugin', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('deleted', models.BooleanField(default=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ArticleRevision', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), + ('user_message', models.TextField(blank=True)), + ('automatic_log', models.TextField(blank=True, editable=False)), +~~ ('ip_address', IPAddressField(null=True, verbose_name='IP address', blank=True, editable=False)), + ('modified', models.DateTimeField(auto_now=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('deleted', models.BooleanField(default=False, verbose_name='deleted')), + ('locked', models.BooleanField(default=False, verbose_name='locked')), + ('content', models.TextField(blank=True, verbose_name='article contents')), + ('title', models.CharField(max_length=512, verbose_name='article title', help_text='Each revision contains a title field that must be filled out, even if the title has not changed')), + ('article', models.ForeignKey(to='wiki.Article', verbose_name='article', on_delete=models.CASCADE)), + ('previous_revision', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wiki.ArticleRevision')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'get_latest_by': 'revision_number', + 'ordering': ('created',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ReusablePlugin', + fields=[ + ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), + ('articles', models.ManyToManyField(related_name='shared_plugins_set', to='wiki.Article')), + ], + options={ + }, + bases=('wiki.articleplugin',), + ), + migrations.CreateModel( + name='RevisionPlugin', + fields=[ + ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), + ], + options={ + }, + bases=('wiki.articleplugin',), + ), + migrations.CreateModel( + name='RevisionPluginRevision', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), + ('user_message', models.TextField(blank=True)), + ('automatic_log', models.TextField(blank=True, editable=False)), +~~ ('ip_address', IPAddressField(null=True, verbose_name='IP address', blank=True, editable=False)), + ('modified', models.DateTimeField(auto_now=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('deleted', models.BooleanField(default=False, verbose_name='deleted')), + ('locked', models.BooleanField(default=False, verbose_name='locked')), + ('plugin', models.ForeignKey(related_name='revision_set', to='wiki.RevisionPlugin', on_delete=models.CASCADE)), + ('previous_revision', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wiki.RevisionPluginRevision')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'get_latest_by': 'revision_number', + 'ordering': ('-created',), + }, + bases=(models.Model,), + ), + +## ... source file continues with no further GenericIPAddressField examples ... + +``` + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index c0ee0cac3..4c1f9e8d4 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -24,6 +24,7 @@ on GitHub. * Updated the [RQ](/redis-queue-rq.html) page with a couple of new fresh resources. * Added new Django code example pages: + * [django.db.models GenericIPAddressField](/django-db-models-genericipaddressfield-examples.html) * [django.db.models ImageField](/django-db-models-imagefield-examples.html) * [django.db.models.related ForeignKey](/django-db-models-related-foreignkey-examples.html) * [django.forms EmailField](/django-forms-emailfield-examples.html) diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index af183d2de..e8cc93c78 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -68,6 +68,7 @@

django.db.models DateTimeField, FileField, ForeignKey, + GenericIPAddressField, ImageField, IntegerField, Model, From f59e9cd6d4ecba009b69960274f35e4e63eef288 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 17 Dec 2019 09:46:53 -0500 Subject: [PATCH 028/302] add new positiveintegerfield django examples --- ...go-db-models-positiveintegerfield.markdown | 651 ++++++++++++++++++ content/pages/meta/00-change-log.markdown | 1 + theme/templates/table-of-contents.html | 1 + 3 files changed, 653 insertions(+) create mode 100644 content/pages/examples/django/django-db-models-positiveintegerfield.markdown diff --git a/content/pages/examples/django/django-db-models-positiveintegerfield.markdown b/content/pages/examples/django/django-db-models-positiveintegerfield.markdown new file mode 100644 index 000000000..e425fc925 --- /dev/null +++ b/content/pages/examples/django/django-db-models-positiveintegerfield.markdown @@ -0,0 +1,651 @@ +title: django.db.models PositiveIntegerField Example Code +category: page +slug: django-db-models-positiveintegerfield-examples +sortorder: 50135 +toc: False +sidebartitle: django.db.models PositiveIntegerField +meta: Python code examples for the PositiveIntegerField class used in the Django ORM, found within the django.db.models module of the Django project. + + +[PositiveIntegerField](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) +([documentation](https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.PositiveIntegerField)) +is a [Django ORM](/django-orm.html) mapping from your Python code to an +integer-type column in your [relational database](/databases.html) +that is restricted to only positive values from 0 to 2147483647. + +Note that `PositiveIntegerField` is defined within the +[django.db.models.fields](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) +module but is typically referenced from +[django.db.models](https://github.com/django/django/tree/master/django/db/models) +rather than including the `fields` module reference. + + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / images / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/models.py) + +```python +import hashlib +import os.path +from collections import OrderedDict +from contextlib import contextmanager +from io import BytesIO + +from django.conf import settings +from django.core import checks +from django.core.files import File +~~from django.db import models +from django.forms.utils import flatatt +from django.urls import reverse +from django.utils.functional import cached_property +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext_lazy as _ +from taggit.managers import TaggableManager +from unidecode import unidecode +from willow.image import Image as WillowImage + +from wagtail.admin.models import get_object_usage +from wagtail.core import hooks +from wagtail.core.models import CollectionMember +from wagtail.images.exceptions import InvalidFilterSpecError +from wagtail.images.rect import Rect +from wagtail.search import index +from wagtail.search.queryset import SearchableQuerySetMixin + + +class SourceImageIOError(IOError): + """ + Custom exception to distinguish IOErrors that were thrown while opening the source image + """ + pass + + +class ImageQuerySet(SearchableQuerySetMixin, models.QuerySet): + pass + + +def get_upload_to(instance, filename): + """ + Obtain a valid upload path for an image file. + + This needs to be a module-level function so that it can be referenced within migrations, + but simply delegates to the `get_upload_to` method of the instance, so that AbstractImage + subclasses can override it. + """ + return instance.get_upload_to(filename) + + +def get_rendition_upload_to(instance, filename): + """ + Obtain a valid upload path for an image rendition file. + + This needs to be a module-level function so that it can be referenced within migrations, + but simply delegates to the `get_upload_to` method of the instance, so that AbstractRendition + subclasses can override it. + """ + return instance.get_upload_to(filename) + + +class AbstractImage(CollectionMember, index.Indexed, models.Model): + title = models.CharField(max_length=255, verbose_name=_('title')) + file = models.ImageField( + verbose_name=_('file'), upload_to=get_upload_to, width_field='width', height_field='height' + ) + width = models.IntegerField(verbose_name=_('width'), editable=False) + height = models.IntegerField(verbose_name=_('height'), editable=False) + created_at = models.DateTimeField(verbose_name=_('created at'), auto_now_add=True, db_index=True) + uploaded_by_user = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_('uploaded by user'), + null=True, blank=True, editable=False, on_delete=models.SET_NULL + ) + + tags = TaggableManager(help_text=None, blank=True, verbose_name=_('tags')) + +~~ focal_point_x = models.PositiveIntegerField(null=True, blank=True) +~~ focal_point_y = models.PositiveIntegerField(null=True, blank=True) +~~ focal_point_width = models.PositiveIntegerField(null=True, blank=True) +~~ focal_point_height = models.PositiveIntegerField(null=True, blank=True) + +~~ file_size = models.PositiveIntegerField(null=True, editable=False) + # A SHA-1 hash of the file contents + file_hash = models.CharField(max_length=40, blank=True, editable=False) + + objects = ImageQuerySet.as_manager() + + def is_stored_locally(self): + """ + Returns True if the image is hosted on the local filesystem + """ + try: + self.file.path + + return True + except NotImplementedError: + return False + + def get_file_size(self): + if self.file_size is None: + try: + self.file_size = self.file.size + except Exception as e: + # File not found + # + # Have to catch everything, because the exception + # depends on the file subclass, and therefore the + # storage being used. + raise SourceImageIOError(str(e)) + + self.save(update_fields=['file_size']) + + return self.file_size + + +## ... source file continues with no further PositiveIntegerField examples ... + +``` + +## Example 2 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / migrations / 0001_initial.py**](https://github.com/jazzband/django-axes/blob/master/axes/migrations/0001_initial.py) + +```python +# 0001_initial.py +~~from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='AccessAttempt', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('user_agent', models.CharField(max_length=255)), + ('ip_address', models.GenericIPAddressField(null=True, verbose_name='IP Address')), + ('username', models.CharField(max_length=255, null=True)), + ('trusted', models.BooleanField(default=False)), + ('http_accept', models.CharField(max_length=1025, verbose_name='HTTP Accept')), + ('path_info', models.CharField(max_length=255, verbose_name='Path')), + ('attempt_time', models.DateTimeField(auto_now_add=True)), + ('get_data', models.TextField(verbose_name='GET Data')), + ('post_data', models.TextField(verbose_name='POST Data')), +~~ ('failures_since_start', models.PositiveIntegerField(verbose_name='Failed Logins')), + ], + options={ + 'ordering': ['-attempt_time'], + 'abstract': False, + }, + ), + migrations.CreateModel( + name='AccessLog', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('user_agent', models.CharField(max_length=255)), + ('ip_address', models.GenericIPAddressField(null=True, verbose_name='IP Address')), + ('username', models.CharField(max_length=255, null=True)), + ('trusted', models.BooleanField(default=False)), + ('http_accept', models.CharField(max_length=1025, verbose_name='HTTP Accept')), + ('path_info', models.CharField(max_length=255, verbose_name='Path')), + ('attempt_time', models.DateTimeField(auto_now_add=True)), + ('logout_time', models.DateTimeField(null=True, blank=True)), + ], + options={ + 'ordering': ['-attempt_time'], + 'abstract': False, + }, + ), + ] + +``` + + +## Example 3 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / migrations / 0018_create_pagenode.py**](https://github.com/divio/django-cms/blob/develop/cms/migrations/0018_create_pagenode.py) + +```python +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-01-03 19:50 +from __future__ import unicode_literals + +import django +import django.contrib.auth.models +~~from django.db import migrations, models +import django.db.models.deletion + +from . import IrreversibleMigration + + +def get_descendants(root): + """ + Returns the a generator of primary keys which represent + descendants of the given page ID (root_id) + """ + # Note this is done because get_descendants() can't be trusted + # as the tree can be corrupt. + + for child in root.children.order_by('path').iterator(): + yield child + + for child in get_descendants(child): + yield child + + +def create_page_nodes(apps, schema_editor): + Page = apps.get_model('cms', 'Page') + TreeNode = apps.get_model('cms', 'TreeNode') + db_alias = schema_editor.connection.alias + root_draft_pages = Page.objects.using(db_alias).filter( + publisher_is_draft=True, + parent__isnull=True, + ) + + create_node = TreeNode.objects.using(db_alias).create + + nodes_by_page = {} + + for root in root_draft_pages: + node = create_node( + site_id=root.site_id, + path=root.path, + depth=root.depth, + numchild=root.numchild, + parent=None, + ) + + nodes_by_page[root.pk] = node + + for descendant in get_descendants(root): + node = create_node( + site_id=descendant.site_id, + path=descendant.path, + depth=descendant.depth, + numchild=descendant.numchild, + parent=nodes_by_page[descendant.parent_id], + ) + nodes_by_page[descendant.pk] = node + + +class Migration(IrreversibleMigration): + + dependencies = [ + ('sites', '0001_initial'), + ('cms', '0017_pagetype'), + ] + replaces = [('cms', '0018_pagenode')] + + operations = [ + migrations.CreateModel( + name='TreeNode', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('path', models.CharField(max_length=255, unique=True)), +~~ ('depth', models.PositiveIntegerField()), +~~ ('numchild', models.PositiveIntegerField(default=0)), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='cms.TreeNode')), + ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='djangocms_nodes', to='sites.Site', verbose_name='site')), + ], + options={ + 'ordering': ('path',), + 'default_permissions': [], + }, + ), + migrations.RunPython(create_page_nodes), + migrations.AddField( + model_name='page', + name='node', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='cms_pages', + to='cms.TreeNode'), + ), + migrations.AddField( + model_name='page', + name='migration_0018_control', +~~ field=models.PositiveIntegerField(null=True), + ), + migrations.AlterUniqueTogether( + name='page', + unique_together=set([('node', 'publisher_is_draft')]), + ), + migrations.AlterModelManagers( + name='pageusergroup', + managers=[ + ('objects', django.contrib.auth.models.GroupManager()), + ], + ), + ] + +``` + + +## Example 3 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / migrations / 0011_auto_20190418_0137.py**](https://github.com/divio/django-filer/blob/develop/filer/migrations/0011_auto_20190418_0137.py) + +```python +# -*- coding: utf-8 -*- +# Generated by Django 2.2 on 2019-04-25 11:29 +~~from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('filer', '0010_auto_20180414_2058'), + ] + + operations = [ + migrations.AlterField( + model_name='folder', + name='level', +~~ field=models.PositiveIntegerField(editable=False), + ), + migrations.AlterField( + model_name='folder', + name='lft', +~~ field=models.PositiveIntegerField(editable=False), + ), + migrations.AlterField( + model_name='folder', + name='rght', +~~ field=models.PositiveIntegerField(editable=False), + ), + migrations.AlterIndexTogether( + name='folder', + index_together={('tree_id', 'lft')}, + ), + ] + +``` + + +## Example 5 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / migrations / 0001_initial.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/migrations/0001_initial.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +~~from django.db import models, migrations +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Bookmark', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('url', models.URLField(verbose_name='URL')), + ('title', models.CharField(max_length=255, verbose_name='title')), +~~ ('user', models.PositiveIntegerField(verbose_name='user')), + ('date_add', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date created')), + ], + options={ + 'ordering': ('date_add',), + 'verbose_name': 'bookmark', + 'verbose_name_plural': 'bookmarks', + }, + ), + migrations.CreateModel( + name='PinnedApplication', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('app_label', models.CharField(max_length=255, verbose_name='application name')), +~~ ('user', models.PositiveIntegerField(verbose_name='user')), + ('date_add', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date created')), + ], + options={ + 'ordering': ('date_add',), + 'verbose_name': 'pinned application', + 'verbose_name_plural': 'pinned applications', + }, + ), + migrations.CreateModel( + name='UserDashboardModule', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=255, verbose_name='Title')), + ('module', models.CharField(max_length=255, verbose_name='module')), + ('app_label', models.CharField(max_length=255, null=True, verbose_name='application name', blank=True)), +~~ ('user', models.PositiveIntegerField(verbose_name='user')), +~~ ('column', models.PositiveIntegerField(verbose_name='column')), + ('order', models.IntegerField(verbose_name='order')), + ('settings', models.TextField(default=b'', verbose_name='settings', blank=True)), + ('children', models.TextField(default=b'', verbose_name='children', blank=True)), + ('collapsed', models.BooleanField(default=False, verbose_name='collapsed')), + ], + options={ + 'ordering': ('column', 'order'), + 'verbose_name': 'user dashboard module', + 'verbose_name_plural': 'user dashboard modules', + }, + ), + ] + +``` + + +## Example 7 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / migrations / 0001_initial.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/migrations/0001_initial.py) + +```python +import django.db.models.deletion +import mptt.fields +from django.conf import settings +~~from django.db import migrations, models +from django.db.models.fields import GenericIPAddressField as IPAddressField +from wiki.conf.settings import GROUP_MODEL + + +class Migration(migrations.Migration): + + dependencies = [ + ('sites', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0001_initial'), + ('auth', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('created', models.DateTimeField(verbose_name='created', auto_now_add=True)), + ('modified', models.DateTimeField(verbose_name='modified', auto_now=True, help_text='Article properties last modified')), + ('group_read', models.BooleanField(default=True, verbose_name='group read access')), + ('group_write', models.BooleanField(default=True, verbose_name='group write access')), + ('other_read', models.BooleanField(default=True, verbose_name='others read access')), + ('other_write', models.BooleanField(default=True, verbose_name='others write access')), + ], + options={ + 'permissions': (('moderate', 'Can edit all articles and lock/unlock/restore'), ('assign', 'Can change ownership of any article'), ('grant', 'Can assign permissions to other users')), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ArticleForObject', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), +~~ ('object_id', models.PositiveIntegerField(verbose_name='object ID')), + ('is_mptt', models.BooleanField(default=False, editable=False)), + ('article', models.ForeignKey(to='wiki.Article', on_delete=models.CASCADE)), + ('content_type', models.ForeignKey(related_name='content_type_set_for_articleforobject', verbose_name='content type', to='contenttypes.ContentType', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name_plural': 'Articles for object', + 'verbose_name': 'Article for object', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ArticlePlugin', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('deleted', models.BooleanField(default=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ArticleRevision', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), + ('user_message', models.TextField(blank=True)), + ('automatic_log', models.TextField(blank=True, editable=False)), + ('ip_address', IPAddressField(null=True, verbose_name='IP address', blank=True, editable=False)), + ('modified', models.DateTimeField(auto_now=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('deleted', models.BooleanField(default=False, verbose_name='deleted')), + ('locked', models.BooleanField(default=False, verbose_name='locked')), + ('content', models.TextField(blank=True, verbose_name='article contents')), + ('title', models.CharField(max_length=512, verbose_name='article title', help_text='Each revision contains a title field that must be filled out, even if the title has not changed')), + ('article', models.ForeignKey(to='wiki.Article', verbose_name='article', on_delete=models.CASCADE)), + ('previous_revision', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wiki.ArticleRevision')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'get_latest_by': 'revision_number', + 'ordering': ('created',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ReusablePlugin', + fields=[ + ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), + ('articles', models.ManyToManyField(related_name='shared_plugins_set', to='wiki.Article')), + ], + options={ + }, + bases=('wiki.articleplugin',), + ), + migrations.CreateModel( + name='RevisionPlugin', + fields=[ + ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), + ], + options={ + }, + bases=('wiki.articleplugin',), + ), + migrations.CreateModel( + name='RevisionPluginRevision', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), + ('user_message', models.TextField(blank=True)), + ('automatic_log', models.TextField(blank=True, editable=False)), + ('ip_address', IPAddressField(null=True, verbose_name='IP address', blank=True, editable=False)), + ('modified', models.DateTimeField(auto_now=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('deleted', models.BooleanField(default=False, verbose_name='deleted')), + ('locked', models.BooleanField(default=False, verbose_name='locked')), + ('plugin', models.ForeignKey(related_name='revision_set', to='wiki.RevisionPlugin', on_delete=models.CASCADE)), + ('previous_revision', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wiki.RevisionPluginRevision')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'get_latest_by': 'revision_number', + 'ordering': ('-created',), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SimplePlugin', + fields=[ + ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True, on_delete=models.CASCADE)), + ('article_revision', models.ForeignKey(to='wiki.ArticleRevision', on_delete=models.CASCADE)), + ], + options={ + }, + bases=('wiki.articleplugin',), + ), + migrations.CreateModel( + name='URLPath', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('slug', models.SlugField(null=True, blank=True, verbose_name='slug')), +~~ ('lft', models.PositiveIntegerField(db_index=True, editable=False)), +~~ ('rght', models.PositiveIntegerField(db_index=True, editable=False)), +~~ ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), +~~ ('level', models.PositiveIntegerField(db_index=True, editable=False)), + ('article', models.ForeignKey(help_text='This field is automatically updated, but you need to populate it when creating a new URL path.', on_delete=django.db.models.deletion.CASCADE, to='wiki.Article', verbose_name='article')), + ('parent', mptt.fields.TreeForeignKey(blank=True, help_text='Position of URL path in the tree.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='wiki.URLPath')), + ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site')), + ], + options={ + 'verbose_name_plural': 'URL paths', + 'verbose_name': 'URL path', + }, + bases=(models.Model,), + ), + +## ... source file continues with no further PositiveIntegerField examples ... + +``` + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 4c1f9e8d4..a675c27c3 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -26,6 +26,7 @@ on GitHub. * Added new Django code example pages: * [django.db.models GenericIPAddressField](/django-db-models-genericipaddressfield-examples.html) * [django.db.models ImageField](/django-db-models-imagefield-examples.html) + * [django.db.models PositiveIntegerField](/django-db-models-positiveintegerfield-examples.html) * [django.db.models.related ForeignKey](/django-db-models-related-foreignkey-examples.html) * [django.forms EmailField](/django-forms-emailfield-examples.html) * [django.forms IntegerField](/django-forms-integerfield-examples.html) diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index e8cc93c78..ce381dac7 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -72,6 +72,7 @@

django.db.models ImageField, IntegerField, Model, + PositiveIntegerField, signal, SlugField, TextField From bc6b85f8712d307ef4949462d8398149039a34f1 Mon Sep 17 00:00:00 2001 From: PanderMusubi Date: Wed, 18 Dec 2019 09:37:22 +0100 Subject: [PATCH 029/302] add Graphviz to Data Visualization --- content/pages/03-data/18-data-visualization.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/pages/03-data/18-data-visualization.markdown b/content/pages/03-data/18-data-visualization.markdown index 80f74f0b7..62002fcc0 100644 --- a/content/pages/03-data/18-data-visualization.markdown +++ b/content/pages/03-data/18-data-visualization.markdown @@ -21,6 +21,8 @@ easier for humans to see patterns, trends and other useful information. * [Chartify](https://labs.spotify.com/2018/11/15/introducing-chartify-easier-chart-creation-in-python-for-data-scientists/) ([source code](https://github.com/spotify/chartify/)) +* [Graphviz](https://pypi.org/project/graphviz/) + ### Python-specific data viz resources * [Python Data Visualization 2018: Why So Many Libraries?](https://www.anaconda.com/blog/developer-blog/python-data-visualization-2018-why-so-many-libraries/) From 0c825a6d0f2c40be9b475939c7f666021c42ed82 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 19 Dec 2019 09:57:08 -0500 Subject: [PATCH 030/302] add positivesmallinteger django examples --- ...go-db-models-positiveintegerfield.markdown | 9 +- ...-models-positivesmallintegerfield.markdown | 350 ++++++++++++++++++ content/pages/meta/00-change-log.markdown | 1 + theme/templates/table-of-contents.html | 1 + 4 files changed, 356 insertions(+), 5 deletions(-) create mode 100644 content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown diff --git a/content/pages/examples/django/django-db-models-positiveintegerfield.markdown b/content/pages/examples/django/django-db-models-positiveintegerfield.markdown index e425fc925..7531262bc 100644 --- a/content/pages/examples/django/django-db-models-positiveintegerfield.markdown +++ b/content/pages/examples/django/django-db-models-positiveintegerfield.markdown @@ -20,12 +20,11 @@ module but is typically referenced from rather than including the `fields` module reference. - ## Example 1 from wagtail [wagtail](https://github.com/wagtail/wagtail) ([project website](https://wagtail.io/)) is a fantastic -[Django](/django.html)-based CMS with code that is open source -under the +[Django](/django.html)-based content management system with code +that is open source under the [BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). [**wagtail / wagtail / images / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/models.py) @@ -345,7 +344,7 @@ class Migration(IrreversibleMigration): ``` -## Example 3 from django-filer +## Example 4 from django-filer [django-filer](https://github.com/divio/django-filer) ([project documentation](https://django-filer.readthedocs.io/en/latest/)) is a file management library for uploading and organizing files and images @@ -471,7 +470,7 @@ class Migration(migrations.Migration): ``` -## Example 7 from django-wiki +## Example 6 from django-wiki [django-wiki](https://github.com/django-wiki/django-wiki) ([project documentation](https://django-wiki.readthedocs.io/en/master/), [demo](https://demo.django-wiki.org/), diff --git a/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown b/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown new file mode 100644 index 000000000..afe0fdea8 --- /dev/null +++ b/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown @@ -0,0 +1,350 @@ +title: django.db.models PositiveSmallIntegerField Python Code Examples +category: page +slug: django-db-models-positivesmallintegerfield-examples +sortorder: 50136 +toc: False +sidebartitle: django.db.models PositiveSmallIntegerField +meta: Python code examples for the PositiveSmallIntegerField class used in the Django ORM, found within the django.db.models module of the Django project. + + +[PositiveSmallIntegerField](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) +([documentation](https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.PositiveIntegerField)) +is a [Django ORM](/django-orm.html) mapping from your Python code to an +integer-type column in your [relational database](/databases.html) +that is restricted to only positive values from 0 to 2147483647. + +Note that `PositiveSmallIntegerField` is defined within the +[django.db.models.fields](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) +module but is typically referenced from +[django.db.models](https://github.com/django/django/tree/master/django/db/models) +rather than including the `fields` module reference. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / models.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/models.py) + +```python +from __future__ import unicode_literals + +import json +import ast + +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import FieldDoesNotExist +~~from django.db import models, DEFAULT_DB_ALIAS +from django.db.models import QuerySet, Q +from django.utils import formats, timezone +from django.utils.encoding import python_2_unicode_compatible, smart_text +from django.utils.six import iteritems, integer_types +from django.utils.translation import ugettext_lazy as _ + +from jsonfield.fields import JSONField +from dateutil import parser +from dateutil.tz import gettz + + +## ... source file abbreviated here to get to example code ... + + +@python_2_unicode_compatible +class LogEntry(models.Model): + """ + Represents an entry in the audit log. The content type is saved along with the textual and numeric (if available) + primary key, as well as the textual representation of the object when it was saved. It holds the action performed + and the fields that were changed in the transaction. + + If AuditlogMiddleware is used, the actor will be set automatically. Keep in mind that editing / re-saving LogEntry + instances may set the actor to a wrong value - editing LogEntry instances is not recommended (and it should not be + necessary). + """ + + class Action: + """ + The actions that Auditlog distinguishes: creating, updating and deleting objects. Viewing objects is not logged. + The values of the actions are numeric, a higher integer value means a more intrusive action. This may be useful + in some cases when comparing actions because the ``__lt``, ``__lte``, ``__gt``, ``__gte`` lookup filters can be + used in queries. + + The valid actions are :py:attr:`Action.CREATE`, :py:attr:`Action.UPDATE` and :py:attr:`Action.DELETE`. + """ + CREATE = 0 + UPDATE = 1 + DELETE = 2 + + choices = ( + (CREATE, _("create")), + (UPDATE, _("update")), + (DELETE, _("delete")), + ) + + content_type = models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE, related_name='+', verbose_name=_("content type")) + object_pk = models.CharField(db_index=True, max_length=255, verbose_name=_("object pk")) + object_id = models.BigIntegerField(blank=True, db_index=True, null=True, verbose_name=_("object id")) + object_repr = models.TextField(verbose_name=_("object representation")) +~~ action = models.PositiveSmallIntegerField(choices=Action.choices, verbose_name=_("action")) + changes = models.TextField(blank=True, verbose_name=_("change message")) + actor = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, blank=True, null=True, related_name='+', verbose_name=_("actor")) + remote_addr = models.GenericIPAddressField(blank=True, null=True, verbose_name=_("remote address")) + timestamp = models.DateTimeField(auto_now_add=True, verbose_name=_("timestamp")) + additional_data = JSONField(blank=True, null=True, verbose_name=_("additional data")) + + objects = LogEntryManager() + + class Meta: + get_latest_by = 'timestamp' + ordering = ['-timestamp'] + verbose_name = _("log entry") + verbose_name_plural = _("log entries") + +~~ def __str__(self): +~~ if self.action == self.Action.CREATE: +~~ fstring = _("Created {repr:s}") +~~ elif self.action == self.Action.UPDATE: +~~ fstring = _("Updated {repr:s}") +~~ elif self.action == self.Action.DELETE: +~~ fstring = _("Deleted {repr:s}") +~~ else: +~~ fstring = _("Logged {repr:s}") + +~~ return fstring.format(repr=self.object_repr) + + @property + def changes_dict(self): + """ + :return: The changes recorded in this log entry as a dictionary object. + """ + try: + return json.loads(self.changes) + except ValueError: + return {} + + +## ... source file continues with no further examples ... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / migrations / 0002_auto_20140816_1918.py**](https://github.com/divio/django-cms/blob/develop/cms/migrations/0002_auto_20140816_1918.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import cms.models.static_placeholder +import cms.models.fields +from django.conf import settings +from django.contrib.auth import get_user_model +~~from django.db import models, migrations +import django.utils.timezone + +User = get_user_model() + +user_model_label = '%s.%s' % (User._meta.app_label, User._meta.model_name) +user_ptr_name = '%s_ptr' % User._meta.object_name.lower() + + +class Migration(migrations.Migration): + + dependencies = [ + ('cms', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='PageUser', + fields=[ + (user_ptr_name, models.OneToOneField(primary_key=True, to=settings.AUTH_USER_MODEL, auto_created=True, parent_link=True, serialize=False, on_delete=models.CASCADE)), + ('created_by', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='created_users', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'User (page)', + 'verbose_name_plural': 'Users (page)', + }, + bases=(user_model_label,), + ), + migrations.CreateModel( + name='PageUserGroup', + fields=[ + ('group_ptr', models.OneToOneField(primary_key=True, to='auth.Group', auto_created=True, parent_link=True, serialize=False, on_delete=models.CASCADE)), + ('created_by', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='created_usergroups', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'User group (page)', + 'verbose_name_plural': 'User groups (page)', + }, + bases=('auth.group',), + ), + migrations.CreateModel( + name='Placeholder', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', auto_created=True, serialize=False)), + ('slot', models.CharField(db_index=True, max_length=50, verbose_name='slot', editable=False)), +~~ ('default_width', models.PositiveSmallIntegerField(null=True, verbose_name='width', editable=False)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='page', + name='placeholders', + field=models.ManyToManyField(to='cms.Placeholder', editable=False), + preserve_default=True, + ), + +## ... source file continues with no further examples ... + +``` + + +## Example 3 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / __future__ / models.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/__future__/models.py) + +```python +# flake8: noqa +import django +~~from django.db import models as db_models +from django.forms.models import (ModelForm as _ModelForm, + ModelFormMetaclass as _ModelFormMetaclass, + modelform_factory as _modelform_factory, + modelformset_factory as _modelformset_factory, + inlineformset_factory as _inlineformset_factory, + model_to_dict, fields_for_model, BaseModelForm, + BaseModelFormSet, + BaseInlineFormSet) +if django.VERSION < (1, 9): + from django.forms.models import save_instance +from django.utils import six + +from floppyforms import fields +from floppyforms.forms import LayoutRenderer +from floppyforms.models import (ModelChoiceField, ModelMultipleChoiceField) +from floppyforms.widgets import Textarea + + +__all__ = ( + 'ModelForm', 'BaseModelForm', 'model_to_dict', 'fields_for_model', + 'ModelChoiceField', 'ModelMultipleChoiceField', + 'BaseModelFormSet', 'modelformset_factory', 'BaseInlineFormSet', + 'inlineformset_factory', +) +if django.VERSION < (1, 9): + __all__ += ('save_instance',) + + +if django.VERSION > (1, 7): + from django.forms.models import ALL_FIELDS + + __all__ = __all__ + ('ALL_FIELDS',) + + +FORMFIELD_OVERRIDES = { + db_models.BooleanField: {'form_class': fields.BooleanField}, + db_models.CharField: {'form_class': fields.CharField}, + db_models.CommaSeparatedIntegerField: {'form_class': fields.CharField}, + db_models.DateField: {'form_class': fields.DateField}, + db_models.DateTimeField: {'form_class': fields.DateTimeField}, + db_models.DecimalField: {'form_class': fields.DecimalField}, + db_models.EmailField: {'form_class': fields.EmailField}, + db_models.FilePathField: {'form_class': fields.FilePathField}, + db_models.FloatField: {'form_class': fields.FloatField}, + db_models.IntegerField: {'form_class': fields.IntegerField}, + db_models.BigIntegerField: {'form_class': fields.IntegerField}, + db_models.GenericIPAddressField: {'form_class': fields.GenericIPAddressField}, + db_models.NullBooleanField: {'form_class': fields.NullBooleanField}, + db_models.PositiveIntegerField: {'form_class': fields.IntegerField}, +~~ db_models.PositiveSmallIntegerField: {'form_class': fields.IntegerField}, + db_models.SlugField: {'form_class': fields.SlugField}, + db_models.SmallIntegerField: {'form_class': fields.IntegerField}, + db_models.TextField: {'form_class': fields.CharField, 'widget': Textarea}, + db_models.TimeField: {'form_class': fields.TimeField}, + db_models.URLField: {'form_class': fields.URLField}, + # Binary field is never editable, so we don't need to convert it. + + db_models.FileField: {'form_class': fields.FileField}, + db_models.ImageField: {'form_class': fields.ImageField}, + + db_models.ForeignKey: {'form_class': ModelChoiceField}, + db_models.ManyToManyField: {'form_class': ModelMultipleChoiceField}, + db_models.OneToOneField: {'form_class': ModelChoiceField}, +} +if django.VERSION < (1, 9): + FORMFIELD_OVERRIDES[db_models.IPAddressField] = {'form_class': fields.IPAddressField} + +for value in FORMFIELD_OVERRIDES.values(): + value['choices_form_class'] = fields.TypedChoiceField + + +def formfield_callback(db_field, **kwargs): + defaults = FORMFIELD_OVERRIDES.get(db_field.__class__, {}).copy() + defaults.update(kwargs) + return db_field.formfield(**defaults) + + +class ModelFormMetaclass(_ModelFormMetaclass): + def __new__(mcs, name, bases, attrs): + if not attrs.get('formfield_callback'): + attrs['formfield_callback'] = formfield_callback + return super(ModelFormMetaclass, mcs).__new__(mcs, name, bases, attrs) + + +class ModelForm(six.with_metaclass(ModelFormMetaclass, LayoutRenderer, _ModelForm)): + pass + + +def modelform_factory(model, form=ModelForm, fields=None, exclude=None, + formfield_callback=formfield_callback, *args, **kwargs): + return _modelform_factory(model, form, fields, exclude, formfield_callback, + *args, **kwargs) + + +def modelformset_factory(model, form=ModelForm, + formfield_callback=formfield_callback, + *args, **kwargs): + return _modelformset_factory(model, form, formfield_callback, + *args, **kwargs) + + +def inlineformset_factory(parent_model, model, form=ModelForm, + formset=BaseInlineFormSet, fk_name=None, + fields=None, exclude=None, extra=3, can_order=False, + can_delete=True, max_num=None, + formfield_callback=formfield_callback, + *args, **kwargs): + return _inlineformset_factory(parent_model, model, form, formset, fk_name, + fields, exclude, extra, can_order, + can_delete, max_num, formfield_callback, + *args, **kwargs) + +``` + + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index a675c27c3..1b36c7db5 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -27,6 +27,7 @@ on GitHub. * [django.db.models GenericIPAddressField](/django-db-models-genericipaddressfield-examples.html) * [django.db.models ImageField](/django-db-models-imagefield-examples.html) * [django.db.models PositiveIntegerField](/django-db-models-positiveintegerfield-examples.html) + * [django.db.models PositiveSmallIntegerField](/django-db-models-positiveintegerfield-examples.html) * [django.db.models.related ForeignKey](/django-db-models-related-foreignkey-examples.html) * [django.forms EmailField](/django-forms-emailfield-examples.html) * [django.forms IntegerField](/django-forms-integerfield-examples.html) diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index ce381dac7..39d228316 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -73,6 +73,7 @@

django.db.models IntegerField, Model, PositiveIntegerField, + PositiveSmallIntegerField, signal, SlugField, TextField From c46c4719f03e94a09659930d955213da12c1737b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 23 Dec 2019 13:46:16 -0500 Subject: [PATCH 031/302] update changelog and work on new extensions page --- .../sqlalchemy-example-projects.markdown | 55 +++++++++++++++++++ .../sqlalchemy/sqlalchemy-models.markdown | 4 +- content/pages/meta/00-change-log.markdown | 1 + 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown new file mode 100644 index 000000000..d8e5a4cbb --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown @@ -0,0 +1,55 @@ +title: SQLAlchemy Extensions, Plug-ins and Related Libraries +category: page +slug: sqlalchemy-extensions-plug-ins-related-libraries +sortorder: 50003000 +toc: False +sidebartitle: SQLAlchemy Extensions +meta: Python code extensions and plug-in example projects that show how to use the SQLAlchemy object-relational mapper. + + +[SQLAlchemy](/sqlalchemy.html) is a Python library for interacting +with [databases](/databases.html) either through SQL or with an +[object-relational mapper (ORM)](/object-relational-mappers-orms.html). + +SQLAlchemy logo. + + +### Alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI information](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + + +### flask-sqlalchemy +[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) +([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) +and +[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a +[Flask](/flask.html) extension that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy +provides helper functions that reduce the amount of common boilerplate +code that you have to frequently write yourself if you did not use this +library when combining Flask with SQLAlchemy. + +flask-sqlalchemy is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). + + +### marshmallow-sqlalchemy +[marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) +([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/) +and +[PyPI information](https://pypi.org/project/marshmallow-sqlalchemy/)) +is a code library that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) with the +[Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +data serialization tool. + +The marshmallow-sqlalchemy project is provided as open source under the +[MIT license](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/LICENSE). + + + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-models.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-models.markdown index 04d4eb09e..7ead84dc3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-models.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-models.markdown @@ -15,10 +15,10 @@ Python library for accessing persistent data stored in ## Example 1 from flask-website -[flask-website](https://github.com/pallets/flask-website) is the +[flask-website](https://github.com/pallets/website) is the code that runs the [Flask](/flask.html) official [project website](http://flask.pocoo.org/). Yes, Flask is used to -create and run the Flask project website. Did you expect the creators +create and run the Flask project website... did you expect the creators of Flask to use [Django](/django.html) instead? [**flask-website / flask_website / database.py**](https://github.com/pallets/flask-website/blob/master/flask_website/database.py) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 1b36c7db5..62f3e5d17 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -16,6 +16,7 @@ on GitHub. ## 2019 ### December +* 7 years of Full Stack Python as of December 23, 2019! * Cleaned a bunch of dead links out thanks to [PR #225](https://github.com/mattmakai/fullstackpython.com/pull/225). * Merged [PR #224](https://github.com/mattmakai/fullstackpython.com/pull/224) From ac45008d677f24d30bc95bab31fbedfffd87385b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 24 Dec 2019 09:59:59 -0500 Subject: [PATCH 032/302] link sections for sqlalchemy --- content/pages/03-data/06-sqlalchemy.markdown | 6 ++++++ .../sqlalchemy/sqlalchemy-example-projects.markdown | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/content/pages/03-data/06-sqlalchemy.markdown b/content/pages/03-data/06-sqlalchemy.markdown index 7e814e055..af57ed512 100644 --- a/content/pages/03-data/06-sqlalchemy.markdown +++ b/content/pages/03-data/06-sqlalchemy.markdown @@ -84,6 +84,12 @@ idiosyncratic differences between database implementations in [PostgreSQL](/postgresql.html). +### SQLAlchemy Extensions, Plug-ins and Related Libraries +Take a look at the +[SQLAlchemy extensions, plug-ins and related libraries](/sqlalchemy-extensions-plug-ins-related-libraries.html) +page for a curated list of useful code libraries to use with SQLAlchemy. + + ### Using SQLAlchemy with Web Frameworks There is no reason why you cannot use the SQLAlchemy library in any application that requires a database backend. However, if you are diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown index d8e5a4cbb..5a41a9aed 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown @@ -52,4 +52,17 @@ The marshmallow-sqlalchemy project is provided as open source under the [MIT license](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/LICENSE). +### sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). From 2a79b57f3a24fb928788a5d0f302ffbf97c47383 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 24 Dec 2019 14:32:39 -0500 Subject: [PATCH 033/302] add flask-base as example sqlalchemy project --- .../sqlalchemy-example-projects.markdown | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown index 5a41a9aed..eea9c5f94 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown @@ -38,6 +38,23 @@ flask-sqlalchemy is provided as open source under the [BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). +### flask-base +[flask-base](https://github.com/hack4impact/flask-base) +([project documentation](http://hack4impact.github.io/flask-base/)) +provides boilerplate code for new [Flask](/flask.html) web apps. +The purpose of the boilerplate is to stitch together disparate +libraries that are commonly used in Flask projects, such as +[Redis](/redis.html) for fast caching and transient data storage, +[SendGrid](https://www.twilio.com/sendgrid) for transactional email, +[SQLAlchemy](/sqlalchemy.html) for persistent data storage through a +[relational database](/databases.html) backend, +[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +handling, and many others. + +flask-base is provided as open source under the +[MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md). + + ### marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) ([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/) From 636446d97820b2245cb06f739fc40c5722938369 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 26 Dec 2019 09:39:49 -0500 Subject: [PATCH 034/302] working on code examples and projects for sqlalchemy --- .../sqlalchemy-example-projects-code.markdown | 37 ++++++++++++++++++ ...> sqlalchemy-extensions-plug-ins.markdown} | 38 +++++++++++-------- 2 files changed, 59 insertions(+), 16 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown rename content/pages/examples/sqlalchemy/{sqlalchemy-example-projects.markdown => sqlalchemy-extensions-plug-ins.markdown} (91%) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown new file mode 100644 index 000000000..9f5543ed5 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown @@ -0,0 +1,37 @@ +title: SQLAlchemy Example Projects and Code +category: page +slug: sqlalchemy-projects-code-examples +sortorder: 50003001 +toc: False +sidebartitle: SQLAlchemy Example Code +meta: Python example projects and code that show how to use the SQLAlchemy object-relational mapper (ORM). + + +[SQLAlchemy](/sqlalchemy.html) is a Python library for interacting +with [databases](/databases.html) either through SQL or with an +[object-relational mapper (ORM)](/object-relational-mappers-orms.html). + +SQLAlchemy logo. + +This page describes projects that use SQLAlchemy to accomplish some +goal, such as data analysis, running a web application's back end, +or providing a [web API](/application-programming-interfaces.html). + + +### sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown similarity index 91% rename from content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown rename to content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index eea9c5f94..8bbb9ad66 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -13,6 +13,12 @@ with [databases](/databases.html) either through SQL or with an SQLAlchemy logo. +The following projects augment SQLAlchemy's capabilities by providing +functionality not included with the library itself. For example, the +[Alembic](https://github.com/sqlalchemy/alembic) project makes it easier +to perform database schema migrations, which is frequently needed +as applications evolve and need to store additional data. + ### Alembic [Alembic](https://github.com/sqlalchemy/alembic) @@ -23,21 +29,6 @@ database schema changes. The Alembic project is open sourced under the [MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). -### flask-sqlalchemy -[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) -([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) -and -[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a -[Flask](/flask.html) extension that makes it easier to use -[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy -provides helper functions that reduce the amount of common boilerplate -code that you have to frequently write yourself if you did not use this -library when combining Flask with SQLAlchemy. - -flask-sqlalchemy is provided as open source under the -[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). - - ### flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) @@ -47,7 +38,7 @@ libraries that are commonly used in Flask projects, such as [Redis](/redis.html) for fast caching and transient data storage, [SendGrid](https://www.twilio.com/sendgrid) for transactional email, [SQLAlchemy](/sqlalchemy.html) for persistent data storage through a -[relational database](/databases.html) backend, +[relational database](/databases.html) back end, [Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form handling, and many others. @@ -55,6 +46,21 @@ flask-base is provided as open source under the [MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md). +### flask-sqlalchemy +[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) +([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) +and +[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a +[Flask](/flask.html) extension that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy +provides helper functions that reduce the amount of common boilerplate +code that you have to frequently write yourself if you did not use this +library when combining Flask with SQLAlchemy. + +flask-sqlalchemy is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). + + ### marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) ([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/) From 9cf8cd62c3bd56c56a820674ccaf0b3b957312b6 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 28 Dec 2019 15:49:29 -0500 Subject: [PATCH 035/302] add a few new resources on jupyter --- .../06-jupyter-notebook.markdown | 8 ++++++++ .../15-application-dependencies.markdown | 6 ++++++ content/pages/04-web-development/25-vuejs.markdown | 6 ++++++ .../04-web-development/51-api-integration.markdown | 13 ++++--------- .../pages/05-deployment/07-digitalocean.markdown | 13 ++++++++++++- .../sqlalchemy-extensions-plug-ins.markdown | 13 ++++++++++++- 6 files changed, 48 insertions(+), 11 deletions(-) diff --git a/content/pages/02-development-environments/06-jupyter-notebook.markdown b/content/pages/02-development-environments/06-jupyter-notebook.markdown index 239c55e5c..30ff049cc 100644 --- a/content/pages/02-development-environments/06-jupyter-notebook.markdown +++ b/content/pages/02-development-environments/06-jupyter-notebook.markdown @@ -118,6 +118,10 @@ like advanced interactive visualizations. have a ton more details on ways to set up Jupyter Notebooks as dashboards and export results to other formats. +* [Creating Interactive Dashboards from Jupyter Notebooks](https://pbpython.com/interactive-dashboards.html) + shows how to use public Reddit data for a data analysis project as + an example to display in dashboards running in a Jupyter Notebook. + * [mapboxgl-jupyter](https://github.com/mapbox/mapboxgl-jupyter) library along with the [quickstart](https://github.com/mapbox/mapboxgl-jupyter/blob/master/docs/viz.md) @@ -203,3 +207,7 @@ like advanced interactive visualizations. explains when to use [Docker](/docker.html) in combination with Jupyter Notebooks as well as the instructions for creating a dockerfile to build your images. + +* [JupyterLab GPU Dashboards](https://github.com/rapidsai/jupyterlab-nvdashboard) + contains a [Bokeh](/bokeh.html) server and TypeScript code for displaying + GPU utilization charts. diff --git a/content/pages/02-development-environments/15-application-dependencies.markdown b/content/pages/02-development-environments/15-application-dependencies.markdown index 85d07c060..0f50f5026 100644 --- a/content/pages/02-development-environments/15-application-dependencies.markdown +++ b/content/pages/02-development-environments/15-application-dependencies.markdown @@ -210,6 +210,12 @@ developers. breaks open the virtual environment "black box" to show you what the tool is doing when you use its commands. +* [Using pyenv to manage your Python interpreters](https://www.marc-richter.info/using-pyenv-to-manage-your-python-interpreters/) + explains how the pyenv tool can make it easier to switch between different + versions of Python for each project and gives a brief review of the + important things to know when using the tool such as local versus global + scope. + * [Testing & Packaging](https://hynek.me/articles/testing-packaging/) examines a configuration for ensuring tests run against your code and how to properly package your project. diff --git a/content/pages/04-web-development/25-vuejs.markdown b/content/pages/04-web-development/25-vuejs.markdown index c3670d4d4..92b3814b6 100644 --- a/content/pages/04-web-development/25-vuejs.markdown +++ b/content/pages/04-web-development/25-vuejs.markdown @@ -62,6 +62,12 @@ rich apps that run in web browsers. posturing that often comes from authors of one project discussing other work in the same space. +* [Build a Crud application using Vue and Django](https://codesource.io/build-a-crud-application-vue-and-django/) + combines [Django](/django.html) and + [Django REST Framework](/django-rest-framework-drf.html) with Vue.js in + this tutorial that shows how to build a simple web app for managing + subscriptions. + * [Building Modern Applications with Django and Vue.js](https://auth0.com/blog/building-modern-applications-with-django-and-vuejs/) combines [Django](/django.html), [Django REST Framework](/django-rest-framework-drf.html), Vue.js diff --git a/content/pages/04-web-development/51-api-integration.markdown b/content/pages/04-web-development/51-api-integration.markdown index 0477bb86b..ecf006c20 100644 --- a/content/pages/04-web-development/51-api-integration.markdown +++ b/content/pages/04-web-development/51-api-integration.markdown @@ -20,16 +20,11 @@ continuously grows in importance because APIs provide critical functionality across many implementation areas. -## API testing services -* [Runscope](https://www.runscope.com/) is a service specifically designed - for APIs that assists developers with automated testing and traffic - inspection. - -* [Apiary](https://apiary.io/) provides a blueprint for creating APIs so - they are easier to test and generate clean documentation. - - ## API Integration Resources +* [APIs for Beginners](https://www.freecodecamp.org/news/apis-for-beginners-full-course/) + is an awesome free video course that shows how to use APIs and + add them to applications with a bunch of useful code examples. + * Some developers prefer to use [Requests](http://docs.python-requests.org/en/latest/) instead of an API's helper library. In that case check out this diff --git a/content/pages/05-deployment/07-digitalocean.markdown b/content/pages/05-deployment/07-digitalocean.markdown index 8bf6d5103..359f05579 100644 --- a/content/pages/05-deployment/07-digitalocean.markdown +++ b/content/pages/05-deployment/07-digitalocean.markdown @@ -13,7 +13,7 @@ platform that can be used for running Python applications. Official DigitalOcean logo. Copyright DigitalOcean. -### DigitalOcean examples +### DigitalOcean resources * [Creating a Kubernetes Cluster on DigitalOcean with Python and Fabric](https://testdriven.io/blog/creating-a-kubernetes-cluster-on-digitalocean/) shows how to configure a three node Kubernetes cluster using [Ubuntu](/ubuntu.html) 16.04 LTS. @@ -27,3 +27,14 @@ platform that can be used for running Python applications. [digitalocean-developer-firewall](https://github.com/ErlendEllingsen/digitalocean-developer-firewall) to make it easier to configure firewalls and other services on your droplets. + + +### Useful tools for working with DigitalOcean +* [python-digitalocean](https://github.com/koalalorenzo/python-digitalocean) + is a helper library for interacting with + [DigitalOcean's APIs](https://developers.digitalocean.com/) so you can, + for example, spin up and shut down your servers. + +* [vagrant-digitalocean](https://github.com/devopsgroup-io/vagrant-digitalocean) + is a [Vagrant](https://www.vagrantup.com/) provider plugin for managing + DigitalOcean infrastructure. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index 8bbb9ad66..f34d5516e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -61,11 +61,22 @@ flask-sqlalchemy is provided as open source under the [BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). +### gino +[gino](https://github.com/fantix/gino) +([project documentation](https://python-gino.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/gino/)) +is an [object-relational mapper (ORM)](/object-relational-mappers-orms.html) +built on SQLAlchemy that is non-blocking and therefore designed to work properly +with asynchronously-run code, for example, an application written with +[asyncio](https://docs.python.org/3/library/asyncio.html). + + ### marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) ([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/) and -[PyPI information](https://pypi.org/project/marshmallow-sqlalchemy/)) +[PyPI package information](https://pypi.org/project/marshmallow-sqlalchemy/)) is a code library that makes it easier to use [SQLAlchemy](/sqlalchemy.html) with the [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) From d448cc7dbe34da763b0eedb1be3ccb935b0d1ca3 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 29 Dec 2019 09:30:42 -0500 Subject: [PATCH 036/302] updating GINO description on sqlalchemy page --- .../sqlalchemy/sqlalchemy-extensions-plug-ins.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index f34d5516e..69a96f72a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -61,8 +61,8 @@ flask-sqlalchemy is provided as open source under the [BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). -### gino -[gino](https://github.com/fantix/gino) +### GINO +[GINO](https://github.com/fantix/gino) ([project documentation](https://python-gino.readthedocs.io/en/latest/) and [PyPI package information](https://pypi.org/project/gino/)) @@ -71,6 +71,8 @@ built on SQLAlchemy that is non-blocking and therefore designed to work properly with asynchronously-run code, for example, an application written with [asyncio](https://docs.python.org/3/library/asyncio.html). +GINO is open sourced under the [BSD License](https://github.com/python-gino/gino/blob/master/LICENSE). + ### marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) From feddc67aeeff01d2d2c28ba02690c18d53a9cf08 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 29 Dec 2019 13:00:51 -0500 Subject: [PATCH 037/302] add testing resources --- .../15-application-dependencies.markdown | 5 +++++ content/pages/04-web-development/35-testing.markdown | 10 ++++++++++ .../pages/04-web-development/36-unit-testing.markdown | 5 +++++ .../pages/04-web-development/42-websockets.markdown | 6 ++++++ 4 files changed, 26 insertions(+) diff --git a/content/pages/02-development-environments/15-application-dependencies.markdown b/content/pages/02-development-environments/15-application-dependencies.markdown index 0f50f5026..a01f2eba9 100644 --- a/content/pages/02-development-environments/15-application-dependencies.markdown +++ b/content/pages/02-development-environments/15-application-dependencies.markdown @@ -220,6 +220,11 @@ developers. a configuration for ensuring tests run against your code and how to properly package your project. +* [12 Alternatives for Distributing Python Applications in 2020](https://tryexceptpass.org/article/distributing-python-applications/) + covers packaging with [Docker](/docker.html), Vagrant, PyInstaller, + Briefcase, virtual environments, Pipx and several more options for + bundling and running Python code. + * [Python Application Dependency Management in 2018](https://hynek.me/articles/python-app-deps-2018/) presents some critical analysis and critique oof the existing Python dependency management tools including newer ones such as pipenv and diff --git a/content/pages/04-web-development/35-testing.markdown b/content/pages/04-web-development/35-testing.markdown index 1cc035882..a69c8f126 100644 --- a/content/pages/04-web-development/35-testing.markdown +++ b/content/pages/04-web-development/35-testing.markdown @@ -85,6 +85,16 @@ test runners, coverage reports and related libraries. * [Python Testing](http://pythontesting.net/) is a site devoted to testing in - you guessed it - the Python programming language. +* [In praise of property-based testing](https://increment.com/testing/in-praise-of-property-based-testing/) + is an article by the author of the [Hypothesis](https://hypothesis.works/) + testing tool written in Python. The article explains the shortcomings of + example-based tests and how property-based testing can augment or replace + those example-based tests to find more defects in software. There is also + a great + [introductory post on Hypothesis](https://hypothesis.works/articles/incremental-property-based-testing/) + that goes into further detail about getting your first Hypothesis tests + up and running. + * Google has a [testing blog](http://googletesting.blogspot.com/) where they write about various aspects of testing software at scale. diff --git a/content/pages/04-web-development/36-unit-testing.markdown b/content/pages/04-web-development/36-unit-testing.markdown index 04ce07fa4..86bebc128 100644 --- a/content/pages/04-web-development/36-unit-testing.markdown +++ b/content/pages/04-web-development/36-unit-testing.markdown @@ -102,6 +102,11 @@ Python-specific applications. is the transcript of an interview with Robert Collins who is a core committer of `unittest`. +* [Precise Unit Tests with PyHamcrest](https://orbifold.xyz/pyhamcrest.html) + is a short tutorial on using the + [PyHamcrest](https://github.com/hamcrest/PyHamcrest) assertion tool for + unit testing. + * [Why most unit testing is a waste](https://rbcs-us.com/documents/Why-Most-Unit-Testing-is-Waste.pdf) discusses how low risk unit tests rarely fail even as the code changes and why they do not matter as much to a project's health as diff --git a/content/pages/04-web-development/42-websockets.markdown b/content/pages/04-web-development/42-websockets.markdown index 3125b4f5c..fb8293c46 100644 --- a/content/pages/04-web-development/42-websockets.markdown +++ b/content/pages/04-web-development/42-websockets.markdown @@ -272,6 +272,12 @@ Python. [handy WebSockets reference chart](http://caniuse.com/#feat=websockets) for which web browsers and specific versions support WebSockets. +* [WebSockets for fun and profit](https://stackoverflow.blog/2019/12/18/websockets-for-fun-and-profit/) + has a nice concise overview of WebSockets alternatives like long polling + and Server-Sent Events (SSE) before it goes into a WebSockets example + that includes [JavaScript](/javascript.html) code for the client-side + implementation. + * Mozilla's [Developer Resources for WebSockets](https://developer.mozilla.org/en-US/docs/WebSockets) is a good place to find documentation and tools for developing with From 048abbcfa3ac40d19cb72092aff4919fa54f65de Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 29 Dec 2019 13:17:23 -0500 Subject: [PATCH 038/302] update footer. add bash resource --- .../pages/02-development-environments/08-bash-shell.markdown | 5 +++++ theme/templates/base.html | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/content/pages/02-development-environments/08-bash-shell.markdown b/content/pages/02-development-environments/08-bash-shell.markdown index 47369ef89..7e553ed6e 100644 --- a/content/pages/02-development-environments/08-bash-shell.markdown +++ b/content/pages/02-development-environments/08-bash-shell.markdown @@ -97,3 +97,8 @@ during Python software development as part of a programmer's shows how to make your Bash history more useful by having it store more previous commands (which takes up more persistent storage but is not a huge deal in 2019) and add timestamps to the `history` command. + +* [9 Evil Bash Commands Explained](https://dev.to/devmount/9-evil-bash-commands-explained-4k5e) + presents a list of commands *you should never run*, but can learn about + their destructive abilities by reading through the descriptions provided + by the author. diff --git a/theme/templates/base.html b/theme/templates/base.html index cb5a0d5cf..f477ca1c7 100644 --- a/theme/templates/base.html +++ b/theme/templates/base.html @@ -17,7 +17,7 @@ {% block content %}{% endblock %}
{% block lower_banner %}{% endblock %} - + {% block bottom_banner %}{% endblock %} {% block js %}{% endblock %} From 21fbf51ae00cd67802dc26bc91ac1bc6870435b2 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 30 Dec 2019 15:14:38 -0500 Subject: [PATCH 039/302] reorder code examples in side bar --- .../django-apps-config-AppConfig.markdown | 2 +- .../django-conf-settings-examples.markdown | 2 +- .../django/django-conf-urls-url.markdown | 2 +- ...go-contrib-admin-simplelistfilter.markdown | 2 +- ...jango-contrib-admin-site-register.markdown | 2 +- .../django/django-contrib-admin.markdown | 2 +- ...ib-auth-decorators-login-required.markdown | 2 +- ...jango-contrib-auth-get-user-model.markdown | 2 +- ...ontrib-auth-hashers-make-password.markdown | 2 +- ...e-exceptions-improperlyconfigured.markdown | 2 +- ...o-core-mail-messages-emailmessage.markdown | 2 +- .../django-core-mail-send-mail.markdown | 2 +- ...-core-management-base-basecommand.markdown | 2 +- .../django-db-models-autofield.markdown | 2 +- .../django-db-models-booleanfield.markdown | 2 +- .../django-db-models-charfield.markdown | 2 +- .../django-db-models-datefield.markdown | 2 +- .../django-db-models-datetimefield.markdown | 2 +- .../django-db-models-filefield.markdown | 2 +- .../django-db-models-foreignkey.markdown | 2 +- ...o-db-models-genericipaddressfield.markdown | 2 +- .../django-db-models-imagefield.markdown | 2 +- .../django-db-models-integerfield.markdown | 2 +- .../django/django-db-models-model.markdown | 2 +- ...go-db-models-positiveintegerfield.markdown | 2 +- ...-models-positivesmallintegerfield.markdown | 2 +- .../django/django-db-models-signals.markdown | 2 +- .../django-db-models-slugfield.markdown | 2 +- .../django-db-models-textfield.markdown | 2 +- .../django-db-operationalerror.markdown | 2 +- ...django-dispatch-dispatcher-signal.markdown | 2 +- .../django-example-projects-code.markdown | 105 ++++++++++++++++++ ...wn => django-extensions-plug-ins.markdown} | 105 ++---------------- .../django/django-forms-booleanfield.markdown | 2 +- .../django/django-forms-charfield.markdown | 2 +- .../django/django-forms-choicefield.markdown | 2 +- .../django/django-forms-emailfield.markdown | 2 +- .../django/django-forms-integerfield.markdown | 2 +- .../examples/django/django-forms.markdown | 2 +- .../django/django-http-http404.markdown | 2 +- .../django/django-http-httpresponse.markdown | 2 +- ...jango-http-httpresponsebadrequest.markdown | 2 +- ...django-http-httpresponseforbidden.markdown | 2 +- ...ango-http-httpresponsenotmodified.markdown | 2 +- ...esponsepermanentredirect-examples.markdown | 2 +- .../django-http-httpresponseredirect.markdown | 2 +- ...e-response-simpletemplateresponse.markdown | 2 +- ...emplate-response-templateresponse.markdown | 2 +- ...go-urls-exceptions-noreversematch.markdown | 2 +- .../examples/django/django-urls-path.markdown | 2 +- .../django/django-urls-reverse-lazy.markdown | 2 +- .../django-utils-html-format-html.markdown | 2 +- .../django/django-utils-timezone.markdown | 2 +- .../flask/flask-code-examples.markdown | 2 +- .../examples/flask/flask-redirect.markdown | 2 +- .../examples/flask/flask-request.markdown | 2 +- .../flask/flask-sqlalchemy-model.markdown | 2 +- .../sqlalchemy-example-projects-code.markdown | 2 +- .../sqlalchemy-extensions-plug-ins.markdown | 2 +- .../sqlalchemy/sqlalchemy-models.markdown | 4 +- theme/templates/article.html | 10 -- theme/templates/desktop-toc.html | 3 +- theme/templates/page.html | 4 - theme/templates/table-of-contents.html | 21 +++- 64 files changed, 195 insertions(+), 171 deletions(-) create mode 100644 content/pages/examples/django/django-example-projects-code.markdown rename content/pages/examples/django/{django-code-examples.markdown => django-extensions-plug-ins.markdown} (83%) diff --git a/content/pages/examples/django/django-apps-config-AppConfig.markdown b/content/pages/examples/django/django-apps-config-AppConfig.markdown index e4d5f2f88..22a6e09bb 100644 --- a/content/pages/examples/django/django-apps-config-AppConfig.markdown +++ b/content/pages/examples/django/django-apps-config-AppConfig.markdown @@ -1,7 +1,7 @@ title: django.apps.config AppConfig Example Code category: page slug: django-apps-config-appconfig-examples -sortorder: 50067 +sortorder: 500010020 toc: False sidebartitle: django.apps.config AppConfig meta: Python code examples for the AppConfig class that is part of Django's django.apps.config package. diff --git a/content/pages/examples/django/django-conf-settings-examples.markdown b/content/pages/examples/django/django-conf-settings-examples.markdown index 39309d5e6..473b083f8 100644 --- a/content/pages/examples/django/django-conf-settings-examples.markdown +++ b/content/pages/examples/django/django-conf-settings-examples.markdown @@ -1,7 +1,7 @@ title: django.conf settings Example Code category: page slug: django-conf-settings-examples -sortorder: 50010 +sortorder: 500010050 toc: False sidebartitle: django.conf settings meta: Python code examples for Django settings files. diff --git a/content/pages/examples/django/django-conf-urls-url.markdown b/content/pages/examples/django/django-conf-urls-url.markdown index efdb36ba2..6540e8fe8 100644 --- a/content/pages/examples/django/django-conf-urls-url.markdown +++ b/content/pages/examples/django/django-conf-urls-url.markdown @@ -1,7 +1,7 @@ title: django.conf.urls.url Example Code category: page slug: django-conf-urls-url-examples -sortorder: 50001 +sortorder: 500010055 toc: False sidebartitle: django.conf.urls.url meta: Python code examples for the url function within the django.conf.urls module of the Django project. diff --git a/content/pages/examples/django/django-contrib-admin-simplelistfilter.markdown b/content/pages/examples/django/django-contrib-admin-simplelistfilter.markdown index 95cbf7c28..ad21c4cd7 100644 --- a/content/pages/examples/django/django-contrib-admin-simplelistfilter.markdown +++ b/content/pages/examples/django/django-contrib-admin-simplelistfilter.markdown @@ -1,7 +1,7 @@ title: django.contrib.admin.filters SimpleListFilter Example Code category: page slug: django-contrib-admin-filters-simplelistfilter-examples -sortorder: 50055 +sortorder: 500010185 toc: False sidebartitle: django.contrib.admin.filters SimpleListFilter meta: Python code examples for using the SimpleListFilter class contained within django.contrib.admin.filters. diff --git a/content/pages/examples/django/django-contrib-admin-site-register.markdown b/content/pages/examples/django/django-contrib-admin-site-register.markdown index c7dd01df0..1347d8d86 100644 --- a/content/pages/examples/django/django-contrib-admin-site-register.markdown +++ b/content/pages/examples/django/django-contrib-admin-site-register.markdown @@ -1,7 +1,7 @@ title: django.contrib.admin.sites register Example Code category: page slug: django-contrib-admin-sites-register-examples -sortorder: 50016 +sortorder: 500010190 toc: False sidebartitle: django.contrib.admin.sites register meta: Python code examples for the admin module within django.contrib of the Django project. diff --git a/content/pages/examples/django/django-contrib-admin.markdown b/content/pages/examples/django/django-contrib-admin.markdown index 8afb9ece2..cd777b273 100644 --- a/content/pages/examples/django/django-contrib-admin.markdown +++ b/content/pages/examples/django/django-contrib-admin.markdown @@ -1,7 +1,7 @@ title: django.contrib.admin Example Code category: page slug: django-contrib-admin-examples -sortorder: 50001 +sortorder: 500010155 toc: False sidebartitle: django.contrib.admin meta: Python code examples for the admin module within django.contrib of the Django project. diff --git a/content/pages/examples/django/django-contrib-auth-decorators-login-required.markdown b/content/pages/examples/django/django-contrib-auth-decorators-login-required.markdown index 8f7811b10..7b0bdd276 100644 --- a/content/pages/examples/django/django-contrib-auth-decorators-login-required.markdown +++ b/content/pages/examples/django/django-contrib-auth-decorators-login-required.markdown @@ -1,7 +1,7 @@ title: django.contrib.auth.decorators login_required Example Python Code category: page slug: django-contrib-auth-decorators-login-required-examples -sortorder: 50025 +sortorder: 500012150 toc: False sidebartitle: django.contrib.auth.decorators login_required meta: Python code examples for the Django function login_required from the django.contrib.auth.decorators module. diff --git a/content/pages/examples/django/django-contrib-auth-get-user-model.markdown b/content/pages/examples/django/django-contrib-auth-get-user-model.markdown index 9ea16e016..636b08148 100644 --- a/content/pages/examples/django/django-contrib-auth-get-user-model.markdown +++ b/content/pages/examples/django/django-contrib-auth-get-user-model.markdown @@ -1,7 +1,7 @@ title: django.contrib.auth get_user_model Example Code category: page slug: django-contrib-auth-get-user-model-examples -sortorder: 50024 +sortorder: 500012205 toc: False sidebartitle: django.contrib.auth get_user_model meta: Python code examples for the Django function get_user_model from the django.contrib.auth module. diff --git a/content/pages/examples/django/django-contrib-auth-hashers-make-password.markdown b/content/pages/examples/django/django-contrib-auth-hashers-make-password.markdown index 23fb0d07f..921f2afdc 100644 --- a/content/pages/examples/django/django-contrib-auth-hashers-make-password.markdown +++ b/content/pages/examples/django/django-contrib-auth-hashers-make-password.markdown @@ -1,7 +1,7 @@ title: django.contrib.auth.hashers make_password Python Code Examples category: page slug: django-contrib-auth-hashers-make-password-examples -sortorder: 50035 +sortorder: 500012210 toc: False sidebartitle: django.contrib.auth.hashers make_password meta: Python code examples for the Django function make_password from the django.contrib.auth.hashers module. diff --git a/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown b/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown index c04bf6cbd..d38b11d7a 100644 --- a/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown +++ b/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown @@ -1,7 +1,7 @@ title: django.core.exceptions ImproperlyConfigured Example Code category: page slug: django-core-exceptions-improperlyconfigured -sortorder: 50030 +sortorder: 500012505 toc: False sidebartitle: django.core.exceptions ImproperlyConfigured meta: Python code examples for the ImproperlyConfigured exception class provided by the Django codebase. diff --git a/content/pages/examples/django/django-core-mail-messages-emailmessage.markdown b/content/pages/examples/django/django-core-mail-messages-emailmessage.markdown index 4efa7923e..0ace861a3 100644 --- a/content/pages/examples/django/django-core-mail-messages-emailmessage.markdown +++ b/content/pages/examples/django/django-core-mail-messages-emailmessage.markdown @@ -1,7 +1,7 @@ title: django.core.mail.messages EmailMessage Example Code category: page slug: django-core-mail-messages-emailmessage-examples -sortorder: 50007 +sortorder: 500012515 toc: False sidebartitle: django.core.mail.messages EmailMessage meta: Python code examples for the EmailMessage function within the django.core.mail module of the Django project. diff --git a/content/pages/examples/django/django-core-mail-send-mail.markdown b/content/pages/examples/django/django-core-mail-send-mail.markdown index 9c40844b6..8a2557a82 100644 --- a/content/pages/examples/django/django-core-mail-send-mail.markdown +++ b/content/pages/examples/django/django-core-mail-send-mail.markdown @@ -1,7 +1,7 @@ title: django.core.mail.send_mail Example Code category: page slug: django-core-mail-send-mail-examples -sortorder: 50006 +sortorder: 500012525 toc: False sidebartitle: django.core.mail.send_mail meta: Python code examples for the send_mail function within the django.core.mail module of the Django project. diff --git a/content/pages/examples/django/django-core-management-base-basecommand.markdown b/content/pages/examples/django/django-core-management-base-basecommand.markdown index 4dff24fdb..f846e62b9 100644 --- a/content/pages/examples/django/django-core-management-base-basecommand.markdown +++ b/content/pages/examples/django/django-core-management-base-basecommand.markdown @@ -1,7 +1,7 @@ title: django.core.management.base BaseCommand Example Code category: page slug: django-core-management-base-basecommand-examples -sortorder: 50018 +sortorder: 500012545 toc: False sidebartitle: django.core.management.base BaseCommand meta: Python code examples for Django management commands. diff --git a/content/pages/examples/django/django-db-models-autofield.markdown b/content/pages/examples/django/django-db-models-autofield.markdown index f8eac608b..441ea372b 100644 --- a/content/pages/examples/django/django-db-models-autofield.markdown +++ b/content/pages/examples/django/django-db-models-autofield.markdown @@ -1,7 +1,7 @@ title: django.db.models AutoField Example Code category: page slug: django-db-models-autofield-examples -sortorder: 50107 +sortorder: 500012805 toc: False sidebartitle: django.db.models AutoField meta: Python code examples for the AutoField class used in the Django ORM, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-booleanfield.markdown b/content/pages/examples/django/django-db-models-booleanfield.markdown index d961f5ca8..5a17af305 100644 --- a/content/pages/examples/django/django-db-models-booleanfield.markdown +++ b/content/pages/examples/django/django-db-models-booleanfield.markdown @@ -1,7 +1,7 @@ title: django.db.models BooleanField Example Code category: page slug: django-db-models-booleanfield-examples -sortorder: 50103 +sortorder: 500012810 toc: False sidebartitle: django.db.models BooleanField meta: Python code examples for the BooleanField class used with the Django ORM to create a Boolean column in a database. diff --git a/content/pages/examples/django/django-db-models-charfield.markdown b/content/pages/examples/django/django-db-models-charfield.markdown index 2277586c6..89e0072c5 100644 --- a/content/pages/examples/django/django-db-models-charfield.markdown +++ b/content/pages/examples/django/django-db-models-charfield.markdown @@ -1,7 +1,7 @@ title: django.db.models CharField Example Code category: page slug: django-db-models-charfield-examples -sortorder: 50101 +sortorder: 500012815 toc: False sidebartitle: django.db.models CharField meta: Python code examples for the CharField class used in the Django ORM, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-datefield.markdown b/content/pages/examples/django/django-db-models-datefield.markdown index 0dbd24987..50598de59 100644 --- a/content/pages/examples/django/django-db-models-datefield.markdown +++ b/content/pages/examples/django/django-db-models-datefield.markdown @@ -1,7 +1,7 @@ title: django.db.models DateField Example Code category: page slug: django-db-models-datefield-examples -sortorder: 50109 +sortorder: 500012820 toc: False sidebartitle: django.db.models DateField meta: Python code examples for the DateField class used in the Django ORM, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-datetimefield.markdown b/content/pages/examples/django/django-db-models-datetimefield.markdown index 407ad55dd..941aeb8d0 100644 --- a/content/pages/examples/django/django-db-models-datetimefield.markdown +++ b/content/pages/examples/django/django-db-models-datetimefield.markdown @@ -1,7 +1,7 @@ title: django.db.models DateTimeField Example Code category: page slug: django-db-models-datetimefield-examples -sortorder: 50105 +sortorder: 500012825 toc: False sidebartitle: django.db.models DateTimeField meta: Python code examples for the DateTimeField class provided by the Django ORM. DateTimeField is found within the django.db.models module. diff --git a/content/pages/examples/django/django-db-models-filefield.markdown b/content/pages/examples/django/django-db-models-filefield.markdown index 5dc6f6760..f7808dde6 100644 --- a/content/pages/examples/django/django-db-models-filefield.markdown +++ b/content/pages/examples/django/django-db-models-filefield.markdown @@ -1,7 +1,7 @@ title: django.db.models FileField Example Code category: page slug: django-db-models-filefield-examples -sortorder: 50127 +sortorder: 500012830 toc: False sidebartitle: django.db.models FileField meta: Python code examples for the FileField class used in the Django ORM, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-foreignkey.markdown b/content/pages/examples/django/django-db-models-foreignkey.markdown index 87f1152b1..287969371 100644 --- a/content/pages/examples/django/django-db-models-foreignkey.markdown +++ b/content/pages/examples/django/django-db-models-foreignkey.markdown @@ -1,7 +1,7 @@ title: django.db.models ForeignKey Python Code Examples category: page slug: django-db-models-foreignkey-examples -sortorder: 50132 +sortorder: 500012840 toc: False sidebartitle: django.db.models ForeignKey meta: Python code examples for the ForeignKey class used in the Django ORM, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-genericipaddressfield.markdown b/content/pages/examples/django/django-db-models-genericipaddressfield.markdown index 4f95d410c..c45925d6a 100644 --- a/content/pages/examples/django/django-db-models-genericipaddressfield.markdown +++ b/content/pages/examples/django/django-db-models-genericipaddressfield.markdown @@ -1,7 +1,7 @@ title: django.db.models GenericIPAddressField Python Code Examples category: page slug: django-db-models-genericipaddressfield-examples -sortorder: 50127 +sortorder: 500012850 toc: False sidebartitle: django.db.models GenericIPAddressField meta: Python code examples for the GenericIPAddressField class used in the Django ORM, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-imagefield.markdown b/content/pages/examples/django/django-db-models-imagefield.markdown index a2a1652bd..54b65af85 100644 --- a/content/pages/examples/django/django-db-models-imagefield.markdown +++ b/content/pages/examples/django/django-db-models-imagefield.markdown @@ -1,7 +1,7 @@ title: django.db.models ImageField Python Code Examples category: page slug: django-db-models-imagefield-examples -sortorder: 50130 +sortorder: 500012860 toc: False sidebartitle: django.db.models ImageField meta: Python code examples for the ImageField class used in the Django ORM, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-integerfield.markdown b/content/pages/examples/django/django-db-models-integerfield.markdown index 64d111558..da69ac7dc 100644 --- a/content/pages/examples/django/django-db-models-integerfield.markdown +++ b/content/pages/examples/django/django-db-models-integerfield.markdown @@ -1,7 +1,7 @@ title: django.db.models IntegerField Example Code category: page slug: django-db-models-integerfield-examples -sortorder: 50105 +sortorder: 500012870 toc: False sidebartitle: django.db.models IntegerField meta: Python code examples for the IntegerField class used in the Django ORM, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-model.markdown b/content/pages/examples/django/django-db-models-model.markdown index 1429d41d4..126616df1 100644 --- a/content/pages/examples/django/django-db-models-model.markdown +++ b/content/pages/examples/django/django-db-models-model.markdown @@ -1,7 +1,7 @@ title: django.db.models Model Example Code category: page slug: django-db-models-model-examples -sortorder: 50002 +sortorder: 500012875 toc: False sidebartitle: django.db.models Model meta: Python code examples for the Model class within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-positiveintegerfield.markdown b/content/pages/examples/django/django-db-models-positiveintegerfield.markdown index 7531262bc..4a141e4e3 100644 --- a/content/pages/examples/django/django-db-models-positiveintegerfield.markdown +++ b/content/pages/examples/django/django-db-models-positiveintegerfield.markdown @@ -1,7 +1,7 @@ title: django.db.models PositiveIntegerField Example Code category: page slug: django-db-models-positiveintegerfield-examples -sortorder: 50135 +sortorder: 500012880 toc: False sidebartitle: django.db.models PositiveIntegerField meta: Python code examples for the PositiveIntegerField class used in the Django ORM, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown b/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown index afe0fdea8..f7ce54dbf 100644 --- a/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown +++ b/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown @@ -1,7 +1,7 @@ title: django.db.models PositiveSmallIntegerField Python Code Examples category: page slug: django-db-models-positivesmallintegerfield-examples -sortorder: 50136 +sortorder: 500012890 toc: False sidebartitle: django.db.models PositiveSmallIntegerField meta: Python code examples for the PositiveSmallIntegerField class used in the Django ORM, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-signals.markdown b/content/pages/examples/django/django-db-models-signals.markdown index c40bd66cc..db56f695d 100644 --- a/content/pages/examples/django/django-db-models-signals.markdown +++ b/content/pages/examples/django/django-db-models-signals.markdown @@ -1,7 +1,7 @@ title: django.db.models signal Example Code category: page slug: django-db-models-signal-examples -sortorder: 50005 +sortorder: 500012895 toc: False sidebartitle: django.db.models.signal meta: Python code examples for database signals within a Django project. diff --git a/content/pages/examples/django/django-db-models-slugfield.markdown b/content/pages/examples/django/django-db-models-slugfield.markdown index 7423eb194..c08c2c60a 100644 --- a/content/pages/examples/django/django-db-models-slugfield.markdown +++ b/content/pages/examples/django/django-db-models-slugfield.markdown @@ -1,7 +1,7 @@ title: django.db.models SlugField Example Code category: page slug: django-db-models-slugfield-examples -sortorder: 50157 +sortorder: 500012900 toc: False sidebartitle: django.db.models SlugField meta: Python code examples for the Django ORM's SlugField class, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-models-textfield.markdown b/content/pages/examples/django/django-db-models-textfield.markdown index 193d20be6..cbb4a856b 100644 --- a/content/pages/examples/django/django-db-models-textfield.markdown +++ b/content/pages/examples/django/django-db-models-textfield.markdown @@ -1,7 +1,7 @@ title: django.db.models TextField Python Example Code category: page slug: django-db-models-textfield-examples -sortorder: 50102 +sortorder: 500012910 toc: False sidebartitle: django.db.models TextField meta: Python code examples for the Django ORM's TextField class, found within the django.db.models module of the Django project. diff --git a/content/pages/examples/django/django-db-operationalerror.markdown b/content/pages/examples/django/django-db-operationalerror.markdown index fc7b84765..fb12b0118 100644 --- a/content/pages/examples/django/django-db-operationalerror.markdown +++ b/content/pages/examples/django/django-db-operationalerror.markdown @@ -1,7 +1,7 @@ title: django.db OperationalError Example Code category: page slug: django-db-operationalerror-examples -sortorder: 50069 +sortorder: 500012920 toc: False sidebartitle: django.db OperationalError meta: Python code examples for the OperationalError exception class that is part of Django web framework's django.db package. diff --git a/content/pages/examples/django/django-dispatch-dispatcher-signal.markdown b/content/pages/examples/django/django-dispatch-dispatcher-signal.markdown index 300e87f4b..8a75bba5c 100644 --- a/content/pages/examples/django/django-dispatch-dispatcher-signal.markdown +++ b/content/pages/examples/django/django-dispatch-dispatcher-signal.markdown @@ -1,7 +1,7 @@ title: django.dispatch Signal Example Code category: page slug: django-dispatch-dispatcher-signal-examples -sortorder: 50004 +sortorder: 500012930 toc: False sidebartitle: django.dispatch Signal meta: Python code examples for the Signal class within the django.dispatch module of the Django project. diff --git a/content/pages/examples/django/django-example-projects-code.markdown b/content/pages/examples/django/django-example-projects-code.markdown new file mode 100644 index 000000000..06ec638a9 --- /dev/null +++ b/content/pages/examples/django/django-example-projects-code.markdown @@ -0,0 +1,105 @@ +title: Django Example Projects and Code +category: page +slug: django-code-examples +sortorder: 500010001 +toc: False +sidebartitle: Django Example Code +meta: Python example projects and code that show how to use the Django web application framework. + + +[Django](/django.html) is a Python [web framework](/web-frameworks.html). + +Official Django logo. Trademark Django Software Foundation. + +Part of Django's widespread adoption comes from its broad ecosystem of +open source code libraries and example projects. + +It's good to familiarize yourself with the following projects to +learn what is available to you beyond the extensive +"[batteries-included](https://www.quora.com/Why-does-Django-tout-itself-as-a-batteries-included-web-framework-when-you-have-to-manually-write-regexes-to-do-URL-routing)" +code base. + +These projects, ordered alphabetically, are also helpful as example +code for how to build your own applications. + + +### dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +dccnsys is shown on the following code example pages: + +* [django.apps.config AppConfig](/django-apps-config-appconfig-examples.html) +* [django.contrib.auth get_user_model](/django-contrib-auth-get-user-model-examples.html) +* [django.contrib.auth.decorators login_required](/django-contrib-auth-decorators-login-required-examples.html) +* [django.db.models DateField](/django-db-models-datefield-examples.html) +* [django.db.models IntegerField](/django-db-models-integerfield-examples.html) +* [django.http HttpResponseForbidden](/django-http-httpresponseforbidden-examples.html) +* [django.urls.path](/django-urls-path-examples.html) + + +### dmd-interpreter +[dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) +([running web app](http://www.dmd.nl/DOVE)) +is a Python tool to aggregate clinically relevant information related +to variants in the DMD gene and display that [data](/data.html) to a user +with a [Django](/django.html) web application. + + +### drf-action-serializer +[drf-action-serializer](https://github.com/gregschmit/drf-action-serializer) +([PyPI page](https://pypi.org/project/drf-action-serializer/)) +is an extension for [Django REST Framework](/django-rest-framework-drf.html) +that makes it easier to configure specific serializers to use based on the +client's request action. For example, a list view should have one serializer +whereas the detail view would have a different serializer. + +The project is open source under the +[MIT license](https://github.com/gregschmit/drf-action-serializer/blob/master/LICENSE). + +There are code examples from the drf-action-serializer project on the +following pages: + +* [django.urls.path](/django-urls-path-examples.html) + + +### gadget-board +[gadget-board](https://github.com/mik4el/gadget-board) is a +[Django](/django.html), +[Django REST Framework (DRF)](/django-rest-framework-drf.html) and +[Angular](/angular.html) web application that is open source under the +[Apache2 license](https://github.com/mik4el/gadget-board/blob/master/LICENSE). + +Additional example code found within gadget-board: + +* [django.apps.config AppConfig](/django-apps-config-appconfig-examples.html) +* [django.conf.urls url](/django-conf-urls-url-examples.html) +* [django.contrib admin](/django-contrib-admin-examples.html) +* [django.contrib.auth.hashers make_password](/django-contrib-auth-hashers-make-password-examples.html) + + +### jazzband +[jazzband](https://github.com/jazzband/website) is a +[Django](/django.html)-based web application that runs a website with +information on many Django projects such as +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +and [django-taggit](https://github.com/jazzband/django-taggit). + +The project's code is provided as open source under the +[MIT license](https://github.com/jazzband/website/blob/master/LICENSE). + + +### register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +Useful example code from register can be found on: + +* [django.conf.urls url](/django-conf-urls-url-examples.html) + diff --git a/content/pages/examples/django/django-code-examples.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown similarity index 83% rename from content/pages/examples/django/django-code-examples.markdown rename to content/pages/examples/django/django-extensions-plug-ins.markdown index a703a3266..eaed39a1c 100644 --- a/content/pages/examples/django/django-code-examples.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -1,27 +1,25 @@ -title: Django Code Examples +title: Django Extensions, Plug-ins and Related Libraries category: page -slug: django-code-examples -sortorder: 50000 +slug: django-extensions-plug-ins-related-libraries +sortorder: 500010000 toc: False -sidebartitle: Django Code Examples -meta: Python code examples that show how to use the Django web application framework for many different situations. +sidebartitle: Django Extensions +meta: Python code extensions and plug-in projects that show how to use the Django web application framework. [Django](/django.html) is a Python [web framework](/web-frameworks.html). Official Django logo. Trademark Django Software Foundation. - -## Django Example Projects -Part of Django's widespread adoption comes from its broad ecosystem of -open source code libraries and example projects. +Part of Django's widespread adoption comes from a broad ecosystem of +open source code libraries that augment the core framework. It's good to familiarize yourself with the following projects to learn what is available to you beyond the extensive "[batteries-included](https://www.quora.com/Why-does-Django-tout-itself-as-a-batteries-included-web-framework-when-you-have-to-manually-write-regexes-to-do-URL-routing)" -code base. +code base. -These projects, ordered alphabetically, are also helpful as example +These projects, ordered alphabetically, can also be helpful as example code for how to build your own applications. @@ -44,22 +42,6 @@ Example code found in the AuditLog project: * [django.utils.html format_html](/django-utils-html-format-html-examples.html) -### dccnsys -[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration -system built with [Django](/django.html). The code is open source under the -[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). - -dccnsys is shown on the following code example pages: - -* [django.apps.config AppConfig](/django-apps-config-appconfig-examples.html) -* [django.contrib.auth get_user_model](/django-contrib-auth-get-user-model-examples.html) -* [django.contrib.auth.decorators login_required](/django-contrib-auth-decorators-login-required-examples.html) -* [django.db.models DateField](/django-db-models-datefield-examples.html) -* [django.db.models IntegerField](/django-db-models-integerfield-examples.html) -* [django.http HttpResponseForbidden](/django-http-httpresponseforbidden-examples.html) -* [django.urls.path](/django-urls-path-examples.html) - - ### django-allauth [django-allauth](https://github.com/pennersr/django-allauth) ([project website](https://www.intenct.nl/projects/django-allauth/)) is a @@ -80,8 +62,8 @@ Code used for examples from the django-allauth project: ([project examples website](https://django-angular.awesto.com/classic_form/)) is a library with helper code to make it easier to use [Angular](/angular.html) as the front-end to [Django](/django.html) projects. -The code for django-angular is -[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). +The code for django-angular is provided as open source +[under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). Code from django-angular is shown on: @@ -479,57 +461,6 @@ The code for django-wiki is provided as open source under the [GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). -### dmd-interpreter -[dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) -([running web app](http://www.dmd.nl/DOVE)) -is a Python tool to aggregate clinically relevant information related -to variants in the DMD gene and display that [data](/data.html) to a user -with a [Django](/django.html) web application. - - -### drf-action-serializer -[drf-action-serializer](https://github.com/gregschmit/drf-action-serializer) -([PyPI page](https://pypi.org/project/drf-action-serializer/)) -is an extension for [Django REST Framework](/django-rest-framework-drf.html) -that makes it easier to configure specific serializers to use based on the -client's request action. For example, a list view should have one serializer -whereas the detail view would have a different serializer. - -The project is open source under the -[MIT license](https://github.com/gregschmit/drf-action-serializer/blob/master/LICENSE). - -There are code examples from the drf-action-serializer project on the -following pages: - -* [django.urls.path](/django-urls-path-examples.html) - - -### gadget-board -[gadget-board](https://github.com/mik4el/gadget-board) is a -[Django](/django.html), -[Django REST Framework (DRF)](/django-rest-framework-drf.html) and -[Angular](/angular.html) web application that is open source under the -[Apache2 license](https://github.com/mik4el/gadget-board/blob/master/LICENSE). - -Additional example code found within gadget-board: - -* [django.apps.config AppConfig](/django-apps-config-appconfig-examples.html) -* [django.conf.urls url](/django-conf-urls-url-examples.html) -* [django.contrib admin](/django-contrib-admin-examples.html) -* [django.contrib.auth.hashers make_password](/django-contrib-auth-hashers-make-password-examples.html) - - -### jazzband -[jazzband](https://github.com/jazzband/website) is a -[Django](/django.html)-based web application that runs a website with -information on many Django projects such as -[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) -and [django-taggit](https://github.com/jazzband/django-taggit). - -The project's code is provided as open source under the -[MIT license](https://github.com/jazzband/website/blob/master/LICENSE). - - ### pytest-django [pytest-django](https://github.com/pytest-dev/pytest-django) ([project documentation](https://pytest-django.readthedocs.io/en/latest/) @@ -541,20 +472,6 @@ applications. The project and its code are open sourced under the [BSD 3-clause license](https://github.com/pytest-dev/pytest-django/blob/master/LICENSE). -### register -[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), -[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is -open source under the -[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). -This web application makes it easier for people to register as organ donors. -You can see the application live at -[https://register.organize.org/](https://register.organize.org/). - -Useful example code from register can be found on: - -* [django.conf.urls url](/django-conf-urls-url-examples.html) - - ### wagtail [wagtail](https://github.com/wagtail/wagtail) ([project website](https://wagtail.io/)) is a fantastic diff --git a/content/pages/examples/django/django-forms-booleanfield.markdown b/content/pages/examples/django/django-forms-booleanfield.markdown index e26a42485..bc3883949 100644 --- a/content/pages/examples/django/django-forms-booleanfield.markdown +++ b/content/pages/examples/django/django-forms-booleanfield.markdown @@ -1,7 +1,7 @@ title: django.forms BooleanField Python Code Examples category: page slug: django-forms-booleanfield-examples -sortorder: 50089 +sortorder: 500013105 toc: False sidebartitle: django.forms BooleanField meta: Python code examples to show how to use the BooleanField class within the forms module of the Django open source project. diff --git a/content/pages/examples/django/django-forms-charfield.markdown b/content/pages/examples/django/django-forms-charfield.markdown index 104a93097..b1d39ff1e 100644 --- a/content/pages/examples/django/django-forms-charfield.markdown +++ b/content/pages/examples/django/django-forms-charfield.markdown @@ -1,7 +1,7 @@ title: django.forms CharField Python Code Examples category: page slug: django-forms-charfield-examples -sortorder: 50090 +sortorder: 500013110 toc: False sidebartitle: django.forms CharField meta: Python code examples to show how to use the CharField class within the forms module of the Django open source project. diff --git a/content/pages/examples/django/django-forms-choicefield.markdown b/content/pages/examples/django/django-forms-choicefield.markdown index c7cf51558..7311599c3 100644 --- a/content/pages/examples/django/django-forms-choicefield.markdown +++ b/content/pages/examples/django/django-forms-choicefield.markdown @@ -1,7 +1,7 @@ title: django.forms ChoiceField Python Code Examples category: page slug: django-forms-choicefield-examples -sortorder: 50092 +sortorder: 500013115 toc: False sidebartitle: django.forms ChoiceField meta: Python code examples to show how to use the ChoiceField class within the forms module of the Django open source project. diff --git a/content/pages/examples/django/django-forms-emailfield.markdown b/content/pages/examples/django/django-forms-emailfield.markdown index 79abbab95..2155cafce 100644 --- a/content/pages/examples/django/django-forms-emailfield.markdown +++ b/content/pages/examples/django/django-forms-emailfield.markdown @@ -1,7 +1,7 @@ title: django.forms EmailField Python Code Examples category: page slug: django-forms-emailfield-examples -sortorder: 50097 +sortorder: 500013120 toc: False sidebartitle: django.forms EmailField meta: View Python code examples that show how to use the EmailField class within the forms module of the Django open source project. diff --git a/content/pages/examples/django/django-forms-integerfield.markdown b/content/pages/examples/django/django-forms-integerfield.markdown index b449a8887..e5cd5198e 100644 --- a/content/pages/examples/django/django-forms-integerfield.markdown +++ b/content/pages/examples/django/django-forms-integerfield.markdown @@ -1,7 +1,7 @@ title: django.forms IntegerField Python Code Examples category: page slug: django-forms-integerfield-examples -sortorder: 50105 +sortorder: 500013120 toc: False sidebartitle: django.forms IntegerField meta: View Python code examples that show how to use the IntegerField class within the forms module of the Django open source project. diff --git a/content/pages/examples/django/django-forms.markdown b/content/pages/examples/django/django-forms.markdown index 76174599f..a840f773d 100644 --- a/content/pages/examples/django/django-forms.markdown +++ b/content/pages/examples/django/django-forms.markdown @@ -1,7 +1,7 @@ title: django.forms Example Code category: page slug: django-forms-examples -sortorder: 50015 +sortorder: 500013100 toc: False sidebartitle: django.forms meta: Python code examples for the forms module in the Django open source project. diff --git a/content/pages/examples/django/django-http-http404.markdown b/content/pages/examples/django/django-http-http404.markdown index c6f78d37d..01fb35a5f 100644 --- a/content/pages/examples/django/django-http-http404.markdown +++ b/content/pages/examples/django/django-http-http404.markdown @@ -1,7 +1,7 @@ title: django.http Http404 Python Code Examples category: page slug: django-http-http404-examples -sortorder: 50045 +sortorder: 500013410 toc: False sidebartitle: django.http Http404 meta: Example code for the Http404 Exception class from the django.http module. diff --git a/content/pages/examples/django/django-http-httpresponse.markdown b/content/pages/examples/django/django-http-httpresponse.markdown index bb9d14ac8..4e08c89e5 100644 --- a/content/pages/examples/django/django-http-httpresponse.markdown +++ b/content/pages/examples/django/django-http-httpresponse.markdown @@ -1,7 +1,7 @@ title: django.http HttpResponse Python Code Examples category: page slug: django-http-httpresponse-examples -sortorder: 50049 +sortorder: 500013420 toc: False sidebartitle: django.http HttpResponse meta: Example Python code for using the HttpResponse object provided by Django in the django.http module. diff --git a/content/pages/examples/django/django-http-httpresponsebadrequest.markdown b/content/pages/examples/django/django-http-httpresponsebadrequest.markdown index 51a9e8275..746df22b6 100644 --- a/content/pages/examples/django/django-http-httpresponsebadrequest.markdown +++ b/content/pages/examples/django/django-http-httpresponsebadrequest.markdown @@ -1,7 +1,7 @@ title: django.http HttpResponseBadRequest Python Code Examples category: page slug: django-http-httpresponsebadrequest-examples -sortorder: 50054 +sortorder: 500013430 toc: False sidebartitle: django.http HttpResponseBadRequest meta: Example Python code for using the HttpResponseBadRequest object provided by Django in the django.http module. diff --git a/content/pages/examples/django/django-http-httpresponseforbidden.markdown b/content/pages/examples/django/django-http-httpresponseforbidden.markdown index d0769998f..90bc01ea1 100644 --- a/content/pages/examples/django/django-http-httpresponseforbidden.markdown +++ b/content/pages/examples/django/django-http-httpresponseforbidden.markdown @@ -1,7 +1,7 @@ title: django.http HttpResponseForbidden Python Code Examples category: page slug: django-http-httpresponseforbidden-examples -sortorder: 50051 +sortorder: 500013440 toc: False sidebartitle: django.http HttpResponseForbidden meta: Example Python code for using the HttpResponseForbidden object provided by Django in the django.http module. diff --git a/content/pages/examples/django/django-http-httpresponsenotmodified.markdown b/content/pages/examples/django/django-http-httpresponsenotmodified.markdown index a8a768446..743d5e22c 100644 --- a/content/pages/examples/django/django-http-httpresponsenotmodified.markdown +++ b/content/pages/examples/django/django-http-httpresponsenotmodified.markdown @@ -1,7 +1,7 @@ title: django.http HttpResponseNotModified Python Code Examples category: page slug: django-http-httpresponsenotmodified-examples -sortorder: 50063 +sortorder: 500013450 toc: False sidebartitle: django.http HttpResponseNotModified meta: Example Python code for using the HttpResponseNotModified object provided by Django in the django.http module. diff --git a/content/pages/examples/django/django-http-httpresponsepermanentredirect-examples.markdown b/content/pages/examples/django/django-http-httpresponsepermanentredirect-examples.markdown index 4ecd1eee2..ba8b6ed62 100644 --- a/content/pages/examples/django/django-http-httpresponsepermanentredirect-examples.markdown +++ b/content/pages/examples/django/django-http-httpresponsepermanentredirect-examples.markdown @@ -1,7 +1,7 @@ title: django.http HttpResponsePermanentRedirect Python Code Examples category: page slug: django-http-httpresponsepermanentredirect-examples -sortorder: 50057 +sortorder: 500013460 toc: False sidebartitle: django.http HttpResponsePermanentRedirect meta: Example code that shows you how to use the HttpResponsePermanentRedirect class from the django.http module. diff --git a/content/pages/examples/django/django-http-httpresponseredirect.markdown b/content/pages/examples/django/django-http-httpresponseredirect.markdown index 788e0f8bb..03b783324 100644 --- a/content/pages/examples/django/django-http-httpresponseredirect.markdown +++ b/content/pages/examples/django/django-http-httpresponseredirect.markdown @@ -1,7 +1,7 @@ title: django.http HttpResponseRedirect Python Code Examples category: page slug: django-http-httpresponseredirect-examples -sortorder: 50065 +sortorder: 500013470 toc: False sidebartitle: django.http HttpResponseRedirect meta: Example Python code for using the HttpResponseRedirect object provided by Django in the django.http module. diff --git a/content/pages/examples/django/django-template-response-simpletemplateresponse.markdown b/content/pages/examples/django/django-template-response-simpletemplateresponse.markdown index d35fa3a26..9d805bee3 100644 --- a/content/pages/examples/django/django-template-response-simpletemplateresponse.markdown +++ b/content/pages/examples/django/django-template-response-simpletemplateresponse.markdown @@ -1,7 +1,7 @@ title: django.template.response SimpleTemplateResponse Example Code category: page slug: django-template-response-simpletemplateresponse-examples -sortorder: 50192 +sortorder: 500013500 toc: False sidebartitle: django.template.response SimpleTemplateResponse meta: Python open source example code for the SimpleTemplateResponse class in Django within django.template.response. diff --git a/content/pages/examples/django/django-template-response-templateresponse.markdown b/content/pages/examples/django/django-template-response-templateresponse.markdown index 15d447b7b..084516937 100644 --- a/content/pages/examples/django/django-template-response-templateresponse.markdown +++ b/content/pages/examples/django/django-template-response-templateresponse.markdown @@ -1,7 +1,7 @@ title: django.template.response TemplateResponse Example Code category: page slug: django-template-response-templateresponse-examples -sortorder: 50190 +sortorder: 500013510 toc: False sidebartitle: django.template.response TemplateResponse meta: Python code examples for the TemplateResponse class that is part of Django's django.template.response module. diff --git a/content/pages/examples/django/django-urls-exceptions-noreversematch.markdown b/content/pages/examples/django/django-urls-exceptions-noreversematch.markdown index 5b6502fa2..05d83bd4c 100644 --- a/content/pages/examples/django/django-urls-exceptions-noreversematch.markdown +++ b/content/pages/examples/django/django-urls-exceptions-noreversematch.markdown @@ -1,7 +1,7 @@ title: django.urls.exceptions NoReverseMatch Python Code Examples category: page slug: django-urls-exceptions-noreversematch-examples -sortorder: 50056 +sortorder: 500013610 toc: False sidebartitle: django.urls.exceptions NoReverseMatch meta: Python example code for the NoReverseMatch exception class from the django.urls.exceptions module. diff --git a/content/pages/examples/django/django-urls-path.markdown b/content/pages/examples/django/django-urls-path.markdown index 2bd82779a..34fe83c58 100644 --- a/content/pages/examples/django/django-urls-path.markdown +++ b/content/pages/examples/django/django-urls-path.markdown @@ -1,7 +1,7 @@ title: django.urls.path Example Code category: page slug: django-urls-path-examples -sortorder: 50000 +sortorder: 500013610 toc: False sidebartitle: django.urls.path meta: Python code examples for the path function within the django.urls module of the Django project. diff --git a/content/pages/examples/django/django-urls-reverse-lazy.markdown b/content/pages/examples/django/django-urls-reverse-lazy.markdown index 90bfc142f..1c11f7379 100644 --- a/content/pages/examples/django/django-urls-reverse-lazy.markdown +++ b/content/pages/examples/django/django-urls-reverse-lazy.markdown @@ -1,7 +1,7 @@ title: django.urls.reverse_lazy Example Code category: page slug: django-urls-reverse-lazy-examples -sortorder: 50202 +sortorder: 500013630 toc: False sidebartitle: django.urls reverse_lazy meta: Python code examples for the reverse_lazy function within the django.urls module of the Django project. diff --git a/content/pages/examples/django/django-utils-html-format-html.markdown b/content/pages/examples/django/django-utils-html-format-html.markdown index d7017b499..7fd74590a 100644 --- a/content/pages/examples/django/django-utils-html-format-html.markdown +++ b/content/pages/examples/django/django-utils-html-format-html.markdown @@ -1,7 +1,7 @@ title: django.utils.html format_html Example Code category: page slug: django-utils-html-format-html-examples -sortorder: 50030 +sortorder: 500013705 toc: False sidebartitle: django.utils.html format_html meta: Python code examples for using the format_html function contained within Django's django.utils.html module. diff --git a/content/pages/examples/django/django-utils-timezone.markdown b/content/pages/examples/django/django-utils-timezone.markdown index 6515f843e..e85d3870a 100644 --- a/content/pages/examples/django/django-utils-timezone.markdown +++ b/content/pages/examples/django/django-utils-timezone.markdown @@ -1,7 +1,7 @@ title: django.utils.timezone Example Code category: page slug: django-utils-timezone-examples -sortorder: 50020 +sortorder: 500013715 toc: False sidebartitle: django.utils.timezone meta: Python code examples for timezone-related classes and functions provided by the Django codebase. diff --git a/content/pages/examples/flask/flask-code-examples.markdown b/content/pages/examples/flask/flask-code-examples.markdown index 838aa2f71..439354186 100644 --- a/content/pages/examples/flask/flask-code-examples.markdown +++ b/content/pages/examples/flask/flask-code-examples.markdown @@ -1,7 +1,7 @@ title: Flask Core and Extensions Code Examples category: page slug: flask-core-extensions-code-examples -sortorder: 50500 +sortorder: 500020000 toc: False sidebartitle: Flask Core and Extensions Code Examples meta: Learn how to create Flask applications with easy to copy and paste Python code examples for the Flask web framework. diff --git a/content/pages/examples/flask/flask-redirect.markdown b/content/pages/examples/flask/flask-redirect.markdown index 5c2f5ca5c..0c2d1e1bc 100644 --- a/content/pages/examples/flask/flask-redirect.markdown +++ b/content/pages/examples/flask/flask-redirect.markdown @@ -1,7 +1,7 @@ title: flask redirect Example Python Code category: page slug: flask-redirect-examples -sortorder: 50104 +sortorder: 500021005 toc: False sidebartitle: flask redirect meta: Python code examples for the redirect function from the Flask project used for building web applications. diff --git a/content/pages/examples/flask/flask-request.markdown b/content/pages/examples/flask/flask-request.markdown index d4cd12d55..de7ce633a 100644 --- a/content/pages/examples/flask/flask-request.markdown +++ b/content/pages/examples/flask/flask-request.markdown @@ -1,7 +1,7 @@ title: flask request Example Python Code category: page slug: flask-request-examples -sortorder: 50103 +sortorder: 500021010 toc: False sidebartitle: flask request meta: Python code examples for the request object from the Flask project used for building web applications. diff --git a/content/pages/examples/flask/flask-sqlalchemy-model.markdown b/content/pages/examples/flask/flask-sqlalchemy-model.markdown index 2073d51c1..7644b2a58 100644 --- a/content/pages/examples/flask/flask-sqlalchemy-model.markdown +++ b/content/pages/examples/flask/flask-sqlalchemy-model.markdown @@ -1,7 +1,7 @@ title: flask_sqlalchemy.SQLAlchemy Model Example Code category: page slug: flask-sqlalchemy-model-examples -sortorder: 50100 +sortorder: 500022010 toc: False sidebartitle: flask_sqlalchemy.SQLAlchemy Model meta: Python code examples for the Model class within the flask_sqlalchemy.SQLAlchemy module of the Flask-SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown index 9f5543ed5..910439fa7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown @@ -1,7 +1,7 @@ title: SQLAlchemy Example Projects and Code category: page slug: sqlalchemy-projects-code-examples -sortorder: 50003001 +sortorder: 500030001 toc: False sidebartitle: SQLAlchemy Example Code meta: Python example projects and code that show how to use the SQLAlchemy object-relational mapper (ORM). diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index 69a96f72a..8ddfbe31b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -1,7 +1,7 @@ title: SQLAlchemy Extensions, Plug-ins and Related Libraries category: page slug: sqlalchemy-extensions-plug-ins-related-libraries -sortorder: 50003000 +sortorder: 500030000 toc: False sidebartitle: SQLAlchemy Extensions meta: Python code extensions and plug-in example projects that show how to use the SQLAlchemy object-relational mapper. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-models.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-models.markdown index 7ead84dc3..d8940691e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-models.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-models.markdown @@ -1,9 +1,9 @@ title: SQLAlchemy Model Example Code category: page slug: sqlalchemy-model-examples -sortorder: 50201 +sortorder: 500030500 toc: False -sidebartitle: SQLAlchemy Model Examples +sidebartitle: SQLAlchemy Models meta: Python code examples for the Model class within the SQLAlchemy project. diff --git a/theme/templates/article.html b/theme/templates/article.html index 74119293f..4fcea5f1c 100644 --- a/theme/templates/article.html +++ b/theme/templates/article.html @@ -57,13 +57,3 @@

{{ article.title }}

{% endif %} {% endblock %} - -{% block lower_banner %} - -{% endblock %} diff --git a/theme/templates/desktop-toc.html b/theme/templates/desktop-toc.html index 5055b00b5..1c849def6 100644 --- a/theme/templates/desktop-toc.html +++ b/theme/templates/desktop-toc.html @@ -6,7 +6,8 @@

Table of Contents

{% for p in pages|sort(attribute='sortorder') %} {% if p %} {% if p.toc == "True" %}{{ p.sidebartitle }} - {% elif p.sortorder[0:2] == page.sortorder[0:2] %}{{ p.sidebartitle }} + {% elif p.sortorder[0:2] == page.sortorder[0:2] and not p.sortorder[0:2] == '50' %}{{ p.sidebartitle }} + {% elif p.sortorder[0:2] == '50' %}{% if p.sortorder[2:5] == page.sortorder[2:5] %}{{ p.sidebartitle }}{% endif %} {% endif %} {% endif %} {% endfor %} diff --git a/theme/templates/page.html b/theme/templates/page.html index b93a86182..5ca0a373c 100644 --- a/theme/templates/page.html +++ b/theme/templates/page.html @@ -59,7 +59,3 @@

{{ page.title }}

{% endblock %} - -{% block lower_banner %} -{% include "lower-banner.html" %} -{% endblock %} diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index 39d228316..51a920d66 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -43,10 +43,13 @@

-

Django code examples

+

Django: +Extensions, Plug-ins and Related Libraries & +Example Projects and Code +

django.apps.config AppConfig

django.conf.settings

django.conf.urls.url

@@ -114,11 +117,23 @@

django.utils.timez + {% endblock %} From bba8ee06e69729abe87163555f27bcbe16392888 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 31 Dec 2019 11:21:51 -0500 Subject: [PATCH 040/302] fix missing commas on table of contents page --- content/pages/examples/flask/flask-code-examples.markdown | 8 ++++++++ theme/templates/table-of-contents.html | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/content/pages/examples/flask/flask-code-examples.markdown b/content/pages/examples/flask/flask-code-examples.markdown index 439354186..468e988b5 100644 --- a/content/pages/examples/flask/flask-code-examples.markdown +++ b/content/pages/examples/flask/flask-code-examples.markdown @@ -69,3 +69,11 @@ Code examples from Flasky are shown on the following pages: * [flask_sqlalchemy SQLAlchemy Model](/flask-sqlalchemy-model-examples.html) + +### newspie +[NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news +aggregator created with [Flask](/flask.html) and the +[News API](https://newsapi.org/). + +NewsPie is provided as open source under the +[MIT license](https://github.com/skamieniarz/newspie/blob/master/LICENSE). diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index 51a920d66..0f66d8eee 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -95,8 +95,8 @@

django.forms IntegerField

django.http - HttpResponse - HttpResponseBadRequest + HttpResponse, + HttpResponseBadRequest, HttpResponseForbidden, HttpResponseNotModified, Http404, From 16115b4c34d77c852560c6ae1a2b8c5e654cb11d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 31 Dec 2019 11:53:13 -0500 Subject: [PATCH 041/302] add django-migration-linter as example django extension --- .../django/django-extensions-plug-ins.markdown | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index eaed39a1c..6258c2fa8 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -296,6 +296,22 @@ django-loginas is open source under the [BSD 3-Clause "New" or "Revised" License](https://github.com/skorokithakis/django-loginas/blob/master/LICENSE). +### django-migration-linter +[django-migration-linter](https://github.com/3YOURMIND/django-migration-linter) +([PyPI package information](https://pypi.org/project/django-migration-linter/)) +checks for backwards-incompatible changes in [Django ORM](/django-orm.html) +schema migrations and warns you about them. The purpose of the project is +to save time in older and larger projects by detecting field migrations +that will be a problem so you do not run into issues later, and make it +easier to enable continuous [deployment](/deployment.html) configurations +with database changes. There is a +[blog post on keeping Django database migrations backward compatible](https://medium.com/3yourmind/keeping-django-database-migrations-backward-compatible-727820260dbb) +that goes into further detail on the tool. + +The django-migration-linter project is open sourced under the +[Apache 2.0 license](https://github.com/3YOURMIND/django-migration-linter/blob/master/LICENSE). + + ### django-model-utils [django-model-utils](https://github.com/jazzband/django-model-utils) ([project documentation](https://django-model-utils.readthedocs.io/en/latest/) From d8581f994e7f46f67b7bd2417ab29387d695bdbb Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 2 Jan 2020 09:13:44 -0500 Subject: [PATCH 042/302] add remainder of starter pages --- content/pages/05-deployment/29-gocd.markdown | 27 +++++++++++++++ .../pages/05-deployment/33-ansible.markdown | 2 +- content/pages/05-deployment/34-salt.markdown | 31 ++++++++++++++++++ content/pages/06-devops/02-datadog.markdown | 28 ++++++++++++++++ ...etheus.markdown => 03-prometheus.markdown} | 2 +- ...3-rollbar.markdown => 04-rollbar.markdown} | 4 +-- content/pages/06-devops/05-sentry.markdown | 28 ++++++++++++++++ content/pages/meta/00-change-log.markdown | 11 +++++++ static/img/logos/datadog.png | Bin 0 -> 30294 bytes static/img/logos/gocd.png | Bin 0 -> 34653 bytes static/img/logos/salt.png | Bin 0 -> 65333 bytes static/img/logos/sentry-dark.png | Bin 0 -> 7728 bytes static/img/logos/sentry-light.png | Bin 0 -> 8610 bytes theme/templates/book-chapters.html | 8 ++--- theme/templates/choices/datadog.html | 18 ++++++++++ .../choices/gocd-continuous-integration.html | 18 ++++++++++ theme/templates/choices/salt.html | 18 ++++++++++ theme/templates/choices/sentry.html | 18 ++++++++++ theme/templates/sidebar.html | 1 - 19 files changed, 205 insertions(+), 9 deletions(-) create mode 100644 content/pages/05-deployment/29-gocd.markdown create mode 100644 content/pages/05-deployment/34-salt.markdown create mode 100644 content/pages/06-devops/02-datadog.markdown rename content/pages/06-devops/{02-prometheus.markdown => 03-prometheus.markdown} (99%) rename content/pages/06-devops/{03-rollbar.markdown => 04-rollbar.markdown} (94%) create mode 100644 content/pages/06-devops/05-sentry.markdown create mode 100644 static/img/logos/datadog.png create mode 100644 static/img/logos/gocd.png create mode 100644 static/img/logos/salt.png create mode 100644 static/img/logos/sentry-dark.png create mode 100644 static/img/logos/sentry-light.png create mode 100644 theme/templates/choices/datadog.html create mode 100644 theme/templates/choices/gocd-continuous-integration.html create mode 100644 theme/templates/choices/salt.html create mode 100644 theme/templates/choices/sentry.html diff --git a/content/pages/05-deployment/29-gocd.markdown b/content/pages/05-deployment/29-gocd.markdown new file mode 100644 index 000000000..3a4f48e21 --- /dev/null +++ b/content/pages/05-deployment/29-gocd.markdown @@ -0,0 +1,27 @@ +title: GoCD +category: page +slug: gocd-continuous-integration +sortorder: 0529 +toc: False +sidebartitle: GoCD +meta: GoCD is a continuous integration (CI) server often used to automatically build and test Python applications. + + +[GoCD](https://www.gocd.org/) is a +[continuous integration (CI)](/continuous-integation.html) +server often used to automatically build, [test](/testing.html) and +[deploy](/deployment.html) Python applications. + +Official GoCD CI logo. + +
GoCD is an implementation of the continuous integration concept. Learn more in the deployment chapter or view the table of contents for all topics.
+ + +### GoCD resources +* The official + [getting started with GoCD](https://www.gocd.org/getting-started/part-1/) + guide is a solid place to begin configuring the CI server and learning + about its basic concepts. + +* [py-gocd](https://py-gocd.readthedocs.io/en/latest/) is a code library + for programmatically interacting with GoCD from your Python code. diff --git a/content/pages/05-deployment/33-ansible.markdown b/content/pages/05-deployment/33-ansible.markdown index 7d16a571c..a64409f26 100644 --- a/content/pages/05-deployment/33-ansible.markdown +++ b/content/pages/05-deployment/33-ansible.markdown @@ -7,7 +7,7 @@ sidebartitle: Ansible meta: Ansible is configuration management tool used for application deployment and environment setup. -[Ansible](http://docs.ansible.com/ansible/latest/index.html) is +[Ansible](http://docs.ansible.com/ansible/latest/index.html) is a [configuration management tool](/configuration-management.html) used for [application deployment](/deployment.html) and [environment setup](/development-environments.html). diff --git a/content/pages/05-deployment/34-salt.markdown b/content/pages/05-deployment/34-salt.markdown new file mode 100644 index 000000000..5a11baaea --- /dev/null +++ b/content/pages/05-deployment/34-salt.markdown @@ -0,0 +1,31 @@ +title: Salt +category: page +slug: salt +sortorder: 0534 +toc: False +sidebartitle: Salt +meta: Salt is configuration management tool used for application deployment and setting up development environments. + + +[Salt](https://docs.saltstack.com/en/latest/) +([source code](https://github.com/saltstack/salt)) is a +[configuration management tool](/configuration-management.html) used for +[application deployment](/deployment.html) and +[setting up development environments](/development-environments.html). + +Official Salt logo. Copyright SaltStack. + + +### Salt resources +* [Introduction to Salt](https://docs.saltstack.com/en/latest/topics/) + gives a 30 second summary of what the tool can do for you then provides + a collection of links to other resources that plug you into the Salt + community, such as the + [salt-users mailing list](https://groups.google.com/forum/#!forum/salt-users) + and the [Salt Stack company blog](http://www.saltstack.com/blog/). + +* [Linode](/linode.html) has two great beginner guides to Salt, the first + one on + [Getting Started with Salt - Basic Installation and Setup](https://www.linode.com/docs/applications/configuration-management/getting-started-with-salt-basic-installation-and-setup/) + and the other titled + [A Beginner's Guide to Salt](https://www.linode.com/docs/applications/configuration-management/beginners-guide-to-salt/). diff --git a/content/pages/06-devops/02-datadog.markdown b/content/pages/06-devops/02-datadog.markdown new file mode 100644 index 000000000..4d94c6c21 --- /dev/null +++ b/content/pages/06-devops/02-datadog.markdown @@ -0,0 +1,28 @@ +title: Datadog +category: page +slug: datadog +sortorder: 0602 +toc: False +sidebartitle: Datadog +meta: Datadog is a monitoring service that can be used with Python web applications to catch and report errors. + + +[Datadog](https://www.datadoghq.com/) is a hosted +[monitoring](/monitoring.html) service that can be used with +Python [web applications](/web-development.html) to catch +and report errors. + +Datadog logo. + + +### Datadog resources +* [Monitoring Django performance with Datadog](https://www.datadoghq.com/blog/monitoring-django-performance/) + is a fantastic, detailed walk through for integrating this service + with [Django web applications](/django.html). + +* [Python log collection](https://docs.datadoghq.com/logs/log_collection/python/?tab=json_logformatter) + provides a framework-agnostic explanation for how to use the service + with Python code. + +* [Monitoring Flask apps with Datadog](https://www.datadoghq.com/blog/monitoring-flask-apps-with-datadog/) + walks through adding Datadog to a [Flask](/flask.html) application. diff --git a/content/pages/06-devops/02-prometheus.markdown b/content/pages/06-devops/03-prometheus.markdown similarity index 99% rename from content/pages/06-devops/02-prometheus.markdown rename to content/pages/06-devops/03-prometheus.markdown index d8f3114cb..54eeddc20 100644 --- a/content/pages/06-devops/02-prometheus.markdown +++ b/content/pages/06-devops/03-prometheus.markdown @@ -1,7 +1,7 @@ title: Prometheus category: page slug: prometheus -sortorder: 0602 +sortorder: 0603 toc: False sidebartitle: Prometheus meta: Prometheus is an open source monitoring tool that can be used to instrument and report on Python web apps. diff --git a/content/pages/06-devops/03-rollbar.markdown b/content/pages/06-devops/04-rollbar.markdown similarity index 94% rename from content/pages/06-devops/03-rollbar.markdown rename to content/pages/06-devops/04-rollbar.markdown index e67d2c7e8..44679e556 100644 --- a/content/pages/06-devops/03-rollbar.markdown +++ b/content/pages/06-devops/04-rollbar.markdown @@ -1,7 +1,7 @@ title: Rollbar category: page slug: rollbar -sortorder: 0606 +sortorder: 0604 toc: False sidebartitle: Rollbar meta: Rollbar is a monitoring service that can be used with Python web applications to catch and report errors. @@ -11,7 +11,7 @@ meta: Rollbar is a monitoring service that can be used with Python web applicati used with Python [web applications](/web-development.html) to catch and report errors. -Rollbar logo, copyright Rollbar, Inc. +Rollbar logo, copyright Rollbar, Inc. ### Rollbar resources diff --git a/content/pages/06-devops/05-sentry.markdown b/content/pages/06-devops/05-sentry.markdown new file mode 100644 index 000000000..f7a834296 --- /dev/null +++ b/content/pages/06-devops/05-sentry.markdown @@ -0,0 +1,28 @@ +title: Sentry +category: page +slug: sentry +sortorder: 0605 +toc: False +sidebartitle: Sentry +meta: Sentry is an open source monitoring project as well as a service that can be used to report errors in Python web apps. + + +Sentry is an open source monitoring project as well as a service that can be used to report errors in Python web apps. + +[Sentry](https://docs.sentry.io/) is a [monitoring](/monitoring.html) +service that you can set up to host yourself or used as a service to +catch and report errors in your Python +[web applications](/web-development.html). + +Sentry logo. + + +### Sentry resources +* Sentry's [official Python docs](https://docs.sentry.io/platforms/python/) + explain how to integrate the SDK into an application to send events to + either your own server or the hosted service. + +* [Sentry For Data: Error Monitoring with PySpark](https://blog.sentry.io/2019/11/12/sentry-for-data-error-monitoring-with-pyspark) + shows an integration between the PySpark data analysis tool and + Sentry for handling any issues. + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 62f3e5d17..18b4e24df 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -13,6 +13,17 @@ view commit-level changes via the [source repository's commit log](https://github.com/mattmakai/fullstackpython.com/commits/) on GitHub. +## 2020 +### January +* Added starter pages for the remaining topics in the table of contents + that were previously missing. Still working on adding more resources and + descriptions to each page: + * [Datadog](/datadog.html) + * [GoCD](/gocd-continuous-integration.html) + * [Salt](/salt.html) + * [Sentry](/sentry.html) +* Happy New Year (and decade) to my fellow Python developers! + ## 2019 ### December diff --git a/static/img/logos/datadog.png b/static/img/logos/datadog.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a31cbc695e8075cbc2306829bafaf8ce0ff122 GIT binary patch literal 30294 zcmYgY1yq#X)8D0Jk#Z44a=`_pyK51YT^giY1*B6-Y5_qJg=Hz}M!G>d1f^5yRzjsg zgeAY{edYb1?>UF#Is4pa?#$e|b7y`t*9a{QWik>v5)cSPhC(XofIvhD5D1(|Oa%P0 zfk|xz{(-n6jXXf0>(GDxz+>})XCM#^gi=z_^-0~FS9hQN`~~d>kC#19NA!WUbTnYA z1dkI;QDq+&enWUN+V|7-^7ReFrGoRQl(?8+-yj!jkh6&%vTLjeC@457J!#z_&;8zs zA}hplM0WnX|7d5C3YhiZ2aP%V+ynv1TiFGs!Xt3cW8uApGX8vR>AmI5Py2gC`EUOn zmq`zy1daBLH6v|qwxz37b;4z%=vv8LxT3EJX}u&MM#HS^%r$J{iX{fhIb<*1ypLDD zdRw4~M}U5Al$;oQJEgR6;4<3h7WnV0xEK(4$+S>(+=f~?WkR=33yk;og%27as1Q#S zIY~w2re}8RHvSldr zuKJL?~ot&35h8SbsUNsxyYGK9$qoft_eq=5#yvZ{01Jj^gP=s-={48jt3#6 zp)mAId*g@kR1AV2@~grKi2uIHWPng2l6XTu^^Y@<(p>xdBU%=T1|^KwD!B*s$4ju*1^rih9Kh0^*U8gbCeM__fl)Z+q;2Ze6_@i6S6|*%L)3 z7E99dL3?zpoG+P}q+W zn+l(X{|Q3b^#2qn428uM-R3bbTeGZ?s9**b?%xL?2!(-*?9}7q ziX?3RTR{*p6NHlDe?nA*TCx5eokvvbbMR2Cnt);55xrk zVjrYmiE*L@9?Jo=wYvPRCLizPlPD)B>@Pv|Jvf5yiY*$DsR;^pk#eRoEAsa(Nc#@B zszp>!vRA=@%eGnrYZU|UZNbeQ$@J6~A;|j(k=t=hocUKc!IE{yrBa0~epwt0~f&HPK&d@>Nvy7;5tG5v$d9>q40q z8!u#Z*xcjuaOzmNI0JJF?7zKm_wb)htJfwDSp2^xr~G4EZR{JSt6R({Su>CI1&zzR z>_9^7LDq%))eQ5J>i^8}ymQxP>HX}qySwO0KMS?)^{5X+fSLY%RLBxQ(?b7RWtoR% z(|cf4JhP=>BWt)FbnK35hNa)oXhb`>3Yu>Qc|DHhixpbN6nfm0v6 zVDeykCwwcna;RMN?`P=cGp?Y6FkLUq8EDS;NAejmP?z;xf|2)r+jZ2dXE;A5YxCiU ztEj6 zHx_m^v%exC@shqpX?b5CenWJXi2U&m2c+r?u8iYK*Yyg(fC$>=FZ_%A6oDti~+1L%ye=X;*yI(W) zpHZkkifFmmhx!ibj^?9UP!+nyMjK}P%2T9N<4mXuQQE9 zab@uIC=rF#ORwDUe-)%2ST-Eb@omh{{mO3I9|dxs+i@YhgoFRk&nh_H)^Z8Yxis?? zl3~|&l{L}mgGBqPA9foPedZuDPmG6a<GdBg9o!NtZV%@1$dtjP zHXgN~Om5BK)?fF%@6KOZpwyGMiER_cAshMMzBg=(OStj|pHX^G1p#WBj8_gi8wg7* zqCgQPAuiO_t&yw{Y)ZDMQNmjO{`c(trf@xj-t134ChjX*Ylaa8#&%Ty^X*9))G)=N zs@)!yaOV`W(}(waqm_tCEC}m5Ti?CaMg;<)hH=rw-6F-;D=#5pZL`OByoD02O;rNl zwS9lMYQZ?MWy2OJq^OU+Ij-Uz&vC_VyAT&5&{GKiY5^B zjVG*A6+ZJxD0f<57}4288KdTJ#dG#;o-}j|(FRhk1-z}Nrn%ypEf9BcemcAZS3Ni- zhQf-+oX^d`J{wgc;=#XNnu-u4M#(7|%T@a?0@bn1(nq!3k^H6a=k~UR<7sh2psRℜC|Ff>LL4sFyyuVpSj+RhZrh`6Vm7X#jzdC*) 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 literal 0 HcmV?d00001 diff --git a/static/img/logos/gocd.png b/static/img/logos/gocd.png new file mode 100644 index 0000000000000000000000000000000000000000..e16c2eb8823bd2079b135091a7e61a12d378f692 GIT binary patch literal 34653 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 E0DpJ4iU0rr literal 0 HcmV?d00001 diff --git a/static/img/logos/salt.png b/static/img/logos/salt.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed9c9f75a448dec6b9de33db4258d9820593ee2 GIT binary patch literal 65333 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 literal 0 HcmV?d00001 diff --git a/static/img/logos/sentry-dark.png b/static/img/logos/sentry-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..29b637d52649e96e3b551edd7723f2b0bfc41d93 GIT binary patch literal 7728 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 NncXrix$+?9{{g-pEEfO( literal 0 HcmV?d00001 diff --git a/static/img/logos/sentry-light.png b/static/img/logos/sentry-light.png new file mode 100644 index 0000000000000000000000000000000000000000..37494b19fb7d3ac254a3ff1796221603a5837cd4 GIT binary patch literal 8610 zcmd6NXH-+)(svXP5D}y)9i=M8f)HvzL@**s6NFHdA_CHTFA9oMlq$V<0)G$)ArP8~ zfP^X#ASBe#Lz4iZJO}TWyViZyeZRc#TJMMKbF$Z&y=TwNo|!$r9jWs~lkq&)c@PN1 z2z{uo2LheN0PhEM=YY2AYbzRf(7QY|b_anNSWbUu25~`$AdmnEs(#PFXM7Du(w!Zv z`!S7h?)9de6Ts@9Z+T3;s}5p4vrgxt8S)_;cd14p?DnOa582wFira=D+G~WM{$1o< zDn@@ht)z0i{%_Ax%!@bHN4~YSyW{+P{QNY)oP^Qi_u9Y{#GHNxXv3s|M%Cq%DY{es zK&_lWBOpfwwA8kz9e>*p!Uf>{8js5kSds5bvk;g}=#5eSq`f+#^C)$9k{Ux{%XaU#x#iy8Tk2i^2n*RgIOPzWIk zO}!uu)q)E4B}3{r(yQ44HMDYe@}(xnN!>V3g+Zk?vi{Y@l`0J-h6dp>82Vs!5+Kkb zRf9cqDqJJZ(8=;DppI5f%}c3$XWuV0MRr5q0v(#MdeO5?z4xIo=vyxQLZ5b34|W_- z`PbVs0f!ti?_Wjg0xIpNijw2668hK~cWk$~266m|i-TVTfnwMNF`beQ8%=s5=g*!R zhJtA1OiI4pTW9&t3Dxs|Su%^~v>Jz zJ!u%Ci~I@I59I}f@%t-}Pe2ZKJZOEQaI81$s6rYV%uTiT(HXEW9#)O?*r)b%y-a>N z5NtS}yWKV$1sI}$TwYV0803q`OZtX1OGMy&v*d+l=LB`vZZN@f50kx#he%qPQ0IBD&pcAAx zKd=}9x!Da<<*I_CNz_WR*(U`pe+7+47XnkW)l-m56D;%+$6# z<9c^Fn*$#}U z_v(Ri@a;yAFY23LD}lWPFePRL2G|8Nv5iTtE$N}?;I)g*p={c0ltfv>6 zl52vtnkOtIa2G+U#6X{b0Bdm%@yRIRBP*Y!WbG;#^|6FB6wi3`sQ$VaC;pZAZh`;0COR$YYmerWM|6GNUztJuZ*{9k9sBkRUyw+z$&T**@i~q+V zn2LWUa#=k1q?=K|ClIY&rMN=yd^ue~uQ0N$`7BD#JJ!Y$|JJ_v<`f%BDRRaET7(Y1 z&(cwLK0{eY*+XLPq=uk;&M8>VljJFCCw$#OK>g{ySMP*Xs`}=EvUp_O_xcDDs*=+8 zPy58e4i>2$=ae;B|9(8{)QT{*cAZWSp9%%mO$Pi~3d#9_goWC^qAQ_X3U5#=oe$ys zu!#v}_6_OAh0-q3Pt>-1)lste5o3;Ndy`5(7qum~7Z7N!&)V7T#Sng*YfBC+9k8<= z;*6#~ud1%`3_${=mi$AuF{a13{PLGO%%hP8$5b~Efj0&Om~4cKLtmMFNV?5__)qIvzZ=)qf@y* z+p*eE(ZzD+shBi+dVDwSah+dn;Z19K;j?fz3?pOA;lhSLOUKlx0eNTl$3|vPl1f*X zK@5hnH;7m2gv|FSml0A ztd<0gbUS3Y-mX>r<8x0s%$-8j|9oDZ*20K(vBW|CvqnWa=;%W4Q?mvJ>{sV1cEe%C z*`L}%@IWUPoab*hxT50(>&W@1--vXuS z`NyOEAL68&BYf$7xZ>4>E$Cp@%|n#iiIa62+rfx7KSj;|@%5a0Oc&-(-q|?GokWkj z1xeQ-<_{$}RP9i|{Ho$>v~zu?cEZj9p2ag>N=n(n?~A(Y$Y|HOPy^p?m)TteS>kcL zisG5rXBBsC$EYK}74v zw-zgtjA8SKVB6_CNs~^JJSXFArDjj%;n76D=oUlWpb z%hU!LP9g_CD-eCn(h;!((HWs&!(Y^3TC=hubmZwZrr-&DOZ{(^~t;@lIPI9^l%#a@7emRZ8MGl>eR%&9;<{uu?IN)uc5qs_b88i8CT@y>RhzdCPYV=$gtgJ(O zwc#~$dh8a#0(xL(lk(tUGL#K0Z*Psv>n8*4sRdnwfoCVOXocti__~CQi^>(6PKZtvZ5VLG zLn#Tsh>E@�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 y@c915.6 WSGI servers

5.7 Continuous integration

-
GoCD
+

5.8 Configuration management

-
Salt
+

5.9 Containers

@@ -163,10 +163,10 @@

5.10 Serverless Architectures

6. DevOps

6.1 Monitoring

+ -
Sentry
-
Scout
+

6.2 Web App Performance

diff --git a/theme/templates/choices/datadog.html b/theme/templates/choices/datadog.html new file mode 100644 index 000000000..b4125904a --- /dev/null +++ b/theme/templates/choices/datadog.html @@ -0,0 +1,18 @@ +

What topic would you like to learn about now?

+
+
+
+ {% include "choices/buttons/web-analytics.html" %} +
+
+
+
+ {% include "choices/buttons/web-frameworks.html" %} +
+
+
+
+ {% include "choices/buttons/application-programming-interfaces.html" %} +
+
+
diff --git a/theme/templates/choices/gocd-continuous-integration.html b/theme/templates/choices/gocd-continuous-integration.html new file mode 100644 index 000000000..4e106900c --- /dev/null +++ b/theme/templates/choices/gocd-continuous-integration.html @@ -0,0 +1,18 @@ +

What topic would you like to learn about next?

+
+
+
+ {% include "choices/buttons/web-servers.html" %} +
+
+
+
+ {% include "choices/buttons/application-dependencies.html" %} +
+
+
+
+ {% include "choices/buttons/servers.html" %} +
+
+
diff --git a/theme/templates/choices/salt.html b/theme/templates/choices/salt.html new file mode 100644 index 000000000..c06ff5b36 --- /dev/null +++ b/theme/templates/choices/salt.html @@ -0,0 +1,18 @@ +

What's next after automating your deployment?

+
+
+
+ {% include "choices/buttons/continuous-integration.html" %} +
+
+
+
+ {% include "choices/buttons/web-analytics.html" %} +
+
+
+
+ {% include "choices/buttons/api-integration.html" %} +
+
+
diff --git a/theme/templates/choices/sentry.html b/theme/templates/choices/sentry.html new file mode 100644 index 000000000..175e95d46 --- /dev/null +++ b/theme/templates/choices/sentry.html @@ -0,0 +1,18 @@ +

What programming topic would you like to learn after Sentry?

+
+
+
+ {% include "choices/buttons/application-programming-interfaces.html" %} +
+
+
+
+ {% include "choices/buttons/web-frameworks.html" %} +
+
+
+
+ {% include "choices/buttons/web-analytics.html" %} +
+
+
diff --git a/theme/templates/sidebar.html b/theme/templates/sidebar.html index b3b460791..4c4cb774b 100644 --- a/theme/templates/sidebar.html +++ b/theme/templates/sidebar.html @@ -1,5 +1,4 @@ {% if page %} - {% include "sponsor.html" %} {% include "books-videos/learnmore.html" %} {% if not page.slug == "about-author" %} {% include "desktop-toc.html" %} From 2e3a9cdb5f04d1403b9bcf5b441f52e4fda5a590 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 2 Jan 2020 09:13:58 -0500 Subject: [PATCH 043/302] fix sidebar --- theme/templates/sidebar.html | 1 + 1 file changed, 1 insertion(+) diff --git a/theme/templates/sidebar.html b/theme/templates/sidebar.html index 4c4cb774b..b3b460791 100644 --- a/theme/templates/sidebar.html +++ b/theme/templates/sidebar.html @@ -1,4 +1,5 @@ {% if page %} + {% include "sponsor.html" %} {% include "books-videos/learnmore.html" %} {% if not page.slug == "about-author" %} {% include "desktop-toc.html" %} From bcccf8ba14edc4fd45b2b0f66cdc94a5c40b368b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 3 Jan 2020 17:50:56 -0500 Subject: [PATCH 044/302] add django webshell and simple task as example extensions --- .../django-extensions-plug-ins.markdown | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 6258c2fa8..2e46fa9df 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -410,6 +410,18 @@ open source under the * [django.db.models DateTimeField](/django-db-models-datetimefield-examples.html) +### django-simple-task +[django-simple-task](https://github.com/ericls/django-simple-task) +([project documentation](https://django-simple-task.readthedocs.io/) +and +[PyPI package information](https://pypi.org/project/django-simple-task/)) +is a task runner similar but more brittle than other +[task queues](/task-queues.html) such as [Celery](/celery.html) and +[RQ](/redis-queue-rq.html). django-simple-task requires Django 3.0's new +ASGI event loop functionality to work properly. It is open sourced under the +[MIT license](https://github.com/ericls/django-simple-task/blob/master/LICENSE). + + ### django-smithy [django-smithy](https://github.com/jamiecounsell/django-smithy) is a [Django](/django.html) code library that allows users to send @@ -460,6 +472,17 @@ and maintained by the collaborative developer community group [Jazzband](https://jazzband.co/). +### django-webshell +[django-webshell](https://github.com/onrik/django-webshell) is an extension +for executing arbitrary code in the +[Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/), +similar to how you can run code by using the `django manage.py shell` +command from the terminal. + +The django-webshell project is provided as open source under the +[MIT license](https://github.com/onrik/django-webshell/blob/master/LICENSE). + + ### django-wiki [django-wiki](https://github.com/django-wiki/django-wiki) ([project documentation](https://django-wiki.readthedocs.io/en/master/), From 98c2a4246adb7320f568df8aebd35c82c69e328e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 3 Jan 2020 18:03:57 -0500 Subject: [PATCH 045/302] add django-sitetree as example extension for django --- .../django/django-extensions-plug-ins.markdown | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 2e46fa9df..c8fb32742 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -422,6 +422,19 @@ ASGI event loop functionality to work properly. It is open sourced under the [MIT license](https://github.com/ericls/django-simple-task/blob/master/LICENSE). +### django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + + ### django-smithy [django-smithy](https://github.com/jamiecounsell/django-smithy) is a [Django](/django.html) code library that allows users to send From f186f73fa7b1212adbd356172b7ff65fdcef5098 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 3 Jan 2020 18:24:55 -0500 Subject: [PATCH 046/302] add django flexible subscriptions as example django extension --- .../django/django-extensions-plug-ins.markdown | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index c8fb32742..433c428bc 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -209,6 +209,19 @@ code. django-filter is provided as [open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). +### django-flexible-subscriptions +[django-flexible-subscriptions](https://github.com/studybuffalo/django-flexible-subscriptions) +([project documentation](https://django-flexible-subscriptions.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-flexible-subscriptions/)) +provides boilerplate code for adding subscription and recurrent billing +to [Django](/django.html) web applications. Various payment providers +can be added on the back end to run the transactions. + +The django-flexible-subscriptions project is open sourced under the +[GNU General Public License v3.0](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/LICENSE). + + ### django-floppyforms [django-floppyforms](https://github.com/jazzband/django-floppyforms) ([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) From 2590b73c83f3f7ed610003f728e33d4d6305b11f Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 5 Jan 2020 08:36:54 -0500 Subject: [PATCH 047/302] add django inline extensions as example project --- .../examples/django/django-extensions-plug-ins.markdown | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 433c428bc..617935b54 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -277,6 +277,15 @@ such as CSV, JSON and YAML. django-import-export is open source under the [BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). +### django-inline-actions +[django-inline-actions](https://github.com/escaped/django-inline-actions) +([PyPI package information](https://pypi.org/project/django-inline-actions/)) +is an extension that adds actions to the [Django](/django.html) +Admin InlineModelAdmin and ModelAdmin changelists. The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/escaped/django-inline-actions/blob/master/LICENSE). + + ### django-jet [django-jet](https://github.com/geex-arts/django-jet) ([project documentation](https://jet.readthedocs.io/en/latest/), From 382ffd2429dea73dbc84ce92f213c88e552d051b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 9 Jan 2020 09:01:31 -0500 Subject: [PATCH 048/302] add django-webtest as django example extension --- .../django/django-extensions-plug-ins.markdown | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 617935b54..5d9b3609e 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -518,6 +518,17 @@ The django-webshell project is provided as open source under the [MIT license](https://github.com/onrik/django-webshell/blob/master/LICENSE). +### django-webtest +[django-webtest](https://github.com/django-webtest/django-webtest) +([PyPI package information](https://pypi.org/project/django-webtest/)) +is a [Django](/django.html) extension that makes it easier to use +[WebTest](http://docs.pylonsproject.org/projects/webtest/) with +your projects. + +The project is open sourced under the +[MIT license](https://github.com/django-webtest/django-webtest/blob/master/LICENSE.txt). + + ### django-wiki [django-wiki](https://github.com/django-wiki/django-wiki) ([project documentation](https://django-wiki.readthedocs.io/en/master/), From 9fe3c01974434560cdef5b6c9aa6f6fee4f90254 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jan 2020 11:38:10 -0500 Subject: [PATCH 049/302] add morepath logo to page --- .../04-web-development/08-morepath.markdown | 2 ++ static/img/logos/morepath.jpg | Bin 0 -> 62433 bytes 2 files changed, 2 insertions(+) create mode 100644 static/img/logos/morepath.jpg diff --git a/content/pages/04-web-development/08-morepath.markdown b/content/pages/04-web-development/08-morepath.markdown index ef36ae2a0..d4a7dba8f 100644 --- a/content/pages/04-web-development/08-morepath.markdown +++ b/content/pages/04-web-development/08-morepath.markdown @@ -11,6 +11,8 @@ meta: Morepath is a Python web framework with a model-driven design approach. Le framework with a model-driven approach to creating web applications and web APIs. +Official Morepath web framework logo. + Morepath's framework philosophy is that the data models should drive the creation via the web framework. By default the framework routes URLs directly to model code, unlike for example Django which requires explicit URL routing diff --git a/static/img/logos/morepath.jpg b/static/img/logos/morepath.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2181b3532bccb3e2998e3f61e4b711f56430de8d GIT binary patch literal 62433 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 TQI&KM|3`H#|I6nQc1HgKF=l>6 literal 0 HcmV?d00001 From ebd9ad683bb2755cb9aad1c2c5587a696d2fcfc5 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 11 Jan 2020 16:37:23 -0600 Subject: [PATCH 050/302] add vue resource --- content/pages/04-web-development/25-vuejs.markdown | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/pages/04-web-development/25-vuejs.markdown b/content/pages/04-web-development/25-vuejs.markdown index 92b3814b6..73c979499 100644 --- a/content/pages/04-web-development/25-vuejs.markdown +++ b/content/pages/04-web-development/25-vuejs.markdown @@ -41,7 +41,12 @@ rich apps that run in web browsers. * [Developing a Single Page App with Flask and Vue.js](https://testdriven.io/blog/developing-a-single-page-app-with-flask-and-vuejs/) walks through all of the environment configuration, project setup and coding you need to do to build a legitimate Vue.js application that - uses a [Flask](/flask.html) API on the backend. + uses a [Flask](/flask.html) API on the backend. + +* [Learn Vue by Building and Deploying a CRUD App](https://testdriven.io/courses/learn-vue/?utm_source=fsp) + is an awesome course that walks through the Vue basics and building + a whole application and deploying it to + [Netlify](https://www.netlify.com/). * The official [Vue.js getting started documentation](https://vuejs.org/v2/guide/) From 6bf20dffcd8b454d2cccb87b7aae7edfbb541f79 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 12 Jan 2020 08:45:24 -0600 Subject: [PATCH 051/302] add smallintegerfield to django examples. fix some details of other examples --- ...-models-positivesmallintegerfield.markdown | 245 +++++++- ...jango-db-models-smallintegerfield.markdown | 594 ++++++++++++++++++ theme/templates/sidebar.html | 1 - theme/templates/table-of-contents.html | 1 + 4 files changed, 838 insertions(+), 3 deletions(-) create mode 100644 content/pages/examples/django/django-db-models-smallintegerfield.markdown diff --git a/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown b/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown index f7ce54dbf..0b6f83af5 100644 --- a/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown +++ b/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown @@ -8,10 +8,10 @@ meta: Python code examples for the PositiveSmallIntegerField class used in the D [PositiveSmallIntegerField](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) -([documentation](https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.PositiveIntegerField)) +([documentation](https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.PositiveSmallIntegerField)) is a [Django ORM](/django-orm.html) mapping from your Python code to an integer-type column in your [relational database](/databases.html) -that is restricted to only positive values from 0 to 2147483647. +that is restricted to only positive values from 0 to 32767. Note that `PositiveSmallIntegerField` is defined within the [django.db.models.fields](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) @@ -348,3 +348,244 @@ def inlineformset_factory(parent_model, model, form=ModelForm, ``` +## Example 4 from django-flexible-subscriptions +[django-flexible-subscriptions](https://github.com/studybuffalo/django-flexible-subscriptions) +([project documentation](https://django-flexible-subscriptions.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-flexible-subscriptions/)) +provides boilerplate code for adding subscription and recurrent billing +to [Django](/django.html) web applications. Various payment providers +can be added on the back end to run the transactions. + +The django-flexible-subscriptions project is open sourced under the +[GNU General Public License v3.0](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/LICENSE). + +[**django-flexible-subscriptions / subscriptions / . / models.py**](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/subscriptions/./models.py) + +```python +"""Models for the Flexible Subscriptions app.""" +from datetime import timedelta +from uuid import uuid4 + +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group +from django.core.validators import MinValueValidator +~~from django.db import models +from django.utils.translation import ugettext_lazy as _ + + +# Convenience references for units for plan recurrence billing +# ---------------------------------------------------------------------------- +ONCE = '0' +SECOND = '1' +MINUTE = '2' +HOUR = '3' +DAY = '4' +WEEK = '5' +MONTH = '6' +YEAR = '7' +RECURRENCE_UNIT_CHOICES = ( + (ONCE, 'once'), + (SECOND, 'second'), + (MINUTE, 'minute'), + (HOUR, 'hour'), + (DAY, 'day'), + (WEEK, 'week'), + (MONTH, 'month'), + (YEAR, 'year'), +) +# ---------------------------------------------------------------------------- + +class PlanTag(models.Model): + """A tag for a subscription plan.""" + tag = models.CharField( + help_text=_('the tag name'), + max_length=64, + unique=True, + ) + + class Meta: + ordering = ('tag',) + + def __str__(self): + return self.tag + +class SubscriptionPlan(models.Model): + """Details for a subscription plan.""" + id = models.UUIDField( + default=uuid4, + editable=False, + primary_key=True, + verbose_name='ID', + ) + plan_name = models.CharField( + help_text=_('the name of the subscription plan'), + max_length=128, + ) + plan_description = models.CharField( + blank=True, + help_text=_('a description of the subscription plan'), + max_length=512, + null=True, + ) + group = models.ForeignKey( + Group, + blank=True, + help_text=_('the Django auth group for this plan'), + null=True, + on_delete=models.SET_NULL, + related_name='plans', + ) + tags = models.ManyToManyField( + PlanTag, + blank=True, + help_text=_('any tags associated with this plan'), + related_name='plans', + ) + grace_period = models.PositiveIntegerField( + default=0, + help_text=_( + 'how many days after the subscription ends before the ' + 'subscription expires' + ), + ) + + class Meta: + ordering = ('plan_name',) + permissions = ( + ('subscriptions', 'Can interact with subscription details'), + ) + + def __str__(self): + return self.plan_name + + def display_tags(self): + """Displays tags as a string (truncates if more than 3).""" + if self.tags.count() > 3: + return '{}, ...'.format( + ', '.join(tag.tag for tag in self.tags.all()[:3]) + ) + + return ', '.join(tag.tag for tag in self.tags.all()[:3]) + +class PlanCost(models.Model): + """Cost and frequency of billing for a plan.""" + id = models.UUIDField( + default=uuid4, + editable=False, + primary_key=True, + verbose_name='ID', + ) + plan = models.ForeignKey( + SubscriptionPlan, + help_text=_('the subscription plan for these cost details'), + on_delete=models.CASCADE, + related_name='costs', + ) +~~ recurrence_period = models.PositiveSmallIntegerField( +~~ default=1, +~~ help_text=_('how often the plan is billed (per recurrence unit)'), +~~ validators=[MinValueValidator(1)], +~~ ) + recurrence_unit = models.CharField( + choices=RECURRENCE_UNIT_CHOICES, + default=MONTH, + max_length=1, + ) + cost = models.DecimalField( + blank=True, + decimal_places=4, + help_text=_('the cost per recurrence of the plan'), + max_digits=19, + null=True, + ) + +~~ class Meta: +~~ ordering = ('recurrence_unit', 'recurrence_period', 'cost',) + + @property + def display_recurrent_unit_text(self): + """Converts recurrence_unit integer to text.""" + conversion = { + ONCE: 'one-time', + SECOND: 'per second', + MINUTE: 'per minute', + HOUR: 'per hour', + DAY: 'per day', + WEEK: 'per week', + MONTH: 'per month', + YEAR: 'per year', + } + + return conversion[self.recurrence_unit] + + @property + def display_billing_frequency_text(self): + """Generates human-readable billing frequency.""" + conversion = { + ONCE: 'one-time', + SECOND: {'singular': 'per second', 'plural': 'seconds'}, + MINUTE: {'singular': 'per minute', 'plural': 'minutes'}, + HOUR: {'singular': 'per hour', 'plural': 'hours'}, + DAY: {'singular': 'per day', 'plural': 'days'}, + WEEK: {'singular': 'per week', 'plural': 'weeks'}, + MONTH: {'singular': 'per month', 'plural': 'months'}, + YEAR: {'singular': 'per year', 'plural': 'years'}, + } + + if self.recurrence_unit == ONCE: + return conversion[ONCE] + +~~ if self.recurrence_period == 1: +~~ return conversion[self.recurrence_unit]['singular'] + +~~ return 'every {} {}'.format( +~~ self.recurrence_period, conversion[self.recurrence_unit]['plural'] +~~ ) + + def next_billing_datetime(self, current): + """Calculates next billing date for provided datetime. + + Parameters: + current (datetime): The current datetime to compare + against. + + Returns: + datetime: The next time billing will be due. + """ +~~ if self.recurrence_unit == SECOND: +~~ return current + timedelta(seconds=self.recurrence_period) + +~~ if self.recurrence_unit == MINUTE: +~~ return current + timedelta(minutes=self.recurrence_period) + +~~ if self.recurrence_unit == HOUR: +~~ return current + timedelta(hours=self.recurrence_period) + +~~ if self.recurrence_unit == DAY: +~~ return current + timedelta(days=self.recurrence_period) + +~~ if self.recurrence_unit == WEEK: +~~ return current + timedelta(weeks=self.recurrence_period) + +~~ if self.recurrence_unit == MONTH: +~~ # Adds the average number of days per month as per: +~~ # http://en.wikipedia.org/wiki/Month#Julian_and_Gregorian_calendars +~~ # This handle any issues with months < 31 days and leap years +~~ return current + timedelta( +~~ days=30.4368 * self.recurrence_period +~~ ) + +~~ if self.recurrence_unit == YEAR: +~~ # Adds the average number of days per year as per: +~~ # http://en.wikipedia.org/wiki/Year#Calendar_year +~~ # This handle any issues with leap years +~~ return current + timedelta( +~~ days=365.2425 * self.recurrence_period +~~ ) + +~~ return None + + +## ... source file continues with no further relevant examples ... +``` diff --git a/content/pages/examples/django/django-db-models-smallintegerfield.markdown b/content/pages/examples/django/django-db-models-smallintegerfield.markdown new file mode 100644 index 000000000..77c19fe30 --- /dev/null +++ b/content/pages/examples/django/django-db-models-smallintegerfield.markdown @@ -0,0 +1,594 @@ +title: django.db.models SmallIntegerField Code Examples +category: page +slug: django-db-models-smallintegerfield-examples +sortorder: 500012903 +toc: False +sidebartitle: django.db.models PositiveSmallIntegerField +meta: Python code examples for the PositiveSmallIntegerField class used in the Django ORM, found within the django.db.models module of the Django project. + + +[SmallIntegerField](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) +([documentation](https://docs.djangoproject.com/en/stable/ref/models/fields/#django.db.models.SmallIntegerField)) +is a [Django ORM](/django-orm.html) mapping from your Python code to an +integer-type column in your [relational database](/databases.html) +that is restricted to integer values only between -32768 and 32767. + +Note that `SmallIntegerField` is defined within the +[django.db.models.fields](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) +module but is typically referenced from +[django.db.models](https://github.com/django/django/tree/master/django/db/models) +rather than including the `fields` module reference. + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / embeds / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/embeds/models.py) + +```python +# models.py +~~from django.db import models +from django.utils.translation import ugettext_lazy as _ + +EMBED_TYPES = ( + ('video', 'Video'), + ('photo', 'Photo'), + ('link', 'Link'), + ('rich', 'Rich'), +) + + +class Embed(models.Model): + """ + When embed code is fetched from a provider (eg, youtube) we cache that code + in the database so we don't need to ask for it again. + + This model is used for caching the embed html code. It also stores some + metadata which gets displayed in the editor. + + If an instance of this model is deleted, it will be automatically refetched + next time the embed code is needed. + """ + url = models.URLField() +~~ max_width = models.SmallIntegerField(null=True, blank=True) + type = models.CharField(max_length=10, choices=EMBED_TYPES) + html = models.TextField(blank=True) + title = models.TextField(blank=True) + author_name = models.TextField(blank=True) + provider_name = models.TextField(blank=True) + thumbnail_url = models.URLField(max_length=255, null=True, blank=True) + width = models.IntegerField(null=True, blank=True) + height = models.IntegerField(null=True, blank=True) + last_updated = models.DateTimeField(auto_now=True) + + class Meta: + unique_together = ('url', 'max_width') + verbose_name = _('embed') + verbose_name_plural = _('embeds') + + @property + def ratio(self): + if self.width and self.height: + return self.height / self.width + + @property + def ratio_css(self): + ratio = self.ratio + if ratio: + return str(ratio * 100) + "%" + + @property + def is_responsive(self): + return self.ratio is not None + + def __str__(self): + return self.url + +``` + + +## Example 2 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / migrations / 0001_initial.py**](https://github.com/divio/django-filer/blob/develop/filer/migrations/0001_initial.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import django.db.models.deletion +from django.conf import settings +~~from django.db import migrations, models + +import filer.fields.multistorage_file +import filer.models.mixins +from filer.settings import FILER_IMAGE_MODEL + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Clipboard', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ], + options={ + 'verbose_name': 'clipboard', + 'verbose_name_plural': 'clipboards', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ClipboardItem', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('clipboard', models.ForeignKey(verbose_name='clipboard', to='filer.Clipboard', on_delete=django.db.models.deletion.CASCADE)), + ], + options={ + 'verbose_name': 'clipboard item', + 'verbose_name_plural': 'clipboard items', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='File', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('file', filer.fields.multistorage_file.MultiStorageFileField(max_length=255, upload_to=filer.fields.multistorage_file.generate_filename_multistorage, null=True, verbose_name='file', blank=True)), + ('_file_size', models.IntegerField(null=True, verbose_name='file size', blank=True)), + ('sha1', models.CharField(default='', max_length=40, verbose_name='sha1', blank=True)), + ('has_all_mandatory_data', models.BooleanField(default=False, verbose_name='has all mandatory data', editable=False)), + ('original_filename', models.CharField(max_length=255, null=True, verbose_name='original filename', blank=True)), + ('name', models.CharField(default='', max_length=255, verbose_name='name', blank=True)), + ('description', models.TextField(null=True, verbose_name='description', blank=True)), + ('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='uploaded at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('is_public', models.BooleanField(default=True, help_text='Disable any permission checking for this file. File will be publicly accessible to anyone.', verbose_name='Permissions disabled')), + ], + options={ + 'verbose_name': 'file', + 'verbose_name_plural': 'files', + }, + bases=(models.Model, filer.models.mixins.IconsMixin), + ), + migrations.CreateModel( + name='Folder', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=255, verbose_name='name')), + ('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='uploaded at')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('modified_at', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('lft', models.PositiveIntegerField(editable=False, db_index=True)), + ('rght', models.PositiveIntegerField(editable=False, db_index=True)), + ('tree_id', models.PositiveIntegerField(editable=False, db_index=True)), + ('level', models.PositiveIntegerField(editable=False, db_index=True)), + ('owner', models.ForeignKey(related_name='filer_owned_folders', verbose_name='owner', blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=django.db.models.deletion.CASCADE)), + ('parent', models.ForeignKey(related_name='children', verbose_name='parent', blank=True, to='filer.Folder', null=True, on_delete=django.db.models.deletion.CASCADE)), + ], + options={ + 'ordering': ('name',), + 'verbose_name': 'Folder', + 'verbose_name_plural': 'Folders', + 'permissions': (('can_use_directory_listing', 'Can use directory listing'),), + }, + bases=(models.Model, filer.models.mixins.IconsMixin), + ), + migrations.CreateModel( + name='FolderPermission', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), +~~ ('type', models.SmallIntegerField(default=0, verbose_name='type', choices=[(0, 'all items'), (1, 'this item only'), (2, 'this item and all children')])), + ('everybody', models.BooleanField(default=False, verbose_name='everybody')), +~~ ('can_edit', models.SmallIntegerField(default=None, null=True, verbose_name='can edit', blank=True, choices=[(1, 'allow'), (0, 'deny')])), +~~ ('can_read', models.SmallIntegerField(default=None, null=True, verbose_name='can read', blank=True, choices=[(1, 'allow'), (0, 'deny')])), +~~ ('can_add_children', models.SmallIntegerField(default=None, null=True, verbose_name='can add children', blank=True, choices=[(1, 'allow'), (0, 'deny')])), + ('folder', models.ForeignKey(verbose_name='folder', blank=True, to='filer.Folder', null=True, on_delete=django.db.models.deletion.CASCADE)), + ('group', models.ForeignKey(related_name='filer_folder_permissions', verbose_name='group', blank=True, to='auth.Group', null=True, on_delete=django.db.models.deletion.CASCADE)), + ('user', models.ForeignKey(related_name='filer_folder_permissions', verbose_name='user', blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=django.db.models.deletion.CASCADE)), + ], + options={ + 'verbose_name': 'folder permission', + 'verbose_name_plural': 'folder permissions', + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='folder', + unique_together=set([('parent', 'name')]), + ), + migrations.AddField( + model_name='file', + name='folder', + field=models.ForeignKey(related_name='all_files', verbose_name='folder', blank=True, to='filer.Folder', null=True, on_delete=django.db.models.deletion.CASCADE), + preserve_default=True, + ), + migrations.AddField( + model_name='file', + name='owner', + field=models.ForeignKey(related_name='owned_files', verbose_name='owner', blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=django.db.models.deletion.CASCADE), + preserve_default=True, + ), + migrations.AddField( + model_name='file', + name='polymorphic_ctype', + field=models.ForeignKey(related_name='polymorphic_filer.file_set', editable=False, to='contenttypes.ContentType', null=True, on_delete=django.db.models.deletion.CASCADE), + preserve_default=True, + ), + migrations.AddField( + model_name='clipboarditem', + name='file', + field=models.ForeignKey(verbose_name='file', to='filer.File', on_delete=django.db.models.deletion.CASCADE), + preserve_default=True, + ), + migrations.AddField( + model_name='clipboard', + name='files', + field=models.ManyToManyField(related_name='in_clipboards', verbose_name='files', through='filer.ClipboardItem', to='filer.File'), + preserve_default=True, + ), + migrations.AddField( + model_name='clipboard', + name='user', + field=models.ForeignKey(related_name='filer_clipboards', verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=django.db.models.deletion.CASCADE), + preserve_default=True, + ), + migrations.CreateModel( + name='Image', + fields=[ + ('file_ptr', models.OneToOneField(serialize=False, auto_created=True, to='filer.File', primary_key=True, parent_link=True, on_delete=django.db.models.deletion.CASCADE)), + ('_height', models.IntegerField(null=True, blank=True)), + ('_width', models.IntegerField(null=True, blank=True)), + ('date_taken', models.DateTimeField(verbose_name='date taken', null=True, editable=False, blank=True)), + ('default_alt_text', models.CharField(max_length=255, null=True, verbose_name='default alt text', blank=True)), + ('default_caption', models.CharField(max_length=255, null=True, verbose_name='default caption', blank=True)), + ('author', models.CharField(max_length=255, null=True, verbose_name='author', blank=True)), + ('must_always_publish_author_credit', models.BooleanField(default=False, verbose_name='must always publish author credit')), + ('must_always_publish_copyright', models.BooleanField(default=False, verbose_name='must always publish copyright')), + ('subject_location', models.CharField(default=None, max_length=64, null=True, verbose_name='subject location', blank=True)), + ], + options={ + 'swappable': 'FILER_IMAGE_MODEL', + 'verbose_name': 'image', + 'verbose_name_plural': 'images', + }, + bases=('filer.file',), + ) + ] + +``` + + +## Example 3 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / migrations / 0002_auto_20140816_1918.py**](https://github.com/divio/django-cms/blob/develop/cms/migrations/0002_auto_20140816_1918.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import cms.models.static_placeholder +import cms.models.fields +from django.conf import settings +from django.contrib.auth import get_user_model +~~from django.db import models, migrations +import django.utils.timezone + +User = get_user_model() + +user_model_label = '%s.%s' % (User._meta.app_label, User._meta.model_name) +user_ptr_name = '%s_ptr' % User._meta.object_name.lower() + + +class Migration(migrations.Migration): + + dependencies = [ + ('cms', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='PageUser', + fields=[ + (user_ptr_name, models.OneToOneField(primary_key=True, to=settings.AUTH_USER_MODEL, auto_created=True, parent_link=True, serialize=False, on_delete=models.CASCADE)), + ('created_by', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='created_users', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'User (page)', + 'verbose_name_plural': 'Users (page)', + }, + bases=(user_model_label,), + ), + migrations.CreateModel( + name='PageUserGroup', + fields=[ + ('group_ptr', models.OneToOneField(primary_key=True, to='auth.Group', auto_created=True, parent_link=True, serialize=False, on_delete=models.CASCADE)), + ('created_by', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='created_usergroups', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'User group (page)', + 'verbose_name_plural': 'User groups (page)', + }, + bases=('auth.group',), + ), + migrations.CreateModel( + name='Placeholder', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', auto_created=True, serialize=False)), + ('slot', models.CharField(db_index=True, max_length=50, verbose_name='slot', editable=False)), + ('default_width', models.PositiveSmallIntegerField(null=True, verbose_name='width', editable=False)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='page', + name='placeholders', + field=models.ManyToManyField(to='cms.Placeholder', editable=False), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='page', + unique_together=set([('publisher_is_draft', 'application_namespace'), ('reverse_id', 'site', 'publisher_is_draft')]), + ), + migrations.AddField( + model_name='cmsplugin', + name='placeholder', + field=models.ForeignKey(null=True, to='cms.Placeholder', editable=False, on_delete=models.CASCADE), + preserve_default=True, + ), + migrations.AddField( + model_name='aliaspluginmodel', + name='alias_placeholder', + field=models.ForeignKey(null=True, to='cms.Placeholder', related_name='alias_placeholder', editable=False, on_delete=models.CASCADE), + preserve_default=True, + ), + migrations.CreateModel( + name='PlaceholderReference', + fields=[ + ('cmsplugin_ptr', models.OneToOneField(primary_key=True, to='cms.CMSPlugin', auto_created=True, parent_link=True, serialize=False, on_delete=models.CASCADE)), + ('name', models.CharField(max_length=255)), + ('placeholder_ref', cms.models.fields.PlaceholderField(null=True, to='cms.Placeholder', slotname='clipboard', editable=False)), + ], + options={ + }, + bases=('cms.cmsplugin',), + ), + migrations.CreateModel( + name='StaticPlaceholder', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', auto_created=True, serialize=False)), + ('name', models.CharField(max_length=255, default='', help_text='Descriptive name to identify this static placeholder. Not displayed to users.', blank=True, verbose_name='static placeholder name')), + ('code', models.CharField(max_length=255, verbose_name='placeholder code', help_text='To render the static placeholder in templates.', blank=True)), + ('dirty', models.BooleanField(default=False, editable=False)), + ('creation_method', models.CharField(max_length=20, default='code', blank=True, verbose_name='creation_method', choices=cms.models.static_placeholder.StaticPlaceholder.CREATION_METHODS)), + ('draft', cms.models.fields.PlaceholderField(null=True, to='cms.Placeholder', verbose_name='placeholder content', related_name='static_draft', slotname=cms.models.static_placeholder.static_slotname, editable=False)), + ('public', cms.models.fields.PlaceholderField(null=True, to='cms.Placeholder', slotname=cms.models.static_placeholder.static_slotname, related_name='static_public', editable=False)), + ('site', models.ForeignKey(null=True, to='sites.Site', blank=True, on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'static placeholder', + 'verbose_name_plural': 'static placeholders', + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='staticplaceholder', + unique_together=set([('code', 'site')]), + ), + migrations.CreateModel( + name='Title', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', auto_created=True, serialize=False)), + ('language', models.CharField(db_index=True, max_length=15, verbose_name='language')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('page_title', models.CharField(max_length=255, null=True, help_text='overwrite the title (html title tag)', blank=True, verbose_name='title')), + ('menu_title', models.CharField(max_length=255, null=True, help_text='overwrite the title in the menu', blank=True, verbose_name='title')), + ('meta_description', models.TextField(max_length=155, null=True, help_text='The text displayed in search engines.', blank=True, verbose_name='description')), + ('slug', models.SlugField(max_length=255, verbose_name='slug')), + ('path', models.CharField(db_index=True, max_length=255, verbose_name='Path')), + ('has_url_overwrite', models.BooleanField(db_index=True, default=False, editable=False, verbose_name='has url overwrite')), + ('redirect', models.CharField(max_length=255, null=True, blank=True, verbose_name='redirect')), + ('creation_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation date', editable=False)), + ('published', models.BooleanField(default=False, verbose_name='is published')), + ('publisher_is_draft', models.BooleanField(db_index=True, default=True, editable=False)), +~~ ('publisher_state', models.SmallIntegerField(db_index=True, default=0, editable=False)), + ('page', models.ForeignKey(to='cms.Page', verbose_name='page', related_name='title_set', on_delete=models.CASCADE)), + ('publisher_public', models.OneToOneField(null=True, to='cms.Title', related_name='publisher_draft', editable=False, on_delete=models.CASCADE)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='title', + unique_together=set([('language', 'page')]), + ), + migrations.CreateModel( + name='UserSettings', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', auto_created=True, serialize=False)), + ('language', models.CharField(max_length=10, choices=settings.LANGUAGES, help_text='The language for the admin interface and toolbar', verbose_name='Language')), + ('clipboard', models.ForeignKey(null=True, to='cms.Placeholder', blank=True, editable=False, on_delete=models.CASCADE)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, unique=True, related_name='djangocms_usersettings', editable=False, on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'user setting', + 'verbose_name_plural': 'user settings', + }, + bases=(models.Model,), + ), + ] + +``` + + +## Example 4 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / . / filterset.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./filterset.py) + +```python +import copy +from collections import OrderedDict + +from django import forms +~~from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.fields.related import ( + ManyToManyRel, + ManyToOneRel, + OneToOneRel +) + +from .conf import settings +from .constants import ALL_FIELDS +from .filters import ( + BaseInFilter, + BaseRangeFilter, + BooleanFilter, + CharFilter, + ChoiceFilter, + DateFilter, + DateTimeFilter, + DurationFilter, + Filter, + ModelChoiceFilter, + ModelMultipleChoiceFilter, + NumberFilter, + TimeFilter, + UUIDFilter +) +from .utils import ( + get_all_model_fields, + get_model_field, + resolve_field, + try_dbfield +) + + +def remote_queryset(field): + """ + Get the queryset for the other side of a relationship. This works + for both `RelatedField`s and `ForignObjectRel`s. + """ + model = field.related_model + + # Reverse relationships do not have choice limits + if not hasattr(field, 'get_limit_choices_to'): + return model._default_manager.all() + + limit_choices_to = field.get_limit_choices_to() + return model._default_manager.complex_filter(limit_choices_to) + + +class FilterSetOptions(object): + def __init__(self, options=None): + self.model = getattr(options, 'model', None) + self.fields = getattr(options, 'fields', None) + self.exclude = getattr(options, 'exclude', None) + + self.filter_overrides = getattr(options, 'filter_overrides', {}) + + +class FilterSetMetaclass(type): + def __new__(cls, name, bases, attrs): + attrs['declared_filters'] = cls.get_declared_filters(bases, attrs) + + new_class = super().__new__(cls, name, bases, attrs) + new_class._meta = FilterSetOptions(getattr(new_class, 'Meta', None)) + new_class.base_filters = new_class.get_filters() + + # TODO: remove assertion in 2.1 + assert not hasattr(new_class, 'filter_for_reverse_field'), ( + "`%(cls)s.filter_for_reverse_field` has been removed. " + "`%(cls)s.filter_for_field` now generates filters for reverse fields. " + "See: https://django-filter.readthedocs.io/en/master/guide/migration.html" + % {'cls': new_class.__name__} + ) + + return new_class + + @classmethod + def get_declared_filters(cls, bases, attrs): + filters = [ + (filter_name, attrs.pop(filter_name)) + for filter_name, obj in list(attrs.items()) + if isinstance(obj, Filter) + ] + + # Default the `filter.field_name` to the attribute name on the filterset + for filter_name, f in filters: + if getattr(f, 'field_name', None) is None: + f.field_name = filter_name + + filters.sort(key=lambda x: x[1].creation_counter) + + # merge declared filters from base classes + for base in reversed(bases): + if hasattr(base, 'declared_filters'): + filters = [ + (name, f) for name, f + in base.declared_filters.items() + if name not in attrs + ] + filters + + return OrderedDict(filters) + + +FILTER_FOR_DBFIELD_DEFAULTS = { + models.AutoField: {'filter_class': NumberFilter}, + models.CharField: {'filter_class': CharFilter}, + models.TextField: {'filter_class': CharFilter}, + models.BooleanField: {'filter_class': BooleanFilter}, + models.DateField: {'filter_class': DateFilter}, + models.DateTimeField: {'filter_class': DateTimeFilter}, + models.TimeField: {'filter_class': TimeFilter}, + models.DurationField: {'filter_class': DurationFilter}, + models.DecimalField: {'filter_class': NumberFilter}, +~~ models.SmallIntegerField: {'filter_class': NumberFilter}, + models.IntegerField: {'filter_class': NumberFilter}, + models.PositiveIntegerField: {'filter_class': NumberFilter}, + models.PositiveSmallIntegerField: {'filter_class': NumberFilter}, + models.FloatField: {'filter_class': NumberFilter}, + models.NullBooleanField: {'filter_class': BooleanFilter}, + models.SlugField: {'filter_class': CharFilter}, + models.EmailField: {'filter_class': CharFilter}, + models.FilePathField: {'filter_class': CharFilter}, + models.URLField: {'filter_class': CharFilter}, + models.GenericIPAddressField: {'filter_class': CharFilter}, + models.CommaSeparatedIntegerField: {'filter_class': CharFilter}, + models.UUIDField: {'filter_class': UUIDFilter}, + + +## ... source file continues with no further relevant examples ... +``` diff --git a/theme/templates/sidebar.html b/theme/templates/sidebar.html index b3b460791..4c4cb774b 100644 --- a/theme/templates/sidebar.html +++ b/theme/templates/sidebar.html @@ -1,5 +1,4 @@ {% if page %} - {% include "sponsor.html" %} {% include "books-videos/learnmore.html" %} {% if not page.slug == "about-author" %} {% include "desktop-toc.html" %} diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index 0f66d8eee..2e683c4c0 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -79,6 +79,7 @@

django.db.models PositiveSmallIntegerField, signal, SlugField, + SmallIntegerField, TextField

django.dispatch.dispatcher Signal

From 333cf3b56ef44e2a66ad2a9c57b2bdca95ec906e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 13 Jan 2020 08:24:44 -0500 Subject: [PATCH 052/302] working on resolver404 example code --- ...-models-positivesmallintegerfield.markdown | 2 +- ...jango-db-models-smallintegerfield.markdown | 4 +- ...go-urls-exceptions-noreversematch.markdown | 194 +++++++++++++- ...jango-urls-exceptions-resolver404.markdown | 240 ++++++++++++++++++ content/pages/meta/00-change-log.markdown | 3 + theme/templates/sidebar.html | 1 + theme/templates/table-of-contents.html | 38 ++- 7 files changed, 462 insertions(+), 20 deletions(-) create mode 100644 content/pages/examples/django/django-urls-exceptions-resolver404.markdown diff --git a/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown b/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown index 0b6f83af5..923064189 100644 --- a/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown +++ b/content/pages/examples/django/django-db-models-positivesmallintegerfield.markdown @@ -8,7 +8,7 @@ meta: Python code examples for the PositiveSmallIntegerField class used in the D [PositiveSmallIntegerField](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) -([documentation](https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.PositiveSmallIntegerField)) +([documentation](https://docs.djangoproject.com/en/stable/ref/models/fields/#django.db.models.PositiveSmallIntegerField)) is a [Django ORM](/django-orm.html) mapping from your Python code to an integer-type column in your [relational database](/databases.html) that is restricted to only positive values from 0 to 32767. diff --git a/content/pages/examples/django/django-db-models-smallintegerfield.markdown b/content/pages/examples/django/django-db-models-smallintegerfield.markdown index 77c19fe30..5a489cac6 100644 --- a/content/pages/examples/django/django-db-models-smallintegerfield.markdown +++ b/content/pages/examples/django/django-db-models-smallintegerfield.markdown @@ -3,8 +3,8 @@ category: page slug: django-db-models-smallintegerfield-examples sortorder: 500012903 toc: False -sidebartitle: django.db.models PositiveSmallIntegerField -meta: Python code examples for the PositiveSmallIntegerField class used in the Django ORM, found within the django.db.models module of the Django project. +sidebartitle: django.db.models SmallIntegerField +meta: Python code examples for the SmallIntegerField class used in the Django ORM, found within django.db.models. [SmallIntegerField](https://github.com/django/django/blob/master/django/db/models/fields/__init__.py) diff --git a/content/pages/examples/django/django-urls-exceptions-noreversematch.markdown b/content/pages/examples/django/django-urls-exceptions-noreversematch.markdown index 05d83bd4c..2c5a6326e 100644 --- a/content/pages/examples/django/django-urls-exceptions-noreversematch.markdown +++ b/content/pages/examples/django/django-urls-exceptions-noreversematch.markdown @@ -1,14 +1,14 @@ title: django.urls.exceptions NoReverseMatch Python Code Examples category: page slug: django-urls-exceptions-noreversematch-examples -sortorder: 500013610 +sortorder: 500013640 toc: False sidebartitle: django.urls.exceptions NoReverseMatch meta: Python example code for the NoReverseMatch exception class from the django.urls.exceptions module. -[NoReverseMatch](https://docs.djangoproject.com/en/dev/ref/exceptions/#noreversematch) -([source code](https://github.com/django/django/blob/b9cf764be62e77b4777b3a75ec256f6209a57671/django/urls/exceptions.py)) +[NoReverseMatch](https://docs.djangoproject.com/en/stable/ref/exceptions/#noreversematch) +([source code](https://github.com/django/django/blob/master/django/urls/exceptions.py)) is a [Django](/django.html) exception that is raised when a URL cannot be matched against any string or regular express in your URL configuration. @@ -103,3 +103,191 @@ def get_current_remote_methods(view): return _get_remote_methods_for(view, view.request.path_info) ``` + + +## Example 2 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / mixins.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/mixins.py) + +```python +import json + +from django.conf import settings +try: + from django.core import urlresolvers +except ImportError: + from django import urls as urlresolvers +~~try: +~~ from django.urls.exceptions import NoReverseMatch +~~except ImportError: +~~ from django.core.urlresolvers import NoReverseMatch +from django.utils.html import format_html +from django.utils.safestring import mark_safe + +MAX = 75 + + +class LogEntryAdminMixin(object): + + def created(self, obj): + return obj.timestamp.strftime('%Y-%m-%d %H:%M:%S') + created.short_description = 'Created' + + def user_url(self, obj): + if obj.actor: + app_label, model = settings.AUTH_USER_MODEL.split('.') + viewname = 'admin:%s_%s_change' % (app_label, model.lower()) +~~ try: +~~ link = urlresolvers.reverse(viewname, args=[obj.actor.id]) +~~ except NoReverseMatch: +~~ return u'%s' % (obj.actor) + return format_html(u'{}', link, obj.actor) + + return 'system' + user_url.short_description = 'User' + + def resource_url(self, obj): + app_label, model = obj.content_type.app_label, obj.content_type.model + viewname = 'admin:%s_%s_change' % (app_label, model) +~~ try: +~~ args = [obj.object_pk] if obj.object_id is None else [obj.object_id] +~~ link = urlresolvers.reverse(viewname, args=args) +~~ except NoReverseMatch: +~~ return obj.object_repr +~~ else: +~~ return format_html(u'{}', link, obj.object_repr) + resource_url.short_description = 'Resource' + + def msg_short(self, obj): + if obj.action == 2: + return '' # delete + changes = json.loads(obj.changes) + s = '' if len(changes) == 1 else 's' + fields = ', '.join(changes.keys()) + if len(fields) > MAX: + i = fields.rfind(' ', 0, MAX) + fields = fields[:i] + ' ..' + return '%d change%s: %s' % (len(changes), s, fields) + msg_short.short_description = 'Changes' + + def msg(self, obj): + if obj.action == 2: + return '' # delete + changes = json.loads(obj.changes) + msg = '' + for i, field in enumerate(sorted(changes), 1): + value = [i, field] + (['***', '***'] if field == 'password' else changes[field]) + msg += format_html('', *value) + + msg += '
#FieldFromTo
{}{}{}{}
' + return mark_safe(msg) + msg.short_description = 'Changes' + +``` + + +## Example 3 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / models / filemodels.py**](https://github.com/divio/django-filer/blob/develop/filer/models/filemodels.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import absolute_import, unicode_literals + +import hashlib +import os +from datetime import datetime + +from django.conf import settings +from django.core.files.base import ContentFile +from django.db import models +~~from django.urls import NoReverseMatch, reverse +from django.utils import timezone +from django.utils.encoding import python_2_unicode_compatible +from django.utils.translation import ugettext_lazy as _ + +from .. import settings as filer_settings +from ..fields.multistorage_file import MultiStorageFileField +from . import mixins +from .foldermodels import Folder + + +try: + from polymorphic.models import PolymorphicModel + from polymorphic.managers import PolymorphicManager +except ImportError: + # django-polymorphic < 0.8 + from polymorphic import PolymorphicModel, PolymorphicManager + + +class FileManager(PolymorphicManager): + def find_all_duplicates(self): + r = {} + for file_obj in self.all(): + if file_obj.sha1: + q = self.filter(sha1=file_obj.sha1) + if len(q) > 1: + r[file_obj.sha1] = q + return r + + def find_duplicates(self, file_obj): + return [i for i in self.exclude(pk=file_obj.pk).filter(sha1=file_obj.sha1)] + + +def is_public_default(): + # not using this setting directly as `is_public` default value + # so that Django doesn't generate new migrations upon setting change + return filer_settings.FILER_IS_PUBLIC_DEFAULT + + +@python_2_unicode_compatible +class File(PolymorphicModel, mixins.IconsMixin): + file_type = 'File' + _icon = "file" + _file_data_changed_hint = None + + folder = models.ForeignKey( + Folder, + verbose_name=_('folder'), + related_name='all_files', + null=True, + blank=True, + on_delete=models.CASCADE, + ) + file = MultiStorageFileField(_('file'), null=True, blank=True, max_length=255) + _file_size = models.BigIntegerField(_('file size'), null=True, blank=True) + + sha1 = models.CharField(_('sha1'), max_length=40, blank=True, default='') + + has_all_mandatory_data = models.BooleanField(_('has all mandatory data'), default=False, editable=False) + + +## ... source file abbreviated to get to the examples ... + + + @property + def canonical_url(self): + url = '' +~~ if self.file and self.is_public: +~~ try: +~~ url = reverse('canonical', kwargs={ +~~ 'uploaded_at': self.canonical_time, +~~ 'file_id': self.id +~~ }) +~~ except NoReverseMatch: +~~ pass # No canonical url, return empty string + return url + +## ... source file continues with no further relevant examples ... +``` diff --git a/content/pages/examples/django/django-urls-exceptions-resolver404.markdown b/content/pages/examples/django/django-urls-exceptions-resolver404.markdown new file mode 100644 index 000000000..c87111f12 --- /dev/null +++ b/content/pages/examples/django/django-urls-exceptions-resolver404.markdown @@ -0,0 +1,240 @@ +title: django.urls.exceptions Resolver404 Django Code Examples +category: page +slug: django-urls-exceptions-resolver404-examples +sortorder: 500013641 +toc: False +sidebartitle: django.urls.exceptions Resolver404 +meta: Python example code for the Resolver404 exception class from Django's django.urls.exceptions module. + + +[Resolver404](https://docs.djangoproject.com/en/stable/ref/exceptions/#resolver404) +([source code](https://github.com/django/django/blob/master/django/urls/exceptions.py)) +is a [Django](/django.html) exception that is raised when the path +passed to the `resolve` function does not map to a view that is specified +in your project's `views.py` file. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / page_rendering.py**](https://github.com/divio/django-cms/blob/develop/cms/page_rendering.py) + +```python +# -*- coding: utf-8 -*- +from django.conf import settings +from django.http import Http404 +from django.shortcuts import render +from django.template.response import TemplateResponse +~~from django.urls import Resolver404, resolve, reverse + +from cms import __version__ +from cms.cache.page import set_page_cache +from cms.models import Page +from cms.utils.conf import get_cms_setting +from cms.utils.page import get_page_template_from_request +from cms.utils.page_permissions import user_can_change_page, user_can_view_page + + +def render_page(request, page, current_language, slug): + """ + Renders a page + """ + context = {} + context['lang'] = current_language + context['current_page'] = page + context['has_change_permissions'] = user_can_change_page(request.user, page) + context['has_view_permissions'] = user_can_view_page(request.user, page) + + if not context['has_view_permissions']: + return _handle_no_page(request) + + template = get_page_template_from_request(request) + response = TemplateResponse(request, template, context) + response.add_post_render_callback(set_page_cache) + + # Add headers for X Frame Options - this really should be changed upon moving to class based views + xframe_options = page.get_xframe_options() + # xframe_options can be None if there's no xframe information on the page + # (eg. a top-level page which has xframe options set to "inherit") + if xframe_options == Page.X_FRAME_OPTIONS_INHERIT or xframe_options is None: + # This is when we defer to django's own clickjacking handling + return response + + # We want to prevent django setting this in their middlewear + response.xframe_options_exempt = True + + if xframe_options == Page.X_FRAME_OPTIONS_ALLOW: + # Do nothing, allowed is no header. + return response + elif xframe_options == Page.X_FRAME_OPTIONS_SAMEORIGIN: + response['X-Frame-Options'] = 'SAMEORIGIN' + elif xframe_options == Page.X_FRAME_OPTIONS_DENY: + response['X-Frame-Options'] = 'DENY' + return response + + +def render_object_structure(request, obj): + context = { + 'object': obj, + 'cms_toolbar': request.toolbar, + } + return render(request, 'cms/toolbar/structure.html', context) + + +~~def _handle_no_page(request): +~~ try: +~~ #add a $ to the end of the url (does not match on the cms anymore) +~~ resolve('%s$' % request.path) +~~ except Resolver404 as e: +~~ # raise a django http 404 page +~~ exc = Http404(dict(path=request.path, tried=e.args[0]['tried'])) +~~ raise exc +~~ raise Http404('CMS Page not found: %s' % request.path) + + +def _render_welcome_page(request): + context = { + 'cms_version': __version__, + 'cms_edit_on': get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON'), + 'django_debug': settings.DEBUG, + 'next_url': reverse('pages-root'), + } + return TemplateResponse(request, "cms/welcome.html", context) + +``` + + +## Example 2 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/ wiki / forms.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/forms.py) + +```python + +__all__ = [ + 'UserCreationForm', + 'UserUpdateForm', + 'WikiSlugField', + 'SpamProtectionMixin', + 'CreateRootForm', + 'MoveForm', + 'EditForm', + 'SelectWidgetBootstrap', + 'TextInputPrepend', + 'CreateForm', + 'DeleteForm', + 'PermissionsForm', + 'DirFilterForm', + 'SearchForm', +] + +from datetime import timedelta + +from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model +from django.core import validators +from django.core.validators import RegexValidator +from django.forms.widgets import HiddenInput +from django.shortcuts import get_object_or_404 +~~from django.urls import Resolver404, resolve +from django.utils import timezone +from django.utils.safestring import mark_safe +from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.plugins.base import PluginSettingsFormMixin +from wiki.editors import getEditor + +from .forms_account_handling import UserCreationForm, UserUpdateForm + +validate_slug_numbers = RegexValidator( + r'^[0-9]+$', + _("A 'slug' cannot consist solely of numbers."), + 'invalid', + inverse_match=True +) + + +class WikiSlugField(forms.CharField): + """ + In future versions of Django, we might be able to define this field as + the default field directly on the model. For now, it's used in CreateForm. + """ + + default_validators = [validators.validate_slug, validate_slug_numbers] + + def __init__(self, *args, **kwargs): + self.allow_unicode = kwargs.pop('allow_unicode', False) + if self.allow_unicode: + self.default_validators = [ + validators.validate_unicode_slug, + validate_slug_numbers + ] + super().__init__(*args, **kwargs) + + +def _clean_slug(slug, urlpath): + if slug.startswith("_"): + raise forms.ValidationError( + gettext('A slug may not begin with an underscore.')) + if slug == 'admin': + raise forms.ValidationError( + gettext("'admin' is not a permitted slug name.")) + + if settings.URL_CASE_SENSITIVE: + already_existing_slug = models.URLPath.objects.filter( + slug=slug, + parent=urlpath) + else: + slug = slug.lower() + already_existing_slug = models.URLPath.objects.filter( + slug__iexact=slug, + parent=urlpath) + if already_existing_slug: + already_urlpath = already_existing_slug[0] + if already_urlpath.article and already_urlpath.article.current_revision.deleted: + raise forms.ValidationError( + gettext('A deleted article with slug "%s" already exists.') % + already_urlpath.slug) + else: + raise forms.ValidationError( + gettext('A slug named "%s" already exists.') % + already_urlpath.slug) + +~~ if settings.CHECK_SLUG_URL_AVAILABLE: +~~ try: +~~ # Fail validation if URL resolves to non-wiki app +~~ match = resolve(urlpath.path + '/' + slug + '/') +~~ if match.app_name != 'wiki': +~~ raise forms.ValidationError( +~~ gettext('This slug conflicts with an existing URL.')) +~~ except Resolver404: +~~ pass + + return slug + + + +## ... source file continues with no further relevant examples ... +``` diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 18b4e24df..0adee05de 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,9 @@ on GitHub. ## 2020 ### January +* Added new Django code example pages: + * [django.db.models SmallIntegerField](/django-db-models-smallintegerfield-examples.html) + * [django.urls.exceptions Resolver404](/django-urls-exceptions-resolver404-examples.html) * Added starter pages for the remaining topics in the table of contents that were previously missing. Still working on adding more resources and descriptions to each page: diff --git a/theme/templates/sidebar.html b/theme/templates/sidebar.html index 4c4cb774b..b3b460791 100644 --- a/theme/templates/sidebar.html +++ b/theme/templates/sidebar.html @@ -1,4 +1,5 @@ {% if page %} + {% include "sponsor.html" %} {% include "books-videos/learnmore.html" %} {% if not page.slug == "about-author" %} {% include "desktop-toc.html" %} diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index 2e683c4c0..9a6247878 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -51,17 +51,22 @@

Django: Example Projects and Code

django.apps.config AppConfig

-

django.conf.settings

-

django.conf.urls.url

-

django.contrib.admin

-

django.contrib.admin.filters SimpleListFilter

-

django.contrib.admin.sites register

-

django.contrib.auth get_user_model

-

django.contrib.auth.decorators login_required

-

django.contrib.auth.hashers make_password

-

django.core.mail.send_mail

-

django.core.mail.messages EmailMessage

-

django.core.management.base BaseCommand

+

django.conf + settings, + urls.url +

+

django.contrib.admin + filters.SimpleListFilter, + sites.register, + auth.get_user_model, + auth.decorators login_required, + auth.hashers.make_password +

+

django.core + mail.send_mail, + mail.messages EmailMessage, + management.base BaseCommand +

django.db OperationalError

django.db.models AutoField, @@ -104,9 +109,14 @@

django.http HttpResponsePermanentRedirect, HttpResponseRedirect

-

django.urls.exceptions NoReverseMatch

-

django.urls.path

-

django.urls reverse_lazy

+

django.urls + path, + reverse_lazy +

+

django.urls.exceptions + NoReverseMatch, + Resolver404 +

django.utils.html format_html

django.template.response SimpleTemplateResponse, From ef618543e9e7678cc5f299bc38a2b64107aad639 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 13 Jan 2020 08:45:50 -0500 Subject: [PATCH 053/302] add drf as example project --- .../django/django-extensions-plug-ins.markdown | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 5d9b3609e..a527c6475 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -432,6 +432,22 @@ open source under the * [django.db.models DateTimeField](/django-db-models-datetimefield-examples.html) +### Django REST Framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + + ### django-simple-task [django-simple-task](https://github.com/ericls/django-simple-task) ([project documentation](https://django-simple-task.readthedocs.io/) From 4d8f77696d1ae65d8fa09c8a6ad42ef9c4a3d329 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 15 Jan 2020 16:50:04 -0500 Subject: [PATCH 054/302] add django example projects --- .../django-example-projects-code.markdown | 25 ++++++++++++++++--- .../django-extensions-plug-ins.markdown | 13 ++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/content/pages/examples/django/django-example-projects-code.markdown b/content/pages/examples/django/django-example-projects-code.markdown index 06ec638a9..47da4b948 100644 --- a/content/pages/examples/django/django-example-projects-code.markdown +++ b/content/pages/examples/django/django-example-projects-code.markdown @@ -47,7 +47,7 @@ to variants in the DMD gene and display that [data](/data.html) to a user with a [Django](/django.html) web application. -### drf-action-serializer +### Django REST Framework Action Serializer [drf-action-serializer](https://github.com/gregschmit/drf-action-serializer) ([PyPI page](https://pypi.org/project/drf-action-serializer/)) is an extension for [Django REST Framework](/django-rest-framework-drf.html) @@ -64,7 +64,7 @@ following pages: * [django.urls.path](/django-urls-path-examples.html) -### gadget-board +### Gadget Board [gadget-board](https://github.com/mik4el/gadget-board) is a [Django](/django.html), [Django REST Framework (DRF)](/django-rest-framework-drf.html) and @@ -79,7 +79,24 @@ Additional example code found within gadget-board: * [django.contrib.auth.hashers make_password](/django-contrib-auth-hashers-make-password-examples.html) -### jazzband +### Graphite-Web +[Graphite](https://github.com/graphite-project/graphite-web) +([project website](http://graphiteapp.org/), +[documentation](https://graphite.readthedocs.io/en/latest/) and +[PyPI package information](https://pypi.org/project/graphite-web/)) +is a metrics collection and visualization tool, built with both +Python and JavaScript. Metrics are collected by a Node.js application +and displayed using a [Django](/django.html) web application, +called "Graphite-Web", which is one of three core projects under +the Graphite umbrella (the other two are +[Carbon](https://github.com/graphite-project/carbon) and +[Whisper](https://github.com/graphite-project/whisper)). + +Graphite is provided as open sourced under the +[Apache License 2.0](https://github.com/graphite-project/whisper/blob/master/LICENSE). + + +### Jazzband's website [jazzband](https://github.com/jazzband/website) is a [Django](/django.html)-based web application that runs a website with information on many Django projects such as @@ -90,7 +107,7 @@ The project's code is provided as open source under the [MIT license](https://github.com/jazzband/website/blob/master/LICENSE). -### register +### Register [register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), [Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is open source under the diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index a527c6475..eb7e5fbce 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -138,6 +138,19 @@ and maintained by the developer community group known as [Jazzband](https://jazzband.co/). +### Django DownloadView +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + + ### django-easy-timezones [django-easy-timezones](https://github.com/Miserlou/django-easy-timezones) ([project website](https://www.gun.io/blog/django-easy-timezones)) From e8dfe28381bed7190c0e888d48427b69fbcc9d5a Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 18 Jan 2020 16:32:39 -0500 Subject: [PATCH 055/302] update django example page to include the list of topics by function and class --- .../django-example-projects-code.markdown | 43 +--------- theme/templates/code-examples/django.html | 81 ++++++++++++++++++ theme/templates/css/base.css | 2 +- theme/templates/css/toc.css | 2 +- .../django.html | 21 +++++ theme/templates/page.html | 4 + theme/templates/table-of-contents.html | 82 +------------------ 7 files changed, 112 insertions(+), 123 deletions(-) create mode 100644 theme/templates/code-examples/django.html create mode 100644 theme/templates/examples-extensions-descriptions/django.html diff --git a/content/pages/examples/django/django-example-projects-code.markdown b/content/pages/examples/django/django-example-projects-code.markdown index 47da4b948..98ec9b66b 100644 --- a/content/pages/examples/django/django-example-projects-code.markdown +++ b/content/pages/examples/django/django-example-projects-code.markdown @@ -7,20 +7,9 @@ sidebartitle: Django Example Code meta: Python example projects and code that show how to use the Django web application framework. -[Django](/django.html) is a Python [web framework](/web-frameworks.html). - -Official Django logo. Trademark Django Software Foundation. - -Part of Django's widespread adoption comes from its broad ecosystem of -open source code libraries and example projects. - -It's good to familiarize yourself with the following projects to -learn what is available to you beyond the extensive -"[batteries-included](https://www.quora.com/Why-does-Django-tout-itself-as-a-batteries-included-web-framework-when-you-have-to-manually-write-regexes-to-do-URL-routing)" -code base. - -These projects, ordered alphabetically, are also helpful as example -code for how to build your own applications. +## Example Projects with Great Example Code +The following active projects use the [Django](/django.html) framework in +various ways that can show you how to build your own applications. ### dccnsys @@ -28,16 +17,6 @@ code for how to build your own applications. system built with [Django](/django.html). The code is open source under the [MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). -dccnsys is shown on the following code example pages: - -* [django.apps.config AppConfig](/django-apps-config-appconfig-examples.html) -* [django.contrib.auth get_user_model](/django-contrib-auth-get-user-model-examples.html) -* [django.contrib.auth.decorators login_required](/django-contrib-auth-decorators-login-required-examples.html) -* [django.db.models DateField](/django-db-models-datefield-examples.html) -* [django.db.models IntegerField](/django-db-models-integerfield-examples.html) -* [django.http HttpResponseForbidden](/django-http-httpresponseforbidden-examples.html) -* [django.urls.path](/django-urls-path-examples.html) - ### dmd-interpreter [dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) @@ -58,11 +37,6 @@ whereas the detail view would have a different serializer. The project is open source under the [MIT license](https://github.com/gregschmit/drf-action-serializer/blob/master/LICENSE). -There are code examples from the drf-action-serializer project on the -following pages: - -* [django.urls.path](/django-urls-path-examples.html) - ### Gadget Board [gadget-board](https://github.com/mik4el/gadget-board) is a @@ -71,13 +45,6 @@ following pages: [Angular](/angular.html) web application that is open source under the [Apache2 license](https://github.com/mik4el/gadget-board/blob/master/LICENSE). -Additional example code found within gadget-board: - -* [django.apps.config AppConfig](/django-apps-config-appconfig-examples.html) -* [django.conf.urls url](/django-conf-urls-url-examples.html) -* [django.contrib admin](/django-contrib-admin-examples.html) -* [django.contrib.auth.hashers make_password](/django-contrib-auth-hashers-make-password-examples.html) - ### Graphite-Web [Graphite](https://github.com/graphite-project/graphite-web) @@ -116,7 +83,3 @@ This web application makes it easier for people to register as organ donors. You can see the application live at [https://register.organize.org/](https://register.organize.org/). -Useful example code from register can be found on: - -* [django.conf.urls url](/django-conf-urls-url-examples.html) - diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html new file mode 100644 index 000000000..db2c7bf6f --- /dev/null +++ b/theme/templates/code-examples/django.html @@ -0,0 +1,81 @@ + diff --git a/theme/templates/css/base.css b/theme/templates/css/base.css index 170d506c3..af6976909 100644 --- a/theme/templates/css/base.css +++ b/theme/templates/css/base.css @@ -1 +1 @@ -{% raw %}hr,img{border:0}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:18px;background:#fefefe}body{margin:0;font:18px Georgia,serif;line-height:1.4;color:#222;padding:0}img{vertical-align:middle}hr{height:0;box-sizing:content-box;margin:21px 0;border-top:1px solid #eee}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",sans-serif;font-weight:500;line-height:1.1;color:#000}h1,h2,h3{margin:32px 0 6px}h1{font-size:40px}h2{font-size:28px}h3{font-size:22px}h4,h5,h6{margin:11px 0;font-size:18px}p{margin:0 0 12px}ol,ul{margin:0 0 10px}code,pre{font:"Courier New",monospace;border-radius:4px;background-color:#f4f9ff;font-size:12px}code{padding:2px 4px;white-space:nowrap}pre{overflow:scroll;white-space:pre;display:block;padding:10px;margin:0 0 11px;line-height:1.4;word-break:break-all;word-wrap:break-word;border:1px solid #ccc}.cn{padding:0 15px 0 15px;margin-right:auto;margin-left:auto}.cn:before,.cn:after{display:table;content:" "}.cn:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.c2,.c3,.c4,.c5,.c6,.c7,.c8,.c9,.c10,.c11,.c12{position:relative;min-height:1px;padding:0 15px 0 15px}a{background:transparent;text-decoration:none;border-bottom:1px dotted;color:#444}a:hover{text-decoration:none;color:#000}.ft{padding:0 0 24px;float:right}.sns{font-family:"Helvetica Neue",sans-serif}.sps{font-size:14px}.hd{margin:20px 0 15px 0}.hd>a{border-bottom:none}img.hdr{vertical-align:middle;border:none;height:52px;width:52px;padding:1px}.hdt a,.hdt a:hover{font:72px "Helvetica Neue",sans-serif;font-weight:normal;letter-spacing:.03em;vertical-align:middle;margin-left:5px;color:#000;text-decoration:none;border-bottom:none;line-height:.9em}.bk{margin:0 7px 0 7px}img.nob{border:none}p.banner{font-weight:500;line-height:1.1;color:#fff;font-size:22px;margin:14px 0 18px 0}{% endraw %} +{% raw %}hr,img{border:0}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:18px;background:#fefefe}body{margin:0;font:18px Georgia,serif;line-height:1.4;color:#222;padding:0}img{vertical-align:middle}hr{height:0;box-sizing:content-box;margin:21px 0;border-top:1px solid #eee}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",sans-serif;font-weight:500;line-height:1.1;color:#000}h1,h2,h3{margin:32px 0 6px}h1{font-size:40px}h2{font-size:28px}h3{font-size:22px}h4,h5,h6{margin:11px 0;font-size:18px}p{margin:0 0 12px}ol,ul{margin:0 0 10px}code,pre{font:"Courier New",monospace;border-radius:4px;background-color:#f4f9ff;font-size:12px}code{padding:2px 4px;white-space:nowrap}pre{overflow:scroll;white-space:pre;display:block;padding:10px;margin:0 0 11px;line-height:1.4;word-break:break-all;word-wrap:break-word;border:1px solid #ccc}.cn{padding:0 15px 0 15px;margin-right:auto;margin-left:auto}.cn:before,.cn:after{display:table;content:" "}.cn:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.c2,.c3,.c4,.c5,.c6,.c7,.c8,.c9,.c10,.c11,.c12{position:relative;min-height:1px;padding:0 15px 0 15px}a{background:transparent;text-decoration:none;border-bottom:1px dotted;color:#444}a:hover{text-decoration:none;color:#000}.ft{padding:0 0 24px;float:right}.sns{font-family:"Helvetica Neue",sans-serif}.sps{font-size:14px}.hd{margin:20px 0 15px 0}.hd>a{border-bottom:none}img.hdr{vertical-align:middle;border:none;height:52px;width:52px;padding:1px}.hdt a,.hdt a:hover{font:72px "Helvetica Neue",sans-serif;font-weight:normal;letter-spacing:.03em;vertical-align:middle;margin-left:5px;color:#000;text-decoration:none;border-bottom:none;line-height:.9em}.bk{margin:0 7px 0 7px}img.nob{border:none}p.banner{font-weight:500;line-height:1.1;color:#fff;font-size:22px;margin:14px 0 18px 0}.bp{line-height:1.3em}{% endraw %} diff --git a/theme/templates/css/toc.css b/theme/templates/css/toc.css index 7dda90ddf..b4adb41dc 100644 --- a/theme/templates/css/toc.css +++ b/theme/templates/css/toc.css @@ -1 +1 @@ -{% raw %}.toc>h4 {margin:15px 0 3px 25px}.toc>h4.td{margin-left:38px}.tc{margin-left:56px;padding:4px 0 0;font-family:"Helvetica Neue",sans-serif}.tds{margin-left:65px}.tdi{margin-left:78px}.sn{color:#777}.desc{margin-top:6px}.bp{line-height:1.3em}.cex{margin-left:20px}{% endraw %} +{% raw %}.toc>h4 {margin:15px 0 3px 25px}.toc>h4.td{margin-left:38px}.tc{margin-left:56px;padding:4px 0 0;font-family:"Helvetica Neue",sans-serif}.tds{margin-left:65px}.tdi{margin-left:78px}.sn{color:#777}.desc{margin-top:6px}.cex{margin-left:20px}{% endraw %} diff --git a/theme/templates/examples-extensions-descriptions/django.html b/theme/templates/examples-extensions-descriptions/django.html new file mode 100644 index 000000000..edf699355 --- /dev/null +++ b/theme/templates/examples-extensions-descriptions/django.html @@ -0,0 +1,21 @@ +Django is a Python web framework. + +Official Django logo. Trademark Django Software Foundation. + +

Part of Django's widespread adoption comes from its broad ecosystem of +open source code libraries and example projects. +

+ +

It is a good idea to familiarize yourself with the following projects to +learn what is available to you beyond the extensive +"batteries-included" +code base.

+ +

These projects, ordered alphabetically, are also helpful as example +code for how to build your own applications.

+ + +

Code Examples Sorted by Django Class and Function

+

Specific examples are shown on the following individual pages, +organized by classes and functions provided by Django, that are frequently +used when building your own web applications.

diff --git a/theme/templates/page.html b/theme/templates/page.html index 5ca0a373c..570ae6d6f 100644 --- a/theme/templates/page.html +++ b/theme/templates/page.html @@ -47,6 +47,10 @@

{{ page.title }}

{% else %} + {% if page.slug == "django-code-examples" %} + {% include "examples-extensions-descriptions/django.html" %} + {% include "code-examples/django.html" %} + {% endif %} {{ page.content }} {% endif %} {% if page.sortorder[0:2] == "50" %} diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index 9a6247878..c2526ccd2 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -44,87 +44,7 @@

- - +{% include "code-examples/django.html" %}
From cee4aa577ecd66e9729730d8cfc47f06da46dd52 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 19 Jan 2020 15:43:19 -0500 Subject: [PATCH 056/302] make formatting even on django code examples page --- theme/templates/examples-extensions-descriptions/django.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/templates/examples-extensions-descriptions/django.html b/theme/templates/examples-extensions-descriptions/django.html index edf699355..4a37f181f 100644 --- a/theme/templates/examples-extensions-descriptions/django.html +++ b/theme/templates/examples-extensions-descriptions/django.html @@ -1,6 +1,6 @@ Django is a Python web framework. -Official Django logo. Trademark Django Software Foundation. +Official Django logo. Trademark Django Software Foundation.

Part of Django's widespread adoption comes from its broad ecosystem of open source code libraries and example projects. From 2c4cea34311faa0310c13dcd71af39edc6c82bea Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 19 Jan 2020 18:03:22 -0500 Subject: [PATCH 057/302] standardize paragraph elements on examples pages --- theme/templates/examples-extensions-descriptions/django.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/theme/templates/examples-extensions-descriptions/django.html b/theme/templates/examples-extensions-descriptions/django.html index 4a37f181f..a6bef893f 100644 --- a/theme/templates/examples-extensions-descriptions/django.html +++ b/theme/templates/examples-extensions-descriptions/django.html @@ -3,8 +3,7 @@ Official Django logo. Trademark Django Software Foundation.

Part of Django's widespread adoption comes from its broad ecosystem of -open source code libraries and example projects. -

+open source code libraries and example projects.

It is a good idea to familiarize yourself with the following projects to learn what is available to you beyond the extensive From c5001446ce440a8ab2ad11e8954014723663a1d1 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 19 Jan 2020 19:07:25 -0500 Subject: [PATCH 058/302] add new web design resource --- content/pages/04-web-development/15-web-design.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index 4c97f3117..b02e8b4ab 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -71,6 +71,14 @@ this short list as my absolute favorites that help developers become Highly recommended especially if you feel you have no design skills but need to learn them. +* [A short history of body copy sizes on the Web](https://fvsch.com/body-copy-sizes/) + provides a useful examination of how originally the web's typography + mirrored what was in traditional print. Eventually, the designs shifted + upwards in font size because screen resolutions changed. However, even + in 2020 there is no consensus for what font size to use in various + situations so designers simply have to do what they've always done and + try their sites on various devices and screen sizes. + * [Web bloat](https://danluu.com/web-bloat/) is the story of traveling and using the web with low bandwidth, high latency internet connections that often drop packets. The author explains how many websites are From e55991fdcb42ad149512817c918d36e337005bb2 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 28 Jan 2020 12:40:55 -0600 Subject: [PATCH 059/302] update and split out different code examples from ToC --- theme/templates/code-examples/flask.html | 11 ++++++++++ theme/templates/code-examples/sqlalchemy.html | 9 ++++++++ theme/templates/table-of-contents.html | 21 ------------------- 3 files changed, 20 insertions(+), 21 deletions(-) create mode 100644 theme/templates/code-examples/flask.html create mode 100644 theme/templates/code-examples/sqlalchemy.html diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html new file mode 100644 index 000000000..c650b1e25 --- /dev/null +++ b/theme/templates/code-examples/flask.html @@ -0,0 +1,11 @@ +

+
+

Flask: +Extensions, Plug-ins and Related Libraries & +Example Projects and Code +

+

flask redirect

+

flask request

+

flask_sqlalchemy.SQLAlchemy.Model

+
+
diff --git a/theme/templates/code-examples/sqlalchemy.html b/theme/templates/code-examples/sqlalchemy.html new file mode 100644 index 000000000..4bdee3ca4 --- /dev/null +++ b/theme/templates/code-examples/sqlalchemy.html @@ -0,0 +1,9 @@ + diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index c2526ccd2..927e6086e 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -46,27 +46,6 @@

- -

- - {% endblock %} {% block lower_banner %} From 14fb2cef77d9504ec11c39d11040b557b1d769fd Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 6 Feb 2020 08:58:45 -0500 Subject: [PATCH 060/302] new jupyter notebook resource --- .../02-development-environments/06-jupyter-notebook.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/pages/02-development-environments/06-jupyter-notebook.markdown b/content/pages/02-development-environments/06-jupyter-notebook.markdown index 30ff049cc..838763258 100644 --- a/content/pages/02-development-environments/06-jupyter-notebook.markdown +++ b/content/pages/02-development-environments/06-jupyter-notebook.markdown @@ -186,6 +186,11 @@ like advanced interactive visualizations. is a kernel that allows you to run [Ansible](/ansible.html) tasks and playbooks from within your Jupyter environment. +* [Jupyter Notebooks in the IDE](https://towardsdatascience.com/jupyter-notebooks-in-the-ide-visual-studio-code-versus-pycharm-5e72218eb3e8) + explains how to use Jupyter files in Visual Studio Code or + [PyCharm](/pycharm.html) with Jupytext, which defines the + pairing information and notebook kernel. + * [The Notebook Wars](https://yihui.name/en/2018/09/notebook-war/) is not a tutorial but instead points to the weaknesses that become apparent when using Jupyter and the current generation of notebook projects. The From dffd2bcca3cbae8e88e71e06669aef1154785eed Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 9 Feb 2020 08:17:37 -0500 Subject: [PATCH 061/302] new task queue resource --- content/pages/04-web-development/28-celery.markdown | 4 ++++ content/pages/meta/00-change-log.markdown | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/content/pages/04-web-development/28-celery.markdown b/content/pages/04-web-development/28-celery.markdown index 1ae8eeee0..d0c263a83 100644 --- a/content/pages/04-web-development/28-celery.markdown +++ b/content/pages/04-web-development/28-celery.markdown @@ -74,6 +74,10 @@ then dive into these specific Celery tutorials. is a different author's follow up to the above best practices post that builds upon some of his own learnings from 3+ years using Celery. +* [Common Issues Using Celery (And Other Task Queues)](https://adamj.eu/tech/2020/02/03/common-celery-issues-on-django-projects/) + contains good advice about mistakes to avoid in your task configurations, + such as database transaction usage and retrying failed tasks. + * [Asynchronous Processing in Web Applications Part One](http://blog.thecodepath.com/2012/11/15/asynchronous-processing-in-web-applications-part-1-a-database-is-not-a-queue/) and [Part Two](http://blog.thecodepath.com/2013/01/06/asynchronous-processing-in-web-applications-part-2-developers-need-to-understand-message-queues/) are great reads for understanding the difference between a task queue and diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 0adee05de..82adf8abc 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2020 +### February +* New [CSS](/cascading-style-sheets.html) and [task queue](/task-queues.html) + resources. + ### January * Added new Django code example pages: * [django.db.models SmallIntegerField](/django-db-models-smallintegerfield-examples.html) From b43bcfae40edeef74840b3f0099faa576b85f149 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 9 Feb 2020 08:25:13 -0500 Subject: [PATCH 062/302] new uwsgi resource --- content/pages/05-deployment/24-uwsgi.markdown | 6 +++++- content/pages/meta/00-change-log.markdown | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/content/pages/05-deployment/24-uwsgi.markdown b/content/pages/05-deployment/24-uwsgi.markdown index 5c3a8e3af..985d326fe 100644 --- a/content/pages/05-deployment/24-uwsgi.markdown +++ b/content/pages/05-deployment/24-uwsgi.markdown @@ -7,7 +7,6 @@ sidebartitle: uWSGI meta: uWSGI is a Python WSGI server implementation typically used for running Python web applications. -# uWSGI [uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/) ([source code](https://github.com/unbit/uwsgi)), pronounced "mu wiz gee", is a [Web Server Gateway Interface (WSGI) server](/wsgi-servers.html) @@ -17,6 +16,11 @@ implementation that is typically used to run Python web applications. ### uWSGI resources +* [Configuring uWSGI for Production Deployment](https://www.techatbloomberg.com/blog/configuring-uwsgi-production-deployment/) + explains how Bloomberg uses uWSGI as a production WSGI server + for some of their Python projects and how to set it up for your + own applications. + * The official [Django](/django.html) framework docs on [how to use Django with uWSGI](https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/uwsgi/) along with the corresponding official diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 82adf8abc..1e3c64faa 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,8 +15,8 @@ on GitHub. ## 2020 ### February -* New [CSS](/cascading-style-sheets.html) and [task queue](/task-queues.html) - resources. +* New [CSS](/cascading-style-sheets.html), [task queue](/task-queues.html) + and [uWSGI](/uwsgi.html) resources. ### January * Added new Django code example pages: From a44ec4168e0175bbbb96023d17f8f3d100532534 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 15 Feb 2020 11:39:38 -0500 Subject: [PATCH 063/302] new data and css resources --- .../08-bash-shell.markdown | 8 ++++++++ content/pages/03-data/00-data.markdown | 6 ++++++ content/pages/04-web-development/17-css.markdown | 13 +++++++++++++ .../04-web-development/20-css-frameworks.markdown | 6 ++++-- .../pages/06-devops/06-web-app-performance.markdown | 5 +++++ 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/content/pages/02-development-environments/08-bash-shell.markdown b/content/pages/02-development-environments/08-bash-shell.markdown index 7e553ed6e..abf95629b 100644 --- a/content/pages/02-development-environments/08-bash-shell.markdown +++ b/content/pages/02-development-environments/08-bash-shell.markdown @@ -102,3 +102,11 @@ during Python software development as part of a programmer's presents a list of commands *you should never run*, but can learn about their destructive abilities by reading through the descriptions provided by the author. + +* [Bash Quick References](https://shellmagic.xyz/) is a cheat sheet for + common operators and signals that come up when working with scripts. + +* [Anybody can write good bash (with a little effort)](https://blog.yossarian.net/2020/01/23/Anybody-can-write-good-bash-with-a-little-effort) + covers the basics of shell scripting and provides some recommendations + for creating more maintainable scripts such as using linters and + formatters. diff --git a/content/pages/03-data/00-data.markdown b/content/pages/03-data/00-data.markdown index 739821b81..2ef2bbdc8 100644 --- a/content/pages/03-data/00-data.markdown +++ b/content/pages/03-data/00-data.markdown @@ -126,6 +126,12 @@ sets. provides more than just the data, it also includes instructions and code for working with the data in your own development environment. +* [Discovering millions of datasets on the web](https://blog.google/products/search/discovering-millions-datasets-web/) + introduces Google's + [dataset search](https://datasetsearch.research.google.com/) + and explains what they learned from iterating on earlier versions + of it before they released this one. + ### General Python data resources * [PyData](http://pydata.org/) is a community for developer and users of diff --git a/content/pages/04-web-development/17-css.markdown b/content/pages/04-web-development/17-css.markdown index 273d04119..f7d3658b2 100644 --- a/content/pages/04-web-development/17-css.markdown +++ b/content/pages/04-web-development/17-css.markdown @@ -173,6 +173,19 @@ web application's design. fix this situation with `display` as well as other less visible properties such as floats and `auto` width. +* [A brief history of CSS until 2016](https://www.w3.org/Style/CSS20/history.html) + explains how CSS originated at CERN in 1994 as a solution to the + problem of HTML not having reasonable styling features + (in-line `style` attributes on elements don't count). + +* [Old CSS, New CSS](https://eev.ee/blog/2020/02/01/old-css-new-css/) tells + the wonderful and painful story of web design in the early days of the + Web, when inline styling was required, HTML CAPS were mandatory, and + most websites wished they had design styles like the amazing + [Space Jam](https://www.spacejam.com/) pages. Oh also, lots and lots of + talk about tables, because that was the only way to position anything + back in the day. + * [30 seconds of CSS](https://30-seconds.github.io/30-seconds-of-css/) provides short useful code snippets for you to learn from and use for building your own web applications. diff --git a/content/pages/04-web-development/20-css-frameworks.markdown b/content/pages/04-web-development/20-css-frameworks.markdown index 9772a3eb9..01f12984b 100644 --- a/content/pages/04-web-development/20-css-frameworks.markdown +++ b/content/pages/04-web-development/20-css-frameworks.markdown @@ -17,9 +17,11 @@ easier for a developer to implement in their web apps. * [Foundation](/foundation-css.html) -* Materialize +* [Screen](https://screencss.com/) -* Concise +* [Materialize](https://materializecss.com/) + +* [Concise](https://concisecss.com/) ### CSS framework resources diff --git a/content/pages/06-devops/06-web-app-performance.markdown b/content/pages/06-devops/06-web-app-performance.markdown index cba1f4c0d..7a3a2c8e6 100644 --- a/content/pages/06-devops/06-web-app-performance.markdown +++ b/content/pages/06-devops/06-web-app-performance.markdown @@ -71,3 +71,8 @@ database queries, page size and many other factors. examines the evolution from having to buy your own hardware from vendors to run a service to the current days of being able to rely on cloud providers for some or all workloads regardless of scale. + +* [Scaling to 100k users](https://alexpareto.com/scalability/systems/2020/02/03/scaling-100k.html) + covers the architecture scaling techniques commonly used to move up + in serving users by orders of magnitude, for example from 100 to 1000. + From d8bea0e666487efae1c29f93ee6f79ef98d5670b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 16 Feb 2020 07:14:33 -0500 Subject: [PATCH 064/302] add new resources --- .../45-microservices.markdown | 17 +++++++++++------ content/pages/05-deployment/34-salt.markdown | 4 ++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/content/pages/04-web-development/45-microservices.markdown b/content/pages/04-web-development/45-microservices.markdown index d8754b0a6..684dfc20d 100644 --- a/content/pages/04-web-development/45-microservices.markdown +++ b/content/pages/04-web-development/45-microservices.markdown @@ -91,12 +91,17 @@ ease further development and deployment. This approach is called the text go into how reality gets messy and how to embrace the constraints inherent in distributed systems. -* In the [Microservices with Docker, Flask, and React](http://testdriven.io/) - course, you will learn how to quickly spin up a reproducible development - environment with Docker to manage a number of microservices. Once the app - is up and running locally, you'll learn how to deploy it to an Amazon EC2 - instance. Finally, we'll look at scaling the services on Amazon EC2 - Container Service (ECS). +* In the + [Microservices with Docker, Flask, and React](https://testdriven.io/bundle/microservices-with-docker-flask-and-react/?utm_source=fsp) + course bundle, you will learn how to quickly spin up a reproducible + development environment with Docker to manage a number of microservices. + Once the app is up and running locally, you'll learn how to deploy it to + an Amazon EC2 instance. Finally, we'll look at scaling the services on + Amazon EC2 Container Service (ECS). + +* [Should I use microservices?](https://www.oreilly.com/ideas/should-i-use-microservices) + contains a high-level perspective on why or why not use microservices + as an architectural choice. * Zuul is open source proxy for combining multiple microservices into a unified API call. Check out this post on diff --git a/content/pages/05-deployment/34-salt.markdown b/content/pages/05-deployment/34-salt.markdown index 5a11baaea..8f1e90a6c 100644 --- a/content/pages/05-deployment/34-salt.markdown +++ b/content/pages/05-deployment/34-salt.markdown @@ -17,6 +17,10 @@ meta: Salt is configuration management tool used for application deployment and ### Salt resources +* [What's new in Salt 3000 Neon](https://salt.tips/whats-new-in-salt-neon/) + covers the latest release and the significant number of new features + and fixes contained within it. + * [Introduction to Salt](https://docs.saltstack.com/en/latest/topics/) gives a 30 second summary of what the tool can do for you then provides a collection of links to other resources that plug you into the Salt From 0eee471e6b8e382b284770b63a3dc0fa5250c80f Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 16 Feb 2020 07:58:32 -0500 Subject: [PATCH 065/302] add typedchoicefield django examples --- .../django-forms-typedchoicefield.markdown | 171 ++++++++++++++++++ theme/templates/code-examples/django.html | 2 +- 2 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 content/pages/examples/django/django-forms-typedchoicefield.markdown diff --git a/content/pages/examples/django/django-forms-typedchoicefield.markdown b/content/pages/examples/django/django-forms-typedchoicefield.markdown new file mode 100644 index 000000000..23eab0e9f --- /dev/null +++ b/content/pages/examples/django/django-forms-typedchoicefield.markdown @@ -0,0 +1,171 @@ +title: django.forms TypedChoiceField Python Code Examples +category: page +slug: django-forms-typedchoicefield-examples +sortorder: 500013125 +toc: False +sidebartitle: django.forms TypedChoiceField +meta: View code examples that show how to use the TypedChoiceField class within the forms module of Django. + + +[TypedChoiceField](https://github.com/django/django/blob/master/django/forms/fields.py) +([documentation](https://docs.djangoproject.com/en/stable/ref/forms/fields/#typedchoicefield)), +from the [Django](/django.html) `forms` module, enables safe handling of +pre-defined selections collected via an HTTP POST request from an +[HTML](/hypertext-markup-language-html.html) form submission. + +TypedChoiceField can either be imported from `django.forms` or +`django.forms.fields`. `django.forms` is more commonly used because it +is less characters for the equivalent effect. + + +## Example 1 from dmd-interpreter +[dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) +([running web app](http://www.dmd.nl/DOVE)) +is a Python tool to aggregate clinically relevant information related +to variants in the DMD gene and display that [data](/data.html) to a user +with a [Django](/django.html) web application. + +[**dmd-interpreter / interpreter / forms.py**](https://github.com/mitchalexbailey/dmd-interpreter/blob/master/interpreter/./forms.py) + +```python +# forms.py +~~from django import forms + +choices = [(True,'Yes'),(False,'No')] + +class IndexForm(forms.Form): + mutation = forms.CharField(label = 'Mutation', max_length = 100) + +class ACMGForm(forms.Form): +~~ pvs1 = forms.TypedChoiceField(label = 'Does the variant cause a premature stop codon (nonsense)?', choices=choices, widget=forms.RadioSelect) +~~ pvs2 = forms.TypedChoiceField(label = 'Does the variant cause a frameshift?', choices=choices, widget=forms.RadioSelect) +~~ pvs3 = forms.TypedChoiceField(label = 'Does the variant cause a multiexon deletion involving key functional domains?', choices=choices, widget=forms.RadioSelect) +~~ pvs4 = forms.TypedChoiceField(label = 'Does the variant cause a change in splice site?', choices=choices, widget=forms.RadioSelect) +~~ pvs5 = forms.TypedChoiceField(label = 'Does the variant cause a change in initiation codon?', choices=choices, widget=forms.RadioSelect) +~~ ps1 = forms.TypedChoiceField(label = 'Is there a reported pathogenic variant causing the same amino acid change?', choices=choices, widget=forms.RadioSelect) +~~ ps2 = forms.TypedChoiceField(label = 'Is the variant de novo (confirmed to not be present in either parent)?', choices=choices, widget=forms.RadioSelect) +~~ ps3 = forms.TypedChoiceField(label = 'Are there well-established in vitro studies predicting a damaging effect of this variant on the gene or gene product?', choices=choices, widget=forms.RadioSelect) +~~ ps4 = forms.TypedChoiceField(label = 'Is this variant more prevalence in affected individuals versus controls? (OR > 5.0)', choices=choices, widget=forms.RadioSelect) +~~ pm1 = forms.TypedChoiceField(label = 'Is this variant located in a mutational hot spot and/or critical functional domain?', choices=choices, widget=forms.RadioSelect) +~~ pm2 = forms.TypedChoiceField(label = 'Is the variant absent from controls (autosomal dominant), or found at an extremely low frequency (autosomal recessive)? (Ex. in ExAC or 1000 genomes)', choices=choices, widget=forms.RadioSelect) +~~ pm3 = forms.TypedChoiceField(label = 'Is this variant in a gene linked to an autosomal recessive condition and in trans with a pathogenic variant?', choices=choices, widget=forms.RadioSelect) +~~ pm4 = forms.TypedChoiceField(label = 'Does the variant change the protein length (while preserving reading frame; deletion, insertion, stop-loss)?', choices=choices, widget=forms.RadioSelect) +~~ pm5 = forms.TypedChoiceField(label = 'Does the variant cause a missense change at a residue where a different change is known to be pathogenic?', choices=choices, widget=forms.RadioSelect) +~~ pm6 = forms.TypedChoiceField(label = 'Do you think the variant is de novo but there has not been confirmation (sequencing of parents)?', choices=choices, widget=forms.RadioSelect) +~~ pp1 = forms.TypedChoiceField(label = 'Is the variant in a known disease-causing gene and has it co-segregated with affected family members?', choices=choices, widget=forms.RadioSelect) +~~ pp2 = forms.TypedChoiceField(label = 'Is the variant in a gene where disease-causing variants are not commonly missense, and in which missense variants are a common mechanism of disease?', choices=choices, widget=forms.RadioSelect) +~~ pp3 = forms.TypedChoiceField(label = 'Do multiple in silico functional predication tools support a deleterious effect on the gene or gene product?', choices=choices, widget=forms.RadioSelect) +~~ pp4 = forms.TypedChoiceField(label = 'Does the patient\'s phenotype and/or family history strongly indicate a disease with a single genetic ontology?', choices=choices, widget=forms.RadioSelect) +~~ pp5 = forms.TypedChoiceField(label = 'Does a reputable source report the variant as pathogenic (but the evidence is not available)?', choices=choices, widget=forms.RadioSelect) +``` + + +# Example 2 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / fields.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/fields.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import re +import mimetypes + +from django.conf import settings +from django.contrib.staticfiles.storage import staticfiles_storage +from django.core import signing +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.files.storage import default_storage +from django.core.files.uploadedfile import InMemoryUploadedFile, TemporaryUploadedFile +from django.urls import reverse_lazy +~~from django.forms import fields, models as model_fields, widgets +from django.utils.html import format_html +from django.utils.module_loading import import_string +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext_lazy as _, ungettext_lazy + +from djng import app_settings +from .widgets import DropFileWidget, DropImageWidget + + +## ... source file abbreviated to get to the TypedChoiceField examples ... + +~~class TypedChoiceField(MultipleFieldMixin, fields.TypedChoiceField): +~~ def get_potential_errors(self): +~~ if isinstance(self.widget, widgets.RadioSelect): +~~ errors = self.get_multiple_choices_required() +~~ else: +~~ errors = self.get_input_required_errors() +~~ return errors + + + +## ... source file continues with no further examples ... +``` + + +## Example 3 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / filters.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./filters.py) + +```python +from collections import OrderedDict +from datetime import timedelta + +~~from django import forms +from django.db.models import Q +from django.db.models.constants import LOOKUP_SEP +from django.forms.utils import pretty_name +from django.utils.itercompat import is_iterable +from django.utils.timezone import now +from django.utils.translation import gettext_lazy as _ + +from .conf import settings +from .constants import EMPTY_VALUES +from .fields import ( + BaseCSVField, + BaseRangeField, + ChoiceField, + DateRangeField, + DateTimeRangeField, + IsoDateTimeField, + IsoDateTimeRangeField, + LookupChoiceField, + ModelChoiceField, + ModelMultipleChoiceField, + MultipleChoiceField, + RangeField, + TimeRangeField +) +from .utils import get_model_field, label_for_filter + + +## ... source file abbreviated to get to code examples ... + + +~~class TypedChoiceFilter(Filter): +~~ field_class = forms.TypedChoiceField + + +class UUIDFilter(Filter): + field_class = forms.UUIDField + + +## ... source file continues with no further TypedChoiceField examples ... + +``` + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index db2c7bf6f..26d34dff8 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -46,7 +46,7 @@

django.forms BooleanField, CharField, ChoiceField, - TypedChoiceField, + TypedChoiceField, DateField, DateTimeField, DecimalField, From 44ac66fa84e7ebdeebc76416cefcefde5f9362cc Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 16 Feb 2020 07:59:26 -0500 Subject: [PATCH 066/302] update changelog --- content/pages/meta/00-change-log.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 1e3c64faa..c90a8ddb4 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -17,6 +17,8 @@ on GitHub. ### February * New [CSS](/cascading-style-sheets.html), [task queue](/task-queues.html) and [uWSGI](/uwsgi.html) resources. +* Added new Django code example pages: + * [django.forms TypedChoiceField](/django-db-models-typedchoicefield-examples.html) ### January * Added new Django code example pages: From 358e8f546774e900c0c710040e2795f7bf5db0f0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 21 Feb 2020 09:22:03 -0500 Subject: [PATCH 067/302] new html resource --- content/pages/04-web-development/16-html.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/pages/04-web-development/16-html.markdown b/content/pages/04-web-development/16-html.markdown index 38f4bde17..a1ae84404 100644 --- a/content/pages/04-web-development/16-html.markdown +++ b/content/pages/04-web-development/16-html.markdown @@ -41,3 +41,8 @@ and is used to display website and web application content. remains because there is not enough optimization juice to squeeze from changing the implementation compared to the backwards-breaking changes in rendering existing sites. + +* [A Complete Guide to Links and Buttons](https://css-tricks.com/a-complete-guide-to-links-and-buttons/) + extensively covers what might be thought of as a simple topic: the + `a` and `button` elements in HTML, along with their many attributes + and quirks. From 31c882094e0f5819f1342bf6490564bc9b0161cc Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 22 Feb 2020 11:19:44 -0500 Subject: [PATCH 068/302] new static analysis resource on the code metrics page --- content/pages/04-web-development/39-code-metrics.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/pages/04-web-development/39-code-metrics.markdown b/content/pages/04-web-development/39-code-metrics.markdown index 6f1eb3df0..27761947e 100644 --- a/content/pages/04-web-development/39-code-metrics.markdown +++ b/content/pages/04-web-development/39-code-metrics.markdown @@ -169,3 +169,7 @@ diminishing returns. * [Intro to Black – The Uncompromising Python Code Formatter](http://www.blog.pythonlibrary.org/2019/07/16/intro-to-black-the-uncompromising-python-code-formatter/) contains some introductory examples for using Black and shows how to use it on your source files. + +* [Python static analysis tools](https://luminousmen.com/post/python-static-analysis-tools) + is a quick overview of the features for Black, Pylint, Pyflakes, Mypy, + Bandit and Prospector. From 12f88e7459bf7bbb483e395e488dcebd2631995e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 22 Feb 2020 11:34:11 -0500 Subject: [PATCH 069/302] new scipy resource --- content/pages/03-data/17-scipy-numpy.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/pages/03-data/17-scipy-numpy.markdown b/content/pages/03-data/17-scipy-numpy.markdown index 9259f5d89..b74612684 100644 --- a/content/pages/03-data/17-scipy-numpy.markdown +++ b/content/pages/03-data/17-scipy-numpy.markdown @@ -38,6 +38,12 @@ following resources are broader walkthroughs for the SciPy ecosystem: instructions for various SciPy packages that were previously hosted on the SciPy wiki. +* [Robots and Generative Art and Python, oh my!](https://www.generativehut.com/post/robots-and-generative-art-and-python-oh-my) + uses Scipy, Numpy, and [Matplotlib](/matplotlib.html) to generate + some nice looking art that can even be written to paper using a + plotter. This is a very cool example project that ties together + the scientific world and the art world. + * [Lectures in Quantitative Economics: SciPy](https://lectures.quantecon.org/py/scipy.html) provides a good overview of SciPy compared to the specific NumPy project, as well as explanations for the wrappers SciPy provides From d4df9aa9eb8988571ebe22a68c9f6334ae2393dc Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 23 Feb 2020 09:07:16 -0500 Subject: [PATCH 070/302] add datefield code examples for django forms --- .../django/django-forms-datefield.markdown | 529 ++++++++++++++++++ theme/templates/code-examples/django.html | 4 +- 2 files changed, 531 insertions(+), 2 deletions(-) create mode 100644 content/pages/examples/django/django-forms-datefield.markdown diff --git a/content/pages/examples/django/django-forms-datefield.markdown b/content/pages/examples/django/django-forms-datefield.markdown new file mode 100644 index 000000000..0268e90d0 --- /dev/null +++ b/content/pages/examples/django/django-forms-datefield.markdown @@ -0,0 +1,529 @@ +title: django.forms DateField Python Code Examples +category: page +slug: django-forms-datefield-examples +sortorder: 500013118 +toc: False +sidebartitle: django.forms DateField +meta: Python code examples to show how to use the DateField class within the forms module of the Django project. + + +The [DateField](https://github.com/django/django/blob/master/django/forms/fields.py) +([documentation](https://docs.djangoproject.com/en/stable/ref/forms/fields/#datefield)) +class in the `django.forms` module in the [Django](/django.html) +[web framework](/web-frameworks.html) provides a mechanism for safely handling +dates, but not times, as input from an HTTP POST request. The request is +typically generated by an [HTML](/hypertext-markup-language-html.html) form +created from a Django [web application](/web-development.html). + + +## Example 1 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / fields.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./fields.py) + +```python +from collections import namedtuple +from datetime import datetime, time + +~~from django import forms +from django.utils.dateparse import parse_datetime +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +from .conf import settings +from .constants import EMPTY_VALUES +from .utils import handle_timezone +from .widgets import ( + BaseCSVWidget, + CSVWidget, + DateRangeWidget, + LookupChoiceWidget, + RangeWidget +) + + +class RangeField(forms.MultiValueField): + widget = RangeWidget + + def __init__(self, fields=None, *args, **kwargs): + if fields is None: + fields = ( + forms.DecimalField(), + forms.DecimalField()) + super().__init__(fields, *args, **kwargs) + + def compress(self, data_list): + if data_list: + return slice(*data_list) + return None + + +class DateRangeField(RangeField): + widget = DateRangeWidget + + def __init__(self, *args, **kwargs): +~~ fields = ( +~~ forms.DateField(), +~~ forms.DateField()) +~~ super().__init__(fields, *args, **kwargs) + + def compress(self, data_list): + if data_list: + start_date, stop_date = data_list + if start_date: + start_date = handle_timezone( + datetime.combine(start_date, time.min), + False + ) + if stop_date: + stop_date = handle_timezone( + datetime.combine(stop_date, time.max), + False + ) + return slice(start_date, stop_date) + return None + + +## ... source file continues with no further DateField examples ... + +``` + + +## Example 2 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / fields.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./fields.py) + +```python +import django +~~from django import forms +import decimal + +from .widgets import (TextInput, HiddenInput, CheckboxInput, Select, + ClearableFileInput, SelectMultiple, DateInput, + DateTimeInput, TimeInput, URLInput, NumberInput, + EmailInput, NullBooleanSelect, SlugInput, IPAddressInput, + SplitDateTimeWidget, SplitHiddenDateTimeWidget, + MultipleHiddenInput) + +__all__ = ( + 'Field', 'CharField', 'IntegerField', 'DateField', 'TimeField', + 'DateTimeField', 'EmailField', 'FileField', 'ImageField', 'URLField', + 'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField', + 'FloatField', 'DecimalField', 'SlugField', 'RegexField', + 'GenericIPAddressField', 'TypedChoiceField', 'FilePathField', + 'TypedMultipleChoiceField', 'ComboField', 'MultiValueField', + 'SplitDateTimeField', +) +if django.VERSION < (1, 9): + __all__ += ('IPAddressField',) + + +class Field(forms.Field): + widget = TextInput + hidden_widget = HiddenInput + + +class CharField(Field, forms.CharField): + widget = TextInput + + def widget_attrs(self, widget): + attrs = super(CharField, self).widget_attrs(widget) + if attrs is None: + attrs = {} + if self.max_length is not None and isinstance(widget, (TextInput, HiddenInput)): + # The HTML attribute is maxlength, not max_length. + attrs.update({'maxlength': str(self.max_length)}) + return attrs + + +class BooleanField(Field, forms.BooleanField): + widget = CheckboxInput + + +class NullBooleanField(Field, forms.NullBooleanField): + widget = NullBooleanSelect + + +class ChoiceField(Field, forms.ChoiceField): + widget = Select + + +class TypedChoiceField(ChoiceField, forms.TypedChoiceField): + widget = Select + + +class FilePathField(ChoiceField, forms.FilePathField): + widget = Select + + +class FileField(Field, forms.FileField): + widget = ClearableFileInput + + +class ImageField(Field, forms.ImageField): + widget = ClearableFileInput + + +class MultipleChoiceField(Field, forms.MultipleChoiceField): + widget = SelectMultiple + hidden_widget = MultipleHiddenInput + + +class TypedMultipleChoiceField(MultipleChoiceField, + forms.TypedMultipleChoiceField): + pass + + +~~class DateField(Field, forms.DateField): +~~ widget = DateInput + + +## ... source file continues with no further DateField examples ... + +``` + + +## Example 3 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / filters.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./filters.py) + +```python +from django.contrib.admin import RelatedFieldListFilter +from django.utils.encoding import smart_text +from django.utils.html import format_html +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +try: + from django.contrib.admin.utils import get_model_from_relation +except ImportError: # Django 1.6 + from django.contrib.admin.util import get_model_from_relation + +try: + from django.forms.utils import flatatt +except ImportError: # Django 1.6 + from django.forms.util import flatatt + + +class RelatedFieldAjaxListFilter(RelatedFieldListFilter): + template = 'jet/related_field_ajax_list_filter.html' + ajax_attrs = None + + def has_output(self): + return True + + def field_choices(self, field, request, model_admin): + model = field.remote_field.model if hasattr(field, 'remote_field') else field.related_field.model + app_label = model._meta.app_label + model_name = model._meta.object_name + + self.ajax_attrs = format_html('{0}', flatatt({ + 'data-app-label': app_label, + 'data-model': model_name, + 'data-ajax--url': reverse('jet:model_lookup'), + 'data-queryset--lookup': self.lookup_kwarg + })) + + if self.lookup_val is None: + return [] + + other_model = get_model_from_relation(field) + if hasattr(field, 'rel'): + rel_name = field.rel.get_related_field().name + else: + rel_name = other_model._meta.pk.name + + queryset = model._default_manager.filter(**{rel_name: self.lookup_val}).all() + return [(x._get_pk_val(), smart_text(x)) for x in queryset] + + +try: + from collections import OrderedDict +~~ from django import forms + from django.contrib.admin.widgets import AdminDateWidget + from rangefilter.filter import DateRangeFilter as OriginalDateRangeFilter + from django.utils.translation import ugettext as _ + + + class DateRangeFilter(OriginalDateRangeFilter): + def get_template(self): + return 'rangefilter/date_filter.html' + + def _get_form_fields(self): + # this is here, because in parent DateRangeFilter AdminDateWidget + # could be imported from django-suit +~~ return OrderedDict(( +~~ (self.lookup_kwarg_gte, forms.DateField( +~~ label='', +~~ widget=AdminDateWidget(attrs={'placeholder': _('From date')}), +~~ localize=True, +~~ required=False +~~ )), +~~ (self.lookup_kwarg_lte, forms.DateField( +~~ label='', +~~ widget=AdminDateWidget(attrs={'placeholder': _('To date')}), +~~ localize=True, +~~ required=False +~~ )), +~~ )) + + @staticmethod + def _get_media(): + css = [ + 'style.css', + ] + return forms.Media( + css={'all': ['range_filter/css/%s' % path for path in css]} + ) +except ImportError: + pass + +``` + + +## Example 4 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / forms.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./forms.py) + +```python +from __future__ import unicode_literals + +import logging +import re +import collections +import datetime + +~~import django.forms +import django.forms.utils +import django.forms.widgets +import django.core.validators +import django.core.exceptions +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from django.utils.safestring import mark_safe + +import form_utils.forms +import requests +import dateutil.parser +import validate_email + +logger = logging.getLogger(__name__) + + +## ... source file abbreviated to get to the DateField example ... + +def register_form_generator(conf): + fieldsets = [] + fields = collections.OrderedDict() + for index, fieldset_def in enumerate(conf['fieldsets']): + fieldset_title = _(fieldset_def['title']) + fieldset_fields = fieldset_def['fields'] + + if not fieldset_fields: + continue + fieldset = (unicode(index), {'legend': fieldset_title, 'fields': []}, ) + + has_booleans = False + + for field_def in fieldset_def['fields']: + field_name = field_def['field_name'] + field_type = field_def.get('type') + label = _(field_def['human_name']) or '' + + is_required = field_def.get('required', False) + max_length = field_def.get('length') + initial = field_def.get('default') + if field_def.get('help_text'): + help_text = _(field_def.get('help_text')) + else: + help_text = '' + # process choices to add internationalization + choices = field_def.get('choices') + if choices: + choices = [(a, _(b)) for a, b in choices] + is_editable = field_def.get('editable', True) + min_value = field_def.get('min_value') + + d = { + 'label': label, + } + + if field_type == 'string': + d['required'] = is_required + d['initial'] = initial + if choices and is_editable: + d['help_text'] = help_text + d['choices'] = choices + d['widget'] = django.forms.RadioSelect + field_class = django.forms.ChoiceField + elif field_name == 'email': + d['max_length'] = max_length + d['help_text'] = help_text + field_class = django.forms.EmailField + elif field_name == 'license_id' \ + and 'license_id_formats' in conf: + d['max_length'] = max_length + license_id_formats = '{}{}{}'.format( + _('

Valid state License IDs should look like: '), + ', '.join(map(unicode, conf['license_id_formats'])), '

') + help_text = '{}{}{}'.format('

', unicode(help_text), '

') + license_id_formats = '{}{}'.format(license_id_formats, help_text) + d['help_text'] = mark_safe(license_id_formats) + field_class = django.forms.CharField + else: + d['max_length'] = max_length + d['help_text'] = help_text + field_class = django.forms.CharField + elif field_type == 'date': + d['required'] = is_required + d['initial'] = initial + d['help_text'] = help_text + if min_value: + d['validators'] = [validate_date_generator(min_value), ] +~~ field_class = django.forms.DateField + elif field_type == 'boolean': + has_booleans = True + d['initial'] = initial + # this must be false otherwise checkbox must be checked + if field_name == 'agree_to_tos': + d['help_text'] = mark_safe(help_text) + d['label'] = mark_safe(label) + else: + d['required'] = False + d['help_text'] = help_text + field_class = django.forms.BooleanField + else: + raise Exception('Unknown field type: {}'.format(field_type)) + + fields[field_name] = field_class(**d) + fieldset[1]['fields'].append(field_name) + + widget = fields[field_name].widget + if not is_editable: + if isinstance(widget, django.forms.Select): + widget.attrs['disabled'] = 'disabled' + else: + widget.attrs['readonly'] = 'readonly' + if field_type == 'date': + widget.attrs['placeholder'] = '__/__/____' + widget.attrs['class'] = 'date' + if field_name == 'phone_number': + widget.attrs['placeholder'] = '(___) ___-____' + widget.attrs['class'] = 'phonenumber' + if field_name == 'ssn': + widget.attrs['placeholder'] = '____' + widget.attrs['class'] = 'ssn' + + if has_booleans: + fieldset[1]['classes'] = ['checkboxes', ] + fieldsets.append(fieldset) + + cls_name = 'RegisterForm{}'.format( + RE_NON_ALPHA.sub('', conf['title'].title())).encode( + 'ascii', errors='ignore') + + cls = type( + cls_name, + (form_utils.forms.BetterBaseForm, django.forms.BaseForm, ), { + 'base_fieldsets': fieldsets, + 'base_fields': fields, + 'base_row_attrs': {}, + 'clean': register_form_clean, + 'clean_birthdate': register_form_clean_birthdate, + 'clean_phone_number': register_form_clean_phone_number, + 'clean_ssn': register_form_clean_ssn, + 'clean_license_id': register_form_clean_license_id, + 'api_errors': {}, + 'skip_api_error_validation': False, + 'validate_organ_tissue_selection': conf.get('validate_organ_tissue_selection', None), + }) + return cls + + +class RevokeForm(django.forms.Form): + email = django.forms.EmailField(label=_('Email')) + first_name = django.forms.CharField( + label=_('First Name'), max_length=150, min_length=1) + middle_name = django.forms.CharField( + label=_('Middle Name'), max_length=150, min_length=0, required=False) + last_name = django.forms.CharField( + label=_('Last Name'), max_length=150, min_length=1) + postal_code = django.forms.CharField( + label=_('Postal Code'), + max_length=5, min_length=5, validators=[validate_postal_code]) + gender = django.forms.ChoiceField( + label=_('Gender'), choices=CHOICES_GENDER, + widget=django.forms.RadioSelect) +~~ birthdate = django.forms.DateField( +~~ label=_('Birthdate'), +~~ widget=django.forms.DateInput( +~~ attrs={'placeholder': '__/__/____', 'class': 'date',})) + # agree_to_tos = django.forms.BooleanField( + # label=mark_safe(_('In order to revoke my organ and tissue donation status through Organize, I agree to ORGANIZE\'s ' + # 'Terms of Service and Privacy Policy.')), + # widget=django.forms.widgets.CheckboxInput( + # attrs={'required': 'required', })) + agree_to_tos = django.forms.BooleanField(label='', widget=django.forms.widgets.CheckboxInput(attrs={'required': 'required', })) + + def clean_email(self): + email = self.cleaned_data['email'] + if settings.DISABLE_EMAIL_VALIDATION: + logger.warning( + 'Email validation disabled: DISABLE_EMAIL_VALIDATION is set') + return email + # use mailgun email address validator to check this email + if not hasattr(settings, 'MAILGUN_PUBLIC_API_KEY'): + logger.warning( + 'Cannot validate email: MAILGUN_PUBLIC_API_KEY not set') + return email + r = requests.get( + 'https://api.mailgun.net/v2/address/validate', + data={'address': email, }, + auth=('api', settings.MAILGUN_PUBLIC_API_KEY)) + if r.status_code == 200: + if r.json()['is_valid']: + return email + logger.warning('Cannot validate email: {}'.format(r.text)) + raise django.forms.ValidationError(_('Enter a valid email.')) + +## ... source file continues with no further DateField examples ... + +``` + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 26d34dff8..7828d7d15 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -46,13 +46,13 @@

django.forms BooleanField, CharField, ChoiceField, - TypedChoiceField, - DateField, + DateField, DateTimeField, DecimalField, DurationField, EmailField, IntegerField + TypedChoiceField,

django.http HttpResponse, From b9589ccd366f04e3d89da8c7db7d804850e8f571 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 23 Feb 2020 09:11:17 -0500 Subject: [PATCH 071/302] update changelog --- content/pages/meta/00-change-log.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index c90a8ddb4..48eb1db23 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -18,6 +18,7 @@ on GitHub. * New [CSS](/cascading-style-sheets.html), [task queue](/task-queues.html) and [uWSGI](/uwsgi.html) resources. * Added new Django code example pages: + * [django.forms DateField](/django-db-models-datefield-examples.html) * [django.forms TypedChoiceField](/django-db-models-typedchoicefield-examples.html) ### January From 015d06dbdaff3f1faade78c2d683b524c9cbea5e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 8 Mar 2020 08:57:17 -0400 Subject: [PATCH 072/302] add new article on financial resources for software developers --- .../django-forms-datetimefield.markdown | 498 ++++++++++++++++++ .../django/django-forms-emailfield.markdown | 2 +- .../django/django-forms-integerfield.markdown | 2 +- .../django-forms-typedchoicefield.markdown | 2 +- content/pages/meta/00-change-log.markdown | 1 + ...08-financial-resources-developers.markdown | 107 ++++ ...st-resources-developers-learn-finance.html | 4 + theme/templates/code-examples/django.html | 2 +- 8 files changed, 614 insertions(+), 4 deletions(-) create mode 100644 content/pages/examples/django/django-forms-datetimefield.markdown create mode 100644 content/posts/200308-financial-resources-developers.markdown create mode 100644 theme/templates/blog/best-resources-developers-learn-finance.html diff --git a/content/pages/examples/django/django-forms-datetimefield.markdown b/content/pages/examples/django/django-forms-datetimefield.markdown new file mode 100644 index 000000000..bf9a7f20a --- /dev/null +++ b/content/pages/examples/django/django-forms-datetimefield.markdown @@ -0,0 +1,498 @@ +title: django.forms DateTimeField Code Examples +category: page +slug: django-forms-datetimefield-examples +sortorder: 500013119 +toc: False +sidebartitle: django.forms DateTimeField +meta: Python code examples that show how to use DateTimeField from the forms module of the Django project. + + +The [DateTimeField](https://github.com/django/django/blob/master/django/forms/fields.py) +([documentation](https://docs.djangoproject.com/en/stable/ref/forms/fields/#datetimefield)) +class in the `django.forms` module in the [Django](/django.html) +[web framework](/web-frameworks.html) provides a mechanism for safely handling +dates and times as input from HTTP POST requests. The requests are +usually generated by an [HTML](/hypertext-markup-language-html.html) form +created from a Django [web application](/web-development.html). + + +## Example 1 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / fields.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./fields.py) + +```python +from collections import namedtuple +from datetime import datetime, time + +~~from django import forms +from django.utils.dateparse import parse_datetime +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +from .conf import settings +from .constants import EMPTY_VALUES +from .utils import handle_timezone +from .widgets import ( + BaseCSVWidget, + CSVWidget, + DateRangeWidget, + LookupChoiceWidget, + RangeWidget +) + + +class RangeField(forms.MultiValueField): + widget = RangeWidget + + def __init__(self, fields=None, *args, **kwargs): + if fields is None: + fields = ( + forms.DecimalField(), + forms.DecimalField()) + super().__init__(fields, *args, **kwargs) + + def compress(self, data_list): + if data_list: + return slice(*data_list) + return None + + +class DateRangeField(RangeField): + widget = DateRangeWidget + + def __init__(self, *args, **kwargs): + fields = ( + forms.DateField(), + forms.DateField()) + super().__init__(fields, *args, **kwargs) + + def compress(self, data_list): + if data_list: + start_date, stop_date = data_list + if start_date: + start_date = handle_timezone( + datetime.combine(start_date, time.min), + False + ) + if stop_date: + stop_date = handle_timezone( + datetime.combine(stop_date, time.max), + False + ) + return slice(start_date, stop_date) + return None + + +class DateTimeRangeField(RangeField): + widget = DateRangeWidget + + def __init__(self, *args, **kwargs): +~~ fields = ( +~~ forms.DateTimeField(), +~~ forms.DateTimeField()) +~~ super().__init__(fields, *args, **kwargs) + + +class IsoDateTimeRangeField(RangeField): + widget = DateRangeWidget + + def __init__(self, *args, **kwargs): + fields = ( + IsoDateTimeField(), + IsoDateTimeField()) + super().__init__(fields, *args, **kwargs) + + +class TimeRangeField(RangeField): + widget = DateRangeWidget + + def __init__(self, *args, **kwargs): + fields = ( + forms.TimeField(), + forms.TimeField()) + super().__init__(fields, *args, **kwargs) + + +class Lookup(namedtuple('Lookup', ('value', 'lookup_expr'))): + def __new__(cls, value, lookup_expr): + if value in EMPTY_VALUES or lookup_expr in EMPTY_VALUES: + raise ValueError( + "Empty values ([], (), {}, '', None) are not " + "valid Lookup arguments. Return None instead." + ) + + return super().__new__(cls, value, lookup_expr) + + +class LookupChoiceField(forms.MultiValueField): + default_error_messages = { + 'lookup_required': _('Select a lookup.'), + } + + def __init__(self, field, lookup_choices, *args, **kwargs): + empty_label = kwargs.pop('empty_label', settings.EMPTY_CHOICE_LABEL) + fields = (field, ChoiceField(choices=lookup_choices, empty_label=empty_label)) + widget = LookupChoiceWidget(widgets=[f.widget for f in fields]) + kwargs['widget'] = widget + kwargs['help_text'] = field.help_text + super().__init__(fields, *args, **kwargs) + + def compress(self, data_list): + if len(data_list) == 2: + value, lookup_expr = data_list + if value not in EMPTY_VALUES: + if lookup_expr not in EMPTY_VALUES: + return Lookup(value=value, lookup_expr=lookup_expr) + else: + raise forms.ValidationError( + self.error_messages['lookup_required'], + code='lookup_required') + return None + + +~~class IsoDateTimeField(forms.DateTimeField): +~~ """ +~~ Supports 'iso-8601' date format too which is out the scope of +~~ the ``datetime.strptime`` standard library + +~~ # ISO 8601: ``http://www.w3.org/TR/NOTE-datetime`` + +~~ Based on Gist example by David Medina https://gist.github.com/copitux/5773821 +~~ """ +~~ ISO_8601 = 'iso-8601' +~~ input_formats = [ISO_8601] + +~~ def strptime(self, value, format): +~~ value = force_str(value) + +~~ if format == self.ISO_8601: +~~ parsed = parse_datetime(value) +~~ if parsed is None: # Continue with other formats if doesn't match +~~ raise ValueError +~~ return handle_timezone(parsed) +~~ return super().strptime(value, format) + + +## ... source file continues with no further DateTimeField examples ... + +``` + + +## Example 2 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / fields.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./fields.py) + +```python +import django +~~from django import forms +import decimal + +from .widgets import (TextInput, HiddenInput, CheckboxInput, Select, + ClearableFileInput, SelectMultiple, DateInput, + DateTimeInput, TimeInput, URLInput, NumberInput, + EmailInput, NullBooleanSelect, SlugInput, IPAddressInput, + SplitDateTimeWidget, SplitHiddenDateTimeWidget, + MultipleHiddenInput) + +__all__ = ( + 'Field', 'CharField', 'IntegerField', 'DateField', 'TimeField', + 'DateTimeField', 'EmailField', 'FileField', 'ImageField', 'URLField', + 'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField', + 'FloatField', 'DecimalField', 'SlugField', 'RegexField', + 'GenericIPAddressField', 'TypedChoiceField', 'FilePathField', + 'TypedMultipleChoiceField', 'ComboField', 'MultiValueField', + 'SplitDateTimeField', +) +if django.VERSION < (1, 9): + __all__ += ('IPAddressField',) + + +class Field(forms.Field): + widget = TextInput + hidden_widget = HiddenInput + + +class CharField(Field, forms.CharField): + widget = TextInput + + def widget_attrs(self, widget): + attrs = super(CharField, self).widget_attrs(widget) + if attrs is None: + attrs = {} + if self.max_length is not None and isinstance(widget, (TextInput, HiddenInput)): + # The HTML attribute is maxlength, not max_length. + attrs.update({'maxlength': str(self.max_length)}) + return attrs + + +class BooleanField(Field, forms.BooleanField): + widget = CheckboxInput + + +class NullBooleanField(Field, forms.NullBooleanField): + widget = NullBooleanSelect + + +class ChoiceField(Field, forms.ChoiceField): + widget = Select + + +class TypedChoiceField(ChoiceField, forms.TypedChoiceField): + widget = Select + + +class FilePathField(ChoiceField, forms.FilePathField): + widget = Select + + +class FileField(Field, forms.FileField): + widget = ClearableFileInput + + +class ImageField(Field, forms.ImageField): + widget = ClearableFileInput + + +class MultipleChoiceField(Field, forms.MultipleChoiceField): + widget = SelectMultiple + hidden_widget = MultipleHiddenInput + + +class TypedMultipleChoiceField(MultipleChoiceField, + forms.TypedMultipleChoiceField): + pass + + +class DateField(Field, forms.DateField): + widget = DateInput + + +~~class DateTimeField(Field, forms.DateTimeField): +~~ widget = DateTimeInput + + +class TimeField(Field, forms.TimeField): + widget = TimeInput + + +class FloatField(Field, forms.FloatField): + widget = NumberInput + + def widget_attrs(self, widget): + attrs = super(FloatField, self).widget_attrs(widget) or {} + if self.min_value is not None: + attrs['min'] = self.min_value + if self.max_value is not None: + attrs['max'] = self.max_value + if 'step' not in widget.attrs: + attrs.setdefault('step', 'any') + return attrs + + +class IntegerField(Field, forms.IntegerField): + widget = NumberInput + + def __init__(self, *args, **kwargs): + kwargs.setdefault('widget', NumberInput if not kwargs.get('localize') else self.widget) + super(IntegerField, self).__init__(*args, **kwargs) + + def widget_attrs(self, widget): + attrs = super(IntegerField, self).widget_attrs(widget) or {} + if self.min_value is not None: + attrs['min'] = self.min_value + if self.max_value is not None: + attrs['max'] = self.max_value + return attrs + + +class DecimalField(Field, forms.DecimalField): + widget = NumberInput + + def __init__(self, *args, **kwargs): + kwargs.setdefault('widget', NumberInput if not kwargs.get('localize') else self.widget) + super(DecimalField, self).__init__(*args, **kwargs) + + def widget_attrs(self, widget): + attrs = super(DecimalField, self).widget_attrs(widget) or {} + if self.min_value is not None: + attrs['min'] = self.min_value + if self.max_value is not None: + attrs['max'] = self.max_value + if self.decimal_places is not None: + attrs['step'] = decimal.Decimal('0.1') ** self.decimal_places + return attrs + + +class EmailField(Field, forms.EmailField): + widget = EmailInput + + +class URLField(Field, forms.URLField): + widget = URLInput + + +class SlugField(Field, forms.SlugField): + widget = SlugInput + + +class RegexField(Field, forms.RegexField): + widget = TextInput + + def __init__(self, regex, js_regex=None, max_length=None, min_length=None, + error_message=None, *args, **kwargs): + self.js_regex = js_regex + super(RegexField, self).__init__(regex, max_length, min_length, + *args, **kwargs) + + def widget_attrs(self, widget): + attrs = super(RegexField, self).widget_attrs(widget) or {} + if self.js_regex is not None: + attrs['pattern'] = self.js_regex + return attrs + + +if django.VERSION < (1, 9): + class IPAddressField(Field, forms.IPAddressField): + widget = IPAddressInput + + +class GenericIPAddressField(Field, forms.GenericIPAddressField): + pass + + +class ComboField(Field, forms.ComboField): + pass + + +class MultiValueField(Field, forms.MultiValueField): + pass + + +class SplitDateTimeField(forms.SplitDateTimeField): + widget = SplitDateTimeWidget + hidden_widget = SplitHiddenDateTimeWidget + + def __init__(self, *args, **kwargs): + super(SplitDateTimeField, self).__init__(*args, **kwargs) + for widget in self.widget.widgets: + widget.is_required = self.required + +``` + + +## Example 3 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / forms / widgets.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/forms/widgets.py) + +```python +# -*- coding: utf-8 -*- + +""" Widgets for mongonaut forms""" + +~~from django import forms + +from mongoengine.base import ObjectIdField +from mongoengine.fields import BooleanField +from mongoengine.fields import DateTimeField +from mongoengine.fields import EmbeddedDocumentField +from mongoengine.fields import ListField +from mongoengine.fields import ReferenceField +from mongoengine.fields import FloatField +from mongoengine.fields import EmailField +from mongoengine.fields import DecimalField +from mongoengine.fields import URLField +from mongoengine.fields import IntField +from mongoengine.fields import StringField +from mongoengine.fields import GeoPointField + + +def get_widget(model_field, disabled=False): + """Choose which widget to display for a field.""" + + attrs = get_attrs(model_field, disabled) + + if hasattr(model_field, "max_length") and not model_field.max_length: + return forms.Textarea(attrs=attrs) + + elif isinstance(model_field, DateTimeField): + return forms.DateTimeInput(attrs=attrs) + + elif isinstance(model_field, BooleanField): + return forms.CheckboxInput(attrs=attrs) + + elif isinstance(model_field, ReferenceField) or model_field.choices: + return forms.Select(attrs=attrs) + + elif (isinstance(model_field, ListField) or + isinstance(model_field, EmbeddedDocumentField) or + isinstance(model_field, GeoPointField)): + return None + + else: + return forms.TextInput(attrs=attrs) + + +def get_attrs(model_field, disabled=False): + """Set attributes on the display widget.""" + attrs = {} + attrs['class'] = 'span6 xlarge' + if disabled or isinstance(model_field, ObjectIdField): + attrs['class'] += ' disabled' + attrs['readonly'] = 'readonly' + return attrs + + +def get_form_field_class(model_field): + """Gets the default form field for a mongoenigne field.""" + + FIELD_MAPPING = { + IntField: forms.IntegerField, + StringField: forms.CharField, + FloatField: forms.FloatField, + BooleanField: forms.BooleanField, +~~ DateTimeField: forms.DateTimeField, + DecimalField: forms.DecimalField, + URLField: forms.URLField, + EmailField: forms.EmailField + } + + return FIELD_MAPPING.get(model_field.__class__, forms.CharField) + +``` + + diff --git a/content/pages/examples/django/django-forms-emailfield.markdown b/content/pages/examples/django/django-forms-emailfield.markdown index 2155cafce..3cdcafb49 100644 --- a/content/pages/examples/django/django-forms-emailfield.markdown +++ b/content/pages/examples/django/django-forms-emailfield.markdown @@ -1,7 +1,7 @@ title: django.forms EmailField Python Code Examples category: page slug: django-forms-emailfield-examples -sortorder: 500013120 +sortorder: 500013124 toc: False sidebartitle: django.forms EmailField meta: View Python code examples that show how to use the EmailField class within the forms module of the Django open source project. diff --git a/content/pages/examples/django/django-forms-integerfield.markdown b/content/pages/examples/django/django-forms-integerfield.markdown index e5cd5198e..c754b66ce 100644 --- a/content/pages/examples/django/django-forms-integerfield.markdown +++ b/content/pages/examples/django/django-forms-integerfield.markdown @@ -1,7 +1,7 @@ title: django.forms IntegerField Python Code Examples category: page slug: django-forms-integerfield-examples -sortorder: 500013120 +sortorder: 500013125 toc: False sidebartitle: django.forms IntegerField meta: View Python code examples that show how to use the IntegerField class within the forms module of the Django open source project. diff --git a/content/pages/examples/django/django-forms-typedchoicefield.markdown b/content/pages/examples/django/django-forms-typedchoicefield.markdown index 23eab0e9f..10fb85a86 100644 --- a/content/pages/examples/django/django-forms-typedchoicefield.markdown +++ b/content/pages/examples/django/django-forms-typedchoicefield.markdown @@ -1,7 +1,7 @@ title: django.forms TypedChoiceField Python Code Examples category: page slug: django-forms-typedchoicefield-examples -sortorder: 500013125 +sortorder: 500013129 toc: False sidebartitle: django.forms TypedChoiceField meta: View code examples that show how to use the TypedChoiceField class within the forms module of Django. diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 48eb1db23..a231b4dfb 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -19,6 +19,7 @@ on GitHub. and [uWSGI](/uwsgi.html) resources. * Added new Django code example pages: * [django.forms DateField](/django-db-models-datefield-examples.html) + * [django.forms DateTimeField](/django-db-models-datetimefield-examples.html) * [django.forms TypedChoiceField](/django-db-models-typedchoicefield-examples.html) ### January diff --git a/content/posts/200308-financial-resources-developers.markdown b/content/posts/200308-financial-resources-developers.markdown new file mode 100644 index 000000000..059a07162 --- /dev/null +++ b/content/posts/200308-financial-resources-developers.markdown @@ -0,0 +1,107 @@ +title: The Best Resources for Developers to Learn Finance +slug: best-resources-developers-learn-finance +meta: Find out the best free and low cost finance newsletters, websites and books for developers to learn financial literacy. +category: post +date: 2020-03-08 +modified: 2020-03-08 +newsletter: True +headerimage: /img/visuals/email-post-header.jpg +headeralt: Python programming language and Full Stack Python logos. + + +Software developers should understand the basics of finance not only +to manage their own money but also to understand how businesses' software +projects are funded. + +Understanding how other people who work in accounting, finance and project +management think about business and finance in particular can help you make +better architectural decisions when trying to build maintainable systems. +Code is only one aspect of a large software project so working with others +and viewing the world through their discipline will help you immensely as +you advance your career. + + +## Newsletters & Podcasts on Finance +The fastest way to take a first step in improving your financial literacy +is to subscribe to a few free newsletters that regularly hit your inbox, +or a podcast if listening better fits your daily routine. I read and listen +to each of the following newsletters and podcasts to pick up on unfamiliar +topics then do more of my own research if I do not understand what they +are talking or writing about. + +* [Money Stuff by Matt Levine of Bloomberg](https://www.bloomberg.com/opinion/authors/ARbTQlRLRjE/matthew-s-levine) + ([newsletter sign up form](https://link.mail.bloombergbusiness.com/join/4wm/moneystuff-signup)) + is a hilarious must-read daily newsletter that covers the world of + finance and breaks down many absurd situations such as financial + fraud, insider trading, or competing interests in credit default swaps. + Amazingly, the author stays out of political topics, which I find very + refreshing because many other journalists seem to force their own biases + about finance down your throat even if you do not want their opinions. + +* [Endless Metrics](https://endlessmetrics.substack.com) explains financial + topics in a way that's easy to understand. What I love most about this + newsletter is that the author will often venture into finance-related + topics he's interested in and then explain those subjects + +* [Points of Return by John Auther](https://www.bloomberg.com/authors/AT2bBytfUHQ/john-authers) + ([newsletter sign up form](http://link.mail.bloombergbusiness.com/join/4wm/opinion-authers-signup)). + This author is incredibly knowledgeable about finance and typically + provides a solid grounding in long-term fundamentals rather than the + short-term hyperbole that is pervasive in cable television financial + journalism. + +* [Odd Lots](https://www.bloomberg.com/podcasts/odd_lots) covers kind + of whatever topics the hosts find interesting such as pandemic bonds, + repo market disruption, sovereign debt restructuring and emerging + markets. That's why it's so good - the hosts bring on an expert in that + topic and ask a ton of great questions because they want to learn + what's going on for themselves. You follow along with them as they + try to understand some of the oft-esoteric subject areas of finance. + + +## Books, Websites and Magazines for Finance +Newsletters and podcasts are great for prodding you into discovering +topics you did not know you needed to learn. When you discover something +that you want to go deeper on in finance, here are a few of my favorite +books and websites that range from the very basics of finance to broader +macroeconomic data trends. + +* I learned most of my basic finance knowledge when I read + [Financial Intelligence for IT Professionals](https://www.amazon.com/Financial-Intelligence-Professionals-Really-Numbers/dp/1422119149) + in graduate school ([go Hoos](https://www.virginia.edu/)!). The book + is well-written, straightforward and accessible, particularly because + it clearly targets its software developer audience. + +* [Don't Quit Your Day Job](https://dqydj.com/) uses a ton of metrics + and statistics to ground their articles on financial topics that + are often relevant specifically to software developers. For example, + the article on + [How Many Developers are There in America, and Where Do They Live?](https://dqydj.com/number-of-developers-in-america-and-per-state/) + is fascinating and especially useful because they explain their + data sources and analysis methodology. + +* [Money Magazine](https://money.com/) can be useful to pick up in paper + edition for a few months to understand personal finance basics. After a + few months you'll discover the articles and topics tend to recycle so + there are diminishing returns to reading it after you have familiarized + yourself with most of the topics. + +* [Longtermtrends](https://www.longtermtrends.net/) aggregates long term + high-level financial data and displays it. I find looking at these + charts gets me away from the day-to-day "oh the stock market is down" + and towards thinking about what happens when you invest money over many + years or decades. + + +## Specific Articles on Financial Topics +The following individual articles I have found to be both well-written and +extremely useful for specific scenarios such as evaluating stock-based +equity compensation, or negotiating your salary. + +* [Salary negotiation](https://www.kalzumeus.com/2012/01/23/salary-negotiation/) + +* [Stock Options](https://blog.alexmaccaw.com/an-engineers-guide-to-stock-options) + +* [Open Guide to Equity Compensation](https://github.com/jlevy/og-equity-compensation) + + diff --git a/theme/templates/blog/best-resources-developers-learn-finance.html b/theme/templates/blog/best-resources-developers-learn-finance.html new file mode 100644 index 000000000..e71c81893 --- /dev/null +++ b/theme/templates/blog/best-resources-developers-learn-finance.html @@ -0,0 +1,4 @@ +Full Stack Python +Endless Metrics {% include "blog/external-link.html" %} +Money Stuff {% include "blog/external-link.html" %} +Don't Quit Your Day Job {% include "blog/external-link.html" %} diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 7828d7d15..9589441ef 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -47,7 +47,7 @@

django.forms CharField, ChoiceField, DateField, - DateTimeField, + DateTimeField, DecimalField, DurationField, EmailField, From 565859a4eb324a7bbf23cd7166b7fd24b2ea1231 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 8 Mar 2020 08:58:32 -0400 Subject: [PATCH 073/302] update changelog --- content/pages/meta/00-change-log.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index a231b4dfb..1493c033c 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2020 +### March +* Added new blog post on + [The Best Resources for Developers to Learn Finance](/blog/best-resources-developers-learn-finance.html). + ### February * New [CSS](/cascading-style-sheets.html), [task queue](/task-queues.html) and [uWSGI](/uwsgi.html) resources. From ae73a7b083c37ff07dc4c990a439a757fb808932 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 8 Mar 2020 09:02:58 -0400 Subject: [PATCH 074/302] fix sentence fragment in latest post --- .../200308-financial-resources-developers.markdown | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/content/posts/200308-financial-resources-developers.markdown b/content/posts/200308-financial-resources-developers.markdown index 059a07162..fb0619334 100644 --- a/content/posts/200308-financial-resources-developers.markdown +++ b/content/posts/200308-financial-resources-developers.markdown @@ -39,9 +39,14 @@ are talking or writing about. about finance down your throat even if you do not want their opinions. * [Endless Metrics](https://endlessmetrics.substack.com) explains financial - topics in a way that's easy to understand. What I love most about this - newsletter is that the author will often venture into finance-related - topics he's interested in and then explain those subjects + topics in a way that's easy for anyone without a finance background to + understand. For example, + [what the heck is GDP and how do you read a GDP chart?](https://endlessmetrics.substack.com/p/reading-a-gdp-chart). + What I love most about this newsletter is that the author will often + venture into finance-related topics he's interested in and then explain + those subjects while grounding them with useful charts and data. + This analytic approach closely matches how my developer brain processes + information! * [Points of Return by John Auther](https://www.bloomberg.com/authors/AT2bBytfUHQ/john-authers) ([newsletter sign up form](http://link.mail.bloombergbusiness.com/join/4wm/opinion-authers-signup)). From 95c7256543e73ae2ac573e0f93afba97736ae64e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 10 Mar 2020 10:11:10 -0400 Subject: [PATCH 075/302] update link for dlint --- content/pages/04-web-development/39-code-metrics.markdown | 2 +- theme/templates/code-examples/django.html | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/content/pages/04-web-development/39-code-metrics.markdown b/content/pages/04-web-development/39-code-metrics.markdown index 27761947e..ea7e34712 100644 --- a/content/pages/04-web-development/39-code-metrics.markdown +++ b/content/pages/04-web-development/39-code-metrics.markdown @@ -48,7 +48,7 @@ system are occurring. * [Black](https://github.com/ambv/black) is a Python code formatter with strong, uncompromising assumptions about how your code must be formatted. -* [dlint](https://github.com/duo-labs/dlint) is a linter for secure coding +* [dlint](https://github.com/dlint-py) is a linter for secure coding practices. * [pylintdb](https://github.com/nedbat/pylintdb) puts pylint results into diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 9589441ef..2a56a0bcf 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -48,11 +48,9 @@

django.forms ChoiceField, DateField, DateTimeField, - DecimalField, - DurationField, EmailField, - IntegerField - TypedChoiceField, + IntegerField, + TypedChoiceField

django.http HttpResponse, From 6824ae43c184a7201e38dd6145fbcbeda3f0cd01 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 11 Mar 2020 09:03:10 -0400 Subject: [PATCH 076/302] add django riffs podcast --- .../pages/01-introduction/10-best-python-podcasts.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/pages/01-introduction/10-best-python-podcasts.markdown b/content/pages/01-introduction/10-best-python-podcasts.markdown index b52a474a5..e1776c4ac 100644 --- a/content/pages/01-introduction/10-best-python-podcasts.markdown +++ b/content/pages/01-introduction/10-best-python-podcasts.markdown @@ -38,6 +38,10 @@ listen and learn. on [testing](/testing.html) and related topics such as mocking and [code metrics](/code-metrics.html). +* [Django Riffs](https://djangoriffs.com/) is a podcast for learning + [web application development](/web-development.html) in Python using the + [Django web framework](/django.html). + * [Teaching Python](https://www.teachingpython.fm/) is a podcast by two teachers about their adventures teaching middle school computer science, problem solving, handling failure, frustration, and success with From be3e7e8c7a13c125ff041b48a4d05a2b3c1cd5ad Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 13 Mar 2020 10:28:52 -0400 Subject: [PATCH 077/302] add new resources for web design and dev --- content/pages/04-web-development/00-web-development.markdown | 5 +++++ content/pages/04-web-development/15-web-design.markdown | 5 +++++ content/pages/meta/00-change-log.markdown | 2 ++ 3 files changed, 12 insertions(+) diff --git a/content/pages/04-web-development/00-web-development.markdown b/content/pages/04-web-development/00-web-development.markdown index 2c5bc5e60..0aad8182f 100644 --- a/content/pages/04-web-development/00-web-development.markdown +++ b/content/pages/04-web-development/00-web-development.markdown @@ -81,6 +81,11 @@ world. CSS, JavaScript, images and other files as input and render webpages as output. It is well worth your time to know this stuff as a web developer. +* [The history of the URL](https://blog.cloudflare.com/the-history-of-the-url/) + explains how the growth of ARPANET to hundreds of nodes eventually led to + the creation of the URL. This is a great read that provides historical + context for why things are the way they are with the web. + * [Web app checklist](http://dhilipsiva.com/webapp-checklist/) presents good practices that developers building and [deploying](/deployment.html) web applications should follow. Don't worry about having every single diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index b02e8b4ab..ccffb3f31 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -99,6 +99,11 @@ this short list as my absolute favorites that help developers become * [How to design delightful dark themes](https://blog.superhuman.com/how-to-design-delightful-dark-themes-7b3da644ff1f) explains some subtle tactics to make dark themes work well for users. +* [Setting height and width on images is important again](https://www.smashingmagazine.com/2020/03/setting-height-width-images-important-again/) + describes how browser layout and resizing settings could affect your + images so manually setting the size is more useful than it has + been in the past few years. + * [Kuler](https://kuler.adobe.com/create/color-wheel/) is a complementary color picker by Adobe that helps choose colors for your designs. diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 1493c033c..5759b450a 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,8 @@ on GitHub. ## 2020 ### March +* New [web design](/web-design.html) and + [web development](/web-development.html) resources. * Added new blog post on [The Best Resources for Developers to Learn Finance](/blog/best-resources-developers-learn-finance.html). From 60ef260bc324a4160d993ac962115063eff07f5a Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 14 Mar 2020 11:38:18 -0400 Subject: [PATCH 078/302] add jupyter notebook and postgresql resources --- .../06-jupyter-notebook.markdown | 5 +++++ content/pages/03-data/02-postgresql.markdown | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/content/pages/02-development-environments/06-jupyter-notebook.markdown b/content/pages/02-development-environments/06-jupyter-notebook.markdown index 838763258..e5c503dee 100644 --- a/content/pages/02-development-environments/06-jupyter-notebook.markdown +++ b/content/pages/02-development-environments/06-jupyter-notebook.markdown @@ -73,6 +73,11 @@ your own productive workflow. data science notebook projects such as MATLAB and Mathematica to set the stage for IPython and Jupyter's creation. +* [How to use Jupyter Notebooks in 2020 (Part 1: The data science landscape)](https://ljvmiranda921.github.io/notebook/2020/03/06/jupyter-notebooks-in-2020/) + is a high-level overview post that starts a series on Jupyter Notebooks. + This first post covers why a tool like Jupyter Notebook is needed in + the broader landscape of data science. + * [How to Version Control Jupyter Notebooks](https://nextjournal.com/schmudde/how-to-version-control-jupyter) explains how Jupyter Notebooks are stored in JSON, the issues with that format for [source control](/source-control.html) and how to get diff --git a/content/pages/03-data/02-postgresql.markdown b/content/pages/03-data/02-postgresql.markdown index d20271e9c..fbe6881f6 100644 --- a/content/pages/03-data/02-postgresql.markdown +++ b/content/pages/03-data/02-postgresql.markdown @@ -137,6 +137,12 @@ walkthroughs I've read. * [How to speed up tests in Django and PostgreSQL](http://nemesisdesign.net/blog/coding/how-to-speed-up-tests-django-postgresql/) explains some hacks for making your schema migration-backed run quicker. +* [Thinking psycopg3](https://www.varrazzo.com/blog/2020/03/06/thinking-psycopg3/) + is written by a developer who has worked on this critical Python library + for interacting with PostgreSQL since 2005. The author writes up thoughts + on what should change if backwards-incompatible changes are ever introduced + in a new hypothetical future version. + * [Records](https://pypi.org/project/records/) is a wrapper around the psycopg2 driver that allows easy access to direct SQL access. It's worth a look if you prefer writing SQL over using an From 70b882e2da221eece8c582034342d1060d663216 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 15 Mar 2020 08:21:49 -0400 Subject: [PATCH 079/302] new django orm resource --- content/pages/03-data/08-django-orm.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/pages/03-data/08-django-orm.markdown b/content/pages/03-data/08-django-orm.markdown index c5ce776ed..abad853fe 100644 --- a/content/pages/03-data/08-django-orm.markdown +++ b/content/pages/03-data/08-django-orm.markdown @@ -176,3 +176,9 @@ following resources should get you past the initial hurdles. added to an existing table, and another where a `Many-to-Many` field needs to be converted to a standard `ForeignKey` column while retaining all of the data. + +* [Double-checked locking with Django ORM](https://lukeplant.me.uk/blog/posts/double-checked-locking-with-django-orm/) + shows how you can implement a double-checking locking pattern in the + Django ORM with [PostgreSQL](/postgresql.html), which is useful + when you want to prevent multiple processes from accessing the same + data at the same time. From 663c0ecc6669bd3aed55e1deb160f141b899e194 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 15 Mar 2020 08:28:49 -0400 Subject: [PATCH 080/302] add twilio resources --- content/pages/03-data/16-pandas.markdown | 4 ++++ content/pages/04-web-development/52-twilio.markdown | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/content/pages/03-data/16-pandas.markdown b/content/pages/03-data/16-pandas.markdown index b3ccee0d7..5f0268fd2 100644 --- a/content/pages/03-data/16-pandas.markdown +++ b/content/pages/03-data/16-pandas.markdown @@ -49,6 +49,10 @@ is a data structures and analysis library. shows how to use the `crosstab` function in pandas so you can summarize and group data. +* [How to Convert a Python Dictionary to a Pandas DataFrame](https://www.marsja.se/how-to-convert-a-python-dictionary-to-a-pandas-dataframe/) + is a straightforward tutorial with example code for loading and adding + data stored in a typical Python dictionary into a DataFrame. + * This two-part series on loading data into a pandas DataFrame presents what to do [when CSV files do not match your expectations](http://blog.enthought.com/python/with-and-without-the-canopy-data-import-tool-loading-data-theres-no-such-thing-as-a-simple-csv-file/) diff --git a/content/pages/04-web-development/52-twilio.markdown b/content/pages/04-web-development/52-twilio.markdown index 8322563b1..cf5343826 100644 --- a/content/pages/04-web-development/52-twilio.markdown +++ b/content/pages/04-web-development/52-twilio.markdown @@ -88,6 +88,11 @@ for fellow developers. and [Bottle](https://www.twilio.com/blog/2016/08/getting-started-python-bottle-twilio-sms-mms.html) apps to learn from while building your own projects. +* [Serverless Phone Number Validation with AWS Lambda, Python and Twilio](https://www.twilio.com/blog/serverless-phone-number-validation-aws-lambda-python-twilio) + walks through using the Python runtime on [AWS Lambda](/aws-lambda.html) + and Twilio's APIs for validating phone number information. + + * [Google Cloud recommends developers use Twilio](https://cloud.google.com/appengine/docs/standard/python/sms/twilio) for communications in their apps and provides a short walkthrough for Python developers. @@ -95,7 +100,8 @@ for fellow developers. * [SMS Tracking Notifications](https://www.easypost.com/sms-tracking-tutorial) is a fun tutorial that combines two APIs together - Twilio and [Easypost](https://www.easypost.com) to track packages sent through the - Easypost service. + Easypost service. There is also another tutorial on + [shipment notifications specifically for Flask](https://www.twilio.com/blog/build-shipment-notification-service-python-flask-twilio-easypost). * This video titled "[We're No Strangers to VoIP: Building the National Rick Astley Hotline)](https://www.youtube.com/watch?v=LgKshQoGh64)" From 3c2c89f811caf307016bcd823599006a728d0ae1 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 19 Mar 2020 16:38:46 -0400 Subject: [PATCH 081/302] new jupyter and django orm resources --- .../06-jupyter-notebook.markdown | 3 +++ content/pages/03-data/08-django-orm.markdown | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/content/pages/02-development-environments/06-jupyter-notebook.markdown b/content/pages/02-development-environments/06-jupyter-notebook.markdown index e5c503dee..28e795585 100644 --- a/content/pages/02-development-environments/06-jupyter-notebook.markdown +++ b/content/pages/02-development-environments/06-jupyter-notebook.markdown @@ -77,6 +77,9 @@ your own productive workflow. is a high-level overview post that starts a series on Jupyter Notebooks. This first post covers why a tool like Jupyter Notebook is needed in the broader landscape of data science. + [Part 2](https://ljvmiranda921.github.io/notebook/2020/03/16/jupyter-notebooks-in-2020-part-2/) + examines the growth of the Jupyter ecosystem and the jump from exploratory + analysis notebooks to production notebooks. * [How to Version Control Jupyter Notebooks](https://nextjournal.com/schmudde/how-to-version-control-jupyter) explains how Jupyter Notebooks are stored in JSON, the issues with that diff --git a/content/pages/03-data/08-django-orm.markdown b/content/pages/03-data/08-django-orm.markdown index abad853fe..3184e1b70 100644 --- a/content/pages/03-data/08-django-orm.markdown +++ b/content/pages/03-data/08-django-orm.markdown @@ -182,3 +182,9 @@ following resources should get you past the initial hurdles. Django ORM with [PostgreSQL](/postgresql.html), which is useful when you want to prevent multiple processes from accessing the same data at the same time. + +* [Using Django Check Constraints for the Sum of Percentage Fields](https://adamj.eu/tech/2020/03/10/django-check-constraints-sum-percentage-fields/) + shows how you can combine several `PositiveIntegerField` model + fields with a checking constraint and a web form that ensures + all of the fields sum up to a precise amount, such as 100%. + From c6aacb92c215b5ace2a041d291120e5b3a50a1b3 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 20 Mar 2020 15:32:47 -0400 Subject: [PATCH 082/302] add new webrtc and ORM resources --- .../pages/03-data/05-object-relational-mappers.markdown | 3 ++- content/pages/04-web-development/43-webrtc.markdown | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/content/pages/03-data/05-object-relational-mappers.markdown b/content/pages/03-data/05-object-relational-mappers.markdown index a642889cc..98f24d782 100644 --- a/content/pages/03-data/05-object-relational-mappers.markdown +++ b/content/pages/03-data/05-object-relational-mappers.markdown @@ -137,7 +137,8 @@ There are numerous ORM implementations written in Python, including 1. [The Django ORM](/django-orm.html) 1. [PonyORM](/pony-orm.html) 1. [SQLObject](http://sqlobject.org/) -1. [Tortoise ORM](https://tortoise-orm.readthedocs.io/en/latest/) +1. [Tortoise ORM](https://tortoise-orm.readthedocs.io/en/latest/) + ([source code](https://github.com/tortoise/tortoise-orm/)) There are other ORMs, such as Canonical's [Storm](https://storm.canonical.com/), but most of them do not appear to diff --git a/content/pages/04-web-development/43-webrtc.markdown b/content/pages/04-web-development/43-webrtc.markdown index 46fe12109..36cf18799 100644 --- a/content/pages/04-web-development/43-webrtc.markdown +++ b/content/pages/04-web-development/43-webrtc.markdown @@ -18,6 +18,14 @@ browser) and server (usually a [web server](/web-servers.html)). explains what you do and do not need to know as prerequisites for building with WebRTC along with some sources for learning. +* This post titled + [WebRTC: a working example](http://pfertyk.me/2020/03/webrtc-a-working-example/) + and the + [companion open source repository](https://github.com/pfertyk/webrtc-working-example) + provides a simple working example of WebRTC technology, without any 3rd party + dependencies. It allows 2 web browsers to exchange audio and video streams by + using the `aiohttp` and `python-socketio` modules. + * [A real world guide to WebRTC](https://deepstreamhub.com/tutorials/protocols/webrtc-intro/) goes through WebRTC fundamentals such as data channels, audio and video, screen sharing and file transfers with the JavaScript code provided From 4f6fdb5c3f85c1c48989cf4d087a785125f88c6d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 20 Mar 2020 15:39:08 -0400 Subject: [PATCH 083/302] new sqlalchemy resource --- content/pages/03-data/06-sqlalchemy.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/pages/03-data/06-sqlalchemy.markdown b/content/pages/03-data/06-sqlalchemy.markdown index af57ed512..0e9a44307 100644 --- a/content/pages/03-data/06-sqlalchemy.markdown +++ b/content/pages/03-data/06-sqlalchemy.markdown @@ -193,6 +193,11 @@ implementations. Several open source projects and articles are listed here to make it a bit easier to understand the differences between these implementations. +* [Introduction to SQLAlchemy ORM for Django Developers](https://apirobot.me/posts/introduction-to-sqlalchemy-orm-for-django-developers) + is written by a developer who typically used the [Django ORM](/django-orm.html) + at work and then had a chance to try SQLAlchemy for one project. He covers + differences in how each one handles transactions, models and queries. + * [SQLAlchemy vs Other ORMs](http://www.pythoncentral.io/sqlalchemy-vs-orms/) provides a detailed comparison of SQLAlchemy against alternatives. From 3f0106bec138ab59ec8ab6aea3351bb3500bf1c0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 21 Mar 2020 06:48:51 -0400 Subject: [PATCH 084/302] new networking article --- content/pages/04-web-development/40-networking.markdown | 4 ++++ content/pages/06-devops/06-web-app-performance.markdown | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/content/pages/04-web-development/40-networking.markdown b/content/pages/04-web-development/40-networking.markdown index 15ab8fce9..5b3a98045 100644 --- a/content/pages/04-web-development/40-networking.markdown +++ b/content/pages/04-web-development/40-networking.markdown @@ -38,3 +38,7 @@ web applications. explains how Dropbox uses edge-of-the-network resources closer to the end user to optimize performance of their service. +* [On the shoulders of giants: recent changes in Internet traffic](https://blog.cloudflare.com/on-the-shoulders-of-giants-recent-changes-in-internet-traffic/) + examines how the COVID-19 pandemic of 2020 changed the times during the + day and locations of how the majority of internet traffic was routed + and consumed. diff --git a/content/pages/06-devops/06-web-app-performance.markdown b/content/pages/06-devops/06-web-app-performance.markdown index 7a3a2c8e6..4d94e4cbd 100644 --- a/content/pages/06-devops/06-web-app-performance.markdown +++ b/content/pages/06-devops/06-web-app-performance.markdown @@ -67,6 +67,10 @@ database queries, page size and many other factors. provides a list with a crazy number of scaling and performance optimization resources and tools by category. +* [Every Web Performance Test Tool](https://www.swyx.io/writing/webperf-tests/) + provides a nice list of tools and provides short summaries of what each + one can help with in identifying performance problems. + * [The Infrastructure Behind Twitter: Scale](https://blog.twitter.com/engineering/en_us/topics/infrastructure/2017/the-infrastructure-behind-twitter-scale.html) examines the evolution from having to buy your own hardware from vendors to run a service to the current days of being able to rely on cloud From b4b40f91ede9eba0cead1d7648af808328ae2e0e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 21 Mar 2020 09:13:52 -0400 Subject: [PATCH 085/302] add javascript resource --- content/pages/04-web-development/23-javascript.markdown | 4 ++++ .../pages/04-web-development/56-web-app-security.markdown | 5 +++++ content/pages/05-deployment/37-kubernetes.markdown | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/content/pages/04-web-development/23-javascript.markdown b/content/pages/04-web-development/23-javascript.markdown index d23bc1692..1a76d2398 100644 --- a/content/pages/04-web-development/23-javascript.markdown +++ b/content/pages/04-web-development/23-javascript.markdown @@ -46,6 +46,10 @@ JavaScript is an implementation of [the ECMAScript specification](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/JavaScript_Overview) which is defined by the [Ecma International Standards Body](http://www.ecma-international.org/default.htm). +Read this paper on +[the first 20 years of JavaScript](https://zenodo.org/record/3710954) +by Brendan Eich, the original creator of the programming language, and +Allen Wirfs-Brock for more context on the language's evolution. ### JavaScript resources diff --git a/content/pages/04-web-development/56-web-app-security.markdown b/content/pages/04-web-development/56-web-app-security.markdown index 7cf2fd0c0..2b1ee70f9 100644 --- a/content/pages/04-web-development/56-web-app-security.markdown +++ b/content/pages/04-web-development/56-web-app-security.markdown @@ -107,6 +107,11 @@ resources can also give you a good overview of how HTTPS works. [cheat sheets for security](https://www.owasp.org/index.php/Cheat_Sheets) topics. +* [Stanford's CS253 class](https://web.stanford.edu/class/cs253/) is available + for free online, including lecture slides, videos and course materials to + learn about web browser internals, session attacks, fingerprinting, HTTPS + and many other fundamental topics. + * [The SaaS CTO Security Checklist](https://cto-security-checklist.sqreen.io/) is an awesome list of steps for securing your infrastructure and employees as well as what stage and size company it is recommended that you put those diff --git a/content/pages/05-deployment/37-kubernetes.markdown b/content/pages/05-deployment/37-kubernetes.markdown index 20f8578f8..f908a7ab1 100644 --- a/content/pages/05-deployment/37-kubernetes.markdown +++ b/content/pages/05-deployment/37-kubernetes.markdown @@ -96,6 +96,10 @@ applications. is a Git README tutorial with clear steps for how to get started running a Kubernetes cluster. +* [Anatomy of my Kubernetes Cluster](https://ttt.io/anatomy-of-my-kubernetes-cluster) + shows how one developer created their own Raspberry Pi cluster that could + run Kubernetes to learn more about how it works. + * [The cult of Kubernetes](https://christine.website/blog/the-cult-of-kubernetes-2019-09-07) is a hilarious rant that also manages to teach the reader a lot about how to avoid some big issues the author ran into while working with Kubernetes for From 6a8168c00172204f87de432ab1f09b3862777d21 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 21 Mar 2020 09:16:53 -0400 Subject: [PATCH 086/302] new django re source --- content/pages/04-web-development/02-django.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index 263a6daef..fcdf78fae 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -151,6 +151,11 @@ the framework. [blog post on pytz and Django](http://tommikaikkonen.github.io/timezones/) is a great start for figuring out what you need to know. +* [A Guide to ASGI in Django 3.0 and its Performance](https://arunrocks.com/a-guide-to-asgi-in-django-30-and-its-performance/) + covers the new Asynchronous Server Gateway Interface (ASGI) that was + introduced in Django 3.0 and explains some of the nuances and gotchas + that you should consider if you decide to use it for your web apps. + * [REST APIs with Django: Build powerful web APIs with Python and Django](https://www.amazon.com/dp/198302998X) by [William S. Vincent](https://wsvincent.com/) is the book for you if you are just moving beyond the basics of Django and looking to get @@ -226,6 +231,7 @@ the framework. address can be used as the primary user identifier instead of a username for authentication. + ## Django Channels Channels are a new mechanism in Django 1.9 provided as a standalone app. They may be incorporated into the core framework in 2.0+. Channels provide From f9de1dad1521b2246b45bbe50a2530f703315640 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 22 Mar 2020 13:19:00 -0400 Subject: [PATCH 087/302] tons of new resources across the site --- content/pages/03-data/06-sqlalchemy.markdown | 4 ++++ .../04-web-development/02-django.markdown | 9 ++++----- .../pages/04-web-development/16-html.markdown | 5 +++++ .../04-web-development/23-javascript.markdown | 8 +++++++- .../48-api-creation.markdown | 5 +++++ .../pages/05-deployment/37-kubernetes.markdown | 18 +++++++++++++++--- 6 files changed, 40 insertions(+), 9 deletions(-) diff --git a/content/pages/03-data/06-sqlalchemy.markdown b/content/pages/03-data/06-sqlalchemy.markdown index 0e9a44307..b97390503 100644 --- a/content/pages/03-data/06-sqlalchemy.markdown +++ b/content/pages/03-data/06-sqlalchemy.markdown @@ -166,6 +166,10 @@ edge cases. gives a wonderful walkthrough of how to build your own online commenting system in Python using SQLAlchemy. +* [Master SQLAlchemy Relationships in a Performance Friendly Way](https://blog.theodo.com/2020/03/sqlalchemy-relationship-performance/) + dives into code that shows how to improve performance when setting and + accessing relationship-based data in your models. + * [SQLAlchemy and data access in Python](https://talkpython.fm/episodes/show/5/sqlalchemy-and-data-access-in-python) is a podcast interview with the creator of SQLAlchemy that covers the project's history and how it has evolved over the past decade. diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index fcdf78fae..927c8d57b 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -141,11 +141,10 @@ the framework. [working with databases](https://dizballanze.com/django-project-optimization-part-2/) and [caching](https://dizballanze.com/django-project-optimization-part-3/). -* This tutorial shows how to create - [a Django web app that can make phone calls and send text messages for automated surveys](https://www.twilio.com/docs/tutorials/walkthrough/automated-survey/python/django). - The code is a really good example of a full Django project and is also - available - [open source on GitHub](https://github.com/TwilioDevEd/automated-survey-django). +* [Mental Models for Class Based Views](https://djangodeconstructed.com/2020/01/03/mental-models-for-class-based-views/) + provides some comparison points between class based views (CBVs) and + function based views and the author's opinions for how you can better + understand CBVs. * Working with time zones is necessary for every web application. This [blog post on pytz and Django](http://tommikaikkonen.github.io/timezones/) is a diff --git a/content/pages/04-web-development/16-html.markdown b/content/pages/04-web-development/16-html.markdown index a1ae84404..6db9c57b0 100644 --- a/content/pages/04-web-development/16-html.markdown +++ b/content/pages/04-web-development/16-html.markdown @@ -46,3 +46,8 @@ and is used to display website and web application content. extensively covers what might be thought of as a simple topic: the `a` and `button` elements in HTML, along with their many attributes and quirks. + +* [HTML: the inaccessible parts](https://daverupert.com/2020/02/html-the-inaccessible-parts/) + explains how even basic HTML elements can cause accessibility issues + for screen readers and other devices that help people with impairments + to use the web. diff --git a/content/pages/04-web-development/23-javascript.markdown b/content/pages/04-web-development/23-javascript.markdown index 1a76d2398..14226cc88 100644 --- a/content/pages/04-web-development/23-javascript.markdown +++ b/content/pages/04-web-development/23-javascript.markdown @@ -90,7 +90,13 @@ Allen Wirfs-Brock for more context on the language's evolution. tools are that you can use and some comparisons when deciding between Angular and React. -* [Developing a Single Page App with Flask and Vue.js](https://testdriven.io/developing-a-single-page-app-with-flask-and-vuejs) step-by-step walkthrough of how to set up a basic CRUD app with Vue and Flask. +* [Developing a Single Page App with Flask and Vue.js](https://testdriven.io/developing-a-single-page-app-with-flask-and-vuejs) + is a step-by-step walkthrough of how to set up a basic CRUD app with + [Vue.js](/vuejs.html) and [Flask](/flask.html). + +* [A Guide to Console Commands](https://css-tricks.com/a-guide-to-console-commands/) + shows off what JavaScript commands you can use in your browser's console, + which is a typical debugging pattern for JavaScript development. * [is-website-vulnerable](https://github.com/lirantal/is-website-vulnerable) is an open source tool that identifies security vulnerabilities based on diff --git a/content/pages/04-web-development/48-api-creation.markdown b/content/pages/04-web-development/48-api-creation.markdown index 9125e39fa..74ab28c92 100644 --- a/content/pages/04-web-development/48-api-creation.markdown +++ b/content/pages/04-web-development/48-api-creation.markdown @@ -149,6 +149,11 @@ equivalent of browser testing in the web application world. is free and contains a wealth of practical advice for what design decisions to make for your web API. +* [Documenting APIs: A guide for technical writers and engineers](https://idratherbewriting.com/learnapidoc/) + is a guide that covers good practices for thinking like a developer who + will use your API, as well as what the documentation for endpoints + and other important pieces should look like. + * [1-to-1 Relationships and Subresources in REST APIs](http://developers.lyst.com/2015/02/20/1-to-1-relationships-and-subresources-in-rest-apis/) tells the story of design decisions that were made during an API's creation and why those choices were made. diff --git a/content/pages/05-deployment/37-kubernetes.markdown b/content/pages/05-deployment/37-kubernetes.markdown index f908a7ab1..3e029b97d 100644 --- a/content/pages/05-deployment/37-kubernetes.markdown +++ b/content/pages/05-deployment/37-kubernetes.markdown @@ -80,6 +80,18 @@ applications. is stuffed full of great design advice that is now available as people having been using Kubernetes for a couple of years. +* ["Let’s use Kubernetes!" Now you have 8 problems](https://pythonspeed.com/articles/dont-need-kubernetes/) + is a counter-argument for why you should be cautious about introducing + the significant complexity overhead of Kubernetes (or any related tools) + into your environment unless you really need the advantages that they can + provide. Each developer, team and organization should perform an explicit + cost-benefit analysis to make sure the tool's scability, reliability + and related functionality will outweigh the downsides. + +* [How Zolando manages 140+ Kubernetes clusters](https://srcco.de/posts/how-zalando-manages-140-kubernetes-clusters.html) + covers the architecture, monitoring and workflow of a team that has + to run a decent number of clusters for their development teams. + ### Kubernetes tutorials * [Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way) @@ -126,6 +138,6 @@ applications. uses Helm to make it easier to deploy the example [Django](/django.html) web app with a [PostgreSQL](/postgresql.html) backend. -* [How Zolando manages 140+ Kubernetes clusters](https://srcco.de/posts/how-zalando-manages-140-kubernetes-clusters.html) - covers the architecture, monitoring and workflow of a team that has - to run a decent number of clusters for their development teams. +* [K8s YAML Alternative: Python](https://www.phillipsj.net/posts/k8s-yaml-alternative-python/) + shows how you can use Python scripts instead of YAML to configure + your Kubernetes clusters. From 82316256577d321332def1e51ddfd4b03f3296d0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 22 Mar 2020 13:35:41 -0400 Subject: [PATCH 088/302] new api resources --- .../pages/04-web-development/51-api-integration.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/pages/04-web-development/51-api-integration.markdown b/content/pages/04-web-development/51-api-integration.markdown index ecf006c20..03ef86448 100644 --- a/content/pages/04-web-development/51-api-integration.markdown +++ b/content/pages/04-web-development/51-api-integration.markdown @@ -43,6 +43,12 @@ across many implementation areas. [18F's API-All-the-X list](http://18f.github.io/API-All-the-X/). The list is updated whenever a new API comes online. +* [The Only Type of API Services I'll Use](https://www.rdegges.com/2020/the-only-type-of-api-services-ill-use/) + explains how alignment between usage and pricing is crucial to a solid, + long-lasting API experience. Other models such as tiered usage and + enterprise upsells typically lead to terrible developer experiences and + should generally be avoided when building applications with APIs. + * John Sheehan's "[Zen and the Art of API Maintenance](https://speakerdeck.com/johnsheehan/zen-and-the-art-of-api-maintenance)" slides are relevant for API integration. From 27a4c94d93d7731bb235ef46ffd9e134d6db955a Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 25 Mar 2020 07:48:40 -0400 Subject: [PATCH 089/302] new pandas resource --- content/pages/03-data/16-pandas.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/pages/03-data/16-pandas.markdown b/content/pages/03-data/16-pandas.markdown index 5f0268fd2..14c4b9ed6 100644 --- a/content/pages/03-data/16-pandas.markdown +++ b/content/pages/03-data/16-pandas.markdown @@ -114,3 +114,7 @@ is a data structures and analysis library. explains that pandas operations can often be parallelized for better performance using the Pandas UDFs feature in PySpark version 2.3 or greater. + +* [How to use Pandas read_html to Scrape Data from HTML Tables](https://www.marsja.se/how-to-use-pandas-read_html-to-scrape-data-from-html-tables/) + has a bunch of great code examples that show how to load + data from HTML directly into your DataFrames. From 34f1667ee437a19333f0898c18f7a0a8b2eece62 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 28 Mar 2020 16:27:22 -0400 Subject: [PATCH 090/302] new tutorial, this one on pandas for covid data exploration --- .../200328-explore-covid-pandas.markdown | 316 ++++++++++++++++++ .../covid-19-data-download.png | Bin 0 -> 312593 bytes static/img/200328-covid-19-pandas/header.png | Bin 0 -> 53079 bytes theme/templates/article-sidebar.html | 1 - ...-basic-commands-explore-covid-19-data.html | 5 + 5 files changed, 321 insertions(+), 1 deletion(-) create mode 100644 content/posts/200328-explore-covid-pandas.markdown create mode 100644 static/img/200328-covid-19-pandas/covid-19-data-download.png create mode 100644 static/img/200328-covid-19-pandas/header.png create mode 100644 theme/templates/blog/learn-pandas-basic-commands-explore-covid-19-data.html diff --git a/content/posts/200328-explore-covid-pandas.markdown b/content/posts/200328-explore-covid-pandas.markdown new file mode 100644 index 000000000..34c93adb9 --- /dev/null +++ b/content/posts/200328-explore-covid-pandas.markdown @@ -0,0 +1,316 @@ +title: Learning pandas by Exploring COVID-19 Data +slug: learn-pandas-basic-commands-explore-covid-19-data +meta: Use the pandas data analysis tool to explore the free COVID-19 data set provided by the European Centre for Disease Prevention and Control. +category: post +date: 2020-03-28 +modified: 2020-03-28 +newsletter: False +headerimage: /img/200328-covid-19-pandas/header.png +headeralt: pandas logo. Copyright the PyData Foundation. + + +The +[European Centre for Disease Prevention and Control](https://www.ecdc.europa.eu/en) +provides +[daily-updated worldwide COVID-19 data](https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide) +that is easy to download in JSON, CSV or XML formats. In this tutorial, +we will use the [pandas](/pandas.html) data analysis tool on the +comma-separated values (CSV) data to learn some of the basic pandas +commands and explore what is contained within the data set. + + +## Configuring our development environment +Make sure you have Python 3 installed. As of right now, +[Python 3.8.2](https://www.python.org/downloads/) is the latest. + +During this tutorial we're also going to use +[pandas](https://pandas.pydata.org/). + +Install it now into a new virtual environment with the following +commands: + +```bash +python -m venv covidpandas +source covidpandas/bin/activate + +pip install pandas +``` + +We're now ready to get the COVID-19 data and start analyzing it with +pandas. + + +## Obtaining the COVID-19 data +Go to the +[download today’s data on the geographic distribution of COVID-19 cases worldwide](https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide) +page in your web browser. It should look something like the following +screenshot. + +Download the CSV version of the COVID-19 data. + +There should be a link to download the +data in CSV format, but the organization has changed the page layout +several times in the past few weeks, which makes it difficult to find +formats other than Excel (XLSX). If you have trouble obtaining the +CSV version, just download +[this one from GitHub](https://raw.githubusercontent.com/fullstackpython/blog-code-examples/master/pandas-covid-19/covid-19-cases-march-28-2020.csv) +which is pegged to a copy downloaded on March 28th, 2020. + + + +## Importing the CSV into pandas +We have the data in a CSV now we need to import it into a pandas +DataFrame. + +Start by running the Python REPL: + +```bash +python + +>>> +``` + +The REPL is ready to go, now we need to import pandas so we can read +the data we downloaded. + +```python +from pandas import read_csv + +df = read_csv("covid-19-cases-march-28-2020.csv") +``` + +Don't worry if you get an error like +`UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7...`. +Run this command instead which explicitly sets the file encoding +so pandas can properly read the CSV. + +```python +# make sure the file name of the csv matches your file's name! +df = read_csv("covid-19-cases-march-28-2020.csv", encoding="ISO-8859-1") +``` + +We now have our data loaded into a +[pandas DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html) +and can start running code to poke and prod and what's inside the +data set. + + +## Running pandas commands +Let's first take a peek at what a sample of the data looks like. I +typically run the `head` and `tail` functions when I open something +up to find out what are contained in the first five and last five rows. + +```python +df.head() +``` + +You should see six lines of output: one as the columns header and the +first five rows of data from the CSV: + +``` + dateRep day month year cases deaths countriesAndTerritories geoId countryterritoryCode popData2018 +0 28/03/2020 28 3 2020 16 1 Afghanistan AF AFG 37172386.0 +1 27/03/2020 27 3 2020 0 0 Afghanistan AF AFG 37172386.0 +2 26/03/2020 26 3 2020 33 0 Afghanistan AF AFG 37172386.0 +3 25/03/2020 25 3 2020 2 0 Afghanistan AF AFG 37172386.0 +4 24/03/2020 24 3 2020 6 1 Afghanistan AF AFG 37172386.0 +``` + +The `tail` function looks at the last five rows in a DataFrame. + +``` +df.tail() +``` + +`tail` output will look something like this: + +``` + dateRep day month year cases deaths countriesAndTerritories geoId countryterritoryCode popData2018 +7315 25/03/2020 25 3 2020 0 0 Zimbabwe ZW ZWE 14439018.0 +7316 24/03/2020 24 3 2020 0 1 Zimbabwe ZW ZWE 14439018.0 +7317 23/03/2020 23 3 2020 0 0 Zimbabwe ZW ZWE 14439018.0 +7318 22/03/2020 22 3 2020 1 0 Zimbabwe ZW ZWE 14439018.0 +7319 21/03/2020 21 3 2020 1 0 Zimbabwe ZW ZWE 14439018.0 +``` + +Note that you can also pass an integer into `head` or `tail` like +`df.head(10)` to get the first or last **n** number of rows. + +It looks like based on the `tail` function we have around 7320 rows of +data (since the first row is 0 indexed). We can confirm how much +data is in each column with the `count` function. + +``` +df.count() +``` + +`count`'s output will look like: + +``` +dateRep 7320 +day 7320 +month 7320 +year 7320 +cases 7320 +deaths 7320 +countriesAndTerritories 7320 +geoId 7306 +countryterritoryCode 7254 +popData2018 7311 +dtype: int64 +``` + +What if we want to look at one of those columns and find, for example, +the highest value of cases? + +``` +df.cases.max() +``` + +In this data set we get 18695 as the output. What about looking at +standard statistical measures across all columns? That's where the +`describe` function comes in handy. + +``` +df.describe() +``` + +`describe` presents standard statistical measures such as min, max, +median and mean for everything in your data set. In this case we +receive as output: + +``` + day month year cases deaths popData2018 +count 7320.000000 7320.000000 7320.000000 7320.000000 7320.000000 7.311000e+03 +mean 16.828142 2.249454 2019.990847 80.870355 3.687158 7.130483e+07 +std 8.322981 1.256463 0.095239 608.270244 35.327689 2.140624e+08 +min 1.000000 1.000000 2019.000000 -9.000000 0.000000 1.000000e+03 +25% 10.000000 1.000000 2020.000000 0.000000 0.000000 4.137309e+06 +50% 18.000000 2.000000 2020.000000 0.000000 0.000000 1.072767e+07 +75% 24.000000 3.000000 2020.000000 5.000000 0.000000 5.139301e+07 +max 31.000000 12.000000 2020.000000 18695.000000 971.000000 1.392730e+09 +``` + +How about a quick view into whether or not columns' data are correlated +with each other? The `corr` function is what we need. + +``` +df.corr() +``` + +For our data set, `corr` outputs: + +``` + day month year cases deaths popData2018 +day 1.000000 0.203006 -0.163665 0.063629 0.060075 -0.040677 +month 0.203006 1.000000 -0.745912 0.062494 0.052707 -0.039131 +year -0.163665 -0.745912 1.000000 0.012715 0.010032 -0.006294 +cases 0.063629 0.062494 0.012715 1.000000 0.716968 0.136580 +deaths 0.060075 0.052707 0.010032 0.716968 1.000000 0.082229 +popData2018 -0.040677 -0.039131 -0.006294 0.136580 0.082229 1.000000 +``` + +Not surprisingly, we see 1.000000 correlation between a column and itself. +We'd have to worry if we didn't see that result! For other columns it may +not make sense to look at their correlation. This is where you need to +think about the data. There is often correlation between completely unrelated +columns just because the data is structured a certain way. + +If you are a developer like me without a rigorous background in statistics +(Stats 200 in college was a **long** time ago), you may need to brush up +on your stats knowledge before you are able to say whether something in the +data matters or not. + +Let's keep going exploring the data. We can select columns and determine how +many unique items are held within it. For example, how many unique countries +and territories are listed? + +``` +df.countriesAndTerritories.nunique() +``` + +In this case the result should be 196. + + +## Asking questions of the data +Those functions are fine for basic querying to learn what's in the +data set, but how do we ask real questions by stringing together some +commands? + +We now know there are 7320 rows in this set since we used the `count` +function above. Each row represents a single day within a country. Now +to ask a question. How many days across these countries were there 10 +or more cases reported? + +Let's create a new dataframe named df2 with the rows that only have +10 or more cases reported on that day, then count the number of rows +within it. + +``` +df2 = df[df['cases']>=10] +df2.count() +``` + +That should give us the value 1531. There have been 1531 instances +of 10 or more COVID-19 cases reported on a single day, across the +196 countries or terrorities listed. But the 1531 is hard to explain +to people. We should pick out a single country and show how many times +10 or more cases were reported on one day. How about a smaller +country like Vietnam that is not being reported on as much as China, +the United States or Italy? + +``` +df2[df2['countriesAndTerritories']=='Vietnam'] +``` + +This will give us the full output of data by column: + +``` + dateRep day month year cases deaths countriesAndTerritories geoId countryterritoryCode popData2018 +7217 28/03/2020 28 3 2020 16 0 Vietnam VN VNM 95540395.0 +7219 26/03/2020 26 3 2020 14 0 Vietnam VN VNM 95540395.0 +7220 25/03/2020 25 3 2020 11 0 Vietnam VN VNM 95540395.0 +7222 23/03/2020 23 3 2020 24 0 Vietnam VN VNM 95540395.0 +7226 19/03/2020 19 3 2020 15 0 Vietnam VN VNM 95540395.0 +``` + +We can also use the `count` function here to confirm there have been +five days in which 10 or more new cases have been reported in Vietnam +so far: + +``` +df2[df2['countriesAndTerritories']=='Vietnam'].count() +``` + +We get the output of 5 for the columns. Unfortunately, when you look at +the full data it appears these rows are all very recent and the virus +is just beginning to spread more widely there. Let's hope they along +with every other country is able to turn the tide, flatten the curve +and keep more people from getting sick as we continue onwards. + +That's a good spot to leave off, but we covered a lot of pandas ground +in this tutorial! + + +## What's next? +We just imported and took a look at what's in the European Centre +for Disease Prevention and Control's COVID-19 data set using +[pandas](/pandas.html). That was a quick tour of some basic pandas +commands and I strongly recommend you peruse the +[DataFrame documentation list](https://pandas.pydata.org/pandas-docs/stable/reference/frame.html) +to learn about all of the other handy functions that this tool +provides to developers. + +You can also get an idea of what to code next in your Python project by +reading the +[Full Stack Python table of contents page](/table-of-contents.html). + +Questions? Contact me via Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). I'm also on GitHub with +the username [mattmakai](https://github.com/mattmakai). + +Something wrong with this post? Fork +[this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200328-explore-covid-pandas.markdown) +and submit a pull request. + diff --git a/static/img/200328-covid-19-pandas/covid-19-data-download.png b/static/img/200328-covid-19-pandas/covid-19-data-download.png new file mode 100644 index 0000000000000000000000000000000000000000..1968ae1534de6066bc0bc0b58688522b27395c2f GIT binary patch literal 312593 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�dW4Lrt({ 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�Q&*#ocD*$NYnw&@;AkxH}~r|M(8 z^duSExYERj`gpNdqKkXyc~e0L^9jFgH`i`%qF?#Fw<2L}QJ?fi4@w0Rl#RiKO@1)! zv9qDcqI=Cr_Vc;9Y4~G`@m;GxwZ{zM@DBgkBSG0#f!bAZ3Kzrd$_q9ZCk;5Ix5>NX zye)Kud^^*xGu1o&Y)acuJ+C2dh#Je>p%78o9%o(PG5)2DHkP;3G1n}=@+@vMc*HOWMr}Apg0Yr9@y7+lDnXbY?^{kt~BoH+keZ36JLN~ z%5&t^CLP1^AP%Oxce$kD8FC=-v&!<%0| zc7|I=d({g|=}Z22W$e3}h`hUf?{x>{tjcR#f88P%>_=@v z7i!@RPAY|+Wv4u)s9#0{my&N#j!pP+hmXsqBY7wSGxg=%z&L}ac#Kc!P*0h>d?30T!2-6e@%pRt?)z2+^|O)$nCh6AxboA~5dPL$ZB0kqS- zH{|;4h@d6b>3y_2=g9H0R9c}V#a8#u;%Kt;Q4O4!36d38$L(FA3m7FVy;g~0K(HK( z-wqmxUr@)R#$f!@qUYD9gJo|@-)LDutTj5*LtfY+a->$Lcs`nx>Y zb-CCEls%iUu%BD!+udy~sy+Q%qD~%5{9Rl(evF_(uD@{7La>{gbx*s5^8|`gTjq)T zq?ldPq!ajjMlZ9`bZ!Qm5#$~Q+>|91CZ&;`(+u=ZGLBC8Fjib1)2l}2&bt=(L4sd% zq*g;cyp`%cryY7u2^Ik+9Z?*5Y0TW~fcwoqj3vaF4{H(bF&vh z=JVvE)LaBZ^WrX{x9E`GHeiKFlR^I4@WtTG^i0f=Z0UP;&_s95T^@2&*}izvC(BI+ zi)vJWMJ=Vy5tH7jDogT1P?NQ`ufiY_ZwDUni2~a~*s&f>@-4x^S)k%&dnyEh*7X36 z=23Gc*cgca$)xaK+fSvw_}>D>_qQ*wP1uW5W^gaUU0W3Qn&<~Kj{jQw7bzC`AAF^D zfC8@F_y$a3xu#)tu8t8`yEc2?raiMKY)vP)`(LR_HpPvH)2YtYbD|S? zL^z@&JfGZlC@K<7F8Xx2`70z630}<_2Ys@Hon`c|Y)H+Cxix0HhgZrS^3Ggm2eJu`FWHLw9EXptZTEV3u}0qBd> zMcL(L$JqNIRXn^~g0x$DkVcLY*2TzOg}&HfA1^GGIu3Cjt#G&$Mw#}s%gykKfxsbW zujN>LBCpLTo zbtOHZPbqbE)g6Qb|hus*i8 zF~k1?>4D;j4n6pPlQGL)8)Firhw~o|CKm2B72rjlrT@z4xqO73F4urxZK{e3wnSyX zO3RPJr;3UPZE&?ZW&v<_?uG9{dXwb+Ojw7T(O@`Of4RzW^Z}uLk1sG)hJP2dD?84b zzNEoI{nox(-N9yRXK3m*ZVcN)7U;d()PZ^C7_W`=l|#SdkGO5!V90*PgTztu>9-}xO5rRV;29Y>6Mkb=~D7{>*Jn=>gnX&6g)=ChrG2= z3WVi{(7=6@9Ty@k+f5emsL36#sLLf$_4ZQmidb?@f&(pBb#Ur>otQm1Q!lm=1d<)D z<`8ZV=G20IRMlNZerx(nUB<@?*bmC@HGJ{W*F{)UvS5oyxt>;^4bySZ8}ngeBiS;V zC)weJF~?bomZry`FIFS<8_f1_*gn;iv+p53XAnwy1^l@9L}GrjQ$QhbgF@RnF#STu z3BP%J01rT+RvIK8?^y}bm}J*gW9#U3@G*dQeIE!K#pmlPO<#c)ST3G@b0u0R*V)VX z{NBbMmBFp2&oz%0)iHaIA&57_R~dH^36iUWp_Ik`K%Qi~l+ik$ts8g;pXK|O`0Tk4 z`Gsv%p{-*O?Z&lLF>uTA0PZzt9fgpdNL5|uYe!<0yGCZWMAhDbv0~G5(TbfRrtiZS zyhl#x(!Q6*fR9(~*oU4P1i7jK|xnSFQg+kW5@G^bsifPK$wL#a9 zU{v5AY*OSN!%($r-eGv3d_+am*A=NrbNJI+gNkETf6vBr0;5itVAO6Wi&w@N)9=2r zC*BLwsAva}053FDh;i$fur{6RoWBMom$ICj?|wrA z;x7ub<^P&}ca`zML($R_9kyoUcZ6veDzmX|u_ey8!ivtKA!s;47Z*Y{}}bj ziw_iE`mw`kuf$5#`M6~1I)IUT1ixvYnjD8-^!aGQN8Ym#=TAz}iqd!OW!Hs8lS=sY?R(GH)1noJSA;777Atc|k*doT zEJ^Ohokg3)2}sdKN>oF8ieKX4Zbo6GsY)A<`Y}kSi1B5{hSsq}wnaj;cdEEmL*n5B zBKjr$nd4Df8ceCX@K1dRVj*!3Ereh9sd!}g?O+OIVQ-;<)vc_kklv(zHGTfBRvXqH zeSY<)=)vn=Y1G_5w*kV(*XLz^WdIE=8VvQCk-b+U9cSJ9-Sd?S=u0nS#_dkM%G#c@ zxs`BlkbW-sad$p;#p>?{0-B>%(k${s_r29GdF7f_T;J((Y~Ic#Bm4-@6i>e(F$ z;#L_oIZY~D7-$GoSNV?sn|B4+(CdI}g)i;!_d-du@b!YyjkJoMS13R-0~IxI(qj7B z(>WmFQru1b*c*{-*Anz!i2oxYQCh$C$l{=~zMdw-^F-y5zTJ5Nd0yg?n|a8h@a?Me<4Z|DOnH~gvfim-+!74=^qGl2!EVel^Rn-OHlLe-_5AoXaj1`VUtMisBstElSM?}m_D^#bqxnKByE~&ZEMbXJo#h)%VB#T^dfnK0TzjA) z&iCmec3t@NW9f3o7&EIgNxk_oo%uzkWBT~Hd&1rHr(geB7`k)Yqe8$LRV6t#=Or6Z zs&)Ynp|TJ4W{l+Yap(;#)ANkz1J>^X*Nt(lj42KGwGyRMtsmZDa#!mX0XTND+N639 zT)o~o=4%vhUN!f)lM}OeJ@p^41Ny)Okj7)Nq2C4FPuM@PZ!EE=Y7}XrXg4y|MNLyl zsFbe0&-zr#gIkcCV0rhQ(|+O=VlF~LW+YjYzEG38T7_q<4FRkqR+-n^6-saV1zrGb z!@)<%@@ti*1;#HbtvKVa+x!Soim-P8Zn$AOr=?gMhKr~C!p9ja&Q^Njog%M!vXn9X z7R?ovtvFYg_S&F=uA%%!gkPC^#5g$d9=2OLWmrrzxWFxY0e4kW#bN5hpP$E%ci(&1 z4C1pvrnlZln8|xH`4W}lLM{Yd2;vFO&8$ht?zXXSt4-QvDV~tUCv?acgJ$yQ8IxBpSmQZ9Nbtuc zeT_GSy?M)dw<6;bi%V6;+YQBvl#~}gl2?^%3Ehv*Q5KV*DYAU;Hnx57AiPdJ-dBuX zW-(3@{Q+PCvH6xLB`~WoV_Fj8pRwGX7TEOORi`)D{{3}sS%MQ!jQqB>p&NG=z#=uE zh0kBuPw@rsIkS|jZKGjctZZ#PE^m5?TDF0AdqOe}pRftS%amgrlW>wb15T>lCW>8z zmf${S--!rOE$ha)9@QU#QwBFJ;y6`Y5=YC8iib!k)@|(M(-}|>;kgv_kJ!1>BqPqz zsj}r-*BMK}jJ{v!4nmHtf~d!XkItY+3 z{2Q0I67ehJr%ZIUt7uL}9^lD%-kYhUBa0kB#9W>&$;n>DZzcM1CWQQiX*-tTlqn2= z^Zdm~MiuvH0Xq7zz0s z`s#YVUr-6JLDQiJBLc0lbt9ScGP=P#%!2Xv2Lm7xj}=?B>^`1c@Lx$Tye8)prM)M} z66SZ8qCKCrSM%=6zMlfG1#}EHq&4y@;y^*)!VY#p?lycWx|-AIVka zP?0RR>H%~rO9ZlB+G{spmR_3M>h`_oF%44Lc<*t(B4B%wo3rBB*ko*cBkodQ8sFSo z+)b;SoMu9Fyn~~>-5fk;S2;MYyob*`dR}el$8gg3x42g&rl9F(_;&mPQS!J=z&dzK zdgXFz#Cu#DUE`lp)f0DY%vFP-knruUI-;LQ5sM&QYEObK+F!I>mn&)s{tpk~MDCL7 zg_1JRW%If7?m+850;kh>zKjjmk1xpu*Q1_4?b=M6pxc-^REc*s|AP7AcCATCpB4}* zk(Pk|0L*6(BM4dWU-tARhm@xZA5;}TNs$cD(HGZSRnrZ*>3?J?9hX(K@e9;F@yyzr ze6j%1_rpqA{7#NnRpNrZi*2Zo2cI(TEIY5r{gQ1-C9NZ8A0WK($(#ur#J=s^)YW?J zkBACNK-j}40{Kp?pOiie@3^>MV(v{Ak{XJ@TpW9gQr@I@;rDNg^6SfOiD_q{4_t2L zoC`Lyl}&0xRb7}Cm$>B0`1#rVg`fe|meVFmme{x0+yB>afX8ngqgs`&OsWQD5(3*2 zd{MmY5F5?h(yglvO0Fbt?~N}4&facrw_c>)qgbEzlb|}h{6ZHHCI0DiQRMP7Gkee# zyiI~mYH2|P8&zgCVqxx}cK;ka{mjcwbk{y?yX5Xb=X;Wg89%vSvQeoS*i1qC-V)2* z@Fji60154UUQKyQnKy4~d*daMQoTy_qZY9%KDR8Au={-YG_LB>iZp|;F4aqEOU+$DVIpbcY)PxN&Tv z5YJO28}r(ZQSl|sk zcDR80y0tMUwJ5kFG_{Q4Nu*0sr|%Rd;shrwYd z_wHT(zeb|FHhIe$2mUerjFoc#GHx>BNlMT1Enn@W(2Bx%R5P9D7?&z5u<$M^ZIj~j z9ud;j%p9adIP7GrehCC=t9*X^xdqI4?xDd~iDSh0?`O{578krv%(uq3ceV%ntlLaz zFZ{Q)*xilg2$p5}b8l*a?cCL0yCP?<;uri?eH&{##YwJz>#bwCSuWtN@Rv9#GyHqx zP#<2nLF-$-a{Tmm!)2Uys+7cqy#}U)k4gXERR4Fy18r9A-ivg1oD zb4Xq%lm{RlF7Qj_pKYCLtY!GqmoNVvS#Q-(g=gcf@$-#y*K{u5|KDztsCP?pW}ezW z1F+QOGnmhY(l=lK5~h~sM{>-jb*!JU$lyaNS98YKjS*OL(|RYw`~S| zTk5$$ni$XWUvaZD0T-^CdiEPe!774!LJ1TY{a3>>dmPn=@7^la@!F(X2AJsTckK*a z;q-F&Uo7!&gWdlZIjmWm)o=e53+P*H3HkJFdb)B;dMa{o3K93LGv^Yjd93z3?38%#OlL$4q%TKS(I9$ZPv?ZV26XfI4AFgaLl7{vPkths z+hFc}9a=kq=^_@L4sn--I=RB%5*|=u$90D9@dQRnr_Cj8+TrT0=2FvLn<@5_SNJqX zQ0PL_v*bPHbUqE;jZ|}{WF4y-g{G^+-PR!SnzU-18u7z}3LheK36_ zZoccMKRbTJysLsAVr6WogS!9?g)w2ry=-BFyWp2|- zD{=O4Oi|b0G)6Rk=-Ax3*^anb(B!I=%M_Ho|Jc8HG+Y5j4K(l0P=vc^5VQhzXKM?Y zj=u=VJq}(x*}zCjg^X{w|4_SS6RRYuwPIfR;k6-%uZ)TMvrhjIh%jG_CYX6w8Ed%G zS(>J?X6CU#oS$2Mb8+0lU=)>pB9_TBHfBdW<%NY^YikCNSgdhtpA)lbJA(QJ_u0ad zXz6d;|HXIzJ{1|xJ4ys>SSiRL`jVvhS+&J~>!#kQ^W5d8c}4!}S^AFabSw^g>7O)m z!9@qM6^%w_(tNTaScUCaE)c};;Gbo%tTlDHp#*|?_cZufG7)_7J(e)?c(0IIO$le{ zO!Lejf2{vrW3>)Q6I+qhhwAHV_zk)s7VfCGwd!{ZDl42#V;X-;wMX@c0Ec!8M!JfX1U0F3zKE6;-*5&)^v`uQR<1kn{fxLj*ox}2ps{L_x4-&xSWHI$87 z&(ZV_@?7l8hS1(xA|LLVNZKTPEw@%vINxCPJ~h9}EC;hzabMaU+rz`Jn{tg-?;ooF zDzIoQ)Bi89Nb^JlS_o9wxea0o_E1|GUKr!_*;4^34 zNExznAG@=AL;_XB`Nl-Di!twG2N>mTZ?>(+a(1(zu+oiC-I@3AZoY0*(o-7TFN8;~ z#7noIkpIjND=$lK?KH52YroUvdmLQXaL~4I)j?Rz3JAU84fGYzOBa>K4rFj8iI{%~ zY(0ae(__(J)`2Ir)iyofhKltNL%BYC`gPi=`hWDT;u*z|`)*9ipAr7@v%%pf``GY~ zW-=Qg4lTAxW2HVSQgo;=v5l!^7Z8ssOjZo5je=F-kkc+_w}@;H~#Nb`M4y#rUW zkRi3JHpC3MLCcX-m~J4dOFpb9r>)pD8BmA_mX%h5qo?}#;rlxdU-mt@8QQNeA4y>z zJ~;)tt)D-I7Nfw7s+R!FiHCFOQ+c^4Zi%~|8wXDW4I3bWMV1Y)I3KzI>#|)X1>j8$ zp3ChojFyj2lofl9*}DctiRE@=qt!@ z>dnq*PGMgJyZbX3dt4E{uy`=swfUs;{lV#Wxp?4dh5nBgm#kx6f1Ao2qpq#i%IX~J z6*s(N?+;Pje4`_K&st_ytj$>TaQDCBC2cdVO;)H!izof@dXtcV<-*;Us7Hm1G(@Z+OPU5_acuxaxo#&hPzMNKKk36+il6r^S{uKfdqOIr? zTB@2eC3f-2bI`iH^N}BImDh#e=^4rH3)eWmisKU(B9I1U<4YimO}SVo=@zdtSVJt{ z-Q!OHJQAHoBBfkrLEYo{^*cA`AtdyY##K>Y+sp0i26+Ls;_LZhs;v#aP9qv8G(TO9 zq8@g@ybP|T_{WG_wi$|%c?A=Geb9Gl-AjdEQ}0a->8`bTFMsd?fGksxq+w*?o5U9D zb~{GI_KuPEZH#oDPte?z5T);v(LmXMOV7rwGOq?{AHLTsX4g;wEw!xpST2b>O^PFf zo=F76hFNku5>k|efdtb$GZW51zwm|!t`q&KOSF=+#HIJT-2fEsI`SOcvrE8|(h&Pi zUxS|N3dwWYG`;O3%GqQXmS0@cc6DZvw~J$bQ3}w|UD6DPv_e!&+xQ%wVQdw4E!Ylb zjq9JPch0tTyQyb(M{e6!fzhIL*-P~5Tw$*!bpn`934I@(;(xW#6r)~^Yw{A-A_=i# z)tlW9&gIhcB!?dlpR~?AnvWT~4n2-TpWIQt(_C_F*S%Qc8cHxkla?8rlw#rR^eY~m zp5KQSv7TS6Uo&l#)x`AOJN~Zyd*g+yo~pd>J5sG#3%$dT1KzzxFEbz_m_EN8k_)EX z!*Hq_F4uN`TqA~wx~ub0JjleQTKi0yy3VxI#x336SugZuMX^Yk9|Pjh%rU~Txb^9Q zw4o5br0Ht0fGvc)nBnohX1leoTu+(PrFKJoT=`p1zG$;j0H3uT$o!Wq;Tc;)K+FMS zF{2kBZQ&>cD0;p>-jVJ3b2{a+X|#T`_tz{0Saztr1zJ8)+u__W+1zuk0*P*h#DG_k z>?h)HEkEwoE@9wxX+^h1e+o4IKK#ubRtxcJlD|POMxr_1_TtXQ0K7`fb82RGiQ2kk!63MWw9hban-=W14Q?5Ew%ee8N9cdq%k!? z7dzj3UJIMQMBKdP-5r8vGAHdHOO8u5|nR zD&Fo-6;5lqY@_A5zRCC{FfBxxzV+|ONe;_exGHh-b5Iv4v2+r|9!sN1+pM2jVfDqM zWgX1zzGS7H^-Grkd&$Pu|0|!J& zxY8HeZ@jbcK6~}oX5K;DCiySu4EXUA{%lkaJk=gRB?C&HEga)9PAXmHW{276uV-0c^()Qevpg$cEsw5ubOwIk_#Vx?9F3XaE(k3*<1Ol))HLx zVf@26J#Kyo#8kwrMxR$vE%Xd(XV&ug`44XXGwZG>HkbM-;>xpl6;5A|#H4BC?SWC=jV}TvD;e}d z@{*_TezaVUq2~!Gcx|5Y<%W7UGD=2N%n5&)#9Lr{wN3F#Lu<>bW9c;YOd48&&PFmz z1!N&#t|GJ#?Lr=WU|dQ5bk06x-0D{TnRhWC%>i z`QED=I|jOnI)Qm1cuiB(tNIt!fvZbjW{YmhSl_F!;51DhqR$HFPKuSi-SCMEvV33Z zIk6o=BWmia1in9F_^FfjQf%61`hb)0AgYA(fvR?+Dzk)q5bV6tv@^;lTt)UmUXpRPx*TQ5qZfhJF?5Yy*bC?=GIMJB{J8n9V+vF;H{-+ zFra9#1o$d$;h9WJv|kjL;-F{32HQ9b=IvP3u%yol8=w~n0NOktsiDUR_pf>lgHWs`(b=Rvz~!}@HxMDg=_D*lzw(G=G*oq{SB0H z(i`EE?Pj>-LU?!lTDGF<2^D#knR9f7hCL-tiOhNSf$x5H23d}a9ljv9y2jbC1ggM< z9?S((QqKBjnLN4Odm@ucH^UnsdAE5?)p;ogdan&B{+Jmd zM*-h_aGxE9HM}o31UyC!jP(6s*z|`ujf4lJ-vL~L8q(?8@BYGI84OmKo7PZ>Tmm|! zp=JN(IA?7Z;;s>HyDowcqHC~_@{_b)bcIzoC4Ad+JP#`X!%*=z%E45PYK1fF^W9jXkWdsOIi0t)!K|57|T&m3A2uRKl%a7Q{i1w8%p0R4DN)>^Oj5Z+wq*$#3U>!qKja~Zcty$koR@Tas2~avHF-N=VgEN{6hdJdSCFYg^8##F_x=O=?XUrtY z%IA)GFw>^CW8=CHUYk8M`|_G{Q$+lS;bn*-5ag%*p*JekyXe{b52WlKZ%Xf$YxcyK zuEDvw886xeZ3pt6tZERSi|Sr3w=WiZIRwi0a*U+<5)#IuEZ3$_to4*qPaO`{U+qj+ z8i?r0-SJxLV4oo$DSGLOSe8#fOso8KKHv$7dF3d1f!ENzMuUBJa?18>V`u+POAB(@0gdlU`hw<%6YW|Zv)-9->x$nRu@4yfF zhThv_IgXock)pbf6t+te_}jeqrr0f{K@G|_f3(K)3>5DN!#lvV%HljrsCjH1w&`rA zju1pY9k+GTEFuHyseieugV@*l>oQlDcV)HLgcJA5z}cTziT?fkrtpW8Kd6eSasvbV z0bN$Hm+iaezQl3w21+NF0b|lbojHFhoi~%k&>}r>kr;4`etK&aZBbp*84bTie&-FH zW0K8Y%yoprcTQ)3&T-&xvV8xDc${0x@jG~VAC)0I1`|-{)5JB;&sI9 zDepUNVloj^C!F?~sUtSigK(wIKV#aJbH$O#*%XgH5$|G`x!|42N)13fu|wGKdw~9) z{D)x2qQ=2xfYRcpu~LWAy~c&%_vzlJoNPX?>joSa?kof%K6p(#dp0GL*}m9DFXgsY*KV(pBxieX_V>uJYl6tEFPGL2k_OPgorNNiIV9pqq~k zMyoUb{hcN?i(TB_5X1}%WNNa`7e3y+Ogsr@{+oJB(dy@Pc5;qLg(*~#*Ka*5@BdNt z)?rPD@B6n10!mCox}}sF-3$>WBqpMylyphMMv9b5cb9;4H;k4XFuJ=NHb#wl_WAvu z&-eL0$NP^R$Nt&&-o1O*eO>4II+1G>-bJ54AFS!}e^V^Ue17TI`l*?efkzFVz?p0I ztp4%8s4Rx|5hi$;E z#w(sH+4;(QtuUYW?nXEr`+>~kFV^7YI;kz_y<+!rKfGD?UCwV~7b(&-vQMr%(kCEn9oA+3*b^dmP7;;BkyC)to)9;7kDs87S3^XX-x4tCcuqggS83g4)wCF{x-JWWE9VboTokYV#<~vc=1Y#n zK&ZawH-4{V{A%{*&^tM59P|WeS$ovCkc)6epXdguBiQ&QN)!VFFHd|gXN9()QE=X& zfEf8iiHM1GSl$Ez*u3^$$`9+^|48(yUWKn^u*^rAc@bXTVqxx;D&jEuB1o0|Lic#7 zXdCva`^lyz0Cb~Nq^~#az0@4JOFQ?&HH@gd75O(kKr$ z{j=S8-n6f24v(u8?_qQ0vEMi4x(&a3tKazTJKqI0_vpolxpWfCV%Sk0W8xRe$&0H* z!zvUtr!sa6Fp$b{JD)9VB%=H~62BmOT2g%g(N7gE1cR;@hJnpDPhz>(LP+Tnf<$gK z>LOR!Ln-RfUWu>LX?Yiawz2{2jS4@$+rOAdzLV4UYI|EAu9;4g8WK*OoYL%=9S+{r%lFFz)7X86vHiP=u^*rqk=3aT2kl$sxi=rMqH%&b>aEgwT9jv6cqxptkZyOF)~ z5KO?{+XZd;R^?l1^WW+9$Cv&lSP2ieQC$fGSbEp2nC`M2U@DcA?Q-0-ZK%?v^XBFj zAY(QiR-WFZaOgMWHk}8H{G-|N?KX+L7P|dyF-+8LErfW;pyH+5;n_5uOb?pF+Gn^y z%3<{nPveQe_KWcFWhKfHhn?TI!dl;@OxFra)rBPa@~I4*m8X($&rkgJ3iIcxjnDQb zHT&j%3YhW$l7>}f!HX{Uw^Lg(W2RgPIb*lU$?2pFS}~`Xa1G83*N?v~<*>W+^3q-a z{RgpQSwHuUE4Lts%Kw?PM7(7|eeg~?#;%kxohhkd9j>5XGy(Iq$HodO1F+Spft=Dc4n@+Cf?96rVU#P`d+@xa8EsCt^;GR5Ryg0aFs3pheo{Ptv(eN|FcTQRiIi5E8 zJ)>FUXCCdzz1ARylx^aqb`rKK#hMZCH`cBtxPSctmgLx;7$@&V)LqIBg6D3q;4J2kzUC=JH6MN~g zGtnO=`;B@3(u8XL(Ykanc zx&VQH5=P%#bBH&3NEmAXn&v1Tecp9{Vm#`$4kCKbekB4D2)-;v>NZ2tq=bbuts};T z7=X3~0_1yvg70fV+h0QcbQ{#hRFV+aZ<9=NJD&aveTXu>dF{*3KlRy&?YI{U_3Y#) zG{C&v{%XzuwyNQqYTU70wBm!ltUfP_A=>QiSGVJi)^gv;Ouob*<~I8Dp2 z*e|T(-{?KJTh6Bo11j$TQHBV? z!7RYWs+B8r_HAPyP&!M#1O2LHWF?5)Z5L?`4#g#MHSWSE(cI4P$ml1Njyf*1%oGXh z>k{b^!DfuA>iBnT3jX=}i9martd9aSV8l4Wxw}t&{e)^^$jk&=flX~uYquvi889!p zyUy{yXUZSM7ILpdO!g)w+G|WM!t3X0IsPG^0a*74Vm!(Om?J;6NGLKwbo(Umcl`y6 z)RQHI_8&d+c^a^@cu^$7sa}(4pWpv9)PxRtes1b5r$8EuOgrzXSX9IJcI9mt1;rsp zSR?hkkZP!M7XP_Dwi4St1;TIq0w7sf=;)N#4uwrH7G5?mxg-oo?}dJUfda z%h8_X`kZ_GKKUTKjnNk^AoROT=el{AKm7Y-Hv4*g0)0J4So2YtqgJ#`1XY-3X)~idOm!|B_8<$>2?=D7K8AkxQ zCU$a}u@Qnx?=Q}n6e5ImIZ3J`Q7#W(;_sy?GYPp5EF z7FYGt$fHg32UqQcS8@pre`O;+NN-aIL_>$6>L=SzFY_}S%dU6E!KLZZMvlfMijgnC z8|E+qSv1bHX&$S(MeinorAOZYh zC#)jlgo^pQfcPxO8$I6t)jhxGz(a?bc-2)skBI^r-L;Et*(Y-=J{o(f6C-WXiEzKu zMS$gxfvqD|SKaPI&!*Q?L;$zfXXA!}XPqV?Oq9bmK4rY~wRo6bl-z)INy`EL`7zVC z(Ytmc%A38>bEiK$FSsIITHg%E7`>_9;(g=9n{KY04|A!leV6HY_lPR^v^H}!s=RFq zb=P8liZ4OUH%Fhg}Ly zCemrp^Vw|G!kD>C38RMf;pUp@O$m1+!>QF7iy=FSSDR!r`eX9}hm4Tdrpo-QD@|?z z(vtEm@_<^~gxrCh*jn^QB5nKY2>E?6!uVPSylc*9r1l?V4@x6(s?1^^MA`*8{zuCl z+3ffHuWB+qM`!|Ug~#_Z#?+i(vWVh*E~jCx@?(;OWgYM1bMy6*^FUI$CAn;?j>R`E zo*^@5xxZrVXle{{1y%wi8NIV#3U)tRz#hf}&yQPd=O0(3zX_Klm=`o$uCMu?(2k4f zTV=I_@-uxir2(lJxg5l>4rqzPTHiz?nh)zA%!^ zZ{Ke|&>t5Q5?Z6U`PH72xqNSA4?Qlg;luW%k@Zu#25a0a-4}6Ox?D|VhOBXmwqRbO zvgepHOeaR(zIOBL;j8O^Igv9clZ{z)Si%Pvwh=?L+=l;yHoMGr&>D6vjL&^dOOOs= zI5RGO+T!~7bFntS>p7p9&(59K@uV|yc5Yj6F5&gkMRpQIW@DrvoufE?_RkN;!i4X?aI-abdNQp9C$oX!5?Yo|b z{igql!&0;?Y1qO=nM_P=AGU~B9eR{a-W8Q~=@^pK*%4viR$m~Tf~nbaWy#BKS1izX zN{h5lxyC!z=j*BBd~CtujJp5k5?;cVCc>uk4ZfPa7e9yai1YRCT<7LkaT#fTjSYo! z5rD_2QE#U5P?>aGzp>WskypC>w39=D_q7#KIBc#cuB4txkq`zNE(M+TPxXpZ7-E{YybR$|=6`t^Rr+zrEXxfmc{n z+&!nyN?1b^EtvB0F*ey<>_$?yNC{?xaH<}{2d)f$4$4j5#d3WUqClL$Aoj?pr zTuARzc{4{wfoG~076nc*)rX}1yk=2GkO04j*QH}1yL88h^I`Udib|J9 Kr`!uOsmmyYhc|+=8XwOrCHISc1mH1 z?=REUgLTJurY-$oUT(kY7A_s7}oy3 z4{xyys&9nVHNAqSm9UmBEb^?RloS2856T)ct}Y>ARSRy| ztrP8$)wj4zP{>vLKL?57px0lCmm23-S2_OQJ{We&8^YR-_Z=EV_hF%ZHTJ>Q!(0~r zE7LVaD^IjQ9p_THpptPeZ=Q^(0C8UqTc4B)Q{WX#nxFcuDoLccg+^+6Wz5$A>wfs==3)+q_;v zTm7Xz#v;(GcQ+d%s-$@#xO<<}aQ z7R|1e>bUIT&tZq9z{;zdRXdYjmXiVSIDXw?&MPIY^rIZH$iUs=BZe*p`?;j--=fRB zV7}C_)P5osmL1S0)Dib5vNUy=Y38aGF<{nzwW6n`G~WK+o^?pwIaI%7aUJD5(^%b~Zmx8{-u0SKsIQJ@`gyNmBHlp9 zOoLa);#rlIwk-j1;a~3Oh^2Ns)LcsqPC_Cf>SOhdmv$733KA@fgg_3W6@SzwQPo*_DeZ4Dw1JM2BVre-t`bOSI54ANQ}NCNutai>-GV0v#VRL>G~aac7J{saql{buOo2HWc;`E8CrHlu0Nril zkk#>v9&@1m`Dlqoo^yMY_pO@PET}RablJZ5h<7fb%J~RD}J~0@{B? zi6Eb86_*4pfYT-J-*hAW&91;}hlMf($3F5IJMXuC!4_e%%(%yD>l80tJACrr`Q_fy zQwfeIK6WDoiBC9;jGXh^&lH#xXytfP@{NedeULnV9xs+pLz=CY>U=Ph?X!}Tg<=F) zrn`KD>|Sl#wPAfsGcT^XXBs{>Ij2L6nQSpL<6vnP+#5|Cd6u3ckGWR++eGgj0n9@t zBB_HD)=mS#H!X#?7JeE`WgdOm3Ir{S)ef?;^&YwVDU7q?eQ+Z$6eU%99C20t+)|bI zU{x)#k3_d^_wVb##AQg=x#K;SkRo3k3x0Aq=}Xo0ZGRSl!z%6QU2#tg$`j{3XvuTt`9IQ}RzIm~o^I0R+C)Q_-FV6AK@#6Z@<~&dHDoknB7;|+0MCq9sQ4i3NZ%6buwNT>TsJ09B-a}TFWuh z$Cu&?)H}OmAbbtZTip}Tn}u@0_oo^{moK7*$(@hTGhkXz>Pmtgb}?XJlwT=ZB`kNn zTbSu1dsbJ?pYB%Ob`ew8px+c-}sDuj|Not#zkUsTI8N)rY0P2rpC|r%tpMLL zr?^-@BcqX7xa`PH>u1MVACe=OtU9$G|C_=|!PM)y)!%!#&IPeuvsd(lVWdyIJ7kCj zym^8?Xfx(|!_3mcsPG0{1K$F+4mCfL32&Wjv2a_X>moPFP?HSoDOs%!TqL|X;$1g{vfBWq6Ncr6B* zez%pk(pxF)bfeOG#9uF7(uyx>))r~UimjkOC@UayHb@k|10W}y0>sY(Ne`Du0)m`M z=iCl3L(@h?dP|IkerKPXdjhx?rQL@D8BK*1xLb*jdp>Z4sM;}ThuyX1%FtXrWkC7} z<3#@K`^n=_kypGCpGUXh0yaT4XVc36UcbPqCGmOb0LQhqmTZ?g6b)pc-O(tgtf- zo!mTr0f}LyEis&kil@Q_L>pqstf2D4B<}oqKqAl_hQw&a)Ki;`XdBH%JHu`pSE)^0 zUDri!dIP|iewBM?({Bt=nq-_BhyStwP%NbyISP8tLX5pX1B&Zk37<4{?;mvvfdO-T z^7iK%5Vf=Qb!SL&I0b`PfpG?^b%3m@Oe{)_xWL=z&eG>3tggo@yOdM2sMXJL%T{hqEKU(A@U4N}}HE z=-m*)9xyW~6c)e=7W!j3bg|k@8}M%acBao1>~(x!#3|ZeY~xvamFw;^Zo0@hCzLCw z)m%j=0>vWzBb=%e8X^5D@t2|kFUUDh=6e@5cY(eJ2x}?X=+c|yW}-f6{U={n7G{YD zQ-=QP3+dm2&r=)Dt9T$k65wtH=`|uzp}@e-peOSo7k$;K#4aV`g%uvj{FnQ3f4SR# z-34eg8P4I}y7wcB1=(cp(L$>n&}}BCx2DJ{EXZDhZK6<@b#Q`61GF=Vxj7xGfYobN zove0Xd2{0@dKJdm(9d5l2RU=taafseNkLbHbT`N!WC-tvhiddVzWiJ^ZCa;a59iDM zc9u$QAqS(1oq35yG*9|N7dC&Okxu@$pcqBS^^n+)Iu=4K*VUup9h3IB7LmnE*^3`U zJa_*rdV{x(AR6oUu@;0qFZ*=*dXa=-oRKmp$A;};sV)tYy?MnU2+o%pD>Ax7gw*{H z$8@dz1+VG!RguZt1UiQb?~A=n0R(;->qvIvnDcpp<7Qrav;DlD9!7X+2#?MZ{V_Zd z2d}5lZFf7FD#M4v>Y8LX^qf+=MPY~s7Nx%t*Z!VJ3t@HdHIBQJkZ1@2r4>dlXV+g8 z>vRyGg)lia?9H{i;xRR{f3K`7AoN&r@+vSWt~;BQa&RDLoDStTEE3>&#-F>kt71Hu zy?AnT`?@KtsXg>UQ)>$wgEl#XtaE&kr3iT?x1t-m9pn&9TxUDCeC<%r$26xR4oXm7 z$#EaCctqqM&;M+-1mhy$ed&0L4u?MyzBR`w7P)+|9j(Y{Zpv=10WeJ37_FxCDX24i zj(ir5s&Q!CYq-;eKT*dTK-dTmJ`s*Yx?qLjnojZjvH#0xQ87taV*aB{f)sE~N2E&3 z|J@{)A!qZ7hrEmnkTjc;1fUgfPnZytu=qNN+ATu47cW;t^Om;kV)hSg4?GqFL6KLOiSfP1%2+U+QvX$a{8DYpaWG}_eBho*x1Ec|k97ZIX@HtNEWuQq;}xAeI;I&aF)PaBc2UvTjf zr#?=Ftro$7VyyJ|^3s#E1xCm}{+>x8O%*%kr62VA+vAPqU%AG@(xC49?V{L?n&v(r zEW~c;W9yr463lc)O!Ibz=f|aQ#Qq!(?G==a)cv!udG(pX{P>RT_l(;#VPqZonu@5BdZ8@C~LlZjy`ffFzV;nojvBM1rx%L;lA-mAH_|`+@ zR)VVs5cTT*~zAG70<_Gr!bA(^` z7d{p0y}K=`m@~A$?BW+{$SjF}80WLOnHc0i;Kz^=I}P!%Z+Vtn@ZwOd*`M3+k8yp- zj+ks~9`BH^sy^w7GXbk8qbEF(R|x22NXe3k7DJJL**0yzQ8OG_p9DgzgEQv+?r}f$ z1`HNQA8K;JPZmGugGPppiWw98`!MSj#{uWRMP-o1hCk59^SvKsizrv`lWx#5eOp5nhQ9`f3Kv^I`vqQ?x0&3)aW)gKbj7aXo*hb(nb z=_s@r1Ep-3zVz0OL#~o74}z8-Q5ij(Tey;?^ZQNt>Te>zE7qyv>+Bv@Sl;}=)Yd(pvmaqG|5`-feHOYXTXvtamEJ4Tg zgQ|KS&QYeV*ZFu+Y~Id@;$G(q8I_7Ae1o2Ig+3^GINgQp zNtV6Jzfjgo`Bs{BjQ6M%3^_(*Vq}s9c#={{k&J9_IKTB+4*I3HD=#H`yRmMvg{E1h zfiA2mXDZg5^!S|&OKo(+LQzb4CCy4=qSZ*pO2fgdkmUrH#>l!l&o5Q;xx1rv>CX@% ziAHYmJqs#>1&7paWwq;xL#OfisaTxFbXm z>XAVK$<|Q0jkDxH69R=G?OtyYMmcEJnq}YXRDs5Ci=MQn=OR#g9#c_ig(e}thP5%3 z!Jl7rB?~HgJf+iBlsRZzUdB@4l$_6L1Gz@eO6+Jy${nnx{=9oxT4@$s_kQgiez0R* z(N|cTj*m%}8QP?FF`Bj++W7e`{(ZB^(Z$ZxqG9Jk8P&s0?oU56oW_8>FrWK_K9$2X zPr3O2I`7wK_%Kv{TQg31>~Z8+-P(UIckzeZ!i6LC+QR-fr+@xD=Cx)8)Le=*HlB-z zeW3>FDEzu$TjGHr`FD+-fY#)ZF~*V5d=Xl%_EV=J3G;Sx zLrpOoXce}+JtX<|&isQ>wSw0NF5X@K2NG@6#mM1*a6-vpf+Qe&Iq`SVS88x#NHl3l zRtT9t1or6_{F0LCXb7J&*Fz$wMZ7nvQh+{7t z^d;b+fDZVqfIFl33wZ&qy_Nl|g@*%)6E8_<1*CRow%+4aQ^8dX^80&gBIwk}bCl4}r}wwL0@%Gltltb zGw0U+{B6886#Ii8Q}3e?d`pWaIHZFvD%#6s<~zJe_4H({FoE^uopY7&S{J-<<1m{7 zt{HeL6w4McnQv+|V?9?)DN9HHM$dyr$agDaowMa+Mk)HZr$Kxl3K4A#p6u-5{YKx7s~wFkSjFb_O^*Z5C>ZzUao z7zr_2i=tpc&`?FiLYR3QDhY(4uw@CpTt!lE?=uSK4HjlgJjWmaoeLT}k_|&_<9J#k^U$>y$pRi^URc=2l)Ve(u-48EoJ$zwU}c?l|MP_2|wgcUw$7z=e@oAf_g^cS$o+h8Bc5aPhhPYp26kuAaZH$N|@o5x8tt6=?k8 z5H%P9KuMAG;z;6gOtmK3{|zHMzPj1`o=>Ly^~&+XE(7YbpK*LcKxg z8X2dhzo6v5i)KvyDPPE$z;r+&4ANL9|5)OvD2*LiwGM?XsSeLhCstLd5cm&X>q0*h z3>RkR!&Ub$ShYlj@jdAkcTPf0w~&kklsE1EUX0?A_0{-X0M+uQ2VKem~sG; zYu2Zc&Li_qcS=+pG^=ms4t^vm%Jd^@6IXX-%9poOn8cs0ZF=f~+(mTt!-R|UIpd0T zUM=t;Okp`4ajzwN6THYsdeVM^=NO0^!QP)T3ANYyj&Cgb!Ecl9bvv$*Rclvi9KTwm z=LR-^)a3qxGh0^=2x+nU=G5$@>~t5MZY4!WKF!~SIWCW}wCxHngoda}BE@%}-i3vz z(&j2Mne3de)Kqn`X5i2cwUgNw73tJDG`xLj&Os0+uz-3C2pX;o)zUd&6~owrh)=QKusxF zmO!}XvsC7aQbHZSsWy_@j=GO(D9-U4-Ya-x?3Ng1x8)}U3~i1{DFv+=7?iMd`zp}D~$hd+#Q$p(ET zVmHqOp?!my$v|~4O-NJ(3_`jtfe<$}|J4FXjpB95wezl^u77b_nu zDcnUTGBL5eQ|z&ZesMo+DQtjfZ~_B+PSJQzkpd!!;G*N-m5 zW2US%mZtEE(y0UL@f+E|KiU&mjD0?*OVrk;yTN~}eEi=_>c9%GZh{(?bEUjbr-qKLy>l zz`0*Ksyegycy*SUOZcKOC4K@AvG@!izVxdjqwv>NH1M{jtJs16{i z^2|b2ouW_O--V$~V8$?Xvq8kfcHa9xaEt%TJNZXeK~?n8P(QzAEiUHtzn}C!kLeHn z)2$K4nJ zNG&$1!>8+I$nc2cvFO*s$Xlm&igF)PhIu64&SIoZPxa36mr)fh^A4Ky5Z(Q$QG&V~ z_TH(QtG}05oc~Oc--DPhz*haaq*783ca{v$KrGqofH(dm@qgNT70HA*ezXBOiobV? z$J2yH`_s8CbvV07uYCla=GNLZ2ei!KJR$iE+!;Bo&j7OCzd%NJH!POwAnLR0DP$tw zPs~TzFhg$bGGc7aMAGQ8P1^X$Z{V*q$39lv0Dz)4D#a18{kHDY*tS6R{1wsjKE64u z(4yXI`>A2ER=EJH8vQ8`vFLk~aWehR0Flu!>%` z>y|BeBG~@P(c71~>xZ8%e!|m*6m?qM(`z5wcLDucZ&*T(yjl++{GPjhv)v9Qpk(v% zXygOm^+R$jp=mfF!xEw0L?>aP|K3$-Ow$AN@hGjCwhoOo@)FsyUp!)~pKvq1{0HSw z>z$>Y%AucKRDgoVv6b#)gaYn9`M(v<+RqY6wZ&7$(~#MrCzfF&npfubgc^f$!)RV)8dQ5@~_ev9e&w z?T+K_$dh;jx+nxL?8@b>VgHlcV?+k4Al&?m<*`qOeB7*(Lx~-5Ix;nNc>LZVq8&^4 zx#ug5Ke_Tyc)(D_egFT*QXRizzT;_^kj*6QUKb6H%Krts{L@d3ACEnL^Lk^^`zC`s zqbV;<92ZZL1NL_eg;(|c7-)=N0=jrvnqdne2uN#qUO2Io;8dAD9cp8kLLr=bNWR z$0fPW?2V*qZRBC7F$m6jq;R@5Ok&XFN)pQnCVdoFj)lJ`IAF6*Iq0YZ2+0iTrV_6W z0lnkLPO^Kre*coiG3{xy)$-G2i=EHohidBq!YkwZ2sew92Gv1n24vvD)w2x0H_N-1 z0$dK*fLJ)I%=U!k)F91j7oa(Cw%Q^&tllf%z5xsT=vwOzCGi69E9OKes2%wexN;Pb zG`sCH`lib+qu#;Z2H)_s2-KHhc#_k>WjumtG9v>+y^q^pYJ7O#hcoo6(DCZk^zmO8 z=!@-Za@I?O&_|QpJPAv(*;h{f*VIR=A(F=8UYK9KT`eAWh+&V<^fiLeQ)i*|o4dae z8NFvAMzOsE8dSg5*DiR~sdl2BOnZaJV)9Lv{VdPW;$XM{c{4D_%8qo?8W@?DmhJ{CZUbP&=hEWHQYz<$!wcG;;k4yGZB zRzcCIt%5-hyQi=4grv+2ns?N6cN;(tc@lLptr*8oau{0*Ptl}=}-Gh`i z$H(^$i{2>u`XXJ`$Fa4TbF0bG2G{@502s?W zjIPu5OHcd%KvUQfTIH#+AXZCJ&H%G&5Ct+q69q<@BbZoxGoV9wVGs`Hv{QI2cL>dQ zb%|9xp{b4dZSYoLkaS$Syp!({xke6anR%T4lpY{ib_vaNMfDi!}W@P9)#aH6F32MuydoCkAf{WiE(;ttgw9)gHQ7 zg^}G7kN1gh$O92r7bUMQ%~W4ftki(T&1)ekyDTun3e)-=gr@If%4;dDVIp&V$;t9^ z;#AHWE5@n5lNc5Il`EgGRvBG?Xn>Iogqdf{6cI-9nYIt5J0b~ooDk4IFmd}ar%1?{ zWIDuCx+qHy+ZKy>efu(0ysqUzFJ&)dEIav9My|%xhdS@86O6t?(2IAW1I9gO3{5r; zlL*Lj2I(Ju(HdJdn(CyQ`KkiC1s}5CK&lU=vR96pQ>nZ@S+IFghop&JI<+<`W)bg5 zl?#&3iU=#Ir2p(aiB@z5xoi!N>}|w$<|>op`gB^qMp(bi*o!uqezwEp3bRXmw~=;D zw;l>xx=UO4SCC!JFkQoMEV0d7O{*%PJHyufykn0iB3&6_zT;*i61NkYojm=vj5HvN zp)?9l?+JNsJT}%MpljB?JxMx!li~whL*wu8J~GzMLe6w*O1>}DsG^}PhaT2+V6+KM zi{QcaF|KdIk%)uah=}3<^9RyxY~0gC<~80})xT!5!jCcO^`-aEHg&wDTu9vE8~q;F z_Vp>Nhc`q(!IWGl41HrnedsbS-+;oj!r{|hZhl8;<^3B81G6Wr&!%tMSGVZC5d)w6x%uDl_H74xpTvbQL72ldGl+nV zY@MIXY1Q^#EQwB#MW?-i?-R-ld>6eU3=SE#wj6W6s&Em%Ygqqu)Wid2;oZHA?z!?h z+e~~@of9dV(tKE_57|$5Uv0>b>GmiGhpgsf}ERE}5+UI72BWCqvT!y%e4!?adkOBC;r_Orr@Z z)~jp|Y@Jpmz)*g4kjd(-0O2a%Z-n@$ORWz&hElcq#4f- z%88U2=8(-qU-l*Fe+;piEDG|+#SccV_XIz|;y`e(FR1RDLpan@gC*CLt2x&nITW2A zd(`|o!s>hN-1f$=iB3tS4$(qyu+U-NMUQ1t5!zB=C^vR&yfc-ja%n!C=GZf9InQ>) zK*MseU|U{+1%3243wtEVIv8GF<{V|m@c+|1TO>UWX?cHaUSrYE{1fT)?__oLXHR(7 zsv^BftUJdQ9>))t&BKe?{LG*C$ZYk+0Q)LZ1!`)3K5rDV7YD2>-AD>*DB~CBK*!_! zb;w*=?aPUH5($SN6xo&&Ju-i}H`?NrRVolRA+_-#wD)@;0Z;I&gd~sSxygignXUt` zEbw-3I%%dCh)GeYorbGR8w5@EP9dTR~<_{w%Upm?dB% z<$KJW=h_^W`3(*~)#{y%D7zxQ`KZ6tF7v+3G9`doMLvn=`ut=lQWg}Ks6pw_b$5#i zW(gpGe`p)1ur9$EZ}j9~`dA~0fuQ@e_|tWOY+%*qz?1!})oCL?k`M;p2AVJYdK)pL zCS$q%t3+m2C^i!#jx$~+M3Zhv%pVQQ(2+Pbt{#~l;8UZi^h7TtsE>|4CoKl*2 z&?F&$V#T>LkIB1I%iAdTrpuX@?B}Njq>7X^g}lcU3kZUvI0XO3eYjuU#GxKDih4|( zgS}O3-uH_h*ARHjLv=xn0`3|07a({av z*0q<2OAv^Ia%8uUFPiMcF4*V6;7mrzItM0NQJd$6-bam&cUXqeo`_9K2{;qPYV25q z71?Je!YD#1xoJ^b{kFIGh!vKAwggbhvj~av8Aog!(|7s%{p?n8dDndg=byWwZ-R*C zDajKws5J?QC38cDxBnP?mNbhC8-s+2;o8#Z8~JUT(Hxe=?@=EJopq|bP?^YNkQKN)kEfzwGhZb5FGO5wZ6(r3R1_Q@GQp9FRP+UasL zEhguIn>>ixcrm=fZ!(pRS@lm;UT1ns7{8{L@%$vdIiY1zE~65JgG->7DSn;iayG`| zak&x8NIUJzKP!FkvrB%RHL{AA7D9Ha9LYFZ6jk(DzItm&epk@EB$GtrK6|Jm7|Hj< zT0X7lHSY*T4Xf#TO`+x_0et?lArehRO?+$d)73y$=;yR}!Qb72XQ;67y5I+thn&C| z*&>+^$JNe9*>YV9Q)Sd_g>;gRHCm;_G=e(bOf;l1WyvDjR4s&F%RSOPM012b)9R)u z;_z53R}azi$2-Qp$Ji_aS?wM4dlhR*>hxW62t?bpwfekS^bAR2%u7q~oUL;1e$P$S zB_=4((BNSefWODtYeRg;_Mag^Uncrnx1we3G-I=ehDeJ(~`v>dBof)=oay7;Lnq z7O|;8oqfDdv6lQH8J_@S-VU1#Bcg7xoh&M~3?o<59`mKvGPt`*4xo5qvx2wiC(EE$?3%Q>~0lzc~xadCEmKz z|DlsS!&@U{(_@KHaL)Ljw#*6e_4i+oG7MBD%UV&tPiEu+*3J^LH^=9q+3w+cg48wD zzq+u8A7Kf<&TmZ~@jIU1ogEvx2^ovjTrr=sU>Hovm zcZN09bnVilJakctGyw&bULzevK&7cj??g)INUx!T(p023r7OMn-aFEJfJh=G1PBB| zAe=n)ywCf6=UmtRF-dmz%$~Altu^;rcSXm=+hQ|Jr-)O(hIp_E7$NyJjW=AwCvAn( z*C6kpQ{FqHYaQ&g6u#`zq_UlyUbR0wB1D-W=h{Ifs?zNsro}11Gv%RKz6zy>k}&*o zx1Ndcrg|VKG1L=0q!2`}C(x!DA^Rlboy^D=m$vPGSH!G-+M{UeCH;5vchwm)=udMg z#~aRpu35L2Iz~Q(6pbT~lvear^HcDNUc_%GPrn;z5CQV5Yl%jRH1$q@+?q)-4XC1G zi0JteVjc;QcqwF5n_A%evN3D^eD6hvC9yb(JFXAj*6X6+0NAlKD_^<}?ZWO;GsSRH z0hoiv<;rx=c1naLE#vDybQ-^tG55gviV?KgVnlz|H*MJn&R;4qOkCU8L`_gLtH&!I zl8A@Seb<|%N_4DptBmEac>R*}R8Q=u=gwI>M(jub3OxD;D+UyJ4%*OR*@6wdzA^P1ou$SrLhCpLWT~`5M zRq;uhtsQbkw|;BjW{TM@MnRJsL9_W6PkgO;Aoy*73SbI0y~jsPq`Lj;h)Bh&lc0y! zIPwGSO3~1|X^CImq%!ILl=X8~2ve57^O@7(^~4cY6}ZfgOn`T`*_Qy;bWZnLJ1s!Z z@-rh|^GBr2v35-NCS+YYtbLkS#90Ph-woVa*lYLaO7uUcJR&u(?LjOB5wPSz-VB9P zC7r7G=lJ~Gc%hzZ`P9Ln#3ohP=-}<8^6{Ww)}4C zZg`D#ap&zG^$$`=VyM3 zOn9N16pj0FH7T)$B+IdFv8m|o9KJksiE!JSqsRWiE?V2&EJx2<(ck%#U712M>JTs8By6d_Zl}?KJTesr-Kxx&0rNcdOtp;lh-fK#W&!U&V1&uJq zU0l@CP^?unJEu?%>{)=Caiz8=Z%5Oax7l(g260|vrWWD z=O_B+AIFIJndELmNnf3l&bQv!E_EWfSM$YeJOo30x(0-H**RfD6bu`@Oc&JruG5~! zvoB@PxTV*!kY2Htx6Qp_9%2?EUKIqazB#ihmN$2b4QYFuGz@!$ONvcn9v7ysXr1|P zTw&$|t<&!YJ2$SG5v)f9g}-5k@(PnMkC1=QekZj|D`IwVgd8M|dg_ueLph;G*ktFs zB5L!dNLb=kTIrgSZG!?d_Fx8@u$Vo6Oh^<+oaZQiqT(T>YI2;ht#Pv-H=n;1!FgiY zLc+V_XiQj9%XC<-FZv0J=VqkibaSIxt}RX>>UE zy>o)T$LuXt4j!Xb#LGXbfHT^C`$Bu;qLs#kFJF+jQN4crSVZY1;r2twc^P)@#5IsM zgyl2YRavY5gtRQ!KPPY>ljAv8e>}hu_&Fx2Z0`|*qh)^+MelyxSfwbNKuXPerrf7Y zBQsgSLf)CNpj>2$CU82HM{9U5u=SaA)@4T#o6|5`Y?c|G8)f)q&;|XpjPg|&9dKC0 zbP=n;-1=FCjM@P&lTc?C44-`on(F00e-$uk4F5IM#12i^rCUB8dXyYVMj~gxMUCQ` zr!C)TSt2Il$ka-G*j16yxWO#zWwK;9HtST16GvFWxfw@Vmg=l0Z?Dkbgyr<@T|6mO z7%m4k5?cnzo=?W}zCL~H{bV%7cd3-D}dK#zTgMGs_y*cxCbGUX2TwIg#CU^3mc@QFgLss+2tI2~>M=4ZD|^g{}Zw zn+IaEia?O|Ks3x)zM7+LZOm+UX>5d3#wwrF|0g6tcF8S~*H%$G^_O+v5r!#fuW-D< zW*Tu1W8!~FZCG&%naBojTPvc`El6LPnuo`TC{C<5dOMg9cZqJ<7d!PcM90q zkYSqzv`UJ}=5kL5M#}#j!*t}SQPby zA9!-2qhr3o1r0qjueOOx9vqi}vkB)^uLq7eH6+a!(VcF?b0&C~ANc&gj)_6l2*_PB=v-nZ3s%125}pcqdBmiysxvw|vav+YUkY#Cml> z7n#hDfZi*C4V-ySiG>q`?HF9tXz5-xgO<$VDfkMt;FxoX9??>SjykSSe$BR-U-hbS zn-br(57g+0WdSJ2BD*Os4YYT~&)u(xX$}xwJyF;*Zt#xlY2YaaH;}WliG|?7bq)A1 zGo0fG(Hi}+KrG8{1(wrqumghaBsM!`GV{HQeS48gO(lRIoIrn zaqPG}ogk%Q*#Yk0TY6lZ6C}D00Ft9qOuW)WvHks%N(rZa4bJ0xReagU2>hMHdv!Kf z&U&purC3?{zzjFdj-ENQp;KV2d%ZL`+y7f9ewMhPL=TR3EBqBN#jL;QP*z&Bw$C?+ zkZvn>OJ|LvVm{PfU3GA1n}fxH6)~TSEHyro1s-6&bQvb9QrCpZdX2VoTn0)V zwY)T(R*kFXiI*9k=(vacpiDc`Z`8u8k(GRTJVN4PK9hK;{mY~4S~fCRILe3fGAE0Y zzoPZ64egt1;f`A$-Lgd?lZp;yb;(J-(Fq^dmCWCoC1i;VO{l=$clEz-RybY&-uT#d zyyVb6=KCbtO-r8B=Zszv-5l36QKmg1gJpx*w2F~U36BQ4bQoI|~hA zQ#)Zn7bI8XzN(F=Z2!Ov>F`eJ$E)jXsNrqf%#Us~;(X?QeK&&wehq#c9~GDpuW3AS z&vDZ*I=(n;&5EL`An#CzNtcB>uYiW<|K?{4j9!)GcUts1c5bv+NzHeYi)mFGwi^*$^} z!FVreT(P}fuxv-b!I+D|fVWV=hBwr^bK~umViclas;WZ|d}=zsTjL4d*yEEbLd9{l zon9Z?@uqL?wh$Ow`(bjocmK_eZFn|*4)OPs0y8EW(R<*|kU2nG4WQZkbayrZ8Z;D- z8xT!v+t`Seo853?m1<>uVds93?oghV1^%H@pJYv|a8wMRogcqTgeV$2)*Y2)GV!P~ zAK5%5oPTq)>G#~EUmSYXr*A$+O2x9{P76v0IP6^xEbu^_T{;ruDjm=aQn07CF70P^ z@2je}l8w(LQN}Ihu6yrH&tc=jgl}5bYO%U^F|Kp|U5r zZ2`9XP```smuA0C5BU_znbr3=ZRW*m;>Ue(FV5I!N6MGwFB%x(c~?@E=mAOc!h>i( zGoQn|US%A~X?4|CVeD}CTKV&q2LVS|&rfxRk4TQzn8Z~YJI^OVCj-;^gj;Sek(}Fq9@RP&N}{WnFPcu zmZgprWvB-`Q|b)|mopB9knWoS5>}5|!2@B_l(4rU^LF!+C9@riCD|2evutx3yqU6U z0`&6cHN|=5*T5ePyHzRT!x;sC+vj%OP>K#Zpmw;S2P84ux=ZI$Gu9vidEc`tMm3U$ zMa(Y!=m+1e@w;;n4smP~5XPm0H{WU*@Nc9OHr#Biyxk}n4CcQAo^*@d7?D`HW09rd zC!qdqm&_&*&+I;in6(UGH}^w$I#-RAtdwLV9kjumElUf`y%wz#%U#zUV-D3}ypCyCo5)WT zOKS@K3jT-5QhraX6{mM)O&_vpYU`E1gU|CWCfq5!26# z@Vq*`OuDF%^?a*7{W$aS%)?Vl%MpeG&VhJsR>xX5dysoDh3>Z|LtP+??{);!5_4%1 zo^@9uhmUvJz{xJzp#afiD~{+IPV8j1i3iyTNw(!R-E_uq8O|aHr<$Ep@h|+$1a06vgz7GgiQE>J@3B;7S#VwN;b;#wT1uHU zf=WTJCTqbQY9`@>d?as%EIm>A(_h*G900Kq^M01EzNl_y76&H>=^7C&skJxLGp)~{ zZ*t>}v!xtX?#%+!AH!byG*s5s%AN-|NUaaCQX0Tf@<#>ZqqJt`B@aB;$B09}DLY#Z zp5n89VH&$6`;w&qKfDc2#G=F+EDtG&O%5jYKX-L(i#vskHP=n=p#A*7{##c`Oy+M- z@A66&Xe;7+r$2yOlJx5P9#U@g`}X1t!#s_I4A7uYC+y{3sTI=iW3F{4Nbx1GDhe$U zhj_HKbvgz5P?ZtiVZ2mn8_=$AN}>{+WFm>@^cdvYFNEcyWC|umAFpy)725C# zgWxC32|YyKtDoBq0iV?rHPggqAweRR6Q)j%R&#yf zsKNc`~H>3O)d5=IG(Hsm}dBq@j2^1$ww`eiHxsCMpn zKdU*A{5siyQN99h$DT;LI2_kX+wj#aDE7fj%dgSAY2I);z(x?gfjWu5;X1EV5?e$J~TSD$F1nW6eWGc)o0q)hE+PJk1V-wEv_l2W;}ul*NMPA0 zyDF=HMmL9m!7@^Nx1vq&JSNMyD9blFL3|v@c++~n{pzFIbdR3uMZC-aY`eO8ZlAkf zb|yX4pOeT%XHpEN>rcLmVw>+19&N@A;**JbjI`(~dg}kq5*{*4exqC~iG4PR{x8z- zkcdwNfa|SR&y_UR>*H9X3cV8diDFmt57GhH#wOrKR)t!;D?Rf@rP@5;qL9IocAnzQ zMWTe^G|nGWkg`yc92m3Nf2ZZ!ma3?;Mx!B2@)c3Vuj(-e?DEoXobZB`4mk@+ueP)G z!NghKssN8%RLeU$mp!Qo=quZ!cUW=s+e9^Hk#$PQSgsxk$#q6YE?0*6g`KytZ8qQ` z6{Z3xqRzTz_=q(iUKaq#{2U>yae-)e0(^mI`Nw0#5$hG{UhP|q{#&S9D27IFd%Ft4 z0csIPdfNrng;W~|y)XGswM(D66gtmCYS~VQgYbm0zJ99Ze#!3DEEl(p6n#j8L<2MV zP3;WG5L8=c5$b2Y*gz+8_H)*Ii+rF2bv1+VrdKL@nvr!0(&>(od=aAPgzhK7DLo zH|m^M6Ac#&nMTWomGSv~iCEoyDm(A7S%;Ez8Qw^TJ4*NW(CirN&B?3=EF-pm&wc^! z&1jCf-v5BIQYHFO@rPNB4as^#jSA|n>BBdyr@z_gB2CK0IrAHq`7sIdvv*A`tawg- zX1Z3D$Z3b~hbkH0>tea3PE>K6XnTyM@;6XY8s(j-A$!P`%i+>3w}P&pKc)XnmlBkv z{F^%`h`B`64Ehl6#)c9`4>b4nIi1sj$IPiYVNpK1Il(ccOOGt%xaYbeMQ0W`-f-nt z$K6w3_y4Tl@rW3eq|j?BzwUib!7%D}^N~gD)I3T#DvQ?$y>HaY&p_P#4ulA|w9{Po5^Oh+>9fy^B%XCa)H?TNCB zC6_i_&hE-1xjt}IiW^TaoBo+r`!z4eL}AZgR#pNEKeo&88P21XK|?m`g{m;AEoJ`~ z)7ux60gvPYta#pUas*@K&+o!KVY)RB(V}J({VXU+XNlqA;i(qRV|AM`P*5eO2l&^| zM+^QPm!H}!KgG-ANZc6?n84&Aso3VG-#S+*>)0jiz6_LEq9{ChUCmrGF+U&r--ML9 zPjBg)S?^zu_o8QHl1nf$JUk#&+znTaOTKqqsS)~!U%?gOL~nk_$rjbsk^L_3OhZ-4 z$u3YEvd+K>#x}b8;hAmrOdu;eFASdkkTz($J&qZ82$kg)3GvNw>Zkkq&J_8}oyaNO z9&|rU$!wINkyU9hXn#vTAiI-KzMRV9`7#+b$EJX5Oei+~Wc2hvM+%T}QV&;VneYGN26^;Ss8d45vdFPE>NWMd0gao$+A7S{o2s&^4h;#1667V# zRRD@5_GVfeO@_kWX$ZV2*RcGCUXRwk8tv|FMhU1Y2S5K40r#d4bgZiJY#Rz>{%OUb zN#({17bg|_*!|ELVJ)WRIMjRo+7lJ0O4qwDqPmM#J&csdbEyqVuG6VEigH_wEvzyI zG~tFv0{ju4^K}u6q-Wk2KHZ@ih@?>~=U`00%7TE!Zt7Jxg_ryDz#+;<#hw{bpume; z84-6O7^W_!#_G6AqdVp#b9Dd%h|72SYD4n)&M`6TNNXN9p4;RC4pxnAVu*J3Dz*ai z{^hX~Zx~-){p!pbTM}4x58N~KEvXv-jKBF z^E4SQ8;`FAz2RHZ+^2w1CaUz2lP^SbMZZu%+XObY3l`Sa30_1hZr6+}EC<{$|5U%~ zEZfkkVsLwXcgn2Hn=sfZh{2`am#n=ouxt#=;rc~XdYOs9>QE${xBE3i4uyf0iiHVo zHQ>QA|MIueQqLW0Jy)iT4?VeH5wDPG?g3@GC1+>x04}bJ8V)X#nKM^5PY|2jexBeMkIe0uLW7aqUO)Sn3nR-Cl#i98SeC~!+v_Fhyl zM8iJ`!bH|Pz#ACe*c%#jwyZK}ZyicWXhu?sA+HTn`9)ro>C-CwYaoouUw4(Mibt5} zBwnFlkIt>=a|8dAq{@0eYTDkXnz&Zo%Di_P133ZqG9A-R&bm$US=t5+*NXv8d=Spj zP>;!V;XuX9>Dd4k@pAg(9*7Vw*D(BJXVZw>`HHwUR*JEBbiklu&9Z%lJ_^0&0#@v2 ztIROOGr-|6F!z&53CCX_HZOuXUy+D1KI1761B$4-dK6^TTKD0lRass~K36`1pZz zPG9r5!tSWYk85zORiJH-uZ;|L#eH?c{`e*w^L$J1%h?ZWn)WhxTj5amh$w*Ca${o? zs!WAGS*7vde#^X>e+$yq-TR|+rNe|iZ+dzRn>oQJD)g$mxAAMIgyUj)0WOV93Hmz< zSJ>3bb0{>$q4V37Oi#ZXq&8Jv&B!LrI#A9uVB=blLRBy~Dy~W3=)BEY?<+~31JJd| zqaRdMsO2?Y(KKhYEg)Mowi++^x?bnjoB2D8Na%&rV!(ZW0`Gk6H~A$2`6eM4XY&i; ze$M&Px_Q%ya!-RX=RHc`W(JeGGfapv6DY8mkk*+BOM7!nX~JSozIyhxZFJm$5pbu{ zf@@$0P>fvWTPB_kqm}NhNNg)xQQJd=r;MJ8heXkc*e{iSo7l3=3i6Yg85bv_b!z13 zj0f1oSEJWu{dJAW2;4H=Ln{*nL(ez)D;VLN9BiJyDw{ZE_twK4MZ27)lTyrKP=5?w ze}<$+P#caix}^qtdSq5yFh*~v$+BFrI@Nx>n!Bx;v(_e0?GAvR8v84SD0;)8YI|{X zHTU2fRD@u3Yg71@2N97lkqjYMMrD*AO3Sk<9iOrhgl_0bT`~|~!LxU*p zyJ-t;%`OwjurVd-d+UY=3eVdBa3VBt*9Ic)U&L>k6u3~-#y~XX1T3?HyTZr{+S?$f zK)E|Vx!~li)1y_#NCDb3`D9#lFnM%m1xX{XZq1N%3}tsk)UoCtei*zf=F5ZYsc)I24lq8)VIGVk5GVb)BineJ%aUqT@`q-+$#9aah$DykdmaaneN*-H(9Jy0O6KBGL)+JAwDRch4v zr+-GH)KKs4$!cgtQ(TE>EbV33O#u*#TA604P1hsFhQ~Mf9aj6X(ephl-ZSso4M(1E zKS9u9Puw@&q*)soWwal=y-R{WC@D{tlIRyKix2By+tmBw>S&vsXuc#>x@fb)?Rs2$ zWY9}Z_+GT@;U;gk6pFU$V+35GCW;Rx3vhC_qR!<)^xaAmt*$aGm#UWGl1d~UKc?R# zMqql!`OL6|E_&6Xb5|%~6RO2t4xi2g_vQU*_+@R9;HPj|3dTvRE@>0C(wgz+wbPjx z)KS^~s+sm`^->U19ipk9 z*+y`<_~saDH&HUcnshY?`q(LiG#}bBD++g<$; z%AMbYRp#T4iQ&vn`7870fwO&1{e;{iC_+StU<^oXUKGInYa`Ugmv#R5W^#wX&LA=0 zxIUv|k5Nk1SWo z4_PTU{TX*n_x;E4SF)j1!G7u%)wPQ{kv(%+E{bz2Q5M`O$mE=kTBq6BCF}_SKwE%q5J}U2Na{s%J5;KEmqduiuXT2H zg|Y4kmrzB_Sx%n`to?{0)fbCp3DUkTfRc@X+`6Fg8RN*T98;!0{{T_`Ny|Ep(RD00 z>o)OjwYGMPcQ+jvqay+X@*-00bV+dfp#o?iMfNod|#{Qj&^!HF>!Q z1)MGo zXDG-!R-QJ!wc7rzLhzic<=bW*)QFeF(%PP}pO@U1BRNuu<4~RW@GjAoJJ5VN=s+9r zl|o&Te`#bhGF5;78|%Oz>n^i^;{B5PHX+$D5|`d<^-XS_)Ykx}wGX=>xKR~krcUW zZ2_q-JpLn%*0zO>;~gS&gRgdPTTzp#wG(SLI@B0+m3>hOj@p5RB@*oc6D9d-eb z_vc5Kd2CY{UyIAm64bF_Wl?-S)^l&nL-g8QM3uoW#s0@Xnc&2iw*>AbAZrtpOpfA2 zuW$A7w_`kNh5H>vcxe0Y0~MAueMLzrfj34v41KjSB4dagisHtYStDnOX+QZy_xKJy zjNq}JR`V=f+v9oNKoYAGuOiRGfyhhPWcC#=nzUVus+ad2mMAG|GjjHQDFK&(VAR@= z=>z-G8YK*yuM~P$o_Jn_M4p(B68^w_n{$~iGvUnBBVP#^O`5og@l!MZM8v-{aL)a6jRcsw0qSzH8=3r#jm3F>q zev?UXhRfWWlRx=T!a=|4DB1Iv6~V>c?Qc{5XfOwP#?L$ItZ+Y;y2W|Hph#m!J1AC^ z2%2ylo|-6EURU%GzTmUrM0-9o;Dy0U@y6@x@Drjh*HT@}Hr5JzCD9JA+h|F$n4XnXg{) zcvfJZkab`t>KG&A9;83p`4H;IE86%S{bk2AiF{D3@xe**&V%2PB>1aC*+Q$&qI#o0 z6uiQGBwXM0?Y679nnebZUKkBeaFf-NbKV=mQ%S7&^cUIMgSm4a%Lq^jX04LY*+|=9 zF%`@ep)x6RaTyJ#qcZz}HD4aB^yP2^-n|4U+z-o;D1|g<)G;N?x9Y`IymVfAzMD~@ z5Av;Irvhe(9bsJM;*_IQC+Y9Vwh{sLM}RW=089jRnhdCj6)Kn9$=cZb+mZ zSq}ZtiC`J=G8Z>2At{;Dx6c-InTNaw7#5lv;pMuJAE?^InXsd_4&|2^5pOtALfE0A zYPno9uIHcPU%U*$$eo$JY+cXR)^4?n;d^k!fT2%8zVudD9G}m+gOS5%osDIJ_Dn45 z>)ltoU!l{ATFzKWGtxbU^bSp0LYr(~;Rbefve!`KbsvG@0qhU#8QelaRq@Gl_FE_K z19C5>q|~wl^lkv+{Y?dFtPkXKXdygT#oD0e0Nh8ls`i^EWIXa1l`kt#8RpNTnNENi zbjtw~^O9&dbfb9-nt)3*6II9D)HC=|)@gVkd@eZk1V4|_3|5K|micQhar3Bmm-I)V z!6?Kn8()`I-BR}%!Kv2;+T&{Px^%w{yq^F5yi-fE>0R;ntRlY{yt#wFlvGGys#N9o zF89!G&_~64s(IDWBt$~>16i|sOifo|+NB(rXs@VnJDL zr{aN<^+|~%7&IFV5O%5%xEe<5zjof^7X&+_itowKmtHIr8x)S~R=SN6r%biN?<6eF z<^Vs!k$rik(HX*kDP0e_9Iyg4gvS(=orDn9%zJ9fj;;*!S@;8?I7J=?l%!rMSqM*XQ=jVu;$c>T^CZ=J{2imKkM=$6?A*?k0;>R0F;j_=Ge_N;)A$%{=u4$ETp0j@r`&#j*7y>^aG)=_4zCgWhJa^2l zy#Enz;pRO3vflbjyEOPc<3A41|E-XEMPhLA3J*;96O5olf_p)9`26miL@VPj@aTK} zIZ3b`pjhN@pXpzoQktqRWBSZ% zD>wdm@;?RKDamArHOoZ@{5zYOyh4_?ZZl$O&vzAovzcJ+0r$` zuUc-Imn1vaze*$&+s54@pNeSgwUnK@Ms_qdSQ3CiPPHCwW3-wBOl|Nna-Y1pDit9@ zM<*wUBakDRQ!d+M1x+rd%bWkzWg)&ioq>_P>%PFE*MIgs_lqrxneVzIeX6By4)f)R z$M+r!VChvcUqw83UPCzDY*QPDM4xDGa%V@n8jTzkhxpiUZ!){_xJ=De=*Y(54vRdt ztWyf>=FIrm8zJr6sNWBVUD`bTcG7I8k4A*y7zQS;TGhCncR944_&7iEfr|yv5@?!u@$~D2$AP)Hy=cUGr@|3WLa|zH&5N9E=Pr%Qg@i9- zibTE#2|(9kpl6v`+xl-jsXkAzJ)%30SlFPlA#ZJ;0U4)f1!%ARd$0-V&s^~OE^CsA z0mcRO%J1)ALlo0G?=ajf$~Z7A=hri04Ig;Nz}HOPbha5&lmk8=x;9ogmR{%v?JvT| zQ#TtdHo5^PfZgE~pyAK=zdZ^g-A*}#%A3~QP4U=}dNOlZ51CF&Z3-_?Cg&X!?zs5G zXzVD;q_xO_>Y)XV&FX0uWqKLO6ixerrt+VGI)e%EE?WUfr@7H#&XikHj;Vzj*_lB& z4E%}o$85g@QT5Fx8cp8KKXEe(!6wfxJWCB2E^A}#WY8QVyTdg@ZD zorhiZMT=6_-TBQ)FXuO}j-d(J!UJ?)KzvRvEBWu{$-c5}cva6PHqL4gMCv1!JO%b8 z+`%uWn_i_fGbYr(&0B#@&+EC)v0qXtsq}>2*`P744tm zfBCpJ!^>rLN*L9PXcf+GQ=eHW$?SazdzG=s1bE84VNu4^ zeJcsHOOsJBSC*`q<DsJ91 zMM&nVwbl_;Fhy}CCxxhl#%~|0aXgzh@w7hQDXEykz_SzaDDjVxG%TOcXUkgKkq#A_ zWP2^zM&F!R)xFy(niZSt5aOoI`P8^-8~cVmF|(AgvFgU%441|OlqS_U%niHXJ0)!75rNcV(wv6XMxC7Z*`z1LC3((>UL($be+C= z(r{_4Hw2M{Lz)*AsSCAEHchtU>F#;rDrM%)OP%qK2s;^gX-%fuqL`rk+Przf)0nht z9(XbsEj4y8JDKx?9=VDU;iiQrYgKFULfQ&xQYQX_@PMCRqw;Y%LH40;h#72~_cRw7 zduqJG=E2O;Fg^^Q(qvSXZVrXTxQg9V|9kHLAr=gJ$zRXM^>NQZ?aTi%0+l*jX*AL$ zq}wizMz+z$&d!qsML*QeV&btHxWgS~zeg`Et1}a==H=n&PnR+*HDej4!8@oirGb_lM zx|;DZfy{$0PmaNGujj-96Q<||9`>M_mqKsRKD%WSxRgUsq~Qg6dm0dk5B=mo4m*_N z2f$zR{Ov)CP$xGXr^heLZ}U-{O~w%bNPxIzhD_N)kD7oK&bDHJ?Yeg7{Eo&$Y(u)$p^W)x9dLfZ?y5?12^m;J0uG zm*)HIb5(i5Hggr`9pTI50wDwOmx~EJqnpGju3!3$AtZCAUJ&`Rs{UKs)7lF7XsQpK zvM1(O&v(;j_k~&z$#biR`D*-+A4=}Jrcr2ya7F4LlYw#e<+x$-CW!&h4che(;2?4Yl*wgBg z^5-o`Jg)8KkI{t7oTi!uzY)PHFWJ2h1_~w*rIMX zYcGA(dy_b%Zv-#NKO5EBr8&2s)X&r-eiPbxO9gHuc{0r?XxywT6y!qD7<2nJ8^F9d zg0fmbBlrVe1-Q9#wg1MLirTy-ZbuO2hGB?dN|iG9i1@(d!$Z>^K#@NI);ms~{yd~( z@{`()DW{F3)Is@087NmYXqzscVo$AgZJ4p9=M<^23|M_)K=fFWQ0h!G8;`=qVy!uG z5fn2tT!F{T?jTEFWE--58_yuE&Fa+p%n!XS1d7oFxB=**XJax5#&UghinN|(IMy3B zpTx^fT~`|(Wv&u%Rb5B1SzNC1&}Ruq?+HU4oN@uvp$mmYGLf053mHIu|5eCPplxB}$egaYre~Lu#A_=O?>NeRv)QU+F;cbL{a~ z3{!vBquqL^so(hPQ68q*0o;Mup48*7hD;skr4kTz%^Dstrgd(4Y-c`6BU%$FNcCxv z$R5b2B{nio2s)d;)h9Rcd<_|X36-bf8!--D=juG*kzw((4` zPqAsVYhw)yVuEeQQ`>kfb5R?5L4MT|=W&?gKdN|@Ru8cpkmxJ*AzRLMHCXYJp0>@8 zw2}9(#z5Nk(;ZC6SAi96axMZMwl)jUbd~+%&^l*>?rJ*IWvQ}he2~X;+H_h-iKbng zhxq7Hy)ew!y&Qx^tp3&rmqj)* z%i$HL@B}D%+N>?e{boq#1+DQ6LeQPI>ddNc`l}k-$8DglDT@0nT4DSWGvW_lNn4i@%Ccmm1@vc}?@1lZH(dPgcY0WLghn?Fx{~iE~cnVjr?ilX#!rG{t zpUREDb#8-Bat*OZp6668oxnAjj9{PPZcy~+=)^{!bv{D9qCC~O=R9h$t}*Lk4AQKC z;v6&I%eY#o*K#2qWe(lv3OYYjW0G}C3x4rDC~u6&=jR~(w;!8vQ`Ke3o{&}sJ}nL4 zD8O0Jy=Jo1@X_mn*hA<*OK0pdg^AdDt`&uGX`IThpfj95Q|zL)UwuYu0rKn+I`zA1 zlcZ-R?YR&TGjlbqJ*~Q1mXR$==wFnDOXp3k6Ak)6pQJ5)Na7O6$KaqAcRr3%-c$Wh zm<0*A^gQ2hL23}VB-tA;(`V2F-9RA)9t<_{&I^@~&NpKSK_|L;THb5!6&QlGwI%`E z(6==<>dm*+jr-%-cX2_Oc+NK_DlbT_15so1UXDKBfe4q?`ZB?%^Mi&PJ4AYwpdWA3 zYWJ!~82v^bRu8V~+pwFIBo~O{*6=2OYbHJn%&6_wuxYPje?85+zeUb#d7^tdb$ire zCO-G^eu7a&qLreVpW5Ff$1eC^N&n?M2qqUGCuzh1KvQ=FL61c??=SlpbtWlO8Xq{} zPsaQt`7)5ErIGXj6y%xwX%YKBw^B|eri++NG!Bfpr#{}q(#svz#V9?;?eTCVw~`k| zx9t^aTx@AIXfJQXlvX92#iS{kk$_Htj&pshPG9SEv}J|_Vzk9aHcNB{lxZ~`Dr({j z1ZO7rLEs?VHXlPO_<5Y>6K89uH2Z;}MDUEIbP3pSSIi+rI<-2YT$gcg6X~d=4a9apc9nnC~cy_(s#*h7*zm9Q!yvV9RP8h{uvZ2jlZ6?KdL}SF! z5I&yV2&Cd(@uS>SwnF)s(9^hIpejXNG)tm#(;$#xmDN!C2dS_I_`hVx6APg~jHFoB z|7$;meAl+n5)1=@$g>JMh^@fAT}zArdY(wIHPLs&-!h`va_tqI6xcyfgS`aAV9Lbf zb#L-1TP{sdKs_d^GFIhq05-t9YuJkqwJ@2EuqM$tf^%}?59Gow7&_Vw_Ns;Bb+kTr zoszRnAZ>rtyV-oi7HrMVl%}UhzVvop(rm|EEEG~b-VTzr8hEgz$j>mP$`SAflJzg$ zCn6;HawgIGpnLM8eGid#FqRJQ!B}s3cJr?#7$VIl0woWfFDOQ7MN{jo3^UTyBX)Sn zuhK$`=X>@Ui^CLW>$OevKa&dhP((LfX?}^Vd{ADTdBy8e@SnE&J-QFfr5|q-fvE`n z;ja|Ju9#;YsQe{$zDp4@JqDLF;WpyZbsnKRZieJpMvq^Wv~p_){^iX0dv)O5D33b@ z!b+~v=H$W8^K^^<;~oCF=kJ0*CfoSF*?DF4Iwm4d;4sR>l7(FTH zmRREZtL3^01p7I6uIaZ0>BRkq@%oZ4IE8#$C+7U#3+xp+k>pkMf2A)BjN~qZ3gzm02y;yo~AZ zp8Kzc<3AdZkXtYai2Bg~vXgxI?@jLC54=O_K=r#@_WyNtax3BWWbVl!``rKcO~H8c z^W5zg$$!1lzdlyFG8F5Tr3a7-ub7t3{Ui4Omx`4_f>)l{-T7aB`KOVckF^MB>92<| z9ck&I{uzt^rO>(h*q0HkV ze7QOshZ3?bPJM@5f{N~!Auog~B(4-&E~d^uJF8tX9tR1OorYGn-4=<#Ve@v2C!VEJ0_dHz~k_?23ohM!Dy{;HmTE>F4;%+pRV!Rrz!PW2aafA$6{qw^wrgnzgr zH_&~0{7UL_<#R#fKONO^x3jLXAHx{r|J47Vm-&7x1iz9C?Rk%ASj6tEdd{2TZB<20 zym@#uLC>RlR%J7m?pqT*k2i5WhVG{1`G@n2!I3Qv(8S3x_=4K6#=MF~jk88o3y zQ(OMz^(OW`fBCPINS%|Nj&>8t78&1b!&gsQi=Q~DJ|&3?V~LfoFeWFc#eVR=**<} zbj3Zqpk!p@d7_|GsPPQ%d$ZV?Do{6as+)ZkMoQfp*vm%)qUc%%3}3m%z70Cth>~z# zX?)$_YzpsNXvV-YbntrWtC3_u`Hm^MR!sxsM5)}>y_mPTLI;*?-uo+y(q*kj!{hIQ zc<2(80-p^iZcZ18+l)W;+?^3b2lj4>Z=x_`07(9_ONYE@RB83_ga5?_o_*;;Vy zo~KKOL@&$~$`K!X3GEpNDAu^fpH0L2H&VPOwD-rot$gQ`?2V50)_xJOqL#SE7VK%F z;}&VRWl*M#XQf4=?Txb{$#I(?(>w$Ww~O4ci&Q^D@BTLVYEkJGCL2F^vv0nA&d>4G zkZ@aC?W;?~Qd2 z$-y#u*s&NLr~FVi`HNn%@6U)dQP|}A@##Sq|8BGaYQn9N&T%`lwJW$HmKr*;z;^iW zclIdumBr?N$`4Ew6kb1 z`-pv4MLoAIf4(a|V`oRTXM)WI)F9K7i*$GVh8~P1oNZ6`muBou2A-W*QZuHLnmV?} zDV-<3_ycgIVae=U9Xr0&!Qg_YoZ~@)ppU^9sg>-{XKtRk@+>t7~kNo?K>&p z7|bS|p1@Z>%>7cc?mo-@6n%R@c>5SwQ`p^f{mx|3M`JD{Ii_~pxeM24yx&JU^GvSy zA)N?huxAnV_v`Av6#ud9*@cv4OanzDD@$Ka-ahzeOAq>{&z1A2;4f}#4yTOAH(&v1 zUs9*kFB*Q_U#GiyfuHXI{i6H)l>m>c(QpCFu{j0p*UwTC+zGUsr%#uyL{ z_2a9D5LmKzcgLwvalg?LsT=0K((N){@fk3=(j0-uTdkp1uKYeoVcl2PJ#Waq%uZ-6 zux@l;)+a|Lvm`g`Rq21OEzk|no@tKu5R?-7RLiz&@y)PW;|ZXhRZzSfyjwaMu=3t3 ze;yJvQ+vFPO~BqOrHSbRufs(GL~9C26mjAIcx?pbMZwxeL8+O z4$tYRGMeEO{B;7H0{4dPIjL6^wzCa?YRE2r48i^G6TY;>${0z4gB$>_>CvG!V$?|rIP!B=JExroK|w= zUXNEBA8h%Jx;HzvpsB36@WTu_faeU;j=Bk%m+SHzQA!Qnnh7i@VQPjtO})A7iFzb>ZtxoCHoleMjzv)lAuLN?1F-v&&@$@WgJ z#(4BIj-+K+M>n;WD?mcaJ8 zXt{N*y}!D<4V&*Fu?HQ>MakviB@H24TGfjlEPW91+}5;;s{@vP&S$e#Hz9o{l7T*I zCk+2Ys#LgFR{LuRhr!2xijzU#bh&aD_*|aCi$+}kx~x+I@|sCr1NQQoNpsGpUU9g! z;z7%#h_vCdt(ih#q^d2OQ@(OnmhR!AXHL(njFfC`m#bS}WIhK_uR8GFx1x^u??30-jH70vqe19#)6iHQTKW(<_@Eph_>OLbk(1aOf2q=qDh?+ z&0e!Xp2ajFsZ7s1tUIts$Doew&q)%~LeXNgk_1Zl#jQ+V@-bBlAaQjtWK zG#q230^@!muYrcC6U%WpUnF5QE5weGj_(=Jd%kWMt%xmO44I!y!$bp(O@Up%*C#pb>5CW7K<7aAa&X_sM>(>I| zZfd3&2qlp#Q8NV`VuhNf3RJ+MK=PDo3MF4h`P0zE48~C?-dF>}vi0m9fnl|yLS)n~ zIT+-^^h4wdchL*>f$<8@_KuNXrPGn%Ht|zvNiQ?hh&lwEp`!cdF6dL_1ybPZ5`$>~ zi!pfnY_GJo+(C6RP6~0ap}CQQhpi+;vZAs8uWN}TTLb$fLkuf+`o+1yi$!V3&(8LdJzkuYZaCjwX3+dD z)At1uXzorb&*sPAvPi*sR?_bB=!xRug0qtKoHX}s`q$EdEYBkiq_-brIwzM51HzuP zqWmHj(vnnHLE_Jbn-82M0<=TmI>%rq9>CFvbc^)Ck&>TZ zbS@)x$@#+u>9(O)PB>{P1~RRfdkWq0G;3o`dvdqWQ_>r|4_U8C}pcroN?;-_p?L>m}SVm+Fano+OEr;g4;>?sn+*D zq7M>1f7JFlt03>3@3gwm9V0p<>Y7XI)}$mh-7_AyIUBOEu}G*(5&lW6I#^vA1(vb2pX7 zo~C#4WgohC(O4>E=?9)2P5Lv)B_`Qc)s7gXC6=w`HOJAP7(lj0j)47k&gGUg#B?f( zs(8p%r8q|Ll9+hsN@IpSrTKlQf;pzs6pv1HZG{N&hLxw!LPp+(?}t(io}@8{SvR166Xw}jMw12BQ=2JGycHS~znG6*6919} zn?Yv;P@(U@0HG8HF#lRO`jjzQO zbB+&NjvZA>yZJkQMw)fS7+Iz!{mT|8UFUxA%f_f6a4<-P ziul!3@{mqa>S!#7=ThQa9<2zPpQ{-PAM>8{Z_PPpQO7+Ae#+oV1BL&357B*kXGMt_ zq%XY{3KUIGTZP~j(yG$Rp~PlRhToP!`#Zo^%b$@Ry*Jga;n`GH27ZiB-fW0A?JeI7SK40n=;rfyK0U`H(r0%V z{_2(b5yK@0Gw=d2h=OR2`HXR5P>D=e03A?{V7WquZp_3LD1ST!6=z}#LVMV48t^oy zzlE$U91!T~#%p^RvrO^l%Nc(;=B-wu7!`FKd5G7MQF~C{zHp2eNIMi<2WDXS0ffJh zeV;dQ4fv#*pbBPpUcYX1MsCdj=Lgcnse%UXJs&o3qK!0FiPXl6qa~BCS7y<=bDmG3 zzJ;^LwBeXz^X#nyGtN2>M@Ab0en#&$g6u)gIHbIj(o>D0VBw%s{>0siz>9&Do}65D z_AP&j>OHmUD&2~p&12b++bHrd1V_pvJD|ZIK3Bp}O0Rff9=20NIpkVwI7B;P_yXi- z#cp9|QzUI2j$UVUj1eIbP%bkllgBEG3GcXN_h@wqjLs{czrk$CDpgM%1cvp>tD)9@ z5B6PTbD1Ks`bP<{EZpLjqu`riiH-LNeF^H8e@d)p31~#hKX5?D1iUE^t7@hOnwC2VH z6>Om>hFX%cSyIL8$A@Agf~suAxi*<6H?l=Z_ZDPG6es7HIj>%IkjN02!JbOdI&47D zCXCrUBrq=NSCT4dw)KGbGCN#4Pdc#t3OEr-L`TZR78u{&21JHpZ)JKW+5`?2?Kr2P zEW0+VclZ)%JB`MUk`I$sa4+W`nH2t^4BYVr65uZt{Mih< zEt$Qhsg)h@COqbpl8|JP>`)d4ZU}k!d9etm`>z=3AQTp?>>Db^G^N6#4ChgJj2Tl3 z{}?=Hf;k6AzlhVb1Tllo*`%;JD<6niQCM23eW5?{Uu@vEbtgr$U|4iH7&uj5DLW~n zGev&c>x!=LN3I%R>TPV^e7-?cEqbRO2C})1Nn|Cm5Z&M++)8oOPE%MG_F%8gPyW3D zLfs$`TetjCWMEdOjk+VJlRv}}yh(%U2Nt%L0U6{-i8rD=IEcP3v`g3iFqC<@1zsn6 zrJm|B=5+5_IrahE`|2X2$|n7E+Tmu;xfMO3*&#kk(VV!>cds`-#i)WVosT*Ig>AXL z!a#Glo*}~SE2(kUEtCN5FvF=LMb)hFUZD?{Uw;-EO`{ysp9$3?^ojgWMTt zl?6vwh}TaTXTr8YLZ=!5dzY$QMUnn`T!EB4l)RxvD*b62u@i(|#4cL-wotXyko8GM z7!uBl@QkvKvepm4z}@hO>*BHEO&6F{;C0-K3@Yd5<;aYS5{X=V5{lXU1Z!1H)4mFO zq@prj9o@9-eXyA~_9p%S^9l2{fXj0CMi@B^3EHNl)bTi)YPk3KE6yISz-SFJVX_`` z`$QLI3t?V&T!EdsN5WXrPjp75#hK|Ryyoeds%ER~gkm8oV*XAps^~9`SqjQ; zE5t`szS@ue1rmnA7&aq3w;8w%$?d{*&Uy)pdIgNi!#?84_zmQ%*E2Y|c~!2dXhRsC zo(+DrsA|=`2I@WkT*xwpUnH140OkH#Q22CB@_XG%RlkJnq(|Rq~^< zmqF>i(-G1L>3a0Tiu@4ihOPX|bb?jApEQmHhvCtPrq^}%>%OrV;tr8Fv2#2KCq*va z!n9WhVN*fy)0YWZDYp==pmt6Zj3Tiqk-wWG$q4f z6cSTf4^qAYrFMT~lDWjT97A;%3J*uoJ;#gn@npY+&|d@NX}l*rN=vDs;QIICDn3y8 zi~K^Xi*nLH@TbDuU>!--d@UE6O^=M;qTN{JFCCM>stQ@tfWC)H>(|yZPrvg*Fto|2 zu=#|gJ$U?hK8-wC4?XvzaQU{#OP+IE%K>Ezn3*5#Py9xtH!|o96=#@wIST00{ek?D z=##7AAL$`1M&8oBmP0SPxQw8vuqjs0%M+XRDvVw5FIOE5c3{Cb8=&rPjt!&da2`10 zjtlSr5=~nE#5}G^_D+|nnm(Y41SedHbj?w5r>&P!8YeBtb3;UELF`C#=!kf3fwgVd z#~(k;5`3(T>G68oyCsu>X=X!loUx2LkGs4N#W-K#;TbOV3ZbUWAZNtotBDY>-K`KX zebSWv(NvhN$Uqs+Ufx0F;q3H7F@6prWPx+RVV1$;0#iPNN}am=?D1?>^}$>0cr_i# zsGny(E+5`pOnuBM3SZ~RM8uliKuxKq-6?eo_~k7=uhJh%wZNLe_r6v;?;o*^|W#$?#Inwh0VXFfwNbtafi{sO~%2%JFqieo2lSq97_o-;~xc$gI6g4jn zBv84QuX}KKfRV3Hc{Y`x6X?1W>Y3mIrCLG=4RMY@J9_D#-6+3~F&~?0QTv}N*tgr~ z87-=o`9z+28Lwhd1!7leH}l=DelJTNnib4s>~)Eb)$kYRF6s0gV0J`8&UCdl!xE*N z5%=wamX2nmu}B8pvCR`cFjc(zV*!b#~iC;#rZ7C?B zbnW#xbM74-GpnbV6g%|=?17pB{K1wQs{BDaH^Q6^?rB@;5aeuf0)9X9X_8H?m0Rmn-#-3>~srrqjE;88A zz5X_13L0924&WQ{JL+f~_?7?QI@VpCopA_D`z-166T5~ih(vuqa~ncgmY57qOnQfd zV4LO;=M}dRHbQ-c@WcqbWgw&T8`_GbbEf7mBf|1Pe9}zJ%Wn=79TrcXtC-oTJhNlM zBt^i1A{eJAj46gza!dOJ86>lfWDqX?60vDRG>Q!Og0|OzOc0@!L&~_m-y~#1?~lOyx-t9hUZoT+3Rln^3o|WUV!V zF219KDmc)-S2&oax&~vCdGGsn2Pf!2oKe_+x>&lI-+7^G+8oogO)OJ5XwenhEh2kh z)t3d5QG5YR%s=k#a}6K3&-llxGD-7vgZA9Mpe8g=`JOT_Xc5)V8d^i`Huw);o$P&V zYM)^VQVbUNcV_w?5Q)yKo`15?BHj!kdEl)0l>FowbroVnFQTVMJ7Rkm(9Pamw@BYt z+*`sG^TYj23DF$>^%8f|VFC%|F-jK5-Wmt~nJB7FP;BYnwQY7j5$q<_gH*Sg8 zLFQBJL4J%nNlW#tS^k+y=U#`!XdAo7^JlWc!mEXDH?b}!P z%!`tDygseZ#oDU}6&W(Ob$PszZ*;xM^k!DuUqFiDabi(2s{fXd>{n_sDdIY-2rue4 zi;fKA3p6zM^9N=o-w>)LP(8TI<{jWBGWo;93gOothZWI0H{6cdfr}SnxZdO8U_^?h z{IaeehTy$tC?#}jSW_`SBg*Fr+@Jv`ex7anm3yjvf5Ko%V}|%-;H;*=8gkO~lwaCV z(KBOxR@28YFau!|_seu&e@(u-1CwVBG_)_1s96kIq}{fL?S|Sr%8>WePjRaKNdXyM{T#Wo+S#k@ z-?Q~&?Q3voPH~rEX3zG7>q}qsQr>GsaXw;?Gh`mok!_}|c|#)Cz4dAgdC;5qCCVKq z-Op@?zB=} zYqo8d|7}$9kc#4zt?u+%ZuX<}=5L?=<)!N688Gesr}MIRwjq>rfE5x|6qI{hQTtM^ zue;UWainjp7P>4?!i=1eC^BZbHqG@svirIc!&^97{Y$Aqb0oY-WqzS~@S zi}rAuz$8Ua1}_mM0&@yCJQ%%QNQr}0_6aUtg!z(ycTHy!dnWxNdknYPOy2$enNhXv zE+}i+TZ8`4R@1F5O9bD3uBq;G?d?Ncbk%Kr()V@{u|qps0MhrUBrsq>hJWtPzy`SkHPZO?2^YEo<-r|?4o!3cgS~|ylcipRY;I?G7s^cy6DS4y!5xH#jyO6%3 zW&h8HvUiwbLre7IcrULx%_Q=UVOAd!U#}7!mXZGyX(N;KD_;>=nQ<^X=UEtF{n@JK zCzzS3_8<>`zp!v8_C1=sK!$VNuT2#n@MVx&E|mBr%U|k_Xm@_wKg8(roNVu5E4H?nszs+snFZv6{Ci0g;Nl?aHxA>HM&!Tb14Id9wy)Q zNQP~lCClrq7*=rXwk9<0qq*pKV?)2{*!rj`@chUUv^Vk^Y~;#L0J8~er{v@Fo@|19G_>-m2l(253ie0a<##c(y0c|!kj`=3j+ zyD0|D^2KkY0UF{CU+eSZZw?>lS^C$U+J$JB(SORJQaCm=KfQc~)?@Vaa_SlOj*Qe| z0_gOO?R9B`jGDtgx*70!ko8sb&VV7VOM-tMjgT6p?tsp*)#X#}2lr|ZnD>QMtW;W( zCWDucHEzI0PZQ|3Rj0VS&unW*$?A${4+G$7*JY^I1)7bd9seL^{PHb+_|F4kvY~*Un^(^YyRP{)5y1S4?s}~b z^=E3wnW~ji6`%Bb9_}ptjYl;dzAtgqU$!*-(B~iDH1zTB+uZqO;L@sVp(-To+Tfd?%A#XjojutFi!ajOEF;gSRSnWpKpW-L1Df~f>KKC&8bg?om@=y;>q1z8sWMkzZ7_J7w&5Lp5cRV`|cmk*ve6*Tn$3jv;K0Ag}W~odv;1|PlP$p zoAnbl(u({(x4O<=D@B$yg!%WB`hh4IeibMGA!EWEVo*d&kB zA}i1Iew+=N6V1OmM3a%vGy49lx%qgdPMN4|)SvZFD;We9X^v!#6Dgm)%FMrsZ4bbU zpZ*3q9E8#0@q25dXD~l|3TsWnA7>Irx_b&xHX7d5^Vb?g3?vn9)mC28tEY^qsRpErVnHF)^d;{EO=>5^>wEX^Io5n_#QjuE^dL~dVbd3c5>LPz=ZanJMgcM&Fe9Wte8DhJCx$DJ@vWmH!>i~*)XjbBsRz5&2etV};zg9KM>%2lfaSILqaj1jbN`{`|XMbc2n}c_7F1 z>l6S&BB%kqeMQzCDFt!cymv%DU4z+l@qdI>b|O5D zKm8x6_M!;oEbEwsozcv{kme&wuy_fe`@ClK3f4>xISHcX6xgi)wfPsI6fF>~Jy~-d ztvx$&t^Awr;|19_W#?jC;y3P>t1MLHGy1oT2)|3XM@3yTaso8t%gP($d99h^RK6Op zcN0BaQfMnX+C37eu#0tOluC>*HZy-c0~Xra9{1a*rnQX3m_prbSEhx{Cm*EAbGEv= zIN!p35nhdDQ8gjN+A@2_#Y!D02WCKeMdd@asYE!W9df@L7($Lf{s4jZIK328Z=r1y zQfOiOP8fUcIM=&ckfx_GoZdiB|HIu|!)+t;YV7u-x85a0R@Kw5+Ksk;@T+#NN%d_y zfhR;s8wAQN2YLw=K-Ppz3waf^hF`P`{|e!CItD%my$O;%&i!>1yUd+Ow@OZYN1|kH zz8^>*KCZGbDfdhfEg`t~+rSPR12W49n^D*}1I6L>vYF_YZzknFw`l?xDQx5;+GJVH z!ugLcF~M>^VB@ykCL1z)hrB8aGm%puOVZ=Dn5w!+9iCa%q#Y=_aibvq%>G*;kFTPq7vt?1c zPHPRh({%(zKU3&duOhcN6#_KhxN`fN!3n7#4#9c97~*62#rk6$$1?u7Pk-PdA#+te z-=M7|Rv}HF$v?hOJJzTqKeoFJYB#*X@aEooJ%I7GN3AwgKXCo++cvP`1as0j5omYc5g+k* zv-FbPe$cU>)+S{uw9|p7WX_hn^13XaM{`aA=A)%@2^#I+7Uv*3GRtB&6b;#KkUZkJ zIdYSMkj#AX>UZg8E#P`i?9j(z-R{vZG8c_aMmh&u23w;=o$x*-!zIYtezMV;hULyX zWPt39S<{iZAE@4Ap-V3-Kcv&CLBEJi zQf592<h7<5SfYuh2*+f`Pn*W|@R$9ig%UC5*Ez|)@$a>ZXtnjh!F9SNL%PQDRLTV`8s zbD#B4bJL#*;;CJsf!0oqujzCeq(qf@)RR|#NfJ0d3t$h(09!2RL$Q6&-KaL;#0l61 z3l;XqeqFrGlKPQlNs z(EVtwG^-pVzR4{i--cDsc3?AH1l%^^eB@l@lM*=F`;HN zOq6Ai#TGu(!Q=k1TpuHRY<0G4*aN1}E;129wF2o#=+R z3iH~`MAhZS1otf^pl!)nrT@u_RVm=Wf9{b46gqC(`g8S6qGQ;-RNuo}l`CD9PV*f} zOE+fC&b!muHM*#gg?L8hZv<0qWt2abw!4DiIjNjH5h=hFE5Yek#iVi!*S|tJe~GLW zT+xW(v|uqSqBWU+yR{YE0<0R+(g%Kh@pS*P@PK)VG;R7N_|fqg;K@1WxSbMUr?DfU zXMif&85qg<)52@`<}P(5&{EsJu)Da`g$BK@ zCj8huqhxn^_FrA)*0CPbTx(~i`?Z>^o#j$)U19OKz$Ph83!`|)=g#du^3xBa3psft z)+&b{wvZA8=FHu6cMqfi_`FZ%>;lZ$qDlbgAui(GK*OJj9%-DnIy)R}@L^6g;v{d) zARM~X<8TC7k=b%g!qISdzY#15iliUVa znHm{pgojActhti#khih~waHs7_Uoib%iO`%P=gHf2P0GFW8+lX^sov}$lc%AJ;Y@Z z#X0#^t=j}y_aK3_#-M;ox1#VDM@ z(+{eANCVOf^!H!D4trxR`P9oEt`MJoWAk_@_OM@MWux8d^hNy@_ha4vQ`&_ z?^+kIuTJVXS-^FD%$y3;yVScId=43B(vuvLYtnp|zkbERKDN30_jZ@rEy{UlWCV$HxC)o$q*(>i(b5bo~9Rvv2g>IYW0I%X4arT;g@r zsdC?v=V==B$s;%3+l!4sXZo8mN#Zbbxe48 zLka8?XjIa)xORhCM^kK3jOOhn;8j?SYzNB`9}tCKhl|q~AgbE*<<{DsGs1+jXtwRd7@e)#9J|%iZe+&k-=BEJV01q3NfozxpdHV8pyi&(;E@jhv-= zgqnB9rBt#QXpWA2Kqpc+>nMyM*iqJR7X{6=cg`QhH^ng+JZ;uPxTKsuh6m{yyFRM3x?kjo$%2mFS4w;DO=joqTY3}dt>IAm%6y!Rvi5hO7 z)Eh33;)VG>z&>iHKQEj2DTi{-cChY;!_9_1(&v2Il=Tvq_QwXHtKeITQGToiy-7R+ zm-d<0O{)4MJyp-FeTfnLBjetaQA_%atJ*th_=>0gx*v-CWfh05aIY5>(H2~#uBrQ- zMPFJPpMUVlv>3s!yxVN@_2fd{{o+R4dG!XdHdFP`aBj%t0?J0MfuLFxB$HvL|uQeJ~Xthj-JR! z!4Q%6nB?i$my3CO))IZIYomJG^XqqDA{9{)^vjCbh3B^HGwxCW zLE&>}^`=oGO-*#PK(k3Yjo(&rp1*KdmeL}$d>?6}8+kKyIoY*FChUvTP)CJ}uiVvXMDbuML>s4m88L?Wvi{By{Rnr^wG)vyXMcpd&E)^|OwT)UpCgvK zmmL}*qjXMP2+7G1f64JTjEW%$P7Nxr5~2-CuHkyW{rmL&{Ci$LsI&&=^&+GHXF4^3 zk(>BB=hN$ZX0Fx0YYv)3`C<;&u0+7rjw{U1-AZ;3D2WX zwEB@%4BHoCKjaO?B}(nbOC1u9xpK>?JuCQB9NP0r^50L|9jOX1UmXOmL{Z;}^G?F4 zZD2)fqzlYT(56>87@qiOy_#B>=)L7cP2q-F%D>qJALmgVm%~_Gv7*!;P*{0$&?2VF zGB+`uTJV+L-GDoilADiIZ!Q)v5)A90v1qu#ALALm*ve&JV&7H5@a?OWLnoq0nh*9kmlEJD>8KT((B?@RJjHmGA3#rgXwr;>(oKBP)@(? z7U{+WSZd)hk9@r{j)q3D!O*u#i{pdpp3QqH8)*J+fi9rxd@!N2HdyO7f3YLjh}X8%wV|@yd)x!l92!8t zwEI#v=0H;g9dV5aM$iVIbLLTzxLBpmpb7o}zAxPsebXs^p%A zjC)^}f{{gOaR=}lSnfYmy*oQ;6v<|DxrD!xU=1293P**MT1HaYyneW(a&^I42cZa7 z+TvB;QJYd(48BJ}H{oNU4ZYe|x;guWGx!PKXr5(Szz0@wzlFsitw!7cudA^cLZ@;& z)gNUxa}zUl9dQ-G5-dSavx(MFdb--tUgkdIz}Mu}?D2Lt7}Z*#BGBNqRjVq)2Z7SY z#ukTy)sHsAE>PT1;Y#h~42DLS7O7fXol*H{|AX7@r2FjHU|UP=A@8($yZN?QNO40V zD?LI1)*(~EFgJvtw*jX|tI6#|xEE?H@=Ua2Ja4{pe#4vN?2%?#Gr8M04Q>d9;H;2N1MSrAh7a! z<*J|g0)9|EJJh=f7%O>okgh>=<=vf3L(Q1`mh(A~fz)s#tuf*#?bn`f^tm>PHsQre z$wl=Q3pZvfF7>jB?1Tk8;6H4Z)D5dP!B5h5)pG4(Jv)oB+4_nnDsHv`@K0`+?S?ej z_ct#);>P^I%SbdQCqGSbL9S}1ZKoS-`m}Rb6=KRbCf9&f^c;Yp%0i_hhakI2qnm0A zr%?-cCR+2kJ|Dex^_fy4PH3CqTjwXbr4i#_C=UM=Ko{?v4+x(>YZ{rmefvL&Y75XN zwPN5)`?G8fb}lFjS6wWT9u-5A6s-!noM(YQhrdH9sYVw{d0NH~)!L#~pa4*Q@q;&V zl3*k07%j|4E!cr7B=+1iO%R1Rw-M+XhOa1unN@{?rv6eT2xS^1u*~GDY8`>D^4#ib zykaK*qChj4CKy7&d!kwgg}VJU;^C7gqrx?%9I2(nfoH(yfuWx|!H8^H=H|A+u@J$D zFCasVGzbQg<>=!WfPcE5X67;ohLiRSDN&@j6`bRm&;V zHguww2^KkbLa2t(EP+O=u0_f4t55a?1%_IvIaN7rJ&sc3LH8=&nom9fN2{zyda9UV zTv3X5BX-l@qMc@`;%h znLd9gmM&m(o<$}t_;OHVi*XCPbZgA2srHG3pu^YZJUV8gHya`a!0rr_u5F4DU$9nacBJ`k?|0oiKO7m zt@3Q&cX+%jUKX`Qa*Da}!Md(lpHqC-U8qD#WkE-+(Th$W6XpPgitYwxR#s2nS}E1y z#x>zz$I*moW!ThN3$Wbok?k@5j+HLCphrSbiW9dcJrkWhtIzFXU;nK~{Uq+ORGC1a zas6hNi`ty&H99h&0>PUBXffg{zwH4%`gG zG_ecCow2d<$J&F?GuH-$pkL)W9tYLCDkUY)^_HDtFnU3E+0Pn09K>46CaT5OA>5vM zB~m#D{sdD~uu2kMyByle6HzKMQO)Ocv9+^Gjt!9pJFW%;e%0fuL{19`-sk7#+mdb% zVBSr#Wl1KO((|_A9kM-i8jLZD*opdJrTVvQ?(DV*{H1IMmGvCS<#!Z86~EIj!nt*X zeLE@eT&BiT#mcq!x2NZhpWSNaB)9$aNFAlP*;zo7LQjwaxIeO7^EZzB_g>V|7=(U& z|0@pjoRMlR6li^p>KN#W&_lt+*V`?;(#9GV8Ydoj|H!32YII^&jV%vjpcHOa*J-nn zQQY62QaN3AHGD2&UMouPv=t942ivihPPSgT2Vp!5jVd`uZc*N>&FbJOb4~o@Ga;#4 zJB6$~(1~0CQP%nNB;BMyP8+Izt0*Bf??TQ62Dh-OaV}xDxj+RdVPmq?L2Q@HtfPS= zeC<|x8L@CA#eK2tHmk;3QrG$Vf$pkOjL||QRCCCIB};UGBk;^tOVH~p`cjLwC>fP7 zMDUzo1>Fo=lF4_`R@-2?-Ix*9(sj@ENq>Jhv3I=1ckpyA>zN({$=lNR<<@7(J<9UrA9#L_96H$=t9 zF-A$J8{3Pfj9Ya3#4IVB#mKZN1^Rlo$s=a08xZdL*%12~Yu#c>=KJOqjgDAeIjQia zwKy@5?&sN^54n+6KYi*dYZ2G2P@5dS5H$|R~^F;{W>grhqcb~lYm8G43l5UUJ zCc@*zi%x1$9LnF@|n@zkp>^j+n_RI`pMV3e8zA4YvRk-(StC>HYAWRH*x?>pj_39! zi+HlDD4sr8&WE?{RH#Cc`ye6Cs|_sPT6}x2ye9-kTf9x&kEUiwsQ5hkMeBI6+XL}mUMbdrVKvk}OfpPJ$al?J?(}49g1EtJ!51%1Lw)wR?S={3~q%VXsmS+X$nw5`?CPNVeK z=%HwD@%pTNyZwn+`=|7bQDQVXT)b0Xvc$62UaNg(&~prKr)WN0ZDY>mx2&ACecoDi ziwV8Zo=%|1+v|?z5A6~#=7L;8ch?_n6nblm+`N~ zn;1o%+ijG$&c3F4GRaD|od;-A5;jkNYpqeZgVW`m)J|}S;F_B30FXu0TL!T9bgfH~ zBBSyxlG(%tD&xInbY#%hrHPC+*G$Nh{)qxyY)jJ|76x6lmK~%nONQQLb$eT#L%(FNt-LlH=;!Ivzjc@D{98fqDjK+=E`wIf zHEvH65duO=B%_5Vq{cPQ!k+D0$R2}Di$uoW6X1KMtaZ_15A^G5j2&k5<#{;=Ht%+> zlz3Jj5W8!36Z{)UG6mv}Ojo|K{f$J<}3L~f&AF8_@Cuv@Bd1S?p{wf3)>O?*lf2dp z&D4(C@Bm5zsx=cR{b%A1k)raWbwTyMkPuFYwvTKbAS7`$w>dR-vfM4g*Iz9|)DTQR zoxo5={fgyPntW;4jncRLeqzJN#M^r#v$eE1lhOI+c`|p;+(lUnz^+-9PAkWi48@tDa3n29!M% z$c;YGauqi3I3SNv3Q7qo--a$rz8^m`cJfZ@p?=3y3T30E_`EHC=QW=2-)>b8Ek(RV zp;Mxr5@9E(faFJ%HycZ=O(Kj-Hf5JFLxQONRZsxp0 zr)0f`sjY|IVy+8k(*#+ygysqiG}rGfr!S+jce?B;rC?cfZG|+n*!)Qkf`<_pOqeJLS+}-d~GQ|(y%!{;!ONTfbM3kQxuLb2J^q*BcDU(Lyw)= zXbsB0(Hc-pi)#m<~QdW)l4E{gw%5fv45yI2imlH)QP^jKIc7Uc(5W zDEQ`{XDgfLdsY^D<*<*hN`vlD@BU#;HBOLsy_& zF02mBE~jVQEHl2)=t+sJ?gorA@}f=FIu3s1Dckb9Hm3?b%Nl`?TS_2(g*-YdTaoqxB^K zl(LJas9T8j(BGk72s4a&nJoX3i=!<0i*%b<%HwpmTL)tlP!UGoRjzGVk6=x#anU!kPM3WAJ9EfUI)(F>A%?`U}9rnGr3JcB~@yw z+mn#oVnFB)@5D9M#RZA8P{Dwd+xcv}if+xVf!o2Kc^QzR;I%~e;C;8{woY@z09)#i zX3AXdvsQAnvdrxP#(lN@y4f_RZ#5bjInutld`MTOl`oX2BvzS%NuFo%nvH+98NPKG zsZdx|_E;|=#GLV@meN8VxOl6nP-Lykj6Ux`$B&BnQFHyY5-mft(7p!fP*c^(~nUuJRr~dsd}zC1Ri{SeM+8`>b}d4akTH(OtAG|H1yjG zH1OLcX|cSo%5$~YfJA5SPm4JoY+RnsiIlpstd)^B_ERy-=T3|Ht9fbR%PgO(8iaS( z1;bcXgFPp_P7Gpyf+v(@n=x+h1$Sn5=^5OVZH~Fbgi^*#P^mvf$TM$GjIh8$o}V1E z|0w(Stu|m?D*2)6pF=o0&*5#uL1+jkJ7r?Ax z62o@Yf%h$&48z1p7ddZ1nx8PIxO97?Q5)sZcP{gre;djJDh!Jg*u!F8&t0UF31lD& zM+x4!t#(#jr+Ko2%RG+Z@utm9HSM>-H zUyA0H=o+IHgKBJ_;8);2TO+IN0-dn1(1V!kvs^F=&G&)qs>ZxEqfJwtOB!z;Yd&Rk@zbAEZ4n}V^ zwXhCQFHyS~aJd}_{aC+z@;GZ*!cx#uf13{bVPK4D-_wzrYuDu zS#wh5CgVite=6`QRW(kfKYYskfxSSvv{#RQ!cA&7KvUNGh(g!1l|494Kgh{KZA>1v zG>MF2KE4@gxo>^iVhR*iRI1LKJF9?;ge3Hm(*4%U*u-JV>+;zafJBZ&WQht|Na(OU z)=Szc^ZHcUcvf$VO0fw4KqhoH)p5jt?s!V|lCtAH9crPULSpN8K_?u?`n2%;3@bMpnioiQOFB$bO zfcXx$jq=^49!{H=ey%ot#0C8!7IYv_QrUE0-ZA+$O4(8-GGKniwk@~16Xqthd)i9X zEXcy0JB*XxsvV|y$F^_ZSh0rSYPREgLZdG)Tb|RKvv{aw2CzKoX|D6RS`*X}TULuj zgzy0v-6`^myF9iR6b@c4eAVcA8Il3JJlh^C&|r9-oYq-Qw(mI+aSb=q*hZjW;ZFTc z^^q&pKi!Nue$NGTr08`(k5SU6t+Z1S%FQ1lwXVaP9%{jkHdKz{-Bmxj_Soo^SPiy~Hdjy9 zS6#@e9S>wYIS1eAw49xXivpm7^4Ucz{OcdNoZ6IP7=h)sSj-2;xR)Et-RRp#Ig&^j z5c1GtSB;P0?U4BJ%z!AM>)TG%DaHNU9dj*8558CO`MI(5WJDe=`2LVS1FB@-Sq?}g z)VO9LmlHGZ_KErHD(_6IHJGnSUvyN=tjVUWT%2PQIpL=U{(laL; ztmLa+6O*r*IX}36V#8fZo^ufm%k!G6Dv8Ts+WUHne3jfMmC%c%kQ0vqG8TX4R#Np97er|Fmmx4`Kl1(=ZoB6{($sZR6=ppN5A?wy^A-pXmX8C{j#>f0I=U6qjzL7J3v zct$|B8)P3??#J%^pxp|K*H$UjgDT$GF}*ft{IBVXg-ieYxujcq! zxBui_e?gpL(NJU%k4-)+bbU3e#is98*XFhD{N&1OHtkW<3{jfqB{d-NeVVr?Rxh@T zq#S;gI*1_|gx>WH_FJ5&>_~BpgksD%cvl0s3FGZhMHQQv=1X(j0z?Da-r>i*TRAG; zXQ#TOlI8pa1x~TqiGYipc+E?j%*SnOt*bF>#7D`qfijm>Wac(Q{cYL#Yl8E~PlS7m zpT-41Tg~FjSZiLC`OQdJYAwYg@5p?hIDg77Rjml#Vlf-{*}bo z;55s{Mf(=37MG>i4EPRFp+I6AI&)5!PVXveIZiPnI3H zCAzFR-13gO_y8SBUcA;M$M!)d_4RCC^~WJfX|XglFV@q69uq9K4?feQ3$-?5ThC4i z=~*a-F7P^qy19?Ya-R0XEO9BjS`)9Z`0fR`#JR?b+76z?c=x+o=3W|mIziTz;q4Ir zlgITu^JlOI@j&a>J!0OIX1gU_WmY>}gDFX+W=BNXX^wyiIFA1eY*DKIuE45!xv?*Zq&p+bM|Wwsq8o6tQ5BT8HHMP2h3(Wp<7zExm(iATriD1W(Yv<7@; zP*SR)cta*+^4YXKgd@8*Yv~hn2M0d9rcBZnRRu~AM{?{~Nz_V8r7Ibs$5JyV%QJ_V z720ftRlr3{zM3<_Dz%cxOeLeI4OPSkw!+d*yk%)eTCXUXp6LR6J3N^sK^M|1jV_i{ z5ihVq5^#2q_8oBDmQr>RFX=91ENsN1KbmwmG148Zu;}Dg7t`^wXmb6P0N$fN_8B-5 z;$euY0uShFZbdAiN1tU5EfCDtxZWMaEXE1gTKl%yieyXLDkxZ*17ThMZX=V($j&9> z->2&vcd7-iYL%kyh2*DmZ=U}-b^qkZ{jCA?q)I#;C`S^1c=QX4d3=wmAVX-dYq(F- zWrmz0_k64t>_W}-x+J#N-aJ;9_t+HgEMQ|*cfOOCKZ*%0MO8)%GMd@Se}8S@n( z5@$ek)XkaO1C|~}zrXGcO~7_L5e~|NAd)Us;yO+`4SK=v#yv=)N6RuyAF=w|lkU}> z4#>KFbI?XF-7T6T!dL`4stAQ!t7{iPlzda}@yK4RQ+yzF4}r+>W5brxbeuVF-9nXk z?f13(FInS%{`Sse6Et?+Q7AH4jQwq!|C7x4Cx`D>qcP;%3$c1@S{LIF<>!C7x-JR< z;OAikql5CjAzjWncbyL0m$||ijjn2N9YNVPGFBuOQZ@pH4f%E4j_{>~W_yyvk$iL5 zkm$)P)0!YpmBr^j_~#JfW~d+jKxwlQ@9byqA5a+lpOYdFe7k$NZ>17|xQ^sk_cs)@tE3V3v zPrflOVBsijmbBYOlOaRomdah3F!Tf47EkcT zfFZnCLd7ZG)UC^ZGn{hPA3oUt{_sa06n2Bt^*_j$Y^Ur_>nkItUqy7byJ0C~O2q7d z{S#u*rJDY3IXatS$b|5N2Y72th?6MJuFRC|^PH^K41h8VT+ADeA1~g0tO{?XLZiL5)j9Y%M&pE3E_|gNvS~- z|BwE*os`0m)0z}^KT?N)*(od{D9@B*$^^D5DMgI1t2Ezgr+yktP~xrs(_qBdZZa9B zgn507%9sAblKfv9t9Goe0N&q;?ZkTK;E8St& ziy0)}_{3|An7PprdBsh+HX5m&82U8sD(l4nxYb&qW zk<>d^IC4}-3Hv0(LJrNvBlXq(1cLuE^MEY1H(f`#e1dpTzx;17*PhMT0K{~?wCfzE zKgVWT?R<8p$|*zb*y?LB>-#x9PbGGIHM;td8?WuK<`5-I;Nr70B&?VU9E~$Xs_b0R z54I#QUBoQ&OB@g#&Jz1_p^j@HbpvIY^M2khGZgO z&f4sgP6fB^jq-F!fS;rkFYs<eL)PAzOiKaGF$xBw^~+X$@BH- zZIfEq02El^Tv1usyLH@CRMa!M%;~HX`{N#bQ4Tm*5}Y=bvnqG6jXhH?EG;mnGFY5< z_Ma9Qu&n#0ysIuO;mUW>Sb)MOsoUDLR6NF>gp=zkhm1O-1-Jpsu|ly^%rqP z$WOhz74H}SWt$@b$Hw>{rGzbCj^_#bAG^HCB36o%tr~$>qh^w-S%+Wy`^cy8tL&48 z6Kf7?OPAga?rmeSYzf7gDE zPCGW*+NR<%_`(ndblK*AZdZ$NUs}|noRT(+fH~V(#9kZ3!?U=GP!l8fzR068cjND0 zL}{-)r;6a-*Uc8%`kl!Sln=O4aH+(-z{w|iR$cpQNn%4&x-?f8l;vVk4!Ygab1-fa z&q@Ax|9PF)GeeLeQ6+HzH#%R5$Z_bgEH+$%+VVemCj=S9D7tw|bUYpQeDonLbk4zL z-4JIu^e&nQ4&}97hZvMdZnb5=U0BBYW{KZXDRkZs<_1bSd2L%^brl{QOB%RSCJQjPBUVccg8Sf>tx|iAAn5V^;R%|69oe;er%Oz>iy%#S&H5cfv zb{GP8^3LG{L+HRJ8%(^$u(;$F^^}ASVJX$(XLq_IKTXe`_$=R(?Bu0qtTE_orD%EG zld)iZ{lR&|kD*53>`$+N&f{4?uOZoiVPtciW5H{|yWFR#9I#XJE{rUu!C&`1x1i5H zOL(cms+kw+qPL3pp1LO~&+u1wzpVed9Hy*LOXr+ehqO+cGkT0OK*F7n=_+{VL|YFe zdgp{nA?nM!UW5!avaCIc0|+^+BTY_@nI0|rJxERLmNxaUh2vqvJHVVV8i4m4{`-b= zrIFF-qAjU{7?N$*nGQniNPMVCc9nLi9=VQ!W`BZw3)36=7BUEK>TvXrqLV#%mOXU^ zotFyWiq9yi4t;h?dZph_FK<)m-y7dK`p>deG-qsoc?dVXL|)u6otdCZ0^UQp`NfpR zlN2#NgCrD*WGHa)+tX@E)3r|{hntT`eVqW)>_v!0A>{7cQzrx8!*l6lv7#4hUudNS za{^r1t}uk(H_>0hNF3z16+Nov!bvAelii_KDW2PTbajrX!Nrv_uh{*MeAjktNK3W7 z750GrcG`a8QXU&{!}`+1>3PjV`Q&D^$LYIJ)oP(F4CDJlR_o(Up35CegcOFc3ZmRd zw^aSXRkQm?QLu?qS_h`zo})7Bk5-D1HOZN=z2@4VO67FX=dq?3Gn^c`2lQA^HT{J zUZ_X_$;-c!I70qrPwcFn#4_++QYZngtl|Z zxYC*y3v4mj|Ek%_Y*C@n2A6=s+Y7$v>Wc*>S@sf7vo;SvSt2YGG`9u*wfXR!j^i2@ z;>rA-550W*mxWd%!W5}B9r5lerUkS z>lSwIhNBBWBw{xy&w?Pj-+F}wAD3)IH>m5$kch4Bm-;r4%gSae#e=GrR~oFdx9}qQ zZS*mU6k2YHy3~H@e29PDUJJhEgm?slo9^#7rV-5@_>yRb+6Q)!`3oweDhS8UjY(IC zNA{!9FVN$aBN$7g>O>{w4Jnt}_NNj^cb5@f^9uq5KaoO>dN}p4v&D=n0A{v+u*ucZ z&9D3pSNHK~PYHmHs}~^(=z$=;b)N7~uB$)+)Cfxc$6~q>);89!vA$~K9_lnLe%afFpmw~X^ zez^C1l$K+Cn)?PM9uyDJ7+MCpv|Vy4PS3^>`mf>^(?apw?^SZ?UwBmm}oHw=Xg28HukjXyG0Wa2yAr2N#)M5QYp<@RC-cfkPwaTkQ?_^!dj?g}3k;lpqj-Z=M?Kj*) z9^np{@Zd&$&lPv0b28qc`gFMOB^Ka&QduszBWj?}=UJc!$p+}YU{hMTRm{qmfuIQHN`t~0kJ8wHH7%OuWuubz-$gV3TAwZnFF=Ci+YFz6 zmy!lQr19QPk6nrsG_^2sn(|49tt=DYp8iB=%N?v`-6;(<#D1@Xgkq5`V=iLLJBgzC zQs&CNNUj|zyxVY==jd2g`SH3CEDU+Q8DzYgKe9UsA+2?vDuZAM))G7bTpi27z$yG< z9da*er7~}J*jB;C|3#=a*YaEvHX4*AiRS_PtGl#4~)hitP#H}wYFH>%V5=21ka{Jl)-xsmjjZe$|ZMKlF>P^N07;^zE0xn zT9q08PHM#r4HXz<0nEE%v%k~ih5cT#-w86=ts0TtkRWYm6b$o1s~R3UJC`G7K6{ys z*|!fhhbR!0(k-$S-)H;mWFM}}*H}1HC$CJJx zoZI84!UoA!rR)~K>aE2rgi0boI}Bz zbdNTS_r4YhXz|wvdpJPyqW4vxs~S>dHz4xr`)r`*SKPpBe}Df$d!oo_L%KliFfEDO zd5VrWF(J*b8|V@l8a8iaMU)<@frZG#J>iIV2?$<2h0Kg4@tWtO!R@huknn5@i=U}k~K?LgjbWwY70=_uYQ z;x$Qx*eqy4hr9~?(y-~Qwe{U_upoI$U}8dk(GJ^3(gHr)5iQ ze>o>T^s91jTE~0n7czd``kuQ}eQrjdjSjwJYSyMbo>pko-FRk$R0de7Oimti!80kg z^QZV_F=j|t*{_g*C5K~Q_B_77HNy?4E8AWJvApGUbN@E3uK2L!LadhJ2*`sESzLqa z-gNJk-c7u>s4~h~yqdz0MW4Mg#S>)_MKwJ9c-6>8)gD`Z0gkyCoGv*o^T zn?LMGjJTG(Tydl{o=s|`%hKh?NJ6>?8Ypyc9>r0R$##y?6|x%Mf0Yj0(Y!>w4lwKN z>^u-q;84B|O3-wIO5>gZ&^xM3CB=nh$pB^h?|_3*()yQm+tI7Q(0K2#WB)l4nJ}kUkJQkDO?k)VsH6)tO4R)J57=$42YFf z0OszwNzY0W-@&q-6k-qaD{Dr?EbC>thn{Wo18aI)uZGOc9b#tX6qnr+=zL&B&UIhZ zpD>Z**zl=dgNut8+$5BFz_hOGHWSa3bR2A`<5_>f?Kbemf1P|`Hyx>h!!H=2$G^G$ z;cAW~9}9Fi%sd{J*3WVH427h1a+7o;^hrJ_9G!`dRPhRR^zs2o-y^8L%Li+s6)zIx2lsE5F~Bu~&5J>yLCNw-tO^#9JxXdh18a zMYW!j0_Qlss3$8wN-~1VpV(Ms?EdIb8<`UdaZln?*m=%--612geFI#>n1?34Y3>vz zAd!_&r5Fi=?C@JrM$aDT`=N)XSz49oXzRDGBoq}8R`5H9CKJw|pQou6^cW?QpRLT$ znpODLGxL^)hxW^N*_>@yv{}psrN}j`Q67JfrH*ts{`t5Rsjej(K@81=u=F03jqDNz ziF;l|uu2`#{Uc*-l!{_F%3#jYzLSTO8}y?#`XFO2u@>u>jyb_UEqrx~bU1Uduzvqq zEW6^!MYCNj+Ex~#?_48Ukp6Vz=?ZH1698=p;nDW={dZu4HNcu`ok{9^j?J%SGe1DX zs-Z83w@|zapwyIHyn=vAl%Sx@C_Dq+(pH2nM$auMuj}a6jfR=eeETzYb_Sd~k>3|j zA-@KRy$AGGbHEl8YvWyOrnddS0io{R(}^1oGRa_%_YK34w@L~}K;G#Z7ns5*V%aG@ zeT9hRjQPS?GVMtYv?$%TWs#G?wUdtWmFiaSn$24Ih(!-6F;q&Va}H&h@mcrQufOMm z_H!vrBvD(i`ggaDJ%tAhw*cV_itrtrJn!h966r@^f%#eB%F?W327Q4yX%=rYz2mtP zdf#6Kf`)57w9*dspZt%H9>xebmfO06y+zcji5 zUDkBc>kCIM3BbXr!(|5pfYPkmf=Z#$jCaBMWhVNR3-7!qCablZ*;4>DuY8PH5Dj`e zsrPWtM-9A%3xA@r5oe}L^l2hkPP_x>Qst% z$jILQHRMeG%24tcEJ#UqNfls&a%GuZTYg2Dk}TPJAhdjgdTeF}nz;N{N6JcgUI16h zg14bDI@gr!|A14gs?sl)5l@G00PTiAs=xFA9SO^%IuQ^uwI>%@BgH3I`2*jrXEAAh z2tI-?9EY=wEt48T8|H04?50S7@n37JbFb8{>?{>|^`DYbE-A%W9)>nFI;)UN`R&L$ zI|!J79s*Q{9&2Spaym)4R0c$YkYz)-P8|46H0iJ^#d37|?L}Iugj4^$b0yP1%z!Od zk5Rm?bA}gx1G_5@RQt+sJCZu-+cz`C>Eoa>Xsr2-=uoHB$P(}I0mD-Wp}O|mVbC?d z2RfsiEOcvqjBu0$|4vn?nFGrI8Xo(7qj(clz+5R4gmP{2GB5)*v>xtarHQYu&tc!- z{3vk=>VcAH_OV5H%rbn!haBeDNNY%Rpk53as_Q-YVwn%@zcpZmbUYdXkG@VN?FZ7C zpW%Dz_o;oTv_2ijj&O08K{V5nxgothetjP#(LXpZIiuJPfbKGbmKt+`#D=^h%C&Fy zEFiA{Z0lDU%_A=a-M^BfkX=2nJIJhSy=y$x9H~$%b|1hP^b*Nz`9#|>+bX9(7(5bYW;&l~6=M{jkg@*lG?)V}0lKrNO?k$iX zg6-w0nEU(?iqJc%LD45%>B^q(k{P1XE4MufSU)ekVd$)4kJ39R3Y~Fq>z$x~r*9{r zq}bYl;~u!L(8=@E4j+-mokd17wgkU=Y^b2yL z#Z1~T^_IVrrySPM+{%Jiv_g8#ldkr&+3aY|bwKp>vZ^)b&Yhk5es;ejD0!35`heah z&gpr{=+gohXw#yZeNEnK55I!f8_d^CCkfLmUCg7I1M@g%udmn^t%PU~7i_nI(Q3KH zzP|7_3OG&XlQcs*HlR`y7L72BA}n8GWT9DE+@p^ zuglD||B0R>%p&c_;8rtm&i7io&1vD>+V-Dq>r894%2ct zqWG7l-g8+h3yvTgtQ14-{m+s8>ys2Rmb7cZ<|>VZ5ku4T!z%fq&X;4H00~}mV`4m$ z;Oy)PEr4d{)7O|wSqN`F5nRntp?0I>2~}?W*L}1ZVr)5q&miJS(!^Qv+LPjoE5vgh z@!ofp)J!XoMVq*cr9=%1NHt{PVQcAvYVPcZLC-*12{&A1=WO!H^`yH8dCa>=Q~F%d zgAaPaQ4Y^IgCkuTJRe)xd7 zN_7vv2&n9+(7>)TGJ}3$n?9@okDBdYWnoR}C0+pp*Y3Azb6O$3sRJr14Ob+FT!-HBUO% zRAtofTEZemGul71pobvydDeXj+2t;ovDtW4+g5n5*Gu(AS?A?Wa&+(f;Nn^0zweQa zOXtSNO1lnK*L}M4|AXbXYY0jYaFVNjG%&0;JNCRBL|-;Fr%jcWFy<5xv7c4)LKGGC zNJzzE7mspT0Tqc5=`jGg;oc5?-2~+9Oldm6XJg9{6%X<2R!+QVaM7jmB^p9Ag^ue^ zt=zjS<>z?M+Pz+90q(^i`-Tv5*TkQ<;{)Mep=WR*&3eh|s4=X>|3C6u_ujne4#|5e z^e!K4c!7|wgS>0h@ubtsBisK8B(yZGo6*cIW~!$r`33-Z7oxpoWdY1*|A;8J5H}k3 z$NDMZOK)Z0SQ=a^E4uNoARw=7z+LNGtIgbhe4&8o#G7I8?Yx?XLV+Zh;)r=q_D->K zC2738;V|-Ai$}kNlqI)8QAA?daH5X!f-`BhmkU{SOHASEEMd_|?ZyTCXGM0R3Or znHr^l{*yMfq30ad@|n=9(Z&^-H$sYwk-)cuFsVx(4;vm*(B|6MBKc(pUZO2ZADE8u z*W4L$*Z<&c1}^yF_QS+h`s#=-p4g>3kd-Wfjl40mQ6^v}ZD7@3e=5o6LS$I%S&pBe z>7PtxN`nI6U7X<*k9xEp$}-Er6tos#Di()g<1wKD~QHvTT{Z7 zC8xCKga5Gt!*2Ep3CdK>byeQJ`0r@?f4-Y#wkrC?MZ50MZ3r`wQNPE6ZeMC?0V z%^f#or^xd6J?$CNWp;ZO4k937K>vSDQR+`IP1!k%cYoyI{yu|$wdYl7R+*$$RHypy z|GJ$1?>r35&p5PA9*Fu+3g-XvSz0t5!%FhPKepbxITikA{QpGqe!kxK?kCisc@IVV zFI4mIZ>8+|7wla1GCZP9ev>x-yKiqaPsiE2#%6djoBkhf%44JS{=1#|)W59g?_-#M zMboi$SjB&Rg{R`55BYEKV%SXSO4Bg|2~8l z^rBQV-vTR7|7&Ic*2gfXX{fRbq2n5nQ+|>efx*8{MYo}B%i-O3%@#B zLuS2p9VItcwTo10|8(&sbQPR@`YE2L$aOqZbx9fe)AB)+FJwmzAy zX0#T}|9GH{_?vGYsIB5}THO0(fsM51;$-XRT2?k2l-3k#iEYxjIGol%lG#MjYCqhM z!69gJ8QAVhpIaNuPm11dnpC+`DYgO-4(8to-1GxN#l zACk!a{wdVE?qU-0o&-ise53N)q6*Q)RN~5|e-3)JN9g{c=Rx##kLsJO-w#JlVbjqMsQSltr$zX+>(+oS=v{^F-lICk_D`Bx+3M^FK|*8pJ# z?#K&6Nlq05B-&nh0a~L@nsOLEGMpn8Z^B(`il?g@qnXlFyAi7D( zm-VaGC{qe2!lQNzgsQ%u4E?lTGc9A8d&F$?^iY)aA^h7P#fSe{ESrz1s?Wm3a#d7( zE}!^CVYx};!xVsKjS8zOJ(O~?$Yt4WpffkVx@6Xm*&QTItl5|W^Dmq6xPa)Loy{I^ zq-RwGRMv{Ed8*Sl(>H}RN|=5y@mspY`w)>F*@HeGaJ=QsH%{R2>loSrN)T@lV8*TQ zr`po(=uQ2Unq{GQ28SGrhWJA13@No55~+)d>b`Vz7JLhbZpr1s10MNY z?|A4v)Z{@|eKX3z+)BbM3z6F`TepHYgUnpc7ARRdxJ{GQuzr5YqVgl9kk-uLnU%HM zc8Wt>jU3Lh())Qmi|YS8nBHJc_c2cU5Pmp~|7F=qk;kYUE3Z{bmLIQVC#({CDnR`Q z=Ax1aBobKQV(KW%sqD=LwflMf#lky7Kt?e zb0~(e#Yx07)7&RazjPwJ8m=c7G-ImKJJ58+-K+TLp9ehmDlAR>Hk_2tqdg^xM)6A4 z>79i&>!uH#_wfZ%s1xh;jYp!Cs{zs8g!

5P-fE)`a$l=R80@PGM_%(`e9&4N?wXQ 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 literal 0 HcmV?d00001 diff --git a/static/img/200328-covid-19-pandas/header.png b/static/img/200328-covid-19-pandas/header.png new file mode 100644 index 0000000000000000000000000000000000000000..2981465680f3c7c4391f38570664840216a5ea76 GIT binary patch literal 53079 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

More Resources

diff --git a/theme/templates/blog/learn-pandas-basic-commands-explore-covid-19-data.html b/theme/templates/blog/learn-pandas-basic-commands-explore-covid-19-data.html new file mode 100644 index 000000000..67906ace6 --- /dev/null +++ b/theme/templates/blog/learn-pandas-basic-commands-explore-covid-19-data.html @@ -0,0 +1,5 @@ +pandas +Data +NumPy +Data analysis +Official pandas Docs {% include "blog/external-link.html" %} From ae96cb3c639ed0ffa238e2d0855f644fa7c6c51e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 28 Mar 2020 16:28:10 -0400 Subject: [PATCH 091/302] update meta page --- content/pages/meta/00-change-log.markdown | 2 ++ theme/templates/article-sidebar.html | 1 + 2 files changed, 3 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 5759b450a..064ed4fc4 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,8 @@ on GitHub. ## 2020 ### March +* Added new blog post tutorial on + [Learning pandas by Exploring COVID-19 Data](/blog/learn-pandas-basic-commands-explore-covid-19-data.html). * New [web design](/web-design.html) and [web development](/web-development.html) resources. * Added new blog post on diff --git a/theme/templates/article-sidebar.html b/theme/templates/article-sidebar.html index cb7467e4b..e25cfab10 100644 --- a/theme/templates/article-sidebar.html +++ b/theme/templates/article-sidebar.html @@ -1,6 +1,7 @@ {% if article.author == "Kevin Whinnery" %} {% include "sponsor/twilioquest.html" %} {% endif %} +{% include "sponsor/carbon.html" %}

More Resources

From 7e2b156059559d918647c73f925b7f82d61e76cb Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 28 Mar 2020 16:28:51 -0400 Subject: [PATCH 092/302] quick word tweak --- content/posts/200328-explore-covid-pandas.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/posts/200328-explore-covid-pandas.markdown b/content/posts/200328-explore-covid-pandas.markdown index 34c93adb9..9c3ba78be 100644 --- a/content/posts/200328-explore-covid-pandas.markdown +++ b/content/posts/200328-explore-covid-pandas.markdown @@ -36,7 +36,7 @@ source covidpandas/bin/activate pip install pandas ``` -We're now ready to get the COVID-19 data and start analyzing it with +We are now ready to get the COVID-19 data and start analyzing it with pandas. From 6aa67a52a59aa1ed550c31f8783d1fb2a5647e12 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 30 Mar 2020 06:36:36 -0400 Subject: [PATCH 093/302] add new tutorial on exporting pandas to sqlite databases --- .../200328-explore-covid-pandas.markdown | 3 +- ...0330-pandas-dataframes-sqlalchemy.markdown | 401 ++++++++++++++++++ static/img/181008-flask-okta/header.jpg | Bin 54433 -> 20103 bytes .../img/181014-digitalocean-ubuntu/header.jpg | Bin 44859 -> 18083 bytes static/img/200328-covid-19-pandas/header.jpg | Bin 0 -> 43371 bytes static/img/200328-covid-19-pandas/header.png | Bin 53079 -> 0 bytes .../covid-19-data-download.jpg | Bin 0 -> 138964 bytes static/img/200330-pandas-sqlite/header.jpg | Bin 0 -> 69037 bytes theme/templates/article-sidebar.html | 1 - ...t-pandas-dataframes-sqlite-sqlalchemy.html | 7 + 10 files changed, 409 insertions(+), 3 deletions(-) create mode 100644 content/posts/200330-pandas-dataframes-sqlalchemy.markdown create mode 100644 static/img/200328-covid-19-pandas/header.jpg delete mode 100644 static/img/200328-covid-19-pandas/header.png create mode 100644 static/img/200330-pandas-sqlite/covid-19-data-download.jpg create mode 100644 static/img/200330-pandas-sqlite/header.jpg create mode 100644 theme/templates/blog/export-pandas-dataframes-sqlite-sqlalchemy.html diff --git a/content/posts/200328-explore-covid-pandas.markdown b/content/posts/200328-explore-covid-pandas.markdown index 9c3ba78be..1ffb8c6e4 100644 --- a/content/posts/200328-explore-covid-pandas.markdown +++ b/content/posts/200328-explore-covid-pandas.markdown @@ -5,7 +5,7 @@ category: post date: 2020-03-28 modified: 2020-03-28 newsletter: False -headerimage: /img/200328-covid-19-pandas/header.png +headerimage: /img/200328-covid-19-pandas/header.jpg headeralt: pandas logo. Copyright the PyData Foundation. @@ -313,4 +313,3 @@ the username [mattmakai](https://github.com/mattmakai). Something wrong with this post? Fork [this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200328-explore-covid-pandas.markdown) and submit a pull request. - diff --git a/content/posts/200330-pandas-dataframes-sqlalchemy.markdown b/content/posts/200330-pandas-dataframes-sqlalchemy.markdown new file mode 100644 index 000000000..cfef8af42 --- /dev/null +++ b/content/posts/200330-pandas-dataframes-sqlalchemy.markdown @@ -0,0 +1,401 @@ +title: Exporting pandas DataFrames into SQLite with SQLAlchemy +slug: export-pandas-dataframes-sqlite-sqlalchemy +meta: Learn how to export data from pandas DataFrames into SQLite databases using SQLAlchemy. +category: post +date: 2020-03-30 +modified: 2020-03-30 +newsletter: False +headerimage: /img/200330-pandas-sqlite/header.jpg +headeralt: pandas and SQLite logos. Copyright their respective owners. + + +It is common when performing exploratory [data analysis](/data-analysis.html), +[for example when examining COVID-19 data with pandas](/blog/learn-pandas-basic-commands-explore-covid-19-data.html), +to load from files like a CSV, XML, or JSON into a +[pandas](/pandas.html) DataFrame. You may then do some work with the +data in the DataFrame and want to store it in a more durable location +like a [relational database](/databases.html). + +This tutorial walks through how to load a pandas DataFrame from a CSV +file, pull out some data from the full data set, then save the +subset of data to a [SQLite](/sqlite.html) database using +[SQLAlchemy](/sqlalchemy.html). + + +## Configuring our development environment +Make sure you have Python 3 installed. As of right now, +[Python 3.8.2](https://www.python.org/downloads/) is the latest +version of Python. + +During this tutorial we're also going to use: + +* [pandas](/pandas.html) ([project homepage](https://pandas.pydata.org/) + and [source code](https://github.com/pandas-dev/pandas)), version 1.0.3 + in this tutorial +* [SQLAlchemy](/sqlalchemy.html) + ([project homepage](https://www.sqlalchemy.org/) and + [source code](https://github.com/sqlalchemy/sqlalchemy)), version 1.3.15 + for this tutorial +* [SQLite](/sqlite.html) ([project homepage](https://sqlite.org/index.html) + and [source code](https://www.sqlite.org/src/doc/trunk/README.md)), + which Python + [includes a connector for as part of the Python standard library](https://docs.python.org/3/library/sqlite3.html) + + +Install the above code libraries into a new +[Python virtual environment](/virtual-environments-virtualenvs-venvs.html) +using the following commands: + +```bash +python -m venv pandasexport +source pandasexport/bin/activate + +pip install pandas==1.0.3 sqlalchemy==1.3.15 +``` + +Our [development environment](/development-environments.html) is now +ready to download an example COVID-19 data set, load it into a pandas +DataFrame, perform some analysis on it then save into a SQLite database. + + +## Obtaining COVID-19 data +Go to the +[download today’s data on the geographic distribution of COVID-19 cases worldwide](https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide) +page in your web browser. It should look something like the following +screenshot. + +Download the CSV version of the COVID-19 March 29, 2020 data. + +There should be a link to download the +data in CSV format, but the organization has changed the page layout +several times in the past few weeks, which makes it difficult to find +formats other than Excel (XLSX). If you have trouble obtaining the +CSV version, just download +[this one from GitHub](https://raw.githubusercontent.com/fullstackpython/blog-code-examples/master/pandas-covid-19/covid-19-cases-march-28-2020.csv) +which is pegged to a copy downloaded on March 28th, 2020. + + +## Importing the CSV into pandas +The raw data is in a CSV file and we need to load it into memory via a +pandas DataFrame. + +Start by running the Python Read-Evaluate-Print Loop (REPL) on the +command line: + +```bash +python + +>>> +``` + +The REPL is ready to execute code, but we first need to import the pandas +library so we can use it. + +```python +from pandas import read_csv + +df = read_csv("covid-19-cases-march-28-2020.csv", encoding="ISO-8859-1") +``` + +The data is now loaded into the `df` variable which is an instance of the +[pandas DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html) +class. + +When we run the `count` function on this DataFrame, we get back that it +has 7320 rows. + +```python +df.count() +``` + +Next, we'll take this set of 7320 rows of data and slice out only +the rows that pertain to the United States. + + +## Creating a new DataFrame from the original DataFrame +We can pick out all of the rows of data for a single country using +a pandas function to match the `countriesAndTerritories` column +to the country of our choice. + + +```python +save_df = df[df['countriesAndTerritories']=="United_States_of_America"] +``` + +The `save_df` variable contains the smaller subset of data. You can +find out what's in it by having it print itself: + +```python +save_df +``` + +You should see something like the following output: + +``` + dateRep day month year cases deaths countriesAndTerritories geoId countryterritoryCode popData2018 +7082 28/03/2020 28 3 2020 18695 411 United_States_of_America US USA 327167434.0 +7083 27/03/2020 27 3 2020 16797 246 United_States_of_America US USA 327167434.0 +7084 26/03/2020 26 3 2020 13963 249 United_States_of_America US USA 327167434.0 +7085 25/03/2020 25 3 2020 8789 211 United_States_of_America US USA 327167434.0 +7086 24/03/2020 24 3 2020 11236 119 United_States_of_America US USA 327167434.0 +... ... ... ... ... ... ... ... ... ... ... +7166 04/01/2020 4 1 2020 0 0 United_States_of_America US USA 327167434.0 +7167 03/01/2020 3 1 2020 0 0 United_States_of_America US USA 327167434.0 +7168 02/01/2020 2 1 2020 0 0 United_States_of_America US USA 327167434.0 +7169 01/01/2020 1 1 2020 0 0 United_States_of_America US USA 327167434.0 +7170 31/12/2019 31 12 2019 0 0 United_States_of_America US USA 327167434.0 + +[89 rows x 10 columns] +``` + +89 rows of data out of the original 7320 rows. Let's proceed with +saving this subset to a SQLite relational database. + + +## Saving the DataFrame to SQLite +We are going to use [SQLAlchemy](/sqlalchemy.html) to create a connection +to a new SQLite database, which in this example will be stored in file +named `save_pandas.db`. You can of course save the file with whatever name +you want and in any location, not just the directory where you are +executing the Python REPL. + +Start by importing the `create_engine` function from the `sqlalchemy` +library. + +```python +from sqlalchemy import create_engine +``` + +Create the connection using the imported `create_engine` function +and then invoking the `connect` method on it. + +```python +engine = create_engine('sqlite:///save_pandas.db', echo=True) +sqlite_connection = engine.connect() +``` + +We set `echo=True` to see all of the output that comes from our +database connection. When the connection is successful you will +see output similar to the following: + +``` +2020-03-29 20:44:08,198 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 +2020-03-29 20:44:08,198 INFO sqlalchemy.engine.base.Engine () +2020-03-29 20:44:08,199 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 +2020-03-29 20:44:08,199 INFO sqlalchemy.engine.base.Engine () + +``` + +Set a variable name with the string of a table name you would like +to create. Then use that variable when invoking the `to_sql` +method on the `save_df` object, which is our pandas DataFrame that +is a subset of the original data set with 89 rows filtered from +the original 7320. + +Note that in this case we are going to fail if the table already +exists in the database. You can change `if_exists` to to `replace` +or `append` and add your own exception handling in a more robust +version of this program. Check the +[pandas.DataFrame.to_sql](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html) +documentation for the extensive details on your options. + +```python +sqlite_table = "Covid19" +save_df.to_sql(sqlite_table, sqlite_connection, if_exists='fail') +``` + +The echo output should spin up with a bunch of output. + +``` +2020-03-29 20:45:09,066 INFO sqlalchemy.engine.base.Engine PRAGMA main.table_info("Covid19") +2020-03-29 20:45:09,066 INFO sqlalchemy.engine.base.Engine () +2020-03-29 20:45:09,067 INFO sqlalchemy.engine.base.Engine PRAGMA temp.table_info("Covid19") +2020-03-29 20:45:09,067 INFO sqlalchemy.engine.base.Engine () +2020-03-29 20:45:09,069 INFO sqlalchemy.engine.base.Engine +CREATE TABLE "Covid19" ( + "index" BIGINT, + "dateRep" TEXT, + day BIGINT, + month BIGINT, + year BIGINT, + cases BIGINT, + deaths BIGINT, + "countriesAndTerritories" TEXT, + "geoId" TEXT, + "countryterritoryCode" TEXT, + "popData2018" FLOAT +) + + +2020-03-29 20:45:09,069 INFO sqlalchemy.engine.base.Engine () +2020-03-29 20:45:09,070 INFO sqlalchemy.engine.base.Engine COMMIT +2020-03-29 20:45:09,070 INFO sqlalchemy.engine.base.Engine CREATE INDEX "ix_Covid19_index" ON "Covid19" ("index") +2020-03-29 20:45:09,070 INFO sqlalchemy.engine.base.Engine () +2020-03-29 20:45:09,071 INFO sqlalchemy.engine.base.Engine COMMIT +2020-03-29 20:45:09,072 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) +2020-03-29 20:45:09,074 INFO sqlalchemy.engine.base.Engine INSERT INTO "Covid19" ("index", "dateRep", day, month, year, cases, deaths, "countriesAndTerritories", "geoId", "countryterritoryCode", "popData2018") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +2020-03-29 20:45:09,074 INFO sqlalchemy.engine.base.Engine ((7082, '28/03/2020', 28, 3, 2020, 18695, 411, 'United_States_of_America', 'US', 'USA', 327167434.0), (7083, '27/03/2020', 27, 3, 2020, 16797, 246, 'United_States_of_America', 'US', 'USA', 327167434.0), (7084, '26/03/2020', 26, 3, 2020, 13963, 249, 'United_States_of_America', 'US', 'USA', 327167434.0), (7085, '25/03/2020', 25, 3, 2020, 8789, 211, 'United_States_of_America', 'US', 'USA', 327167434.0), (7086, '24/03/2020', 24, 3, 2020, 11236, 119, 'United_States_of_America', 'US', 'USA', 327167434.0), (7087, '23/03/2020', 23, 3, 2020, 8459, 131, 'United_States_of_America', 'US', 'USA', 327167434.0), (7088, '22/03/2020', 22, 3, 2020, 7123, 80, 'United_States_of_America', 'US', 'USA', 327167434.0), (7089, '21/03/2020', 21, 3, 2020, 5374, 110, 'United_States_of_America', 'US', 'USA', 327167434.0) ... displaying 10 of 89 total bound parameter sets ... (7169, '01/01/2020', 1, 1, 2020, 0, 0, 'United_States_of_America', 'US', 'USA', 327167434.0), (7170, '31/12/2019', 31, 12, 2019, 0, 0, 'United_States_of_America', 'US', 'USA', 327167434.0)) +2020-03-29 20:45:09,074 INFO sqlalchemy.engine.base.Engine COMMIT +2020-03-29 20:45:09,075 INFO sqlalchemy.engine.base.Engine SELECT name FROM sqlite_master WHERE type='table' ORDER BY name +2020-03-29 20:45:09,075 INFO sqlalchemy.engine.base.Engine () +``` + +Our table with all of its data should now be all set. Close the database +connection. + +```python +sqlite_connection.close() +``` + +We can take a look at the data through the `sqlite3` command line viewer +to make sure it was properly saved to the SQLite file. + +On the command line (**not in the Python REPL**), type: + +```bash +sqlite3 +``` + +This will open up the command line prompt to interact with SQLite +databases. However, we are not yet connected to our `save_pandas.db` +file. + +``` +SQLite version 3.28.0 2019-04-15 14:49:49 +Enter ".help" for usage hints. +Connected to a transient in-memory database. +Use ".open FILENAME" to reopen on a persistent database. +sqlite> +``` + +Use the `.open` command with our `save_pandas.db` file name to +access the database. Then use a standard SQL query to obtain all +of the records from the `Covid19` table. + +``` +sqlite> .open save_pandas.db +sqlite> select * from Covid19; +``` + +The SQLite explorer should produce output like you see below: + +``` +7082|28/03/2020|28|3|2020|18695|411|United_States_of_America|US|USA|327167434.0 +7083|27/03/2020|27|3|2020|16797|246|United_States_of_America|US|USA|327167434.0 +7084|26/03/2020|26|3|2020|13963|249|United_States_of_America|US|USA|327167434.0 +7085|25/03/2020|25|3|2020|8789|211|United_States_of_America|US|USA|327167434.0 +7086|24/03/2020|24|3|2020|11236|119|United_States_of_America|US|USA|327167434.0 +7087|23/03/2020|23|3|2020|8459|131|United_States_of_America|US|USA|327167434.0 +7088|22/03/2020|22|3|2020|7123|80|United_States_of_America|US|USA|327167434.0 +7089|21/03/2020|21|3|2020|5374|110|United_States_of_America|US|USA|327167434.0 +7090|20/03/2020|20|3|2020|4835|0|United_States_of_America|US|USA|327167434.0 +7091|19/03/2020|19|3|2020|2988|42|United_States_of_America|US|USA|327167434.0 +7092|18/03/2020|18|3|2020|1766|23|United_States_of_America|US|USA|327167434.0 +7093|17/03/2020|17|3|2020|887|16|United_States_of_America|US|USA|327167434.0 +7094|16/03/2020|16|3|2020|823|12|United_States_of_America|US|USA|327167434.0 +7095|15/03/2020|15|3|2020|777|10|United_States_of_America|US|USA|327167434.0 +7096|14/03/2020|14|3|2020|511|7|United_States_of_America|US|USA|327167434.0 +7097|13/03/2020|13|3|2020|351|10|United_States_of_America|US|USA|327167434.0 +7098|12/03/2020|12|3|2020|287|2|United_States_of_America|US|USA|327167434.0 +7099|11/03/2020|11|3|2020|271|2|United_States_of_America|US|USA|327167434.0 +7100|10/03/2020|10|3|2020|200|5|United_States_of_America|US|USA|327167434.0 +7101|09/03/2020|9|3|2020|121|4|United_States_of_America|US|USA|327167434.0 +7102|08/03/2020|8|3|2020|95|3|United_States_of_America|US|USA|327167434.0 +7103|07/03/2020|7|3|2020|105|2|United_States_of_America|US|USA|327167434.0 +7104|06/03/2020|6|3|2020|74|1|United_States_of_America|US|USA|327167434.0 +7105|05/03/2020|5|3|2020|34|2|United_States_of_America|US|USA|327167434.0 +7106|04/03/2020|4|3|2020|22|3|United_States_of_America|US|USA|327167434.0 +7107|03/03/2020|3|3|2020|14|4|United_States_of_America|US|USA|327167434.0 +7108|02/03/2020|2|3|2020|20|1|United_States_of_America|US|USA|327167434.0 +7109|01/03/2020|1|3|2020|3|1|United_States_of_America|US|USA|327167434.0 +7110|29/02/2020|29|2|2020|6|0|United_States_of_America|US|USA|327167434.0 +7111|28/02/2020|28|2|2020|1|0|United_States_of_America|US|USA|327167434.0 +7112|27/02/2020|27|2|2020|6|0|United_States_of_America|US|USA|327167434.0 +7113|26/02/2020|26|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7114|25/02/2020|25|2|2020|18|0|United_States_of_America|US|USA|327167434.0 +7115|24/02/2020|24|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7116|23/02/2020|23|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7117|22/02/2020|22|2|2020|19|0|United_States_of_America|US|USA|327167434.0 +7118|21/02/2020|21|2|2020|1|0|United_States_of_America|US|USA|327167434.0 +7119|20/02/2020|20|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7120|19/02/2020|19|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7121|18/02/2020|18|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7122|17/02/2020|17|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7123|16/02/2020|16|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7124|15/02/2020|15|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7125|14/02/2020|14|2|2020|1|0|United_States_of_America|US|USA|327167434.0 +7126|13/02/2020|13|2|2020|1|0|United_States_of_America|US|USA|327167434.0 +7127|12/02/2020|12|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7128|11/02/2020|11|2|2020|1|0|United_States_of_America|US|USA|327167434.0 +7129|10/02/2020|10|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7130|09/02/2020|9|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7131|08/02/2020|8|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7132|07/02/2020|7|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7133|06/02/2020|6|2|2020|1|0|United_States_of_America|US|USA|327167434.0 +7134|05/02/2020|5|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7135|04/02/2020|4|2|2020|0|0|United_States_of_America|US|USA|327167434.0 +7136|03/02/2020|3|2|2020|3|0|United_States_of_America|US|USA|327167434.0 +7137|02/02/2020|2|2|2020|1|0|United_States_of_America|US|USA|327167434.0 +7138|01/02/2020|1|2|2020|1|0|United_States_of_America|US|USA|327167434.0 +7139|31/01/2020|31|1|2020|1|0|United_States_of_America|US|USA|327167434.0 +7140|30/01/2020|30|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7141|29/01/2020|29|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7142|28/01/2020|28|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7143|27/01/2020|27|1|2020|3|0|United_States_of_America|US|USA|327167434.0 +7144|26/01/2020|26|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7145|25/01/2020|25|1|2020|1|0|United_States_of_America|US|USA|327167434.0 +7146|24/01/2020|24|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7147|23/01/2020|23|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7148|22/01/2020|22|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7149|21/01/2020|21|1|2020|1|0|United_States_of_America|US|USA|327167434.0 +7150|20/01/2020|20|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7151|19/01/2020|19|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7152|18/01/2020|18|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7153|17/01/2020|17|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7154|16/01/2020|16|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7155|15/01/2020|15|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7156|14/01/2020|14|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7157|13/01/2020|13|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7158|12/01/2020|12|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7159|11/01/2020|11|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7160|10/01/2020|10|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7161|09/01/2020|9|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7162|08/01/2020|8|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7163|07/01/2020|7|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7164|06/01/2020|6|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7165|05/01/2020|5|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7166|04/01/2020|4|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7167|03/01/2020|3|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7168|02/01/2020|2|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7169|01/01/2020|1|1|2020|0|0|United_States_of_America|US|USA|327167434.0 +7170|31/12/2019|31|12|2019|0|0|United_States_of_America|US|USA|327167434.0 +sqlite> +``` + +All of the data with the `countriesAndTerritories` column matching +`United_States_of_America` is there! We successfully exported the +data from the DataFrame into the SQLite database file. + + +## What's Next? +We just imported data from a CSV into a pandas DataFrame, selected a +subset of that data then saved it to a relational database. + +You should take a look at the +[Learning pandas by Exploring COVID-19 Data](/blog/learn-pandas-basic-commands-explore-covid-19-data.html) +tutorial to learn more about how to select subsets of data from a +larger DataFrame, or head to the [pandas](/pandas.html) page for +more tutorials by the rest of the Python community. + +You can also get an idea of what to code next in your Python project by +reading the +[Full Stack Python table of contents page](/table-of-contents.html). + +Questions? Contact me via Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). I'm also on GitHub with +the username [mattmakai](https://github.com/mattmakai). + +Something wrong with this post? Fork +[this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200330-pandas-dataframes-sqlalchemy.markdown) +and submit a pull request. diff --git a/static/img/181008-flask-okta/header.jpg b/static/img/181008-flask-okta/header.jpg index 6da57b0102c1987a3759d019e4fecb802e3e382a..282152c09fe8eb50e06af0aa06902f91d8a417fc 100644 GIT binary patch delta 15729 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 literal 54433 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 diff --git a/static/img/181014-digitalocean-ubuntu/header.jpg b/static/img/181014-digitalocean-ubuntu/header.jpg index 9186be7015b3998412b93712226bc6540e2d0c93..b7de487c52b7192df8cb241e2d8bc663bb6a7a69 100644 GIT binary patch delta 13874 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 Lb`T>YeeC}LX2!3r literal 44859 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 b|Ic*J`I+PXZ{3&qKN1ZC0BZ} diff --git a/static/img/200328-covid-19-pandas/header.jpg b/static/img/200328-covid-19-pandas/header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5ba041fabf47c3730a61cfc23eb657e7f8553e7 GIT binary patch literal 43371 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∓Pk47=eKC5A`E5v&f|w8pCDD3Y_;cs{>$<7_;X{a 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 literal 0 HcmV?d00001 diff --git a/static/img/200328-covid-19-pandas/header.png b/static/img/200328-covid-19-pandas/header.png deleted file mode 100644 index 2981465680f3c7c4391f38570664840216a5ea76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53079 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 W>(iNpr~j<}!~eVIq<7Ko5B~>A83H)~ literal 0 HcmV?d00001 diff --git a/static/img/200330-pandas-sqlite/header.jpg b/static/img/200330-pandas-sqlite/header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1e9c86dc06d3a30e57ccb1dd76505fab46e4e93d GIT binary patch literal 69037 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%0AQi?@YQ@ivW3n$4qa( zrs%Gn*#4$LCOcBt+DbRjTXrm!EkQdbXgWdl1bvEiYOtqyC^~|iPBSj)l9zMd9(k$a zR=3oVn@9F|vwnlFy3&t^-9t|)zD60L$l9k8a4#x#ToPyB>f!9C*Ulp zr7R@C?X{12t4@N<{<5-Y-DB_Xt(_QErmg>7TEIe)@5V9pxj$*tkWqXt+6}{tXq&v@C~5zLIXPGY};H&-~It~r3f0#2ET8j#Q$Is1sAGQxD0Wg za9wAvq+482$JA z2Y^Zr`R{i#@2)h_ripV8wRR=TWGF}@0aA+mV}aMyrOYfrJhK3~zY zxH+CK(COvL7w3!kxIXce;PF2|X&eXmk@twcDHT$S=X4fg@5Et^D-0$$jqVfZyTa*8 z5)#S)ho|!>HiG;;8TC!@MdTilzEdS(xjU7(V6v8cpUvwgP42>VhxPA_ z*|4K2jjY-buQyCTrU?kg6|B8HyOI&B(_lUcVI=bnt<5c9xs)FscM>^fi}$*t(s(1; zB2_D@nW;=~Wj4WBOW?h*(Z#STep68;L}HU%+M&pGlRGb#RVls4sKhm=H2ZSb2P^tk z>^hIGmlTynclGk{Ux`-UnF_fkvxMh%kJh_XT|Fy{Oz&Gn$I!4LLhyN+D_|%wfMoz5QhTclSIH4u@&V^yYEnzsJ#XJ_0Sze`J)8Zm;$c;LdSprP6L zPTY;cvU36x+AIYtJ5?pxU%DF^T=qI&eq~%$@|;yA*9PFQY;$46=+nDz2tzpcJkmYKk%0bYa3AbI0(jai1NR(A-_tIC|+Opmcj<=x+h% ze;riX`ui*h`6}Nn&pe}b0Q}7SkqnO6m2$k&-;GXK{+p$V#NV!OGZ3aVUKxDYIRcV=qeyR`nnD9O=sxiK=5}~9`BM_S(x-?>a1^phVOE@ z3qOt^1^aTBnTh@K?f-jMX~@5Eb^LqC?Es-{2@P6-D~;|`+>wFHN1z0c=tx-WHS0jPvj_r7Y?E@J{ew#Z1;4a zePLeAHoBYPI&VFKDe(`lU)G#j)|}CNhHBf7bX?;J%>8a6k&Fi%3wXSU-wzfaGyuFe z3Haz=J5%rjut`z|0l5fSrW$QB=YNe=x12~DoLu_XyNDf|BWa>5-~iCyq~+tm*|j<2ATkyEdDYI&P}Jcvi^qe?9Arjzn`)PVElt%Gt6-f;PgKaUnbIO=}aE~ zqm+kz;I1>kZ53z?&qxIf`fU>Zox%NFb?Uz%tnk^{U^qzM{^onH6|Ni`danAHwKw}m zT;g+m;)Yu*hv(T&3C~mF+?||6J@%>XWgl%X%ID+PGeS5B8o50g6;MA+m|$%bIfSie zs&rMDdFborI1&-}vD%M=H?~+->T71TV%_AP`(;U##?Mb`^UH|cz8XwFcMkcvJP z3t@&Ww(a)4U;+=~%&`1!$CP7a<*-l>(_W{aOrE%0jXdZ{`bB*QnSvU*i{c&3DELqq znuX7RM5&~mb~?(W0F9rOaJNUe;hhKQ869Qbitqtn+Z%I+BThTRWi|xF;$!HEQpfwQpW`tW z+myUtQn(|tVFtpv0<+O6-9DDtVXa>JgGIl}q?lB3Ig)>V`O%v@{_nS3`oZFT7{4EW zeXz&Ll97v2a~Rkjd=qoN^!h8OwTQ+zTY>c;_`qX&#DWvek5u-c7|HH)x3OkGI9N8% zgJwD}do7YBN64w<Z>3#D-{^8>M5ff9{I_;UOk*X#EqizBX zPAmJFydcR1#X4jfMuoztU)eJe!|+Dr`Vo;sAZ1R*x8rZZhh6FNAWnpU66@ouA1n=c z0WC#jk0TnYJb%U@L3QZ4QOrof;a!p0??mrOvVM8>Hy?t{59j}s*MIj9T*Sb~oHm0d z#dR}i*8e4F(xd#a4Af5o*`I^vu8liDw(^^U;KtzD@&=3}e7bitKxX$gt^>PD;=v5d z?d{INz)%cSB2$NonZG5Xvl|InaNjAka7}KZidGjKpj&S+B^b~LoXvw5x?Eg#=7S@)(JKVvRj>>gLd)thGoGVMV@Th?&bB?*GhKrUUw_6A$pmYQVfj_UJmiB9Bug>OZn+AZlTmo_6DuBBKXuqy2hyBV~ z0SrUOFe^8$4vYTr6gEc#CJ(>o(?1`^@1x|Q0V-t`Fg-HZd*&2iCvQm$;O!`tr!*w5 zvCT(sQ?Uq(<3aZrZ%qtTtJhrw)x8RS~5IuLM&sNrs>D0(<++~M27 z38kXjXHQYC0qw2eWP9_g_IP;sWpiIy> z!VIr9K5x;kfy*`59g8w&Vc+WdK@HQ$R;7+>$6yAeiW%u}+uiIVb6e0QbQQl+wJ%Q1 zxhJ>^G;0cK5fhatsd|3DI}LhSuzOkAFkN(9IsE4E=T(XOkum`uiyVH9hV^ElC>)@p z!m2nL$vTv*kou%2TFznj=MC}?j}KX@G`SL90R)Mj#wxaxSp?h((Ax=s1aymrf7pB9 zLS6%rqx8x$pr)O;<`&FsPA);&G^{6f7S7~r+AiQyez1fRx&oA&nD3vrT}DJ|PA>J4 z3uv7FzOLD(&4E6BHy#{LLTEzw^4>siLDtyK$CJ}1M+fJHM=%fb55^8m8u=W7Tz7B@ zcy|&w`9(678CKv@FQ8P>H5kSdPui?NK&8ILsWgX=LRz!f1RdlWH%Ou#_PZx&>NZJK z1|){|*rp-)#PQ{Ll?|BxsI{l>*N^As7vYF>y8K#XdibTh#+{1DeAvB5dORud6z{oF z+ID6ewzy=)aHwV92vN^&tFybYvFojf@43f!g$Zw+z^A(Q0ILfKO(TH+0gOA~MhcwQ zF(&jD&FjFoLvF;|XQPII`1?Es_q5gL!}fa>c3KW-=}!8F{4+|0`bU9iTZeC9N8m~3 z@`;Eg_;bU1_(Du0zL#y)8O29+zl4AIPN!1RrUauoV6x>TeU^e7LeTei9XQYlS_2TS zQXgNXsBL@HY(>1;;a8v=>m#^c3`Lj9`cf_=*C)GXL+N-^q44nr)1@?>oiS&ypFaTl zN-;bbZ~ud3Pd`vqRG7z2k@`!L1w&VhEOb1`qy8sh3FpLi_bVcw+X=ZQU41!YlsSE- zvV_)K_8nDU%M=_dmVRv-{<-Ahx@$Ib>kH=El1#u>Mj~n_>dS`GhJ1~%h^DH`=l#uL zHnMdzt%dddV!_=WxYVh1ymH+Q>8sCkObjlr+Rd3-%1ZNeN*^@}?-9SrbJm`K`&u}EM+x2Rmf4mjFa~eKes-*zT zVn9Ls(HBmgXF)w+{sX7#0XS7v64`a$hOFO!5~?7TzAZ=g;I1FNa6Pz_Qf8I;=_EWD zG?#us7+X$>#^_h(fEG|$$??C^|9>6wf68Ch|L(lA20S#zZvP`UuLT`>kwxa{rh_do zoI{T}ci=bE_TS8R9O#z6%y(+(LK&NUnJMAJ?u_TI*!3ao=VFZ?EPmr2&5;hIEe!_^ z#}QRP{K{}vvtEWrWEh`uC#+=<*1&vH27J$5%`rFO_AZQ!fw(_y(|iovasGPP&rMpz zc>6Vg6#RTE>XT;L`$<~c*L^Ty>_ zAW;BOT^49!!2mZ!zJ6b3Of54ueRclWG=VxYqqd5zh3vKTxph2=;gO3eI+VPx&*1zT zYZB8L;Vx&}I-(n}I$&U-MJq~T#w^gihiUTsJ=A>*wt`WNC&aF=D)iz9`*<(-txh8! z0HwuXZ79`-jJeX5&+QyP3t;eWudPx|;yS?WXqJqIlJ>Y|h2MXZ`rUkPAa@bWY7{tU z!RtM5c-@L(FIziU!9UQOHuYBgvQZQuGrNkWCiv9qCsfB{nuS*!%?Au!d~hlBXY zqs}1qO=|B=?5?a7DP32`Kil{s`KlwC*jvIdNnFpBk8!WDhE`lTi~QoD z;&A1e7Mbm=tGLCYAzaWAEhzmkX{~l%`Sh7g2i`6{mIkxEF7Sw3_{W1(@vxeMWF!So zTDEGeBAixmDmxn)T6!+a5$-{FQ=KiY*YV(g`4g+`Xqd?PVN3uUv+(D5=^dl zFB{x@=XE|3^kb|=zQd#DNvpe^uR8p73@aDcEGBG2S{$yM$M4j;%yf`pv{4a+=VPc( zbP)9J5tv`iTW}Qlno9X|r1<-~>D&zjK{+d9S}+0sy3amIL&4Gt*wRzJo>kF^JzstGinrL~?MFm( z?$ye)rzgHBq4oEeg>g@uXl%Bw$QlpS8c$ovo{OWY_~0pd)Nk1V>TSG+MaB0PO{=cy zS(r7{e(`c$gq6RaIgeYA7+wq3P$V^1`?&^H2;WWstXca6ug3>I?g+^NKb2@*%_dv~ zekcW2F!7uwLFc?#jMC3U69`{rxGjmYO6nf5L*ooVh68ZWT0&>dbdR6&UOMT?$3A#Glz7NxW(Q3yYUyV{s= z44_~aQ~Fq*oUQUw89l<6s&y|bJ-lv{srG+N;qkw6E&tuI!H#~{eWV|x+~4Lvn!g{h zQvHvz1xqH-qk0n=o4s>@_4IEDqWP46vpxS))w0sZ8G9sMBnG#Xi*|x<78#bEPwLFI z72EjMuj0V(ka9Lhy@=|k3V| z(G1TAa*$UU1g&(;Edb}Z|2%$*21;~LrqnDGUS-ivt@8LE-=tFhJg3gjw}aUQNC+)O z#*F5=HyM<9pcViLKkVm0rf7RGWHHQ0rwD*L?|(a$$FF0q`%ZRTUZ3pv*Y8C6uJQz? zZiH(-2S^d&ulE61o9S`CF4p_k#Tsd#0L2q)q*r#(R8fS@g1Ih`(F0H+dJ-e2N@`}q zZe9`gFhE_3+s9Ge$C;9nr_i28xpT+q+Yc6}j10OdRdX00Z7p2;@cg|g+?8mzWl{78 z2`C9$_u@MJ44K=i>-*Su$D+5IJ|?~Jcz?niV+2?-!bS{(%$q~@l-MXwL{*Ry-@X|M zVa(kG$VtfV7YtW!Omzop;b3#(X9pTK@Cj;k1IhK|h#ZVH;$`Iwhm>!1uHnLm#DRdU z$UF9#mztl%J-BRC&0Knsy$Tg`G^@c`l94Y&7tIS8(&%bVE$+aunkrdpeITz`#k;U` zg^w|nJT_kv*?Zo~EMlnAd<_ul6>OozL-ST6VamJQG;@|ab(U^2Qa@O16|KOULy5y^ zy0mK#XN{j&+m7tYBDI$Gl|vSUR~4OfrvY{R2~vvsy$t0=|1(If}7_&)24*mttGI&sTBZL6*HL(zp=#3GeA0$l#lt za@-OeZZ3(dgG?)AEqzzcd*oF7$>uu0%kzSUz}J|t6$?X%J;|PO^5M|M47VoGOfW=U zbb9O!xnTVI{fj(9Y5Y;(+91AZ{r3Nd7wo_5a{ownDZgRV|0QnyW4Q)SiA@GdUuiO@ z#}Ae}Xld*`>mZ#8Z9Sv9l*mri@k^ZFJ%ffbOVG}0=Gf}bV0nhWu)E>*uEv{@>J{yb z9~K10e4PRt%7eAPP`$4)(kcx>DD2AkeJuGKwY~d)C#GloJYNXq!73aCC*b#}lCv2P zJN$V?z7G72ln(o~Gw|1l-EaTv+2Fu9@_#T;Sg}ggUkL5&zh5ov*DY>(S}qnt&;VEe z`4FoAxar>g9UxHu=8g$0uiBfngZLnp#E=3d?`j2~qA&I{|BZwpF5Z#ny3yOZ! zp_!`v`1SC9%{m3ISgEJwZ|R@tGSO|y5%@i`Ca447x-%&VDfj(*@CV0GGBH%*0J4;L zKi0xoqLI?HtlfC=!*xd2dWOW54~|gIJT|&3$;`zL0olFJ8P$Z?6DXv3aWut$V;0ZYUPM`v=RgCZoW^VtsU3c17Jk%G_$EK{ygkVf>|QsDWbon(T>Cgj?gfZ2k^-)e z5)_-0h}uaqCav&xIrhZ81X>HS20GqRR(9E{rTNpmD8qD&IF91GX5mS`3&^MR!6{VV z=qby$+*us46r()Nk_RVu+R!b)BrJPrW{*e(N2+Bb#e%s|kOY!o`Dg z4=Z9(FJ@y%$RN56nbR_?Hf85Gc~AYG?jt5$MoNXpB!qeHXzETQi3B>g1!aFBBOWCP z*+>06aG0F(VP{pg{I1)>aE0E6!I;O<+0pl^Y{GqFQ;=bID<_!H4ZQdd78aWIj-ieB zrBbI`jH3%tR*8Vta4*oAc8u9Nu#@q$YM;X(CtZN&y7TD18NOgQ@$u0u6Bj0Pnuc|3 zSrA`6jF2r)BhSvXUX@la%Y_#leP`|=)et4wd(1??5XAU@jYIq^Y~p|0HYo*&p84N$ z#<)X4ynkcp{DR#7@BIA_N}6B(TlN~Rpa%8I0t*fmfdz-~S+qZ_x&FSZ4D|qC|A+e) zy!x}IBlFVH1e@Z(?dq+rdTHm-9!sKhCMEO-i)N+da$ox^Bb`GKdnEW5Mzc~nl;`dN zO6a0$P5@=)HILD!kY2uuiHugqjB`Q{HPg@pS3N`3*HOP6^v?st{fFb8|9&Fh#)d_R zd?bq3N$~iVxVeUjEzIxmqmARp=!g1}5;(WT0lfRzBZ;WgCtC}pqJkIrul-Q83S zV_JwS7ePZ@j2d9R+<@gC$B0;(Y#h1FMf6>^fIV(OtDn3%g2ydVMKQtbK&5RnYvpCz zr&X5QKd5N4KmGJRdE8cfEd6x7|B*sB=B>op4H&VC`&wYByMduS&=)i>Ya}u`{mGYn z+=sLyNL8Jm66*xtzI%7cjfuIX!n(K|gZ$h!nZ$?!zk<$y3$DD(4wC_n2d62_{cSgb zy^>!gj6DayAnQbcGkw6ZVJGzn8m%W`psT%eS8TIr^7g9&VnoAj*ScUw zvI12rCqcFyY!gwJTs^Y8Do%&vE zfRFU$gG9KBA@!-X4uF5lHcDKcKlKlCTES7agG;+YH5{6c#{$tEhT_#*7H)ckQf~QC z-{Gamj_+D?aS-d%De<(+F`15BEG)ZN*jQNK;vSD+xKu6D66xbiB$yHRpn|Kd_qj`s zxL=)yF!kw)Eh`$ZA=kMUk_E-%EB8sNaa!;6kffRG&PQ^S2W&jzRKDmgMnW9d$|Z51 zaz`Xg3_Qj90?lXx`*#~eLe-1__$a#u>nS@fvGmf808{N8u_G1#<^S5y$x}B7K~io^0M*> zreELr!feJ$W_a5+ktZz0U=_;}_!2U|WN9Ww*+C0Z{ z=M3C{MeeKg>#KV{hL1Wk)dTp;@y>D(sQqp=#uT%E2SeWmIO!nL3zV??sQ$=pQ{EIr znzm`LLEJUJ7x%lq9#~1;o*o|VFkJd5`<-VLkL`<3S7DcZc(%wwpNkY_UaV6wAu#7& zqhoTX#qREIdwYE*8~!;6cJA=G0+X!&bYZj^C0f3HQG_4*mFj4$VhxKhR)M4A@!yLMmqkz?h|2K zdH)Q3_{qH11uM24!_QS$pi7ok4LvB`Q;5cn5{f=TUJQ>&hntfks^t!j26((x<%Kqi@S-SX zbhRGce>5VDR93xTSLv0+VQ9r2v5GivmTV(|4R>Us^Afd|BX*NWrDfj)qiBo z;HH-<;j)hqiJi41Foz~gKUzvYx9qqmSTS%XTtZZwO`&^DtAsupN|sk0`O>OtfQ087 z$M-pzE#;;eb`%*zkTbo<`}_h3331ZjPnKR=nsdGubGjr;c1$FiW}q=!=A&Qoos=!BNY% z7)6&h%-M3eYT&`)F!EbbakZkd_*;I;(#F|vNuqnx!JV(!?;7fnV7>B`7?R!G=&=3j zBF{N@cg;Q}6JD?8FNKn=0vM1EV6#xHsIRcn#QMePHH984D`6R(8>byic72YltmvY( zx)C*itxs~`NS8&7b>v`izH6}W{1=Koc?teHfOSLMO+xstjf40Zc7L_@S-aQwz2lIQ z*%jrmH-K6W)~`xO@2KK`=7Hg`t5b`0IVt;;)4u=wHjNkLlnCIbeV75TBnMa|OyD-% zSd(1RCM$l(pC4hH_HgXB4Bf?_`xCCYpWPtP-MsAEBh{oU7)|Ca)(zrf_FN-L9gzShaR0eYZRO^wh=drd`d;Xu+y-LPLPK_^muhCHsJBMXA5!uB`?d?o{G~isDhC&A1wbR-8 zC>y%#b8bEQE*chK##cSq6HT;HEX#K-SzJwyKSXqO}j)sBk$kVtu9Xi_F@Me2Ia6 zO+Mti4cKlU^%O(ZhKA+mE>bI16$7|zTihjzqQ+e zGE3}~$ADBL&+HJ9aotPT?zrj0h3PJS$Dg0|TBHefVWVJ-s7#urcu|YUrvd=A+re0g zpPlg3*Z$N(RspsqNR*1DX$Lq^YjbpS=%>H}YN&QqwCuRdzBooVaVK1wJXmJ!GB{Bc z=q*UA0&7wu8y)gOzsT6PY6m=SyhHaxg!=&hyNgsZY0S5LBG`wtx}1OMOX{Anmu}Rr zY&tcBUYk+x>U=#}{f{CCJ8pl`Im9g$%S*8zls)auHo86wAS(&ut<(nXUuOlGRjaER0xxZEZ#ji-$=XIt2;dGE)pq@(Q9)aqcw5d zZa!wYi;q?(@)5C;MHBULMDL->HR=T2E-fmJ9uTwU*)BBXpTxX_9!kNpFVHPU*U0r9 zV%0VeW%;9vn${k!){MdO(Prpf8gP-&;dcjEcfaKZ8G;_q{gJnH{SjyO>fYVNM|4Ba z-SMGMWZgVH?^KIMD+`D}`iPq#QU<|?R5UxFWkGlVFUn|sIla4TU>P~?@`fnJ1@Rfx zsyt6gg>=Dt{h2#8X>e3alU9`M((J$ijI@%K)cwdvh;9}whQUE7L2VCk24m%+zM-LG zDa|J<4R<>f-n&QCpSWNb`K4C1F%?SIsl|oh_n{PKFkmtB{>-%l1x^t?kGeT#%=&WZ z?#KWi7?UGpWZtD;jOdA!>U-ULt^$$RiA7XDx%KN zzWZmL&4BS0|#FmajF89)I!0mO~^% zG-lB^`IFmQ-e|DCT35yO%HCjY6%<%3gKLjyQ~vzcB6wF-SJM@c?} zq88uZnvqk>mbqcB-n=_WMz2-x?rSTk?i#KhM?E|^Uzr=gL%xWwK?{Dbs1oUL+1gW) zA7iVYe8=$o_Y|FzP8(T8?+eHV(ZT}Os&Qop?!n_(&^r-Wt|~>J8}oUttIl4n_Dv?? z4iixiG#^1-1}WjxaR<;-X37wag^&5G{9u71JG19)X*^W+k;PhBdtC=7k&NAuL|(oD z(|u=-I9ePC9)!}}&p#K!rGY%Qg9#w);{Cf|{5~N+SXga=%Wuvh>MZRPHN~?qtS;qH zMNITI2T%1lDjSZ2RRYQY(WP3gYTHy2v39q-QS6QjWixAcTi)`iim~XDtpiRmJ~NsQd7kB1)QgWvtY?^mATB zvs@9FUGT}9y&82wFS9?kb3-(P<9?2Ho}^L4lgxHqmp(6D-%`|NbhQCf%hLYq^dK8u z(OXPq51(#^SxL00MGPY5aGxt;;d$s_7<3LL zMb#qK9gpU>JY5)-t?7sPNVZ-^-b0cM2BY%RofPOAo#F?D9_6jU&@b+ykIJk?w@#?% zdL}78{wT+*&4Aq z@n*t`jMZPrNw$DD7F`ZgX@wq296lakgv5axd&O&|QRGRpK?Q}=LvcOwR0$0h2Y-yQ z#~7+)U8SvyZ-k9zoH&IxL$#@uk~WSlKFnIbh%GrPY5D}Bm+%bs9i|tE_J9rB|2|o6 zSuX>>N_En#BYvy%s!#d=MKGP$WhPeYGFm}qeH1sNP8lqHfbNN_msfbObi2!wa7&wA znf_kIoGHAaeJx&t0!8#?^Q|4ntidQAcE)vgWN#nAkGJ?{O-t4QqK+%6+pbaV26m+K zJ{r^~udqRTchH4*uu^p#nbuYO2hp(U18BmW-I6jxkIrG0vb$_mQf7sap(LAVBR=5t zgGEp4EmKXt)k z3%wVQ%LOf>wcdH$L%BqcF1K=vvA|l1f$NLWGISi7^%%u0o~A7}9a6}CYbHZh(r zynR-rQ`~O)CU*EP?w$rL6B%7dTsq{3E~DdBkIBA^L^4SiW1m zQ|H6=3!CG^(cx$wjq7AgqdBGyF4W)b`)UTUTchxN{XHr85qn7gSs_X2W`lNn9eE%F z9;G2gTH*|&36~~qM0NpT++>TWr0bh{bNb#?u=vak*Pbfk$l61TdXWPU3AQ$BI=gcO zbSE@G8)Ob=>5ZHIFbtoY1q_A&g~3|>ny7-;LAi50yC9$Oya0!{mTZ4x*HHoU`Yds8 zTHZ#x!HnNo%rAHV|I+z{4(05zQU3XpLM3HE8tTscQL-Z+=Zj6evca-_YLO70$A^Wk zKR5w5vW`ji#I@l1o-=m}56Sl+b)MH$3Hf-U1qfU;t*24t>PKrIxjfWB7ly=vDX10g zfTSLFtwBbRzB`&9IX10U#mU*PacE!nXiMasS`r%`3yB&mNNm6dGi4%96P23Y%)eO( zt&C2)86|c(;e_Q-Kv)N?^{p%ZwtTPFa-%nri#@{gVF_o`m!*fK?64hHk{UQhnPa*&Fcy{QX*@m65xtBSZFu<9yqD+60$L#k~Y;4CGhYh}9S=j4cf z`dsTz))3aOM}earmSlvE7EJtz>v6RNo(2<|XN)*AOuw*QxNBu=RxrcurK$FneZ-Is zWv486YAN`LRs_1_f|mu=ntstB?qkW)bN{ z%6PQ)vRoE&=#gLYM#?>~nsH`|Ns`HtFZIu!j>Y-|O;jUT)q2SPqSKX*)f}!1c&G4h zZew#hg)lDQJ{wRi$fDyRX+D1KUFxR8#lcXUM^|=t!+a}sXLNC2WhJV6<>I#1y6$9Q z)0%2AB~``miO;Nc-OI8K+J0#}WUg8G!v&}HonHV+5aajZRw%!JFcaDa{3dpwI*|p2 z!Ek#>7_pou;cI=)`koEzv|``42JB4_s?~LeqMs_$y+K9rao`};X;fC{Mn$i=e#L;eb7DawTTw7Ek9xGZ!Y05FpJdfd$CM zq*W*bRD#u#u_JxM;`cA;Lfn;t{I(*1DTVIHm>FI6Rb9VGgC{&(khx96&?O;76aZ!m z^}b3@D~JP#wc!zifMb5>>Cdjf!i6L|3R~Y_Vo2LziQZgC@s5xXaTN`U(xzflCZ~_j zhQlE37;cP-2aE~oVLN(^Ap}^Aoj^}%2fMvfipY1p;wD^@32{@$4xjHRf_*|Ph0;#b zuXboD1($;m~&c!-@mFayVY?EY^}{uCJeuVoz5fCL#6sFu$@I{6j(PJ>~m16B@=xFQ2MC zj567_y3HFmp`}9Vs=AmsbgbwDrC=>_so4Whg4HWB)JVqDqCuk~2MBjBXeM?_&`R;+ z7yGPJFosfQ=r9R`+#ZC7RUCy~w{Px> z`xu=nGhDF6fvZlfoQV3WuQ zWtt7xLSkidQ3(uX*9j*wKI0w$TYIsq3&>={Ic%@W;dk77K8zgv!IIelw@F+G2j8tg znF(009VMM)2rxu9|6FW|Bk_Fg#r9FSM%c?W=G?Va&5fPRuPyGDTI>)F6S?&JqPeac zbT#bA8V4!GCgm2--HO*Cx#qdWHo}AJ;vZbkmbf(L1YD-#N#JHD!^Frcn35g0hfdMn zHSJbv>9N5aDA3fDArFq==}`HG-so)c?3$?KT{ZRk(%%Q=U$`BZ>u&AXxJLX4{A`#K zbbUq!^T2T&u0_1Fr8d5_XV z5rnn5_vM^hFUC5H+og%d$AI;!9M56`)Jjt+-YFmmiUK^w|meCM%#F6fktsXgWJthLVD9B7z??QotMI+0eu?hS$ND$X4`MPGdceZCAR)96dU%$E^Yj{m& z7T+sDArechSea1ynrE3s-!hOgmpal;Bu%YI?cZYpzpSd&IZf4V@X-i)K<58q@gZJ2 z16q+3>9s^e6s{I(*-SeRHMlo2MQzuQ8}HXn5K+i60xRZ7$14Yp%`enD(&Kv>QjAo* zDaIPx){^CGGJ)g5#5SFmOtWKbx1$ z+2;})(XOA-Y5&bXUa08YHs>Q>UcKg2Job^rTWketY}~QJ;4^$~(rJ5MHb31VJIT1j zXz$GetsumZ_k0Y^cNWI&GD-C&CHUqQ^M9{*M+@{QGvVbrQheE78=h~}M(23Xgi@&4 zzVHV!zVJ3VT=tv$KHNjR-i`0E9fhBk+CwX|Oe#M+Fz=#o$soq!oaPC=^30twL$J_9 zV=7{JOc&=!<`yb)sZWMr7WY_&bnMZb9m-c^?hGU^4Vv-wMyj2q)Q3H@KOp%*=TaX3 zY7E{w>rVVNaEhl`dgC=U;~Yoh?MVrmS(M8#Pe;RBCobpZ{z9?L4FcK zj9{P!#mBCSYiNk)?K3!5cF}yT3Vj#e4cWfm%scZ>(11O$tRFB~Gp18lXC^ zitdG)J~c!6HQ=z86!bIH@uPGsZ}vIc&fkd7BRgB;x`x`~8DOV4(c*Ij;hI9hBs`DY~&mWD@v_h2XI%^sh%sC5;kFS*8-8l0?Sq*K2mK=M~ zjKN+wtE}j^GC{s|bV5~0VR)@CO!a(ff&AEJ)*cvJ@HO1zlhn>k*)i8Dl15Ucrs6wY zMbTs19XdEa6>v)MzGZy}W1x@nnY>@wFE>?kM?UCNC^zqsK3V;2vJ1=$S0+CulCVX= z>e%fFX)$(ZTejN^3(~{-A)ez%A+-8XlS^TWJ-5Pu=$D^W%fg&FmczOSyCEaz18dzV|AIzeM+*@+qpzea4SajbGp8!E${{)8=Ej#5(o%$CusN>D4>?3gpO_un}HA z>;$cFyJ4{oNh|qk((TO6UEyiCRG}ex0VlSR+{ybg{nfoMADd*D9?ppwy(T1CH3H*?coK-#&UKZvG6 zWZ(+I1x6H6k8Qe()ltXzbp+9ml)cG!aVgb0y7(o2L4>-sUaoKkJysF!dQ%Vw(N@S< z6gbip>rXEU5^9=n$XbP492sEeVArs9vL8f9udny%nuHbX_8aU&d4x)GGODY~zMlEv z<(9MBhu(8t1SzL#`TT0@6NyN7jgMdkI=%CS~JuvnGwJ8}KT47lIf5kXZPlDH?l(dh6!K6(Vbv zB;Hr1yLuBrGt}ShvI`J$;OkUA@^#!KS>PX4iv*gGfp*54k=KB$rJ5uhgbkcEkc z1w^lIjkI=WlZTZgBVs?6HCpAN%cteuJ$`NFr$H{J0(7g@(Q04#RI2CMsazZA(ys+cd?xtXN4-|e^6P|rRSU=mwX{G9 z)Lj{u#vj|ZM|HrI4SfqD>X?uD`@(kkNL=d!fZM$1gb=bwWZj14qA#f^1}hN9vn89C zTvon4(xJr&eP}E$@KR|OJH6ApZC!{<#qP(zS%@`@UDoXN3BqxzhnS(g^%&4szQ8N$ z@Z4(noi<>vQ0j{iovt)?*4(yB%H4Dw**QK0*EYc@S(Y+!eX|((CRw43kny_;PxBif zX?yn(e@akIZxB}RB6v8e4<}n$V`r{)!!DZpCu)9Xe`q@pla;1Ga~j{=hRSv!ff=I; zt&_y`Qybx19`iJJ4w`DO~XyM{~Sh?_^-f-9xx93d%+5m_Iy?KJ!{nqlNn?yML4(1 zIyD=3QAH0cKUvUQp;l8@h9H8_uD`GazphaesytHYs2k&B}PClsYzgllpk_ zSoab15C&X!PMGMI{J%4TEBCv<1ue;S&a#3w)cxXb#_h3;TGX;c;x_kTGpsu& z_`-Gsj|#|?*w`VbKWAatD!{~TuK~JWtHh~v#f4~q@*_HvG|9F^bqpV@O@(H{?JbG< zHCS{{KK(N*lP$Q_)I)3e;W-K&d~p$Hq;m(O&`4CparwJ9sYitCkB?rpn6k6Ux#BU( zLL@bxV$m5vu8dgsZaxPP~>mB07xfcHwX`*xx#M;*kTLSNlE+gU|wa+(b zyB7qYH?NJHH&+|fKmz&y-mu}5ol(-w4Strtu1C8n!>*-z=lxGt-F9}z5+8$lyUV}3 zz(EbN=BxQ#c^xHC=_=RLdz|sGY0&N+5(8P8IE_0ve3~*NQq2*%sMDf)-qh_pIgdY& zy^TJK`k3s9VfJoS5gk*yfi-<`?aXy9#ZMoENe~iU1WK*|%exI|rnnPbx!;wp%w_SF zHS)Oe%dQNgfmi(R9=5*kI0oAYg39>WzcWGt{=;4)4h%>XMjg7h^#Tf?41d+z0mq}( zuTMBjtZRQXE$(g`j@0Y(VmO2DyYIrjZ!K~mY(nmI5kd>nJJv?_mI5srcH)Qr#yoXfao|3vudDd3@f~}0n?^nuAH?e~&%J>1eYJ8m7XbWqw?nDbK`PpbwNH%EE zbdWER8mQ*~77RdV3z_Mn1CG2Oy)H+gVfW#GV0`3Tcr>OU3p>O#C;mz4vb7Q!uZc{P z<%>!?dvitY|0LTu$yh|2CqUJpF=99mdW!JQ)l|^YP>}60YGViY0M-X0bE#u>Q=2W>iP8%(|Q6=0(bI{@hb3+RjuwbK4S$IzZ=YdpIAuR^$}|A*-_4++6E z!KB!BSsQMoB{2LY8JuU;Dn^7j7ffsafIaHEz*aS?v3~hSxH#k&N4lm}GJ}E)cX18; zH4t|Q2PoNgR@@*c!dz)h5!g<6=iaQQjNE3V9aLLuJ##=`rLy|VLaq}RCc2+XTn4Ah zk&0*WG7HoR5O-ON4B2@+*uXShW0fS75lNKD5fC8<$owJSBDTOet*a^3@2?p&-nEr> zi=IUWQdzJp_gdGQEO;Gk4W?cjR17zED>|Xm%+W%KrWTMtI1^X+e*8Y1?|c5&S2n9s zf%jIwSqRPLjZnrOnv=D4rYSe5LoM{tPjF;ErZ0~AlOrwczzCKVeEC{~Rblu1RnWpr za`||SOTsJfk9qF)?x}c`=m=t|2rfDDCZUg&b+b{=CV0g0bV4c)v6P>7f+XKXV3_?n z0_{>7K2*+XUHbf)_X@Y&vElC%)D&^CONDFjejoAjm&gDqp95`8iC2Vubn?(L>H<6( zXtwZUU#dLgW{}Y}$q1KpK5E|;)s5KxY9e7QI zB>>ph+5~+j4qbz3pii&-H)v0W^a#AtTny|>{~g==4KJX(70H%f& z`d8|Wz`2~@*Q;!9kNNP}*YW4fLmjCRE;!i+YP^!6d5t4)+5M`!0yFz}#pch%EXFe- zJG;0>`Y_DT41I$%AG|@5tz>y2eZT!|nsdEhRS?JxAQcz^t(Q=JL%iI5j?hbd87s>N zsOd#Mct4z;h{UZySYDfKuQk#C&N$a{*Yltv3uR8O2R=>E7r_as+b<6VJD;!D-JCo+ zXOp|5ky{`gMcHl_uVgm-aIZ?3PGl^mK2<$H>xA5*j&mP5jC#Nej+!ob6zgnQ{PZm) zBe60nR$hL#=H#?x{eThA+L|`hfxfY&LO-FOvJR;a^6QJQV{Pb|PQ3tCUxI`K6>ItJ zGNr{`=U#rzr&C*W1DY*1LDm8Z= zVglv4_m7rCqX1G(^h_3WEBc$I!>zt=i{h_Jc0)Mw0O_RER}vuZfRDVGC^J-NOkCZ{ z6l@bsb~sIyDHUcA^JxSEHQm_dI}yc+sIXfKqJ{M{{fqWtsR`xU(rx)8S=70q8L&gOCM4qUQ@@`TP|n6B zA?3C+9h+YDX3O?fKyzDu~{{__^VhE`p@ezxa#B24tD$e#5{_vkFW^Ik4_QmMu zS#a3c08g5#uJY({%_2{*@p)TDEF;-=!B3vzvH?#pyU2wcmmYKeF{rDboQ$$dL#Is| z9_~+9_e^I>kzfMduLKQ}WiEdMXU%GJR37^*^=utn3 z-@lL4iC`^(&voU=4zH`!q1IkW+R-kcbI{X3LeMWNZ%s}|w6a2(Z05OxQD0^+3QwU3 z_QA!)hTI#J17H;gBC5J$gi}4p93iJhKNGjzOs#@v)q59l2COsD`Yn^7C0JNlnxdi} zOTB>bMdvSePc^8V7wr6$1EDJbHBdELvQ20J4)T=I91xM62Jy`$SZ#8z$#8kzwi6m- zu05cIT}tqdJ-AB$*DL7KCsTdol;An)rWd4#kt6pQK{x(=A@5rKu;<>DKqolUtE%!-o>ZIW7o5jC3Z zW%6TVn;t8j7>Ij*ryc*uc^XP`AOeRl9AEp9oyw`it{LFAD(NEt5xvx-K*P&*6F4Zj zRjRQkX@%X0xYSFoJ`$_*P3l+Lb^HB8!R_d`wo}ky7!%l*`581*f&7@?ck5O3tw-xA zTOr$L^eRK%nNr^m$c0iX9pGAh3)eK@cIkEqeg?cS-OT6$J_jJVSS&jGk<85DrNu;R1@8lO$ez^ z181U$BCxPGO1JQUL8g>XpIur-dB zI9`n!Hm6wC?%HotT_{RQ0e^};>8x4$wi@K$$YhLxq?9!UT-5H`PX>utDBch3m{GPJFNOJI_MFg9idY%kAQ`qg=~TzKB_ZT8H@z? zp|c*5>AN%HB4|H~jdZB0-Pcb}>8&np3CvnVJf+I_tW!Zto@U8VgM0iAXT*mw4M`HPx- zUPYOG(m*40R;BQJEWlqaC+OYS`E6&cQsNtawua7g2TCJ<;r1i5rN1-%z9dgTO*fre zGUxoYIO{(?BzDk#_T$H<54?8RS6c_*4-41h>d5>yb;3efzw&Z^LOo6_R}BtUT`jcD z4XBP1zF;Bn8^~0T4$iS-6D~}AeTykY5x&UrY(=^jzvRK7>~iot2CxoTk*sFa{eWzU z_IVtwGixv5C9E%zvgdNRpC|b&qHXQyC+2(Z?n~d4sLkr2fMU>J0LqO!6kmQXEg#(1 z^s`CET0=p0COpP2*RNP}VLm0@^h9d9->M0>-_;5$MZcwH zp9?7sv56LSFF#)biNPqN6zYqHu zHU38ZOr6aaP3B14&v8?6_5~+v9iiU0JgOu5EElt~x5G_^^zX-&vU@BaC~#iua*s5h zY)64!!!J(i z;5b@-;@DQjYUlD*d*urC1=_!p9blX;BzA2bl89L=y?cL}#xPrnF>;b@@3?W&AW>82rer_r(Mfse1lCY*f|r}Gqy)EzeZ1lxv+EA zzY<*Xaz<-r3&*JXU?UTrr*W0ey40$L;Z08eauC^E`K`s5u(jV{79b4 z?UXo2XOUafPk6(kAtFcpf@%w-vg0ix?wzXnSzLNgeCX`k(A;9BRDx(&RE4o0vPdqK z@Vlp>7OnM?5-QT)mkzilkE2`_P;Nb2S!8x(_oLXjY(!2~??-!i_F!>k)&&Q^ z*PJRT0cF>Cu#y3=i=)Wu>WM-97+c}Pgg3PS+_K?#_~Spx;m`dqLjKOhWv4pt_pHMP z-Fu{%2QZMRz===yKfgqOIgqB7N5=%l+(T`QO|Ak#^6NMg?UYFD;0HFa=*-sZcNuKd zvS%9%OIemsAcbcb8sls~eT0*bbi%&ML3e*!KG|wE2PeT(gV`(|V7C0pO77y~8EMpI zlf+XM6LKP0Y$GS?9~v#l!Px(s91yV~74fqDh(O?+AG`0qY8`0_>HHWB*lk@r12_FZ zXO~c5S)}aMrl4+EqOy3VN!Ks}fU}Um)V~xqaVuDEnW81)J|dNxfFx9Qn9d4x0Dr+z0iZYwjz4+w|DZGbANrC1 z_C4pXFtnlGq1|9pfCi&lE_6YDIS!DiYK%BPNm(`kw5!Sww(>VBby*J(^WihMT6fNhzeq=Idwt^~gr1KJUnEdsueYMM#xGKfhGWrOFRoo2lz%IS}x zs;!<{8R{jk)nz_=Sn*r?fg*3hzk;I*groaxI<}{k@2NCTwE1W%?auX2;v9A%J-jh2 z;Q+caTH87_-J_0cNq1edP-W8lZu&CT_vg8(%Ovx@_L=ru%oQK>?$K}p9)mxvC)H0ZQ*(cl72~>lK-hF$}D40338b%1%U5;-%>Ay}*hKnQGo}%rMA2NCB zCI#@;$v@|w7xs=;eVW(`;6*0;cI%!~)?9)f@Zi_6dzJWE>_j~tVquW@`eexKmN3OA zLs@?JZ;`FRN6$?WNj<>{Ubvlk?PRKtps#{$z|)C(6V?9kJN^mdpe_`^gOCZor_xi!1^K1;IQ+ety{dg7*0tr2#3gexL9}wpbUb$B~uT~z` zllJIuhK{OKQ>=nzaR>g0j?d=js^0T}J_HAl#DmX|G_hw-&(4^aa1qMIJ=Ei(num&% zHIGq$<#SB+ZZpwHKjzN73t$jl|IkpI3W1nyX2f}GX$8DnfjZ@aB>2b{deXQ|sw+`q zFJ5@jc2z=lb^6N^%^jsQDy@%pxZjT<-@yI{zY$9>bZGQBDUOJ?2jG<`e+0D+!0VpM zkiW!LQ;YymL!4}w=YqKSHrj;;n_{78>*90$-aK#Urx|tqE*f}yTv$q4$vqLtpZV$U z9wqi1ey4{X03U|#0wsrRj0MjIJOqpmTeTB|hiK2JDbrzcaEve(Ha-+PitFEBTtiM%zksy%?zDTx2B$|n;K6LZGLGI2k#9O%W zSt|Ld8!zB<3}#);BBo2Rp*Ii~`>+*+Ocn@jOYy@%!za712hQoZbF^4Z+4ritH_V+2 z-G(tk3GB;@v>U)C9hZ&abK^*v)T<71PL5FHwgI&s!g}|+P?3SCcGSl}RH)2b`&39% z0-d;Y%RTQKzy&Im9*CjS${o!jUi|JKc5 zbpQnNyy>=y7rogMlpFko%#098K1&7|fJ5RgCA16_5%_1;_G`=xoUl|*+U(sQyS#Cx zj8AJ@UQdB0XIo$n(q;k2g?V6Jz`w4Zwoi@Ng`fp}FUS3& z4R|sc_<5T~o+0VQYtcv1ijNWdQ! zX`T}AQfY%7{6ZSVWs^@|JSuJ90DSfWxq_bViA<{7W|JX!9N#z{Ortf?v#yNf>%9d9-@kN$sNKzMWmtx@slO z0SqZ$(-v{YBnA4&V6mXO-3L}(akKB9QC#qs(fMGa2)ILmdXqYIVjdgwRJ)V~w#&&! z&Up30Z%B*kq9N+xGI;jbJ~6xVL8)NAX%{MC6%j>-WS`M^$}sswR^5BMh>j>SxC+B2 z7F|0uAoCC+cQlvN-I>USNUau6UcdedStU3=fEK?A8!3$38#&RAvQwY~E(&q3D%5@L z=4icg-#8~bvpexDJZ8F2E}}gU_MqAIw#hRi6%Jyl@55Q*-`fj1T}@L|A;gkO{XQ&* z$cA;e8o^Gw0n&fcReSMBN7>SSxG=~M9Z%jp+CO`+M%)?4r#y>H_8*jvbyAfRsVlzw zqtw#UKzF9Ac;|@Xog0^YfQUo8x=+uxHW72ySQfr*>u{MYRZs_^k6?Jp$}mf(a7qV{J$hY`qW>vjehh#KULoYEBR>y= zEmB5ZR3lAJ#{k{7Kwwhd1pxy6DfB=XUjYMS0kMJ5pr3!FJ}{Whc1#{uqO4;TpEsf1 zE^t-!XPt1QQNc>~KLOClztV65y?&@y*FYBfj6OzP+f?{y-E&UstXA$s1T{u-pN@Z* z-t9P59Q5;H?xCCe(LIS!=V5h&R@QEGE^?X#Nq~i)#jsH}ADVr(@lIqzty?^ab(ko< z4X3s2WC@vq9<7q@ZQ_N)<8LH8g?(1PU>k1m@}IBM&(eQXB?T?nG>& zer*lm^U%*uBgacKhm7i~QWbN)Ex$SLOJFvx_2k`Jp^c!Y&ktcGL4zMQ6D{zQFdU^X zo}+dIX5MnIl(~b41NCcgvAx9$wf186oFRR5X~d6G5zWG_uhevp%#g@|gAyV8h*X(J zxR}YbBty!Zp+(5Fa2r1d{v>?IXX?F$wV)6;?tH`X1(pY}yhot-4@0gBYHR3w(95IN zDhY;^qH6Fv>zgFmyo$Mv$@_QfKClk34c))FdCW;dVIZ?N2!VK(k21E{5ZOhxNGEr} zD}Uq%Wo21hNQ)i&9A0yy=O8l^v5(3%wIuR?ZlPQXThiYk!eAQUob{_7-65Y$E%~&F z=9ONB25jC9i48HOzJ)iY7lW*nAw|ZON=0 zRmA#ddC3Ke@-{%byxgDh?gj!tgYQbF<2m|0edtCRWG>M^0Di3FJ1KF5NapM8UF8q;`~T*ZudfukN4k{0ijPtf6!FnY+uK zuYBh|y><#c>?d7(=-8F2pW(*LcCzJic6%7H0s@h80X|?c?20}nL$Kixv1tJQlT}C; zFx2^HHodS?dvyBo={}*SP8MA$6;sG-tKk9WI*(2+o z5M)*J2$iBB?KS-SF{s_^l1dI5xJY*)Y*nOjEvd_3rbU04d8}PEx(1j*8eBamaq{2~ z2oV?`oclG5K}Fa{HDSU4bU>mM3h>^{MhxaHlDlzhV_dD&s z);!ZudYX`Lm_u-_DOh~%cCzj4T%qm)jOEvf+d!2Fww(x6&h!@$J(SB<6ymfCd(t|P zm{wTpWET(~KtA`w|D@B?`R|?6%UhH8&$X8YI*t)a(2PWwCH~|i-M23Rb}3H}UrgWf z^7=EdpGnbyPs95Wm9cS&_LrRCs<+jBd4Df1$e?I(zGBgbQS}qAO4ZZ$NfR@Sy<$S7 zfXeh9R_=o#2LET5+AP8qt@saUpk%*=)%fK5|Ezb-~ zp|Z>kvK=KCVT-y#yiIjy4+ckAQ26>aUOj1War3Tzx0U<-B{7Pq=3)`;Y<}at-CIF3 zQ`-wZoRsHRSYdrl!aZ4)j&1uN6RX$i^PchbJIa{^ggwj5+db7hxs9$QE1a1bb?8U1 ze-vrR__;75yN19O^bt%%F$brJx-wiuGd2vd~1@~Xuo^DH8; zj=vILw0vx``<5(cGM|#46&aC$WOqScT`Tq5CPa=gA0kk zXJJ=w2Okm&sf>s<(EtAj{D1KoY-i!EiW+g<`L5xl0TmxW2g?j!LUf!Xi~d8CwX04& zh2Tnd9SO8V^S43OQHOetE@sK+7%pNXd6p+CP)FY}JWurrmE#sfchsK|~_J4lS^PS+eOY{M`Awau_j5V)-~q1{b4V; z3r>cfF844}ImLp}M@fi0{_AL>YKQP>IspE@1d!@p(0?fp=+-8z7X|n=TftRXQB?42 zYh`>*cwm~ihQf#)`{PV)WMRr@ zbk(mm(oIIpK(l-O>JI{~lRVjp_H@25(%qbrFpgeIP!X<)PaCpIbo1ieIqVsery38L zBiclo-Z;)8O0Q(t_E#x@(>))964**c>!R)r{_&sz%mUfKf!woWfdzqH*R%-X2P!-4 z1fVs);xz(rfpt4A^V>(uOF*KqOM44*OQd1iz`oR#a6G79B-P$dSB_;+_%GQLJ=PbUsSO z8kdW`DdV@_ftfk^2FEWX{)M_@U=c0y_|h3OqPtFGgQIJ9Zp<#oFy=Bvl=uu!OE`xf ze;IB(Qufff7k2c`SZU+R`nVbT=sKl^D2%IILPl3jRfA}@(j>EKzuTnQ#qZ5dRXIn1 zK7MBf^u(cyI9(){f6AU1(0jd_gY*DTPjsfbJ9_>NQ9vyq-hnDo!k1hh%}m^oFD)(o z%diydK|eWmHaSJ*BL-mRFW#&9tj4fk)A)N?V@&j&^yXuZs(IN(of-=#4iWv(s8c^e z6QzVKN4o9L(%)k(G=i!&MOCvEba5vBa_89c3(LYKYM>R{s_Q!SKz}4oGFSIm@`armq3wcbSJKtrh9T=N@!`|R#scNNs0~f@QatryZKIR+R^?53CIMqI98;?CZ|*A#WKqZR%wdIf zCF~veTh!4|#3FZ#5c$>^$e8F_x^-RY;GJL)Pnz(puSbEsJq(5pReUT{O_^$mQn%r+@ ztWAB3Btbs_#sn{A5McC5fK%d9CaPz82WZ?#O9k$^XgFoyBGe*jvMoYu!fd5n@$h%^3F)3{J^`D*&93V=p~RK zL6e6o&X?V|t$O6?oi{E20AU^TcP9m<9soJ*2of(8KgsT|-gP>73oCv6Qm6`=T+);f zn|ka`iNTF-dSdA5?fWHv->WX_Hc8sm-7}~;NGc4lupg~PCcw{ACl1M65ews078bxcmwA73 zqo7m%USV^~@@dv4eNPLEV}Qwn8y)`FfBkvgtEpMkWo^*3DzGlnSiI>ve+K%&_PgS{ z&xTWc-z|?zt-`cLtv_6E-?J!D|8>3u1k(aS9WSY`6vm;KiWc~WrQ9B(S%?l>W;XE{ zA%c&wcqHGo&teBXgm~hi+%DsC{Bm@&=Cc#QrdbjutFFoP`qHx zRgagMsLa+5G}*(fOLJY2Jj|d)njh8yUo(IEWuZ3f1jo8kO)lyrGxjKS3PyID6l^YR zT1nIdssRg?TI&CDIV&`S&pgvMacR4Ut=~~h7h+VO3OH&IQflxg6D{FouT^eLNF2`# zsYR_#7^ht`98Ow+ZWodj3pKh|Er$Q0arFWlmqeq9!ofT$hF0gM>_D5ai!I0ubuF#8 zbCT6MI)LlglLXYoNJVm|d1rr$g_{YbB@2u~)V>w$r7b@5!}yUo&v!hyh3>^&UG)%{SYn_J7~nFB9B?4_*KT00*Z3FBny2{gg69BUbbw71>9s}aXGRA z=C;hlqC0;YlyHxEO~wJ1d16BK{E}7TRvAE;|8?1xkM0svXUSy;58Sr5M?C9IaG?BZ@2XhA5;lXD67yq4>BD(R;WRTAP9t`zD*P*a z5LU_2@RGVP!5+L3VJ0*i&-D6!TL^w^avVkvw*98q(PBaQ`jXe(cTK&gnBV0{u|tJ+ zI9R!mQRKEx{$=?dJ%1SrD+U$zB{)-?C-!xzPwhd+2nj7$tGj->dX#+j#)0?crIl%M z!H8CL)c#2_)LF)d8(8IXh^mDipiNzsWJ-i|f>~#mYCBxaS_UQckC}DXSMPH-2sl$l z0s(WR56KlT24LM7ccMm_j0B7JiT0;7tC&9DJ%w)H!zk=aU>W&2yLoK~ZBr{jy{hn+ zUDj-PH^0~vxf`N>(?JuO5(%2%t~qKZu6ENMBS&Wkq>3kS$3dc?A7<0FzxLLbzSVx7 zk_Ji$6hZ}j->Nz5&TMn2Np^^d|IDMS&Pf_3-Js4~m+F*_#1JYA2V9EO-RxbGY+R>p zm+)iknGdXKfy3g$Zp9@kl2Cp23rvy-Ol=*Sq8?(9A7}Nd4jKF32f%(j8CO$w*(Be? zZAaZ#3bqyfY$UM%FiU2qLCi`e753mzD(_@OtbI@Z_fMn3$YLcQk(u`ymI@ZH$pe~& zoW-ktlP*@@vUWpBzW&fwu1B@)Sqv6B0j0g{)0PmCX}T8NGq(9JzCE0P2v70atDa^! z1xOkFH5Acu+rMHNd%54gww4(5V>ndpGYz9i4^NL4jsZx`d-Mjq&2>nno+GC;?O#!n z#+H!oC7X{F?kvqjHoK^uIXmnfH4kNC^noflI$hXcUt7~sW5Xd=@-Zl= z)Nu%SWILlK4^}AUn#Uf%clWpy5UogTb42=XHkXM4$9VskUSy)O#!VI{+(|oCwD$pn z?l)7lq%=Z`UlTOZVlUCc5~d-QPyfNvwPSn(d$0QStD<)6wmue?2ML-%!|9f_n!Snz zDU;>y893+l`6^gTS2Z+~b;)263;FmhKY#uXo<)^q-$fi#awu9TyrG#ozl zX>vqYCnqh1u?A9G$zs{x6rUm?^(!CSGbmy}CEXo@Adr3G@>NOI#hsx1Jj{G;^3ocA zw<;|&vLIx8JJ<|ozs`xMy1$ldu`8UD>Ig^T;8qBsGvSa2x$WHc9dqiJjM|0f6?)7J zT1w5(fy~>vO;$T;zOX?FWwW8ada~FN#1vT5!Tue(&G$Os*5b>4pZ(wj*iH;;pygJmK zsTk$Sgd|unDn38Wi#PP0%e)raD{~y#0e&|F{%|YK;^XkQ$31+~n+DVoQ04xI7DeJ^ zsY~0L!LJ54tY>=N)Jz`d>ptNP%Zs9B^(rZwT{Je&R7)zq3ge}YQm)xopR}x>Ms{au zIC}!hB%5+x_q)#|-=jaMlG#E`Qj-=kMgpsSZaAeL76LvgpBBn@xPYZUc5VF4vK`>1 z4|luEVf#8P2#7AqDn34g5ryNv@^w7BHf!~y)wLC|Q~eS^a07K08-uc756C9yZ+Pkj zPZinb7uG^Xb8EA3!tR+`&lxB_M3F4ri!%)_mMFA-2tdwv4Ndg5`U6uD%8>U62Y{&t z84@|MPy7g;K`$Q^WzH&cvyrtH>HtX)W5;4Ov}1cQOnuoQC)FhFjb2H@<1KyzA`2$uZ!N{;S{l56g_o7HZZk4Xz@eKZ8JmNhH9?H+lpqg8AUup zYBZBOnb$qg9INt{YV4c_ENtNft&^&SNnc0`38l=sjLbtv@pIuFTvFGj9r%A18j1+Jkz&NNWybgnTO<>Zp^r0Y?<;NmJLj3GAs-K;-d?; zfc-ivB(tN`%3EB5)SJJa!}J<2Q%?(kY5c;@$j5$(eF_CopSv80FSbdF{lUvf*G-Rl zXHrj2)p{k6+i`4XZ~Tor6kM57h4QT*-W5|74ViVVy*pns>)JehT8)EY_fR;$u3=)L zPOLEULtQOgsdLbS^%VmaodbRcs)mNc#mV3X{Hs~Z&EZYY2MZ-Dng^YYUlZN+XwD|r zKb(-+YnZYsn@0leA^_S}H6(zf0v|Z=XMCE~UMUuRcPWMOLoXB7#&~Ef9QM;+zikeZ zsB3Czr9rxoH-eUHBGi1!AJ6IsY3*~9rI$sGDwPVEq1%HVF>6>1=?58VIe0(0l)KT& z$5#_XM+JgiY6y||p69R#DqTgI@_oi^PvzCgzC(?##xvo2Kj_gir=MVznE(nB=Iw8* zJ2wB&OltLgy+~PyXmf<`Vdz5nE8t7Mn+8k`3jo@YSqILUT$@u}`iF*VUB2Gd^Pq6> zh**+fA&?LV8iDgs?kNc_?G$8ceje=<)py<2-R<35S(Wi6Czw0MpSt6=d(u!HNKOm? zTn&bi$BPf$Pplw%E@#&$@n9DT_T{)}$!`+TnA?=x1RjRLz5%P!vEARUY5FWZ+{y7CjhiBJ%o5UgMN%l5A{zM>G^h4&D`M zCxN}aF8szTRFnB!94JT9u=BWX@mv%pO6ee9U`sBKQ#fyI)zJ<+V^OnfHv?t|z<)m= z35=z7dBE)LuH=JC5B3-8eNjP_5W2T8W;i=B5-VBI^4yj0hmBoEQCsguO92{~$s7^W z2|drN-Zj@n35qV>TO9&D;6Em}VI0G&4?n5%#OZST9C#mCrTU!&APRx84N)LOA6{hC zTcMy6y*I*c|u^4?|5D5(lA+*u?^&TRU|%f;7#lk?*v2X6HkxE$Z;XaQCH6~8(% zeEtKChqCA(GRMqmqS*Cy_R|0s=j*cQ8qWu3 z<6`}KEdxK-mePM{Os1UxeW6dL#(xrP{+nHV?tf8m_Mbxw|F=K>v7)zKb@H3srK#c1 z0{|T;qTuQ;pd2^=U)&1bB3R3`A`9mm;2wzWeE1<01I(>G9qvRRCG)K?zd12WBVkW~ z_u|5xBw!%2ncVZ=5ZjjTI((H4J;l)fLz93yPyuxu_l6ZcqlSzXfyiIcz0v>Td08I7 zzv#b|@6AnLsy3{)81Uq5EJ=?}cyyQ7rn^ujC!6|vl+>A(>^%IK6I)gL?v)_zrU^~Y ze|Hhf%-b65J*KfsY^4btEe8B`krrJGSI2_y)f!GCoXq+i+;+>?It8ur6O~()^ym-g zNx{@9G}}KkPKzI}!74#Jy@aBpVl^k3=BJ&>B+HK;+iMdB! zJay(ab;uc?czGcHXfXzQfqD*-!$Qi}rl zdZufP6H@t#hN^=f#n<8>D{=ggH%xu^5lVwY=A(KV#|ert5s= zWM;-~Z>1snd$5<+ z*|o@hMwUk9U`Efd^~&M^S_VBZ3f(B;fdfJllnV`5>c9HmoFphX7&Qf$jMBJb>~&A# z>|g?uH1b5i5#YrO;3__ygy7(HzdT^kX{Ag|olW$ILtO<6wy(1>BW98B)z-^7K4q3Z zjKt_47bQB0kP{zB{Au7MCQaT6IRcwnx_6McH6HO16zzC&XO3B=wK?ddPX-%d%{1>1 z0@6fYXv^P+s|smrnG2SXk~S56l!A)=^6k;2WYH5OGSdNJBEE)LhX5*8%#(4daMf#A zQ2P6&zy&R)mBJN_Am3R7Dgeuaty-+{R77`DoRM9nq$KI`%vBSZRSeW#$iY;!Sd6$~ z?jUWG6xQ}_4-h^;_HeQnifotl69IL|I^6(Ds6$kDgMxO_jvd^r6R*6b0p7znz3<9J zs1u+(EUkN?NrzpsnasOybx`286J`WDrYJiVbT5b~1aPyP+P{DJi`d7p8A*=NnP*y!7Amz1xO6WWO(Esz9Scbq1Q zWC6BNL6v_5ZI=G;2b?jg&RAV85mIVt4m#zVo#O^(7k6bvBR11-78^Oa#NI0pmfl)q zT>ZfMo61K`=YppSQWO=l@_iFsD$z;+%`qnEn^R#SkQ8G%YTSI-KzNML?z7fvq7~s5 zN9^N~9-M{aliS_pJsn}rQF2A4I%+p*~zEB zUmceZblh!d?r!9n=lmd%5~O@-7Gt6f;DQ4hqHi$MK;nyFDr2PKJZS$)VzbnMjAQNj zB%KSt#}n5D1HzZ8XHCi>Ykfnr;|&gJ3N8Ix|aUFm(a&8p3YOcpJPadCX^^Un1Sz)1zHa1kuA>!o^lobubMaM5bo2=uHdu1am? z?w)g5d*-nG7vsE%dY?Q-Qx)E_o!VoCad{S1R9dgDc0$Xkl3hHH?lN4oLEQj z434P{wXWO-s5`8m_%-4aaR=~c)cO8$s{JGn5HTwYm;eDXroj;OF2GKn7eG4sZT^-40D&L%IdqTy-i3!&0t6vo_8KfBR0({d7UbITak z7oL9Nx(*tfE<}^kH2qw99-#_Y7gmmPELk>%81d{HMvQ~r9qSI%p}m!#HBY$R!qS->o8J;s25eU~yrfPX$mTVwc~XBa+F3md z-X%;WPu~I-#VKAqX|8Kg7^#C2YqrgwzD{A212~~v(Ky(XTD9qffYRKNYkha8R%PDg zZv=r`F=v69zL75hxZ|FWE|_$=1rKStsRcPMaJ4`8vG63aR{HXN_u>5wqFbb@TwD1& z`ccaM`GZ!HJ92JTjs6bsUre^`6Pfxy@>KI4G4%`9nC}#fcpc=u2;`a0%bUe(j&bDB6ruro|fnw>3U$j z7eTOnoap*91OOB60S<-Hlc9Ou&_@E$%l3kfg^z}aII+HeVz@fdvWIozN~HV3ajkBu zM|+uyZD?uUHFg4h=sAC2U6Vt}i_kQu$)1>3Fhu1Yb5gNdze~SSM8U>htZiw?|B=d~ zqyZ`&TC$<0{#1YS^AX8-9MgNA$bWKa$c^hyv4tpaheCRX7T{@3;5*ZU;-_*CFcH^t zqP}~Pa2X%^NXf(~EujFDg4at&F5nlN@B~I8TDUtB((gyZx7jqkePvgA#0-YhGT@&< zAD97#rJbD0!*kdfT+>Y$u__JNc`$}`tlvtVf}%|vn@W}?mhG3O_F-$f zfp^B$c(@+54W+o15_}m=DiaV3e!JD!66LvR|Z{PdG)ASe;^T8 z<$sb`i)Yvg|7#Mm_dsF6FC?;~HnNoLkA1H3aoVU`>rnT3=z9@uY*-2U)ge6wQi zt;URj`ZaO!j8u@RW=Gy!GEx`a2?qt%=E!7Q32KF7yNwwH4V^ZOBQiZwQZV2xc~@W8 zl9XG2nQ4^E4QFzqp4_oVYt0?2uypkCNXYiM;LHg;z@&cf2ij!G3`4;o-0Qx9!-I2l zOMUucw?vuts>OTqQVmRO#@PIVE^Z^`l&-mmoN8sb&#`8~M^B-P=JJH8b zs{PISy!}JXk|9~uPb+3Vc&Jwxh?FX6cjj>2z;3WwgVuSAaagN{FhjrWeslGK?BJCP z^)=^(0u`VaW2+(#N6mTvY96B=VCTn9G+vyo7EYW$A(^k$xWb zj86~&fd%uis#$HHkYNb|*N~4xU!;@&%z|H2+UIl#zNR*Q$+mz$_Wgf+{S8zCe

More Resources

diff --git a/theme/templates/blog/export-pandas-dataframes-sqlite-sqlalchemy.html b/theme/templates/blog/export-pandas-dataframes-sqlite-sqlalchemy.html new file mode 100644 index 000000000..4e0f11845 --- /dev/null +++ b/theme/templates/blog/export-pandas-dataframes-sqlite-sqlalchemy.html @@ -0,0 +1,7 @@ +Data +Data analysis +pandas +SQLAlchemy +SQLite +NumPy +Official pandas Docs {% include "blog/external-link.html" %} From 228c3e56c8e54f31c54313469bead5dea40c64f7 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 30 Mar 2020 06:37:42 -0400 Subject: [PATCH 094/302] update changelog --- content/pages/meta/00-change-log.markdown | 2 ++ theme/templates/article-sidebar.html | 1 + 2 files changed, 3 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 064ed4fc4..4657ca29d 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,8 @@ on GitHub. ## 2020 ### March +* Added another new blog post on + [Exporting pandas DataFrames into SQLite with SQLAlchemy](/blog/export-pandas-dataframes-sqlite-sqlalchemy.html). * Added new blog post tutorial on [Learning pandas by Exploring COVID-19 Data](/blog/learn-pandas-basic-commands-explore-covid-19-data.html). * New [web design](/web-design.html) and diff --git a/theme/templates/article-sidebar.html b/theme/templates/article-sidebar.html index cb7467e4b..e25cfab10 100644 --- a/theme/templates/article-sidebar.html +++ b/theme/templates/article-sidebar.html @@ -1,6 +1,7 @@ {% if article.author == "Kevin Whinnery" %} {% include "sponsor/twilioquest.html" %} {% endif %} +{% include "sponsor/carbon.html" %}

More Resources

From 948f1886c5ad07ee40875926c1c01908ffb84a21 Mon Sep 17 00:00:00 2001 From: Dan Bader Date: Tue, 31 Mar 2020 17:19:50 -0700 Subject: [PATCH 095/302] Add Real Python Podcast to podcast list --- content/pages/01-introduction/10-best-python-podcasts.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/content/pages/01-introduction/10-best-python-podcasts.markdown b/content/pages/01-introduction/10-best-python-podcasts.markdown index e1776c4ac..c637c26dd 100644 --- a/content/pages/01-introduction/10-best-python-podcasts.markdown +++ b/content/pages/01-introduction/10-best-python-podcasts.markdown @@ -52,6 +52,7 @@ listen and learn. Python subjects. [All episodes are listed on a separate page](http://pgbovine.net/PG-Podcast-summary.htm). +* [The Real Python Podcast](https://realpython.com/podcasts/rpp/) is a weekly podcast with interviews, coding tips, and conversation with guests from the Python community. ## Favorite podcast episodes Here are a list of my favorite episodes from various Python podcasts before From e18324604599e27af4526d75ea5aabcfa100244f Mon Sep 17 00:00:00 2001 From: Michael Herman Date: Wed, 1 Apr 2020 16:47:05 -0500 Subject: [PATCH 096/302] add django + celery resource --- content/pages/04-web-development/28-celery.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/pages/04-web-development/28-celery.markdown b/content/pages/04-web-development/28-celery.markdown index d0c263a83..5a614855c 100644 --- a/content/pages/04-web-development/28-celery.markdown +++ b/content/pages/04-web-development/28-celery.markdown @@ -176,6 +176,9 @@ web framework of your choice. for transient states in your application that are not covered by the default Celery configuration. +* [Asynchronous Tasks with Django and Celery](https://testdriven.io/blog/django-and-celery/) + looks at how to configure Celery to handle long-running tasks in a + Django app. ### Celery deployment resources Celery and its broker run separately from your web and WSGI servers so it From d6dd78da506343b794d6b4528802bc3603dfe916 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 5 Apr 2020 10:49:25 -0400 Subject: [PATCH 097/302] clean up nginx page --- content/pages/05-deployment/19-nginx.markdown | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/pages/05-deployment/19-nginx.markdown b/content/pages/05-deployment/19-nginx.markdown index d7f393ab6..2dd6c3955 100644 --- a/content/pages/05-deployment/19-nginx.markdown +++ b/content/pages/05-deployment/19-nginx.markdown @@ -155,7 +155,3 @@ several years. from your traffic logs when using them for web traffic analytics. -### Nginx release summaries -* [nginx-1.13.0](http://mailman.nginx.org/pipermail/nginx-announce/2017/000195.html) - - From 5beb25beb0c5183ec41a7cdeee8f301bc6937629 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 18 Apr 2020 13:02:49 -0400 Subject: [PATCH 098/302] add web design resource --- content/pages/04-web-development/15-web-design.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index ccffb3f31..4eeed7bf3 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -71,6 +71,11 @@ this short list as my absolute favorites that help developers become Highly recommended especially if you feel you have no design skills but need to learn them. +* [Building dark mode on Stack Overflow](https://stackoverflow.blog/2020/03/31/building-dark-mode-on-stack-overflow/) + explains the thought process and work that the team at Stack Overflow + had to do with colors, styling and the code implementation so they + could offer a dark mode design to their users. + * [A short history of body copy sizes on the Web](https://fvsch.com/body-copy-sizes/) provides a useful examination of how originally the web's typography mirrored what was in traditional print. Eventually, the designs shifted From 3fb7c657080dfc03509bb0c7fa347173bef7bf64 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 18 Apr 2020 13:03:52 -0400 Subject: [PATCH 099/302] update changelog --- content/pages/meta/00-change-log.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 4657ca29d..601d45cd5 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,9 @@ view commit-level changes via the on GitHub. ## 2020 +### April +* Updated the [web design](/web-design.html) page with new resources. + ### March * Added another new blog post on [Exporting pandas DataFrames into SQLite with SQLAlchemy](/blog/export-pandas-dataframes-sqlite-sqlalchemy.html). From 34635fdf31ba2dac2b14bde0cc29a428bf915704 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 23 Apr 2020 10:09:04 -0400 Subject: [PATCH 100/302] update changelog --- content/pages/meta/00-change-log.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 601d45cd5..43bd81e3d 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,9 @@ on GitHub. ## 2020 ### April +* Merge [PR #233](https://github.com/mattmakai/fullstackpython.com/pull/233) and + [PR #235](https://github.com/mattmakai/fullstackpython.com/pull/235) for new + [Celery](/celery.html) and [podcast](/best-python-podcasts.html) resources. * Updated the [web design](/web-design.html) page with new resources. ### March From 7c45dcd67c46a58cd72061edc76be062ba233c0b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 25 Apr 2020 09:55:32 -0400 Subject: [PATCH 101/302] add new javascript resource --- content/pages/04-web-development/23-javascript.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/pages/04-web-development/23-javascript.markdown b/content/pages/04-web-development/23-javascript.markdown index 14226cc88..e4910976d 100644 --- a/content/pages/04-web-development/23-javascript.markdown +++ b/content/pages/04-web-development/23-javascript.markdown @@ -65,6 +65,12 @@ Allen Wirfs-Brock for more context on the language's evolution. * [A re-introduction to JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript) by Mozilla walks through the basic syntax and operators. +* [The Cost of Javascript Frameworks](https://timkadlec.com/remembers/2020-04-21-the-cost-of-javascript-frameworks/) + presents a balanced view of how JavaScript libraries and frameworks impact + web performance on both desktop and mobile. The author acknowledges that + these libraries are useful for developers but in extreme cases there are + significant downsides to including so much JavaScript in pages. + * [The State of JavaScript report](https://stateofjs.com/) contains a wealth of data on what libraries developers are using in the JavaScript ecosystem. There are also reports from previous years which show how the From 430272b66e4fbd35a4741d0efb9dff333d715ece Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 25 Apr 2020 10:16:15 -0400 Subject: [PATCH 102/302] new shell resource --- content/pages/02-development-environments/07-shells.markdown | 4 ++++ content/pages/03-data/08-django-orm.markdown | 4 ++++ content/pages/04-web-development/52-twilio.markdown | 3 +++ 3 files changed, 11 insertions(+) diff --git a/content/pages/02-development-environments/07-shells.markdown b/content/pages/02-development-environments/07-shells.markdown index 845728809..aa5ac671f 100644 --- a/content/pages/02-development-environments/07-shells.markdown +++ b/content/pages/02-development-environments/07-shells.markdown @@ -45,3 +45,7 @@ environment named `fullstackpython` within the macOS Terminal application. little tool that shows how input and arguments in the shell break down and are interpreted by commands. The data is pulled from the [Ubuntu](/ubuntu.html) `man` pages. + +* [Shell productivity tips and tricks](https://blog.balthazar-rouberol.com/shell-productivity-tips-and-tricks.html) + covers how to increase your effectiveness on the shell across topics such as + navigating history, autocompletion, and pattern matching. diff --git a/content/pages/03-data/08-django-orm.markdown b/content/pages/03-data/08-django-orm.markdown index 3184e1b70..e8c08aaee 100644 --- a/content/pages/03-data/08-django-orm.markdown +++ b/content/pages/03-data/08-django-orm.markdown @@ -39,6 +39,10 @@ that have been added throughout the project's history. [Django Silk](http://mtford.co.uk/blog/2/) is another inspection tool and has capabilities to do more than just SQL inspection. +* [Django QuerySet Examples (with SQL code included)](https://davit.tech/django-queryset-examples/) + teaches how QuerySets work and shows the corresponding SQL code behind the + Python code you write to use the ORM. + * [Making a specific Django app faster](http://reinout.vanrees.org/weblog/2014/05/06/making-faster.html) is a Django performance blog post with some tips on measuring performance and optimizing based on the measured results. diff --git a/content/pages/04-web-development/52-twilio.markdown b/content/pages/04-web-development/52-twilio.markdown index cf5343826..0eaca245d 100644 --- a/content/pages/04-web-development/52-twilio.markdown +++ b/content/pages/04-web-development/52-twilio.markdown @@ -92,6 +92,9 @@ for fellow developers. walks through using the Python runtime on [AWS Lambda](/aws-lambda.html) and Twilio's APIs for validating phone number information. +* [Receive Flask Error Alerts by Email with Twilio SendGrid](https://www.twilio.com/blog/receive-flask-error-alerts-email-twilio-sendgrid) + shows how to use Twilio to add email error reports to [Flask](/flask.html) + web applications. * [Google Cloud recommends developers use Twilio](https://cloud.google.com/appengine/docs/standard/python/sms/twilio) for communications in their apps and provides a short walkthrough for From f2a08dca9a17867bbdfae4ff8000f8c142749a50 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 1 May 2020 12:34:41 -0400 Subject: [PATCH 103/302] work on pandas code examples --- .../pandas-example-projects-code.markdown | 63 ++++++++++++++++++ content/pages/meta/00-change-log.markdown | 4 ++ static/img/logos/sentry-light.png | Bin 8610 -> 14141 bytes .../django.html | 2 +- .../pandas.html | 12 ++++ theme/templates/index-sidebar.html | 5 +- theme/templates/page.html | 3 + theme/templates/sponsor.html | 1 + theme/templates/sponsor/sentry.html | 7 ++ 9 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 content/pages/examples/pandas/pandas-example-projects-code.markdown create mode 100644 theme/templates/examples-extensions-descriptions/pandas.html create mode 100644 theme/templates/sponsor/sentry.html diff --git a/content/pages/examples/pandas/pandas-example-projects-code.markdown b/content/pages/examples/pandas/pandas-example-projects-code.markdown new file mode 100644 index 000000000..facc17141 --- /dev/null +++ b/content/pages/examples/pandas/pandas-example-projects-code.markdown @@ -0,0 +1,63 @@ +title: pandas Example Projects and Code +category: page +slug: pandas-code-examples +sortorder: 500090001 +toc: False +sidebartitle: pandas Example Code +meta: Python example projects and code that show how to use the pandas data analysis library. + + +## Projects with pandas Example Code +The following active projects use the [pandas](/pandas.html) data analysis +library in various ways that can show you how to inspect your own data sets +and build your own applications. + + +### 100-pandas-puzzles +[100 pandas puzzles](https://github.com/ajcr/100-pandas-puzzles) is a project with +100 exercises that test knowledge of pandas' functionality. The project contains two +[Jupyter Notebooks](/jupyter-notebook.html), one with +[just the puzzles](https://github.com/ajcr/100-pandas-puzzles/blob/master/100-pandas-puzzles.ipynb) +and the other with +[both puzzles and solutions](https://github.com/ajcr/100-pandas-puzzles/blob/master/100-pandas-puzzles-with-solutions.ipynb). + +The project is provided as open source under the +[MIT license](https://github.com/ajcr/100-pandas-puzzles/blob/master/LICENSE). + + +### data-science-ipython-notebooks +[data-science-ipython-notebooks](https://github.com/donnemartin/data-science-ipython-notebooks) +is a collection of Jupyter Notebooks including a folder with +[pandas code examples](https://github.com/donnemartin/data-science-ipython-notebooks/tree/master/pandas). + +These notebooks are provided as open source under the +[Apache 2.0 license](https://github.com/donnemartin/data-science-ipython-notebooks/blob/master/LICENSE). + + +### pandas-videos +[Python pandas Q&A video series](https://github.com/justmarkham/pandas-videos) contains the +Python code that pairs with +[Kevin Markham's video series on data analysis with pandas](https://www.youtube.com/playlist?list=PL5-da3qGB5ICCsgW1MxlZ0Hq8LL5U3u9y). +The repository contains several Jupyter Notebooks, including ones on +[the top pandas tricks](https://github.com/justmarkham/pandas-videos/blob/master/top_25_pandas_tricks.ipynb), +[merging DataFrames](https://github.com/justmarkham/pandas-videos/blob/master/pandas_merge.ipynb), +and +[using MultiIndex](https://github.com/justmarkham/pandas-videos/blob/master/pandas_multiindex.ipynb). + + +### ved-explore +[ved-explore](https://github.com/joaofig/ved-explore) is a set of open source +Jupyter Notebooks that demonstrate analysis of the +[Vehicle Energy Dataset (VED)](https://arxiv.org/abs/1905.02081). The project +is provided as open source under the +[MIT license](https://github.com/joaofig/ved-explore/blob/master/LICENSE). + + +### viz +[viz](https://github.com/donnemartin/viz) +([project site](https://donnemartin.com/viz/)) +is a collection of interactive Jupyter Notebooks that show metrics +about open source Git repositories stored on GitHub. The code is open source +under the +[Apache 2.0 license](https://github.com/donnemartin/viz/blob/master/LICENSE.md). + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 43bd81e3d..82b71b324 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2020 +### May +* Added a new page with the start of + [pandas example code and projects](/pandas-code-examples.html). + ### April * Merge [PR #233](https://github.com/mattmakai/fullstackpython.com/pull/233) and [PR #235](https://github.com/mattmakai/fullstackpython.com/pull/235) for new diff --git a/static/img/logos/sentry-light.png b/static/img/logos/sentry-light.png index 37494b19fb7d3ac254a3ff1796221603a5837cd4..6d974506134c3e381e20eebddf73bb368c901cdd 100644 GIT binary patch literal 14141 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 bKfx&wHIGjORo49eKulgnMY>e-z5o9KNf(i0 literal 8610 zcmd6NXH-+)(svXP5D}y)9i=M8f)HvzL@**s6NFHdA_CHTFA9oMlq$V<0)G$)ArP8~ zfP^X#ASBe#Lz4iZJO}TWyViZyeZRc#TJMMKbF$Z&y=TwNo|!$r9jWs~lkq&)c@PN1 z2z{uo2LheN0PhEM=YY2AYbzRf(7QY|b_anNSWbUu25~`$AdmnEs(#PFXM7Du(w!Zv z`!S7h?)9de6Ts@9Z+T3;s}5p4vrgxt8S)_;cd14p?DnOa582wFira=D+G~WM{$1o< zDn@@ht)z0i{%_Ax%!@bHN4~YSyW{+P{QNY)oP^Qi_u9Y{#GHNxXv3s|M%Cq%DY{es zK&_lWBOpfwwA8kz9e>*p!Uf>{8js5kSds5bvk;g}=#5eSq`f+#^C)$9k{Ux{%XaU#x#iy8Tk2i^2n*RgIOPzWIk zO}!uu)q)E4B}3{r(yQ44HMDYe@}(xnN!>V3g+Zk?vi{Y@l`0J-h6dp>82Vs!5+Kkb zRf9cqDqJJZ(8=;DppI5f%}c3$XWuV0MRr5q0v(#MdeO5?z4xIo=vyxQLZ5b34|W_- z`PbVs0f!ti?_Wjg0xIpNijw2668hK~cWk$~266m|i-TVTfnwMNF`beQ8%=s5=g*!R zhJtA1OiI4pTW9&t3Dxs|Su%^~v>Jz zJ!u%Ci~I@I59I}f@%t-}Pe2ZKJZOEQaI81$s6rYV%uTiT(HXEW9#)O?*r)b%y-a>N z5NtS}yWKV$1sI}$TwYV0803q`OZtX1OGMy&v*d+l=LB`vZZN@f50kx#he%qPQ0IBD&pcAAx zKd=}9x!Da<<*I_CNz_WR*(U`pe+7+47XnkW)l-m56D;%+$6# z<9c^Fn*$#}U z_v(Ri@a;yAFY23LD}lWPFePRL2G|8Nv5iTtE$N}?;I)g*p={c0ltfv>6 zl52vtnkOtIa2G+U#6X{b0Bdm%@yRIRBP*Y!WbG;#^|6FB6wi3`sQ$VaC;pZAZh`;0COR$YYmerWM|6GNUztJuZ*{9k9sBkRUyw+z$&T**@i~q+V zn2LWUa#=k1q?=K|ClIY&rMN=yd^ue~uQ0N$`7BD#JJ!Y$|JJ_v<`f%BDRRaET7(Y1 z&(cwLK0{eY*+XLPq=uk;&M8>VljJFCCw$#OK>g{ySMP*Xs`}=EvUp_O_xcDDs*=+8 zPy58e4i>2$=ae;B|9(8{)QT{*cAZWSp9%%mO$Pi~3d#9_goWC^qAQ_X3U5#=oe$ys zu!#v}_6_OAh0-q3Pt>-1)lste5o3;Ndy`5(7qum~7Z7N!&)V7T#Sng*YfBC+9k8<= z;*6#~ud1%`3_${=mi$AuF{a13{PLGO%%hP8$5b~Efj0&Om~4cKLtmMFNV?5__)qIvzZ=)qf@y* z+p*eE(ZzD+shBi+dVDwSah+dn;Z19K;j?fz3?pOA;lhSLOUKlx0eNTl$3|vPl1f*X zK@5hnH;7m2gv|FSml0A ztd<0gbUS3Y-mX>r<8x0s%$-8j|9oDZ*20K(vBW|CvqnWa=;%W4Q?mvJ>{sV1cEe%C z*`L}%@IWUPoab*hxT50(>&W@1--vXuS z`NyOEAL68&BYf$7xZ>4>E$Cp@%|n#iiIa62+rfx7KSj;|@%5a0Oc&-(-q|?GokWkj z1xeQ-<_{$}RP9i|{Ho$>v~zu?cEZj9p2ag>N=n(n?~A(Y$Y|HOPy^p?m)TteS>kcL zisG5rXBBsC$EYK}74v zw-zgtjA8SKVB6_CNs~^JJSXFArDjj%;n76D=oUlWpb z%hU!LP9g_CD-eCn(h;!((HWs&!(Y^3TC=hubmZwZrr-&DOZ{(^~t;@lIPI9^l%#a@7emRZ8MGl>eR%&9;<{uu?IN)uc5qs_b88i8CT@y>RhzdCPYV=$gtgJ(O zwc#~$dh8a#0(xL(lk(tUGL#K0Z*Psv>n8*4sRdnwfoCVOXocti__~CQi^>(6PKZtvZ5VLG zLn#Tsh>E@�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 y@c91Django is a Python web framework. +Django is a Python web framework. Official Django logo. Trademark Django Software Foundation. diff --git a/theme/templates/examples-extensions-descriptions/pandas.html b/theme/templates/examples-extensions-descriptions/pandas.html new file mode 100644 index 000000000..a032824e3 --- /dev/null +++ b/theme/templates/examples-extensions-descriptions/pandas.html @@ -0,0 +1,12 @@ +pandas is a data analysis library +built in Python. + +pandas data analysis project + +

pandas can be used in a Python script, a +Jupyter Notebook, or even as +part of a web application.

+ +

The following open source projects, ordered alphabetically, are +helpful as example code for how to use pandas in your own applications.

+ diff --git a/theme/templates/index-sidebar.html b/theme/templates/index-sidebar.html index 84b9558ab..ee2e71e2d 100644 --- a/theme/templates/index-sidebar.html +++ b/theme/templates/index-sidebar.html @@ -4,10 +4,11 @@
Full Stack Python is an open book that explains concepts in plain language. -
+
+ {% include "sponsor/sentry.html" %}
diff --git a/theme/templates/page.html b/theme/templates/page.html index 570ae6d6f..fcc0ea58d 100644 --- a/theme/templates/page.html +++ b/theme/templates/page.html @@ -51,6 +51,9 @@

{{ page.title }}

{% include "examples-extensions-descriptions/django.html" %} {% include "code-examples/django.html" %} {% endif %} + {% if page.slug == "pandas-code-examples" %} + {% include "examples-extensions-descriptions/pandas.html" %} + {% endif %} {{ page.content }} {% endif %} {% if page.sortorder[0:2] == "50" %} diff --git a/theme/templates/sponsor.html b/theme/templates/sponsor.html index bc378aee8..6997c5df5 100644 --- a/theme/templates/sponsor.html +++ b/theme/templates/sponsor.html @@ -1,4 +1,5 @@ {% if page.sortorder[0:2] == "01" or page.sortorder[0:2] == "02" or page.sortorder[0:2] == "03" or page.sortorder[0:2] == "04" or page.sortorder[0:2] == "05" or page.sortorder[0:2] == "06" or page.sortorder[0:2] == "50" %} +{% include "sponsor/sentry.html" %} {% include "sponsor/carbon.html" %} {% endif %} {% if false %} diff --git a/theme/templates/sponsor/sentry.html b/theme/templates/sponsor/sentry.html new file mode 100644 index 000000000..a919be8fe --- /dev/null +++ b/theme/templates/sponsor/sentry.html @@ -0,0 +1,7 @@ +
+

Sponsored By

+
+ Sentry logo +

Software errors are inevitable. Chaos is not. Try Sentry for free.

+
+
From 6cca37b1239df82974f809fb7a30d681fb4a916e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 1 May 2020 13:15:34 -0400 Subject: [PATCH 104/302] fixing a bunch of broken links --- .../01-introduction/02-python-programming-language.markdown | 2 +- .../02-development-environments/18-source-control.markdown | 4 ---- content/pages/03-data/12-mongodb.markdown | 4 ---- content/pages/examples/django/django-conf-urls-url.markdown | 2 +- content/pages/examples/django/django-forms-datefield.markdown | 2 +- 5 files changed, 3 insertions(+), 11 deletions(-) diff --git a/content/pages/01-introduction/02-python-programming-language.markdown b/content/pages/01-introduction/02-python-programming-language.markdown index c99bf04ff..87a44028b 100644 --- a/content/pages/01-introduction/02-python-programming-language.markdown +++ b/content/pages/01-introduction/02-python-programming-language.markdown @@ -153,7 +153,7 @@ the very beginner topics. [comprehensions](http://python-3-patterns-idioms-test.readthedocs.org/en/latest/Comprehensions.html) including code examples and diagrams to explain how they work. -* [Comprehensions in Python the Jedi way](https://gist.github.com/bearfrieze/a746c6f12d8bada03589) +* [Comprehensions in Python the Jedi way](https://gist.github.com/mjhea0/1c0031bd6fcd9263f844) shows off comprehensions with a Star Wars theme to walk through the nuts and bolts. All examples use Python 3.5. diff --git a/content/pages/02-development-environments/18-source-control.markdown b/content/pages/02-development-environments/18-source-control.markdown index 064f9729b..83913183d 100644 --- a/content/pages/02-development-environments/18-source-control.markdown +++ b/content/pages/02-development-environments/18-source-control.markdown @@ -118,10 +118,6 @@ control services are: part of an ongoing deployment guide written by the folks at [Rainforest](https://www.rainforestqa.com/). -* This lighthearted guide to the - [ten astonishments in version control history](http://www.flourish.org/2011/12/astonishments-ten-in-the-history-of-version-control/) - is a fun way to learn how systems developed over the past several decades. - * [A visual guide to version control](http://betterexplained.com/articles/a-visual-guide-to-version-control/) is a detailed article with real-life examples for why version control is necessary in software development. diff --git a/content/pages/03-data/12-mongodb.markdown b/content/pages/03-data/12-mongodb.markdown index 407cb1c30..94826bfd6 100644 --- a/content/pages/03-data/12-mongodb.markdown +++ b/content/pages/03-data/12-mongodb.markdown @@ -120,10 +120,6 @@ configure and start using MongoDB with Python. shows how to use Python to interface with MongoDB via PyMongo and MongoEngine. -* A [Gentle Introduction to MongoDB using Pymongo](http://altons.github.io/python/2013/01/21/gentle-introduction-to-mongodb-using-pymongo/) - reviews a connection configuration file, the basics for data insertion, - aggregation and updating records. - * [How To Set Up Flask with MongoDB and Docker](https://www.digitalocean.com/community/tutorials/how-to-set-up-flask-with-mongodb-and-docker) combines the [Flask](/flask.html) web framework with MongoDB then containerizes the example application with [Docker](/docker.html). diff --git a/content/pages/examples/django/django-conf-urls-url.markdown b/content/pages/examples/django/django-conf-urls-url.markdown index 6540e8fe8..23f28e83c 100644 --- a/content/pages/examples/django/django-conf-urls-url.markdown +++ b/content/pages/examples/django/django-conf-urls-url.markdown @@ -128,7 +128,7 @@ urlpatterns = [ ## Example 3 from register [register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), -[Bootstrap](/bootstrap.html), [PostgreSQL](/postgresql.html) project that is +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is open source under the [GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). This web application makes it easier for people to register as organ donors. diff --git a/content/pages/examples/django/django-forms-datefield.markdown b/content/pages/examples/django/django-forms-datefield.markdown index 0268e90d0..9d97fbfa3 100644 --- a/content/pages/examples/django/django-forms-datefield.markdown +++ b/content/pages/examples/django/django-forms-datefield.markdown @@ -311,7 +311,7 @@ except ImportError: ## Example 4 from register [register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), -[Bootstrap](/bootstrap.html), [PostgreSQL](/postgresql.html) project that is +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is open source under the [GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). This web application makes it easier for people to register as organ donors. From 338e81f31116dc1f3ee431214aa3b4c8e6745ad3 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 1 May 2020 13:18:26 -0400 Subject: [PATCH 105/302] fixing a couple more broken links --- .../01-text-editors-ides.markdown | 2 +- .../02-development-environments/06-jupyter-notebook.markdown | 4 ---- content/pages/05-deployment/19-nginx.markdown | 5 ++--- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/content/pages/02-development-environments/01-text-editors-ides.markdown b/content/pages/02-development-environments/01-text-editors-ides.markdown index 9f23de412..f179ee45d 100644 --- a/content/pages/02-development-environments/01-text-editors-ides.markdown +++ b/content/pages/02-development-environments/01-text-editors-ides.markdown @@ -78,7 +78,7 @@ gathering [code metrics](/code-metrics.html), running free editions for students and open source projects. * [Thonny](http://thonny.org/) is an - [open source](https://bitbucket.org/plas/thonny/src) Python IDE for new + [open source](https://github.com/thonny/thonny) Python IDE for new programmers. The tool bakes in syntax highlighting, code completion, a simple debugger, a beginner-friendly shell and in situ documentation to assist new developers who are just starting to code. diff --git a/content/pages/02-development-environments/06-jupyter-notebook.markdown b/content/pages/02-development-environments/06-jupyter-notebook.markdown index 28e795585..ddd5c5efa 100644 --- a/content/pages/02-development-environments/06-jupyter-notebook.markdown +++ b/content/pages/02-development-environments/06-jupyter-notebook.markdown @@ -151,10 +151,6 @@ like advanced interactive visualizations. you will eventually want to handle within your notebooks as you get comfortable in the environment. -* [Hacking my way to a Jupyter notebook powered blog](https://nipunbatra.github.io/blog/2017/Jupyter-powered-blog.html) - explores how the author created a blog using Jupyter but ran into some - issues along the way, along with how to solve those problems. - * [Making Publication Ready Python Notebooks](http://blog.juliusschulz.de/blog/ultimate-ipython-notebook) explores the plugins that the author uses when creating and exporting reports from Jupyter. diff --git a/content/pages/05-deployment/19-nginx.markdown b/content/pages/05-deployment/19-nginx.markdown index 2dd6c3955..afe620d84 100644 --- a/content/pages/05-deployment/19-nginx.markdown +++ b/content/pages/05-deployment/19-nginx.markdown @@ -66,9 +66,8 @@ HTTP(S) configurations. walks throough installing a free SSL certificate from Let's Encrypt to secure HTTP connects to your nginx server via HTTPS. -* The tools [Nginx Config](https://nginxconfig.io/) and - [Cipherlist](https://cipherli.st/) generate strong encryption configurations - and ciphers for Nginx. +* The [Nginx Config](https://nginxconfig.io/) tool can generate strong + encryption configurations and ciphers for Nginx. * [Gixy](https://github.com/yandex/gixy) is a static analyzer for your Nginx configuration and can tell you issues with how you are setup. From e846af31d97623ff972395e7cd1dff8259dad0d9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 9 May 2020 12:34:27 -0400 Subject: [PATCH 106/302] update web design resources --- .../pages/04-web-development/15-web-design.markdown | 12 ++++++------ content/pages/meta/00-change-log.markdown | 1 + theme/templates/css/carbon.css | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index 4eeed7bf3..81b3ffa07 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -21,6 +21,11 @@ Creating web pages with their own style and interactivity so users can easily accomplish their tasks is a major part of building modern web applications. +## Getting started if you have no "eye" for design + + + + ## Designing for various screen sizes Separating the content from the rules for how to display the content allows devices to render the output differently based on factors such as screen size @@ -50,7 +55,7 @@ this short list as my absolute favorites that help developers become page elements. * [Resilient web design](https://resilientwebdesign.com/) is an incredible - online book that teaches how to create websitess that are accessible to + online book that teaches how to create websites that are accessible to every reader and look great while doing it. * [Design 101 for Developers](https://academy.realm.io/posts/christopher-downer-design-101-for-developers/) @@ -66,11 +71,6 @@ this short list as my absolute favorites that help developers become is a fantastic article from a professional designer on how he thinks about color and uses it for certain effects in his designs. -* The [Bootstrapping Design](http://bootstrappingdesign.com/) book is one of - the clearest and concise resources for learning design that I've ever read. - Highly recommended especially if you feel you have no design skills but - need to learn them. - * [Building dark mode on Stack Overflow](https://stackoverflow.blog/2020/03/31/building-dark-mode-on-stack-overflow/) explains the thought process and work that the team at Stack Overflow had to do with colors, styling and the code implementation so they diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 82b71b324..16b45d942 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,7 @@ on GitHub. ## 2020 ### May +* Tweaked some CSS for the site. * Added a new page with the start of [pandas example code and projects](/pandas-code-examples.html). diff --git a/theme/templates/css/carbon.css b/theme/templates/css/carbon.css index 831d3c73e..85f45fcb3 100644 --- a/theme/templates/css/carbon.css +++ b/theme/templates/css/carbon.css @@ -1 +1 @@ -{% raw %}#carbonads { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif; } #carbonads { display: flex; max-width: 330px; background-color: hsl(0, 0%, 98%); box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, .1); } #carbonads a { color: inherit; text-decoration: none; } #carbonads a:hover { color: inherit; } #carbonads span { position: relative; display: block; overflow: hidden; } #carbonads .carbon-wrap { display: flex; } .carbon-img { display: block; margin: 0; line-height: 1; } .carbon-img img { display: block; } .carbon-text { font-size: 13px; padding: 10px; line-height: 1.5; text-align: left; } .carbon-poweredby { display: block; padding: 8px 10px; background: repeating-linear-gradient(-45deg, transparent, transparent 5px, hsla(0, 0%, 0%, .025) 5px, hsla(0, 0%, 0%, .025) 10px) hsla(203, 11%, 95%, .4); text-align: center; text-transform: uppercase; letter-spacing: .5px; font-weight: 600; font-size: 9px; line-height: 1; }{% endraw %} +{% raw %} #carbonads { display: block; overflow: hidden; text-align: center; font-size: 14px; line-height: 1.5; } #carbonads a { color: inherit; border: 0; } #carbonads a:hover { color: inherit; } #carbonads span { display: block; overflow: hidden; } .carbon-img { display: block; margin: 0 auto 8px; line-height: 1; } .carbon-text { display: block; margin-bottom: 8px; } .carbon-poweredby { text-transform: uppercase; display: block; font-size: 10px; font-family: "Helvetica Neue", sans-serif; letter-spacing: 1px; line-height: 1; } @media only screen and (min-width: 320px) and (max-width: 759px) { #carbonads { float: none; margin: 0 auto; max-width: 330px; } #carbonads span { position: relative; } #carbonads>span { max-width: none; } .carbon-img { float: left; margin: 0 1em 0 0; } .carbon-text { float: left; margin-bottom: 20px; text-align: left; max-width: calc(100% - 130px - 1em); } .carbon-poweredby { position: absolute; left: 142px; bottom: 0; display: block; } }{% endraw %} From 7da83e71fcd4e8b25b3ed0e0d4e7fea6e71e2b98 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 9 May 2020 14:10:37 -0400 Subject: [PATCH 107/302] working on web design page --- .../04-web-development/15-web-design.markdown | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index 81b3ffa07..5093e4823 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -22,8 +22,24 @@ accomplish their tasks is a major part of building modern web applications. ## Getting started if you have no "eye" for design +Design can feel like something "creative" people understand intuitively, +but like all skills design is something that can be learned. Some people +are faster learners in design just like some folks are quicker in +picking up programming. But anyone can learn how to be a better designer +by learning the basic principles and practicing them. +One of the best mental models for basic design is C.R.A.P., which helped me +grasp why some designs look good while others do not. CRAP is an acronym +for: + * Contrast: noticeable differences from one element to another + * Repetition: elements' consistency + * Alignment: order among all elements + * Proximity: placement between elements and how they are organized + +These basic principles all you to start breaking down the problem into +digestible pieces that you can work on rather than feeling like you +"just don't have an eye for design". ## Designing for various screen sizes @@ -118,6 +134,10 @@ this short list as my absolute favorites that help developers become [blog post series on building a browser engine](http://limpet.net/mbrubeck/2014/08/08/toy-layout-engine-1.html) that will show you how to build a simple rendering engine. +* [How to Use C.R.A.P. Design Principles for Better UX](https://vwo.com/blog/crap-design-principles/) + has a good summary of what contrast, repetition, alignment and + proximity means for designing user interfaces. + * [Defining Colors in CSS](https://pineco.de/defining-colors-in-css/) presents how to define color in your [Cascading Style Sheets (CSS)](/cascading-style-sheets.html) and breaks From 286ff19ce3eaebdf7406e25eeef2fc777ee275cb Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 25 May 2020 14:31:21 -0400 Subject: [PATCH 108/302] adding new sentry exception handling blog post --- .../06-jupyter-notebook.markdown | 4 + .../10-powershell.markdown | 6 + .../17-localhost-tunnels.markdown | 6 +- content/pages/03-data/00-data.markdown | 4 + content/pages/03-data/02-postgresql.markdown | 12 + content/pages/03-data/03-mysql.markdown | 4 + content/pages/03-data/16-pandas.markdown | 8 + .../00-web-development.markdown | 6 + .../04-web-development/02-django.markdown | 14 + .../04-web-development/03-flask.markdown | 5 + .../04-web-development/25-vuejs.markdown | 5 + .../04-web-development/35-testing.markdown | 6 + .../45-microservices.markdown | 4 + .../48-api-creation.markdown | 12 + .../04-web-development/52-twilio.markdown | 5 + .../04-web-development/53-stripe.markdown | 5 + .../04-web-development/54-slack.markdown | 4 + .../05-deployment/35-containers.markdown | 5 + .../pages/05-deployment/36-docker.markdown | 4 + .../05-deployment/39-aws-lambda.markdown | 5 + .../pages/06-devops/03-prometheus.markdown | 5 + .../06-devops/06-web-app-performance.markdown | 5 + .../pages/06-devops/18-web-analytics.markdown | 7 +- .../flask/flask-code-examples.markdown | 79 - .../flask-example-projects-code.markdown | 48 + .../flask/flask-extensions-plug-ins.markdown | 53 + .../flask/flask-globals-request.markdown | 630 ++ .../flask-helpers-make-response.markdown | 230 + .../flask/flask-helpers-url-for.markdown | 87 + .../flask/flask-signals-namespace.markdown | 103 + .../flask/flask-views-methodview.markdown | 119 + .../200525-python-exceptions-sentry.markdown | 376 ++ .../flask-core-extensions-code-examples.html | 8 + .../create-new-project-screen.jpg | Bin 0 -> 270443 bytes static/img/200525-sentry/create-project.jpg | Bin 0 -> 155032 bytes .../200525-sentry/detailed-error-report.jpg | Bin 0 -> 263647 bytes .../200525-sentry/exception-in-dashboard.jpg | Bin 0 -> 131633 bytes static/img/200525-sentry/header.jpg | Bin 0 -> 51348 bytes .../python-sentry-quickstart.jpg | Bin 0 -> 230612 bytes static/img/200525-sentry/sentry-email.jpg | Bin 0 -> 139238 bytes .../200525-sentry/sentry-empty-dashboard.jpg | Bin 0 -> 298454 bytes static/img/200525-sentry/sentry-homepage.jpg | Bin 0 -> 246339 bytes ...port-exceptions-python-scripts-sentry.html | 5 + theme/templates/code-examples/django.html | 2 +- theme/templates/code-examples/flask.html | 338 +- theme/templates/code-examples/twilio.html | 5461 +++++++++++++++++ theme/templates/css/page-article.css | 2 +- theme/templates/css/toc.css | 2 +- .../flask.html | 14 + theme/templates/page.html | 4 + 50 files changed, 7609 insertions(+), 93 deletions(-) delete mode 100644 content/pages/examples/flask/flask-code-examples.markdown create mode 100644 content/pages/examples/flask/flask-example-projects-code.markdown create mode 100644 content/pages/examples/flask/flask-extensions-plug-ins.markdown create mode 100644 content/pages/examples/flask/flask-globals-request.markdown create mode 100644 content/pages/examples/flask/flask-helpers-make-response.markdown create mode 100644 content/pages/examples/flask/flask-helpers-url-for.markdown create mode 100644 content/pages/examples/flask/flask-signals-namespace.markdown create mode 100644 content/pages/examples/flask/flask-views-methodview.markdown create mode 100644 content/posts/200525-python-exceptions-sentry.markdown create mode 100755 redirects/flask-core-extensions-code-examples.html create mode 100644 static/img/200525-sentry/create-new-project-screen.jpg create mode 100644 static/img/200525-sentry/create-project.jpg create mode 100644 static/img/200525-sentry/detailed-error-report.jpg create mode 100644 static/img/200525-sentry/exception-in-dashboard.jpg create mode 100644 static/img/200525-sentry/header.jpg create mode 100644 static/img/200525-sentry/python-sentry-quickstart.jpg create mode 100644 static/img/200525-sentry/sentry-email.jpg create mode 100644 static/img/200525-sentry/sentry-empty-dashboard.jpg create mode 100644 static/img/200525-sentry/sentry-homepage.jpg create mode 100644 theme/templates/blog/report-exceptions-python-scripts-sentry.html create mode 100644 theme/templates/code-examples/twilio.html create mode 100644 theme/templates/examples-extensions-descriptions/flask.html diff --git a/content/pages/02-development-environments/06-jupyter-notebook.markdown b/content/pages/02-development-environments/06-jupyter-notebook.markdown index ddd5c5efa..5b2b44a06 100644 --- a/content/pages/02-development-environments/06-jupyter-notebook.markdown +++ b/content/pages/02-development-environments/06-jupyter-notebook.markdown @@ -81,6 +81,10 @@ your own productive workflow. examines the growth of the Jupyter ecosystem and the jump from exploratory analysis notebooks to production notebooks. +* [Jupyter Notebook Best Practices](https://levelup.gitconnected.com/jupyter-notebook-best-practices-fc326eb5cd22) + contains tips for beginners such as learning shortcuts and properly + documenting the analysis you work on. + * [How to Version Control Jupyter Notebooks](https://nextjournal.com/schmudde/how-to-version-control-jupyter) explains how Jupyter Notebooks are stored in JSON, the issues with that format for [source control](/source-control.html) and how to get diff --git a/content/pages/02-development-environments/10-powershell.markdown b/content/pages/02-development-environments/10-powershell.markdown index 6c399fb52..8ff71b563 100644 --- a/content/pages/02-development-environments/10-powershell.markdown +++ b/content/pages/02-development-environments/10-powershell.markdown @@ -55,3 +55,9 @@ of a Python programmer's * [Invoke-Build](https://github.com/nightroman/Invoke-Build) is a build automation tool. There is also extensive documentation on their [wiki](https://github.com/nightroman/Invoke-Build/wiki). + +* [Two months with Powershell on a UNIX](https://code.joejag.com/2020/a-month-with-powershell.html) + examines one developer's experience using PowerShell not on Windows + but on a \*nix [operating system](/operating-systems.html). The author + covers the advantages and disadvantages he found during his experience + and some of the bugs he hopes are fixed in PowerShell 7. diff --git a/content/pages/02-development-environments/17-localhost-tunnels.markdown b/content/pages/02-development-environments/17-localhost-tunnels.markdown index 4cfe9d86e..f82b2c81e 100644 --- a/content/pages/02-development-environments/17-localhost-tunnels.markdown +++ b/content/pages/02-development-environments/17-localhost-tunnels.markdown @@ -23,7 +23,11 @@ experience with to the ones I have not used. * [ngrok](https://ngrok.com/) is the service I use most often. It is easy and worth the small fee to upgrade your account with a few - extra features such as fixed, customizable subdomains. + extra features such as fixed, customizable subdomains. There is + also a + [Python wrapper for ngrok called pyngrok](https://github.com/alexdlaird/pyngrok) + that makes it easy to programmatically access the ngrok client + from Python applications. * [Localtunnel](https://localtunnel.github.io/www/) is a localhost tunnel written in Node.js. diff --git a/content/pages/03-data/00-data.markdown b/content/pages/03-data/00-data.markdown index 2ef2bbdc8..a2c996e10 100644 --- a/content/pages/03-data/00-data.markdown +++ b/content/pages/03-data/00-data.markdown @@ -163,3 +163,7 @@ sets. [Jupyter Notebook](/jupyter-notebook.html) that [Stripe](/stripe.html) for their data analysis across the company. +* [The Definitive Data Scientist Environment Setup](https://davidadrian.cc/definitive-data-scientist-setup/) + explains how to set up both a hardware and software configuration that + is conducive to data science research and analysis. + diff --git a/content/pages/03-data/02-postgresql.markdown b/content/pages/03-data/02-postgresql.markdown index fbe6881f6..60ee8b4b2 100644 --- a/content/pages/03-data/02-postgresql.markdown +++ b/content/pages/03-data/02-postgresql.markdown @@ -175,9 +175,21 @@ for properly handling your data. past five years. It's amazing to see how far this project has come and how it continues to evolve. +* [The Internals of PostgreSQL](http://www.interdb.jp/pg/) is a book + that goes into how PostgreSQL works, including core topics such as + [query processing](http://www.interdb.jp/pg/pgsql03.html), + [concurrency control](http://www.interdb.jp/pg/pgsql05.html) and the + [layout of heap table files](http://www.interdb.jp/pg/pgsql01.html). + * [PostgreSQL Weekly](http://postgresweekly.com/) is a weekly newsletter of PostgreSQL content from around the web. +* [My Favorite PostgreSQL Extensions - Part One](https://severalnines.com/database-blog/my-favorite-postgresql-extensions-part-one) + and + [part two](https://severalnines.com/database-blog/my-favorite-postgresql-extensions-part-two) + are roundups of useful PostgreSQL extensions that augment the + standard PostgreSQL functionality. + * [An introduction to PostgreSQL physical storage](http://rachbelaid.com/introduction-to-postgres-physical-storage/) provides a solid walkthrough of where PostgreSQL files are located on disk, how the files store your data and what mappings are important for diff --git a/content/pages/03-data/03-mysql.markdown b/content/pages/03-data/03-mysql.markdown index 87edda6a3..27c52b9c4 100644 --- a/content/pages/03-data/03-mysql.markdown +++ b/content/pages/03-data/03-mysql.markdown @@ -133,6 +133,10 @@ A handful of the best of these tutorials are listed below. goes into details for why the company Userlike migrated from their MySQL database setup to PostgreSQL. +* [MySQL sharding at Quora](https://www.quora.com/q/quoraengineering/MySQL-sharding-at-Quora) + provides details behind Quora's at-scale infrastructure and + how their MySQL sharding evolved over time. + * [Growing up with MySQL](https://nylas.com/blog/growing-up-with-mysql/) is a story about how one company went through dramatic growth and had to keep up with it by quickly scaling their MySQL database. diff --git a/content/pages/03-data/16-pandas.markdown b/content/pages/03-data/16-pandas.markdown index 14c4b9ed6..8a523ba64 100644 --- a/content/pages/03-data/16-pandas.markdown +++ b/content/pages/03-data/16-pandas.markdown @@ -49,6 +49,10 @@ is a data structures and analysis library. shows how to use the `crosstab` function in pandas so you can summarize and group data. +* [Calculating streaks in pandas](https://joshdevlin.com/blog/calculate-streaks-in-pandas/) + shows how to measure and report on streaks in data, which is where + several events happen in a row consecutively. + * [How to Convert a Python Dictionary to a Pandas DataFrame](https://www.marsja.se/how-to-convert-a-python-dictionary-to-a-pandas-dataframe/) is a straightforward tutorial with example code for loading and adding data stored in a typical Python dictionary into a DataFrame. @@ -118,3 +122,7 @@ is a data structures and analysis library. * [How to use Pandas read_html to Scrape Data from HTML Tables](https://www.marsja.se/how-to-use-pandas-read_html-to-scrape-data-from-html-tables/) has a bunch of great code examples that show how to load data from HTML directly into your DataFrames. + +* [How to download fundamentals data with Python](http://theautomatic.net/2020/05/05/how-to-download-fundamentals-data-with-python/) + shows how to obtain and use financial data, such as balance sheets, + stock prices, and various ratios to perform your own analysis on. diff --git a/content/pages/04-web-development/00-web-development.markdown b/content/pages/04-web-development/00-web-development.markdown index 0aad8182f..29b3fb98b 100644 --- a/content/pages/04-web-development/00-web-development.markdown +++ b/content/pages/04-web-development/00-web-development.markdown @@ -21,6 +21,7 @@ in [1989](http://home.cern/topics/birth-web). Web development is the concept that encompasses all the activities involved with websites and web applications. + ## How does Python fit into web development? Python can be used to build server-side web applications. While a [web framework](/web-frameworks.html) is not required to build web apps, @@ -76,6 +77,11 @@ world. that the visualization unfortunately stops around the beginning of 2013 but it's a good way to explore what happened in the first 24 years. +* [What happens when?](https://github.com/alex/what-happens-when) is an + incredibly detailed answer to the questions "What happens when you + type google.com into your browser's address box and press enter?" that + seems straightforward on the surface until you really dig in. + * [How browsers work](https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/) provides an overview with solid detail on how browsers take the HTML, CSS, JavaScript, images and other files as input and render webpages as diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index 927c8d57b..253e9efd9 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -135,12 +135,21 @@ the framework. order to build and deploy a RESTful API powered by Python, Django, and Django REST Framework. +* [User Interaction With Forms](https://www.mattlayman.com/understand-django/user-interaction-forms/) + explains general web form input, how Django handles forms via POST requests, + different types of input such as CharFields, DateFields and EmailFields, + and validating that input. + * This 3-part Django project optimization guide covers a wide range of advanced topics such as [Profiling and Django settings](https://dizballanze.com/django-project-optimization-part-1/), [working with databases](https://dizballanze.com/django-project-optimization-part-2/) and [caching](https://dizballanze.com/django-project-optimization-part-3/). +* [Caching in Django](https://testdriven.io/blog/django-caching/) is a detailed + look at the configuration required for caching and how to measure the + performance improvements once you have it in place. + * [Mental Models for Class Based Views](https://djangodeconstructed.com/2020/01/03/mental-models-for-class-based-views/) provides some comparison points between class based views (CBVs) and function based views and the author's opinions for how you can better @@ -257,6 +266,11 @@ based on [WebSockets](/websockets.html). is a good post to read for figuring out how to use [Gulp](http://gulpjs.com/) for handling front end tools in development and production Django sites. +* [Django Testing Cheat Sheet](https://www.valentinog.com/blog/testing-django/) + covers many common scenarios for Django applications such as testing + POST requests, request headers, authentication, and large numbers of + model fields in the [Django ORM](/django-orm.html). + * [Getting Started with Django Testing](http://howchoo.com/g/mjkwmtu5zdl/getting-started-with-django-testing) will help you stop procrastinating on testing your Django projects if you're uncertain where to begin. diff --git a/content/pages/04-web-development/03-flask.markdown b/content/pages/04-web-development/03-flask.markdown index 29bc0212a..5991ada50 100644 --- a/content/pages/04-web-development/03-flask.markdown +++ b/content/pages/04-web-development/03-flask.markdown @@ -181,6 +181,11 @@ combined with the example real-world projects listed in the next section. [Docker](/docker.html). It shows how to [deploy](/deployment.html) it to an Amazon EC2 instance then scale the services on Amazon EC2 Container Service (ECS). +* [Build a Video Chat Application with Python, JavaScript and Twilio Programmable Video](https://www.twilio.com/blog/build-video-chat-application-python-javascript-twilio-programmable-video) + shows how to use [Twilio](/twilio.html) + [Programmable Video](https://www.twilio.com/video) to build cross-platform + (web, iOS and Android) video into Flask applications. + * [Why and how to handle exceptions in Python Flask](https://opensource.com/article/17/3/python-flask-exceptions) has some great example code and reasons why you should code defensively by anticipating and handling the unhappy path exceptions in your Flask diff --git a/content/pages/04-web-development/25-vuejs.markdown b/content/pages/04-web-development/25-vuejs.markdown index 73c979499..20a22a4d1 100644 --- a/content/pages/04-web-development/25-vuejs.markdown +++ b/content/pages/04-web-development/25-vuejs.markdown @@ -43,6 +43,11 @@ rich apps that run in web browsers. coding you need to do to build a legitimate Vue.js application that uses a [Flask](/flask.html) API on the backend. +* [Building a SaaS using Django and Vue.js](https://www.youtube.com/playlist?list=PLpyspNLjzwBnGesxJOt_0r4xTWR80j7Y3) + shows how to create a software-as-a-service application with a + [Django](/django.html) back end and Vue on the front end via a + series of videos that are each between 10-15 minutes in length. + * [Learn Vue by Building and Deploying a CRUD App](https://testdriven.io/courses/learn-vue/?utm_source=fsp) is an awesome course that walks through the Vue basics and building a whole application and deploying it to diff --git a/content/pages/04-web-development/35-testing.markdown b/content/pages/04-web-development/35-testing.markdown index a69c8f126..1a5e2912e 100644 --- a/content/pages/04-web-development/35-testing.markdown +++ b/content/pages/04-web-development/35-testing.markdown @@ -101,6 +101,12 @@ test runners, coverage reports and related libraries. * [A beginner's guide to Python testing](https://miguelgfierro.com/blog/2018/a-beginners-guide-to-python-testing/) covers test-driven development for unit, integration and smoke tests. +* [Testing a Twilio Interactive Voice Response (IVR) System With Python and pytest](https://www.twilio.com/blog/testing-twilio-ivr-system-python-pytest) + is an incredibly in-depth tutorial on testing a Python-powered IVR + using pytest. There is also a tutorial on + [how to build the IVR before this testing tutorial](https://www.twilio.com/blog/building-interactive-voice-response-ivr-system-python-django-twilio), + although you can just clone it to jump into the testing walkthrough. + * Still confused about the difference between unit, functional and integration tests? Check out this [top answer on Stack Overflow](http://stackoverflow.com/questions/4904096/whats-the-difference-between-unit-functional-acceptance-and-integration-test) diff --git a/content/pages/04-web-development/45-microservices.markdown b/content/pages/04-web-development/45-microservices.markdown index 684dfc20d..bdf34a8b9 100644 --- a/content/pages/04-web-development/45-microservices.markdown +++ b/content/pages/04-web-development/45-microservices.markdown @@ -128,3 +128,7 @@ ease further development and deployment. This approach is called the * [The Hardest Part About Microservices: Your Data](http://blog.christianposta.com/microservices/the-hardest-part-about-microservices-data/) presents a data-centric view on how to structure and transport data in a microservices architecture. + +* [Deleting data distributed throughout your microservices architecture](https://blog.twitter.com/engineering/en_us/topics/infrastructure/2020/deleting-data-distributed-throughout-your-microservices-architecture.html) + examines how Twitter handles issues with discoverability, access and erasure + in their microservices-heavy production environment. diff --git a/content/pages/04-web-development/48-api-creation.markdown b/content/pages/04-web-development/48-api-creation.markdown index 74ab28c92..da38541c2 100644 --- a/content/pages/04-web-development/48-api-creation.markdown +++ b/content/pages/04-web-development/48-api-creation.markdown @@ -206,6 +206,13 @@ equivalent of browser testing in the web application world. second as well as the number of concurrent open connections can help keep your API alive during times of heavy traffic. +* [Writing HTTP files to test HTTP APIs](https://renato.athaydes.com/posts/writing-http-files-for-testing.html) + shows how to perform automated testing of APIs using HTTP file formats + provided by + [VS Code REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) + and the + [JetBrains HTTP Client Editor](https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html). + * Serialization is common for transforming objects into web API JSON results. One company found the serialization performance of Django REST framework was lacking so they created @@ -228,6 +235,11 @@ equivalent of browser testing in the web application world. * [Building better API docs](https://engineering.gosquared.com/building-better-api-docs) shows how Square used Swagger with React to create more helpful docs. +* [Best Practices For Creating Useful API Documentation](https://nordicapis.com/best-practices-for-creating-useful-api-documentation/) + covers standard but important topics such as knowing your audience, + ensuring your documentation covers the error codes, and providing + a changelog as well as terms of service. + ## Django REST Framework resources * This multi-part series on diff --git a/content/pages/04-web-development/52-twilio.markdown b/content/pages/04-web-development/52-twilio.markdown index 0eaca245d..9ba51f456 100644 --- a/content/pages/04-web-development/52-twilio.markdown +++ b/content/pages/04-web-development/52-twilio.markdown @@ -106,6 +106,11 @@ for fellow developers. Easypost service. There is also another tutorial on [shipment notifications specifically for Flask](https://www.twilio.com/blog/build-shipment-notification-service-python-flask-twilio-easypost). +* [Build a Video Chat Application with Python, JavaScript and Twilio Programmable Video](https://www.twilio.com/blog/build-video-chat-application-python-javascript-twilio-programmable-video) + shows how to use [Flask](/flask.html) and the + [Twilio Programmable Video API](https://www.twilio.com/docs/video) to + build cross-platform video into new and existing applications. + * This video titled "[We're No Strangers to VoIP: Building the National Rick Astley Hotline)](https://www.youtube.com/watch?v=LgKshQoGh64)" presents a hilarious hack that uses Python and diff --git a/content/pages/04-web-development/53-stripe.markdown b/content/pages/04-web-development/53-stripe.markdown index 03b01c986..9e5a2dd9b 100644 --- a/content/pages/04-web-development/53-stripe.markdown +++ b/content/pages/04-web-development/53-stripe.markdown @@ -18,6 +18,11 @@ for processing payments. ### Stripe tutorials +* [How to Create a Subscription SaaS Application with Django and Stripe](https://www.saaspegasus.com/guides/django-stripe-integrate/) + shows how to build a [Django](/django.html) application with models for + the subscription data in the [Django ORM](/django-orm.html) and create + a pricing page. + * [Switching from Braintree to Stripe](https://www.deekit.com/braintree-to-stripe/) covers one development team's experience with moving payment providers. diff --git a/content/pages/04-web-development/54-slack.markdown b/content/pages/04-web-development/54-slack.markdown index 15931fae1..e9e251609 100644 --- a/content/pages/04-web-development/54-slack.markdown +++ b/content/pages/04-web-development/54-slack.markdown @@ -70,6 +70,10 @@ for programmatically interacting with its messaging service. Slack-provided library for working with the Slack API and [WebSockets](/websockets.html) connection. +* [slackify](https://github.com/Ambro17/slackify) is a lightweight + framework for building bots and the quickstart walks you through + how to create a simple example bot. + * [slack-starterbot](https://github.com/mattmakai/slack-starterbot) * [slack-api-python-examples](https://github.com/mattmakai/slack-api-python-examples) diff --git a/content/pages/05-deployment/35-containers.markdown b/content/pages/05-deployment/35-containers.markdown index 76fb8b62c..f88e53a02 100644 --- a/content/pages/05-deployment/35-containers.markdown +++ b/content/pages/05-deployment/35-containers.markdown @@ -55,6 +55,11 @@ useful. on building jails and other process isolation abstractions into operating systems. +* [Linux containers in a few lines of code](https://zserge.com/posts/containers/) + shows how containers work by providing some code to run a busybox + Docker image but without using docker. It then explains what's + happening under the hood as you run basic commands such as `/bin/sh`. + * [A Practical Introduction to Container Terminology](https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/) has both some solid introductory information on containers as well as a good description of terms such as container host, registry server, diff --git a/content/pages/05-deployment/36-docker.markdown b/content/pages/05-deployment/36-docker.markdown index ed7052dee..8017a95da 100644 --- a/content/pages/05-deployment/36-docker.markdown +++ b/content/pages/05-deployment/36-docker.markdown @@ -36,6 +36,10 @@ on Amazon Web Services, Google Compute Engine, Linode, Rackspace or elsewhere. ## Docker resources +* [Beginners guide to Docker](https://www.learncloudnative.com/blog/2020-04-29-beginners-guide-to-docker/) + explains what it is, the difference between containers and virtual machines, + and then provides a hands-on walkthrough command-driven tutorial. + * [What is Docker and When to Use It](https://www.ctl.io/developers/blog/post/what-is-docker-and-when-to-use-it/) clearly delineates what Docker is and what it isn't. This is a good article for when you're first wrapping your head around Docker conceptually. diff --git a/content/pages/05-deployment/39-aws-lambda.markdown b/content/pages/05-deployment/39-aws-lambda.markdown index ab177e024..fec7e2944 100644 --- a/content/pages/05-deployment/39-aws-lambda.markdown +++ b/content/pages/05-deployment/39-aws-lambda.markdown @@ -80,6 +80,11 @@ has support for both Python 2.7, 3.6 and 3.7. ### General AWS Lambda resources +* [Getting started with serverless on AWS](https://emshea.com/post/serverless-getting-started) + is a wonderful tutorials, example projects and additional resources + guide created by a developer who used all of these bits to learn + AWS services herself. + * [AWS Lambda Serverless Reference Architectures](http://www.allthingsdistributed.com/2016/06/aws-lambda-serverless-reference-architectures.html) provides blueprints with diagrams of common architecture patterns that developers use for their mobile backend, file processing, stream diff --git a/content/pages/06-devops/03-prometheus.markdown b/content/pages/06-devops/03-prometheus.markdown index 54eeddc20..7974550b9 100644 --- a/content/pages/06-devops/03-prometheus.markdown +++ b/content/pages/06-devops/03-prometheus.markdown @@ -16,6 +16,11 @@ and report on Python [web applications](/web-development.html). ### Prometheus resources +* [Prometheus-Basics](https://github.com/yolossn/Prometheus-Basics) + is a newbie's introduction to this tool. It covers what Prometheus + is, the tool's architecture, types of metrics and contains a + walkthrough of how to get it configured. + * This primer on [Prometheus](https://www.kartar.net/2017/10/prometheus/) walks through installation, configuration and metrics collection. diff --git a/content/pages/06-devops/06-web-app-performance.markdown b/content/pages/06-devops/06-web-app-performance.markdown index 4d94e4cbd..faa195727 100644 --- a/content/pages/06-devops/06-web-app-performance.markdown +++ b/content/pages/06-devops/06-web-app-performance.markdown @@ -80,3 +80,8 @@ database queries, page size and many other factors. covers the architecture scaling techniques commonly used to move up in serving users by orders of magnitude, for example from 100 to 1000. +* [Web Performance Recipes with Puppeteer](https://addyosmani.com/blog/puppeteer-recipes/) + digs into tracing through page rendering to measure performance and + how to extract performance metrics from the + [Lighthouse](https://developers.google.com/web/tools/lighthouse/) tool + for further analysis. diff --git a/content/pages/06-devops/18-web-analytics.markdown b/content/pages/06-devops/18-web-analytics.markdown index c51330f04..28c0a58a9 100644 --- a/content/pages/06-devops/18-web-analytics.markdown +++ b/content/pages/06-devops/18-web-analytics.markdown @@ -42,6 +42,9 @@ application before taking some action, such as purchasing your service. Piwik is a solid choice if you cannot use Google Analytics or want to customize your own web analytics platform. +* [Shynet](https://github.com/milesmcc/shynet) is a lightweight, privacy-friendly + cookie-free web analytics application written in Python. + * [Open Web Analytics](http://www.openwebanalytics.com/) is another self-hosted platform that integrates through a JavaScript snippet that tracks users' interactions with the webpage. @@ -59,10 +62,6 @@ application before taking some action, such as purchasing your service. collected into the server side or client side code. MixPanel captures that data and provides metrics and visualizations based on the data. -* [KISSmetrics](https://www.kissmetrics.com/)' analytics provides context - for who is visiting a website and what actions they are taking while on - the site. - * [Heap](https://heapanalytics.com/) is a recently founded analytics service with a free introductory tier to get started. diff --git a/content/pages/examples/flask/flask-code-examples.markdown b/content/pages/examples/flask/flask-code-examples.markdown deleted file mode 100644 index 468e988b5..000000000 --- a/content/pages/examples/flask/flask-code-examples.markdown +++ /dev/null @@ -1,79 +0,0 @@ -title: Flask Core and Extensions Code Examples -category: page -slug: flask-core-extensions-code-examples -sortorder: 500020000 -toc: False -sidebartitle: Flask Core and Extensions Code Examples -meta: Learn how to create Flask applications with easy to copy and paste Python code examples for the Flask web framework. - - -[Flask](/flask.html) is a Python [web framework](/web-frameworks.html). - -Official Flask logo. Flask Artwork License. - - -## Flask Example Projects -Flask's large ecosystem of extensions make it easier for developers to -build common web app features such as authentication, -[database](/databases.html) operations and -[APIs](/application-programming-interfaces.html) even though support -is not built into the core Flask [web framework](/web-frameworks.html). -This design is by choice in contrast to [Django](/django.html)'s -"batteries-included" approach. Either framework's design decision -is a viable approach depending on the needs and requirements of the -application you are building. - -The extensive collection of Flask libraries is a great source for -learning the framework through reading code examples. - -This alphabetically-ordered list of projects provide helpful example -code for building your own web apps. - - -### flask-base -[flask-base](https://github.com/hack4impact/flask-base) -([project documentation](http://hack4impact.github.io/flask-base/)) -is a boilerplate starter application that is pre-configured with -[SQLAlchemy](/sqlalchemy.html), [Redis](/redis.html), user -authentication and other features. - -flask-base's code is open sourced -[under the MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md). - - -### FlaskBB -[FlaskBB](https://github.com/flaskbb/flaskbb) -([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based -forum web application. The web app allows users to chat in an open -message board or send private messages in plain text or -[Markdown](/markdown.html). - -FlaskBB is provided as open source -[under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). - -FlaskBB's code examples can be found on: - -* [flask redirect](/flask-redirect-examples.html) -* [flask request](/flask-request-examples.html) - - -### Flasky -[Flasky](https://github.com/miguelgrinberg/flasky) is the wonderful -example application by -[Miguel Grinberg](https://github.com/miguelgrinberg) that he builds -while teaching developers how to use [Flask](/flask.html) in -[his books and videos](https://courses.miguelgrinberg.com/). Flasky -is [open sourced under the MIT license](https://github.com/miguelgrinberg/flasky/blob/master/LICENSE). - -Code examples from Flasky are shown on the following pages: - -* [flask_sqlalchemy SQLAlchemy Model](/flask-sqlalchemy-model-examples.html) - - -### newspie -[NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news -aggregator created with [Flask](/flask.html) and the -[News API](https://newsapi.org/). - -NewsPie is provided as open source under the -[MIT license](https://github.com/skamieniarz/newspie/blob/master/LICENSE). diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown new file mode 100644 index 000000000..c1e861984 --- /dev/null +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -0,0 +1,48 @@ +title: Flask Example Projects and Code +category: page +slug: flask-code-examples +sortorder: 500020001 +toc: False +sidebartitle: Flask Example Code +meta: Python example projects and code that show how to use the Flask web microframework. + + +## Example Projects with Great Example Code +The following active projects use the [Flask](/flask.html) framework +in various ways. The code within the projects can show you how to build +your own applications. + + +### FlaskBB +[FlaskBB](https://github.com/flaskbb/flaskbb) +([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based +forum web application. The web app allows users to chat in an open +message board or send private messages in plain text or +[Markdown](/markdown.html). + +FlaskBB is provided as open source +[under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). + + +### Flask JSONDash +[Flask JSONDash](https://github.com/christabor/flask_jsondash) is a +configurable web application built in Flask that creates charts and +dashboards from arbitrary API endpoints. Everything for the web app +is configured in JSON. The code is provided as open source under the +[MIT license](https://github.com/christabor/flask_jsondash/blob/master/LICENSE). + + +### Flasky +[Flasky](https://github.com/miguelgrinberg/flasky) is the wonderful +example application by +[Miguel Grinberg](https://github.com/miguelgrinberg) that he builds +while teaching developers how to use [Flask](/flask.html) in +[his books and videos](https://courses.miguelgrinberg.com/). Flasky +is [open sourced under the MIT license](https://github.com/miguelgrinberg/flasky/blob/master/LICENSE). + + +### newspie +[NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news +aggregator created with [Flask](/flask.html) and the +[News API](https://newsapi.org/). NewsPie is provided as open source under +the [MIT license](https://github.com/skamieniarz/newspie/blob/master/LICENSE). diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown new file mode 100644 index 000000000..73a692e1d --- /dev/null +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -0,0 +1,53 @@ +title: Flask Extensions, Plug-ins and Related Libraries +category: page +slug: flask-extensions-plug-ins-related-libraries +sortorder: 500020000 +toc: False +sidebartitle: Flask Extensions +meta: Python code extensions and plug-in projects that show how to use the Flask web app framework. + + +[Flask](/flask.html) is a Python [web framework](/web-frameworks.html). + +Official Flask logo. Flask Artwork License. + +Flask has a wide range of code libraries and extensions that make the +[web framework](/web-frameworks.html) go from a *micro*framework into +a full-featured web application creation tool. + +Flask's large ecosystem of extensions make it easier for developers to +build common web app features such as authentication, +[database](/databases.html) operations and +[APIs](/application-programming-interfaces.html) even though support +is not built into the core Flask [web framework](/web-frameworks.html). +This design is by choice in contrast to [Django](/django.html)'s +"batteries-included" approach. Either framework's design decision +is a viable approach depending on the needs and requirements of the +application you are building. + +The following projects, ordered alphabetically, can be helpful both +as extensions added to your code base as well as example code for +building your own applications. + + +### flask-base +[flask-base](https://github.com/hack4impact/flask-base) +([project documentation](http://hack4impact.github.io/flask-base/)) +is a boilerplate starter application that is pre-configured with +[SQLAlchemy](/sqlalchemy.html), [Redis](/redis.html), user +authentication and other features. + +flask-base's code is open sourced +[under the MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md). + + +### Flask RESTX +[Flask RESTX](https://github.com/python-restx/flask-restx) is an +extension that makes it easier to build +[RESTful APIs](/application-programming-interfaces.html) into +your applications. Flask RESTX aims for minimal configuration to +get basic APIs running for existing applications and it exposes +endpoint documentation using [Swagger](https://swagger.io/). + +Flask RESTX is provided as open source under the +[BSD 3-Clause license](https://github.com/python-restx/flask-restx/blob/master/LICENSE). diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown new file mode 100644 index 000000000..53175e4bd --- /dev/null +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -0,0 +1,630 @@ +title: flask.globals request Python code examples +category: page +slug: flask-globals-request-examples +sortorder: 500021000 +toc: False +sidebartitle: flask.globals request +meta: Python example code for the request function from the flask.globals module of the Flask project. + + +request is a function within the flask.globals module of the Flask project. + + +## Example 1 from flask-sqlalchemy +[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) +([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) +and +[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a +[Flask](/flask.html) extension that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy +provides helper functions that reduce the amount of common boilerplate +code that you have to frequently write yourself if you did not use this +library when combining Flask with SQLAlchemy. + +flask-sqlalchemy is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). + +[**flask-sqlalchemy / flask_sqlalchemy / __init__.py**](https://github.com/pallets/flask-sqlalchemy/blob/master/flask_sqlalchemy/./__init__.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import functools +import os +import sys +import time +import warnings +from math import ceil +from operator import itemgetter +from threading import Lock + +import sqlalchemy +~~from flask import _app_ctx_stack, abort, current_app, request +from flask.signals import Namespace +from sqlalchemy import event, inspect, orm +from sqlalchemy.engine.url import make_url +from sqlalchemy.ext.declarative import DeclarativeMeta, declarative_base +from sqlalchemy.orm.exc import UnmappedClassError +from sqlalchemy.orm.session import Session as SessionBase + +from flask_sqlalchemy.model import Model +from ._compat import itervalues, string_types, xrange +from .model import DefaultMeta +from . import utils + +__version__ = "3.0.0.dev" + +# the best timer function for the platform +if sys.platform == 'win32': + if sys.version_info >= (3, 3): + _timer = time.perf_counter + else: + _timer = time.clock +else: + _timer = time.time + +_signals = Namespace() + + +## ... source file abbreviated to get to request examples ... + + + be limited to that value. If there is no request or they aren't in the + query, they default to 1 and 20 respectively. If ``count`` is ``False``, + no query to help determine total page count will be run. + + When ``error_out`` is ``True`` (default), the following rules will + cause a 404 response: + + * No items are found and ``page`` is not 1. + * ``page`` is less than 1, or ``per_page`` is negative. + * ``page`` or ``per_page`` are not ints. + + When ``error_out`` is ``False``, ``page`` and ``per_page`` default to + 1 and 20 respectively. + + Returns a :class:`Pagination` object. + """ + + if request: + if page is None: + try: +~~ page = int(request.args.get('page', 1)) + except (TypeError, ValueError): + if error_out: + abort(404) + + page = 1 + + if per_page is None: + try: +~~ per_page = int(request.args.get('per_page', 20)) + except (TypeError, ValueError): + if error_out: + abort(404) + + per_page = 20 + else: + if page is None: + page = 1 + + if per_page is None: + per_page = 20 + + if max_per_page is not None: + per_page = min(per_page, max_per_page) + + + +## ... source file abbreviated to get to request examples ... + + + if page < 1: + if error_out: + abort(404) + else: + page = 1 + + if per_page < 0: + if error_out: + abort(404) + + +## ... source file continues with no further request examples... + + +``` + + +## Example 2 from newspie +[NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news +aggregator created with [Flask](/flask.html) and the +[News API](https://newsapi.org/). + +NewsPie is provided as open source under the +[MIT license](https://github.com/skamieniarz/newspie/blob/master/LICENSE). + +[**newspie / news.py**](https://github.com/skamieniarz/newspie/blob/master/././news.py) + +```python +# -*- coding: utf-8 -*- +''' +NewsPie - a minimalistic news aggregator built with Flask and powered by +News API (https://newsapi.org/). + +Created by @skamieniarz (https://github.com/skamieniarz) in 2019. +''' +import configparser +import json +import logging +import os + +import requests +import requests_cache +from dateutil import parser +~~from flask import (Flask, make_response, redirect, render_template, request, + url_for) + +CONFIG = configparser.ConfigParser() +CONFIG.read('config.ini') +API_KEY = os.environ.get('NEWS_API_KEY') +TOP_HEADLINES = CONFIG['ENDPOINTS']['TOP_HEADLINES'] +EVERYTHING = CONFIG['ENDPOINTS']['EVERYTHING'] +PAGE_SIZE = int(CONFIG['VARIOUS']['PAGE_SIZE']) + +CATEGORIES = ('general', 'sports', 'business', 'entertainment', 'health', + 'science', 'technology') +with open('data/countries.json') as json_file: + COUNTRIES = json.load(json_file) + +logging.basicConfig(level=logging.DEBUG) +requests_cache.install_cache(cache_name='news_cache', + backend='sqlite', + expire_after=300) + +APP = Flask(__name__) + + +@APP.route('/', methods=['GET', 'POST']) +def root(): + + +## ... source file abbreviated to get to request examples ... + + + + +@APP.errorhandler(404) +def page_not_found(error): + ''' Not existing pages redirect to the first page of general category. ''' + return redirect(url_for('category', category='general', page=1)) + + +@APP.route('/category/', methods=['GET', 'POST']) +def category(category): + ''' Handles category route. + + Parameters: + - name: category + in: path + description: Name of the news category + - name: page + in: query + description: Number of the page + ''' +~~ page = request.args.get('page', default=1, type=int) + if page < 1: + return redirect(url_for('category', category=category, page=1)) +~~ if request.method == 'POST' and category in CATEGORIES: + return do_post(page, category) + if category in CATEGORIES: + params = {'page': page, 'category': category, 'pageSize': PAGE_SIZE} + country = get_cookie('country') + if country is not None: + params.update({'country': country}) + response = requests.get(TOP_HEADLINES, + params=params, + headers={'Authorization': API_KEY}) + if response.status_code == 200: + pages = count_pages(response.json()) + if page > pages: + page = pages + return redirect(url_for('category', category=category, page=page)) + articles = parse_articles(response.json()) + return render(articles, page, pages, country, category) + elif response.status_code == 401: + return render_template(CONFIG['VARIOUS']['401_TEMPLATE']) + return redirect(url_for('category', category='general', page=page)) + + + + +## ... source file abbreviated to get to request examples ... + + +@APP.route('/search/', methods=['GET', 'POST']) +def search(query): + ''' Handles category route. + + Parameters: + - name: query + in: path + description: Query string to be searched + - name: page + in: query + description: Number of the page + ''' +~~ page = request.args.get('page', default=1, type=int) + if page < 1: + return redirect(url_for('search', query=query, page=1)) + params = { + 'qInTitle': query, + 'sortBy': 'relevancy', + 'page': page, + 'pageSize': PAGE_SIZE + } +~~ if request.method == 'POST': + return do_post(page, category='search', current_query=query) + response = requests.get(EVERYTHING, + params=params, + headers={'Authorization': API_KEY}) + pages = count_pages(response.json()) + if page > pages: + page = pages + return redirect(url_for('search', query=query, page=page)) + articles = parse_articles(response.json()) + return render(articles, + page, + pages, + country=get_cookie('country'), + category='search') + + +def do_post(page, category='general', current_query=None): + ''' Helper method that handles POST request basing on the input. ''' +~~ new_query = request.form.get('search_query') +~~ country = request.form.get('country') +~~ next_page = request.form.get('next_page') +~~ previous_page = request.form.get('previous_page') + if new_query is not None and new_query != '': + return redirect(url_for('search', query=new_query, page=1)) + if country is not None and country != get_cookie('country'): + response = make_response( + redirect(url_for('category', category=category, page=1))) + response.set_cookie('country', country) + return response + if next_page is not None: + page = int(next_page) + 1 + elif previous_page is not None: + page = int(previous_page) - 1 + if category == 'search': + return redirect(url_for('search', query=current_query, page=page)) + return redirect(url_for('category', category=category, page=page)) + + +def parse_articles(response): + ''' Parses articles fetched from News API. + + Returns: + A list of dicts containing publishing date, title, URL and source of + articles. + ''' + parsed_articles = [] + ''' Renders the template with appropriate variables. Up to 12 pages + allowed. ''' + pages = pages if pages <= 12 else 12 + return render_template(CONFIG['VARIOUS']['TEMPLATE'], + articles=articles, + categories=CATEGORIES, + category=category, + countries=COUNTRIES, + country=country, + page=page, + pages=pages) + + +def get_cookie(key): + ''' Helper method that gets cookie's value. + + Returns: + A string with a value of a cookie with provided key. If a key is + missing, None is returned. + ''' +~~ cookie_value = request.cookies.get(key) + return cookie_value + + +if __name__ == '__main__': + APP.run() + + +## ... source file continues with no further request examples... + + +``` + + +## Example 3 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / service.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./service.py) + +```python +"""Automatically generated REST API services from SQLAlchemy +ORM models or a database introspection.""" + +# Third-party imports +~~from flask import request, make_response +import flask +from flask.views import MethodView +from sqlalchemy import asc, desc + +# Application imports +from sandman2.exception import NotFoundException, BadRequestException +from sandman2.model import db +from sandman2.decorators import etag, validate_fields + + +def add_link_headers(response, links): + """Return *response* with the proper link headers set, based on the contents + of *links*. + + :param response: :class:`flask.Response` response object for links to be + added + :param dict links: Dictionary of links to be added + :rtype :class:`flask.Response` : + """ + link_string = '<{}>; rel=self'.format(links['self']) + for link in links.values(): + link_string += ', <{}>; rel=related'.format(link) + response.headers['Link'] = link_string + return response + + +## ... source file abbreviated to get to request examples ... + + + + +def jsonify(resource): + """Return a Flask ``Response`` object containing a + JSON representation of *resource*. + + :param resource: The resource to act as the basis of the response + """ + + response = flask.jsonify(resource.to_dict()) + response = add_link_headers(response, resource.links()) + return response + + +def is_valid_method(model, resource=None): + """Return the error message to be sent to the client if the current + request passes fails any user-defined validation.""" + validation_function_name = 'is_valid_{}'.format( +~~ request.method.lower()) + if hasattr(model, validation_function_name): + return getattr(model, validation_function_name)(request, resource) + +class Service(MethodView): + + """The *Service* class is a generic extension of Flask's *MethodView*, + providing default RESTful functionality for a given ORM resource. + + Each service has an associated *__model__* attribute which represents the + ORM resource it exposes. Services are JSON-only. HTML-based representation + is available through the admin interface. + """ + + #: The sandman2.model.Model-derived class to expose + __model__ = None + + #: The string used to describe the elements when a collection is + #: returned. + __json_collection_name__ = 'resources' + + def delete(self, resource_id): + """Return an HTTP response object resulting from a HTTP DELETE call. + + :param resource_id: The value of the resource's primary key + """ + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + db.session().delete(resource) + db.session().commit() + return self._no_content_response() + + @etag + def get(self, resource_id=None): + """Return an HTTP response object resulting from an HTTP GET call. + + If *resource_id* is provided, return just the single resource. + Otherwise, return the full collection. + + :param resource_id: The value of the resource's primary key + """ +~~ if request.path.endswith('meta'): + return self._meta() + + if resource_id is None: + error_message = is_valid_method(self.__model__) + if error_message: + raise BadRequestException(error_message) + +~~ if 'export' in request.args: + return self._export(self._all_resources()) + + return flask.jsonify({ + self.__json_collection_name__: self._all_resources() + }) + else: + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + return jsonify(resource) + + def patch(self, resource_id): + """Return an HTTP response object resulting from an HTTP PATCH call. + + :returns: ``HTTP 200`` if the resource already exists + :returns: ``HTTP 400`` if the request is malformed + :returns: ``HTTP 404`` if the resource is not found + :param resource_id: The value of the resource's primary key + """ + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) +~~ if not request.json: + raise BadRequestException('No JSON data received') +~~ resource.update(request.json) + db.session().merge(resource) + db.session().commit() + return jsonify(resource) + + @validate_fields + def post(self): + """Return the JSON representation of a new resource created through + an HTTP POST call. + + :returns: ``HTTP 201`` if a resource is properly created + :returns: ``HTTP 204`` if the resource already exists + :returns: ``HTTP 400`` if the request is malformed or missing data + """ +~~ resource = self.__model__.query.filter_by(**request.json).first() + if resource: + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + return self._no_content_response() + +~~ resource = self.__model__(**request.json) # pylint: disable=not-callable + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + db.session().add(resource) + db.session().commit() + return self._created_response(resource) + + def put(self, resource_id): + """Return the JSON representation of a new resource created or updated + through an HTTP PUT call. + + If resource_id is not provided, it is assumed the primary key field is + included and a totally new resource is created. Otherwise, the existing + resource referred to by *resource_id* is updated with the provided JSON + data. This method is idempotent. + + :returns: ``HTTP 201`` if a new resource is created + :returns: ``HTTP 200`` if a resource is updated + :returns: ``HTTP 400`` if the request is malformed or missing data + """ + resource = self.__model__.query.get(resource_id) + if resource: + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) +~~ resource.update(request.json) + db.session().merge(resource) + db.session().commit() + return jsonify(resource) + +~~ resource = self.__model__(**request.json) # pylint: disable=not-callable + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + db.session().add(resource) + db.session().commit() + return self._created_response(resource) + + def _meta(self): + """Return a description of this resource as reported by the + database.""" + return flask.jsonify(self.__model__.description()) + + def _resource(self, resource_id): + """Return the ``sandman2.model.Model`` instance with the given + *resource_id*. + + :rtype: :class:`sandman2.model.Model` + """ + resource = self.__model__.query.get(resource_id) + if not resource: + raise NotFoundException() + return resource + + def _all_resources(self): + """Return the complete collection of resources as a list of + dictionaries. + + :rtype: :class:`sandman2.model.Model` + """ + queryset = self.__model__.query +~~ args = {k: v for (k, v) in request.args.items() if k not in ('page', 'export')} + limit = None + if args: + filters = [] + order = [] + for key, value in args.items(): + if value.startswith('%'): + filters.append(getattr(self.__model__, key).like(str(value), escape='/')) + elif key == 'sort': + direction = desc if value.startswith('-') else asc + order.append(direction(getattr(self.__model__, value.lstrip('-')))) + elif key == 'limit': + limit = int(value) + elif hasattr(self.__model__, key): + filters.append(getattr(self.__model__, key) == value) + else: + raise BadRequestException('Invalid field [{}]'.format(key)) + queryset = queryset.filter(*filters).order_by(*order) +~~ if 'page' in request.args: +~~ resources = queryset.paginate(page=int(request.args['page']), per_page=limit).items + else: + queryset = queryset.limit(limit) + resources = queryset.all() + return [r.to_dict() for r in resources] + + def _export(self, collection): + """Return a CSV of the resources in *collection*. + + :param list collection: A list of resources represented by dicts + """ + fieldnames = collection[0].keys() + faux_csv = ','.join(fieldnames) + '\r\n' + for resource in collection: + faux_csv += ','.join((str(x) for x in resource.values())) + '\r\n' + response = make_response(faux_csv) + response.mimetype = 'text/csv' + return response + + + @staticmethod + def _no_content_response(): + """Return an HTTP 204 "No Content" response. + + :returns: HTTP Response + + +## ... source file continues with no further request examples... + + +``` + diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown new file mode 100644 index 000000000..c9ffd5d0b --- /dev/null +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -0,0 +1,230 @@ +title: flask.helpers make_response Python code examples +category: page +slug: flask-helpers-make-response-examples +sortorder: 500021000 +toc: False +sidebartitle: flask.helpers make_response +meta: Python example code for the make_response function from the flask.helpers module of the Flask project. + + +make_response is a function within the flask.helpers module of the Flask project. + + +## Example 1 from newspie +[NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news +aggregator created with [Flask](/flask.html) and the +[News API](https://newsapi.org/). + +NewsPie is provided as open source under the +[MIT license](https://github.com/skamieniarz/newspie/blob/master/LICENSE). + +[**newspie / news.py**](https://github.com/skamieniarz/newspie/blob/master/././news.py) + +```python +# -*- coding: utf-8 -*- +''' +NewsPie - a minimalistic news aggregator built with Flask and powered by +News API (https://newsapi.org/). + +Created by @skamieniarz (https://github.com/skamieniarz) in 2019. +''' +import configparser +import json +import logging +import os + +import requests +import requests_cache +from dateutil import parser +~~from flask import (Flask, make_response, redirect, render_template, request, + url_for) + +CONFIG = configparser.ConfigParser() +CONFIG.read('config.ini') +API_KEY = os.environ.get('NEWS_API_KEY') +TOP_HEADLINES = CONFIG['ENDPOINTS']['TOP_HEADLINES'] +EVERYTHING = CONFIG['ENDPOINTS']['EVERYTHING'] +PAGE_SIZE = int(CONFIG['VARIOUS']['PAGE_SIZE']) + +CATEGORIES = ('general', 'sports', 'business', 'entertainment', 'health', + 'science', 'technology') +with open('data/countries.json') as json_file: + COUNTRIES = json.load(json_file) + +logging.basicConfig(level=logging.DEBUG) +requests_cache.install_cache(cache_name='news_cache', + backend='sqlite', + expire_after=300) + +APP = Flask(__name__) + + +@APP.route('/', methods=['GET', 'POST']) +def root(): + + +## ... source file abbreviated to get to make_response examples ... + + + if page > pages: + page = pages + return redirect(url_for('search', query=query, page=page)) + articles = parse_articles(response.json()) + return render(articles, + page, + pages, + country=get_cookie('country'), + category='search') + + +def do_post(page, category='general', current_query=None): + ''' Helper method that handles POST request basing on the input. ''' + new_query = request.form.get('search_query') + country = request.form.get('country') + next_page = request.form.get('next_page') + previous_page = request.form.get('previous_page') + if new_query is not None and new_query != '': + return redirect(url_for('search', query=new_query, page=1)) + if country is not None and country != get_cookie('country'): +~~ response = make_response( + redirect(url_for('category', category=category, page=1))) + response.set_cookie('country', country) + return response + if next_page is not None: + page = int(next_page) + 1 + elif previous_page is not None: + page = int(previous_page) - 1 + if category == 'search': + return redirect(url_for('search', query=current_query, page=page)) + return redirect(url_for('category', category=category, page=page)) + + +def parse_articles(response): + ''' Parses articles fetched from News API. + + Returns: + A list of dicts containing publishing date, title, URL and source of + articles. + ''' + parsed_articles = [] + if response.get('status') == 'ok': + for article in response.get('articles'): + parsed_articles.append({ + 'published_at': + + +## ... source file continues with no further make_response examples... + + +``` + + +## Example 2 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / service.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./service.py) + +```python +"""Automatically generated REST API services from SQLAlchemy +ORM models or a database introspection.""" + +# Third-party imports +~~from flask import request, make_response +import flask +from flask.views import MethodView +from sqlalchemy import asc, desc + +# Application imports +from sandman2.exception import NotFoundException, BadRequestException +from sandman2.model import db +from sandman2.decorators import etag, validate_fields + + +def add_link_headers(response, links): + """Return *response* with the proper link headers set, based on the contents + of *links*. + + :param response: :class:`flask.Response` response object for links to be + added + :param dict links: Dictionary of links to be added + :rtype :class:`flask.Response` : + """ + link_string = '<{}>; rel=self'.format(links['self']) + for link in links.values(): + link_string += ', <{}>; rel=related'.format(link) + response.headers['Link'] = link_string + return response + + +## ... source file abbreviated to get to make_response examples ... + + + filters.append(getattr(self.__model__, key) == value) + else: + raise BadRequestException('Invalid field [{}]'.format(key)) + queryset = queryset.filter(*filters).order_by(*order) + if 'page' in request.args: + resources = queryset.paginate(page=int(request.args['page']), per_page=limit).items + else: + queryset = queryset.limit(limit) + resources = queryset.all() + return [r.to_dict() for r in resources] + + def _export(self, collection): + """Return a CSV of the resources in *collection*. + + :param list collection: A list of resources represented by dicts + """ + fieldnames = collection[0].keys() + faux_csv = ','.join(fieldnames) + '\r\n' + for resource in collection: + faux_csv += ','.join((str(x) for x in resource.values())) + '\r\n' +~~ response = make_response(faux_csv) + response.mimetype = 'text/csv' + return response + + + @staticmethod + def _no_content_response(): + """Return an HTTP 204 "No Content" response. + + :returns: HTTP Response + """ +~~ response = make_response() + response.status_code = 204 + return response + + @staticmethod + def _created_response(resource): + """Return an HTTP 201 "Created" response. + + :returns: HTTP Response + """ + response = jsonify(resource) + response.status_code = 201 + return response + + +## ... source file abbreviated to get to make_response examples ... + + + + +## ... source file continues with no further make_response examples... + + +``` + diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown new file mode 100644 index 000000000..69da2f858 --- /dev/null +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -0,0 +1,87 @@ +title: flask.helpers url_for Python code examples +category: page +slug: flask-helpers-url-for-examples +sortorder: 500021001 +toc: False +sidebartitle: flask.helpers url_for +meta: Python example code for the url_for function from the flask.helpers module of the Flask project. + + +url_for is a function within the flask.helpers module of the Flask project. + + +## Example 1 from flask-base +[flask-base](https://github.com/hack4impact/flask-base) +([project documentation](http://hack4impact.github.io/flask-base/)) +provides boilerplate code for new [Flask](/flask.html) web apps. +The purpose of the boilerplate is to stitch together disparate +libraries that are commonly used in Flask projects, such as +[Redis](/redis.html) for fast caching and transient data storage, +[SendGrid](https://www.twilio.com/sendgrid) for transactional email, +[SQLAlchemy](/sqlalchemy.html) for persistent data storage through a +[relational database](/databases.html) backend, +[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +handling and many others. + +flask-base is provided as open source under the +[MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md). + +[**flask-base / app / utils.py**](https://github.com/hack4impact/flask-base/blob/master/app/./utils.py) + +```python +~~from flask import url_for +from wtforms.fields import Field +from wtforms.widgets import HiddenInput +from wtforms.compat import text_type + + +def register_template_utils(app): + """Register Jinja 2 helpers (called from __init__.py).""" + + @app.template_test() + def equalto(value, other): + return value == other + + @app.template_global() + def is_hidden_field(field): + from wtforms.fields import HiddenField + return isinstance(field, HiddenField) + + app.add_template_global(index_for_role) + + +def index_for_role(role): +~~ return url_for(role.index) + + + + +## ... source file abbreviated to get to url_for examples ... + + +class CustomSelectField(Field): + widget = HiddenInput() + + def __init__(self, label='', validators=None, multiple=False, + choices=[], allow_custom=True, **kwargs): + super(CustomSelectField, self).__init__(label, validators, **kwargs) + self.multiple = multiple + self.choices = choices + self.allow_custom = allow_custom + + def _value(self): + return text_type(self.data) if self.data is not None else '' + + def process_formdata(self, valuelist): + if valuelist: + self.data = valuelist[1] + self.raw_data = [valuelist[1]] + else: + self.data = '' + + +## ... source file continues with no further url_for examples... + + +``` + diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown new file mode 100644 index 000000000..9996547b9 --- /dev/null +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -0,0 +1,103 @@ +title: flask.signals Namespace Python code examples +category: page +slug: flask-signals-namespace-examples +sortorder: 500021000 +toc: False +sidebartitle: flask.signals Namespace +meta: Python example code for the Namespace class from the flask.signals module of the Flask project. + + +Namespace is a class within the flask.signals module of the Flask project. + + +## Example 1 from flask-sqlalchemy +[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) +([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) +and +[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a +[Flask](/flask.html) extension that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy +provides helper functions that reduce the amount of common boilerplate +code that you have to frequently write yourself if you did not use this +library when combining Flask with SQLAlchemy. + +flask-sqlalchemy is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). + +[**flask-sqlalchemy / flask_sqlalchemy / __init__.py**](https://github.com/pallets/flask-sqlalchemy/blob/master/flask_sqlalchemy/./__init__.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import functools +import os +import sys +import time +import warnings +from math import ceil +from operator import itemgetter +from threading import Lock + +import sqlalchemy +from flask import _app_ctx_stack, abort, current_app, request +~~from flask.signals import Namespace +from sqlalchemy import event, inspect, orm +from sqlalchemy.engine.url import make_url +from sqlalchemy.ext.declarative import DeclarativeMeta, declarative_base +from sqlalchemy.orm.exc import UnmappedClassError +from sqlalchemy.orm.session import Session as SessionBase + +from flask_sqlalchemy.model import Model +from ._compat import itervalues, string_types, xrange +from .model import DefaultMeta +from . import utils + +__version__ = "3.0.0.dev" + +# the best timer function for the platform +if sys.platform == 'win32': + if sys.version_info >= (3, 3): + _timer = time.perf_counter + else: + _timer = time.clock +else: + _timer = time.time + +~~_signals = Namespace() +models_committed = _signals.signal('models-committed') + + +## ... source file abbreviated to get to Namespace examples ... + + +before_models_committed = _signals.signal('before-models-committed') + + +def _make_table(db): + def _make_table(*args, **kwargs): + if len(args) > 1 and isinstance(args[1], db.Column): + args = (args[0], db.metadata) + args[1:] + info = kwargs.pop('info', None) or {} + info.setdefault('bind_key', None) + kwargs['info'] = info + return sqlalchemy.Table(*args, **kwargs) + return _make_table + + +def _set_default_query_class(d, cls): + if 'query_class' not in d: + d['query_class'] = cls + + +def _wrap_with_default_query_class(fn, cls): + @functools.wraps(fn) + def newfn(*args, **kwargs): + _set_default_query_class(kwargs, cls) + + +## ... source file continues with no further Namespace examples... + + +``` + diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown new file mode 100644 index 000000000..db1011f2c --- /dev/null +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -0,0 +1,119 @@ +title: flask.views MethodView Python code examples +category: page +slug: flask-views-methodview-examples +sortorder: 500021000 +toc: False +sidebartitle: flask.views MethodView +meta: Python example code for the MethodView class from the flask.views module of the Flask project. + + +MethodView is a class within the flask.views module of the Flask project. + + +## Example 1 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / service.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./service.py) + +```python +"""Automatically generated REST API services from SQLAlchemy +ORM models or a database introspection.""" + +# Third-party imports +from flask import request, make_response +import flask +~~from flask.views import MethodView +from sqlalchemy import asc, desc + +# Application imports +from sandman2.exception import NotFoundException, BadRequestException +from sandman2.model import db +from sandman2.decorators import etag, validate_fields + + +def add_link_headers(response, links): + """Return *response* with the proper link headers set, based on the contents + of *links*. + + :param response: :class:`flask.Response` response object for links to be + added + :param dict links: Dictionary of links to be added + :rtype :class:`flask.Response` : + """ + link_string = '<{}>; rel=self'.format(links['self']) + for link in links.values(): + link_string += ', <{}>; rel=related'.format(link) + response.headers['Link'] = link_string + return response + + + + +## ... source file abbreviated to get to MethodView examples ... + + +def jsonify(resource): + """Return a Flask ``Response`` object containing a + JSON representation of *resource*. + + :param resource: The resource to act as the basis of the response + """ + + response = flask.jsonify(resource.to_dict()) + response = add_link_headers(response, resource.links()) + return response + + +def is_valid_method(model, resource=None): + """Return the error message to be sent to the client if the current + request passes fails any user-defined validation.""" + validation_function_name = 'is_valid_{}'.format( + request.method.lower()) + if hasattr(model, validation_function_name): + return getattr(model, validation_function_name)(request, resource) + +~~class Service(MethodView): + + """The *Service* class is a generic extension of Flask's *MethodView*, + providing default RESTful functionality for a given ORM resource. + + Each service has an associated *__model__* attribute which represents the + ORM resource it exposes. Services are JSON-only. HTML-based representation + is available through the admin interface. + """ + + #: The sandman2.model.Model-derived class to expose + __model__ = None + + #: The string used to describe the elements when a collection is + #: returned. + __json_collection_name__ = 'resources' + + def delete(self, resource_id): + """Return an HTTP response object resulting from a HTTP DELETE call. + + :param resource_id: The value of the resource's primary key + """ + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + + +## ... source file continues with no further MethodView examples... + + +``` + diff --git a/content/posts/200525-python-exceptions-sentry.markdown b/content/posts/200525-python-exceptions-sentry.markdown new file mode 100644 index 000000000..2ff43f88e --- /dev/null +++ b/content/posts/200525-python-exceptions-sentry.markdown @@ -0,0 +1,376 @@ +title: Reporting Exceptions in Python Scripts with Sentry +slug: report-exceptions-python-scripts-sentry +meta: Learn how to catch exceptions in Python scripts and then use Sentry to store and analyze the errors. +category: post +date: 2020-05-25 +modified: 2020-05-25 +newsletter: False +headerimage: /img/200525-sentry/header.jpg +headeralt: Python and Sentry logos. Copyright their respective owners. + + +Python scripts are the glue that keep many applications and their +infrastructure running, but when one of your scripts throws an exception +you may not know about it immediately unless you have a central place to +aggregate the errors. That's where adding [Sentry](https://sentry.io/) +can solved this distributed error logging problem. + +In this tutorial, we'll see how to quickly add Sentry to a new or existing +Python script to report errors into a centralized location for further +[debugging](/debugging.html). + + +## Development environment setup +Make sure you have Python 3 installed. As of right now, +[Python 3.8.3](https://www.python.org/downloads/) is the latest +version of Python. + +During this tutorial we're also going to use: + +* a hosted Sentry instance on [sentry.io](https://sentry.io), which we'll + need an account to access +* the [Sentry Python helper library](https://pypi.org/project/sentry-sdk/) to + send exception data to our Sentry instance + + +Install the above code libraries into a new +[Python virtual environment](/virtual-environments-virtualenvs-venvs.html) +using the following commands: + +```bash +python -m venv sentryscript +source sentryscript/bin/activate + +pip install sentry-sdk>=0.14.4 +``` + +Our [development environment](/development-environments.html) is now +ready and we can write some code that will throw exceptions to demonstrate +how to use Sentry. + +Note that all of the code for this tutorial can be found within the +[blog-code-examples](https://github.com/fullstackpython/blog-code-examples) +Git repository on GitHub under the +[python-script-sentry](https://github.com/fullstackpython/blog-code-examples/tree/master/python-script-sentry) +directory. + + +## An Example Script for Loading Python Modules +We'll start by writing a small but useful script that prints out the +names of all modules within a Python package, then add Sentry to it +when it becomes apparent that capturing exceptions would be a +useful addition. + +Create a new file named `module_loader.py` and write the +following lines of code in it to allow us to easily execute it +on the command line. + +```python +import argparse + +def import_submodules(package): + return {} + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("package") + args = parser.parse_args() + + package_to_load = args.package + results = import_submodules(package_to_load) + for r in results: + print(str(r)) +``` + +The above code takes an argument when the script is invoked from the +command line and uses the value as an input into the stub +`import_submodules` function that will contain code to walk the +tree of modules within the package. + +Nextt, add the following highlighted lines of code to use `importlib` and +`pkgutil` to recursively import modules from the package if one is +found that matches the name sent in as the `package` argument. + +```python +import argparse +~~import importlib +~~import pkgutil + + +def import_submodules(package): +~~ """Import all submodules of a module, recursively, including subpackages. + +~~ :param package: package (name or actual module) +~~ :type package: str | module +~~ :rtype: dict[str, types.ModuleType] +~~ """ +~~ if isinstance(package, str): +~~ package = importlib.import_module(package) +~~ results = {} +~~ for loader, name, is_pkg in pkgutil.walk_packages(package.__path__): +~~ full_name = package.__name__ + '.' + name +~~ try: +~~ results[full_name] = importlib.import_module(full_name) +~~ if is_pkg: +~~ results.update(import_submodules(full_name)) +~~ except ModuleNotFoundError as mnfe: +~~ print("module not found: {}".format(full_name)) +~~ except Exception as general_exception: +~~ print(general_exception) +~~ return results + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("package") + args = parser.parse_args() + + package_to_load = args.package + results = import_submodules(package_to_load) + for r in results: + print(str(r)) +``` + +The new code above loops through all packages with the +`walk_package` function in the `pkgutil` standard library +module and tries to import it using the `import_module` on +the package name plus package as a string. If the +result is successful, the function will recursively call +itself to import submodules within the imported package. +If a module is not found, or some other issue occurs, exceptions +are caught so that the script does not fail but instead can +continue processing potential modules. + +Test the full script to see what it prints out with an arbitrary +package on the command line: + +```bash +python module_loader.py importlib +``` + +The above example generates the output: + +```bash +importlib._bootstrap +importlib._bootstrap_external +importlib.abc +importlib.machinery +importlib.resources +importlib.util +``` + +Trying to inspect a package that is not installed will give an error. Use +the script with a package that is not installed in your current environment. + +```bash +python module_loader.py flask +``` + +The above command produces the following traceback due to an expected +`ModuleNotFoundError`. + +``` +Traceback (most recent call last): + File "module_loader.py", line 35, in + results = import_submodules(package_to_load) + File "module_loader.py", line 14, in import_submodules + package = importlib.import_module(package) + File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module + return _bootstrap._gcd_import(name[level:], package, level) + File "", line 1006, in _gcd_import + File "", line 983, in _find_and_load + File "", line 965, in _find_and_load_unlocked +ModuleNotFoundError: No module named 'flask' +``` + +If you install Flask into your current environment the module is found and +the application will go through the list of modules and submodules. + +Our example script is usable but what if we run this code or something similar +on one or more servers that we don't check that often? That's where it would +be helpful to have a way to aggregate one or more scripts' exception output +in a single place. Sentry can help us to accomplish that goal. + + +## Adding Exception Reporting with Sentry +Sentry can either be [self-hosted](https://github.com/getsentry/onpremise) or +used as a cloud service through [Sentry.io](https://sentry.io). In this +tutorial we will use the cloud hosted version because it's faster than +setting up your own server as well as free for smaller projects. + +Go to [Sentry.io's homepage](https://sentry.io). + +Sentry.io homepage where you can sign up for a free account. + +Sign into your account or sign up for a new free account. You will be at +the main account dashboard after logging in or completing the Sentry sign +up process. + +There are no errors logged on our account dashboard yet, which is as +expected because we have not yet connected our account to the Python +script. + +Blank Sentry account dashboard. + +You'll want to create a new Sentry Project just for this application so +click "Projects" in the left sidebar to go to the Projects page. + +Button to create a new Sentry project. + +On the Projects page, click the "Create Project" button in the top right +corner of the page. + +Create a new Sentry project. + +Select Python, give your new Project a name and then press the "Create Project" +button. Our new project is ready to integrate with our Python script. + +We need the unique identifier for our account and project to authorize our +Python code to send errors to this Sentry instance. The easiest way to get +what we need is to go to the +[Python getting started documentation page](https://docs.sentry.io/error-reporting/quickstart/?platform=python) +and scroll down to the "Configure the SDK" section. + +The Sentry docs show you exactly what you need to export to connect to your account. + +Copy the string parameter for the `init` method and +[set it as an environment variable](https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html) +rather than exposing it directly in your application code. + +```bash +export SENTRY_DSN='https://yourkeygoeshere.ingest.sentry.io/project-number' +``` + +**Make sure to replace "yourkeygoeshere" with your own unique identifier +and "project-number" with the ID that matches the project you just +created.** + +Check that the `SENTRY_DSN` is set properly in your shell using the `echo` +command: + +```bash +echo $SENTRY_DSN +``` + +Modify the application to send exception information to Sentry now +that we have our unique identifier. Open `module_loader.py` again and +update the following highlighted lines of code. + +```python +import argparse +import importlib +~~import os +import pkgutil +~~import sentry_sdk +~~from sentry_sdk import capture_exception + +~~# find on https://docs.sentry.io/error-reporting/quickstart/?platform=python +~~sentry_sdk.init(dsn=os.getenv('SENTRY_DSN')) + + +def import_submodules(package): + """Import all submodules of a module, recursively, including subpackages. + + :param package: package (name or actual module) + :type package: str | module + :rtype: dict[str, types.ModuleType] + """ + if isinstance(package, str): + package = importlib.import_module(package) + results = {} + for loader, name, is_pkg in pkgutil.walk_packages(package.__path__): + full_name = package.__name__ + '.' + name + try: + results[full_name] = importlib.import_module(full_name) + if is_pkg: + results.update(import_submodules(full_name)) + except ModuleNotFoundError as mnfe: + print("module not found: {}".format(full_name)) +~~ capture_exception(mnfe) + except Exception as general_exception: + print(general_exception) +~~ capture_exception(general_exception) + return results + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("package") + args = parser.parse_args() + + package_to_load = args.package + results = import_submodules(package_to_load) + for r in results: + print(str(r)) +``` + +These new lines of code import the +[Sentry Python SDK](https://github.com/getsentry/sentry-python) and `os` +library (to read system environment variables). The application then +initializes the Sentry SDK with the string found in the `SENTRY_DSN` +environment variable. Down in the `import_submodules` function we +then call the `capture_exception` SDK function whenever a +`ModuleNotFoundException` is thrown or another exception which would +be caught within the broader `Exception` bucket. + +Now that our code is in place, let's test out the new Sentry integration. + + +## Testing the Script and Viewing Exceptions +The easiest way to test out whether the Sentry code is working or not is +to try to import a module that does not exist. Let's say you make a +typo in your command and try to run the script on `importliba` instead +of `importlib` (maybe because you are using an awful Macbook Pro "butterfly" +keyboard instead of a durable keyboard). Try it out and see what happens: + +```bash +python module_loader.py importliba +``` + +The script will run and finish but there will be errors because that +module does not exist. Thanks to our new code, we can view the +errors in Sentry. + +Check the Sentry dashboard to see the error. + +Viewing the first exception in the Sentry dashboard. + +We can also click into the error to learn more about what happened. + +The exception details in the Sentry dashboard. + +You can also receive email reports on the errors that occur so that +you do not have to always stay logged into the dashboard. + +The exception via email. + +With that all configured, we've now got a great base to expand the script +and build better error handling with Sentry as our Python application +becomes more complex. + + +## What's Next? +We just created an example script that outputs all of the modules and +submodules in a package, then added Sentry to it so that it would report +any exceptions back to our central hosted instance. + +That's just a simple introduction to Sentry, so next you'll want to +read one of the following articles to do more with it: + +* [Python Sentry docs](https://docs.sentry.io/platforms/python/) +* [How to use Sentry with Flask](https://docs.sentry.io/platforms/python/flask/) +* [Integrating Sentry into Celery task queues](https://docs.sentry.io/platforms/python/celery/) + +You can also get an idea of what to code next in your Python project by +reading the +[Full Stack Python table of contents page](/table-of-contents.html). + +Questions? Contact me via Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). I'm also on GitHub with +the username [mattmakai](https://github.com/mattmakai). + +Something wrong with this post? Fork +[this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200525-python-exceptions-sentry.markdown) +and submit a pull request. diff --git a/redirects/flask-core-extensions-code-examples.html b/redirects/flask-core-extensions-code-examples.html new file mode 100755 index 000000000..1a439cb87 --- /dev/null +++ b/redirects/flask-core-extensions-code-examples.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/img/200525-sentry/create-new-project-screen.jpg b/static/img/200525-sentry/create-new-project-screen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75310353c9dbee4fbd21ac72e2b160ac1129d39e GIT binary patch literal 270443 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
U_ybru10N#H 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�Cp?L5C)HsDZ3?tovuBB_r?XDu8 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
diff --git a/theme/templates/code-examples/sqlalchemy.html b/theme/templates/code-examples/sqlalchemy.html index 4bdee3ca4..aa5cb6ba8 100644 --- a/theme/templates/code-examples/sqlalchemy.html +++ b/theme/templates/code-examples/sqlalchemy.html @@ -1,9 +1,124 @@
-

SQLAlchemy: +

SQLAlchemy: Extensions, Plug-ins and Related Libraries & -Example Projects and Code +Example Projects and Code

-

Models

+

sqlalchemy.dialects.postgresql.base + PGTypeCompiler +

+

sqlalchemy.dialects.postgresql.psycopg2 + PGDialect_psycopg2 +

+

sqlalchemy.engine.default + DefaultDialect +

+

sqlalchemy.engine.strategies + EngineStrategy, + MockEngineStrategy +

+

sqlalchemy.engine.url + make_url +

+

sqlalchemy.events + SchemaEventTarget +

+

sqlalchemy.exc + DataError, + IntegrityError, + InvalidRequestError, + NoInspectionAvailable, + OperationalError, + ProgrammingError +

+

sqlalchemy.ext.automap + automap_base +

+

sqlalchemy.ext.compiler + compiles +

+

sqlalchemy.ext.hybrid + HYBRID_PROPERTY, + hybrid_property +

+

sqlalchemy.ext.mutable + Mutable +

+

sqlalchemy.inspection + inspect +

+

sqlalchemy.orm.attributes + InstrumentedAttribute +

+

sqlalchemy.orm.collections + InstrumentedList +

+

sqlalchemy.orm.exc + NoResultFound, + UnmappedClassError, + UnmappedInstanceError +

+

sqlalchemy.orm.interfaces + MapperProperty, + PropComparator +

+

sqlalchemy.orm.properties + ColumnProperty, + RelationshipProperty +

+

sqlalchemy.orm.session + Session, + object_session +

+

sqlalchemy.orm.util + AliasedInsp +

+

sqlalchemy.schema + CheckConstraint, + Column, + CreateIndex, + DDL, + DDLElement, + ForeignKey, + ForeignKeyConstraint, + PrimaryKeyConstraint, + Table +

+

sqlalchemy.sql.elements + Label +

+

sqlalchemy.sql.expression + ClauseElement, + ColumnClause, + ColumnElement, + Executable, + Function, + FunctionElement, + UnaryExpression +

+

sqlalchemy.sql.functions + GenericFunction +

+

sqlalchemy.sql.naming + conv +

+

sqlalchemy.sql.schema + SchemaItem +

+

sqlalchemy.sql.util + ClauseAdapter +

+

sqlalchemy.sql.visitors + traverse +

+

sqlalchemy.types + INTEGER, + Integer, + NULLTYPE, + NullType +

+

sqlalchemy.util.langhelpers + symbol +

diff --git a/theme/templates/table-of-contents.html b/theme/templates/table-of-contents.html index 54dd5550f..912e439e0 100644 --- a/theme/templates/table-of-contents.html +++ b/theme/templates/table-of-contents.html @@ -46,6 +46,7 @@

Date: Sat, 13 Jun 2020 06:55:19 -0400 Subject: [PATCH 120/302] fixing sortorder on flask examples --- .../flask/flask-blueprints-blueprint.markdown | 82 +- .../flask/flask-cli-flaskgroup.markdown | 2 +- .../flask/flask-cli-scriptinfo.markdown | 2 +- .../flask/flask-cli-with-appcontext.markdown | 2 +- .../flask/flask-ctx-has-app-context.markdown | 2 +- .../flask-ctx-has-request-context.markdown | 2 +- .../flask/flask-extensions-plug-ins.markdown | 13 + .../flask/flask-globals-current-app.markdown | 170 +++- .../flask/flask-globals-request.markdown | 156 +++- .../flask/flask-globals-session.markdown | 85 +- .../flask/flask-helpers-flash.markdown | 2 +- .../flask-helpers-make-response.markdown | 2 +- .../flask/flask-helpers-url-for.markdown | 84 +- .../flask/flask-json-jsonify.markdown | 725 ++++++++++++++++++ .../flask-sessions-badsignature.markdown | 2 +- .../flask-sessions-sessioninterface.markdown | 2 +- .../flask/flask-signals-namespace.markdown | 2 +- .../flask-templating-render-template.markdown | 2 +- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 2 +- .../examples/flask/flask-views-view.markdown | 2 +- static/img/logos/webrtc-wide.png | Bin 0 -> 14907 bytes theme/templates/code-examples/flask.html | 5 +- 23 files changed, 1295 insertions(+), 53 deletions(-) create mode 100644 content/pages/examples/flask/flask-json-jsonify.markdown create mode 100644 static/img/logos/webrtc-wide.png diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 2596af877..756d15458 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -270,7 +270,79 @@ def about(): ``` -## Example 4 from flask_jsondash +## Example 4 from flask-debugtoolbar +[Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) +([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/Flask-DebugToolbar/)) +is a [Flask](/flask.html) conversion of the popular +[Django Debug Toolbar](https://github.com/jazzband/django-debug-toolbar) +project. This extension creates a sidebar with useful debugging +information when you are running a Flask application in development +mode. The project is provided as open source under +[this license](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/LICENSE). + +[**flask-debugtoolbar / flask_debugtoolbar / __init__.py**](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/flask_debugtoolbar/./__init__.py) + +```python +# __init__.py +import os +import warnings + +~~from flask import Blueprint, current_app, request, g, send_from_directory, url_for +from flask.globals import _request_ctx_stack +from jinja2 import Environment, PackageLoader +from werkzeug.urls import url_quote_plus + +from flask_debugtoolbar.compat import iteritems +from flask_debugtoolbar.toolbar import DebugToolbar +from flask_debugtoolbar.utils import decode_text + +try: + # Python 3.8+ + from importlib.metadata import version + + __version__ = version("Flask-DebugToolbar") +except ImportError: + import pkg_resources + + __version__ = pkg_resources.get_distribution("Flask-DebugToolbar").version + + +~~module = Blueprint('debugtoolbar', __name__) + + +def replace_insensitive(string, target, replacement): + """Similar to string.replace() but is case insensitive + Code borrowed from: + http://forums.devshed.com/python-programming-11/case-insensitive-string-replace-490921.html + """ + no_case = string.lower() + index = no_case.rfind(target.lower()) + if index >= 0: + return string[:index] + replacement + string[index + len(target):] + else: # no results so return the original string + return string + + +def _printable(value): + try: + return decode_text(repr(value)) + except Exception as e: + return '' % ( + object.__repr__(value), type(e).__name__, e) + + +class DebugToolbarExtension(object): + + +## ... source file continues with no further Blueprint examples... + + +``` + + +## Example 5 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -356,7 +428,7 @@ def auth(**kwargs): ``` -## Example 5 from flask-restx +## Example 6 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -410,7 +482,7 @@ apidoc = Apidoc( ``` -## Example 6 from Flask-WTF +## Example 7 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -519,7 +591,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 7 from flaskSaaS +## Example 8 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -590,7 +662,7 @@ def signup(): ``` -## Example 8 from tedivms-flask +## Example 9 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 38476e94d..b3705a23b 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -1,7 +1,7 @@ title: flask.cli FlaskGroup code examples category: page slug: flask-cli-flaskgroup-examples -sortorder: 500021000 +sortorder: 500021001 toc: False sidebartitle: flask.cli FlaskGroup meta: Python example code for the FlaskGroup class from the flask.cli module of the Flask project. diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index 5c0dc8311..c7af1e6dd 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -1,7 +1,7 @@ title: flask.cli ScriptInfo code examples category: page slug: flask-cli-scriptinfo-examples -sortorder: 500021001 +sortorder: 500021002 toc: False sidebartitle: flask.cli ScriptInfo meta: Python example code for the ScriptInfo class from the flask.cli module of the Flask project. diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index 16cdfeed1..68ac1d61f 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -1,7 +1,7 @@ title: flask.cli with_appcontext code examples category: page slug: flask-cli-with-appcontext-examples -sortorder: 500021002 +sortorder: 500021003 toc: False sidebartitle: flask.cli with_appcontext meta: Python example code for the with_appcontext function from the flask.cli module of the Flask project. diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index fdc45cfc9..e265fc4b1 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -1,7 +1,7 @@ title: flask.ctx has_app_context code examples category: page slug: flask-ctx-has-app-context-examples -sortorder: 500021000 +sortorder: 500021004 toc: False sidebartitle: flask.ctx has_app_context meta: Python example code for the has_app_context function from the flask.ctx module of the Flask project. diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index d704b26db..0639011f2 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -1,7 +1,7 @@ title: flask.ctx has_request_context code examples category: page slug: flask-ctx-has-request-context-examples -sortorder: 500021001 +sortorder: 500021005 toc: False sidebartitle: flask.ctx has_request_context meta: Python example code for the has_request_context function from the flask.ctx module of the Flask project. diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown index 614a1dee3..ffd934ead 100644 --- a/content/pages/examples/flask/flask-extensions-plug-ins.markdown +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -65,6 +65,19 @@ flask-base's code is open sourced [under the MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md). +### Flask Debug-toolbar +[Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) +([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/Flask-DebugToolbar/)) +is a [Flask](/flask.html) conversion of the popular +[Django Debug Toolbar](https://github.com/jazzband/django-debug-toolbar) +project. This extension creates a sidebar with useful debugging +information when you are running a Flask application in development +mode. The project is provided as open source under +[this license](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/LICENSE). + + ### Flask-Login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index b807503ce..b87216b13 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -1,7 +1,7 @@ title: flask.globals current_app code examples category: page slug: flask-globals-current-app-examples -sortorder: 500021000 +sortorder: 500021006 toc: False sidebartitle: flask.globals current_app meta: Python example code for the current_app function from the flask.globals module of the Flask project. @@ -445,7 +445,159 @@ class User(UserMixin, db.Model): ``` -## Example 4 from flask_jsondash +## Example 4 from flask-debugtoolbar +[Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) +([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/Flask-DebugToolbar/)) +is a [Flask](/flask.html) conversion of the popular +[Django Debug Toolbar](https://github.com/jazzband/django-debug-toolbar) +project. This extension creates a sidebar with useful debugging +information when you are running a Flask application in development +mode. The project is provided as open source under +[this license](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/LICENSE). + +[**flask-debugtoolbar / flask_debugtoolbar / __init__.py**](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/flask_debugtoolbar/./__init__.py) + +```python +# __init__.py +import os +import warnings + +~~from flask import Blueprint, current_app, request, g, send_from_directory, url_for +from flask.globals import _request_ctx_stack +from jinja2 import Environment, PackageLoader +from werkzeug.urls import url_quote_plus + +from flask_debugtoolbar.compat import iteritems +from flask_debugtoolbar.toolbar import DebugToolbar +from flask_debugtoolbar.utils import decode_text + +try: + # Python 3.8+ + from importlib.metadata import version + + __version__ = version("Flask-DebugToolbar") +except ImportError: + import pkg_resources + + __version__ = pkg_resources.get_distribution("Flask-DebugToolbar").version + + +module = Blueprint('debugtoolbar', __name__) + + +def replace_insensitive(string, target, replacement): + """Similar to string.replace() but is case insensitive + + +## ... source file abbreviated to get to current_app examples ... + + + + rule = req.url_rule + + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if getattr(rule, 'provide_automatic_options', False) \ + and req.method == 'OPTIONS': + return app.make_default_options_response() + + # otherwise dispatch to the handler for that endpoint + view_func = app.view_functions[rule.endpoint] + view_func = self.process_view(app, view_func, req.view_args) + + return view_func(**req.view_args) + + def _show_toolbar(self): + """Return a boolean to indicate if we need to show the toolbar.""" + if request.blueprint == 'debugtoolbar': + return False + +~~ hosts = current_app.config['DEBUG_TB_HOSTS'] + if hosts and request.remote_addr not in hosts: + return False + + return True + + def send_static_file(self, filename): + """Send a static file from the flask-debugtoolbar static directory.""" + return send_from_directory(self._static_dir, filename) + + def process_request(self): + g.debug_toolbar = self + + if not self._show_toolbar(): + return + + real_request = request._get_current_object() + + self.debug_toolbars[real_request] = ( + DebugToolbar(real_request, self.jinja_env)) + + for panel in self.debug_toolbars[real_request].panels: + panel.process_request(real_request) + + def process_view(self, app, view_func, view_kwargs): + + +## ... source file abbreviated to get to current_app examples ... + + + real_request = request._get_current_object() + try: + toolbar = self.debug_toolbars[real_request] + except KeyError: + return view_func + + for panel in toolbar.panels: + new_view = panel.process_view(real_request, view_func, view_kwargs) + if new_view: + view_func = new_view + + return view_func + + def process_response(self, response): + real_request = request._get_current_object() + if real_request not in self.debug_toolbars: + return response + + # Intercept http redirect codes and display an html page with a + # link to the target. +~~ if current_app.config['DEBUG_TB_INTERCEPT_REDIRECTS']: + if response.status_code in self._redirect_codes: + redirect_to = response.location + redirect_code = response.status_code + if redirect_to: + content = self.render('redirect.html', { + 'redirect_to': redirect_to, + 'redirect_code': redirect_code + }) + response.content_length = len(content) + response.location = None + response.response = [content] + response.status_code = 200 + + # If the http response code is 200 then we process to add the + # toolbar to the returned html response. + if not (response.status_code == 200 and + response.is_sequence and + response.headers['content-type'].startswith('text/html')): + return response + + response_html = response.data.decode(response.charset) + + no_case = response_html.lower() + body_end = no_case.rfind('') + + +## ... source file continues with no further current_app examples... + + +``` + + +## Example 5 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -575,7 +727,7 @@ def local_static(chart_config, static_config): ``` -## Example 5 from flask-login +## Example 6 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -925,7 +1077,7 @@ def _secret_key(key=None): ``` -## Example 6 from flask-restx +## Example 7 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1171,7 +1323,7 @@ def _clean_header(header): ``` -## Example 7 from flask-sqlalchemy +## Example 8 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) ([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) and @@ -1341,7 +1493,7 @@ def get_debug_queries(): ``` -## Example 8 from Flask-WTF +## Example 9 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1650,7 +1802,7 @@ class CSRFError(BadRequest): ``` -## Example 9 from Flasky +## Example 10 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1714,7 +1866,7 @@ def run_migrations_offline(): ``` -## Example 10 from sandman2 +## Example 11 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1837,7 +1989,7 @@ def register_model(cls, admin=None): ``` -## Example 11 from tedivms-flask +## Example 12 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 8b4eb7056..8437a115e 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -1,7 +1,7 @@ title: flask.globals request code examples category: page slug: flask-globals-request-examples -sortorder: 500021001 +sortorder: 500021007 toc: False sidebartitle: flask.globals request meta: Python example code for the request function from the flask.globals module of the Flask project. @@ -251,7 +251,143 @@ def configure_migrations(app): ``` -## Example 3 from flaskex +## Example 3 from flask-debugtoolbar +[Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) +([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/Flask-DebugToolbar/)) +is a [Flask](/flask.html) conversion of the popular +[Django Debug Toolbar](https://github.com/jazzband/django-debug-toolbar) +project. This extension creates a sidebar with useful debugging +information when you are running a Flask application in development +mode. The project is provided as open source under +[this license](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/LICENSE). + +[**flask-debugtoolbar / flask_debugtoolbar / __init__.py**](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/flask_debugtoolbar/./__init__.py) + +```python +# __init__.py +import os +import warnings + +~~from flask import Blueprint, current_app, request, g, send_from_directory, url_for +from flask.globals import _request_ctx_stack +from jinja2 import Environment, PackageLoader +from werkzeug.urls import url_quote_plus + +from flask_debugtoolbar.compat import iteritems +from flask_debugtoolbar.toolbar import DebugToolbar +from flask_debugtoolbar.utils import decode_text + +try: + # Python 3.8+ + from importlib.metadata import version + + __version__ = version("Flask-DebugToolbar") +except ImportError: + import pkg_resources + + __version__ = pkg_resources.get_distribution("Flask-DebugToolbar").version + + +module = Blueprint('debugtoolbar', __name__) + + +def replace_insensitive(string, target, replacement): + """Similar to string.replace() but is case insensitive + + +## ... source file abbreviated to get to request examples ... + + + + if req.routing_exception is not None: + app.raise_routing_exception(req) + + rule = req.url_rule + + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if getattr(rule, 'provide_automatic_options', False) \ + and req.method == 'OPTIONS': + return app.make_default_options_response() + + # otherwise dispatch to the handler for that endpoint + view_func = app.view_functions[rule.endpoint] + view_func = self.process_view(app, view_func, req.view_args) + + return view_func(**req.view_args) + + def _show_toolbar(self): + """Return a boolean to indicate if we need to show the toolbar.""" +~~ if request.blueprint == 'debugtoolbar': + return False + + hosts = current_app.config['DEBUG_TB_HOSTS'] +~~ if hosts and request.remote_addr not in hosts: + return False + + return True + + def send_static_file(self, filename): + """Send a static file from the flask-debugtoolbar static directory.""" + return send_from_directory(self._static_dir, filename) + + def process_request(self): + g.debug_toolbar = self + + if not self._show_toolbar(): + return + + real_request = request._get_current_object() + + self.debug_toolbars[real_request] = ( + DebugToolbar(real_request, self.jinja_env)) + + for panel in self.debug_toolbars[real_request].panels: + panel.process_request(real_request) + + def process_view(self, app, view_func, view_kwargs): + """ This method is called just before the flask view is called. + + +## ... source file abbreviated to get to request examples ... + + + else: + warnings.warn('Could not insert debug toolbar.' + ' tag not found in response.') + return response + + toolbar = self.debug_toolbars[real_request] + + for panel in toolbar.panels: + panel.process_response(real_request, response) + + toolbar_html = toolbar.render_toolbar() + + content = ''.join((before, toolbar_html, after)) + content = content.encode(response.charset) + response.response = [content] + response.content_length = len(content) + + return response + + def teardown_request(self, exc): +~~ self.debug_toolbars.pop(request._get_current_object(), None) + + def render(self, template_name, context): + template = self.jinja_env.get_template(template_name) + return template.render(**context) + + +## ... source file continues with no further request examples... + + +``` + + +## Example 4 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -355,7 +491,7 @@ if __name__ == "__main__": ``` -## Example 4 from flask-login +## Example 5 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -664,7 +800,7 @@ def _secret_key(key=None): ``` -## Example 5 from flask-restx +## Example 6 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -769,7 +905,7 @@ class marshal_with_field(object): ``` -## Example 6 from flask-sqlalchemy +## Example 7 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) ([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) and @@ -895,7 +1031,7 @@ def _make_table(db): ``` -## Example 7 from Flask-WTF +## Example 8 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1057,7 +1193,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 8 from flaskSaaS +## Example 9 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -1110,7 +1246,7 @@ admin.add_view(FileAdmin(path, '/static/', name='Static')) ``` -## Example 9 from newspie +## Example 10 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1319,7 +1455,7 @@ if __name__ == '__main__': ``` -## Example 10 from sandman2 +## Example 11 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1598,7 +1734,7 @@ class Service(MethodView): ``` -## Example 11 from tedivms-flask +## Example 12 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 29400f855..e582d98fe 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -1,7 +1,7 @@ title: flask.globals session code examples category: page slug: flask-globals-session-examples -sortorder: 500021002 +sortorder: 500021008 toc: False sidebartitle: flask.globals session meta: Python example code for the session function from the flask.globals module of the Flask project. @@ -231,7 +231,80 @@ def do_topic_action(topics, user, action, reverse): # noqa: C901 ``` -## Example 3 from flaskex +## Example 3 from flask-debugtoolbar +[Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) +([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/Flask-DebugToolbar/)) +is a [Flask](/flask.html) conversion of the popular +[Django Debug Toolbar](https://github.com/jazzband/django-debug-toolbar) +project. This extension creates a sidebar with useful debugging +information when you are running a Flask application in development +mode. The project is provided as open source under +[this license](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/LICENSE). + +[**flask-debugtoolbar / flask_debugtoolbar / panels / request_vars.py**](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/flask_debugtoolbar/panels/request_vars.py) + +```python +# request_vars.py +~~from flask import session + +from flask_debugtoolbar.panels import DebugPanel + +_ = lambda x: x + + +class RequestVarsDebugPanel(DebugPanel): + """ + A panel to display request variables (POST/GET, session, cookies). + """ + name = 'RequestVars' + has_content = True + + def nav_title(self): + return _('Request Vars') + + def title(self): + return _('Request Vars') + + def url(self): + return '' + + def process_request(self, request): + self.request = request + self.session = session + self.view_func = None + self.view_args = [] + self.view_kwargs = {} + + def process_view(self, request, view_func, view_kwargs): + self.view_func = view_func + self.view_kwargs = view_kwargs + + def content(self): + context = self.context.copy() + context.update({ + 'get': self.request.args.lists(), + 'post': self.request.form.lists(), + 'cookies': self.request.cookies.items(), + 'view_func': ('%s.%s' % (self.view_func.__module__, + self.view_func.__name__) + if self.view_func else '[unknown]'), + 'view_args': self.view_args, + 'view_kwargs': self.view_kwargs or {}, +~~ 'session': self.session.items(), + }) + + return self.render('panels/request_vars.html', context) + + +## ... source file continues with no further session examples... + + +``` + + +## Example 4 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -335,7 +408,7 @@ if __name__ == "__main__": ``` -## Example 4 from flask-login +## Example 5 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -511,7 +584,7 @@ def login_required(func): ``` -## Example 5 from Flask-WTF +## Example 6 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -653,7 +726,7 @@ def _get_config( ``` -## Example 6 from flaskSaaS +## Example 7 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -743,7 +816,7 @@ logger = wrap_logger( ``` -## Example 7 from tedivms-flask +## Example 8 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 54d3ee257..89789ade5 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -1,7 +1,7 @@ title: flask.helpers flash code examples category: page slug: flask-helpers-flash-examples -sortorder: 500021000 +sortorder: 500021009 toc: False sidebartitle: flask.helpers flash meta: Python example code for the flash function from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 8785602c4..a597abfc6 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -1,7 +1,7 @@ title: flask.helpers make_response code examples category: page slug: flask-helpers-make-response-examples -sortorder: 500021001 +sortorder: 500021010 toc: False sidebartitle: flask.helpers make_response meta: Python example code for the make_response function from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 7d6dd7917..18c605bb5 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -1,7 +1,7 @@ title: flask.helpers url_for code examples category: page slug: flask-helpers-url-for-examples -sortorder: 500021002 +sortorder: 500021011 toc: False sidebartitle: flask.helpers url_for meta: Python example code for the url_for function from the flask.helpers module of the Flask project. @@ -238,7 +238,75 @@ class CustomSelectField(Field): ``` -## Example 4 from flaskex +## Example 4 from flask-debugtoolbar +[Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) +([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/Flask-DebugToolbar/)) +is a [Flask](/flask.html) conversion of the popular +[Django Debug Toolbar](https://github.com/jazzband/django-debug-toolbar) +project. This extension creates a sidebar with useful debugging +information when you are running a Flask application in development +mode. The project is provided as open source under +[this license](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/LICENSE). + +[**flask-debugtoolbar / flask_debugtoolbar / toolbar.py**](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/flask_debugtoolbar/./toolbar.py) + +```python +# toolbar.py +try: + from urllib.parse import unquote +except ImportError: + from urllib import unquote + +~~from flask import url_for, current_app +from werkzeug.utils import import_string + + +class DebugToolbar(object): + + _cached_panel_classes = {} + + def __init__(self, request, jinja_env): + self.jinja_env = jinja_env + self.request = request + self.panels = [] + + self.template_context = { +~~ 'static_path': url_for('_debug_toolbar.static', filename='') + } + + self.create_panels() + + def create_panels(self): + """ + Populate debug panels + """ + activated = self.request.cookies.get('fldt_active', '') + activated = unquote(activated).split(';') + + for panel_class in self._iter_panels(current_app): + panel_instance = panel_class(jinja_env=self.jinja_env, + context=self.template_context) + + if panel_instance.dom_id() in activated: + panel_instance.is_active = True + + self.panels.append(panel_instance) + + def render_toolbar(self): + context = self.template_context.copy() + context.update({'panels': self.panels}) + + + +## ... source file continues with no further url_for examples... + + +``` + + +## Example 5 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -342,7 +410,7 @@ if __name__ == "__main__": ``` -## Example 5 from flask-login +## Example 6 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -457,7 +525,7 @@ def login_url(login_view, next_url=None, next_field='next'): ``` -## Example 6 from flask-phone-input +## Example 7 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -515,7 +583,7 @@ def show_phone(): ``` -## Example 7 from flask-restx +## Example 8 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -576,7 +644,7 @@ def ui_for(api): ``` -## Example 8 from flaskSaaS +## Example 9 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -791,7 +859,7 @@ def charge(): ``` -## Example 9 from Flasky +## Example 10 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -981,7 +1049,7 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body) ``` -## Example 10 from tedivms-flask +## Example 11 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown new file mode 100644 index 000000000..e66597755 --- /dev/null +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -0,0 +1,725 @@ +title: flask.json jsonify code examples +category: page +slug: flask-json-jsonify-examples +sortorder: 500021012 +toc: False +sidebartitle: flask.json jsonify +meta: Python example code for the jsonify function from the flask.json module of the Flask project. + + +jsonify is a function within the flask.json module of the Flask project. + + +## Example 1 from Flask AppBuilder +[Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) +([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) +and +[example apps](https://github.com/dpgaspar/Flask-AppBuilder/tree/master/examples)) +is a web application generator that uses Flask to automatically create +the code for database-driven applications based on parameters set +by the user. The generated applications include default security settings, +forms, and internationalization support. + +Flask App Builder is provided under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/LICENSE). + +[**Flask AppBuilder / flask_appbuilder / security / decorators.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/security/decorators.py) + +```python +# decorators.py +import functools +import logging + +~~from flask import current_app, flash, jsonify, make_response, redirect, request, url_for +from flask_jwt_extended import verify_jwt_in_request +from flask_login import current_user + +from .._compat import as_unicode +from ..const import ( + FLAMSG_ERR_SEC_ACCESS_DENIED, + LOGMSG_ERR_SEC_ACCESS_DENIED, + PERMISSION_PREFIX, +) + +log = logging.getLogger(__name__) + + +def protect(allow_browser_login=False): + """ + Use this decorator to enable granular security permissions + to your API methods (BaseApi and child classes). + Permissions will be associated to a role, and roles are associated to users. + + allow_browser_login will accept signed cookies obtained from the normal MVC app:: + + class MyApi(BaseApi): + @expose('/dosonmething', methods=['GET']) + @protect(allow_browser_login=True) + + +## ... source file abbreviated to get to jsonify examples ... + + + else: + permission_str = f.__name__ + + def wraps(self, *args, **kwargs): + permission_str = "{}{}".format(PERMISSION_PREFIX, f._permission_name) + if self.method_permission_name: + _permission_name = self.method_permission_name.get(f.__name__) + if _permission_name: + permission_str = "{}{}".format(PERMISSION_PREFIX, _permission_name) + if permission_str in self.base_permissions and self.appbuilder.sm.has_access( + permission_str, self.class_permission_name + ): + return f(self, *args, **kwargs) + else: + log.warning( + LOGMSG_ERR_SEC_ACCESS_DENIED.format( + permission_str, self.__class__.__name__ + ) + ) + response = make_response( +~~ jsonify( + {"message": str(FLAMSG_ERR_SEC_ACCESS_DENIED), "severity": "danger"} + ), + 401, + ) + response.headers["Content-Type"] = "application/json" + return response + + f._permission_name = permission_str + return functools.update_wrapper(wraps, f) + + +def permission_name(name): + """ + Use this decorator to override the name of the permission. + has_access will use the methods name has the permission name + if you want to override this add this decorator to your methods. + This is useful if you want to aggregate methods to permissions + + It will add '_permission_name' attribute to your method + that will be inspected by BaseView to collect your view's + permissions. + + Note that you should use @has_access to execute after @permission_name + like on the following example. + + +## ... source file continues with no further jsonify examples... + + +``` + + +## Example 2 from FlaskBB +[FlaskBB](https://github.com/flaskbb/flaskbb) +([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based +forum web application. The web app allows users to chat in an open +message board or send private messages in plain text or +[Markdown](/markdown.html). + +FlaskBB is provided as open source +[under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). + +[**FlaskBB / flaskbb / management / views.py**](https://github.com/flaskbb/flaskbb/blob/master/flaskbb/management/views.py) + +```python +# views.py +# -*- coding: utf-8 -*- +""" + flaskbb.management.views + ------------------------ + + This module handles the management views. + + :copyright: (c) 2014 by the FlaskBB Team. + :license: BSD, see LICENSE for more details. +""" +import logging +import sys + +from celery import __version__ as celery_version +from flask import __version__ as flask_version +~~from flask import (Blueprint, current_app, flash, jsonify, redirect, request, + url_for) +from flask.views import MethodView +from flask_allows import Not, Permission +from flask_babelplus import gettext as _ +from flask_login import current_user, login_fresh +from pluggy import HookimplMarker + +from flaskbb import __version__ as flaskbb_version +from flaskbb.extensions import allows, celery, db +from flaskbb.forum.forms import UserSearchForm +from flaskbb.forum.models import Category, Forum, Post, Report, Topic +from flaskbb.management.forms import (AddForumForm, AddGroupForm, AddUserForm, + CategoryForm, EditForumForm, + EditGroupForm, EditUserForm) +from flaskbb.management.models import Setting, SettingsGroup +from flaskbb.plugins.models import PluginRegistry, PluginStore +from flaskbb.plugins.utils import validate_plugin +from flaskbb.user.models import Group, Guest, User +from flaskbb.utils.forms import populate_settings_dict, populate_settings_form +from flaskbb.utils.helpers import (get_online_users, register_view, + render_template, time_diff, time_utcnow, + FlashAndRedirect) +from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin, + IsAtleastModerator, + + +## ... source file abbreviated to get to jsonify examples ... + + + if request.is_xhr: + ids = request.get_json()["ids"] + + data = [] + for user in User.query.filter(User.id.in_(ids)).all(): + # do not delete current user + if current_user.id == user.id: + continue + + if user.delete(): + data.append( + { + "id": user.id, + "type": "delete", + "reverse": False, + "reverse_name": None, + "reverse_url": None + } + ) + +~~ return jsonify( + message="{} users deleted.".format(len(data)), + category="success", + data=data, + status=200 + ) + + user = User.query.filter_by(id=user_id).first_or_404() + + if current_user.id == user.id: + flash(_("You cannot delete yourself.", "danger")) + return redirect(url_for("management.users")) + + user.delete() + flash(_("User deleted."), "success") + return redirect(url_for("management.users")) + + +class AddUser(MethodView): + decorators = [ + allows.requires( + IsAdmin, + on_fail=FlashAndRedirect( + message=_("You are not allowed to manage users"), + level="danger", + + +## ... source file abbreviated to get to jsonify examples ... + + + Permission(IsAdmin, identity=user) and + Permission(Not(IsAdmin), current_user)): + continue + + elif user.ban(): + data.append( + { + "id": + user.id, + "type": + "ban", + "reverse": + "unban", + "reverse_name": + _("Unban"), + "reverse_url": + url_for("management.unban_user", user_id=user.id) + } + ) + +~~ return jsonify( + message="{} users banned.".format(len(data)), + category="success", + data=data, + status=200 + ) + + user = User.query.filter_by(id=user_id).first_or_404() + # Do not allow moderators to ban admins + if Permission(IsAdmin, identity=user) and Permission( + Not(IsAdmin), identity=current_user): + flash(_("A moderator cannot ban an admin user."), "danger") + return redirect(url_for("management.overview")) + + if not current_user.id == user.id and user.ban(): + flash(_("User is now banned."), "success") + else: + flash(_("Could not ban user."), "danger") + return redirect(url_for("management.banned_users")) + + +class UnbanUser(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + + +## ... source file abbreviated to get to jsonify examples ... + + + return redirect(url_for("management.overview")) + + # ajax request + if request.is_xhr: + ids = request.get_json()["ids"] + + data = [] + for user in User.query.filter(User.id.in_(ids)).all(): + if user.unban(): + data.append( + { + "id": user.id, + "type": "unban", + "reverse": "ban", + "reverse_name": _("Ban"), + "reverse_url": url_for("management.ban_user", + user_id=user.id) + } + ) + +~~ return jsonify( + message="{} users unbanned.".format(len(data)), + category="success", + data=data, + status=200 + ) + + user = User.query.filter_by(id=user_id).first_or_404() + + if user.unban(): + flash(_("User is now unbanned."), "success") + else: + flash(_("Could not unban user."), "danger") + + return redirect(url_for("management.banned_users")) + + +class Groups(MethodView): + decorators = [ + allows.requires( + IsAdmin, + on_fail=FlashAndRedirect( + message=_("You are not allowed to modify groups."), + level="danger", + endpoint="management.overview" + + +## ... source file abbreviated to get to jsonify examples ... + + + ] + + def post(self, group_id=None): + if request.is_xhr: + ids = request.get_json()["ids"] + # TODO: Get rid of magic numbers + if not (set(ids) & set(["1", "2", "3", "4", "5", "6"])): + data = [] + for group in Group.query.filter(Group.id.in_(ids)).all(): + group.delete() + data.append( + { + "id": group.id, + "type": "delete", + "reverse": False, + "reverse_name": None, + "reverse_url": None + } + ) + +~~ return jsonify( + message="{} groups deleted.".format(len(data)), + category="success", + data=data, + status=200 + ) +~~ return jsonify( + message=_("You cannot delete one of the standard groups."), + category="danger", + data=None, + status=404 + ) + + if group_id is not None: + if group_id <= 6: # there are 6 standard groups + flash( + _( + "You cannot delete the standard groups. " + "Try renaming it instead.", "danger" + ) + ) + return redirect(url_for("management.groups")) + + group = Group.query.filter_by(id=group_id).first_or_404() + group.delete() + flash(_("Group deleted."), "success") + return redirect(url_for("management.groups")) + + flash(_("No group chosen."), "danger") + return redirect(url_for("management.groups")) + + + +## ... source file abbreviated to get to jsonify examples ... + + + + # AJAX request + if request.is_xhr: + ids = request.get_json()["ids"] + data = [] + + for report in Report.query.filter(Report.id.in_(ids)).all(): + report.zapped_by = current_user.id + report.zapped = time_utcnow() + report.save() + data.append( + { + "id": report.id, + "type": "read", + "reverse": False, + "reverse_name": None, + "reverse_url": None + } + ) + +~~ return jsonify( + message="{} reports marked as read.".format(len(data)), + category="success", + data=data, + status=200 + ) + + # mark single report as read + if report_id: + report = Report.query.filter_by(id=report_id).first_or_404() + if report.zapped: + flash( + _("Report %(id)s is already marked as read.", id=report.id), + "success" + ) + return redirect(url_for("management.reports")) + + report.zapped_by = current_user.id + report.zapped = time_utcnow() + report.save() + flash(_("Report %(id)s marked as read.", id=report.id), "success") + return redirect(url_for("management.reports")) + + # mark all as read + reports = Report.query.filter(Report.zapped == None).all() + + +## ... source file abbreviated to get to jsonify examples ... + + + ] + + def post(self, report_id=None): + + if request.is_xhr: + ids = request.get_json()["ids"] + data = [] + + for report in Report.query.filter(Report.id.in_(ids)).all(): + if report.delete(): + data.append( + { + "id": report.id, + "type": "delete", + "reverse": False, + "reverse_name": None, + "reverse_url": None + } + ) + +~~ return jsonify( + message="{} reports deleted.".format(len(data)), + category="success", + data=data, + status=200 + ) + + report = Report.query.filter_by(id=report_id).first_or_404() + report.delete() + flash(_("Report deleted."), "success") + return redirect(url_for("management.reports")) + + +class CeleryStatus(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to access the management settings"), # noqa + level="danger", + endpoint="management.overview" + ) + ) + ] + + def get(self): + celery_inspect = celery.control.inspect() + try: + celery_running = True if celery_inspect.ping() else False + except Exception: + # catching Exception is bad, and just catching ConnectionError + # from redis is also bad because you can run celery with other + # brokers as well. + celery_running = False + +~~ return jsonify(celery_running=celery_running, status=200) + + +class ManagementOverview(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to access the management panel"), + level="danger", + endpoint="forum.index" + ) + ) + ] + + def get(self): + # user and group stats + banned_users = User.query.filter( + Group.banned == True, Group.id == User.primary_group_id + ).count() + if not current_app.config["REDIS_ENABLED"]: + online_users = User.query.filter(User.lastseen >= time_diff() + ).count() + else: + online_users = len(get_online_users()) + + +## ... source file continues with no further jsonify examples... + + +``` + + +## Example 3 from flaskSaaS +[flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate +starter project to build a software-as-a-service (SaaS) web application +in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The +boilerplate relies on many common Flask extensions such as +[Flask-WTF](https://flask-wtf.readthedocs.io/en/latest/), +[Flask-Login](https://flask-login.readthedocs.io/en/latest/), +[Flask-Admin](https://flask-admin.readthedocs.io/en/latest/), and +many others. The project is provided as open source under the +[MIT license](https://github.com/alectrocute/flaskSaaS/blob/master/LICENSE). + +[**flaskSaaS / app / views / main.py**](https://github.com/alectrocute/flaskSaaS/blob/master/app/views/main.py) + +```python +# main.py +~~from flask import render_template, jsonify +from app import app +import random + + +@app.route('/') +@app.route('/index') +def index(): + return render_template('index.html', title='Home') + + +@app.route('/map') +def map(): + return render_template('map.html', title='Map') + + +@app.route('/map/refresh', methods=['POST']) +def map_refresh(): + points = [(random.uniform(48.8434100, 48.8634100), + random.uniform(2.3388000, 2.3588000)) + for _ in range(random.randint(2, 9))] +~~ return jsonify({'points': points}) + + +@app.route('/contact') +def contact(): + return render_template('contact.html', title='Contact') + +## ... source file continues with no further jsonify examples... + + +``` + + +## Example 4 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / app.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./app.py) + +```python +# app.py +"""Sandman2 main application setup code.""" + +# Third-party imports +~~from flask import Flask, current_app, jsonify +from sqlalchemy.sql import sqltypes + +# Application imports +from sandman2.exception import ( + BadRequestException, + ForbiddenException, + NotFoundException, + NotAcceptableException, + NotImplementedException, + ConflictException, + ServerErrorException, + ServiceUnavailableException, + ) +from sandman2.service import Service +from sandman2.model import db, Model, AutomapModel +from sandman2.admin import CustomAdminView +from flask_admin import Admin +from flask_httpauth import HTTPBasicAuth + +# Augment sandman2's Model class with the Automap and Flask-SQLAlchemy model +# classes +auth = HTTPBasicAuth() + +def get_app( + + +## ... source file abbreviated to get to jsonify examples ... + + + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + app.classes = [] + db.init_app(app) + admin = Admin(app, base_template='layout.html', template_mode='bootstrap3') + _register_error_handlers(app) + if user_models: + with app.app_context(): + _register_user_models(user_models, admin, schema=schema) + elif reflect_all: + with app.app_context(): + _reflect_all(exclude_tables, admin, read_only, schema=schema) + + @app.route('/') + def index(): + """Return a list of routes to the registered classes.""" + routes = {} + for cls in app.classes: + routes[cls.__model__.__name__] = '{}{{/{}}}'.format( + cls.__model__.__url__, + cls.__model__.primary_key()) +~~ return jsonify(routes) + return app + + +def _register_error_handlers(app): + """Register error-handlers for the application. + + :param app: The application instance + """ + @app.errorhandler(BadRequestException) + @app.errorhandler(ForbiddenException) + @app.errorhandler(NotAcceptableException) + @app.errorhandler(NotFoundException) + @app.errorhandler(ConflictException) + @app.errorhandler(ServerErrorException) + @app.errorhandler(NotImplementedException) + @app.errorhandler(ServiceUnavailableException) + def handle_application_error(error): # pylint:disable=unused-variable + """Handler used to send JSON error messages rather than default HTML + ones.""" + response = jsonify(error.to_dict()) + response.status_code = error.code + return response + + + + +## ... source file continues with no further jsonify examples... + + +``` + + +## Example 5 from tedivms-flask +[tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a +base of [Flask](/flask.html) code and related projects such as +[Celery](/celery.html) which provides a template to start your own +Flask web app. The project comes baked with an admin panel, +[API authentication and authorization](/application-programming-interfaces.html), +[SQLAlchemy](/sqlalchemy.html) and many other common libraries that are +often used with Flask. + +The project's code is provided as open source under the +[BSD 2-Clause "Simplified" license](https://github.com/tedivm/tedivms-flask/blob/master/LICENSE.txt). + +[**tedivms-flask / app / views / apikeys.py**](https://github.com/tedivm/tedivms-flask/blob/master/app/views/apikeys.py) + +```python +# apikeys.py +from flask import Blueprint, redirect, render_template, current_app +~~from flask import request, url_for, flash, send_from_directory, jsonify, render_template_string +from flask_user import current_user, login_required, roles_accepted + +~~from flask import Flask, session, redirect, url_for, request, render_template, jsonify, abort +from app import db +from app.models import user_models as users +from app.utils import forms + +import time +import uuid + + +# When using a Flask app factory we must use a blueprint to avoid needing 'app' for '@apikeys_blueprint.route' +apikeys_blueprint = Blueprint('apikeys', __name__, template_folder='templates') + + +@apikeys_blueprint.route('/user/apikeys') +@roles_accepted('dev', 'admin') +def apikeys_index(): + all_keys = users.ApiKey.query.filter_by(user_id=current_user.id).all() + return render_template("apikeys/list.html", keys=all_keys) + + +@apikeys_blueprint.route('/user/create_apikey', methods=['GET', 'POST']) +@roles_accepted('dev', 'admin') +def apikeys_create(): + form = users.ApiKeyForm(request.form) + if request.method == 'POST' and form.validate(): + + +## ... source file continues with no further jsonify examples... + + +``` + diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 8c4c8d61a..56cb406f3 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -1,7 +1,7 @@ title: flask.sessions BadSignature code examples category: page slug: flask-sessions-badsignature-examples -sortorder: 500021000 +sortorder: 500021013 toc: False sidebartitle: flask.sessions BadSignature meta: Python example code for the BadSignature class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 3af446d9f..74cb210e0 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionInterface code examples category: page slug: flask-sessions-sessioninterface-examples -sortorder: 500021001 +sortorder: 500021014 toc: False sidebartitle: flask.sessions SessionInterface meta: Python example code for the SessionInterface class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index d6f1d029e..de1c432f7 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -1,7 +1,7 @@ title: flask.signals Namespace code examples category: page slug: flask-signals-namespace-examples -sortorder: 500021000 +sortorder: 500021015 toc: False sidebartitle: flask.signals Namespace meta: Python example code for the Namespace class from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 93aa415bf..638360b9e 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template code examples category: page slug: flask-templating-render-template-examples -sortorder: 500021000 +sortorder: 500021016 toc: False sidebartitle: flask.templating render_template meta: Python example code for the render_template function from the flask.templating module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 42c3c0006..23e8540e6 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -1,7 +1,7 @@ title: flask.views http_method_funcs code examples category: page slug: flask-views-http-method-funcs-examples -sortorder: 500021002 +sortorder: 500021019 toc: False sidebartitle: flask.views http_method_funcs meta: Python example code for the http_method_funcs function from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index c5f7c5b10..8beb16b29 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -1,7 +1,7 @@ title: flask.views MethodView code examples category: page slug: flask-views-methodview-examples -sortorder: 500021000 +sortorder: 500021017 toc: False sidebartitle: flask.views MethodView meta: Python example code for the MethodView class from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 2ce2ded6f..672ead42b 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -1,7 +1,7 @@ title: flask.views View code examples category: page slug: flask-views-view-examples -sortorder: 500021001 +sortorder: 500021018 toc: False sidebartitle: flask.views View meta: Python example code for the View class from the flask.views module of the Flask project. diff --git a/static/img/logos/webrtc-wide.png b/static/img/logos/webrtc-wide.png new file mode 100644 index 0000000000000000000000000000000000000000..050cc822cb00a7eb6277b28983e4112c7a3d8d5d GIT binary patch literal 14907 zcmb8WWmr_-_dX0rcXvn#(%mJkq=X_!cXy4$(4~|L(y0#JIrJbUost6#At5j{1B}2k z{;u!mdHii-eGo5Ca2)?<*aYH%T50??237_aOxy~=SRos31M zlFt@IF;=uw|Nq5FO-Sm(B%#H%n6Q^5BK3?#EsW6b?)I2r^h75vl2Ef+tV0e(zW*LZ z)Q$OByj#Rd1!ngs_FQiL7kkXXSC8^e#h`;TqyIgwVFn}7R5haw7H3uM=uRpQy#+~K z{zdzLDy5fHUg%s!QLsIx(>v@V_e04Diu7?!%@_aM zNs}o?qLW>>2plC3mki^v3Sowrd5Y`owCLv2efxIquQq9FR8zXtvZ zj5x|ptsfdF4%Q?B@Lt`HXmo0gj3SdTq|vO}$SoqZe%1WojgNNo&#n91$OO}Xy(!!Cp8~HF zAg>fy*YktaZ<_FD4WAFCumpc^VYkawa5E>8b0b`C?mDFX#%WIP0`mx`*Vu4nhAP=( zX6#@>(iC4m-O{wh(=M0B#xh;9JBu6II<+I}^liSVmF$?#MDpT~zmv7QLnhAOz7xjm zhCm=R99N`r%^RY>u+&4p1g$=K@?=Hbbpt$#*Yp(IDtalInDFR?CrvBXi%sjWL$y95 zT(iHF!dJg?Ck%KC<#&q0FL#-iXE&@u(d zNo0G7Ra*pIKTa0HS4v3$ivP&FsMIjlW}(^vsu%NUm-A8_4;3bS>Igb&@0KS2)aw{w zO;I0zOe6#--{?o8SXmJrDlD3%=*Y|BZv+q~33v01->}&Ha!7 zd|s>Z_7{fMHdPazl;S#n<>1z7H1=(dgx|Z>tOLjA)q%+u;6RiDF+6E#OCFEz`+2$W zx>~<-EXh%+voEhrtkEAAYdY8)fsAMU$Nrr#-w#743%C@e&eJta*xyv+uS&(38@+MX zILQ!cXXLQ)Hxb{?|AIi~5yFBfb>3H>pDZ2;-R+JY+-sR0>wokHJ@bjms|CsBNO4cl zaf9bJWGx^!(?jIM)t9!q(le$;BLZYSJR0fo67fNoROy5y*g_+IW86W5 zmih6&lhd_7hcb-P1$n&T^i+^tkeW{RQsHYQRBhdHmiM}dOtVV*-g>v8fEz4M`dD~@ zGU_E}SCzmwi-+_equa6Up*tnKV?BdO@qxuZE6#Z`4HT#5ad`I=nO{jPJAzipDU|C( zo}R18lDevI2a*_3|DNOKn_z$b8@940KNM^G;lggasLN9lx*3X#T)^-eAF7`|f5wRF=qY70W1*EB$KZ)rFxL;qlZ)0BXb|ibKOBe}MZ5!Vw&A2!|uB=7d6okZQAurSD zsqPbpBE@gyALt!EHi+kEUR$W}JC~{)We*;T?T4PkQaPa{0O96V$#JR;~DtO{`Z_oT}|Fl!yx( z#j#i`A{?Uo%x$(#uY+o4f*f-zGxkl2>BJ$00wKRW4pST$TRXl>e=AWl2@MYkN=E7-QaBdT1(V1)K)|QRaVA!Dk_aW*p0jw1Pyql=bYLM zntsD^EIlm)HAdI9w33U`!1Qir8rv=?MXFOZ5+GUUXWW)X_yivY<(MN}*~6YI*?Ntx zMVU@0Ab9X0S|$qy%e1)Qb~Uj;5-#IZ6|qYxF5^Nqu}dm0V`aQ68ZKit^zRh7jHUaE z=Ca8=T7KQ(U?ZG}p)G-yPDWD`x;PTE@Mp%4;%gdsre&UI%>PXnOv{XXALOg}S$Tl@=DCiGz|NFaG= zYk)cWgw4svAP(-S%pDWbC9dkSJ3ZzZV!WpdwKOpZ4sFLYnZJl~__ONqtgHCav!hEE z@5B7!z)J^249B@q0rWP$t|0r7pq`+IO-3KCQ?H~3H;IjPrl7R(22NTOD>qIx4(y1Z zHt|R`bJg;7n=X%{1E+pvGTK%V)Y{+DRdeGKtlzjGGg}ICZ{uzg&dT4y{vHi}nvr>g z`qDXv_IsX!-H+m@40ck({9jpxNbiQ_oVwXq{X9MsvhwxC9dh|624p72BqXjk{R zBrjxMH%<@-mY-*StZpln(p@-->ZE?WiK1QpYde?uv&aq=5^qTIt!(~dWed)Gfxkt9AI3Mwe&0fCEI)_!&0}Fvu>o9KnQ5Q5qaOkdp$UR-@|i5R z777fUHsK94dA`2a#SCuE%RJy!HS__*9u+TAO-O?R8l4mB9Z>S2uI9MDRvwd+Id4t4 z;H(Q&kGj=$m`4t~o{hjXw44RiPk>%~mvA!kER89*e5jSPPF#I7Fdt-B5_L}e zCKeZQIbZ%eqtCHZPfY;c-C|e2*xj_@2Q{fR{tNiIwH|l2D(~X{V8ND-VxRPf{LEwG zfLL#x3~WraJx~ojA^Q{oR5XcPk?p>I^VM*40LxBD*Hs zw4w!ltUV=PI~49 z2^p5xqiB<@lsremJdcQB!`)(%b(s+ziiXQ_>Q&8`ci$x@un=pNIKd+)nuo8fXN`i7 zmIKw)t6CPXhRu{MeBOo#o$IuvMbmkNllhed1vh1dj(5)TQ+%NE5f*SUI3gRK<1n4l zZvi~)zK*<>HCwFvSab(+ncl{k3tTejs6D1c%M_orvBnIpJPIGPb5YlYuA;o>hcj;W zLAm9uvebzKEt>t_f=-jJnWGLMCAVjZ38p{{1gA%<`14-_H)G1$p&e)^z8^OXR27q4 zdD677G$1HFMhF|$l#9D^o%$g#inTnv6KFjt2}v6lOS6^643__T$V%IL_Xab#R>OCV z&CH=xL%STramLDQb8zvV(EK+RO{R$QST(8KISCo`jvtTcMevSunD%phXjg>7k>}&= z+cBK)$AAUk&h~D%glS5lD<2Q2b;OFnFB1T65OYUC8fM0PY#RCa$InJ`$3}=f2O{{# zKTzpQH5)V&J%SCdHNFaLp6cxap{|%7Z&C{Tn-M`)5b?@p-AV7f`ftDWfV(05nelwi zVOj4pNocdEH4p6FC$T^3HrXARH{phUx{hA@Nc@e-SqOcXL>v_LKON=M4F!ACn@89YwE-&56 z^jy{fd-6_(M}(0Vfv!ufgSzfV%Lhsm^xd2xXnP|Mu8-)*{7U_?Q6Tx|a|(+*g8uiU zHUMzbGG<1ZSe@n-J_$eM~UZ z(?v;b4fx#2X?~y*0LU*W{88msakZl@t-nt5x!gP#uH+LH^HZWySl^FLOq`~j0CN6< zH?Y-0Uy#|S)n~oFdo`C#iG3$3>-abE%k;1Dr;**w67~9yQHyC&M0o!6_v@j%i7&Hn(} zc?7`=R$V{m2Ftvvw_~jeqUD}{#QgsFUvih^^S2$GnIL}p@KxQEsxg`6?r zm-0^Ds6_T7U7*a!|&)$GXO(en&?NS?J`2Tb;nI+_`&Oun@B0(f78l$=A#F^!yG!%0n|D#xZ>p zH@Jvi#rkZst6{qqW1f+&31)wV>>IFMTNOj<5SiymxU%DQPq0X9pvd{O!;k47re2jU zc;BY0PmIq=VA0(Vb7@Ki2nFlo%e0nQ2RCp8us2%X%sZ~Rs;HNRqEfJ$!~p$fFI_z} z1{B&7ZkI=W7s@UJ2N7CBc^i*v zB053{o$kuMJdkF)p8WJU;aaD?AV_Yw;gsA|oNO7Bd6I^j(;RxDD=djMJR|}*GfRnf zX;jN)9rO)Z+UW-e@q^bA2M-bXb3tf7en0mP+#ZX&mBB#})a;w0~sgF(?qoPX-Nq z+hV0~^F$Xu`(-~{$nCmEM@MG`_jIzYYp?+=xwDRBo!8~*wM^BO-A*pBk+Y9yqa#dTg`9Cp!l8HB8QaZW( zu^XP%&&=M{VqRY8&zEc|Kc|7YvT|;cQ5vPNtFUVea<$hQ7 zTM}+p*jxFsH{a-Xx%~i}!#OQjVG9bHywGK)V|A`R_{mC9YkU3BDBJmAOhcG<`R57x z=#$!PGKGV{$8c5$(;SxRd&S9=R?sqOO_3#3kpo^3m5U7%KZAtX-mF?5>UH5^BIAx& zZTG)lva-7cM~4XdC(R;c3$Q$TDMn^YhAlt%JGs@`?L8bbSm%kt&ZEzYoqZTM{WM+c z6>yO+D9H58HF+ct6X%nS4WX9MeDOjcdxSh#RI{HTW&W1~_G0PF-aAJf`+INn>cZl| zd8lDo{R)Kcr0-^X80S-33E{&KKLiK9`N62nuI4|do^buDTNP-zNUWnFE)Optlj`{X z-GRxz8Lz*aqQJaRkVUr9ZYiU|yDs5ij{T z<094#>+%FZqIGdm&Yz_|`jJSdMe#1^Em8q+5zQ)PNIBzKPm&G~zbH(e**i2y5yj;d;W8mSUuU5sNGq2|HURkuf z=Z`N&rC=24j3Nmd_7swO8`eU-f(M#PkNzi|X%Wa81uR~wIy*bd=jd0&!9!f!HA`Hb z$9`W0!pNLi`=c8}QwU2weo~tW_3g2}?#gX+<&UIszSOC{d^VVg(jXEJdgAQmT^%UA zV^ZQ^Em76P#O`B&Q%Z04K4m4kj?4X*PxJgx197*7K8=s{3O6An-i^qvJ}V`wuL1o| zE{@GyhjVisy-|5mZLV3n9wET<%buB+Vm4M-yLIRUcpP$u#WE&JM=y@3YV$5?R$BOs zgo_XrY&J3!j6Q)Z7(FFkD0#X!+m=yq=}BAL@jaRvEyZer!UY@VAAP0vbx;xKkFWB~ z{EOO;0WxVJlv~eICN?R|A8#5ETXoTiyZDolilA%T6-VE8k%&gdr>3C{9NiOtRjuLh zrm~FFY~@l9VhT)Tp=Wy5y!r7^0OJ6o`IY>uk}!&Y&c(S88>UtdXv@1GfXL$^w*farX7{ij~P$sr>n z)QB&FH*h&CA!o%y-&Zh%ArC(4Gj>mI$3*gf)9Xs^WAkTuKx1k|Dl}WyY`Y;82&jp# z^ln}gDfCVup6PZ}Kq34Arsi03uZDi@6zj~>qNK18`iK08s6g~}1vX@~83~N}+IQZ* zAVTW!3OB7>(m3v;p_%TsvS@Rg8ZJDH(Z2>hPb_>vlQelj>WrIBynI4$&vbi(kLZ2! z*cqhLj42Qb=idEm^A864T>b?Mfra44Nu!@9#Y8$)6uVUm50_f3;t(R}%x;B9=%Pry zUwS*mwFanU@Uu9k>aOS#Q5YK*HrXFUtEyV9?r8R>(o1_f#{>|EM38NW(e{EgN{VfC zncg9Eu>-_rxOee%=9B&f7inII3UoCGq*dyLF8vY}w)0i7k>`TrX%wnc>@RqKB~yuw zjE+j{_=~Ofp924(=ne$j_RP+WfcW}C|9h7&85#GHrvO^NJdEu+5zydV$`^Ewgf|Jj zoBr7T1>w*+dRV+aNG>#MjNZ9b-DnUF48Vd--CluC3K|((BRc3jl}2as0MGE{xX^30 zIHve335*Y4(DohcjoOM?k6>2q3;1ojZXepGT)Z1IGt-Rk6j`N|vM|R&zU(}@l)5Yx zjYd_=D$iAWdtnaG*OPP8-%<{7h2-HsY7wBIzAAG|x)r(0FJ(D`> z=w?Fz?;ue--0J(-;SM1wOtToHmGstGdBTo{_3Ra)L)W@Ts#ZxWK8~4&+KOAFn^~?I z+&Z~mAN<~3&s6)sBp?RM1fR>nXq1Hj(Woow@w3T`ni0~Il(0evNoyeQy%W(nFK1LQ z*5B#zUsLxMdV~w6@S`c28S_{8al%|Kaf^I1XzBIYwo_gt1xZ&hwqfwYB1SL*#gQ?Z z*M@W_n+O`Ps|T5}dZ25c2q5GZuz^=HuLwap=dHx<`Id5cf&8ke1>vma^udmQ8`xNL*m*w3crZs3NBU63hu*HHrT|kN|2-n|Sf%21C*~>f-0S?VZ0HVFoK&m* zyNs<|j6%D?uxdSNcLQ;zj0X{=S;2y_bz2MBGZ02F+U2Lt#~stJ1hKC~KQS&v`*I?L zeAkNGm*&c)ISZvQadhbtFFxtc1iuf8o1CJgKu(#n>DXrG1-_c8GZU&1C4$6P76}az z5*=B+F5{6_(%X}#?}`nU#+2Fh`-_VyYTO~~m!0ad`A|5#SZkcM{Fix4{PM!~o)3IK z4teaDxBQt2hOTakyQ@gd51biRq|z@p_>8|nio5m(hn+TN%-PS0p1c$BYFhVL_F7p%GhbOyFA zhQ$_-1ZYw{Ja`R;b-mwz5*9x#9?B&6*Otk%;EVuSo!FcRKnm4^y3Fxo;vEgnPU6n{Zz``p~Tf zgXaRN2l?Oyg>csIcTJ+fSHfKSq<_{g*tLRvw9c&5JLB|g+W(PX=XhWFT$6@))BpHZ z1~L;(wC-k=nO|R-4XK`ra&oZ^H-(Io@z#hDwm_p_X15i94sS(TjsmanI&IGi zKI)E7&@8{Tx=ml&o?{y4E`>dX7d%44jFGk8wi&-!QQbdvA9=c30Z9;--G(MyzBNb9 zsh>3^GT*2|6&qNQ@dBRL_h$G|*3_Xb?ehBZ3%u1;g;be^OL(_4m00tQS8vKp)_IW&sN0vo;xv-dym+rDgwy#hNiGTWU3=?Hvy45dooVwIkgsBmo9 z`OH>WHu%PmX1nbvJ3fcdM3KRu)DEOYwme>h^iOkg0EU(lIw_CkB=?O<{=41;I3)>r znpz75q)Dwk@(CYlj6J}Zz!I5fZSq@=MDNZhHB1@;k6c&jh>&N4q&0^(R%aW}au~Z< zyOyXLjIMY5i~wRB%Rk;MC7p-5qveyr9{4n}8c36eOLoRPCT3(g?SeH^QCXVz456&$>BiaeEH*I6LQ)P*ZFB z-lygwbka=+Gqp4a`TIBeXfL01FY3mAV+lRxz(HVk9!Diu%j4(DnnD%Bp{sV}i~ zHUSSGQ*9C?F%0?MWsOZhGM`1x0o>kD_~0eclDI`rx7Xh%(x z?3BuIU4gdJ5zS(B$RmZMcw_K_i^Hr-vZTAe(X;WjdGi!}#%W=A2x)!MY9Of<54vPtd4yzHUz_Sws1H=L zv9>i5nfqSUZ2$4S00eI`ye)C`R$q9T0J7o%WYh8AUJLyeRD&ihtNu}xqZMQ8LhI2eO^9>qTJ8$Syg#e2(n-b}1F)XOJ)SzbpfH}2hlL@Iyu*QQK}GIGeAv)lq+(oUevR@;t6LWOYkP-}vFWpsG#^;s{zLZqf?tQT zj|!dra?O`KtuHE)-Ksc&BLi}u#D=ij%$5kBh{TU5wd?`hztNfCz;1f;e>h07HAcH$zI-29(a&7wmo6lj+N<~mc)w$FWWky^KuYbC zDgp5?{afRmx?`9%hOwik$732TA9b1)aTc!xJ?ZK8okDyfp1d)uv)>w-I2Uqeiq>gt zPTG=x&iiWP8-=cWb?P?}`VnjIo2}t}-|+FqfqUJ-7DblV^122xABwt)yZq-TN{(fD zvZH}W@uSK1X%F8WL8obS=<&z(SyyVVUkV*daq1gFN@@gup{iSG)HjV)s6EGmMYkxx zG1hv%N1=(EX&fZf*3sTe;QLr4pswEi1#co}c3}L-qTkK{sVb%4YBTJpXmv>Zs7}ZR zdrMwWccPX)I87@efeEI3<{{dVQSYgy_6SKxzfKR4cGICF%$EK}7IxR)1aRGbWurg8 z0}gVU-3=0FQeItadRG?h>KojNSti{yq5K2%goy~!nEyR&7h_F}0HQ?)OH53BYo<#C zC=VT4ka{Pbub|-1d?COcq1fB2(?w(aq1r6zZedkben>nDbsBYaDEwD!LWDK0MX?t` z(Ir6bqD&=%CRE=3P5cNDe|J!7kc)ZVRFxSazXE($^{uJxQ?j#AfDajS`a`{hbeMpU z&>Gh!Q^)%;&{_TgZs?Ao#~Gn1Z+V$mrPh(v3ype#rc)IrUS;%g4;Fl=3Tes${kWc1 z=H>E6!IPkO@dmMDxzjr9x+5$wEiP_+NMp-B0B;?9EElj>*A@Yk=*^d1dZu>Q=QqU|j`G2Qm}nk3ZBC_pVqKP&B2j z`hNcipfd0Fi(T5CrjmuOLK7ysaA0ODzrTviYF7uE{*%&SR8cz6CMpqizR97ZzbjOe zN)mMXa|_`SS)_`UqCi_baA_PzGq{__yXb`jbH06fflcv{TCaB;GmSe-b?Z!waA51^ zi|HmM0Y1E7b+Kjx*kHbRHh;Z`z@Eml+ih3*aH+dzQ)%(RVoNkE2rn;Bo0@t`>Zt`2< zq+?4(IcI!EpENL$d%S3kBNNUACX(N8FCigBAMk4gz1+y~!LPK-!vPp|yB%KAmPO}9 ztDFMDfAWfCmlmYOPZ(2OHluzU@o{K`qZ=)RNvGXae%F`!5B4t$MKzPUczg2MIL@P) z(=P<}gCycR2m6D6uWy!Lck~lM3fka!=QqOQX4Ott@jE50Y!U;hmvFo*$=BUI5%NIP zvKb+!3;t7dIQzysp-yv<#WZ=%s1HupHupgBT#%4}ZF@;BUt(q`fZ0_>k?gIg!VJ1P zDV1)Y8fPKo(ZF|YFY^OYSEYxvwoaD}X#U~O$Id{QZ1FnTz{(oc2miRMovPrt6qz6L!4p*U?vX_zP0iv*lQb*Kmi3=;L2!A`Kb@kX@mQ7xDtmin%Qa&T>GW* z>X^TR5F%YcOUoB0McAZW&iTWQYt>n;pMZ3EX(;}Em{YzIi)N@e0u z?BXn*cHweGt0Km$$@%85xB^aaLoV~>`g9&nCKgb->c-|>ukY*PF4Iq<{?2lbu1eR! zU;%Bfs&NhjTc!h7wC1+fWO?CUf#QhGuWs5<#he-QA@cfpjr(x*(59xQ3$mJJT53}{ zGIXWlvaV%2$7iN9*UR2}@S&lhLGb+Ki2+X)+#$Yb6eRomYu#Yt49`v$+6IQ;`a$)- zZ^A?@6PoKVAA()rYg8!>gop)q)IiE>0ckRWu5~UiUQ3?3haKN_QS?42_%=s${Ay`$ zFM9_;`%FjFSGPX$mwX}&i334(1c&AaR4lO{ek~P-<{Yl0yFCgwRXXtEn_OLY$%9%o z`>p8)A{^M!gaE} z(_O81+Fc|$^iGa!`7V>Z=&q4GWmw4GtIr_dV&{bZkh>%;1*M3Glw%st;{Gi5^wM@h z#AMxz;G9K@rl=|kH5M$$rCTd`Y|uHB{u+@jh3@je9bWy)$Y;zB_cHC(_+{WxYf%42 zfE~`Nhwc$Q8b16vy4RoE&_NO4Uj4v`-V0X*AbPY!+a2`o=GcTTiCNB5;O0 zk6AV4qu+>JVX3OT@R%p6l#p(k@5&O+{hOsjSV|5BjT4Z(ssWGAF?fV*stiED8HLp| z@xhBGP_oz1yZUYgXtzhbXf3H!$wQ6%J@U-TX4ztf&)&!SIAz8q3Pp}&>O{j_MXLtO zr2Dhx$4}s_mWH=hsnAvT^L9T4@Y8@r3M5b>axxIWPDjy7=$pjWK!bc<_p|BKA1Bw- zqs%P@+1_Z4m|I7#W*iEjOZ5XYnm;2E8^|-rjD(ywO53g*`;rMmyXZR6K~0%;^wHtn zvgGYUYnR7tQW2<8$DDzFjrRk*8w2-jeTCe|+d^fq$@-j~C<6`f)8MRAMxK{=CLGJx z@x{Z#z6u`&SttgXXL*8kVrYrHrl(hCu|J`~x^Dvdp|_lyz>ES<+*qRDm=K^nwbkyZ zyaylrU64zU55N6ufl10mI)-y2uqd7P%C>hvd#9%+y!({K^IMML4*28an#a8?Fbk9X zFFN#v5x{H0%^~ZI<0ZKxNns;psq?Q7eXlxSa(r6+(U^JnNQ)^$h1J7EPCntlx~Q2| z?dX+uzPbhj8VKj+B&(mlm8lL~hZ|jJWo#Y2_HpR7#YV;gd;<1fB~|Vd#5Y8v%8bSF zuE0d5k5C#b-!GXS2@Q{Jb#IVR2zEvb-L3n2- z0|NuOK5Lw#oWNGKc+y;;a)insz5)i5SRuNTDMM3oPHc4goBcxw~U(A1mfS9GGDCM8BbhRuSU`> zU&Ul?%}#UB81Y49o`}{YHl}}ybG=_zTdPYDN^kC_wGr)tV@kOww_ds(1N_Zpf+g#a zt6~T1%Xeo|t}3XKySK(aUr_hn^^q??%40Dq$1ftsWp-lQEUsJU)~0EfZ z=yOQ9x{ztcqR8A`(z)hp<-w;wI_Kb-{sOMIw1lu{t_UFkM`Dj`LB^QY4H2lAPsxu^ z!s|@uE^PJ_D=~sx&MLLEC7wO=deNvSf_jPUeCSt0B1z)o<$TM5KqsEF#!-hpGKp~G z^Se5IWXsgVd2s}_11}03QIyZufK0h4njR2OWC_R^LYqOG-5d8*>pAmdr=EF58njiu;D`{SoomL)tFV+2#-^PSWBkmB=1S=k@LaDyhy`or<;aUbSZQ_hEAAb5_N3>A<) zf16%bWx1oU2sMF@5+bsZ{vFahmydx1PE1yfV--1H34w9y<3;DSyK; zdv^!kMVFUF^}I*nXI5d4=*~T%{kzr%!o$m>bR8ySduz8-N5WtW4=$jgB>7BG?NtJ( zH~%A?#b5Q(rTsY?mrGDvnhFa|}3fVC193oj>LOTh%*v>k|jkndYN$@VLK?jm)wflCt$|O#k z+Q#2qP;^Vj=RZz&Qeql?n}#u0!o?%0Q_rd|!vg&JPprm*H<*2<*pT8iR6~HJr|-Qv1*xvTfeUR-LRRzUL?;ZlC!nwP}T=j{RD+t^JIS56JUN zX6A8Bg7o6p>wX4Ad3w76Z?i!!F*%3TCwsRdgT2pcbIW@5*X9Rw{&^ytY8X21tRd>1 zv70~DQeJdOAD)nWFr3`vI96?!|2*K$vR_ugLQ^5TGDNv!)&~@pQF23PS8hEml|`U$ z?wpJq;tIYU-u{t)xVN*u-3I;SH0));I%dALH=_2l+@%*2HzDs@(u3dj@?LaxKWW8B zB;^}quMqnAlvVlq@bb*20A)soj(Wd$@+I0AYp8rG{~DT0M2(y1xZb623jJbW=)B|mj*f2>_hD+_y8dPv60=cDSX7X3!TJF?+lv~jQY{^s%GV8l<2 ziTPH3B2~~c&qa+PguG{5kFvJi z^3rXneFcaz#v)BCEcE5}XU@ZnZpYau*`-3}w>Wt>Jc|Elvg83f0zOQG0bsh3B1OG? z=>x@{?1f7FFaFWk7yf7;|3lQHHj zC)Sbwc=pSNKfT8SE0h(K$6DCS&V5rtKn)UsbffrLS609q-Yr6aGXd7u&(9-oR$88T z?xBn2^d$Wh*W?rnf@|)1H#@rO%i)9&+o^fuXyfgS#|=VfW3xL6QjsRfoolFISI(f< zEY_6H)4@_BhRpva)wJo>fPLI0SXNie%g$5a<#omDsXOWTiis`s7?=UPW^dIVJp}cC zGi^77#~@oyW6a4A!Xvh9@nYX=mYG1RGVRVo-liUsK1%tK!~ec|`UCaM#rB+3YdlJlq5e$9#h8(KS~fltOf(!~j7ey0EwF8jIH zs}&$eT|sFbLwuy%n=rvMD)8UpZIMXC)QHJ5Wn)Yt=0_+(W6a>(Mw{F!*1z-pnlFFt z^Ob1}_z@qD7FV3Vr031-`)@4H7US=JUHLvvW)5MNJ;NehE+KvA#G5PKX1)X6-N=_; zu9w8>grh3-qir3WU!?K;Puv*>d@^oa4=2x?&xSDAD##dfAzQqt>kD2fZ2wjMZ4F;o zKha@f^)mfGBxsEEzX`os@}A6n0+6mj$g&A^k|FAr(iqcT568lBB1&k`5$89Bct{o^{ze&r*>}()gt86PV@@ zLdH#=eJPK4$RdOcUPKY;8C;{YKwwTJT#G^u%bU=<{Lfz=`nCPeSH7oxRIO^Sz7lE% zbU&(~T&OymOMT9a!%1~y>R5xG%ln^%|EJ6L>j$zjEEd~lTeU>=P$

Flask: -Extensions, Plug-ins and Related Libraries & +Extensions,Plug-ins and Related Libraries & Example Projects and Code

flask.blueprints @@ -26,6 +26,9 @@

flask.helpers make_response, url_for

+

flask.json + jsonify +

flask.sessions BadSignature, SessionInterface From bd78ee502e18e58b47435e3fa92946a503442ebc Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 14 Jun 2020 13:06:29 -0400 Subject: [PATCH 121/302] reorganize main landing page --- theme/templates/index-sidebar.html | 12 +----------- theme/templates/index.html | 10 ++++++++-- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/theme/templates/index-sidebar.html b/theme/templates/index-sidebar.html index ee2e71e2d..6949b0fe9 100644 --- a/theme/templates/index-sidebar.html +++ b/theme/templates/index-sidebar.html @@ -1,14 +1,4 @@
-
-

{% for p in pages|sort(attribute='sortorder') %}{% if page and p.slug == page.slug %}{{ p.title }}{% endif %}{% endfor %}{% if not page %}Full Stack Python{% endif %}

-
- Full Stack Python is an open book that explains - concepts in plain language. - -
-
{% include "sponsor/sentry.html" %} + {% include "sponsor/carbon.html" %}
diff --git a/theme/templates/index.html b/theme/templates/index.html index 6272d17ef..0e72b1d22 100644 --- a/theme/templates/index.html +++ b/theme/templates/index.html @@ -5,7 +5,7 @@ {% endblock %} -{% block css %}{% endblock %} +{% block css %}{% endblock %} {% block banner %} {% endblock %} @@ -30,7 +30,13 @@

Build, Deploy and Operate Python Applications

need to create, deploy and operate Python-powered applications.

-

This guide branches out on topic because your learning +

Full Stack Python is an + open source book + that explains technical concepts in plain language. + Read everything online for free or purchase the + Supporter's Edition + for nicely-formatted ebook (PDF, EPUB, MOBI) versions. + This guide branches out on topic because your learning requirements depend on what you're working on. Choose a topic from the links below or view the full table of contents From 34864d731e370808a5fbdf0ea7b1ce52e3258c11 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 14 Jun 2020 14:32:46 -0400 Subject: [PATCH 122/302] tweaking sqlalchemy example code page --- .../sqlalchemy-example-projects-code.markdown | 12 +++--------- .../sqlalchemy.html | 14 ++++++++++++++ theme/templates/page.html | 4 ++++ 3 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 theme/templates/examples-extensions-descriptions/sqlalchemy.html diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown index 4d0bac8e3..1bb2e1259 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown @@ -7,15 +7,9 @@ sidebartitle: SQLAlchemy Example Code meta: Python example projects and code that show how to use the SQLAlchemy object-relational mapper (ORM). -[SQLAlchemy](/sqlalchemy.html) is a Python library for interacting -with [databases](/databases.html) either through SQL or with an -[object-relational mapper (ORM)](/object-relational-mappers-orms.html). - -SQLAlchemy logo. - -This page describes projects that use SQLAlchemy to accomplish some -goal, such as data analysis, running a web application's back end, -or providing a [web API](/application-programming-interfaces.html). +## Example Open Source Projects +The following open source projects can serve as example code for you as +you build your own applications with SQLAlchemy. ### sandman2 diff --git a/theme/templates/examples-extensions-descriptions/sqlalchemy.html b/theme/templates/examples-extensions-descriptions/sqlalchemy.html new file mode 100644 index 000000000..dca33b44d --- /dev/null +++ b/theme/templates/examples-extensions-descriptions/sqlalchemy.html @@ -0,0 +1,14 @@ +SQLAlchemy +is a well-regarded database toolkit and +object-relational mapper (ORM) +implementation written in Python. SQLAlchemy provides a generalized +interface for creating and executing database-agnostic code without +needing to write SQL statements. + +SQLAlchemy logo. + + +

Code Examples Sorted by SQLAlchemy Package

+

Specific examples are shown on the following individual pages, +organized by classes and functions provided by SQLAlchemy, that are typically +used when building your own applications.

diff --git a/theme/templates/page.html b/theme/templates/page.html index 959d8d48b..0bd68a25f 100644 --- a/theme/templates/page.html +++ b/theme/templates/page.html @@ -55,6 +55,10 @@

{{ page.title }}

{% include "examples-extensions-descriptions/flask.html" %} {% include "code-examples/flask.html" %} {% endif %} + {% if page.slug == "sqlalchemy-code-examples" %} + {% include "examples-extensions-descriptions/sqlalchemy.html" %} + {% include "code-examples/sqlalchemy.html" %} + {% endif %} {% if page.slug == "pandas-code-examples" %} {% include "examples-extensions-descriptions/pandas.html" %} {% endif %} From e42cf147ba166481cca228c89358eb04e9644951 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 15 Jun 2020 07:00:10 -0400 Subject: [PATCH 123/302] add new numpy resource --- content/pages/03-data/17-scipy-numpy.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/pages/03-data/17-scipy-numpy.markdown b/content/pages/03-data/17-scipy-numpy.markdown index b74612684..02e399b76 100644 --- a/content/pages/03-data/17-scipy-numpy.markdown +++ b/content/pages/03-data/17-scipy-numpy.markdown @@ -67,6 +67,9 @@ following resources are broader walkthroughs for the SciPy ecosystem: computation and how to perform operations that get the results you need for your data analysis. +* [Math to Code](https://mathtocode.com/) provides an interactive + tutorial to learn how to implement math in NumPy. + * [101 NumPy Exercises for Data Analysis](https://www.machinelearningplus.com/101-numpy-exercises-python/) * [NumPy: creating and manipulating numerical data](http://www.scipy-lectures.org/intro/numpy/index.html) From f4937af6bb71be85b1a2087ce6b299d272962d9f Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 18 Jun 2020 15:36:07 -0400 Subject: [PATCH 124/302] tweak author bio --- .../celery-example-projects-code.markdown | 17 +++++++++++++++++ content/pages/meta/02-about-author.markdown | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 content/pages/examples/celery/celery-example-projects-code.markdown diff --git a/content/pages/examples/celery/celery-example-projects-code.markdown b/content/pages/examples/celery/celery-example-projects-code.markdown new file mode 100644 index 000000000..ba474a42f --- /dev/null +++ b/content/pages/examples/celery/celery-example-projects-code.markdown @@ -0,0 +1,17 @@ +title: Celery Example Projects and Code +category: page +slug: celery-code-examples +sortorder: 500040001 +toc: False +sidebartitle: Celery Example Code +meta: Python example projects and code for using the Celery asynchronous task queue. + + +## Example Projects with Great Example Code +The following active projects use the [Celery](/celery.html) task queue +in various ways. The code within the projects can show you how to build +your own applications. + + +### flask-celery-example + diff --git a/content/pages/meta/02-about-author.markdown b/content/pages/meta/02-about-author.markdown index 63c3d2a94..ebe7b7686 100644 --- a/content/pages/meta/02-about-author.markdown +++ b/content/pages/meta/02-about-author.markdown @@ -11,7 +11,7 @@ meta: Learn more about the author of Full Stack Python, Matt Makai. [Matt Makai](http://www.mattmakai.com/). Matt currently works in Washington, D.C. for the [Twilio Developer Network](https://www.twilio.com/blog/2014/02/introducing-developer-evangelist-matt-makai.html) -as head of the Developer Voices program. +as the Director of Developer Content. Other projects by Matt include [The Full Stack Python Guide to Deployments](https://www.deploypython.com/), From 141295ebc3057c02198a5d8aeeaef21f6ccfaef2 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 18 Jun 2020 18:10:14 -0400 Subject: [PATCH 125/302] add new data viz resource --- content/pages/03-data/18-data-visualization.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/pages/03-data/18-data-visualization.markdown b/content/pages/03-data/18-data-visualization.markdown index 2b422f694..4afed46ca 100644 --- a/content/pages/03-data/18-data-visualization.markdown +++ b/content/pages/03-data/18-data-visualization.markdown @@ -174,3 +174,9 @@ visualization and gave me ideas for what to build. * [Part 2: Presentation and Accessibility](http://onemogin.com/observability/dashboards/practitioners-guide-to-system-dashboard-design-p2.html) * [Part 3: What Charts to Use](http://onemogin.com/observability/dashboards/practitioners-guide-to-system-dashboard-design-p3.html) * [Part 4: Context Improvement](http://onemogin.com/observability/dashboards/practitioners-guide-to-system-dashboard-design-p4.html) + +* [Truncating the Y-Axis: Threat or Menace?](https://engineering.tableau.com/truncating-the-y-axis-threat-or-menace-d0bce66d4d08) + is a great in-indepth explanation of why something that seems as + straightforward as laying out the Y-Axis requires thought and + care otherwise the visualization could end up being misleading. + From 41a7209f69f244f52271cfc47411ce56d5008ecf Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 18 Jun 2020 18:12:46 -0400 Subject: [PATCH 126/302] fix broken link --- .../pages/01-introduction/10-best-python-podcasts.markdown | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/content/pages/01-introduction/10-best-python-podcasts.markdown b/content/pages/01-introduction/10-best-python-podcasts.markdown index c637c26dd..f0181a269 100644 --- a/content/pages/01-introduction/10-best-python-podcasts.markdown +++ b/content/pages/01-introduction/10-best-python-podcasts.markdown @@ -48,9 +48,8 @@ listen and learn. teaching Python programming. * Professor Philip Guo has a video podcast called - [PG Podcast](http://pgbovine.net/PG-Podcast.htm), typically on - Python subjects. - [All episodes are listed on a separate page](http://pgbovine.net/PG-Podcast-summary.htm). + [PG Podcast](https://podcasts.apple.com/us/podcast/philip-guo-podcasts-pgbovine-net/id1276072242), + which typically covers Python subjects. * [The Real Python Podcast](https://realpython.com/podcasts/rpp/) is a weekly podcast with interviews, coding tips, and conversation with guests from the Python community. From bac67060fd7266aa38518ca23b89e5e3bc7a49e0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 19 Jun 2020 03:54:26 -0400 Subject: [PATCH 127/302] tweaking a couple of broken links --- content/pages/01-introduction/03-why-use-python.markdown | 4 ++-- content/pages/01-introduction/07-companies.markdown | 2 +- content/pages/05-deployment/29-gocd.markdown | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/pages/01-introduction/03-why-use-python.markdown b/content/pages/01-introduction/03-why-use-python.markdown index 63405e70c..505585cf3 100644 --- a/content/pages/01-introduction/03-why-use-python.markdown +++ b/content/pages/01-introduction/03-why-use-python.markdown @@ -47,9 +47,9 @@ Stack Overflow's community-created question and answer data confirms the [incredible growth of the Python ecosystem](https://stackoverflow.blog/2017/09/06/incredible-growth-python/) and tries to determine [why it growing so quickly](https://stackoverflow.blog/2017/09/14/python-growing-quickly/) -with their own analysis. In the 2018 Stack Overflow developer survey the +with their own analysis. In the 2020 Stack Overflow developer survey the data indicated that -[Python was the fastest growing major programming language](https://insights.stackoverflow.com/survey/2018/#technology-programming-scripting-and-markup-languages) +[Python was the fastest growing major programming language](https://insights.stackoverflow.com/survey/2020/#technology-programming-scripting-and-markup-languages) and that there is a close alignment between the languages and tools that developers choose to learn and the usage in developers' professional work. diff --git a/content/pages/01-introduction/07-companies.markdown b/content/pages/01-introduction/07-companies.markdown index cbd58c14a..7eb7a78f2 100644 --- a/content/pages/01-introduction/07-companies.markdown +++ b/content/pages/01-introduction/07-companies.markdown @@ -145,7 +145,7 @@ like the CIA, FBI and NSA. [SEC uses Python and proposes organizations use Python to comply with regulations](http://jsdelfino.blogspot.com/2010/05/security-exchange-commission-python.html). * A quick search for government jobs that require or recommend Python - [via USAJobs](https://sec.usajobs.gov/Search/?k=python&p=1) + [via USAJobs](https://www.usajobs.gov/Search/Results?k=python) turns up numerous listings at organizations such as the Smithsonian Institution, Department of Education, Department of the Navy and National Institute of Standards and Technology (NIST). diff --git a/content/pages/05-deployment/29-gocd.markdown b/content/pages/05-deployment/29-gocd.markdown index 3a4f48e21..3bffa4e41 100644 --- a/content/pages/05-deployment/29-gocd.markdown +++ b/content/pages/05-deployment/29-gocd.markdown @@ -8,7 +8,7 @@ meta: GoCD is a continuous integration (CI) server often used to automatically b [GoCD](https://www.gocd.org/) is a -[continuous integration (CI)](/continuous-integation.html) +[continuous integration (CI)](/continuous-integration.html) server often used to automatically build, [test](/testing.html) and [deploy](/deployment.html) Python applications. From e919a9e875c2cd4ee4c58e442292b056a137f1a9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 21 Jun 2020 16:02:47 -0400 Subject: [PATCH 128/302] fixing example code inexact matches and adding new signals got request exception for flask --- .../flask/flask-blueprints-blueprint.markdown | 311 +--- .../flask/flask-cli-flaskgroup.markdown | 9 - .../flask/flask-cli-scriptinfo.markdown | 20 +- .../flask/flask-cli-with-appcontext.markdown | 536 ++----- .../flask/flask-ctx-has-app-context.markdown | 36 +- .../flask-ctx-has-request-context.markdown | 14 +- .../flask/flask-globals-current-app.markdown | 678 ++------- .../flask/flask-globals-request.markdown | 1324 +++++++++-------- .../flask/flask-globals-session.markdown | 347 +---- .../flask/flask-helpers-flash.markdown | 192 +-- .../flask-helpers-make-response.markdown | 100 +- .../flask/flask-helpers-url-for.markdown | 546 +------ .../flask/flask-json-jsonify.markdown | 330 ++-- .../flask-sessions-badsignature.markdown | 144 +- .../flask-sessions-sessioninterface.markdown | 22 +- ...ask-signals-got-request-exception.markdown | 126 ++ .../flask/flask-signals-namespace.markdown | 31 +- .../flask-templating-render-template.markdown | 205 +-- .../flask-views-http-method-funcs.markdown | 36 +- .../flask/flask-views-methodview.markdown | 88 +- .../examples/flask/flask-views-view.markdown | 14 +- theme/templates/code-examples/flask.html | 3 +- 22 files changed, 1742 insertions(+), 3370 deletions(-) create mode 100644 content/pages/examples/flask/flask-signals-got-request-exception.markdown diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 756d15458..3d35a04a7 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -53,15 +53,20 @@ log = logging.getLogger(__name__) def dynamic_class_import(class_path): - """ - Will dynamically import a class from a string path - :param class_path: string with class path + try: + tmp = class_path.split(".") + module_path = ".".join(tmp[0:-1]) ## ... source file abbreviated to get to Blueprint examples ... - """ + @property + def app_theme(self): + return self.get_app.config["APP_THEME"] + + @property + def app_icon(self): return self.get_app.config["APP_ICON"] @property @@ -70,11 +75,6 @@ def dynamic_class_import(class_path): @property def version(self): - """ - Get the current F.A.B. version - - :return: String with the current F.A.B. version - """ return __version__ def _add_global_filters(self): @@ -92,9 +92,6 @@ def dynamic_class_import(class_path): self.get_app.register_blueprint(bp) def _add_admin_views(self): - """ - Registers indexview, utilview (back function), babel views and Security views. - """ self.indexview = self._check_and_init(self.indexview) self.add_view_no_menu(self.indexview) self.add_view_no_menu(UtilView()) @@ -104,13 +101,15 @@ def dynamic_class_import(class_path): self.menuapi_manager.register_views() def _add_addon_views(self): - """ - Registers declared addon's + for addon in self._addon_managers: + addon_class = dynamic_class_import(addon) + if addon_class: + addon_class = addon_class(self) + try: ## ... source file continues with no further Blueprint examples... - ``` @@ -128,17 +127,6 @@ FlaskBB is provided as open source ```python # views.py -# -*- coding: utf-8 -*- -""" - flaskbb.auth.views - ------------------ - - This view provides user authentication, registration and a view for - resetting the password of a user if he has lost his password - - :copyright: (c) 2014 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" import logging from datetime import datetime @@ -195,16 +183,12 @@ def flaskbb_load_blueprints(app): ~~ auth = Blueprint("auth", __name__) def login_rate_limit(): - """Dynamically load the rate limiting config from the database.""" - # [count] [per|/] [n (optional)] [second|minute|hour|day|month|year] return "{count}/{timeout}minutes".format( count=flaskbb_config["AUTH_REQUESTS"], timeout=flaskbb_config["AUTH_TIMEOUT"] ) def login_rate_limit_message(): - """Display the amount of time left until the user can access the requested - resource again.""" current_limit = getattr(g, 'view_rate_limit', None) if current_limit is not None: window_stats = limiter.limiter.get_window_stats(*current_limit) @@ -214,13 +198,16 @@ def flaskbb_load_blueprints(app): @auth.before_request def check_rate_limiting(): - """Check the the rate limits for each request for this blueprint.""" if not flaskbb_config["AUTH_RATELIMIT_ENABLED"]: return None + return limiter.check() + @auth.errorhandler(429) + def login_rate_limit_error(error): + return render_template( -## ... source file continues with no further Blueprint examples... +## ... source file continues with no further Blueprint examples... ``` @@ -264,8 +251,8 @@ def about(): 'main/about.html', editable_html_obj=editable_html_obj) -## ... source file continues with no further Blueprint examples... +## ... source file continues with no further Blueprint examples... ``` @@ -299,7 +286,6 @@ from flask_debugtoolbar.toolbar import DebugToolbar from flask_debugtoolbar.utils import decode_text try: - # Python 3.8+ from importlib.metadata import version __version__ = version("Flask-DebugToolbar") @@ -313,10 +299,6 @@ except ImportError: def replace_insensitive(string, target, replacement): - """Similar to string.replace() but is case insensitive - Code borrowed from: - http://forums.devshed.com/python-programming-11/case-insensitive-string-replace-490921.html - """ no_case = string.lower() index = no_case.rfind(target.lower()) if index >= 0: @@ -334,101 +316,18 @@ def _printable(value): class DebugToolbarExtension(object): + _static_dir = os.path.realpath( + os.path.join(os.path.dirname(__file__), 'static')) - -## ... source file continues with no further Blueprint examples... - - -``` - - -## Example 5 from flask_jsondash -[Flask JSONDash](https://github.com/christabor/flask_jsondash) is a -configurable web application built in Flask that creates charts and -dashboards from arbitrary API endpoints. Everything for the web app -is configured in JSON. The code is provided as open source under the -[MIT license](https://github.com/christabor/flask_jsondash/blob/master/LICENSE). - -[**flask_jsondash / flask_jsondash / charts_builder.py**](https://github.com/christabor/flask_jsondash/blob/master/flask_jsondash/./charts_builder.py) - -```python -# charts_builder.py -# -*- coding: utf-8 -*- - -""" -flask_jsondash.charts_builder ------------------------------ - -The chart blueprint that houses all functionality. - -:copyright: (c) 2016 by Chris Tabor. -:license: MIT, see LICENSE for more details. -""" - -import json -import os -import uuid -from datetime import datetime as dt - -import jinja2 -~~from flask import (Blueprint, current_app, flash, redirect, render_template, - request, send_from_directory, url_for) - -from flask_jsondash import static, templates - -from flask_jsondash import db -from flask_jsondash import settings -from flask_jsondash.utils import setting -from flask_jsondash.utils import adapter -from flask_jsondash import utils -from flask_jsondash.schema import ( - validate_raw_json, InvalidSchemaError, -) - -TEMPLATE_DIR = os.path.dirname(templates.__file__) -STATIC_DIR = os.path.dirname(static.__file__) - -# Internally required libs that are also shared in `settings.py` -# for charts. These follow the same format as what is loaded in -# `get_active_assets` so that shared libraries are loaded in the same manner -# for simplicty and prevention of duplicate loading. -# Note these are just LABELS, not files. -REQUIRED_STATIC_FAMILES = ['D3'] - -~~charts = Blueprint( - 'jsondash', - __name__, - template_folder=TEMPLATE_DIR, - static_url_path=STATIC_DIR, - static_folder=STATIC_DIR, -) - - -def auth(**kwargs): - """Check if general auth functions have been specified. - - Checks for either a global auth (if authtype is None), or - an action specific auth (specified by authtype). - """ - if 'JSONDASH' not in current_app.config: - return True - if 'auth' not in current_app.config['JSONDASH']: - return True - authtype = kwargs.pop('authtype') - auth_conf = current_app.config.get('JSONDASH').get('auth') - # If the user didn't supply an auth function, assume true. - if authtype not in auth_conf: - return True - # Only perform the user-supplied check + _redirect_codes = [301, 302, 303, 304] ## ... source file continues with no further Blueprint examples... - ``` -## Example 6 from flask-restx +## Example 5 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -443,17 +342,12 @@ Flask RESTX is provided as open source under the ```python # apidoc.py -# -*- coding: utf-8 -*- from __future__ import unicode_literals ~~from flask import url_for, Blueprint, render_template ~~class Apidoc(Blueprint): - """ - Allow to know if the blueprint has already been registered - until https://github.com/mitsuhiko/flask/pull/1301 is merged - """ def __init__(self, *args, **kwargs): self.registered = False @@ -474,15 +368,18 @@ apidoc = Apidoc( @apidoc.add_app_template_global +def swagger_static(filename): + return url_for("restx_doc.static", filename=filename) -## ... source file continues with no further Blueprint examples... +## ... source file continues with no further Blueprint examples... + ``` -## Example 7 from Flask-WTF +## Example 6 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -517,152 +414,25 @@ logger = logging.getLogger(__name__) def generate_csrf(secret_key=None, token_key=None): - """Generate a CSRF token. The token is cached for a request, so multiple - calls to this function will generate the same token. - - During testing, it might be useful to access the signed token in - ``g.csrf_token`` and the raw token in ``session['csrf_token']``. - - :param secret_key: Used to securely sign the token. Default is - ``WTF_CSRF_SECRET_KEY`` or ``SECRET_KEY``. - :param token_key: Key where token is stored in session for comparison. - Default is ``WTF_CSRF_FIELD_NAME`` or ``'csrf_token'``. - """ - - -## ... source file abbreviated to get to Blueprint examples ... - - - - good_referrer = 'https://{0}/'.format(request.host) - - if not same_origin(request.referrer, good_referrer): - self._error_response('The referrer does not match the host.') - - g.csrf_valid = True # mark this request as CSRF valid - - def exempt(self, view): - """Mark a view or blueprint to be excluded from CSRF protection. - - :: - - @app.route('/some-view', methods=['POST']) - @csrf.exempt - def some_view(): - ... - - :: - -~~ bp = Blueprint(...) - csrf.exempt(bp) - - """ - -~~ if isinstance(view, Blueprint): - self._exempt_blueprints.add(view.name) - return view - if isinstance(view, string_types): - view_location = view - else: - view_location = '.'.join((view.__module__, view.__name__)) + secret_key = _get_config( + secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, + message='A secret key is required to use CSRF.' + ) + field_name = _get_config( + token_key, 'WTF_CSRF_FIELD_NAME', 'csrf_token', + message='A field name is required to use CSRF.' + ) - self._exempt_views.add(view_location) - return view - - def _error_response(self, reason): - raise CSRFError(reason) - - def error_handler(self, view): - """Register a function that will generate the response for CSRF errors. - - .. deprecated:: 0.14 - Use the standard Flask error system with - ``@app.errorhandler(CSRFError)`` instead. This will be removed in - version 1.0. - - The function will be passed one argument, ``reason``. By default it - will raise a :class:`-flask_wtf.csrf.CSRFError`. :: - - -## ... source file continues with no further Blueprint examples... - - -``` - - -## Example 8 from flaskSaaS -[flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate -starter project to build a software-as-a-service (SaaS) web application -in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The -boilerplate relies on many common Flask extensions such as -[Flask-WTF](https://flask-wtf.readthedocs.io/en/latest/), -[Flask-Login](https://flask-login.readthedocs.io/en/latest/), -[Flask-Admin](https://flask-admin.readthedocs.io/en/latest/), and -many others. The project is provided as open source under the -[MIT license](https://github.com/alectrocute/flaskSaaS/blob/master/LICENSE). - -[**flaskSaaS / app / views / user.py**](https://github.com/alectrocute/flaskSaaS/blob/master/app/views/user.py) - -```python -# user.py -~~from flask import (Blueprint, render_template, redirect, request, url_for, - abort, flash) -from flask.ext.login import login_user, logout_user, login_required, current_user -from itsdangerous import URLSafeTimedSerializer -from app import app, models, db -from app.forms import user as user_forms -from app.toolbox import email -# Setup Stripe integration -import stripe -import json -from json import dumps - -stripe_keys = { - 'secret_key': "sk_test_GvpPOs0XFxeP0fQiWMmk6HYe", - 'publishable_key': "pk_test_UU62FhsIB6457uPiUX6mJS5x" -} - -stripe.api_key = stripe_keys['secret_key'] - -# Serializer for generating random tokens -ts = URLSafeTimedSerializer(app.config['SECRET_KEY']) - -# Create a user blueprint -~~userbp = Blueprint('userbp', __name__, url_prefix='/user') - - -@userbp.route('/signup', methods=['GET', 'POST']) -def signup(): - form = user_forms.SignUp() - if form.validate_on_submit(): - # Create a user who hasn't validated his email address - user = models.User( - first_name=form.first_name.data, - last_name=form.last_name.data, - phone=form.phone.data, - email=form.email.data, - confirmation=False, - password=form.password.data, - ) - # Insert the user in the database - db.session.add(user) - db.session.commit() - # Subject of the confirmation email - subject = 'Please confirm your email address.' - # Generate a random token - token = ts.dumps(user.email, salt='email-confirm-key') - # Build a confirm link with token - confirmUrl = url_for('userbp.confirm', token=token, _external=True) + if field_name not in g: ## ... source file continues with no further Blueprint examples... - ``` -## Example 9 from tedivms-flask +## Example 7 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -703,15 +473,14 @@ def is_hidden_field_filter(field): @jinja_extensions_blueprint.app_template_filter() @evalcontextfilter def nl2br(eval_ctx, value): - """Converts newlines into

and
s.""" normalized_value = re.sub(r'\r\n|\r|\n', '\n', value) # normalize newlines html_value = normalized_value.replace('\n', '\n
\n') if eval_ctx.autoescape: return Markup(html_value) + return html_value ## ... source file continues with no further Blueprint examples... - ``` diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index b3705a23b..83d9b0766 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -24,14 +24,6 @@ FlaskBB is provided as open source ```python # main.py - flaskbb.cli.commands - -------------------- - - This module contains the main commands. - - :copyright: (c) 2016 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" import binascii import logging import os @@ -96,6 +88,5 @@ click_log.basic_config(logger) ## ... source file continues with no further FlaskGroup examples... - ``` diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index c7af1e6dd..7a2103213 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -24,14 +24,6 @@ FlaskBB is provided as open source ```python # main.py - flaskbb.cli.commands - -------------------- - - This module contains the main commands. - - :copyright: (c) 2016 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" import binascii import logging import os @@ -106,14 +98,11 @@ def make_app(script_info): def set_config(ctx, param, value): - """This will pass the config file to the create_app function.""" ~~ ctx.ensure_object(ScriptInfo).config_file = value def set_instance(ctx, param, value): - """This will pass the instance path on the script info which can then - be used in 'make_app'.""" - ctx.ensure_object(ScriptInfo).instance_path = value +~~ ctx.ensure_object(ScriptInfo).instance_path = value @click.group(cls=FlaskBBGroup, create_app=make_app, add_version_option=False, @@ -132,10 +121,15 @@ def set_instance(ctx, param, value): is_flag=True, is_eager=True, help="Show the FlaskBB version.") @click.pass_context @click_log.simple_verbosity_option(logger) +def flaskbb(ctx): + if ctx.invoked_subcommand is None: + click.echo(ctx.get_help()) -## ... source file continues with no further ScriptInfo examples... +flaskbb.add_command(alembic_click, "db") +## ... source file continues with no further ScriptInfo examples... + ``` diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index 68ac1d61f..235174a36 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -10,455 +10,199 @@ meta: Python example code for the with_appcontext function from the flask.cli mo with_appcontext is a function within the flask.cli module of the Flask project. -## Example 1 from Flask AppBuilder -[Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) -([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) -and -[example apps](https://github.com/dpgaspar/Flask-AppBuilder/tree/master/examples)) -is a web application generator that uses Flask to automatically create -the code for database-driven applications based on parameters set -by the user. The generated applications include default security settings, -forms, and internationalization support. +## Example 1 from FlaskBB +[FlaskBB](https://github.com/flaskbb/flaskbb) +([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based +forum web application. The web app allows users to chat in an open +message board or send private messages in plain text or +[Markdown](/markdown.html). -Flask App Builder is provided under the -[BSD 3-Clause "New" or "Revised" license](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/LICENSE). +FlaskBB is provided as open source +[under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). -[**Flask AppBuilder / flask_appbuilder / cli.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/./cli.py) +[**FlaskBB / flaskbb / cli / main.py**](https://github.com/flaskbb/flaskbb/blob/master/flaskbb/cli/main.py) ```python -# cli.py -from io import BytesIO +# main.py +import binascii +import logging import os -import shutil -from urllib.request import urlopen -from zipfile import ZipFile +import sys +import time +import traceback +from datetime import datetime import click +import click_log +from celery.bin.celery import CeleryCommand from flask import current_app -~~from flask.cli import with_appcontext - -from .const import AUTH_DB, AUTH_LDAP, AUTH_OAUTH, AUTH_OID, AUTH_REMOTE_USER +~~from flask.cli import FlaskGroup, ScriptInfo, with_appcontext +from flask_alembic import alembic_click +from jinja2 import Environment, FileSystemLoader +from sqlalchemy_utils.functions import database_exists +from werkzeug.utils import import_string +from flaskbb import create_app +from flaskbb.cli.utils import (EmailType, FlaskBBCLIError, get_version, + prompt_config_path, prompt_save_user, + write_config) +from flaskbb.extensions import alembic, celery, db, whooshee +from flaskbb.utils.populate import (create_default_groups, + create_default_settings, create_latest_db, + create_test_data, create_welcome_forum, + insert_bulk_data, run_plugin_migrations, + update_settings_from_fixture) +from flaskbb.utils.translations import compile_translations -SQLA_REPO_URL = ( - "https://github.com/dpgaspar/Flask-AppBuilder-Skeleton/archive/master.zip" -) -MONGOENGIE_REPO_URL = ( - "https://github.com/dpgaspar/Flask-AppBuilder-Skeleton-me/archive/master.zip" -) -ADDON_REPO_URL = ( - "https://github.com/dpgaspar/Flask-AppBuilder-Skeleton-AddOn/archive/master.zip" -) +logger = logging.getLogger(__name__) +click_log.basic_config(logger) -def echo_header(title): - click.echo(click.style(title, fg="green")) - click.echo(click.style("-" * len(title), fg="green")) - -@click.group() -def fab(): - """ FAB flask group commands""" - pass - - -@fab.command("create-admin") -@click.option("--username", default="admin", prompt="Username") -@click.option("--firstname", default="admin", prompt="User first name") -@click.option("--lastname", default="user", prompt="User last name") -@click.option("--email", default="admin@fab.org", prompt="Email") -@click.password_option() -~~@with_appcontext -def create_admin(username, firstname, lastname, email, password): - """ - Creates an admin user - """ - auth_type = { - AUTH_DB: "Database Authentications", - AUTH_OID: "OpenID Authentication", - AUTH_LDAP: "LDAP Authentication", - AUTH_REMOTE_USER: "WebServer REMOTE_USER Authentication", - AUTH_OAUTH: "OAuth Authentication", - } - click.echo( - click.style( - "Recognized {0}.".format( - auth_type.get(current_app.appbuilder.sm.auth_type, "No Auth method") - ), - fg="green", - ) - ) - user = current_app.appbuilder.sm.find_user(username=username) - if user: - click.echo(click.style(f"Error! User already exists {username}", fg="red")) - return - user = current_app.appbuilder.sm.find_user(email=email) +class FlaskBBGroup(FlaskGroup): + def __init__(self, *args, **kwargs): ## ... source file abbreviated to get to with_appcontext examples ... - return - role_admin = current_app.appbuilder.sm.find_role( - current_app.appbuilder.sm.auth_role_admin - ) - user = current_app.appbuilder.sm.add_user( - username, firstname, lastname, email, role_admin, password - ) - if user: - click.echo(click.style("Admin User {0} created.".format(username), fg="green")) - else: - click.echo(click.style("No user created an error occured", fg="red")) - - -@fab.command("create-user") -@click.option("--role", default="Public", prompt="Role") -@click.option("--username", prompt="Username") -@click.option("--firstname", prompt="User first name") -@click.option("--lastname", prompt="User last name") -@click.option("--email", prompt="Email") -@click.password_option() -~~@with_appcontext -def create_user(role, username, firstname, lastname, email, password): - """ - Create a user - """ - user = current_app.appbuilder.sm.find_user(username=username) - if user: - click.echo(click.style(f"Error! User already exists {username}", fg="red")) - return - user = current_app.appbuilder.sm.find_user(email=email) - if user: - click.echo(click.style(f"Error! User already exists {username}", fg="red")) - return - role_object = current_app.appbuilder.sm.find_role(role) - if not role_object: - click.echo(click.style(f"Error! Role not found {role}", fg="red")) - return - user = current_app.appbuilder.sm.add_user( - username, firstname, lastname, email, role_object, password - ) - if user: - click.echo(click.style("User {0} created.".format(username), fg="green")) - else: - click.echo(click.style("Error! No user created", fg="red")) - - -@fab.command("reset-password") -@click.option( - "--username", - default="admin", - prompt="The username", - help="Resets the password for a particular user.", -) -@click.password_option() -~~@with_appcontext -def reset_password(username, password): - """ - Resets a user's password - """ - user = current_app.appbuilder.sm.find_user(username=username) - if not user: - click.echo("User {0} not found.".format(username)) - else: - current_app.appbuilder.sm.reset_password(user.id, password) - click.echo(click.style("User {0} reseted.".format(username), fg="green")) - - -@fab.command("create-db") -~~@with_appcontext -def create_db(): - """ - Create all your database objects (SQLAlchemy specific). - """ - from flask_appbuilder.models.sqla import Model +@click_log.simple_verbosity_option(logger) +def flaskbb(ctx): + if ctx.invoked_subcommand is None: + click.echo(ctx.get_help()) - engine = current_app.appbuilder.get_session.get_bind(mapper=None, clause=None) - Model.metadata.create_all(engine) - click.echo(click.style("DB objects created", fg="green")) +flaskbb.add_command(alembic_click, "db") -@fab.command("version") -~~@with_appcontext -def version(): - """ - Flask-AppBuilder package version - """ - click.echo( - click.style( - "F.A.B Version: {0}.".format(current_app.appbuilder.version), - bg="blue", - fg="white", - ) - ) - - -@fab.command("security-cleanup") -~~@with_appcontext -def security_cleanup(): - """ - Cleanup unused permissions from views and roles. - """ - current_app.appbuilder.security_cleanup() - click.echo(click.style("Finished security cleanup", fg="green")) - - -@fab.command("security-converge") -@click.option( - "--dry-run", "-d", is_flag=True, help="Dry run & print state transitions." -) -~~@with_appcontext -def security_converge(dry_run=False): - """ - Converges security deletes previous_class_permission_name - """ - state_transitions = current_app.appbuilder.security_converge(dry=dry_run) - if dry_run: - click.echo(click.style("Computed security converge:", fg="green")) - click.echo(click.style("Add to Roles:", fg="green")) - for _from, _to in state_transitions["add"].items(): - click.echo(f"Where {_from} add {_to}") - click.echo(click.style("Del from Roles:", fg="green")) - for pvm in state_transitions["del_role_pvm"]: - click.echo(pvm) - click.echo(click.style("Remove views:", fg="green")) - for views in state_transitions["del_views"]: - click.echo(views) - click.echo(click.style("Remove permissions:", fg="green")) - for perms in state_transitions["del_perms"]: - click.echo(perms) - else: - click.echo(click.style("Finished security converge", fg="green")) - - -@fab.command("create-permissions") -~~@with_appcontext -def create_permissions(): - """ - Creates all permissions and add them to the ADMIN Role. - """ - current_app.appbuilder.add_permissions(update_perms=True) - click.echo(click.style("Created all permissions", fg="green")) - - -@fab.command("list-views") -~~@with_appcontext -def list_views(): - """ - List all registered views - """ - echo_header("List of registered views") - for view in current_app.appbuilder.baseviews: - click.echo( - "View:{0} | Route:{1} | Perms:{2}".format( - view.__class__.__name__, view.route_base, view.base_permissions - ) - ) - -@fab.command("list-users") +@flaskbb.command() +@click.option("--welcome", "-w", default=True, is_flag=True, + help="Disable the welcome forum.") +@click.option("--force", "-f", default=False, is_flag=True, + help="Doesn't ask for confirmation.") +@click.option("--username", "-u", help="The username of the user.") +@click.option("--email", "-e", type=EmailType(), + help="The email address of the user.") +@click.option("--password", "-p", help="The password of the user.") +@click.option("--no-plugins", "-n", default=False, is_flag=True, + help="Don't run the migrations for the default plugins.") ~~@with_appcontext -def list_users(): - """ - List all users on the database - """ - echo_header("List of users") - for user in current_app.appbuilder.sm.get_all_users(): - click.echo( - "username:{0} | email:{1} | role:{2}".format( - user.username, user.email, user.roles - ) - ) +def install(welcome, force, username, email, password, no_plugins): + click.secho("[+] Installing FlaskBB...", fg="cyan") + if database_exists(db.engine.url): + if force or click.confirm(click.style( + "Existing database found. Do you want to delete the old one and " + "create a new one?", fg="magenta") + ): + db.drop_all() + else: + sys.exit(0) + create_latest_db() -@fab.command("create-app") -@click.option( - "--name", - prompt="Your new app name", - help="Your application name, directory will have this name", -) -@click.option( - "--engine", - prompt="Your engine type, SQLAlchemy or MongoEngine", - type=click.Choice(["SQLAlchemy", "MongoEngine"]), - default="SQLAlchemy", + click.secho("[+] Creating default settings...", fg="cyan") + create_default_groups() + create_default_settings() + click.secho("[+] Creating admin user...", fg="cyan") + prompt_save_user(username, email, password, "admin") -## ... source file continues with no further with_appcontext examples... + if welcome: + click.secho("[+] Creating welcome forum...", fg="cyan") + create_welcome_forum() -``` - - -## Example 2 from FlaskBB -[FlaskBB](https://github.com/flaskbb/flaskbb) -([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based -forum web application. The web app allows users to chat in an open -message board or send private messages in plain text or -[Markdown](/markdown.html). - -FlaskBB is provided as open source -[under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). - -[**FlaskBB / flaskbb / cli / plugins.py**](https://github.com/flaskbb/flaskbb/blob/master/flaskbb/cli/plugins.py) - -```python -# plugins.py -# -*- coding: utf-8 -*- -""" - flaskbb.cli.plugins - ------------------- - - This module contains all plugin commands. - - :copyright: (c) 2016 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" -import sys -import os - -import click -from flask import current_app -~~from flask.cli import with_appcontext - -from flaskbb.extensions import db -from flaskbb.cli.main import flaskbb -from flaskbb.cli.utils import validate_plugin, get_cookiecutter -from flaskbb.plugins.models import PluginRegistry, PluginStore -from flaskbb.plugins.utils import remove_zombie_plugins_from_db - - -@flaskbb.group() -def plugins(): - """Plugins command sub group. If you want to run migrations or do some - i18n stuff checkout the corresponding command sub groups.""" - pass +## ... source file abbreviated to get to with_appcontext examples ... -@plugins.command("list") -~~@with_appcontext -def list_plugins(): - """Lists all installed plugins.""" - enabled_plugins = current_app.pluggy.list_plugin_distinfo() - if len(enabled_plugins) > 0: - click.secho("[+] Enabled Plugins:", fg="blue", bold=True) - for plugin in enabled_plugins: - p_mod = plugin[0] - p_dist = plugin[1] - click.secho("\t- {}\t({}), version {}".format( - current_app.pluggy.get_name(p_mod).title(), p_dist.key, - p_dist.version), bold=True - ) - disabled_plugins = current_app.pluggy.list_disabled_plugins() - if len(disabled_plugins) > 0: - click.secho("[+] Disabled Plugins:", fg="yellow", bold=True) - for plugin in disabled_plugins: - p_mod = plugin[0] - p_dist = plugin[1] - click.secho("\t- {}\t({}), version {}".format( - p_mod.title(), p_dist.key, - p_dist.version), bold=True ) + settings = settings.fixture + except ImportError: + raise FlaskBBCLIError("{} fixture is not available" + .format(fixture), fg="red") + + click.secho("[+] Updating fixtures...", fg="cyan") + count = update_settings_from_fixture( + fixture=settings, overwrite_group=force, overwrite_setting=force + ) + click.secho("[+] {settings} settings in {groups} setting groups " + "updated.".format(groups=len(count), settings=sum( + len(settings) for settings in count.values()) + ), fg="green") -@plugins.command("enable") -@click.argument("plugin_name") +@flaskbb.command("celery", add_help_option=False, + context_settings={"ignore_unknown_options": True, + "allow_extra_args": True}) +@click.pass_context ~~@with_appcontext -def enable_plugin(plugin_name): - """Enables a plugin.""" - validate_plugin(plugin_name) - plugin = PluginRegistry.query.filter_by(name=plugin_name).first_or_404() - - if plugin.enabled: - click.secho("Plugin '{}' is already enabled.".format(plugin.name)) - - plugin.enabled = True - plugin.save() - click.secho("[+] Plugin '{}' enabled.".format(plugin.name), fg="green") +def start_celery(ctx): + CeleryCommand(celery).execute_from_commandline( + ["flaskbb celery"] + ctx.args + ) -@plugins.command("disable") -@click.argument("plugin_name") +@flaskbb.command("shell", short_help="Runs a shell in the app context.") ~~@with_appcontext -def disable_plugin(plugin_name): - """Disables a plugin.""" - validate_plugin(plugin_name) - plugin = PluginRegistry.query.filter_by(name=plugin_name).first_or_404() - - if not plugin.enabled: - click.secho("Plugin '{}' is already disabled.".format(plugin.name)) - - plugin.enabled = False - plugin.save() - click.secho("[+] Plugin '{}' disabled.".format(plugin.name), fg="green") +def shell_command(): + import code + banner = "Python %s on %s\nInstance Path: %s" % ( + sys.version, + sys.platform, + current_app.instance_path, + ) + ctx = {"db": db} + startup = os.environ.get("PYTHONSTARTUP") + if startup and os.path.isfile(startup): + with open(startup, "r") as f: + eval(compile(f.read(), startup, "exec"), ctx) -@plugins.command("install") -@click.argument("plugin_name") -@click.option("--force", "-f", default=False, is_flag=True, - help="Overwrites existing settings") -def install(plugin_name, force): - """Installs a plugin (no migrations).""" - validate_plugin(plugin_name) - plugin = PluginRegistry.query.filter_by(name=plugin_name).first_or_404() + ctx.update(current_app.make_shell_context()) - if not plugin.enabled: - click.secho("[+] Can't install disabled plugin. " + try: + import IPython + IPython.embed(banner1=banner, user_ns=ctx) + except ImportError: + code.interact(banner=banner, local=ctx) -## ... source file abbreviated to get to with_appcontext examples ... - +@flaskbb.command("urls", short_help="Show routes for the app.") +@click.option("--route", "-r", "order_by", flag_value="rule", default=True, + help="Order by route") +@click.option("--endpoint", "-e", "order_by", flag_value="endpoint", + help="Order by endpoint") +@click.option("--methods", "-m", "order_by", flag_value="methods", + help="Order by methods") +~~@with_appcontext +def list_urls(order_by): + from flask import current_app - else: - click.secho("[+] Nothing to install.", fg="green") + rules = sorted( + current_app.url_map.iter_rules(), + key=lambda rule: getattr(rule, order_by) + ) + max_rule_len = max(len(rule.rule) for rule in rules) + max_rule_len = max(max_rule_len, len("Route")) -@plugins.command("uninstall") -@click.argument("plugin_name") -def uninstall(plugin_name): - """Uninstalls a plugin (no migrations).""" - validate_plugin(plugin_name) - plugin = PluginRegistry.query.filter_by(name=plugin_name).first_or_404() + max_endpoint_len = max(len(rule.endpoint) for rule in rules) + max_endpoint_len = max(max_endpoint_len, len("Endpoint")) - if plugin.is_installed: - PluginStore.query.filter_by(plugin_id=plugin.id).delete() - db.session.commit() - click.secho("[+] Plugin has been uninstalled.", fg="green") - else: - click.secho("[+] Nothing to uninstall.", fg="green") + max_method_len = max(len(", ".join(rule.methods)) for rule in rules) + max_method_len = max(max_method_len, len("Methods")) + column_header_len = max_rule_len + max_endpoint_len + max_method_len + 4 + column_template = "{:<%s} {:<%s} {:<%s}" % ( + max_rule_len, max_endpoint_len, max_method_len + ) -@plugins.command("cleanup") -~~@with_appcontext -def cleanup(): - """Removes zombie plugins from FlaskBB. - - A zombie plugin is a plugin - which exists in the database but isn't installed in the env anymore. - """ - deleted_plugins = remove_zombie_plugins_from_db() - if len(deleted_plugins) > 0: - click.secho("[+] Removed following zombie plugins from FlaskBB: ", - fg="green", nl=False) - click.secho("{}".format(", ".join(deleted_plugins))) - else: - click.secho("[+] No zombie plugins found.", fg="green") - - -@plugins.command("new") -@click.option("--template", "-t", type=click.STRING, - default="https://github.com/sh4nks/cookiecutter-flaskbb-plugin", - help="Path to a cookiecutter template or to a valid git repo.") -@click.option("--out-dir", "-o", type=click.Path(), default=None, - help="The location for the new FlaskBB plugin.") -@click.option("--force", "-f", is_flag=True, default=False, - help="Overwrite the contents of output directory if it exists") -def new_plugin(template, out_dir, force): + click.secho(column_template.format("Route", "Endpoint", "Methods"), + fg="blue", bold=True) ## ... source file continues with no further with_appcontext examples... - ``` diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index e265fc4b1..6330688e7 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -25,7 +25,6 @@ Flask RESTX is provided as open source under the ```python # marshalling.py -# -*- coding: utf-8 -*- from __future__ import unicode_literals from collections import OrderedDict @@ -45,32 +44,32 @@ def make(cls): def marshal(data, fields, envelope=None, skip_none=False, mask=None, ordered=False): - """Takes raw data (in the form of a dict, list, object) and a dict of - fields to output and filters the data based on those fields. + out, has_wildcards = _marshal(data, fields, envelope, skip_none, mask, ordered) - :param data: the actual object(s) from which the fields are taken from - :param fields: a dict of whose keys will make up the final serialized - response output - :param envelope: optional key that will be used to envelop the serialized - response - :param bool skip_none: optional key will be used to eliminate fields - which value is None or the field's key not - exist in data - :param bool ordered: Wether or not to preserve order + if has_wildcards: + from .fields import Wildcard + + items = [] + keys = [] + for dkey, val in fields.items(): + key = dkey + if isinstance(val, dict): + value = marshal(data, val, skip_none=skip_none, ordered=ordered) + else: ## ... source file abbreviated to get to has_app_context examples ... + + return out, has_wildcards["present"] + + +class marshal_with(object): + def __init__( self, fields, envelope=None, skip_none=False, mask=None, ordered=False ): - """ - :param fields: a dict of whose keys will make up the final - serialized response output - :param envelope: optional key that will be used to envelop the serialized - response - """ self.fields = fields self.envelope = envelope self.skip_none = skip_none @@ -111,6 +110,5 @@ def marshal(data, fields, envelope=None, skip_none=False, mask=None, ordered=Fal ## ... source file continues with no further has_app_context examples... - ``` diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index 0639011f2..d4c8e9aec 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -80,7 +80,6 @@ class BabelManager(BaseManager): def get_locale(self): ~~ if has_request_context(): - # locale selector for API searches for request args for arg, value in request.args.items(): if arg == "_l_": if value in self.languages: @@ -94,8 +93,8 @@ class BabelManager(BaseManager): return session["locale"] -## ... source file continues with no further has_request_context examples... +## ... source file continues with no further has_request_context examples... ``` @@ -114,15 +113,6 @@ FlaskBB is provided as open source ```python # locals.py -# -*- coding: utf-8 -*- -""" - flaskbb.forum.locals - -------------------- - Thread local helpers for FlaskBB - - :copyright: 2017, the FlaskBB Team - :license: BSD, see license for more details -""" ~~from flask import _request_ctx_stack, has_request_context, request from werkzeug.local import LocalProxy @@ -171,8 +161,8 @@ def _get_item(model, view_arg, name): return getattr(_request_ctx_stack.top, name, None) -## ... source file continues with no further has_request_context examples... +## ... source file continues with no further has_request_context examples... ``` diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index b87216b13..709e62294 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -106,8 +106,40 @@ class MenuItem(object): "url": item.get_url(), -## ... source file continues with no further current_app examples... +## ... source file abbreviated to get to current_app examples ... + + + ) + self.find(category).childs.append(new_menu_item) + + def add_separator(self, category=""): + menu_item = self.find(category) + if menu_item: + menu_item.childs.append(MenuItem("-")) + else: + raise Exception( + "Menu separator does not have correct category {}".format(category) + ) + + +class MenuApi(BaseApi): + resource_name = "menu" + @expose("/", methods=["GET"]) + @protect(allow_browser_login=True) + @permission_name("get") + def get_menu_data(self): +~~ return self.response(200, result=current_app.appbuilder.menu.get_data()) + + +class MenuApiManager(BaseManager): + def register_views(self): + if self.appbuilder.app.config.get("FAB_ADD_MENU_API", True): + self.appbuilder.add_api(MenuApi) + + + +## ... source file continues with no further current_app examples... ``` @@ -126,17 +158,6 @@ FlaskBB is provided as open source ```python # views.py -# -*- coding: utf-8 -*- -""" - flaskbb.auth.views - ------------------ - - This view provides user authentication, registration and a view for - resetting the password of a user if he has lost his password - - :copyright: (c) 2014 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" import logging from datetime import datetime @@ -258,7 +279,6 @@ class ForgotPassword(MethodView): ## ... source file continues with no further current_app examples... - ``` @@ -357,91 +377,10 @@ class User(UserMixin, db.Model): self.password_hash = generate_password_hash(password) def verify_password(self, password): - return check_password_hash(self.password_hash, password) - - def generate_confirmation_token(self, expiration=604800): - """Generate a confirmation token to email a new user.""" - -~~ s = Serializer(current_app.config['SECRET_KEY'], expiration) - return s.dumps({'confirm': self.id}) - - def generate_email_change_token(self, new_email, expiration=3600): - """Generate an email change token to email an existing user.""" -~~ s = Serializer(current_app.config['SECRET_KEY'], expiration) - return s.dumps({'change_email': self.id, 'new_email': new_email}) - - def generate_password_reset_token(self, expiration=3600): - """ - Generate a password reset change token to email to an existing user. - """ - s = Serializer(current_app.config['SECRET_KEY'], expiration) - return s.dumps({'reset': self.id}) - - def confirm_account(self, token): - """Verify that the provided token is for this user's id.""" -~~ s = Serializer(current_app.config['SECRET_KEY']) - try: - data = s.loads(token) - except (BadSignature, SignatureExpired): - return False - if data.get('confirm') != self.id: - return False - self.confirmed = True - db.session.add(self) - db.session.commit() - return True - - def change_email(self, token): - """Verify the new email for this user.""" -~~ s = Serializer(current_app.config['SECRET_KEY']) - try: - data = s.loads(token) - except (BadSignature, SignatureExpired): - return False - if data.get('change_email') != self.id: - return False - new_email = data.get('new_email') - if new_email is None: - return False - if self.query.filter_by(email=new_email).first() is not None: - return False - self.email = new_email - db.session.add(self) - db.session.commit() - return True - - def reset_password(self, token, new_password): - """Verify the new password for this user.""" -~~ s = Serializer(current_app.config['SECRET_KEY']) - try: - data = s.loads(token) - except (BadSignature, SignatureExpired): - return False - if data.get('reset') != self.id: - return False - self.password = new_password - db.session.add(self) - db.session.commit() - return True - - @staticmethod - def generate_fake(count=100, **kwargs): - """Generate a number of fake users for testing.""" - from sqlalchemy.exc import IntegrityError - from random import seed, choice - from faker import Faker - - fake = Faker() - roles = Role.query.all() - - seed() - for i in range(count): - u = User( ## ... source file continues with no further current_app examples... - ``` @@ -474,7 +413,6 @@ from flask_debugtoolbar.toolbar import DebugToolbar from flask_debugtoolbar.utils import decode_text try: - # Python 3.8+ from importlib.metadata import version __version__ = version("Flask-DebugToolbar") @@ -488,29 +426,30 @@ module = Blueprint('debugtoolbar', __name__) def replace_insensitive(string, target, replacement): - """Similar to string.replace() but is case insensitive + no_case = string.lower() + index = no_case.rfind(target.lower()) ## ... source file abbreviated to get to current_app examples ... + app = current_app + + if req.routing_exception is not None: + app.raise_routing_exception(req) rule = req.url_rule - # if we provide automatic options for this URL and the - # request came with the OPTIONS method, reply automatically if getattr(rule, 'provide_automatic_options', False) \ and req.method == 'OPTIONS': return app.make_default_options_response() - # otherwise dispatch to the handler for that endpoint view_func = app.view_functions[rule.endpoint] view_func = self.process_view(app, view_func, req.view_args) return view_func(**req.view_args) def _show_toolbar(self): - """Return a boolean to indicate if we need to show the toolbar.""" if request.blueprint == 'debugtoolbar': return False @@ -521,7 +460,6 @@ def replace_insensitive(string, target, replacement): return True def send_static_file(self, filename): - """Send a static file from the flask-debugtoolbar static directory.""" return send_from_directory(self._static_dir, filename) def process_request(self): @@ -539,11 +477,6 @@ def replace_insensitive(string, target, replacement): panel.process_request(real_request) def process_view(self, app, view_func, view_kwargs): - - -## ... source file abbreviated to get to current_app examples ... - - real_request = request._get_current_object() try: toolbar = self.debug_toolbars[real_request] @@ -562,8 +495,6 @@ def replace_insensitive(string, target, replacement): if real_request not in self.debug_toolbars: return response - # Intercept http redirect codes and display an html page with a - # link to the target. ~~ if current_app.config['DEBUG_TB_INTERCEPT_REDIRECTS']: if response.status_code in self._redirect_codes: redirect_to = response.location @@ -578,8 +509,6 @@ def replace_insensitive(string, target, replacement): response.response = [content] response.status_code = 200 - # If the http response code is 200 then we process to add the - # toolbar to the returned html response. if not (response.status_code == 200 and response.is_sequence and response.headers['content-type'].startswith('text/html')): @@ -590,9 +519,10 @@ def replace_insensitive(string, target, replacement): no_case = response_html.lower() body_end = no_case.rfind('') + if body_end >= 0: -## ... source file continues with no further current_app examples... +## ... source file continues with no further current_app examples... ``` @@ -608,17 +538,7 @@ is configured in JSON. The code is provided as open source under the ```python # charts_builder.py -# -*- coding: utf-8 -*- - -""" -flask_jsondash.charts_builder ------------------------------ -The chart blueprint that houses all functionality. - -:copyright: (c) 2016 by Chris Tabor. -:license: MIT, see LICENSE for more details. -""" import json import os @@ -643,11 +563,6 @@ from flask_jsondash.schema import ( TEMPLATE_DIR = os.path.dirname(templates.__file__) STATIC_DIR = os.path.dirname(static.__file__) -# Internally required libs that are also shared in `settings.py` -# for charts. These follow the same format as what is loaded in -# `get_active_assets` so that shared libraries are loaded in the same manner -# for simplicty and prevention of duplicate loading. -# Note these are just LABELS, not files. REQUIRED_STATIC_FAMILES = ['D3'] charts = Blueprint( @@ -660,49 +575,26 @@ charts = Blueprint( def auth(**kwargs): - """Check if general auth functions have been specified. - - Checks for either a global auth (if authtype is None), or - an action specific auth (specified by authtype). - """ - if 'JSONDASH' not in current_app.config: +~~ if 'JSONDASH' not in current_app.config: return True ~~ if 'auth' not in current_app.config['JSONDASH']: return True authtype = kwargs.pop('authtype') ~~ auth_conf = current_app.config.get('JSONDASH').get('auth') - # If the user didn't supply an auth function, assume true. if authtype not in auth_conf: return True - # Only perform the user-supplied check - # if the authtype is actually enabled. return auth_conf[authtype](**kwargs) def metadata(key=None, exclude=[]): - """An abstraction around misc. metadata. - - This allows loose coupling for enabling and setting - metadata for each chart. - - Args: - key (None, optional): A key to look up in global config. - exclude (list, optional): A list of fields to exclude when - retrieving metadata. - - Returns: - _metadata (dict): The metadata configuration. - """ _metadata = dict() ~~ conf = current_app.config conf_metadata = conf.get('JSONDASH', {}).get('metadata') - # Also useful for getting arbitrary configuration keys. if key is not None: if key in conf_metadata: return conf_metadata[key]() else: return None - # Update all metadata values if the function exists. for k, func in conf_metadata.items(): if k in exclude: continue @@ -711,19 +603,20 @@ def metadata(key=None, exclude=[]): def local_static(chart_config, static_config): - """Convert remote cdn urls to local urls, based on user provided paths. - - The filename must be identical to the one specified in the - `settings.py` configuration. - - So, for example: - '//cdnjs.cloudflare.com/foo/bar/foo.js' - becomes + js_path = static_config.get('js_path') + css_path = static_config.get('css_path') + for family, config in chart_config.items(): + if config['js_url']: + for i, url in enumerate(config['js_url']): + url = '{}{}'.format(js_path, url.split('/')[-1]) + config['js_url'][i] = url_for('static', filename=url) + if config['css_url']: + for i, url in enumerate(config['css_url']): + url = '{}{}'.format(css_path, url.split('/')[-1]) ## ... source file continues with no further current_app examples... - ``` @@ -742,12 +635,6 @@ open sourced under the ```python # utils.py -# -*- coding: utf-8 -*- -''' - flask_login.utils - ----------------- - General utilities. -''' import hmac @@ -765,40 +652,40 @@ from .config import COOKIE_NAME, EXEMPT_METHODS from .signals import user_logged_in, user_logged_out, user_login_confirmed -#: A proxy for the current user. If no user is logged in, this will be an -#: anonymous user current_user = LocalProxy(lambda: _get_user()) def encode_cookie(payload, key=None): - ''' - This will encode a ``unicode`` value into a cookie, and sign that cookie - with the app's secret key. + return u'{0}|{1}'.format(payload, _cookie_digest(payload, key=key)) + - :param payload: The value to encode, as `unicode`. - :type payload: unicode +def decode_cookie(cookie, key=None): + try: + payload, digest = cookie.rsplit(u'|', 1) + if hasattr(digest, 'decode'): + digest = digest.decode('ascii') # pragma: no cover + except ValueError: + return - :param key: The key to use when creating the cookie digest. If not - specified, the SECRET_KEY value from app config will be used. - :type key: str - ''' + if safe_str_cmp(_cookie_digest(payload, key=key), digest): + return payload ## ... source file abbreviated to get to current_app examples ... - prevents from redirecting to external sites if request headers Host or - X-Forwarded-For are present. - :param login_view: The name of the login view. (Alternately, the actual - URL to the login view.) - :type login_view: str - :param next_url: The URL to give the login view for redirection. - :type next_url: str - :param next_field: What field to store the next URL in. (It defaults to - ``next``.) - :type next_field: str - ''' +def expand_login_view(login_view): + if login_view.startswith(('https://', 'http://', '/')): + return login_view + else: + if request.view_args is None: + return url_for(login_view) + else: + return url_for(login_view, **request.view_args) + + +def login_url(login_view, next_url=None, next_field='next'): base = expand_login_view(login_view) if next_url is None: @@ -815,36 +702,10 @@ def encode_cookie(payload, key=None): def login_fresh(): - ''' - This returns ``True`` if the current login is fresh. - ''' return session.get('_fresh', False) def login_user(user, remember=False, duration=None, force=False, fresh=True): - ''' - Logs a user in. You should pass the actual user object to this. If the - user's `is_active` property is ``False``, they will not be logged in - unless `force` is ``True``. - - This will return ``True`` if the log in attempt succeeds, and ``False`` if - it fails (i.e. because the user is inactive). - - :param user: The user object to log in. - :type user: object - :param remember: Whether to remember the user after their session expires. - Defaults to ``False``. - :type remember: bool - :param duration: The amount of time before the remember cookie expires. If - ``None`` the value set in the settings is used. Defaults to ``None``. - :type duration: :class:`datetime.timedelta` - :param force: If the user is inactive, setting this to ``True`` will log - them in regardless. Defaults to ``False``. - :type force: bool - :param fresh: setting this to ``False`` will log in the user with a session - marked as not "fresh". Defaults to ``True``. - :type fresh: bool - ''' if not force and not user.is_active: return False @@ -857,7 +718,6 @@ def login_user(user, remember=False, duration=None, force=False, fresh=True): session['_remember'] = 'set' if duration is not None: try: - # equal to timedelta.total_seconds() but works with Python 2.6 session['_remember_seconds'] = (duration.microseconds + (duration.seconds + duration.days * 24 * 3600) * @@ -867,15 +727,11 @@ def login_user(user, remember=False, duration=None, force=False, fresh=True): 'instead got: {0}'.format(duration)) ~~ current_app.login_manager._update_request_context_with_user(user) -~~ user_logged_in.send(current_app._get_current_object(), user=_get_user()) + user_logged_in.send(current_app._get_current_object(), user=_get_user()) return True def logout_user(): - ''' - Logs a user out. (You do not need to pass the actual user.) This will - also clean up the remember me cookie if it exists. - ''' user = _get_user() @@ -894,55 +750,19 @@ def logout_user(): if '_remember_seconds' in session: session.pop('_remember_seconds') -~~ user_logged_out.send(current_app._get_current_object(), user=user) + user_logged_out.send(current_app._get_current_object(), user=user) ~~ current_app.login_manager._update_request_context_with_user() return True def confirm_login(): - ''' - This sets the current session as fresh. Sessions become stale when they - are reloaded from a cookie. - ''' session['_fresh'] = True ~~ session['_id'] = current_app.login_manager._session_identifier_generator() -~~ user_login_confirmed.send(current_app._get_current_object()) + user_login_confirmed.send(current_app._get_current_object()) def login_required(func): - ''' - If you decorate a view with this, it will ensure that the current user is - logged in and authenticated before calling the actual view. (If they are - not, it calls the :attr:`LoginManager.unauthorized` callback.) For - example:: - - @app.route('/post') - @login_required - def post(): - pass - - If there are only certain times you need to require that your user is - logged in, you can do so with:: - - if not current_user.is_authenticated: -~~ return current_app.login_manager.unauthorized() - - ...which is essentially the code that this function adds to your views. - - It can be convenient to globally turn off authentication when unit testing. - To enable this, if the application configuration variable `LOGIN_DISABLED` - is set to `True`, this decorator will be ignored. - - .. Note :: - - Per `W3 guidelines for CORS preflight requests - `_, - HTTP ``OPTIONS`` requests are exempt from login checks. - - :param func: The view function to decorate. - :type func: function - ''' @wraps(func) def decorated_view(*args, **kwargs): if request.method in EXEMPT_METHODS: @@ -956,29 +776,6 @@ def login_required(func): def fresh_login_required(func): - ''' - If you decorate a view with this, it will ensure that the current user's - login is fresh - i.e. their session was not restored from a 'remember me' - cookie. Sensitive operations, like changing a password or e-mail, should - be protected with this, to impede the efforts of cookie thieves. - - If the user is not authenticated, :meth:`LoginManager.unauthorized` is - called as normal. If they are authenticated, but their session is not - fresh, it will call :meth:`LoginManager.needs_refresh` instead. (In that - case, you will need to provide a :attr:`LoginManager.refresh_view`.) - - Behaves identically to the :func:`login_required` decorator with respect - to configuration variables. - - .. Note :: - - Per `W3 guidelines for CORS preflight requests - `_, - HTTP ``OPTIONS`` requests are exempt from login checks. - - :param func: The view function to decorate. - :type func: function - ''' @wraps(func) def decorated_view(*args, **kwargs): if request.method in EXEMPT_METHODS: @@ -994,28 +791,18 @@ def fresh_login_required(func): def set_login_view(login_view, blueprint=None): - ''' - Sets the login view for the app or blueprint. If a blueprint is passed, - the login view is set for this blueprint on ``blueprint_login_views``. - - :param login_view: The user object to log in. - :type login_view: str - :param blueprint: The blueprint which this login view should be set on. - Defaults to ``None``. - :type blueprint: object - ''' - -~~ num_login_views = len(current_app.login_manager.blueprint_login_views) + + num_login_views = len(current_app.login_manager.blueprint_login_views) if blueprint is not None or num_login_views != 0: -~~ (current_app.login_manager + (current_app.login_manager .blueprint_login_views[blueprint.name]) = login_view -~~ if (current_app.login_manager.login_view is not None and + if (current_app.login_manager.login_view is not None and ~~ None not in current_app.login_manager.blueprint_login_views): -~~ (current_app.login_manager -~~ .blueprint_login_views[None]) = (current_app.login_manager + (current_app.login_manager + .blueprint_login_views[None]) = (current_app.login_manager .login_view) ~~ current_app.login_manager.login_view = None @@ -1039,8 +826,6 @@ def _cookie_digest(payload, key=None): def _get_remote_addr(): address = request.headers.get('X-Forwarded-For', request.remote_addr) if address is not None: - # An 'X-Forwarded-For' header includes a comma separated list of the - # addresses, the first address being the actual remote address. address = address.encode('utf-8').split(b',')[0].strip() return address @@ -1071,8 +856,8 @@ def _secret_key(key=None): return key -## ... source file continues with no further current_app examples... +## ... source file continues with no further current_app examples... ``` @@ -1092,7 +877,6 @@ Flask RESTX is provided as open source under the ```python # swagger.py -# -*- coding: utf-8 -*- from __future__ import unicode_literals, absolute_import import itertools @@ -1104,7 +888,6 @@ from collections import OrderedDict try: from collections.abc import Hashable except ImportError: - # TODO Remove this to drop Python2 support from collections import Hashable from six import string_types, itervalues, iteritems, iterkeys @@ -1122,7 +905,6 @@ try: except ImportError: from urllib import quote -#: Maps Flask/Werkzeug rooting types to Swagger ones PATH_TYPES = { "int": "integer", "float": "number", @@ -1131,25 +913,26 @@ PATH_TYPES = { } -#: Maps Python primitives types to Swagger ones PY_TYPES = { + int: "integer", + float: "number", ## ... source file abbreviated to get to current_app examples ... + return {"$ref": "#/definitions/{0}".format(quote(name, safe=""))} + + +def _v(value): + return value() if callable(value) else value + def extract_path(path): - """ - Transform a Flask/Werkzeug URL pattern in a Swagger one. - """ return RE_URL.sub(r"{\1}", path) def extract_path_params(path): - """ - Extract Flask-style parameters from an URL pattern as Swagger ones. - """ params = OrderedDict() for converter, arguments, variable in parse_rule(path): if not converter: @@ -1188,6 +971,8 @@ def _clean_header(header): ## ... source file abbreviated to get to current_app examples ... + } + if self.api.license: infos["license"] = {"name": _v(self.api.license)} if self.api.license_url: infos["license"]["url"] = _v(self.api.license_url) @@ -1195,7 +980,6 @@ def _clean_header(header): paths = {} tags = self.extract_tags(self.api) - # register errors responses = self.register_errors() for ns in self.api.namespaces: @@ -1207,12 +991,10 @@ def _clean_header(header): ) paths[path] = serialized - # register all models if required ~~ if current_app.config["RESTX_INCLUDE_ALL_MODELS"]: for m in self.api.models: self.register_model(m) - # merge in the top-level authorizations for ns in self.api.namespaces: if ns.authorizations: if self.api.authorizations is None: @@ -1258,16 +1040,17 @@ def _clean_header(header): tags.append(tag) by_name[tag["name"]] = tag for ns in api.namespaces: - # hide namespaces without any Resources if not ns.resources: continue - # hide namespaces with all Resources hidden from Swagger documentation if all(is_hidden(r.resource, route_doc=r.route_doc) for r in ns.resources): + continue + if ns.name not in by_name: ## ... source file abbreviated to get to current_app examples ... + for name, param in iteritems(doc["params"]): param["name"] = name if "type" not in param and "schema" not in param: param["type"] = "string" @@ -1286,7 +1069,6 @@ def _clean_header(header): params.append(param) - # Handle fields mask mask = doc.get("__mask__") ~~ if mask and current_app.config["RESTX_MASK_SWAGGER"]: param = { @@ -1303,7 +1085,6 @@ def _clean_header(header): return params def responses_for(self, doc, method): - # TODO: simplify/refactor responses/model handling responses = {} for d in doc, doc[method]: @@ -1315,11 +1096,11 @@ def _clean_header(header): model = None kwargs = {} elif len(response) == 3: + description, model, kwargs = response ## ... source file continues with no further current_app examples... - ``` @@ -1383,83 +1164,26 @@ def _make_table(db): ## ... source file abbreviated to get to current_app examples ... - return - - d.clear() - - -class _EngineDebuggingSignalEvents: - """Sets up handlers for two events that let us track the execution time of - queries.""" - - def __init__(self, engine, import_name): - self.engine = engine - self.app_package = import_name - - def register(self): - event.listen(self.engine, "before_cursor_execute", self.before_cursor_execute) - event.listen(self.engine, "after_cursor_execute", self.after_cursor_execute) - - def before_cursor_execute( - self, conn, cursor, statement, parameters, context, executemany - ): -~~ if current_app: - context._query_start_time = perf_counter() - - def after_cursor_execute( - self, conn, cursor, statement, parameters, context, executemany - ): -~~ if current_app: - try: - queries = _app_ctx_stack.top.sqlalchemy_queries - except AttributeError: - queries = _app_ctx_stack.top.sqlalchemy_queries = [] - - queries.append( - _DebugQueryTuple( - ( - statement, - parameters, - context._query_start_time, - perf_counter(), - _calling_context(self.app_package), - ) - ) - ) - - -def get_debug_queries(): - """In debug mode or testing mode, Flask-SQLAlchemy will log all the SQL - queries sent to the database. This information is available until the end - of request which makes it possible to easily ensure that the SQL generated - is the one expected on errors or in unittesting. Alternatively, you can also - enable the query recording by setting the ``'SQLALCHEMY_RECORD_QUERIES'`` - - -## ... source file abbreviated to get to current_app examples ... + state = get_state(app) + with self._engine_lock: + connector = state.connectors.get(bind) + if connector is None: + connector = self.make_connector(app, bind) + state.connectors[bind] = connector return connector.get_engine() def create_engine(self, sa_url, engine_opts): - """ - Override this method to have final say over how the SQLAlchemy engine - is created. - - In most cases, you will want to use ``'SQLALCHEMY_ENGINE_OPTIONS'`` - config variable or set ``engine_options`` for :func:`SQLAlchemy`. - """ return sqlalchemy.create_engine(sa_url, **engine_opts) def get_app(self, reference_app=None): - """Helper method that implements the logic to look up an - application.""" if reference_app is not None: return reference_app -~~ if current_app: + if current_app: ~~ return current_app._get_current_object() if self.app is not None: @@ -1472,7 +1196,6 @@ def get_debug_queries(): ) def get_tables_for_bind(self, bind=None): - """Returns a list of all tables relevant for a bind.""" result = [] for table in self.Model.metadata.tables.values(): if table.info.get("bind_key") == bind: @@ -1480,16 +1203,16 @@ def get_debug_queries(): return result def get_binds(self, app=None): - """Returns a dictionary with a table->engine mapping. - - This is suitable for use of sessionmaker(binds=db.get_binds(app)). - """ app = self.get_app(app) + binds = [None] + list(app.config.get("SQLALCHEMY_BINDS") or ()) + retval = {} + for bind in binds: + engine = self.get_engine(app, bind) + tables = self.get_tables_for_bind(bind) ## ... source file continues with no further current_app examples... - ``` @@ -1528,17 +1251,6 @@ logger = logging.getLogger(__name__) def generate_csrf(secret_key=None, token_key=None): - """Generate a CSRF token. The token is cached for a request, so multiple - calls to this function will generate the same token. - - During testing, it might be useful to access the signed token in - ``g.csrf_token`` and the raw token in ``session['csrf_token']``. - - :param secret_key: Used to securely sign the token. Default is - ``WTF_CSRF_SECRET_KEY`` or ``SECRET_KEY``. - :param token_key: Key where token is stored in session for comparison. - Default is ``WTF_CSRF_FIELD_NAME`` or ``'csrf_token'``. - """ secret_key = _get_config( ~~ secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, @@ -1567,23 +1279,6 @@ def generate_csrf(secret_key=None, token_key=None): def validate_csrf(data, secret_key=None, time_limit=None, token_key=None): - """Check if the given data is a valid CSRF token. This compares the given - signed token to the one stored in the session. - - :param data: The signed CSRF token to be checked. - :param secret_key: Used to securely sign the token. Default is - ``WTF_CSRF_SECRET_KEY`` or ``SECRET_KEY``. - :param time_limit: Number of seconds that the token is valid. Default is - ``WTF_CSRF_TIME_LIMIT`` or 3600 seconds (60 minutes). - :param token_key: Key where token is stored in session for comparison. - Default is ``WTF_CSRF_FIELD_NAME`` or ``'csrf_token'``. - - :raises ValidationError: Contains the reason that validation failed. - - .. versionchanged:: 0.14 - Raises ``ValidationError`` with a specific error message rather than - returning ``True`` or ``False``. - """ secret_key = _get_config( ~~ secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, @@ -1612,10 +1307,6 @@ def validate_csrf(data, secret_key=None, time_limit=None, token_key=None): except BadData: raise ValidationError('The CSRF token is invalid.') - -## ... source file abbreviated to get to current_app examples ... - - if not safe_str_cmp(session[field_name], token): raise ValidationError('The CSRF tokens do not match.') @@ -1624,16 +1315,6 @@ def _get_config( value, config_name, default=None, required=True, message='CSRF is not configured.' ): - """Find config value based on provided value, Flask config, and default - value. - - :param value: already provided config value - :param config_name: Flask ``config`` key - :param default: default value if not provided or configured - :param required: whether the value must not be ``None`` - :param message: error message if required config is not found - :raises KeyError: if required config is not found - """ if value is None: ~~ value = current_app.config.get(config_name, default) @@ -1657,15 +1338,16 @@ class _FlaskFormCSRF(CSRF): def validate_csrf_token(self, form, field): if g.get('csrf_valid', False): - # already validated by CSRFProtect return try: + validate_csrf( ## ... source file abbreviated to get to current_app examples ... + return if request.method not in app.config['WTF_CSRF_METHODS']: return @@ -1685,14 +1367,12 @@ class _FlaskFormCSRF(CSRF): self.protect() def _get_csrf_token(self): - # find the token in the form data ~~ field_name = current_app.config['WTF_CSRF_FIELD_NAME'] base_token = request.form.get(field_name) if base_token: return base_token - # if the form has a prefix, the name will be {prefix}-csrf_token for key in request.form: if key.endswith(field_name): csrf_token = request.form[key] @@ -1700,7 +1380,6 @@ class _FlaskFormCSRF(CSRF): if csrf_token: return csrf_token - # find the token in the headers ~~ for header_name in current_app.config['WTF_CSRF_HEADERS']: csrf_token = request.headers.get(header_name) @@ -1731,35 +1410,23 @@ class _FlaskFormCSRF(CSRF): g.csrf_valid = True # mark this request as CSRF valid def exempt(self, view): - """Mark a view or blueprint to be excluded from CSRF protection. - - :: - - @app.route('/some-view', methods=['POST']) - @csrf.exempt - def some_view(): - ... - - :: - - bp = Blueprint(...) - csrf.exempt(bp) - - -## ... source file abbreviated to get to current_app examples ... + if isinstance(view, Blueprint): + self._exempt_blueprints.add(view.name) + return view + if isinstance(view, string_types): + view_location = view + else: + view_location = '.'.join((view.__module__, view.__name__)) - The function will be passed one argument, ``reason``. By default it - will raise a :class:`-flask_wtf.csrf.CSRFError`. :: + self._exempt_views.add(view_location) + return view - @csrf.error_handler - def csrf_error(reason): - return render_template('error.html', reason=reason) + def _error_response(self, reason): + raise CSRFError(reason) - Due to historical reasons, the function may either return a response - or raise an exception with :func:`flask.abort`. - """ + def error_handler(self, view): warnings.warn(FlaskWTFDeprecationWarning( '"@csrf.error_handler" is deprecated. Use the standard Flask ' @@ -1777,10 +1444,6 @@ class _FlaskFormCSRF(CSRF): class CsrfProtect(CSRFProtect): - """ - .. deprecated:: 0.14 - Renamed to :class:`-flask_wtf.csrf.CSRFProtect`. - """ def __init__(self, app=None): warnings.warn(FlaskWTFDeprecationWarning( @@ -1791,14 +1454,17 @@ class CsrfProtect(CSRFProtect): class CSRFError(BadRequest): - """Raise if the client sends invalid CSRF data with the request. - Generates a 400 Bad Request response with the failure reason by default. + description = 'CSRF validation failed.' -## ... source file continues with no further current_app examples... +def same_origin(current_uri, compare_uri): + current = urlparse(current_uri) + compare = urlparse(compare_uri) +## ... source file continues with no further current_app examples... + ``` @@ -1819,50 +1485,41 @@ from alembic import context from sqlalchemy import engine_from_config, pool from logging.config import fileConfig -# this is the Alembic Config object, which provides -# access to the values within the .ini file in use. config = context.config -# Interpret the config file for Python logging. -# This line sets up loggers basically. fileConfig(config.config_file_name) -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata ~~from flask import current_app ~~config.set_main_option('sqlalchemy.url', current_app.config.get('SQLALCHEMY_DATABASE_URI')) ~~target_metadata = current_app.extensions['migrate'].db.metadata -# other values from the config, defined by the needs of env.py, -# can be acquired: -# my_important_option = config.get_main_option("my_important_option") -# ... etc. def run_migrations_offline(): - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - - """ url = config.get_main_option("sqlalchemy.url") context.configure(url=url) with context.begin_transaction(): context.run_migrations() +def run_migrations_online(): + engine = engine_from_config( + config.get_section(config.config_ini_section), + prefix='sqlalchemy.', + poolclass=pool.NullPool) + connection = engine.connect() + context.configure( + connection=connection, + target_metadata=target_metadata + ) -## ... source file continues with no further current_app examples... + try: + with context.begin_transaction(): + context.run_migrations() +## ... source file continues with no further current_app examples... + ``` @@ -1886,13 +1543,10 @@ The sandman2 project is provided under the ```python # app.py -"""Sandman2 main application setup code.""" -# Third-party imports ~~from flask import Flask, current_app, jsonify from sqlalchemy.sql import sqltypes -# Application imports from sandman2.exception import ( BadRequestException, ForbiddenException, @@ -1909,32 +1563,33 @@ from sandman2.admin import CustomAdminView from flask_admin import Admin from flask_httpauth import HTTPBasicAuth -# Augment sandman2's Model class with the Automap and Flask-SQLAlchemy model -# classes auth = HTTPBasicAuth() def get_app( + database_uri, + exclude_tables=None, + user_models=None, ## ... source file abbreviated to get to current_app examples ... +def _register_error_handlers(app): + @app.errorhandler(BadRequestException) + @app.errorhandler(ForbiddenException) + @app.errorhandler(NotAcceptableException) + @app.errorhandler(NotFoundException) + @app.errorhandler(ConflictException) + @app.errorhandler(ServerErrorException) + @app.errorhandler(NotImplementedException) @app.errorhandler(ServiceUnavailableException) def handle_application_error(error): # pylint:disable=unused-variable - """Handler used to send JSON error messages rather than default HTML - ones.""" response = jsonify(error.to_dict()) response.status_code = error.code return response def register_service(cls, primary_key_type): - """Register an API service endpoint. - - :param cls: The class to register - :param str primary_key_type: The type (as a string) of the primary_key - field - """ view_func = cls.as_view(cls.__name__.lower()) # pylint: disable=no-member methods = set(cls.__model__.__methods__) # pylint: disable=no-member @@ -1960,11 +1615,6 @@ def register_service(cls, primary_key_type): def _reflect_all(exclude_tables=None, admin=None, read_only=False, schema=None): - """Register all tables in the given database as services. - - :param list exclude_tables: A list of tables to exclude from the API - service - """ AutomapModel.prepare( # pylint:disable=maybe-no-member db.engine, reflect=True, schema=schema) for cls in AutomapModel.classes: @@ -1976,15 +1626,19 @@ def _reflect_all(exclude_tables=None, admin=None, read_only=False, schema=None): def register_model(cls, admin=None): - """Register *cls* to be included in the API service - - :param cls: Class deriving from :class:`sandman2.models.Model` - """ cls.__url__ = '/{}'.format(cls.__name__.lower()) + service_class = type( + cls.__name__ + 'Service', + (Service,), + { + '__model__': cls, + }) + + cols = list(cls().__table__.primary_key.columns) -## ... source file continues with no further current_app examples... +## ... source file continues with no further current_app examples... ``` @@ -2011,7 +1665,6 @@ from functools import wraps def is_authorized_api_user(roles=False): - """Verify API Token and its owners permission to use it""" if 'API_ID' not in request.headers: return False if 'API_KEY' not in request.headers: @@ -2048,6 +1701,5 @@ def api_credentials_required(): ## ... source file continues with no further current_app examples... - ``` diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 8437a115e..38b63dcc0 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -33,10 +33,6 @@ import re class Stack(object): - """ - Stack data structure will not insert - equal sequential data - """ def __init__(self, list=None, size=5): self.size = size @@ -54,69 +50,45 @@ class Stack(object): def pop(self): if len(self.data) == 0: return None + return self.data.pop(len(self.data) - 1) - -## ... source file abbreviated to get to request examples ... - + def to_json(self): + return self.data def get_group_by_args(): - """ - Get page arguments for group by - """ - group_by = request.args.get("group_by") +~~ group_by = request.args.get("group_by") if not group_by: group_by = "" return group_by def get_page_args(): - """ - Get page arguments, returns a dictionary - { : PAGE_NUMBER } - - Arguments are passed: page_= - - """ pages = {} ~~ for arg in request.args: re_match = re.findall("page_(.*)", arg) if re_match: -~~ pages[re_match[0]] = int(request.args.get(arg)) + pages[re_match[0]] = int(request.args.get(arg)) return pages def get_page_size_args(): - """ - Get page size arguments, returns an int - { : PAGE_NUMBER } - - Arguments are passed: psize_= - - """ page_sizes = {} ~~ for arg in request.args: re_match = re.findall("psize_(.*)", arg) if re_match: -~~ page_sizes[re_match[0]] = int(request.args.get(arg)) + page_sizes[re_match[0]] = int(request.args.get(arg)) return page_sizes def get_order_args(): - """ - Get order arguments, return a dictionary - { : (ORDER_COL, ORDER_DIRECTION) } - - Arguments are passed like: _oc_=&_od_='asc'|'desc' - - """ orders = {} ~~ for arg in request.args: re_match = re.findall("_oc_(.*)", arg) if re_match: ~~ order_direction = request.args.get("_od_" + re_match[0]) if order_direction in ("asc", "desc"): -~~ orders[re_match[0]] = (request.args.get(arg), order_direction) + orders[re_match[0]] = (request.args.get(arg), order_direction) return orders @@ -130,8 +102,8 @@ def get_filter_args(filters): ) -## ... source file continues with no further request examples... +## ... source file continues with no further request examples... ``` @@ -146,107 +118,563 @@ message board or send private messages in plain text or FlaskBB is provided as open source [under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). -[**FlaskBB / flaskbb / app.py**](https://github.com/flaskbb/flaskbb/blob/master/flaskbb/./app.py) +[**FlaskBB / flaskbb / management / views.py**](https://github.com/flaskbb/flaskbb/blob/master/flaskbb/management/views.py) ```python -# app.py -# -*- coding: utf-8 -*- -""" - flaskbb.app - ----------- - - manages the app creation and configuration process - - :copyright: (c) 2014 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" +# views.py import logging -import logging.config -import os import sys -import time -import warnings -from datetime import datetime - -~~from flask import Flask, request -from flask_login import current_user -from sqlalchemy import event -from sqlalchemy.engine import Engine -from sqlalchemy.exc import OperationalError, ProgrammingError - -from flaskbb._compat import iteritems, string_types -# extensions -from flaskbb.extensions import (alembic, allows, babel, cache, celery, csrf, - db, debugtoolbar, limiter, login_manager, mail, - redis_store, themes, whooshee) -from flaskbb.plugins import spec -from flaskbb.plugins.manager import FlaskBBPluginManager -from flaskbb.plugins.models import PluginRegistry -from flaskbb.plugins.utils import remove_zombie_plugins_from_db, template_hook -# models -from flaskbb.user.models import Guest, User -# various helpers -from flaskbb.utils.helpers import (app_config_from_env, crop_title, - format_date, format_datetime, - forum_is_unread, get_alembic_locations, - get_flaskbb_config, is_online, mark_online, - render_template, time_since, time_utcnow, - topic_is_unread) -# permission checks (here they are used for the jinja filters) + +from celery import __version__ as celery_version +from flask import __version__ as flask_version +~~from flask import (Blueprint, current_app, flash, jsonify, redirect, request, + url_for) +from flask.views import MethodView +from flask_allows import Not, Permission +from flask_babelplus import gettext as _ +from flask_login import current_user, login_fresh +from pluggy import HookimplMarker + +from flaskbb import __version__ as flaskbb_version +from flaskbb.extensions import allows, celery, db +from flaskbb.forum.forms import UserSearchForm +from flaskbb.forum.models import Category, Forum, Post, Report, Topic +from flaskbb.management.forms import (AddForumForm, AddGroupForm, AddUserForm, + CategoryForm, EditForumForm, + EditGroupForm, EditUserForm) +from flaskbb.management.models import Setting, SettingsGroup +from flaskbb.plugins.models import PluginRegistry, PluginStore +from flaskbb.plugins.utils import validate_plugin +from flaskbb.user.models import Group, Guest, User +from flaskbb.utils.forms import populate_settings_dict, populate_settings_form +from flaskbb.utils.helpers import (get_online_users, register_view, + render_template, time_diff, time_utcnow, + FlashAndRedirect) +from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin, + IsAtleastModerator, ## ... source file abbreviated to get to request examples ... + all_groups=all_groups, + all_plugins=all_plugins, + active_nav=active_nav + ) -def configure_before_handlers(app): - """Configures the before request handlers.""" - @app.before_request - def update_lastseen(): - """Updates `lastseen` before every reguest if the user is - authenticated.""" - if current_user.is_authenticated: - current_user.lastseen = time_utcnow() - db.session.add(current_user) - db.session.commit() +class ManageUsers(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to manage users"), + level="danger", + endpoint="management.overview" + ) + ) + ] + form = UserSearchForm - if app.config["REDIS_ENABLED"]: + def get(self): +~~ page = request.args.get('page', 1, type=int) + form = self.form() - @app.before_request - def mark_current_user_online(): - if current_user.is_authenticated: - mark_online(current_user.username) - else: -~~ mark_online(request.remote_addr, guest=True) + users = User.query.order_by(User.id.asc()).paginate( + page, flaskbb_config['USERS_PER_PAGE'], False + ) - app.pluggy.hook.flaskbb_request_processors(app=app) + return render_template( + 'management/users.html', users=users, search_form=form + ) + def post(self): +~~ page = request.args.get('page', 1, type=int) + form = self.form() + + if form.validate(): + users = form.get_results().\ + paginate(page, flaskbb_config['USERS_PER_PAGE'], False) + return render_template( + 'management/users.html', users=users, search_form=form + ) -def configure_errorhandlers(app): - """Configures the error handlers.""" + users = User.query.order_by(User.id.asc()).paginate( + page, flaskbb_config['USERS_PER_PAGE'], False + ) - @app.errorhandler(403) - def forbidden_page(error): - return render_template("errors/forbidden_page.html"), 403 + return render_template( + 'management/users.html', users=users, search_form=form + ) - @app.errorhandler(404) - def page_not_found(error): - return render_template("errors/page_not_found.html"), 404 - @app.errorhandler(500) - def server_error_page(error): - return render_template("errors/server_error.html"), 500 +class EditUser(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, CanEditUser, + on_fail=FlashAndRedirect( + message=_("You are not allowed to manage users"), - app.pluggy.hook.flaskbb_errorhandlers(app=app) +## ... source file abbreviated to get to request examples ... -def configure_migrations(app): - """Configure migrations.""" + return redirect(url_for('management.edit_user', user_id=user.id)) -## ... source file continues with no further request examples... + return render_template( + 'management/user_form.html', form=form, title=_('Edit User') + ) + + +class DeleteUser(MethodView): + decorators = [ + allows.requires( + IsAdmin, + on_fail=FlashAndRedirect( + message=_("You are not allowed to manage users"), + level="danger", + endpoint="management.overview" + ) + ) + ] + + def post(self, user_id=None): +~~ if request.is_xhr: +~~ ids = request.get_json()["ids"] + + data = [] + for user in User.query.filter(User.id.in_(ids)).all(): + if current_user.id == user.id: + continue + + if user.delete(): + data.append( + { + "id": user.id, + "type": "delete", + "reverse": False, + "reverse_name": None, + "reverse_url": None + } + ) + + return jsonify( + message="{} users deleted.".format(len(data)), + category="success", + data=data, + status=200 + ) + + + +## ... source file abbreviated to get to request examples ... + + + + return render_template( + 'management/user_form.html', form=form, title=_('Add User') + ) + + +class BannedUsers(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to manage users"), + level="danger", + endpoint="management.overview" + ) + ) + ] + form = UserSearchForm + + def get(self): +~~ page = request.args.get('page', 1, type=int) + search_form = self.form() + + users = User.query.filter( + Group.banned == True, Group.id == User.primary_group_id + ).paginate(page, flaskbb_config['USERS_PER_PAGE'], False) + + return render_template( + 'management/banned_users.html', + users=users, + search_form=search_form + ) + + def post(self): +~~ page = request.args.get('page', 1, type=int) + search_form = self.form() + + users = User.query.filter( + Group.banned == True, Group.id == User.primary_group_id + ).paginate(page, flaskbb_config['USERS_PER_PAGE'], False) + + if search_form.validate(): + users = search_form.get_results().\ + paginate(page, flaskbb_config['USERS_PER_PAGE'], False) + + return render_template( + 'management/banned_users.html', + users=users, + search_form=search_form + ) + + return render_template( + 'management/banned_users.html', + users=users, + search_form=search_form + ) + + +class BanUser(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to manage users"), + level="danger", + endpoint="management.overview" + ) + ) + ] + + def post(self, user_id=None): + if not Permission(CanBanUser, identity=current_user): + flash( + _("You do not have the permissions to ban this user."), + "danger" + ) + return redirect(url_for("management.overview")) + +~~ if request.is_xhr: +~~ ids = request.get_json()["ids"] + + data = [] + users = User.query.filter(User.id.in_(ids)).all() + for user in users: + if (current_user.id == user.id or + Permission(IsAdmin, identity=user) and + Permission(Not(IsAdmin), current_user)): + continue + + elif user.ban(): + data.append( + { + "id": + user.id, + "type": + "ban", + "reverse": + "unban", + "reverse_name": + _("Unban"), + "reverse_url": + url_for("management.unban_user", user_id=user.id) + } + ) + + +## ... source file abbreviated to get to request examples ... + + + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to manage users"), + level="danger", + endpoint="management.overview" + ) + + ) + ] + + def post(self, user_id=None): + if not Permission(CanBanUser, identity=current_user): + flash( + _("You do not have the permissions to unban this user."), + "danger" + ) + return redirect(url_for("management.overview")) + +~~ if request.is_xhr: +~~ ids = request.get_json()["ids"] + + data = [] + for user in User.query.filter(User.id.in_(ids)).all(): + if user.unban(): + data.append( + { + "id": user.id, + "type": "unban", + "reverse": "ban", + "reverse_name": _("Ban"), + "reverse_url": url_for("management.ban_user", + user_id=user.id) + } + ) + + return jsonify( + message="{} users unbanned.".format(len(data)), + category="success", + data=data, + status=200 + ) + + user = User.query.filter_by(id=user_id).first_or_404() + + + +## ... source file abbreviated to get to request examples ... + + + else: + flash(_("Could not unban user."), "danger") + + return redirect(url_for("management.banned_users")) + + +class Groups(MethodView): + decorators = [ + allows.requires( + IsAdmin, + on_fail=FlashAndRedirect( + message=_("You are not allowed to modify groups."), + level="danger", + endpoint="management.overview" + ) + ) + ] + + def get(self): + +~~ page = request.args.get("page", 1, type=int) + + groups = Group.query.\ + order_by(Group.id.asc()).\ + paginate(page, flaskbb_config['USERS_PER_PAGE'], False) + + return render_template("management/groups.html", groups=groups) + + +class AddGroup(MethodView): + decorators = [ + allows.requires( + IsAdmin, + on_fail=FlashAndRedirect( + message=_("You are not allowed to modify groups."), + level="danger", + endpoint="management.overview" + ) + ) + ] + form = AddGroupForm + + def get(self): + return render_template( + 'management/group_form.html', + + +## ... source file abbreviated to get to request examples ... + + + return redirect(url_for('management.groups', group_id=group.id)) + + return render_template( + 'management/group_form.html', form=form, title=_('Edit Group') + ) + + +class DeleteGroup(MethodView): + decorators = [ + allows.requires( + IsAdmin, + on_fail=FlashAndRedirect( + message=_("You are not allowed to modify groups."), + level="danger", + endpoint="management.overview" + ) + ) + ] + + def post(self, group_id=None): +~~ if request.is_xhr: +~~ ids = request.get_json()["ids"] + if not (set(ids) & set(["1", "2", "3", "4", "5", "6"])): + data = [] + for group in Group.query.filter(Group.id.in_(ids)).all(): + group.delete() + data.append( + { + "id": group.id, + "type": "delete", + "reverse": False, + "reverse_name": None, + "reverse_url": None + } + ) + + return jsonify( + message="{} groups deleted.".format(len(data)), + category="success", + data=data, + status=200 + ) + return jsonify( + message=_("You cannot delete one of the standard groups."), + category="danger", + data=None, + + +## ... source file abbreviated to get to request examples ... + + + ).all() + + category.delete(involved_users) + flash(_("Category with all associated forums deleted."), "success") + return redirect(url_for("management.forums")) + + +class Reports(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to view reports."), + level="danger", + endpoint="management.overview" + ) + ) + ] + + def get(self): +~~ page = request.args.get("page", 1, type=int) + reports = Report.query.\ + order_by(Report.id.asc()).\ + paginate(page, flaskbb_config['USERS_PER_PAGE'], False) + + return render_template("management/reports.html", reports=reports) + + +class UnreadReports(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to view reports."), + level="danger", + endpoint="management.overview" + ) + ) + ] + + def get(self): +~~ page = request.args.get("page", 1, type=int) + reports = Report.query.\ + filter(Report.zapped == None).\ + order_by(Report.id.desc()).\ + paginate(page, flaskbb_config['USERS_PER_PAGE'], False) + + return render_template("management/reports.html", reports=reports) + + +class MarkReportRead(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to view reports."), + level="danger", + endpoint="management.overview" + ) + ) + ] + + def post(self, report_id=None): + +~~ if request.is_xhr: +~~ ids = request.get_json()["ids"] + data = [] + + for report in Report.query.filter(Report.id.in_(ids)).all(): + report.zapped_by = current_user.id + report.zapped = time_utcnow() + report.save() + data.append( + { + "id": report.id, + "type": "read", + "reverse": False, + "reverse_name": None, + "reverse_url": None + } + ) + + return jsonify( + message="{} reports marked as read.".format(len(data)), + category="success", + data=data, + status=200 + ) + + if report_id: + + +## ... source file abbreviated to get to request examples ... + + + db.session.commit() + + flash(_("All reports were marked as read."), "success") + return redirect(url_for("management.reports")) + + +class DeleteReport(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to view reports."), + level="danger", + endpoint="management.overview" + ) + ) + ] + + def post(self, report_id=None): + +~~ if request.is_xhr: +~~ ids = request.get_json()["ids"] + data = [] + + for report in Report.query.filter(Report.id.in_(ids)).all(): + if report.delete(): + data.append( + { + "id": report.id, + "type": "delete", + "reverse": False, + "reverse_name": None, + "reverse_url": None + } + ) + + return jsonify( + message="{} reports deleted.".format(len(data)), + category="success", + data=data, + status=200 + ) + + report = Report.query.filter_by(id=report_id).first_or_404() + report.delete() + flash(_("Report deleted."), "success") + + +## ... source file continues with no further request examples... ``` @@ -280,7 +708,6 @@ from flask_debugtoolbar.toolbar import DebugToolbar from flask_debugtoolbar.utils import decode_text try: - # Python 3.8+ from importlib.metadata import version __version__ = version("Flask-DebugToolbar") @@ -294,32 +721,33 @@ module = Blueprint('debugtoolbar', __name__) def replace_insensitive(string, target, replacement): - """Similar to string.replace() but is case insensitive + no_case = string.lower() + index = no_case.rfind(target.lower()) ## ... source file abbreviated to get to request examples ... + def dispatch_request(self): + req = _request_ctx_stack.top.request + app = current_app + if req.routing_exception is not None: app.raise_routing_exception(req) rule = req.url_rule - # if we provide automatic options for this URL and the - # request came with the OPTIONS method, reply automatically if getattr(rule, 'provide_automatic_options', False) \ and req.method == 'OPTIONS': return app.make_default_options_response() - # otherwise dispatch to the handler for that endpoint view_func = app.view_functions[rule.endpoint] view_func = self.process_view(app, view_func, req.view_args) return view_func(**req.view_args) def _show_toolbar(self): - """Return a boolean to indicate if we need to show the toolbar.""" ~~ if request.blueprint == 'debugtoolbar': return False @@ -330,7 +758,6 @@ def replace_insensitive(string, target, replacement): return True def send_static_file(self, filename): - """Send a static file from the flask-debugtoolbar static directory.""" return send_from_directory(self._static_dir, filename) def process_request(self): @@ -339,7 +766,7 @@ def replace_insensitive(string, target, replacement): if not self._show_toolbar(): return - real_request = request._get_current_object() +~~ real_request = request._get_current_object() self.debug_toolbars[real_request] = ( DebugToolbar(real_request, self.jinja_env)) @@ -348,42 +775,49 @@ def replace_insensitive(string, target, replacement): panel.process_request(real_request) def process_view(self, app, view_func, view_kwargs): - """ This method is called just before the flask view is called. - - -## ... source file abbreviated to get to request examples ... - - - else: - warnings.warn('Could not insert debug toolbar.' - ' tag not found in response.') - return response - - toolbar = self.debug_toolbars[real_request] +~~ real_request = request._get_current_object() + try: + toolbar = self.debug_toolbars[real_request] + except KeyError: + return view_func for panel in toolbar.panels: - panel.process_response(real_request, response) + new_view = panel.process_view(real_request, view_func, view_kwargs) + if new_view: + view_func = new_view - toolbar_html = toolbar.render_toolbar() + return view_func - content = ''.join((before, toolbar_html, after)) - content = content.encode(response.charset) - response.response = [content] - response.content_length = len(content) + def process_response(self, response): +~~ real_request = request._get_current_object() + if real_request not in self.debug_toolbars: + return response - return response + if current_app.config['DEBUG_TB_INTERCEPT_REDIRECTS']: + if response.status_code in self._redirect_codes: + redirect_to = response.location + redirect_code = response.status_code + if redirect_to: + content = self.render('redirect.html', { + 'redirect_to': redirect_to, + 'redirect_code': redirect_code + }) + response.content_length = len(content) + response.location = None + response.response = [content] + response.status_code = 200 + + if not (response.status_code == 200 and + response.is_sequence and + response.headers['content-type'].startswith('text/html')): + return response - def teardown_request(self, exc): -~~ self.debug_toolbars.pop(request._get_current_object(), None) + response_html = response.data.decode(response.charset) - def render(self, template_name, context): - template = self.jinja_env.get_template(template_name) - return template.render(**context) ## ... source file continues with no further request examples... - ``` @@ -399,7 +833,6 @@ as open source under the ```python # app.py -# -*- coding: utf-8 -*- from scripts import tabledef from scripts import forms @@ -412,16 +845,11 @@ import os app = Flask(__name__) app.secret_key = os.urandom(12) # Generic key for dev purposes only -# Heroku -#from flask_heroku import Heroku -#heroku = Heroku(app) -# ======== Routing =========================================================== # -# -------- Login ------------------------------------------------------------- # @app.route('/', methods=['GET', 'POST']) def login(): if not session.get('logged_in'): -~~ form = forms.LoginForm(request.form) + form = forms.LoginForm(request.form) ~~ if request.method == 'POST': ~~ username = request.form['username'].lower() ~~ password = request.form['password'] @@ -443,14 +871,13 @@ def logout(): return redirect(url_for('login')) -# -------- Signup ---------------------------------------------------------- # @app.route('/signup', methods=['GET', 'POST']) def signup(): if not session.get('logged_in'): -~~ form = forms.LoginForm(request.form) + form = forms.LoginForm(request.form) ~~ if request.method == 'POST': ~~ username = request.form['username'].lower() -~~ password = helpers.hash_password(request.form['password']) + password = helpers.hash_password(request.form['password']) ~~ email = request.form['email'] if form.validate(): if not helpers.username_taken(username): @@ -464,7 +891,6 @@ def signup(): return redirect(url_for('login')) -# -------- Settings ---------------------------------------------------------- # @app.route('/settings', methods=['GET', 'POST']) def settings(): if session.get('logged_in'): @@ -480,13 +906,12 @@ def settings(): return redirect(url_for('login')) -# ======== Main ============================================================== # if __name__ == "__main__": app.run(debug=True, use_reloader=True, host="0.0.0.0") -## ... source file continues with no further request examples... +## ... source file continues with no further request examples... ``` @@ -506,12 +931,6 @@ open sourced under the ```python # utils.py -# -*- coding: utf-8 -*- -''' - flask_login.utils - ----------------- - General utilities. -''' import hmac @@ -529,28 +948,26 @@ from .config import COOKIE_NAME, EXEMPT_METHODS from .signals import user_logged_in, user_logged_out, user_login_confirmed -#: A proxy for the current user. If no user is logged in, this will be an -#: anonymous user current_user = LocalProxy(lambda: _get_user()) def encode_cookie(payload, key=None): - ''' - This will encode a ``unicode`` value into a cookie, and sign that cookie - with the app's secret key. + return u'{0}|{1}'.format(payload, _cookie_digest(payload, key=key)) - :param payload: The value to encode, as `unicode`. - :type payload: unicode - :param key: The key to use when creating the cookie digest. If not - specified, the SECRET_KEY value from app config will be used. - :type key: str - ''' +def decode_cookie(cookie, key=None): + try: + payload, digest = cookie.rsplit(u'|', 1) + if hasattr(digest, 'decode'): + digest = digest.decode('ascii') # pragma: no cover + except ValueError: + return - -## ... source file abbreviated to get to request examples ... + if safe_str_cmp(_cookie_digest(payload, key=key), digest): + return payload +def make_next_param(login_url, current_url): l_url = urlparse(login_url) c_url = urlparse(current_url) @@ -561,56 +978,46 @@ def encode_cookie(payload, key=None): def expand_login_view(login_view): - ''' - Returns the url for the login view, expanding the view name to a url if - needed. - - :param login_view: The name of the login view or a URL for the login view. - :type login_view: str - ''' if login_view.startswith(('https://', 'http://', '/')): return login_view else: ~~ if request.view_args is None: return url_for(login_view) else: -~~ return url_for(login_view, **request.view_args) + return url_for(login_view, **request.view_args) def login_url(login_view, next_url=None, next_field='next'): - ''' - Creates a URL for redirecting to a login page. If only `login_view` is - provided, this will just return the URL for it. If `next_url` is provided, - however, this will append a ``next=URL`` parameter to the query string - so that the login view can redirect back to that URL. Flask-Login's default - unauthorized handler uses this function when redirecting to your login url. - To force the host name used, set `FORCE_HOST_FOR_REDIRECTS` to a host. This - prevents from redirecting to external sites if request headers Host or - X-Forwarded-For are present. - - :param login_view: The name of the login view. (Alternately, the actual - URL to the login view.) - :type login_view: str - :param next_url: The URL to give the login view for redirection. - :type next_url: str - :param next_field: What field to store the next URL in. (It defaults to - ``next``.) - :type next_field: str - ''' base = expand_login_view(login_view) + if next_url is None: + return base + + parsed_result = urlparse(base) + md = url_decode(parsed_result.query) + md[next_field] = make_next_param(base, next_url) + netloc = current_app.config.get('FORCE_HOST_FOR_REDIRECTS') or \ + parsed_result.netloc + parsed_result = parsed_result._replace(netloc=netloc, + query=url_encode(md, sort=True)) + return urlunparse(parsed_result) + + +def login_fresh(): + return session.get('_fresh', False) + ## ... source file abbreviated to get to request examples ... + current_app.login_manager._update_request_context_with_user(user) + user_logged_in.send(current_app._get_current_object(), user=_get_user()) + return True + def logout_user(): - ''' - Logs a user out. (You do not need to pass the actual user.) This will - also clean up the remember me cookie if it exists. - ''' user = _get_user() @@ -636,42 +1043,12 @@ def logout_user(): def confirm_login(): - ''' - This sets the current session as fresh. Sessions become stale when they - are reloaded from a cookie. - ''' session['_fresh'] = True session['_id'] = current_app.login_manager._session_identifier_generator() user_login_confirmed.send(current_app._get_current_object()) def login_required(func): - ''' - If you decorate a view with this, it will ensure that the current user is - logged in and authenticated before calling the actual view. (If they are - - -## ... source file abbreviated to get to request examples ... - - - if not current_user.is_authenticated: - return current_app.login_manager.unauthorized() - - ...which is essentially the code that this function adds to your views. - - It can be convenient to globally turn off authentication when unit testing. - To enable this, if the application configuration variable `LOGIN_DISABLED` - is set to `True`, this decorator will be ignored. - - .. Note :: - - Per `W3 guidelines for CORS preflight requests - `_, - HTTP ``OPTIONS`` requests are exempt from login checks. - - :param func: The view function to decorate. - :type func: function - ''' @wraps(func) def decorated_view(*args, **kwargs): ~~ if request.method in EXEMPT_METHODS: @@ -685,29 +1062,6 @@ def login_required(func): def fresh_login_required(func): - ''' - If you decorate a view with this, it will ensure that the current user's - login is fresh - i.e. their session was not restored from a 'remember me' - cookie. Sensitive operations, like changing a password or e-mail, should - be protected with this, to impede the efforts of cookie thieves. - - If the user is not authenticated, :meth:`LoginManager.unauthorized` is - called as normal. If they are authenticated, but their session is not - fresh, it will call :meth:`LoginManager.needs_refresh` instead. (In that - case, you will need to provide a :attr:`LoginManager.refresh_view`.) - - Behaves identically to the :func:`login_required` decorator with respect - to configuration variables. - - .. Note :: - - Per `W3 guidelines for CORS preflight requests - `_, - HTTP ``OPTIONS`` requests are exempt from login checks. - - :param func: The view function to decorate. - :type func: function - ''' @wraps(func) def decorated_view(*args, **kwargs): ~~ if request.method in EXEMPT_METHODS: @@ -723,18 +1077,18 @@ def fresh_login_required(func): def set_login_view(login_view, blueprint=None): - ''' - Sets the login view for the app or blueprint. If a blueprint is passed, - the login view is set for this blueprint on ``blueprint_login_views``. - - :param login_view: The user object to log in. - :type login_view: str - :param blueprint: The blueprint which this login view should be set on. - Defaults to ``None``. - :type blueprint: object - ''' num_login_views = len(current_app.login_manager.blueprint_login_views) + if blueprint is not None or num_login_views != 0: + + (current_app.login_manager + .blueprint_login_views[blueprint.name]) = login_view + + if (current_app.login_manager.login_view is not None and + None not in current_app.login_manager.blueprint_login_views): + + (current_app.login_manager + .blueprint_login_views[None]) = (current_app.login_manager ## ... source file abbreviated to get to request examples ... @@ -762,8 +1116,6 @@ def _cookie_digest(payload, key=None): def _get_remote_addr(): ~~ address = request.headers.get('X-Forwarded-For', request.remote_addr) if address is not None: - # An 'X-Forwarded-For' header includes a comma separated list of the - # addresses, the first address being the actual remote address. address = address.encode('utf-8').split(b',')[0].strip() return address @@ -794,8 +1146,8 @@ def _secret_key(key=None): return key -## ... source file continues with no further request examples... +## ... source file continues with no further request examples... ``` @@ -815,7 +1167,6 @@ Flask RESTX is provided as open source under the ```python # marshalling.py -# -*- coding: utf-8 -*- from __future__ import unicode_literals from collections import OrderedDict @@ -835,30 +1186,30 @@ def make(cls): def marshal(data, fields, envelope=None, skip_none=False, mask=None, ordered=False): - """Takes raw data (in the form of a dict, list, object) and a dict of - fields to output and filters the data based on those fields. + out, has_wildcards = _marshal(data, fields, envelope, skip_none, mask, ordered) + + if has_wildcards: + from .fields import Wildcard - :param data: the actual object(s) from which the fields are taken from - :param fields: a dict of whose keys will make up the final serialized - response output - :param envelope: optional key that will be used to envelop the serialized - response - :param bool skip_none: optional key will be used to eliminate fields - which value is None or the field's key not - exist in data - :param bool ordered: Wether or not to preserve order + items = [] + keys = [] + for dkey, val in fields.items(): + key = dkey + if isinstance(val, dict): + value = marshal(data, val, skip_none=skip_none, ordered=ordered) + else: ## ... source file abbreviated to get to request examples ... + + +class marshal_with(object): + + def __init__( + self, fields, envelope=None, skip_none=False, mask=None, ordered=False ): - """ - :param fields: a dict of whose keys will make up the final - serialized response output - :param envelope: optional key that will be used to envelop the serialized - response - """ self.fields = fields self.envelope = envelope self.skip_none = skip_none @@ -896,142 +1247,15 @@ def marshal(data, fields, envelope=None, skip_none=False, mask=None, ordered=Fal class marshal_with_field(object): - """ - - -## ... source file continues with no further request examples... - - -``` - - -## Example 7 from flask-sqlalchemy -[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) -([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) -and -[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a -[Flask](/flask.html) extension that makes it easier to use -[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy -provides helper functions that reduce the amount of common boilerplate -code that you have to frequently write yourself if you did not use this -library when combining Flask with SQLAlchemy. - -flask-sqlalchemy is provided as open source under the -[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). - -[**flask-sqlalchemy / src/flask_sqlalchemy / __init__.py**](https://github.com/pallets/flask-sqlalchemy/blob/master/src/flask_sqlalchemy/./__init__.py) - -```python -# __init__.py -import functools -import os -import sys -import warnings -from math import ceil -from operator import itemgetter -from threading import Lock -from time import perf_counter - -import sqlalchemy -from flask import _app_ctx_stack -from flask import abort -from flask import current_app -~~from flask import request -from flask.signals import Namespace -from sqlalchemy import event -from sqlalchemy import inspect -from sqlalchemy import orm -from sqlalchemy.engine.url import make_url -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.ext.declarative import DeclarativeMeta -from sqlalchemy.orm.exc import UnmappedClassError -from sqlalchemy.orm.session import Session as SessionBase - -from .model import DefaultMeta -from .model import Model - -__version__ = "3.0.0.dev" - -_signals = Namespace() -models_committed = _signals.signal("models-committed") -before_models_committed = _signals.signal("before-models-committed") - - -def _make_table(db): - def _make_table(*args, **kwargs): - if len(args) > 1 and isinstance(args[1], db.Column): - args = (args[0], db.metadata) + args[1:] - - -## ... source file abbreviated to get to request examples ... - - - - If ``page`` or ``per_page`` are ``None``, they will be retrieved from - the request query. If ``max_per_page`` is specified, ``per_page`` will - be limited to that value. If there is no request or they aren't in the - query, they default to 1 and 20 respectively. If ``count`` is ``False``, - no query to help determine total page count will be run. - When ``error_out`` is ``True`` (default), the following rules will - cause a 404 response: - - * No items are found and ``page`` is not 1. - * ``page`` is less than 1, or ``per_page`` is negative. - * ``page`` or ``per_page`` are not ints. - - When ``error_out`` is ``False``, ``page`` and ``per_page`` default to - 1 and 20 respectively. - - Returns a :class:`Pagination` object. - """ - -~~ if request: - if page is None: - try: -~~ page = int(request.args.get("page", 1)) - except (TypeError, ValueError): - if error_out: - abort(404) - - page = 1 - - if per_page is None: - try: -~~ per_page = int(request.args.get("per_page", 20)) - except (TypeError, ValueError): - if error_out: - abort(404) - - per_page = 20 - else: - if page is None: - page = 1 - - if per_page is None: - per_page = 20 - - if max_per_page is not None: - per_page = min(per_page, max_per_page) - - if page < 1: - if error_out: - abort(404) - else: - page = 1 - - if per_page < 0: - if error_out: - abort(404) ## ... source file continues with no further request examples... - ``` -## Example 8 from Flask-WTF +## Example 7 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1066,17 +1290,17 @@ logger = logging.getLogger(__name__) def generate_csrf(secret_key=None, token_key=None): - """Generate a CSRF token. The token is cached for a request, so multiple - calls to this function will generate the same token. - During testing, it might be useful to access the signed token in - ``g.csrf_token`` and the raw token in ``session['csrf_token']``. + secret_key = _get_config( + secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, + message='A secret key is required to use CSRF.' + ) + field_name = _get_config( + token_key, 'WTF_CSRF_FIELD_NAME', 'csrf_token', + message='A field name is required to use CSRF.' + ) - :param secret_key: Used to securely sign the token. Default is - ``WTF_CSRF_SECRET_KEY`` or ``SECRET_KEY``. - :param token_key: Key where token is stored in session for comparison. - Default is ``WTF_CSRF_FIELD_NAME`` or ``'csrf_token'``. - """ + if field_name not in g: ## ... source file abbreviated to get to request examples ... @@ -1111,7 +1335,7 @@ def generate_csrf(secret_key=None, token_key=None): ~~ if request.blueprint in self._exempt_blueprints: return -~~ view = app.view_functions.get(request.endpoint) + view = app.view_functions.get(request.endpoint) dest = '{0}.{1}'.format(view.__module__, view.__name__) if dest in self._exempt_views: @@ -1120,14 +1344,12 @@ def generate_csrf(secret_key=None, token_key=None): self.protect() def _get_csrf_token(self): - # find the token in the form data field_name = current_app.config['WTF_CSRF_FIELD_NAME'] ~~ base_token = request.form.get(field_name) if base_token: return base_token - # if the form has a prefix, the name will be {prefix}-csrf_token ~~ for key in request.form: if key.endswith(field_name): ~~ csrf_token = request.form[key] @@ -1135,7 +1357,6 @@ def generate_csrf(secret_key=None, token_key=None): if csrf_token: return csrf_token - # find the token in the headers for header_name in current_app.config['WTF_CSRF_HEADERS']: ~~ csrf_token = request.headers.get(header_name) @@ -1158,42 +1379,36 @@ def generate_csrf(secret_key=None, token_key=None): ~~ if not request.referrer: self._error_response('The referrer header is missing.') -~~ good_referrer = 'https://{0}/'.format(request.host) + good_referrer = 'https://{0}/'.format(request.host) -~~ if not same_origin(request.referrer, good_referrer): + if not same_origin(request.referrer, good_referrer): self._error_response('The referrer does not match the host.') g.csrf_valid = True # mark this request as CSRF valid def exempt(self, view): - """Mark a view or blueprint to be excluded from CSRF protection. - - :: - - @app.route('/some-view', methods=['POST']) - @csrf.exempt - def some_view(): - ... - - :: - - bp = Blueprint(...) - csrf.exempt(bp) - - """ if isinstance(view, Blueprint): self._exempt_blueprints.add(view.name) return view + if isinstance(view, string_types): + view_location = view + else: + view_location = '.'.join((view.__module__, view.__name__)) -## ... source file continues with no further request examples... + self._exempt_views.add(view_location) + return view + + def _error_response(self, reason): +## ... source file continues with no further request examples... + ``` -## Example 9 from flaskSaaS +## Example 8 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -1232,21 +1447,19 @@ class ModelView(ModelView): )) return True -# Users admin.add_view(ModelView(User, db.session)) -# Static files path = op.join(op.dirname(__file__), 'static') admin.add_view(FileAdmin(path, '/static/', name='Static')) -## ... source file continues with no further request examples... +## ... source file continues with no further request examples... ``` -## Example 10 from newspie +## Example 9 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1258,13 +1471,6 @@ NewsPie is provided as open source under the ```python # news.py -# -*- coding: utf-8 -*- -''' -NewsPie - a minimalistic news aggregator built with Flask and powered by -News API (https://newsapi.org/). - -Created by @skamieniarz (https://github.com/skamieniarz) in 2019. -''' import configparser import json import logging @@ -1298,31 +1504,16 @@ APP = Flask(__name__) @APP.route('/', methods=['GET', 'POST']) def root(): - - -## ... source file abbreviated to get to request examples ... - - + return redirect(url_for('category', category='general', page=1)) @APP.errorhandler(404) def page_not_found(error): - ''' Not existing pages redirect to the first page of general category. ''' return redirect(url_for('category', category='general', page=1)) @APP.route('/category/', methods=['GET', 'POST']) def category(category): - ''' Handles category route. - - Parameters: - - name: category - in: path - description: Name of the news category - - name: page - in: query - description: Number of the page - ''' ~~ page = request.args.get('page', default=1, type=int) if page < 1: return redirect(url_for('category', category=category, page=1)) @@ -1350,16 +1541,6 @@ def category(category): @APP.route('/search/', methods=['GET', 'POST']) def search(query): - ''' Handles category route. - - Parameters: - - name: query - in: path - description: Query string to be searched - - name: page - in: query - description: Number of the page - ''' ~~ page = request.args.get('page', default=1, type=int) if page < 1: return redirect(url_for('search', query=query, page=1)) @@ -1387,7 +1568,6 @@ def search(query): def do_post(page, category='general', current_query=None): - ''' Helper method that handles POST request basing on the input. ''' ~~ new_query = request.form.get('search_query') ~~ country = request.form.get('country') ~~ next_page = request.form.get('next_page') @@ -1409,20 +1589,26 @@ def do_post(page, category='general', current_query=None): def parse_articles(response): - ''' Parses articles fetched from News API. - - Returns: - A list of dicts containing publishing date, title, URL and source of - articles. - ''' parsed_articles = [] + if response.get('status') == 'ok': + for article in response.get('articles'): + parsed_articles.append({ + 'published_at': + parser.isoparse(article['publishedAt'] + ).strftime('%Y-%m-%d %H:%M'), ## ... source file abbreviated to get to request examples ... - ''' Renders the template with appropriate variables. Up to 12 pages - allowed. ''' +def count_pages(response): + pages = 0 + if response.get('status') == 'ok': + pages = (-(-response.get('totalResults', 0) // PAGE_SIZE)) + return pages + + +def render(articles, page, pages, country, category): pages = pages if pages <= 12 else 12 return render_template(CONFIG['VARIOUS']['TEMPLATE'], articles=articles, @@ -1435,12 +1621,6 @@ def parse_articles(response): def get_cookie(key): - ''' Helper method that gets cookie's value. - - Returns: - A string with a value of a cookie with provided key. If a key is - missing, None is returned. - ''' ~~ cookie_value = request.cookies.get(key) return cookie_value @@ -1449,13 +1629,13 @@ if __name__ == '__main__': APP.run() -## ... source file continues with no further request examples... +## ... source file continues with no further request examples... ``` -## Example 11 from sandman2 +## Example 10 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1475,30 +1655,18 @@ The sandman2 project is provided under the ```python # service.py -"""Automatically generated REST API services from SQLAlchemy -ORM models or a database introspection.""" -# Third-party imports ~~from flask import request, make_response import flask from flask.views import MethodView from sqlalchemy import asc, desc -# Application imports from sandman2.exception import NotFoundException, BadRequestException from sandman2.model import db from sandman2.decorators import etag, validate_fields def add_link_headers(response, links): - """Return *response* with the proper link headers set, based on the contents - of *links*. - - :param response: :class:`flask.Response` response object for links to be - added - :param dict links: Dictionary of links to be added - :rtype :class:`flask.Response` : - """ link_string = '<{}>; rel=self'.format(links['self']) for link in links.values(): link_string += ', <{}>; rel=related'.format(link) @@ -1507,11 +1675,6 @@ def add_link_headers(response, links): def jsonify(resource): - """Return a Flask ``Response`` object containing a - JSON representation of *resource*. - - :param resource: The resource to act as the basis of the response - """ response = flask.jsonify(resource.to_dict()) response = add_link_headers(response, resource.links()) @@ -1519,8 +1682,6 @@ def jsonify(resource): def is_valid_method(model, resource=None): - """Return the error message to be sent to the client if the current - request passes fails any user-defined validation.""" validation_function_name = 'is_valid_{}'.format( ~~ request.method.lower()) if hasattr(model, validation_function_name): @@ -1528,43 +1689,23 @@ def is_valid_method(model, resource=None): class Service(MethodView): - """The *Service* class is a generic extension of Flask's *MethodView*, - providing default RESTful functionality for a given ORM resource. - Each service has an associated *__model__* attribute which represents the - ORM resource it exposes. Services are JSON-only. HTML-based representation - is available through the admin interface. - """ - - #: The sandman2.model.Model-derived class to expose __model__ = None - #: The string used to describe the elements when a collection is - #: returned. __json_collection_name__ = 'resources' def delete(self, resource_id): - """Return an HTTP response object resulting from a HTTP DELETE call. - - :param resource_id: The value of the resource's primary key - - -## ... source file abbreviated to get to request examples ... - - + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + db.session().delete(resource) db.session().commit() return self._no_content_response() @etag def get(self, resource_id=None): - """Return an HTTP response object resulting from an HTTP GET call. - - If *resource_id* is provided, return just the single resource. - Otherwise, return the full collection. - - :param resource_id: The value of the resource's primary key - """ - if request.path.endswith('meta'): +~~ if request.path.endswith('meta'): return self._meta() if resource_id is None: @@ -1586,33 +1727,19 @@ class Service(MethodView): return jsonify(resource) def patch(self, resource_id): - """Return an HTTP response object resulting from an HTTP PATCH call. - - :returns: ``HTTP 200`` if the resource already exists - :returns: ``HTTP 400`` if the request is malformed - :returns: ``HTTP 404`` if the resource is not found - :param resource_id: The value of the resource's primary key - """ resource = self._resource(resource_id) error_message = is_valid_method(self.__model__, resource) if error_message: raise BadRequestException(error_message) ~~ if not request.json: raise BadRequestException('No JSON data received') -~~ resource.update(request.json) + resource.update(request.json) db.session().merge(resource) db.session().commit() return jsonify(resource) @validate_fields def post(self): - """Return the JSON representation of a new resource created through - an HTTP POST call. - - :returns: ``HTTP 201`` if a resource is properly created - :returns: ``HTTP 204`` if the resource already exists - :returns: ``HTTP 400`` if the request is malformed or missing data - """ resource = self.__model__.query.filter_by(**request.json).first() if resource: error_message = is_valid_method(self.__model__, resource) @@ -1620,7 +1747,7 @@ class Service(MethodView): raise BadRequestException(error_message) return self._no_content_response() -~~ resource = self.__model__(**request.json) # pylint: disable=not-callable + resource = self.__model__(**request.json) # pylint: disable=not-callable error_message = is_valid_method(self.__model__, resource) if error_message: raise BadRequestException(error_message) @@ -1629,29 +1756,13 @@ class Service(MethodView): return self._created_response(resource) def put(self, resource_id): - """Return the JSON representation of a new resource created or updated - through an HTTP PUT call. - - If resource_id is not provided, it is assumed the primary key field is - included and a totally new resource is created. Otherwise, the existing - resource referred to by *resource_id* is updated with the provided JSON - data. This method is idempotent. - - :returns: ``HTTP 201`` if a new resource is created - :returns: ``HTTP 200`` if a resource is updated - :returns: ``HTTP 400`` if the request is malformed or missing data - """ - resource = self.__model__.query.get(resource_id) - if resource: - error_message = is_valid_method(self.__model__, resource) - if error_message: - raise BadRequestException(error_message) -~~ resource.update(request.json) - db.session().merge(resource) - db.session().commit() - return jsonify(resource) -~~ resource = self.__model__(**request.json) # pylint: disable=not-callable + +## ... source file abbreviated to get to request examples ... + + + + resource = self.__model__(**request.json) # pylint: disable=not-callable error_message = is_valid_method(self.__model__, resource) if error_message: raise BadRequestException(error_message) @@ -1660,27 +1771,15 @@ class Service(MethodView): return self._created_response(resource) def _meta(self): - """Return a description of this resource as reported by the - database.""" return flask.jsonify(self.__model__.description()) def _resource(self, resource_id): - """Return the ``sandman2.model.Model`` instance with the given - *resource_id*. - - :rtype: :class:`sandman2.model.Model` - """ resource = self.__model__.query.get(resource_id) if not resource: raise NotFoundException() return resource def _all_resources(self): - """Return the complete collection of resources as a list of - dictionaries. - - :rtype: :class:`sandman2.model.Model` - """ queryset = self.__model__.query ~~ args = {k: v for (k, v) in request.args.items() if k not in ('page', 'export')} limit = None @@ -1701,17 +1800,13 @@ class Service(MethodView): raise BadRequestException('Invalid field [{}]'.format(key)) queryset = queryset.filter(*filters).order_by(*order) ~~ if 'page' in request.args: -~~ resources = queryset.paginate(page=int(request.args['page']), per_page=limit).items + resources = queryset.paginate(page=int(request.args['page']), per_page=limit).items else: queryset = queryset.limit(limit) resources = queryset.all() return [r.to_dict() for r in resources] def _export(self, collection): - """Return a CSV of the resources in *collection*. - - :param list collection: A list of resources represented by dicts - """ fieldnames = collection[0].keys() faux_csv = ','.join(fieldnames) + '\r\n' for resource in collection: @@ -1723,18 +1818,20 @@ class Service(MethodView): @staticmethod def _no_content_response(): - """Return an HTTP 204 "No Content" response. + response = make_response() + response.status_code = 204 + return response - :returns: HTTP Response + @staticmethod + def _created_response(resource): ## ... source file continues with no further request examples... - ``` -## Example 12 from tedivms-flask +## Example 11 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1756,7 +1853,6 @@ from functools import wraps def is_authorized_api_user(roles=False): - """Verify API Token and its owners permission to use it""" ~~ if 'API_ID' not in request.headers: return False ~~ if 'API_KEY' not in request.headers: @@ -1764,7 +1860,7 @@ def is_authorized_api_user(roles=False): ~~ api_key = users.ApiKey.query.filter(users.ApiKey.id==request.headers['API_ID']).first() if not api_key: return False -~~ if not current_app.user_manager.verify_password(request.headers['API_KEY'], api_key.hash): + if not current_app.user_manager.verify_password(request.headers['API_KEY'], api_key.hash): return False if not roles: return True @@ -1787,12 +1883,8 @@ def roles_accepted_api(*role_names): return wrapper -def api_credentials_required(): - def wrapper(view_function): - ## ... source file continues with no further request examples... - ``` diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index e582d98fe..bdc364cbd 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -54,17 +54,17 @@ def get_first_last_name(fullname): class BaseRegisterUser(PublicFormView): - """ - Make your own user registration view and inherit from this class if you + + route_base = "/register" ## ... source file abbreviated to get to session examples ... + ) + + class RegisterUserOIDView(BaseRegisterUser): - """ - View for Registering a new user, auth OID mode - """ route_base = "/register" @@ -92,7 +92,6 @@ class RegisterUserOIDView(BaseRegisterUser): form.last_name.data = last_name form.email.data = resp.email widgets = self._get_edit_widget(form=form) - # self.update_redirect() return self.render_template( self.form_template, title=self.form_title, @@ -105,12 +104,12 @@ class RegisterUserOIDView(BaseRegisterUser): return redirect(self.get_redirect()) def oid_login_handler(self, f, oid): - """ + if request.args.get("openid_complete") != u"yes": + return f(False) ## ... source file continues with no further session examples... - ``` @@ -128,7 +127,6 @@ FlaskBB is provided as open source ```python # helpers.py -""" import ast import itertools import logging @@ -174,27 +172,20 @@ logger = logging.getLogger(__name__) _punct_re = re.compile(r'[\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.]+') - -## ... source file abbreviated to get to session examples ... - - +def slugify(text, delim=u"-"): + text = unidecode.unidecode(text) + result = [] + for word in _punct_re.split(text.lower()): + if word: result.append(word) return text_type(delim.join(result)) def redirect_or_next(endpoint, **kwargs): - """Redirects the user back to the page they were viewing or to a specified - endpoint. Wraps Flasks :func:`Flask.redirect` function. - - :param endpoint: The fallback endpoint. - """ return redirect(request.args.get("next") or endpoint, **kwargs) def render_template(template, **context): # pragma: no cover - """A helper function that uses the `render_theme_template` function - without needing to edit all the views - """ if current_user.is_authenticated and current_user.theme: theme = current_user.theme else: @@ -202,18 +193,7 @@ def render_template(template, **context): # pragma: no cover return render_theme_template(theme, template, **context) -# TODO(anr): clean this up def do_topic_action(topics, user, action, reverse): # noqa: C901 - """Executes a specific action for topics. Returns a list with the modified - topic objects. - - :param topics: A iterable with ``Topic`` objects. - :param user: The user object which wants to perform the action. - :param action: One of the following actions: locked, important and delete. - :param reverse: If the action should be done in a reversed way. - For example, to unlock a topic, ``reverse`` should be - set to ``True``. - """ if not topics: return False @@ -223,88 +203,25 @@ def do_topic_action(topics, user, action, reverse): # noqa: C901 Has, ) + if not Permission(IsAtleastModeratorInForum(forum=topics[0].forum)): + flash( + _("You do not have the permissions to execute this action."), + "danger", + ) + return False - -## ... source file continues with no further session examples... - - -``` - - -## Example 3 from flask-debugtoolbar -[Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) -([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) -and -[PyPI page](https://pypi.org/project/Flask-DebugToolbar/)) -is a [Flask](/flask.html) conversion of the popular -[Django Debug Toolbar](https://github.com/jazzband/django-debug-toolbar) -project. This extension creates a sidebar with useful debugging -information when you are running a Flask application in development -mode. The project is provided as open source under -[this license](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/LICENSE). - -[**flask-debugtoolbar / flask_debugtoolbar / panels / request_vars.py**](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/flask_debugtoolbar/panels/request_vars.py) - -```python -# request_vars.py -~~from flask import session - -from flask_debugtoolbar.panels import DebugPanel - -_ = lambda x: x - - -class RequestVarsDebugPanel(DebugPanel): - """ - A panel to display request variables (POST/GET, session, cookies). - """ - name = 'RequestVars' - has_content = True - - def nav_title(self): - return _('Request Vars') - - def title(self): - return _('Request Vars') - - def url(self): - return '' - - def process_request(self, request): - self.request = request - self.session = session - self.view_func = None - self.view_args = [] - self.view_kwargs = {} - - def process_view(self, request, view_func, view_kwargs): - self.view_func = view_func - self.view_kwargs = view_kwargs - - def content(self): - context = self.context.copy() - context.update({ - 'get': self.request.args.lists(), - 'post': self.request.form.lists(), - 'cookies': self.request.cookies.items(), - 'view_func': ('%s.%s' % (self.view_func.__module__, - self.view_func.__name__) - if self.view_func else '[unknown]'), - 'view_args': self.view_args, - 'view_kwargs': self.view_kwargs or {}, -~~ 'session': self.session.items(), - }) - - return self.render('panels/request_vars.html', context) + modified_topics = 0 + if action not in {"delete", "hide", "unhide"}: + for topic in topics: + if getattr(topic, action) and not reverse: ## ... source file continues with no further session examples... - ``` -## Example 4 from flaskex +## Example 3 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -316,7 +233,6 @@ as open source under the ```python # app.py -# -*- coding: utf-8 -*- from scripts import tabledef from scripts import forms @@ -329,12 +245,7 @@ import os app = Flask(__name__) app.secret_key = os.urandom(12) # Generic key for dev purposes only -# Heroku -#from flask_heroku import Heroku -#heroku = Heroku(app) -# ======== Routing =========================================================== # -# -------- Login ------------------------------------------------------------- # @app.route('/', methods=['GET', 'POST']) def login(): ~~ if not session.get('logged_in'): @@ -360,7 +271,6 @@ def logout(): return redirect(url_for('login')) -# -------- Signup ---------------------------------------------------------- # @app.route('/signup', methods=['GET', 'POST']) def signup(): ~~ if not session.get('logged_in'): @@ -381,7 +291,6 @@ def signup(): return redirect(url_for('login')) -# -------- Settings ---------------------------------------------------------- # @app.route('/settings', methods=['GET', 'POST']) def settings(): ~~ if session.get('logged_in'): @@ -397,18 +306,17 @@ def settings(): return redirect(url_for('login')) -# ======== Main ============================================================== # if __name__ == "__main__": app.run(debug=True, use_reloader=True, host="0.0.0.0") -## ... source file continues with no further session examples... +## ... source file continues with no further session examples... ``` -## Example 5 from flask-login +## Example 4 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -423,12 +331,6 @@ open sourced under the ```python # utils.py -# -*- coding: utf-8 -*- -''' - flask_login.utils - ----------------- - General utilities. -''' import hmac @@ -446,29 +348,32 @@ from .config import COOKIE_NAME, EXEMPT_METHODS from .signals import user_logged_in, user_logged_out, user_login_confirmed -#: A proxy for the current user. If no user is logged in, this will be an -#: anonymous user current_user = LocalProxy(lambda: _get_user()) def encode_cookie(payload, key=None): - ''' - This will encode a ``unicode`` value into a cookie, and sign that cookie - with the app's secret key. + return u'{0}|{1}'.format(payload, _cookie_digest(payload, key=key)) - :param payload: The value to encode, as `unicode`. - :type payload: unicode - :param key: The key to use when creating the cookie digest. If not - specified, the SECRET_KEY value from app config will be used. - :type key: str - ''' +def decode_cookie(cookie, key=None): + try: + payload, digest = cookie.rsplit(u'|', 1) + if hasattr(digest, 'decode'): + digest = digest.decode('ascii') # pragma: no cover + except ValueError: + return + + if safe_str_cmp(_cookie_digest(payload, key=key), digest): + return payload ## ... source file abbreviated to get to session examples ... - ''' + return url_for(login_view, **request.view_args) + + +def login_url(login_view, next_url=None, next_field='next'): base = expand_login_view(login_view) if next_url is None: @@ -485,39 +390,23 @@ def encode_cookie(payload, key=None): def login_fresh(): - ''' - This returns ``True`` if the current login is fresh. - ''' ~~ return session.get('_fresh', False) def login_user(user, remember=False, duration=None, force=False, fresh=True): - ''' - Logs a user in. You should pass the actual user object to this. If the - user's `is_active` property is ``False``, they will not be logged in - unless `force` is ``True``. - - This will return ``True`` if the log in attempt succeeds, and ``False`` if - it fails (i.e. because the user is inactive). - - :param user: The user object to log in. - :type user: object - :param remember: Whether to remember the user after their session expires. - Defaults to ``False``. - :type remember: bool - :param duration: The amount of time before the remember cookie expires. If - ``None`` the value set in the settings is used. Defaults to ``None``. - :type duration: :class:`datetime.timedelta` - :param force: If the user is inactive, setting this to ``True`` will log - them in regardless. Defaults to ``False``. - :type force: bool - :param fresh: setting this to ``False`` will log in the user with a session - marked as not "fresh". Defaults to ``True``. - - -## ... source file abbreviated to get to session examples ... + if not force and not user.is_active: + return False + user_id = getattr(user, current_app.login_manager.id_attribute)() + session['_user_id'] = user_id + session['_fresh'] = fresh + session['_id'] = current_app.login_manager._session_identifier_generator() + if remember: + session['_remember'] = 'set' + if duration is not None: + try: + session['_remember_seconds'] = (duration.microseconds + (duration.seconds + duration.days * 24 * 3600) * 10**6) / 10.0**6 @@ -531,10 +420,6 @@ def login_user(user, remember=False, duration=None, force=False, fresh=True): def logout_user(): - ''' - Logs a user out. (You do not need to pass the actual user.) This will - also clean up the remember me cookie if it exists. - ''' user = _get_user() @@ -560,31 +445,30 @@ def logout_user(): def confirm_login(): - ''' - This sets the current session as fresh. Sessions become stale when they - are reloaded from a cookie. - ''' session['_fresh'] = True session['_id'] = current_app.login_manager._session_identifier_generator() user_login_confirmed.send(current_app._get_current_object()) def login_required(func): - ''' - If you decorate a view with this, it will ensure that the current user is - logged in and authenticated before calling the actual view. (If they are - not, it calls the :attr:`LoginManager.unauthorized` callback.) For - example:: - + @wraps(func) + def decorated_view(*args, **kwargs): + if request.method in EXEMPT_METHODS: + return func(*args, **kwargs) + elif current_app.config.get('LOGIN_DISABLED'): + return func(*args, **kwargs) + elif not current_user.is_authenticated: + return current_app.login_manager.unauthorized() + return func(*args, **kwargs) + return decorated_view ## ... source file continues with no further session examples... - ``` -## Example 6 from Flask-WTF +## Example 5 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -619,17 +503,6 @@ logger = logging.getLogger(__name__) def generate_csrf(secret_key=None, token_key=None): - """Generate a CSRF token. The token is cached for a request, so multiple - calls to this function will generate the same token. - - During testing, it might be useful to access the signed token in - ``g.csrf_token`` and the raw token in ``session['csrf_token']``. - - :param secret_key: Used to securely sign the token. Default is - ``WTF_CSRF_SECRET_KEY`` or ``SECRET_KEY``. - :param token_key: Key where token is stored in session for comparison. - Default is ``WTF_CSRF_FIELD_NAME`` or ``'csrf_token'``. - """ secret_key = _get_config( secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, @@ -658,25 +531,6 @@ def generate_csrf(secret_key=None, token_key=None): def validate_csrf(data, secret_key=None, time_limit=None, token_key=None): - """Check if the given data is a valid CSRF token. This compares the given - signed token to the one stored in the session. - - :param data: The signed CSRF token to be checked. - :param secret_key: Used to securely sign the token. Default is - ``WTF_CSRF_SECRET_KEY`` or ``SECRET_KEY``. - :param time_limit: Number of seconds that the token is valid. Default is - ``WTF_CSRF_TIME_LIMIT`` or 3600 seconds (60 minutes). - :param token_key: Key where token is stored in session for comparison. - Default is ``WTF_CSRF_FIELD_NAME`` or ``'csrf_token'``. - - -## ... source file abbreviated to get to session examples ... - - - .. versionchanged:: 0.14 - Raises ``ValidationError`` with a specific error message rather than - returning ``True`` or ``False``. - """ secret_key = _get_config( secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, @@ -713,20 +567,19 @@ def _get_config( value, config_name, default=None, required=True, message='CSRF is not configured.' ): - """Find config value based on provided value, Flask config, and default - value. - :param value: already provided config value - :param config_name: Flask ``config`` key + if value is None: + value = current_app.config.get(config_name, default) + if required and value is None: -## ... source file continues with no further session examples... +## ... source file continues with no further session examples... ``` -## Example 7 from flaskSaaS +## Example 6 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -741,20 +594,6 @@ many others. The project is provided as open source under the ```python # logger_setup.py -:Example: - >>> from website import logger - >>> logger.info('event', foo='bar') -**Levels**: - - logger.debug('For debugging purposes') - - logger.info('An event occured, for example a database update') - - logger.warning('Rare situation') - - logger.error('Something went wrong') - - logger.critical('Very very bad') -You can build a log incrementally as so: - >>> log = logger.new(date='now') - >>> log = log.bind(weather='rainy') - >>> log.info('user logged in', user='John') -''' import datetime as dt import logging @@ -767,22 +606,19 @@ from structlog.processors import JSONRenderer from app import app -# Set the logging level app.logger.setLevel(app.config['LOG_LEVEL']) -# Remove the stdout handler app.logger.removeHandler(app.logger.handlers[0]) TZ = pytz.timezone(app.config['TIMEZONE']) def add_fields(_, level, event_dict): - ''' Add custom fields to each record. ''' now = dt.datetime.now() event_dict['timestamp'] = TZ.localize(now, True).astimezone(pytz.utc).isoformat() event_dict['level'] = level -~~ if session: + if session: ~~ event_dict['session_id'] = session.get('session_id') if request: @@ -794,7 +630,6 @@ def add_fields(_, level, event_dict): return event_dict -# Add a handler to write log messages to a file if app.config.get('LOG_FILENAME'): file_handler = RotatingFileHandler(filename=app.config['LOG_FILENAME'], maxBytes=app.config['LOG_MAXBYTES'], @@ -804,19 +639,19 @@ if app.config.get('LOG_FILENAME'): file_handler.setLevel(logging.DEBUG) app.logger.addHandler(file_handler) -# Wrap the application logger with structlog to format the output logger = wrap_logger( app.logger, processors=[ + add_fields, + JSONRenderer(indent=None) ## ... source file continues with no further session examples... - ``` -## Example 8 from tedivms-flask +## Example 7 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -842,7 +677,7 @@ import yaml ~~from flask import Flask, session, render_template from flask_mail import Mail from flask_migrate import Migrate, MigrateCommand -~~from flask.sessions import SessionInterface +from flask.sessions import SessionInterface from flask_sqlalchemy import SQLAlchemy from flask_user import user_logged_out from flask_wtf.csrf import CSRFProtect @@ -851,7 +686,6 @@ from beaker.cache import CacheManager from beaker.util import parse_cache_config_options from beaker.middleware import SessionMiddleware -# Instantiate Flask extensions db = SQLAlchemy() csrf_protect = CSRFProtect() mail = Mail() @@ -859,50 +693,30 @@ migrate = Migrate() def get_config(): - # Instantiate Flask app = Flask(__name__) - # Load App Config settings - # Load common settings from 'app/settings.py' file app.config.from_object('app.settings') - # Load local settings from environmental variable if 'APPLICATION_SETTINGS' in os.environ: + app.config.from_envvar(os.environ['APPLICATION_SETTINGS']) + if 'AWS_SECRETS_MANAGER_CONFIG' in os.environ: ## ... source file abbreviated to get to session examples ... - cache_opts['cache.data_dir'] = app.config['CACHE_ROOT'] + '/data' - cache_opts['cache.lock_dir'] = app.config['CACHE_ROOT'] + '/lock' - - if 'CACHE_URL' in app.config and app.config['CACHE_URL']: - cache_opts['cache.url'] = app.config['CACHE_URL'] - - - cache = CacheManager(**parse_cache_config_options(cache_opts)) - - -def init_session_manager(app): - session_opts = {'cache.expire': 3600} - - if 'CACHE_TYPE' not in app.config or not app.config['CACHE_TYPE']: - app.config['CACHE_TYPE'] = 'file' - - if app.config['CACHE_TYPE'] == 'file': - if 'CACHE_ROOT' not in app.config or not app.config['CACHE_ROOT']: app.config['CACHE_ROOT'] = '/tmp/%s' % __name__ -~~ session_opts['session.type'] = app.config['CACHE_TYPE'] + session_opts['session.type'] = app.config['CACHE_TYPE'] if 'CACHE_ROOT' in app.config and app.config['CACHE_ROOT']: -~~ session_opts['session.data_dir'] = app.config['CACHE_ROOT'] + '/session' + session_opts['session.data_dir'] = app.config['CACHE_ROOT'] + '/session' if 'CACHE_URL' in app.config and app.config['CACHE_URL']: -~~ session_opts['session.url'] = app.config['CACHE_URL'] + session_opts['session.url'] = app.config['CACHE_URL'] -~~ session_opts['session.auto'] = app.config.get('SESSION_AUTO', True) -~~ session_opts['session.cookie_expires'] = app.config.get('SESSION_COOKIE_EXPIRES', 86400) -~~ session_opts['session.secret'] = app.secret_key + session_opts['session.auto'] = app.config.get('SESSION_AUTO', True) + session_opts['session.cookie_expires'] = app.config.get('SESSION_COOKIE_EXPIRES', 86400) + session_opts['session.secret'] = app.secret_key class BeakerSessionInterface(SessionInterface): def open_session(self, app, request): @@ -946,6 +760,5 @@ def init_error_handlers(app): ## ... source file continues with no further session examples... - ``` diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 89789ade5..6174d3246 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -54,13 +54,18 @@ def get_first_last_name(fullname): class BaseRegisterUser(PublicFormView): - """ - Make your own user registration view and inherit from this class if you + + route_base = "/register" ## ... source file abbreviated to get to flash examples ... + self.email_template, + url=url, + username=register_user.username, + first_name=register_user.first_name, + last_name=register_user.last_name, ) msg.recipients = [register_user.email] try: @@ -71,11 +76,6 @@ class BaseRegisterUser(PublicFormView): return True def add_registration(self, username, first_name, last_name, email, password=""): - """ - Add a registration request for the user. - - :rtype : RegisterUser - """ register_user = self.appbuilder.sm.add_register_user( username, first_name, last_name, email, password ) @@ -90,11 +90,6 @@ class BaseRegisterUser(PublicFormView): @expose("/activation/") def activation(self, activation_hash): - """ - Endpoint to expose an activation url, this url - is sent to the user by email, when accessed the user is inserted - and activated - """ reg = self.appbuilder.sm.find_register_user(activation_hash) if not reg: log.error(c.LOGMSG_ERR_SEC_NO_REGISTER_HASH.format(activation_hash)) @@ -134,12 +129,13 @@ class BaseRegisterUser(PublicFormView): class RegisterUserDBView(BaseRegisterUser): - """ + ## ... source file abbreviated to get to flash examples ... + ) resp = session.pop("oid_resp", None) if resp: self._init_vars() @@ -151,7 +147,6 @@ class RegisterUserDBView(BaseRegisterUser): form.last_name.data = last_name form.email.data = resp.email widgets = self._get_edit_widget(form=form) - # self.update_redirect() return self.render_template( self.form_template, title=self.form_title, @@ -164,9 +159,6 @@ class RegisterUserDBView(BaseRegisterUser): return redirect(self.get_redirect()) def oid_login_handler(self, f, oid): - """ - Hackish method to make use of oid.login_handler decorator. - """ if request.args.get("openid_complete") != u"yes": return f(False) consumer = Consumer(SessionWrapper(self), oid.store_factory()) @@ -182,13 +174,15 @@ class RegisterUserDBView(BaseRegisterUser): return redirect(oid.get_current_url()) def after_login(self, resp): - """ - Method that adds the return OpenID response object on the session - this session key will be deleted + session["oid_resp"] = resp + def form_get(self, form): + self.add_form_unique_validations(form) + + def form_post(self, form): -## ... source file continues with no further flash examples... +## ... source file continues with no further flash examples... ``` @@ -207,16 +201,7 @@ FlaskBB is provided as open source ```python # plugins.py -# -*- coding: utf-8 -*- -""" - flaskbb.auth.plugins - -------------------- - Plugin implementations for FlaskBB auth hooks - - :copyright: (c) 2014-2018 the FlaskBB Team. - :license: BSD, see LICENSE for more details -""" -from flask import flash, redirect, url_for +~~from flask import flash, redirect, url_for from flask_login import current_user, logout_user from . import impl @@ -237,6 +222,10 @@ from .services.reauthentication import ( MarkFailedReauth, ) from .services.registration import ( + AutoActivateUserPostProcessor, + AutologinPostProcessor, + EmailUniquenessValidator, + SendActivationPostProcessor, ## ... source file abbreviated to get to flash examples ... @@ -291,7 +280,6 @@ def flaskbb_registration_post_processor(user): ## ... source file continues with no further flash examples... - ``` @@ -306,17 +294,7 @@ is configured in JSON. The code is provided as open source under the ```python # charts_builder.py -# -*- coding: utf-8 -*- - -""" -flask_jsondash.charts_builder ------------------------------ - -The chart blueprint that houses all functionality. -:copyright: (c) 2016 by Chris Tabor. -:license: MIT, see LICENSE for more details. -""" import json import os @@ -341,19 +319,20 @@ from flask_jsondash.schema import ( TEMPLATE_DIR = os.path.dirname(templates.__file__) STATIC_DIR = os.path.dirname(static.__file__) -# Internally required libs that are also shared in `settings.py` -# for charts. These follow the same format as what is loaded in -# `get_active_assets` so that shared libraries are loaded in the same manner -# for simplicty and prevention of duplicate loading. -# Note these are just LABELS, not files. REQUIRED_STATIC_FAMILES = ['D3'] charts = Blueprint( + 'jsondash', + __name__, + template_folder=TEMPLATE_DIR, + static_url_path=STATIC_DIR, + static_folder=STATIC_DIR, ## ... source file abbreviated to get to flash examples ... + pagination = None categorized = utils.categorize_views(views) kwargs = dict( total=len(views), @@ -372,7 +351,6 @@ charts = Blueprint( @charts.route('/charts/', methods=['GET']) def view(c_id): - """Load a json view config from the DB.""" if not auth(authtype='view', view_id=c_id): ~~ flash('You do not have access to view this dashboard.', 'error') return redirect(url_for('jsondash.dashboard')) @@ -380,23 +358,17 @@ def view(c_id): if not viewjson: ~~ flash('Could not find view: {}'.format(c_id), 'error') return redirect(url_for('jsondash.dashboard')) - # Remove _id, it's not JSON serializeable. if '_id' in viewjson: viewjson.pop('_id') if 'modules' not in viewjson: ~~ flash('Invalid configuration - missing modules.', 'error') return redirect(url_for('jsondash.dashboard')) - # Chart family is encoded in chart type value for lookup. active_charts = [v.get('family') for v in viewjson['modules'] if v.get('family') is not None] - # If the logged in user is also the creator of this dashboard, - # let me edit it. Otherwise, defer to any user-supplied auth function - # for this specific view. if metadata(key='username') == viewjson.get('created_by'): can_edit = True else: can_edit = auth(authtype='edit_others', view_id=c_id) - # Backwards compatible layout type layout_type = viewjson.get('layout', 'freeform') kwargs = dict( id=c_id, @@ -416,7 +388,6 @@ def view(c_id): @charts.route('/charts//delete', methods=['POST']) def delete(c_id): - """Delete a json dashboard config.""" dash_url = url_for('jsondash.dashboard') if not auth(authtype='delete'): ~~ flash('You do not have access to delete dashboards.', 'error') @@ -428,7 +399,6 @@ def delete(c_id): @charts.route('/charts//update', methods=['POST']) def update(c_id): - """Normalize the form POST and setup the json view config object.""" if not auth(authtype='update'): ~~ flash('You do not have access to update dashboards.', 'error') return redirect(url_for('jsondash.dashboard')) @@ -454,7 +424,6 @@ def update(c_id): else: modules = db.format_charts(form_data) layout = form_data['mode'] - # Disallow any values if they would cause an invalid layout. if layout == 'grid' and modules and modules[0].get('row') is None: ~~ flash('Cannot use grid layout without ' 'specifying row(s)! Edit JSON manually ' @@ -471,12 +440,8 @@ def update(c_id): id=c_id, date=now, ) - # Update metadata, but exclude some fields that should never - # be overwritten by user, once the view has been created. data.update(**metadata(exclude=['created_by'])) - # Possibly override global user, if configured and valid. data.update(**check_global()) - # Update db if edit_raw: adapter.update(c_id, data=data, fmt_charts=False) else: @@ -486,14 +451,6 @@ def update(c_id): def check_global(): - """Allow overriding of the user by making it global. - - This also checks if the setting is enabled for the app, - otherwise it will not allow it. - - Returns: - dict: A dictionary with certain global flags overriden. - """ global_enabled = setting('JSONDASH_GLOBALDASH') global_flag = request.form.get('is_global') is not None can_make_global = auth(authtype='edit_global') @@ -504,7 +461,6 @@ def check_global(): @charts.route('/charts/create', methods=['POST']) def create(): - """Normalize the form POST and setup the json view config object.""" if not auth(authtype='create'): ~~ flash('You do not have access to create dashboards.', 'error') return redirect(url_for('jsondash.dashboard')) @@ -518,9 +474,7 @@ def create(): layout=data.get('mode', 'grid'), ) d.update(**metadata()) - # Possibly override global user, if configured and valid. d.update(**check_global()) - # Add to DB adapter.create(data=d) ~~ flash('Created new dashboard "{}"'.format(data['name'])) return redirect(url_for('jsondash.view', c_id=new_id)) @@ -528,7 +482,6 @@ def create(): @charts.route('/charts//clone', methods=['POST']) def clone(c_id): - """Clone a json view config from the DB.""" if not auth(authtype='clone'): ~~ flash('You do not have access to clone dashboards.', 'error') return redirect(url_for('jsondash.dashboard')) @@ -536,7 +489,6 @@ def clone(c_id): if not viewjson: ~~ flash('Could not find view: {}'.format(c_id), 'error') return redirect(url_for('jsondash.dashboard')) - # Update some fields. newname = 'Clone of {}'.format(viewjson['name']) data = dict( name=newname, @@ -546,14 +498,13 @@ def clone(c_id): layout=viewjson['layout'], ) data.update(**metadata()) - # Add to DB adapter.create(data=data) ~~ flash('Created new dashboard clone "{}"'.format(newname)) return redirect(url_for('jsondash.view', c_id=data['id'])) -## ... source file continues with no further flash examples... +## ... source file continues with no further flash examples... ``` @@ -573,12 +524,6 @@ open sourced under the ```python # login_manager.py -# -*- coding: utf-8 -*- -''' - flask_login.login_manager - ------------------------- - The LoginManager class. -''' import warnings @@ -603,22 +548,22 @@ from .utils import (login_url as make_login_url, _create_identifier, class LoginManager(object): - '''This object is used to hold the settings used for logging in. Instances - of :class:`LoginManager` are *not* bound to specific apps, so you can - create one in the main body of your code and then bind it to your - app in a factory function. - ''' def __init__(self, app=None, add_context_processor=True): + self.anonymous_user = AnonymousUserMixin + + self.login_view = None + + self.blueprint_login_views = {} ## ... source file abbreviated to get to flash examples ... - raise a HTTP 401 (Unauthorized) error instead. - This should be returned from a view or before/after_request function, - otherwise the redirect will have no effect. - ''' + if add_context_processor: + app.context_processor(_user_context_processor) + + def unauthorized(self): user_unauthorized.send(current_app._get_current_object()) if self.unauthorized_callback: @@ -651,32 +596,32 @@ class LoginManager(object): return redirect(redirect_url) def user_loader(self, callback): - ''' - This sets the callback for reloading a user from the session. The - function you set should take a user ID (a ``unicode``) and return a - user object, or ``None`` if the user does not exist. - - :param callback: The callback for retrieving a user object. - :type callback: callable - ''' self._user_callback = callback return self.user_callback + @property + def user_callback(self): + return self._user_callback + + def request_loader(self, callback): + self._request_callback = callback + return self.request_callback + ## ... source file abbreviated to get to flash examples ... - they were attempting to access will be passed in the ``next`` - query string variable, so you can redirect there if present - instead of the homepage.) - If :attr:`LoginManager.refresh_view` is not defined, then it will - simply raise a HTTP 401 (Unauthorized) error instead. + def unauthorized_handler(self, callback): + self.unauthorized_callback = callback + return callback - This should be returned from a view or before/after_request function, - otherwise the redirect will have no effect. - ''' + def needs_refresh_handler(self, callback): + self.needs_refresh_callback = callback + return callback + + def needs_refresh(self): user_needs_refresh.send(current_app._get_current_object()) if self.needs_refresh_callback: @@ -706,20 +651,19 @@ class LoginManager(object): return redirect(redirect_url) def header_loader(self, callback): - ''' - This function has been deprecated. Please use - :meth:`LoginManager.request_loader` instead. + print('LoginManager.header_loader is deprecated. Use ' + + 'LoginManager.request_loader instead.') + self._header_callback = callback + return callback - This sets the callback for loading a user from a header value. - The function you set should take an authentication token and - return a user object, or `None` if the user does not exist. + def _update_request_context_with_user(self, user=None): - :param callback: The callback for retrieving a user object. + ctx = _request_ctx_stack.top + ctx.user = self.anonymous_user() if user is None else user ## ... source file continues with no further flash examples... - ``` @@ -739,7 +683,6 @@ The project's code is provided as open source under the ```python # misc_views.py -# Copyright 2017 Twin Tech Labs. All rights reserved from flask import Blueprint, redirect, render_template, current_app, abort ~~from flask import request, url_for, flash, send_from_directory, jsonify, render_template_string @@ -751,22 +694,22 @@ from app.utils.forms import ConfirmationForm import uuid, json, os import datetime -# When using a Flask app factory we must use a blueprint to avoid needing 'app' for '@app.route' main_blueprint = Blueprint('main', __name__, template_folder='templates') -# The User page is accessible to authenticated users (users that have logged in) @main_blueprint.route('/') def member_page(): if not current_user.is_authenticated: return redirect(url_for('user.login')) return render_template('pages/member_base.html') -# The Admin page is accessible to users with the 'admin' role @main_blueprint.route('/admin') @roles_accepted('admin') def admin_page(): return redirect(url_for('main.user_admin_page')) +@main_blueprint.route('/users') +@roles_accepted('admin') +def user_admin_page(): ## ... source file abbreviated to get to flash examples ... @@ -860,23 +803,22 @@ def user_profile_page(): if current_app.config.get('USER_LDAP', False): abort(400) - # Initialize form form = UserProfileForm(request.form, obj=current_user) - # Process valid POST if request.method == 'POST' and form.validate(): - # Copy form fields to user_profile fields form.populate_obj(current_user) - # Save user_profile db.session.commit() - # Redirect to home page return redirect(url_for('main.user_profile_page')) + return render_template('pages/user_profile_page.html', + current_user=current_user, + form=form) + -## ... source file continues with no further flash examples... +## ... source file continues with no further flash examples... ``` diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index a597abfc6..25d5144d1 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -45,16 +45,16 @@ log = logging.getLogger(__name__) def protect(allow_browser_login=False): - """ - Use this decorator to enable granular security permissions - to your API methods (BaseApi and child classes). - Permissions will be associated to a role, and roles are associated to users. - allow_browser_login will accept signed cookies obtained from the normal MVC app:: + def _protect(f): + if hasattr(f, "_permission_name"): + permission_str = f._permission_name + else: + permission_str = f.__name__ - class MyApi(BaseApi): - @expose('/dosonmething', methods=['GET']) - @protect(allow_browser_login=True) + def wraps(self, *args, **kwargs): + permission_str = "{}{}".format(PERMISSION_PREFIX, f._permission_name) + if self.method_permission_name: ## ... source file abbreviated to get to make_response examples ... @@ -94,21 +94,16 @@ def protect(allow_browser_login=False): def permission_name(name): - """ - Use this decorator to override the name of the permission. - has_access will use the methods name has the permission name - if you want to override this add this decorator to your methods. - This is useful if you want to aggregate methods to permissions - It will add '_permission_name' attribute to your method - that will be inspected by BaseView to collect your view's - permissions. + def wraps(f): + f._permission_name = name + return f - Note that you should use @has_access to execute after @permission_name + return wraps -## ... source file continues with no further make_response examples... +## ... source file continues with no further make_response examples... ``` @@ -128,7 +123,6 @@ Flask RESTX is provided as open source under the ```python # cors.py -# -*- coding: utf-8 -*- from __future__ import unicode_literals from datetime import timedelta @@ -146,9 +140,6 @@ def crossdomain( automatic_options=True, credentials=False, ): - """ - http://flask.pocoo.org/snippets/56/ - """ if methods is not None: methods = ", ".join(sorted(x.upper() for x in methods)) if headers is not None and not isinstance(headers, str): @@ -195,8 +186,8 @@ def crossdomain( return decorator -## ... source file continues with no further make_response examples... +## ... source file continues with no further make_response examples... ``` @@ -213,13 +204,6 @@ NewsPie is provided as open source under the ```python # news.py -# -*- coding: utf-8 -*- -''' -NewsPie - a minimalistic news aggregator built with Flask and powered by -News API (https://newsapi.org/). - -Created by @skamieniarz (https://github.com/skamieniarz) in 2019. -''' import configparser import json import logging @@ -258,6 +242,7 @@ def root(): ## ... source file abbreviated to get to make_response examples ... + pages = count_pages(response.json()) if page > pages: page = pages return redirect(url_for('search', query=query, page=page)) @@ -270,7 +255,6 @@ def root(): def do_post(page, category='general', current_query=None): - ''' Helper method that handles POST request basing on the input. ''' new_query = request.form.get('search_query') country = request.form.get('country') next_page = request.form.get('next_page') @@ -292,22 +276,21 @@ def do_post(page, category='general', current_query=None): def parse_articles(response): - ''' Parses articles fetched from News API. - - Returns: - A list of dicts containing publishing date, title, URL and source of - articles. - ''' parsed_articles = [] if response.get('status') == 'ok': for article in response.get('articles'): parsed_articles.append({ 'published_at': + parser.isoparse(article['publishedAt'] + ).strftime('%Y-%m-%d %H:%M'), + 'title': + article['title'], + 'url': + article['url'], ## ... source file continues with no further make_response examples... - ``` @@ -331,30 +314,18 @@ The sandman2 project is provided under the ```python # service.py -"""Automatically generated REST API services from SQLAlchemy -ORM models or a database introspection.""" -# Third-party imports ~~from flask import request, make_response import flask from flask.views import MethodView from sqlalchemy import asc, desc -# Application imports from sandman2.exception import NotFoundException, BadRequestException from sandman2.model import db from sandman2.decorators import etag, validate_fields def add_link_headers(response, links): - """Return *response* with the proper link headers set, based on the contents - of *links*. - - :param response: :class:`flask.Response` response object for links to be - added - :param dict links: Dictionary of links to be added - :rtype :class:`flask.Response` : - """ link_string = '<{}>; rel=self'.format(links['self']) for link in links.values(): link_string += ', <{}>; rel=related'.format(link) @@ -362,9 +333,22 @@ def add_link_headers(response, links): return response +def jsonify(resource): + + response = flask.jsonify(resource.to_dict()) + response = add_link_headers(response, resource.links()) + return response + + + + ## ... source file abbreviated to get to make_response examples ... + order.append(direction(getattr(self.__model__, value.lstrip('-')))) + elif key == 'limit': + limit = int(value) + elif hasattr(self.__model__, key): filters.append(getattr(self.__model__, key) == value) else: raise BadRequestException('Invalid field [{}]'.format(key)) @@ -377,10 +361,6 @@ def add_link_headers(response, links): return [r.to_dict() for r in resources] def _export(self, collection): - """Return a CSV of the resources in *collection*. - - :param list collection: A list of resources represented by dicts - """ fieldnames = collection[0].keys() faux_csv = ','.join(fieldnames) + '\r\n' for resource in collection: @@ -392,27 +372,19 @@ def add_link_headers(response, links): @staticmethod def _no_content_response(): - """Return an HTTP 204 "No Content" response. - - :returns: HTTP Response - """ - response = make_response() +~~ response = make_response() response.status_code = 204 return response @staticmethod def _created_response(resource): - """Return an HTTP 201 "Created" response. - - :returns: HTTP Response - """ response = jsonify(resource) response.status_code = 201 return response -## ... source file continues with no further make_response examples... +## ... source file continues with no further make_response examples... ``` diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 18c605bb5..e9953e153 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -83,7 +83,6 @@ class Menu(object): ## ... source file continues with no further url_for examples... - ``` @@ -101,16 +100,6 @@ FlaskBB is provided as open source ```python # markup.py -# -*- coding: utf-8 -*- -""" - flaskbb.utils.markup - -------------------- - - A module for all markup related stuff. - - :copyright: (c) 2016 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" import logging import re @@ -140,15 +129,11 @@ def userify(match): class FlaskBBRenderer(mistune.Renderer): - """Markdown with some syntactic sugar, such as @user gettting linked - to the user's profile. - """ def __init__(self, **kwargs): super(FlaskBBRenderer, self).__init__(**kwargs) def paragraph(self, text): - """Render paragraph tags, autolinking user handles.""" text = _re_user.sub(userify, text) return super(FlaskBBRenderer, self).paragraph(text) @@ -158,11 +143,14 @@ class FlaskBBRenderer(mistune.Renderer): try: lexer = get_lexer_by_name(lang, stripall=True) except ClassNotFound: + lexer = None + else: + lexer = None + if not lexer: ## ... source file continues with no further url_for examples... - ``` @@ -193,7 +181,6 @@ from wtforms.compat import text_type def register_template_utils(app): - """Register Jinja 2 helpers (called from __init__.py).""" @app.template_test() def equalto(value, other): @@ -232,8 +219,8 @@ class CustomSelectField(Field): self.data = '' -## ... source file continues with no further url_for examples... +## ... source file continues with no further url_for examples... ``` @@ -279,9 +266,6 @@ class DebugToolbar(object): self.create_panels() def create_panels(self): - """ - Populate debug panels - """ activated = self.request.cookies.get('fldt_active', '') activated = unquote(activated).split(';') @@ -298,119 +282,17 @@ class DebugToolbar(object): context = self.template_context.copy() context.update({'panels': self.panels}) + template = self.jinja_env.get_template('base.html') + return template.render(**context) -## ... source file continues with no further url_for examples... - - -``` - - -## Example 5 from flaskex -[Flaskex](https://github.com/anfederico/Flaskex) is a working example -[Flask](/flask.html) web application intended as a base to build your -own applications upon. The application comes with pre-built sign up, log in -and related screens, as well as a database backend. Flaskex is provided -as open source under the -[MIT license](https://github.com/anfederico/Flaskex/blob/master/LICENSE.txt). - -[**flaskex / app.py**](https://github.com/anfederico/Flaskex/blob/master/././app.py) - -```python -# app.py -# -*- coding: utf-8 -*- - -from scripts import tabledef -from scripts import forms -from scripts import helpers -~~from flask import Flask, redirect, url_for, render_template, request, session -import json -import sys -import os - -app = Flask(__name__) -app.secret_key = os.urandom(12) # Generic key for dev purposes only - -# Heroku -#from flask_heroku import Heroku -#heroku = Heroku(app) - -# ======== Routing =========================================================== # -# -------- Login ------------------------------------------------------------- # -@app.route('/', methods=['GET', 'POST']) -def login(): - if not session.get('logged_in'): - form = forms.LoginForm(request.form) - if request.method == 'POST': - username = request.form['username'].lower() - password = request.form['password'] - if form.validate(): - if helpers.credentials_valid(username, password): - session['logged_in'] = True - session['username'] = username - return json.dumps({'status': 'Login successful'}) - return json.dumps({'status': 'Invalid user/pass'}) - return json.dumps({'status': 'Both fields required'}) - return render_template('login.html', form=form) - user = helpers.get_user() - return render_template('home.html', user=user) - - -@app.route("/logout") -def logout(): - session['logged_in'] = False -~~ return redirect(url_for('login')) - - -# -------- Signup ---------------------------------------------------------- # -@app.route('/signup', methods=['GET', 'POST']) -def signup(): - if not session.get('logged_in'): - form = forms.LoginForm(request.form) - if request.method == 'POST': - username = request.form['username'].lower() - password = helpers.hash_password(request.form['password']) - email = request.form['email'] - if form.validate(): - if not helpers.username_taken(username): - helpers.add_user(username, password, email) - session['logged_in'] = True - session['username'] = username - return json.dumps({'status': 'Signup successful'}) - return json.dumps({'status': 'Username taken'}) - return json.dumps({'status': 'User/Pass required'}) - return render_template('login.html', form=form) -~~ return redirect(url_for('login')) - - -# -------- Settings ---------------------------------------------------------- # -@app.route('/settings', methods=['GET', 'POST']) -def settings(): - if session.get('logged_in'): - if request.method == 'POST': - password = request.form['password'] - if password != "": - password = helpers.hash_password(password) - email = request.form['email'] - helpers.change_user(password=password, email=email) - return json.dumps({'status': 'Saved'}) - user = helpers.get_user() - return render_template('settings.html', user=user) -~~ return redirect(url_for('login')) - - -# ======== Main ============================================================== # -if __name__ == "__main__": - app.run(debug=True, use_reloader=True, host="0.0.0.0") - ## ... source file continues with no further url_for examples... - ``` -## Example 6 from flask-login +## Example 5 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -425,12 +307,6 @@ open sourced under the ```python # utils.py -# -*- coding: utf-8 -*- -''' - flask_login.utils - ----------------- - General utilities. -''' import hmac @@ -448,28 +324,27 @@ from .config import COOKIE_NAME, EXEMPT_METHODS from .signals import user_logged_in, user_logged_out, user_login_confirmed -#: A proxy for the current user. If no user is logged in, this will be an -#: anonymous user current_user = LocalProxy(lambda: _get_user()) def encode_cookie(payload, key=None): - ''' - This will encode a ``unicode`` value into a cookie, and sign that cookie - with the app's secret key. - - :param payload: The value to encode, as `unicode`. - :type payload: unicode + return u'{0}|{1}'.format(payload, _cookie_digest(payload, key=key)) - :param key: The key to use when creating the cookie digest. If not - specified, the SECRET_KEY value from app config will be used. - :type key: str - ''' +def decode_cookie(cookie, key=None): + try: + payload, digest = cookie.rsplit(u'|', 1) + if hasattr(digest, 'decode'): + digest = digest.decode('ascii') # pragma: no cover + except ValueError: + return -## ... source file abbreviated to get to url_for examples ... + if safe_str_cmp(_cookie_digest(payload, key=key), digest): + return payload +def make_next_param(login_url, current_url): + l_url = urlparse(login_url) c_url = urlparse(current_url) if (not l_url.scheme or l_url.scheme == c_url.scheme) and \ @@ -479,13 +354,6 @@ def encode_cookie(payload, key=None): def expand_login_view(login_view): - ''' - Returns the url for the login view, expanding the view name to a url if - needed. - - :param login_view: The name of the login view or a URL for the login view. - :type login_view: str - ''' if login_view.startswith(('https://', 'http://', '/')): return login_view else: @@ -496,94 +364,35 @@ def expand_login_view(login_view): def login_url(login_view, next_url=None, next_field='next'): - ''' - Creates a URL for redirecting to a login page. If only `login_view` is - provided, this will just return the URL for it. If `next_url` is provided, - however, this will append a ``next=URL`` parameter to the query string - so that the login view can redirect back to that URL. Flask-Login's default - unauthorized handler uses this function when redirecting to your login url. - To force the host name used, set `FORCE_HOST_FOR_REDIRECTS` to a host. This - prevents from redirecting to external sites if request headers Host or - X-Forwarded-For are present. - - :param login_view: The name of the login view. (Alternately, the actual - URL to the login view.) - :type login_view: str - :param next_url: The URL to give the login view for redirection. - :type next_url: str - :param next_field: What field to store the next URL in. (It defaults to - ``next``.) - :type next_field: str - ''' base = expand_login_view(login_view) + if next_url is None: + return base + parsed_result = urlparse(base) + md = url_decode(parsed_result.query) + md[next_field] = make_next_param(base, next_url) + netloc = current_app.config.get('FORCE_HOST_FOR_REDIRECTS') or \ + parsed_result.netloc + parsed_result = parsed_result._replace(netloc=netloc, + query=url_encode(md, sort=True)) + return urlunparse(parsed_result) -## ... source file continues with no further url_for examples... - - -``` - - -## Example 7 from flask-phone-input -[flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) -is an example application that ties together the -[intTellInput.js](https://github.com/jackocnr/intl-tel-input) -JavaScript plugin with the -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) form-handling -library. flask-phone-input is provided as open source under the -[MIT license](https://github.com/miguelgrinberg/flask-phone-input/blob/1a1c227c044474ce0fe133493d7f8b0fb8312409/LICENSE). - -[**flask-phone-input / app.py**](https://github.com/miguelgrinberg/flask-phone-input/blob/master/././app.py) - -```python -# app.py -~~from flask import Flask, render_template, session, redirect, url_for -from flask_bootstrap import Bootstrap -from flask_wtf import FlaskForm -import phonenumbers -from wtforms import StringField, SubmitField -from wtforms.validators import DataRequired, ValidationError - -app = Flask(__name__) -app.config['SECRET_KEY'] = 'top-secret!' -Bootstrap(app) - - -class PhoneForm(FlaskForm): - phone = StringField('Phone', validators=[DataRequired()]) - submit = SubmitField('Submit') - def validate_phone(self, phone): - try: - p = phonenumbers.parse(phone.data) - if not phonenumbers.is_valid_number(p): - raise ValueError() - except (phonenumbers.phonenumberutil.NumberParseException, ValueError): - raise ValidationError('Invalid phone number') - - -@app.route('/', methods=['GET', 'POST']) -def index(): - form = PhoneForm() - if form.validate_on_submit(): - session['phone'] = form.phone.data -~~ return redirect(url_for('show_phone')) - return render_template('index.html', form=form) +def login_fresh(): + return session.get('_fresh', False) -@app.route('/showphone') -def show_phone(): - return render_template('show_phone.html', phone=session['phone']) +def login_user(user, remember=False, duration=None, force=False, fresh=True): + if not force and not user.is_active: ## ... source file continues with no further url_for examples... - ``` -## Example 8 from flask-restx +## Example 6 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -598,17 +407,12 @@ Flask RESTX is provided as open source under the ```python # apidoc.py -# -*- coding: utf-8 -*- from __future__ import unicode_literals ~~from flask import url_for, Blueprint, render_template class Apidoc(Blueprint): - """ - Allow to know if the blueprint has already been registered - until https://github.com/mitsuhiko/flask/pull/1301 is merged - """ def __init__(self, *args, **kwargs): self.registered = False @@ -634,17 +438,16 @@ def swagger_static(filename): def ui_for(api): - """Render a SwaggerUI for a given API""" return render_template("swagger-ui.html", title=api.title, specs_url=api.specs_url) -## ... source file continues with no further url_for examples... +## ... source file continues with no further url_for examples... ``` -## Example 9 from flaskSaaS +## Example 7 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -666,7 +469,6 @@ from itsdangerous import URLSafeTimedSerializer from app import app, models, db from app.forms import user as user_forms from app.toolbox import email -# Setup Stripe integration import stripe import json from json import dumps @@ -678,21 +480,15 @@ stripe_keys = { stripe.api_key = stripe_keys['secret_key'] -# Serializer for generating random tokens ts = URLSafeTimedSerializer(app.config['SECRET_KEY']) -# Create a user blueprint userbp = Blueprint('userbp', __name__, url_prefix='/user') - -## ... source file abbreviated to get to url_for examples ... - - +@userbp.route('/signup', methods=['GET', 'POST']) def signup(): form = user_forms.SignUp() if form.validate_on_submit(): - # Create a user who hasn't validated his email address user = models.User( first_name=form.first_name.data, last_name=form.last_name.data, @@ -701,23 +497,16 @@ def signup(): confirmation=False, password=form.password.data, ) - # Insert the user in the database db.session.add(user) db.session.commit() - # Subject of the confirmation email subject = 'Please confirm your email address.' - # Generate a random token token = ts.dumps(user.email, salt='email-confirm-key') - # Build a confirm link with token ~~ confirmUrl = url_for('userbp.confirm', token=token, _external=True) - # Render an HTML template to send by email html = render_template('email/confirm.html', confirm_url=confirmUrl) - # Send the email to user email.send(user.email, subject, html) - # Send back to the home page flash('Check your emails to confirm your email address.', 'positive') -~~ return redirect(url_for('index')) + return redirect(url_for('index')) return render_template('user/signup.html', form=form, title='Sign up') @@ -725,53 +514,27 @@ def signup(): def confirm(token): try: email = ts.loads(token, salt='email-confirm-key', max_age=86400) - # The token can either expire or be invalid except: abort(404) - # Get the user from the database user = models.User.query.filter_by(email=email).first() - # The user has confirmed his or her email address user.confirmation = True - # Update the database with the user db.session.commit() - # Send to the signin page flash( 'Your email address has been confirmed, you can sign in.', 'positive') -~~ return redirect(url_for('userbp.signin')) + return redirect(url_for('userbp.signin')) @userbp.route('/signin', methods=['GET', 'POST']) def signin(): - form = user_forms.Login() - if form.validate_on_submit(): - user = models.User.query.filter_by(email=form.email.data).first() - # Check the user exists - if user is not None: - # Check the password is correct - if user.check_password(form.password.data): - #Check if email is confirmed - if user.confirmation == True: - login_user(user) - # Send back to the home page - flash('Succesfully signed in.', 'positive') -~~ return redirect(url_for('userbp.account')) - else: - flash('Confirm your email address first.', 'negative') -~~ return redirect(url_for('userbp.signin')) - else: - flash('The password you have entered is wrong.', 'negative') -~~ return redirect(url_for('userbp.signin')) - else: - flash('Unknown email address.', 'negative') -~~ return redirect(url_for('userbp.signin')) - return render_template('user/signin.html', form=form, title='Sign in') -@userbp.route('/signout') +## ... source file abbreviated to get to url_for examples ... + + def signout(): logout_user() flash('Succesfully signed out.', 'positive') -~~ return redirect(url_for('index')) + return redirect(url_for('index')) @userbp.route('/account') @@ -785,24 +548,17 @@ def forgot(): form = user_forms.Forgot() if form.validate_on_submit(): user = models.User.query.filter_by(email=form.email.data).first() - # Check the user exists if user is not None: - # Subject of the confirmation email subject = 'Reset your password.' - # Generate a random token token = ts.dumps(user.email, salt='password-reset-key') - # Build a reset link with token ~~ resetUrl = url_for('userbp.reset', token=token, _external=True) - # Render an HTML template to send by email html = render_template('email/reset.html', reset_url=resetUrl) - # Send the email to user email.send(user.email, subject, html) - # Send back to the home page flash('Check your emails to reset your password.', 'positive') -~~ return redirect(url_for('index')) + return redirect(url_for('index')) else: flash('Unknown email address.', 'negative') -~~ return redirect(url_for('userbp.forgot')) + return redirect(url_for('userbp.forgot')) return render_template('user/forgot.html', form=form) @@ -810,56 +566,24 @@ def forgot(): def reset(token): try: email = ts.loads(token, salt='password-reset-key', max_age=86400) - # The token can either expire or be invalid except: abort(404) form = user_forms.Reset() if form.validate_on_submit(): user = models.User.query.filter_by(email=email).first() - # Check the user exists if user is not None: user.password = form.password.data - # Update the database with the user db.session.commit() - # Send to the signin page flash('Your password has been reset, you can sign in.', 'positive') -~~ return redirect(url_for('userbp.signin')) - else: - flash('Unknown email address.', 'negative') -~~ return redirect(url_for('userbp.forgot')) - return render_template('user/reset.html', form=form, token=token) - -@app.route('/user/pay') -@login_required -def pay(): - user = models.User.query.filter_by(email=current_user.email).first() - if user.paid == 0: - return render_template('user/buy.html', key=stripe_keys['publishable_key'], email=current_user.email) - return "You already paid." - -@app.route('/user/charge', methods=['POST']) -@login_required -def charge(): - # Amount in cents - amount = 500 - customer = stripe.Customer.create(email=current_user.email, source=request.form['stripeToken']) - charge = stripe.Charge.create( - customer=customer.id, - amount=amount, - currency='usd', - description='Service Plan' - ) - user = models.User.query.filter_by(email=current_user.email).first() - user.paid = 1 + return redirect(url_for('userbp.signin')) ## ... source file continues with no further url_for examples... - ``` -## Example 10 from Flasky +## Example 8 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1043,182 +767,8 @@ class Comment(db.Model): db.event.listen(Comment.body, 'set', Comment.on_changed_body) -## ... source file continues with no further url_for examples... - - -``` - - -## Example 11 from tedivms-flask -[tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a -base of [Flask](/flask.html) code and related projects such as -[Celery](/celery.html) which provides a template to start your own -Flask web app. The project comes baked with an admin panel, -[API authentication and authorization](/application-programming-interfaces.html), -[SQLAlchemy](/sqlalchemy.html) and many other common libraries that are -often used with Flask. - -The project's code is provided as open source under the -[BSD 2-Clause "Simplified" license](https://github.com/tedivm/tedivms-flask/blob/master/LICENSE.txt). - -[**tedivms-flask / app / views / misc_views.py**](https://github.com/tedivm/tedivms-flask/blob/master/app/views/misc_views.py) - -```python -# misc_views.py -# Copyright 2017 Twin Tech Labs. All rights reserved - -from flask import Blueprint, redirect, render_template, current_app, abort -~~from flask import request, url_for, flash, send_from_directory, jsonify, render_template_string -from flask_user import current_user, login_required, roles_accepted - -from app import db -from app.models.user_models import UserProfileForm, User, UsersRoles, Role -from app.utils.forms import ConfirmationForm -import uuid, json, os -import datetime - -# When using a Flask app factory we must use a blueprint to avoid needing 'app' for '@app.route' -main_blueprint = Blueprint('main', __name__, template_folder='templates') - -# The User page is accessible to authenticated users (users that have logged in) -@main_blueprint.route('/') -def member_page(): - if not current_user.is_authenticated: -~~ return redirect(url_for('user.login')) - return render_template('pages/member_base.html') - -# The Admin page is accessible to users with the 'admin' role -@main_blueprint.route('/admin') -@roles_accepted('admin') -def admin_page(): -~~ return redirect(url_for('main.user_admin_page')) - -@main_blueprint.route('/users') -@roles_accepted('admin') -def user_admin_page(): - users = User.query.all() - return render_template('pages/admin/users.html', users=users) - -@main_blueprint.route('/create_user', methods=['GET', 'POST']) -@roles_accepted('admin') -def create_user_page(): - if current_app.config.get('USER_LDAP', False): - abort(400) - - form = UserProfileForm() - roles = Role.query.all() - form.roles.choices = [(x.id,x.name) for x in roles] - - if form.validate(): - user = User.query.filter(User.email == request.form['email']).first() - if not user: - user = User(email=form.email.data, - first_name=form.first_name.data, - last_name=form.last_name.data, - password=current_app.user_manager.hash_password(form.password.data), - active=True, - email_confirmed_at=datetime.datetime.utcnow()) - db.session.add(user) - db.session.commit() - allowed_roles = form.roles.data - for role in roles: - if role.id not in allowed_roles: - if role in user.roles: - user.roles.remove(role) - else: - if role not in user.roles: - user.roles.append(role) - db.session.commit() - flash('You successfully created the new user.', 'success') -~~ return redirect(url_for('main.user_admin_page')) - flash('A user with that email address already exists', 'error') - return render_template('pages/admin/create_user.html', form=form) - - -@main_blueprint.route('/users//delete', methods=['GET', 'POST']) -@roles_accepted('admin') -def delete_user_page(user_id): - if current_app.config.get('USER_LDAP', False): - abort(400) - form = ConfirmationForm() - user = User.query.filter(User.id == user_id).first() - if not user: - abort(404) - if form.validate(): - db.session.query(UsersRoles).filter_by(user_id = user_id).delete() - db.session.query(User).filter_by(id = user_id).delete() - db.session.commit() - flash('You successfully deleted your user!', 'success') -~~ return redirect(url_for('main.user_admin_page')) - return render_template('pages/admin/delete_user.html', form=form) - - -@main_blueprint.route('/users//edit', methods=['GET', 'POST']) -@roles_accepted('admin') -def edit_user_page(user_id): - if current_app.config.get('USER_LDAP', False): - abort(400) - - user = User.query.filter(User.id == user_id).first() - if not user: - abort(404) - - form = UserProfileForm(obj=user) - roles = Role.query.all() - form.roles.choices = [(x.id,x.name) for x in roles] - - if form.validate(): - if 'password' in request.form and len(request.form['password']) >= 8: - user.password = current_app.user_manager.hash_password(request.form['password']) - user.email = form.email.data - user.first_name = form.first_name.data - user.last_name = form.last_name.data - user.active = form.active.data - - allowed_roles = form.roles.data - for role in roles: - if role.id not in allowed_roles: - if role in user.roles: - user.roles.remove(role) - else: - if role not in user.roles: - user.roles.append(role) - - db.session.commit() - flash('You successfully edited the user.', 'success') -~~ return redirect(url_for('main.user_admin_page')) - - form.roles.data = [role.id for role in user.roles] - return render_template('pages/admin/edit_user.html', form=form) - -@main_blueprint.route('/pages/profile', methods=['GET', 'POST']) -@login_required -def user_profile_page(): - if current_app.config.get('USER_LDAP', False): - abort(400) - - # Initialize form - form = UserProfileForm(request.form, obj=current_user) - - # Process valid POST - if request.method == 'POST' and form.validate(): - # Copy form fields to user_profile fields - form.populate_obj(current_user) - - # Save user_profile - db.session.commit() - - # Redirect to home page -~~ return redirect(url_for('main.user_profile_page')) - - # Process GET or invalid POST - return render_template('pages/user_profile_page.html', - current_user=current_user, - form=form) - ## ... source file continues with no further url_for examples... - ``` diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index e66597755..53b035a46 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -45,16 +45,16 @@ log = logging.getLogger(__name__) def protect(allow_browser_login=False): - """ - Use this decorator to enable granular security permissions - to your API methods (BaseApi and child classes). - Permissions will be associated to a role, and roles are associated to users. - allow_browser_login will accept signed cookies obtained from the normal MVC app:: + def _protect(f): + if hasattr(f, "_permission_name"): + permission_str = f._permission_name + else: + permission_str = f.__name__ - class MyApi(BaseApi): - @expose('/dosonmething', methods=['GET']) - @protect(allow_browser_login=True) + def wraps(self, *args, **kwargs): + permission_str = "{}{}".format(PERMISSION_PREFIX, f._permission_name) + if self.method_permission_name: ## ... source file abbreviated to get to jsonify examples ... @@ -93,22 +93,16 @@ def protect(allow_browser_login=False): def permission_name(name): - """ - Use this decorator to override the name of the permission. - has_access will use the methods name has the permission name - if you want to override this add this decorator to your methods. - This is useful if you want to aggregate methods to permissions - It will add '_permission_name' attribute to your method - that will be inspected by BaseView to collect your view's - permissions. + def wraps(f): + f._permission_name = name + return f - Note that you should use @has_access to execute after @permission_name - like on the following example. + return wraps -## ... source file continues with no further jsonify examples... +## ... source file continues with no further jsonify examples... ``` @@ -127,16 +121,6 @@ FlaskBB is provided as open source ```python # views.py -# -*- coding: utf-8 -*- -""" - flaskbb.management.views - ------------------------ - - This module handles the management views. - - :copyright: (c) 2014 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" import logging import sys @@ -172,12 +156,12 @@ from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin, ## ... source file abbreviated to get to jsonify examples ... + def post(self, user_id=None): if request.is_xhr: ids = request.get_json()["ids"] data = [] for user in User.query.filter(User.id.in_(ids)).all(): - # do not delete current user if current_user.id == user.id: continue @@ -250,7 +234,6 @@ class AddUser(MethodView): ) user = User.query.filter_by(id=user_id).first_or_404() - # Do not allow moderators to ban admins if Permission(IsAdmin, identity=user) and Permission( Not(IsAdmin), identity=current_user): flash(_("A moderator cannot ban an admin user."), "danger") @@ -267,14 +250,15 @@ class UnbanUser(MethodView): decorators = [ allows.requires( IsAtleastModerator, + on_fail=FlashAndRedirect( ## ... source file abbreviated to get to jsonify examples ... + ) return redirect(url_for("management.overview")) - # ajax request if request.is_xhr: ids = request.get_json()["ids"] @@ -322,12 +306,12 @@ class Groups(MethodView): ## ... source file abbreviated to get to jsonify examples ... + ) ] def post(self, group_id=None): if request.is_xhr: ids = request.get_json()["ids"] - # TODO: Get rid of magic numbers if not (set(ids) & set(["1", "2", "3", "4", "5", "6"])): data = [] for group in Group.query.filter(Group.id.in_(ids)).all(): @@ -378,8 +362,8 @@ class Groups(MethodView): ## ... source file abbreviated to get to jsonify examples ... + def post(self, report_id=None): - # AJAX request if request.is_xhr: ids = request.get_json()["ids"] data = [] @@ -405,7 +389,6 @@ class Groups(MethodView): status=200 ) - # mark single report as read if report_id: report = Report.query.filter_by(id=report_id).first_or_404() if report.zapped: @@ -421,8 +404,9 @@ class Groups(MethodView): flash(_("Report %(id)s marked as read.", id=report.id), "success") return redirect(url_for("management.reports")) - # mark all as read reports = Report.query.filter(Report.zapped == None).all() + report_list = [] + for report in reports: ## ... source file abbreviated to get to jsonify examples ... @@ -478,9 +462,6 @@ class CeleryStatus(MethodView): try: celery_running = True if celery_inspect.ping() else False except Exception: - # catching Exception is bad, and just catching ConnectionError - # from redis is also bad because you can run celery with other - # brokers as well. celery_running = False ~~ return jsonify(celery_running=celery_running, status=200) @@ -499,7 +480,6 @@ class ManagementOverview(MethodView): ] def get(self): - # user and group stats banned_users = User.query.filter( Group.banned == True, Group.id == User.primary_group_id ).count() @@ -510,8 +490,8 @@ class ManagementOverview(MethodView): online_users = len(get_online_users()) -## ... source file continues with no further jsonify examples... +## ... source file continues with no further jsonify examples... ``` @@ -559,9 +539,10 @@ def map_refresh(): def contact(): return render_template('contact.html', title='Contact') -## ... source file continues with no further jsonify examples... +## ... source file continues with no further jsonify examples... + ``` @@ -581,92 +562,149 @@ direct database access. The sandman2 project is provided under the [Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). -[**sandman2 / sandman2 / app.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./app.py) +[**sandman2 / sandman2 / service.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./service.py) ```python -# app.py -"""Sandman2 main application setup code.""" - -# Third-party imports -~~from flask import Flask, current_app, jsonify -from sqlalchemy.sql import sqltypes - -# Application imports -from sandman2.exception import ( - BadRequestException, - ForbiddenException, - NotFoundException, - NotAcceptableException, - NotImplementedException, - ConflictException, - ServerErrorException, - ServiceUnavailableException, - ) -from sandman2.service import Service -from sandman2.model import db, Model, AutomapModel -from sandman2.admin import CustomAdminView -from flask_admin import Admin -from flask_httpauth import HTTPBasicAuth - -# Augment sandman2's Model class with the Automap and Flask-SQLAlchemy model -# classes -auth = HTTPBasicAuth() - -def get_app( +# service.py + +from flask import request, make_response +~~import flask +from flask.views import MethodView +from sqlalchemy import asc, desc +from sandman2.exception import NotFoundException, BadRequestException +from sandman2.model import db +from sandman2.decorators import etag, validate_fields -## ... source file abbreviated to get to jsonify examples ... +def add_link_headers(response, links): + link_string = '<{}>; rel=self'.format(links['self']) + for link in links.values(): + link_string += ', <{}>; rel=related'.format(link) + response.headers['Link'] = link_string + return response - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False - app.classes = [] - db.init_app(app) - admin = Admin(app, base_template='layout.html', template_mode='bootstrap3') - _register_error_handlers(app) - if user_models: - with app.app_context(): - _register_user_models(user_models, admin, schema=schema) - elif reflect_all: - with app.app_context(): - _reflect_all(exclude_tables, admin, read_only, schema=schema) - - @app.route('/') - def index(): - """Return a list of routes to the registered classes.""" - routes = {} - for cls in app.classes: - routes[cls.__model__.__name__] = '{}{{/{}}}'.format( - cls.__model__.__url__, - cls.__model__.primary_key()) -~~ return jsonify(routes) - return app - - -def _register_error_handlers(app): - """Register error-handlers for the application. - - :param app: The application instance - """ - @app.errorhandler(BadRequestException) - @app.errorhandler(ForbiddenException) - @app.errorhandler(NotAcceptableException) - @app.errorhandler(NotFoundException) - @app.errorhandler(ConflictException) - @app.errorhandler(ServerErrorException) - @app.errorhandler(NotImplementedException) - @app.errorhandler(ServiceUnavailableException) - def handle_application_error(error): # pylint:disable=unused-variable - """Handler used to send JSON error messages rather than default HTML - ones.""" - response = jsonify(error.to_dict()) - response.status_code = error.code - return response +def jsonify(resource): +~~ response = flask.jsonify(resource.to_dict()) + response = add_link_headers(response, resource.links()) + return response -## ... source file continues with no further jsonify examples... +def is_valid_method(model, resource=None): + validation_function_name = 'is_valid_{}'.format( + request.method.lower()) + if hasattr(model, validation_function_name): + return getattr(model, validation_function_name)(request, resource) + +class Service(MethodView): + + __model__ = None + + __json_collection_name__ = 'resources' + + def delete(self, resource_id): + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + db.session().delete(resource) + db.session().commit() + return self._no_content_response() + + @etag + def get(self, resource_id=None): + if request.path.endswith('meta'): + return self._meta() + + if resource_id is None: + error_message = is_valid_method(self.__model__) + if error_message: + raise BadRequestException(error_message) + + if 'export' in request.args: + return self._export(self._all_resources()) + +~~ return flask.jsonify({ + self.__json_collection_name__: self._all_resources() + }) + else: + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + return jsonify(resource) + + def patch(self, resource_id): + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + if not request.json: + raise BadRequestException('No JSON data received') + resource.update(request.json) + db.session().merge(resource) + db.session().commit() + return jsonify(resource) + + @validate_fields + def post(self): + resource = self.__model__.query.filter_by(**request.json).first() + + +## ... source file abbreviated to get to jsonify examples ... + + + def put(self, resource_id): + resource = self.__model__.query.get(resource_id) + if resource: + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + resource.update(request.json) + db.session().merge(resource) + db.session().commit() + return jsonify(resource) + + resource = self.__model__(**request.json) # pylint: disable=not-callable + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + db.session().add(resource) + db.session().commit() + return self._created_response(resource) + + def _meta(self): +~~ return flask.jsonify(self.__model__.description()) + + def _resource(self, resource_id): + resource = self.__model__.query.get(resource_id) + if not resource: + raise NotFoundException() + return resource + + def _all_resources(self): + queryset = self.__model__.query + args = {k: v for (k, v) in request.args.items() if k not in ('page', 'export')} + limit = None + if args: + filters = [] + order = [] + for key, value in args.items(): + if value.startswith('%'): + filters.append(getattr(self.__model__, key).like(str(value), escape='/')) + elif key == 'sort': + direction = desc if value.startswith('-') else asc + order.append(direction(getattr(self.__model__, value.lstrip('-')))) + elif key == 'limit': + limit = int(value) + elif hasattr(self.__model__, key): + filters.append(getattr(self.__model__, key) == value) + + +## ... source file continues with no further jsonify examples... ``` @@ -683,43 +721,53 @@ often used with Flask. The project's code is provided as open source under the [BSD 2-Clause "Simplified" license](https://github.com/tedivm/tedivms-flask/blob/master/LICENSE.txt). -[**tedivms-flask / app / views / apikeys.py**](https://github.com/tedivm/tedivms-flask/blob/master/app/views/apikeys.py) +[**tedivms-flask / app / views / apis.py**](https://github.com/tedivm/tedivms-flask/blob/master/app/views/apis.py) ```python -# apikeys.py -from flask import Blueprint, redirect, render_template, current_app -~~from flask import request, url_for, flash, send_from_directory, jsonify, render_template_string -from flask_user import current_user, login_required, roles_accepted +# apis.py + +from flask import Blueprint, redirect +~~from flask import request, url_for, jsonify, current_app -~~from flask import Flask, session, redirect, url_for, request, render_template, jsonify, abort from app import db -from app.models import user_models as users -from app.utils import forms +from app.models import user_models +from app.utils.api import roles_accepted_api +from app.extensions.ldap import authenticate -import time import uuid +api_blueprint = Blueprint('api', __name__, template_folder='templates') + +@api_blueprint.route('/api/credentials', methods=['POST']) +def api_create_credentials(): + username = request.form['username'] + password = request.form['password'] + label = request.form.get('label', None) + user = user_models.User.query.filter(user_models.User.email == username).first() + if not user: + user = user_models.User.query.filter(user_models.User.username == username).first() + if not user: + abort(400) + + if current_app.config.get('USER_LDAP', False): + if not authenticate(username, password): + abort(401) + else: + if not current_app.user_manager.verify_password(password, user.password): + abort(401) -# When using a Flask app factory we must use a blueprint to avoid needing 'app' for '@apikeys_blueprint.route' -apikeys_blueprint = Blueprint('apikeys', __name__, template_folder='templates') - - -@apikeys_blueprint.route('/user/apikeys') -@roles_accepted('dev', 'admin') -def apikeys_index(): - all_keys = users.ApiKey.query.filter_by(user_id=current_user.id).all() - return render_template("apikeys/list.html", keys=all_keys) + id = uuid.uuid4().hex[0:12] + key = uuid.uuid4().hex + hash = current_app.user_manager.hash_password(key) + new_key = user_models.ApiKey(id=id, hash=hash, user_id=user.id, label=label) + db.session.add(new_key) + db.session.commit() +~~ return jsonify({'id': id,'key': key}) -@apikeys_blueprint.route('/user/create_apikey', methods=['GET', 'POST']) -@roles_accepted('dev', 'admin') -def apikeys_create(): - form = users.ApiKeyForm(request.form) - if request.method == 'POST' and form.validate(): ## ... source file continues with no further jsonify examples... - ``` diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 56cb406f3..6cdb203b5 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -24,14 +24,6 @@ FlaskBB is provided as open source ```python # serializer.py -# -*- coding: utf -*- -""" - flaskbb.tokens.serializer - ------------------------- - - :copyright: (c) 2018 the FlaskBB Team. - :license: BSD, see LICENSE for more details -""" from datetime import timedelta @@ -45,61 +37,25 @@ _DEFAULT_EXPIRY = timedelta(hours=1) class FlaskBBTokenSerializer(tokens.TokenSerializer): - """ - Default token serializer for FlaskBB. Generates JWTs - that are time sensitive. By default they will expire after - 1 hour. - - It creates tokens from flaskbb.core.tokens.Token instances - and creates instances of that class when loading tokens. - - When loading a token, if an error occurs related to the - token itself, a flaskbb.core.tokens.TokenError will be - raised. Exceptions not caused by parsing the token - are simply propagated. - - :str secret_key: The secret key used to sign the tokens - :timedelta expiry: Expiration of tokens - - -## ... source file abbreviated to get to BadSignature examples ... + def __init__(self, secret_key, expiry=_DEFAULT_EXPIRY): + self._serializer = TimedJSONWebSignatureSerializer( + secret_key, int(expiry.total_seconds()) + ) + def dumps(self, token): + return self._serializer.dumps( + { + 'id': token.user_id, 'op': token.operation, } ) def loads(self, raw_token): - """ - Transforms a JWT into a flaskbb.core.tokens.Token. - - If a token is invalid due to it being malformed, - tampered with or expired, a flaskbb.core.tokens.TokenError - is raised. Errors not related to token parsing are - simply propagated. - - :str raw_token: JWT to be parsed - :returns flaskbb.core.tokens.Token: Parsed token - """ - try: - parsed = self._serializer.loads(raw_token) - except SignatureExpired: - raise tokens.TokenError.expired() -~~ except BadSignature: # pragma: no branch - raise tokens.TokenError.invalid() - # ideally we never end up here as BadSignature should - # catch everything else, however since this is the root - # exception for itsdangerous we'll catch it down and - # and re-raise our own - except BadData: # pragma: no cover - raise tokens.TokenError.bad() - else: - return tokens.Token(user_id=parsed['id'], operation=parsed['op']) ## ... source file continues with no further BadSignature examples... - ``` @@ -153,91 +109,7 @@ class Role(db.Model): 'Administrator': ( -## ... source file abbreviated to get to BadSignature examples ... - - - s = Serializer(current_app.config['SECRET_KEY'], expiration) - return s.dumps({'confirm': self.id}) - - def generate_email_change_token(self, new_email, expiration=3600): - """Generate an email change token to email an existing user.""" - s = Serializer(current_app.config['SECRET_KEY'], expiration) - return s.dumps({'change_email': self.id, 'new_email': new_email}) - - def generate_password_reset_token(self, expiration=3600): - """ - Generate a password reset change token to email to an existing user. - """ - s = Serializer(current_app.config['SECRET_KEY'], expiration) - return s.dumps({'reset': self.id}) - - def confirm_account(self, token): - """Verify that the provided token is for this user's id.""" - s = Serializer(current_app.config['SECRET_KEY']) - try: - data = s.loads(token) -~~ except (BadSignature, SignatureExpired): - return False - if data.get('confirm') != self.id: - return False - self.confirmed = True - db.session.add(self) - db.session.commit() - return True - - def change_email(self, token): - """Verify the new email for this user.""" - s = Serializer(current_app.config['SECRET_KEY']) - try: - data = s.loads(token) -~~ except (BadSignature, SignatureExpired): - return False - if data.get('change_email') != self.id: - return False - new_email = data.get('new_email') - if new_email is None: - return False - if self.query.filter_by(email=new_email).first() is not None: - return False - self.email = new_email - db.session.add(self) - db.session.commit() - return True - - def reset_password(self, token, new_password): - """Verify the new password for this user.""" - s = Serializer(current_app.config['SECRET_KEY']) - try: - data = s.loads(token) -~~ except (BadSignature, SignatureExpired): - return False - if data.get('reset') != self.id: - return False - self.password = new_password - db.session.add(self) - db.session.commit() - return True - - @staticmethod - def generate_fake(count=100, **kwargs): - """Generate a number of fake users for testing.""" - from sqlalchemy.exc import IntegrityError - from random import seed, choice - from faker import Faker - - fake = Faker() - roles = Role.query.all() - - seed() - for i in range(count): - u = User( - first_name=fake.first_name(), - last_name=fake.last_name(), - email=fake.email(), - - ## ... source file continues with no further BadSignature examples... - ``` diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 74cb210e0..0218ef33d 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -45,7 +45,6 @@ from beaker.cache import CacheManager from beaker.util import parse_cache_config_options from beaker.middleware import SessionMiddleware -# Instantiate Flask extensions db = SQLAlchemy() csrf_protect = CSRFProtect() mail = Mail() @@ -53,14 +52,15 @@ migrate = Migrate() def get_config(): - # Instantiate Flask app = Flask(__name__) - # Load App Config settings - # Load common settings from 'app/settings.py' file app.config.from_object('app.settings') - # Load local settings from environmental variable if 'APPLICATION_SETTINGS' in os.environ: + app.config.from_envvar(os.environ['APPLICATION_SETTINGS']) + if 'AWS_SECRETS_MANAGER_CONFIG' in os.environ: + secret_config = get_secrets(os.environ['AWS_SECRETS_MANAGER_CONFIG']) + app.config.update(secret_config) + elif 'AWS_SECRETS_MANAGER_CONFIG' in app.config: ## ... source file abbreviated to get to SessionInterface examples ... @@ -95,7 +95,7 @@ def get_config(): session.save() app.wsgi_app = SessionMiddleware(app.wsgi_app, session_opts) -~~ app.session_interface = BeakerSessionInterface() + app.session_interface = BeakerSessionInterface() @user_logged_out.connect_via(app) def clear_session(sender, user, **extra): @@ -111,19 +111,9 @@ def init_error_handlers(app): def show_error(status, message='An unknown error has occured.'): return render_template('pages/errors.html', error_code=status, message=message), status - @app.errorhandler(401) - def error_unauthorized(e): - return show_error(401, 'Unauthorized') - - @app.errorhandler(403) - def error_forbidden(e): - return show_error(403, 'Forbidden') - - @app.errorhandler(404) ## ... source file continues with no further SessionInterface examples... - ``` diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown new file mode 100644 index 000000000..ec72fbd25 --- /dev/null +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -0,0 +1,126 @@ +title: flask.signals got_request_exception code examples +category: page +slug: flask-signals-got-request-exception-examples +sortorder: 500021016 +toc: False +sidebartitle: flask.signals got_request_exception +meta: Python example code for the got_request_exception function from the flask.signals module of the Flask project. + + +got_request_exception is a function within the flask.signals module of the Flask project. + + +## Example 1 from flask-restx +[Flask RESTX](https://github.com/python-restx/flask-restx) is an +extension that makes it easier to build +[RESTful APIs](/application-programming-interfaces.html) into +your applications. Flask RESTX aims for minimal configuration to +get basic APIs running for existing applications and it exposes +endpoint documentation using [Swagger](https://swagger.io/). + +Flask RESTX is provided as open source under the +[BSD 3-Clause license](https://github.com/python-restx/flask-restx/blob/master/LICENSE). + +[**flask-restx / flask_restx / api.py**](https://github.com/python-restx/flask-restx/blob/master/flask_restx/./api.py) + +```python +# api.py +from __future__ import unicode_literals + +import difflib +import inspect +from itertools import chain +import logging +import operator +import re +import six +import sys + +from collections import OrderedDict +from functools import wraps, partial +from types import MethodType + +from flask import url_for, request, current_app +from flask import make_response as original_flask_make_response +from flask.helpers import _endpoint_from_view_func +~~from flask.signals import got_request_exception + +from jsonschema import RefResolver + +from werkzeug.utils import cached_property +from werkzeug.datastructures import Headers +from werkzeug.exceptions import ( + HTTPException, + MethodNotAllowed, + NotFound, + NotAcceptable, + InternalServerError, +) +from werkzeug.wrappers import BaseResponse + +from . import apidoc +from .mask import ParseError, MaskError +from .namespace import Namespace +from .postman import PostmanCollectionV1 +from .resource import Resource +from .swagger import Swagger +from .utils import default_id, camel_to_dash, unpack +from .representations import output_json +from ._http import HTTPStatus + + + +## ... source file abbreviated to get to got_request_exception examples ... + + + return self.catch_all_404s + except Exception: + pass + + def _has_fr_route(self): + if self._should_use_fr_error_handler(): + return True + if not request.url_rule: + return False + return self.owns_endpoint(request.url_rule.endpoint) + + def error_router(self, original_handler, e): + if self._has_fr_route(): + try: + return self.handle_error(e) + except Exception as f: + return original_handler(f) + return original_handler(e) + + def handle_error(self, e): +~~ got_request_exception.send(current_app._get_current_object(), exception=e) + + if ( + not isinstance(e, HTTPException) + and current_app.propagate_exceptions + and not isinstance(e, tuple(self.error_handlers.keys())) + ): + + exc_type, exc_value, tb = sys.exc_info() + if exc_value is e: + raise + else: + raise e + + include_message_in_response = current_app.config.get( + "ERROR_INCLUDE_MESSAGE", True + ) + default_data = {} + + headers = Headers() + + for typecheck, handler in six.iteritems(self._own_and_child_error_handlers): + if isinstance(e, typecheck): + result = handler(e) + default_data, code, headers = unpack( + + +## ... source file continues with no further got_request_exception examples... + +``` + diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index de1c432f7..3abceb212 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -25,13 +25,6 @@ open sourced under the ```python # signals.py -# -*- coding: utf-8 -*- -''' - flask_login.signals - ------------------- - This module provides signals to get notified when Flask-Login performs - certain actions. -''' ~~from flask.signals import Namespace @@ -40,33 +33,30 @@ open sourced under the ~~_signals = Namespace() -#: Sent when a user is logged in. In addition to the app (which is the -#: sender), it is passed `user`, which is the user being logged in. user_logged_in = _signals.signal('logged-in') -#: Sent when a user is logged out. In addition to the app (which is the -#: sender), it is passed `user`, which is the user being logged out. user_logged_out = _signals.signal('logged-out') -#: Sent when the user is loaded from the cookie. In addition to the app (which -#: is the sender), it is passed `user`, which is the user being reloaded. user_loaded_from_cookie = _signals.signal('loaded-from-cookie') -#: Sent when the user is loaded from the header. In addition to the app (which -#: is the #: sender), it is passed `user`, which is the user being reloaded. user_loaded_from_header = _signals.signal('loaded-from-header') -#: Sent when the user is loaded from the request. In addition to the app (which -#: is the #: sender), it is passed `user`, which is the user being reloaded. user_loaded_from_request = _signals.signal('loaded-from-request') -#: Sent when a user's login is confirmed, marking it as fresh. (It is not -#: called for a normal login.) +user_login_confirmed = _signals.signal('login-confirmed') +user_unauthorized = _signals.signal('unauthorized') + +user_needs_refresh = _signals.signal('needs-refresh') + +user_accessed = _signals.signal('accessed') + +session_protected = _signals.signal('session-protected') -## ... source file continues with no further Namespace examples... +## ... source file continues with no further Namespace examples... + ``` @@ -146,6 +136,5 @@ def _wrap_with_default_query_class(fn, cls): ## ... source file continues with no further Namespace examples... - ``` diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 638360b9e..151151c1c 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template code examples category: page slug: flask-templating-render-template-examples -sortorder: 500021016 +sortorder: 500021017 toc: False sidebartitle: flask.templating render_template meta: Python example code for the render_template function from the flask.templating module of the Flask project. @@ -24,16 +24,6 @@ FlaskBB is provided as open source ```python # email.py -# -*- coding: utf-8 -*- -""" - flaskbb.email - ------------- - - This module adds the functionality to send emails - - :copyright: (c) 2014 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" import logging ~~from flask import render_template from flask_mail import Message @@ -47,12 +37,6 @@ logger = logging.getLogger(__name__) @celery.task def send_reset_token(token, username, email): - """Sends the reset token to the user's email address. - - :param token: The token to send to the user - :param username: The username to whom the email should be sent. - :param email: The email address of the user - """ send_email( subject=_("Password Recovery Confirmation"), recipients=[email], @@ -71,12 +55,6 @@ def send_reset_token(token, username, email): @celery.task def send_activation_token(token, username, email): - """Sends the activation token to the user's email address. - - :param token: The token to send to the user - :param username: The username to whom the email should be sent. - :param email: The email address of the user - """ send_email( subject=_("Account Activation"), recipients=[email], @@ -99,21 +77,14 @@ def send_async_email(*args, **kwargs): def send_email(subject, recipients, text_body, html_body, sender=None): - """Sends an email to the given recipients. - - :param subject: The subject of the email. - :param recipients: A list of recipients. - :param text_body: The text body of the email. - :param html_body: The html body of the email. - :param sender: A two-element tuple consisting of name and address. - If no sender is given, it will fall back to the one you - have configured with ``MAIL_DEFAULT_SENDER``. - """ msg = Message(subject, recipients=recipients, sender=sender) + msg.body = text_body + msg.html = html_body + mail.send(msg) -## ... source file continues with no further render_template examples... +## ... source file continues with no further render_template examples... ``` @@ -159,8 +130,8 @@ def send_email(recipient, subject, template, **kwargs): mail.send(msg) -## ... source file continues with no further render_template examples... +## ... source file continues with no further render_template examples... ``` @@ -177,7 +148,6 @@ as open source under the ```python # app.py -# -*- coding: utf-8 -*- from scripts import tabledef from scripts import forms @@ -190,12 +160,7 @@ import os app = Flask(__name__) app.secret_key = os.urandom(12) # Generic key for dev purposes only -# Heroku -#from flask_heroku import Heroku -#heroku = Heroku(app) -# ======== Routing =========================================================== # -# -------- Login ------------------------------------------------------------- # @app.route('/', methods=['GET', 'POST']) def login(): if not session.get('logged_in'): @@ -221,7 +186,6 @@ def logout(): return redirect(url_for('login')) -# -------- Signup ---------------------------------------------------------- # @app.route('/signup', methods=['GET', 'POST']) def signup(): if not session.get('logged_in'): @@ -242,7 +206,6 @@ def signup(): return redirect(url_for('login')) -# -------- Settings ---------------------------------------------------------- # @app.route('/settings', methods=['GET', 'POST']) def settings(): if session.get('logged_in'): @@ -258,13 +221,12 @@ def settings(): return redirect(url_for('login')) -# ======== Main ============================================================== # if __name__ == "__main__": app.run(debug=True, use_reloader=True, host="0.0.0.0") -## ... source file continues with no further render_template examples... +## ... source file continues with no further render_template examples... ``` @@ -280,17 +242,7 @@ is configured in JSON. The code is provided as open source under the ```python # charts_builder.py -# -*- coding: utf-8 -*- -""" -flask_jsondash.charts_builder ------------------------------ - -The chart blueprint that houses all functionality. - -:copyright: (c) 2016 by Chris Tabor. -:license: MIT, see LICENSE for more details. -""" import json import os @@ -315,14 +267,14 @@ from flask_jsondash.schema import ( TEMPLATE_DIR = os.path.dirname(templates.__file__) STATIC_DIR = os.path.dirname(static.__file__) -# Internally required libs that are also shared in `settings.py` -# for charts. These follow the same format as what is loaded in -# `get_active_assets` so that shared libraries are loaded in the same manner -# for simplicty and prevention of duplicate loading. -# Note these are just LABELS, not files. REQUIRED_STATIC_FAMILES = ['D3'] charts = Blueprint( + 'jsondash', + __name__, + template_folder=TEMPLATE_DIR, + static_url_path=STATIC_DIR, + static_folder=STATIC_DIR, ## ... source file abbreviated to get to render_template examples ... @@ -353,7 +305,6 @@ charts = Blueprint( @charts.route('/charts/', methods=['GET']) def view(c_id): - """Load a json view config from the DB.""" if not auth(authtype='view', view_id=c_id): flash('You do not have access to view this dashboard.', 'error') return redirect(url_for('jsondash.dashboard')) @@ -361,23 +312,17 @@ def view(c_id): if not viewjson: flash('Could not find view: {}'.format(c_id), 'error') return redirect(url_for('jsondash.dashboard')) - # Remove _id, it's not JSON serializeable. if '_id' in viewjson: viewjson.pop('_id') if 'modules' not in viewjson: flash('Invalid configuration - missing modules.', 'error') return redirect(url_for('jsondash.dashboard')) - # Chart family is encoded in chart type value for lookup. active_charts = [v.get('family') for v in viewjson['modules'] if v.get('family') is not None] - # If the logged in user is also the creator of this dashboard, - # let me edit it. Otherwise, defer to any user-supplied auth function - # for this specific view. if metadata(key='username') == viewjson.get('created_by'): can_edit = True else: can_edit = auth(authtype='edit_others', view_id=c_id) - # Backwards compatible layout type layout_type = viewjson.get('layout', 'freeform') kwargs = dict( id=c_id, @@ -397,7 +342,6 @@ def view(c_id): @charts.route('/charts//delete', methods=['POST']) def delete(c_id): - """Delete a json dashboard config.""" dash_url = url_for('jsondash.dashboard') if not auth(authtype='delete'): flash('You do not have access to delete dashboards.', 'error') @@ -409,7 +353,6 @@ def delete(c_id): @charts.route('/charts//update', methods=['POST']) def update(c_id): - """Normalize the form POST and setup the json view config object.""" if not auth(authtype='update'): flash('You do not have access to update dashboards.', 'error') return redirect(url_for('jsondash.dashboard')) @@ -417,11 +360,12 @@ def update(c_id): if not viewjson: flash('Could not find view: {}'.format(c_id), 'error') return redirect(url_for('jsondash.dashboard')) + form_data = request.form + view_url = url_for('jsondash.view', c_id=c_id) ## ... source file continues with no further render_template examples... - ``` @@ -477,8 +421,8 @@ def show_phone(): ~~ return render_template('show_phone.html', phone=session['phone']) -## ... source file continues with no further render_template examples... +## ... source file continues with no further render_template examples... ``` @@ -498,17 +442,12 @@ Flask RESTX is provided as open source under the ```python # apidoc.py -# -*- coding: utf-8 -*- from __future__ import unicode_literals ~~from flask import url_for, Blueprint, render_template class Apidoc(Blueprint): - """ - Allow to know if the blueprint has already been registered - until https://github.com/mitsuhiko/flask/pull/1301 is merged - """ def __init__(self, *args, **kwargs): self.registered = False @@ -534,12 +473,11 @@ def swagger_static(filename): def ui_for(api): - """Render a SwaggerUI for a given API""" ~~ return render_template("swagger-ui.html", title=api.title, specs_url=api.specs_url) -## ... source file continues with no further render_template examples... +## ... source file continues with no further render_template examples... ``` @@ -566,7 +504,6 @@ from itsdangerous import URLSafeTimedSerializer from app import app, models, db from app.forms import user as user_forms from app.toolbox import email -# Setup Stripe integration import stripe import json from json import dumps @@ -578,19 +515,15 @@ stripe_keys = { stripe.api_key = stripe_keys['secret_key'] -# Serializer for generating random tokens ts = URLSafeTimedSerializer(app.config['SECRET_KEY']) -# Create a user blueprint userbp = Blueprint('userbp', __name__, url_prefix='/user') - -## ... source file abbreviated to get to render_template examples ... - - +@userbp.route('/signup', methods=['GET', 'POST']) +def signup(): + form = user_forms.SignUp() if form.validate_on_submit(): - # Create a user who hasn't validated his email address user = models.User( first_name=form.first_name.data, last_name=form.last_name.data, @@ -599,21 +532,14 @@ userbp = Blueprint('userbp', __name__, url_prefix='/user') confirmation=False, password=form.password.data, ) - # Insert the user in the database db.session.add(user) db.session.commit() - # Subject of the confirmation email subject = 'Please confirm your email address.' - # Generate a random token token = ts.dumps(user.email, salt='email-confirm-key') - # Build a confirm link with token confirmUrl = url_for('userbp.confirm', token=token, _external=True) - # Render an HTML template to send by email ~~ html = render_template('email/confirm.html', confirm_url=confirmUrl) - # Send the email to user email.send(user.email, subject, html) - # Send back to the home page flash('Check your emails to confirm your email address.', 'positive') return redirect(url_for('index')) ~~ return render_template('user/signup.html', form=form, title='Sign up') @@ -623,16 +549,11 @@ userbp = Blueprint('userbp', __name__, url_prefix='/user') def confirm(token): try: email = ts.loads(token, salt='email-confirm-key', max_age=86400) - # The token can either expire or be invalid except: abort(404) - # Get the user from the database user = models.User.query.filter_by(email=email).first() - # The user has confirmed his or her email address user.confirmation = True - # Update the database with the user db.session.commit() - # Send to the signin page flash( 'Your email address has been confirmed, you can sign in.', 'positive') return redirect(url_for('userbp.signin')) @@ -641,20 +562,12 @@ def confirm(token): @userbp.route('/signin', methods=['GET', 'POST']) def signin(): form = user_forms.Login() - - -## ... source file abbreviated to get to render_template examples ... - - + if form.validate_on_submit(): user = models.User.query.filter_by(email=form.email.data).first() - # Check the user exists if user is not None: - # Check the password is correct if user.check_password(form.password.data): - #Check if email is confirmed if user.confirmation == True: login_user(user) - # Send back to the home page flash('Succesfully signed in.', 'positive') return redirect(url_for('userbp.account')) else: @@ -687,19 +600,12 @@ def forgot(): form = user_forms.Forgot() if form.validate_on_submit(): user = models.User.query.filter_by(email=form.email.data).first() - # Check the user exists if user is not None: - # Subject of the confirmation email subject = 'Reset your password.' - # Generate a random token token = ts.dumps(user.email, salt='password-reset-key') - # Build a reset link with token resetUrl = url_for('userbp.reset', token=token, _external=True) - # Render an HTML template to send by email ~~ html = render_template('email/reset.html', reset_url=resetUrl) - # Send the email to user email.send(user.email, subject, html) - # Send back to the home page flash('Check your emails to reset your password.', 'positive') return redirect(url_for('index')) else: @@ -712,18 +618,14 @@ def forgot(): def reset(token): try: email = ts.loads(token, salt='password-reset-key', max_age=86400) - # The token can either expire or be invalid except: abort(404) form = user_forms.Reset() if form.validate_on_submit(): user = models.User.query.filter_by(email=email).first() - # Check the user exists if user is not None: user.password = form.password.data - # Update the database with the user db.session.commit() - # Send to the signin page flash('Your password has been reset, you can sign in.', 'positive') return redirect(url_for('userbp.signin')) else: @@ -742,7 +644,6 @@ def pay(): @app.route('/user/charge', methods=['POST']) @login_required def charge(): - # Amount in cents amount = 500 customer = stripe.Customer.create(email=current_user.email, source=request.form['stripeToken']) charge = stripe.Charge.create( @@ -754,7 +655,6 @@ def charge(): user = models.User.query.filter_by(email=current_user.email).first() user.paid = 1 db.session.commit() - # do anything else, like execute shell command to enable user's service on your app ~~ return render_template('user/charge.html', amount=amount) @app.route('/api/payFail', methods=['POST', 'GET']) @@ -765,7 +665,6 @@ def payFail(): if user is not None: user.paid = 0 db.session.commit() - # do anything else, like execute shell command to disable user's service on your app return "Response: User with associated email " + str(stripe_email) + " updated on our end (payment failure)." @app.route('/api/paySuccess', methods=['POST', 'GET']) @@ -776,13 +675,12 @@ def paySuccess(): if user is not None: user.paid = 1 db.session.commit() - # do anything else on payment success, maybe send a thank you email or update more db fields? return "Response: User with associated email " + str(stripe_email) + " updated on our end (paid)." -## ... source file continues with no further render_template examples... +## ... source file continues with no further render_template examples... ``` @@ -821,8 +719,8 @@ def send_email(to, subject, template, **kwargs): return thr -## ... source file continues with no further render_template examples... +## ... source file continues with no further render_template examples... ``` @@ -839,13 +737,6 @@ NewsPie is provided as open source under the ```python # news.py -# -*- coding: utf-8 -*- -''' -NewsPie - a minimalistic news aggregator built with Flask and powered by -News API (https://newsapi.org/). - -Created by @skamieniarz (https://github.com/skamieniarz) in 2019. -''' import configparser import json import logging @@ -910,16 +801,6 @@ def root(): @APP.route('/search/', methods=['GET', 'POST']) def search(query): - ''' Handles category route. - - Parameters: - - name: query - in: path - description: Query string to be searched - - name: page - in: query - description: Number of the page - ''' page = request.args.get('page', default=1, type=int) if page < 1: return redirect(url_for('search', query=query, page=1)) @@ -929,21 +810,33 @@ def search(query): 'page': page, 'pageSize': PAGE_SIZE } + if request.method == 'POST': + return do_post(page, category='search', current_query=query) + response = requests.get(EVERYTHING, + params=params, + headers={'Authorization': API_KEY}) + pages = count_pages(response.json()) + if page > pages: + page = pages + return redirect(url_for('search', query=query, page=page)) + articles = parse_articles(response.json()) ## ... source file abbreviated to get to render_template examples ... + ).strftime('%Y-%m-%d %H:%M'), + 'title': + article['title'], + 'url': + article['url'], + 'source': + article['source']['name'] }) return parsed_articles def count_pages(response): - ''' Helper method that counts number of total pages basing on total - results from News API response and page size. - - Returns: - An int with a number of total pages. ''' pages = 0 if response.get('status') == 'ok': pages = (-(-response.get('totalResults', 0) // PAGE_SIZE)) @@ -951,8 +844,6 @@ def count_pages(response): def render(articles, page, pages, country, category): - ''' Renders the template with appropriate variables. Up to 12 pages - allowed. ''' pages = pages if pages <= 12 else 12 ~~ return render_template(CONFIG['VARIOUS']['TEMPLATE'], articles=articles, @@ -965,12 +856,6 @@ def render(articles, page, pages, country, category): def get_cookie(key): - ''' Helper method that gets cookie's value. - - Returns: - A string with a value of a cookie with provided key. If a key is - missing, None is returned. - ''' cookie_value = request.cookies.get(key) return cookie_value @@ -979,8 +864,8 @@ if __name__ == '__main__': APP.run() -## ... source file continues with no further render_template examples... +## ... source file continues with no further render_template examples... ``` @@ -1020,7 +905,6 @@ from beaker.cache import CacheManager from beaker.util import parse_cache_config_options from beaker.middleware import SessionMiddleware -# Instantiate Flask extensions db = SQLAlchemy() csrf_protect = CSRFProtect() mail = Mail() @@ -1028,11 +912,12 @@ migrate = Migrate() def get_config(): - # Instantiate Flask app = Flask(__name__) - # Load App Config settings - # Load common settings from 'app/settings.py' file + app.config.from_object('app.settings') + if 'APPLICATION_SETTINGS' in os.environ: + app.config.from_envvar(os.environ['APPLICATION_SETTINGS']) + if 'AWS_SECRETS_MANAGER_CONFIG' in os.environ: ## ... source file abbreviated to get to render_template examples ... @@ -1077,8 +962,8 @@ def init_error_handlers(app): return show_error(500, 'An unknown error has occurred on the server.') -## ... source file continues with no further render_template examples... +## ... source file continues with no further render_template examples... ``` diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 23e8540e6..34c63f4cb 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -1,7 +1,7 @@ title: flask.views http_method_funcs code examples category: page slug: flask-views-http-method-funcs-examples -sortorder: 500021019 +sortorder: 500021020 toc: False sidebartitle: flask.views http_method_funcs meta: Python example code for the http_method_funcs function from the flask.views module of the Flask project. @@ -25,7 +25,6 @@ Flask RESTX is provided as open source under the ```python # namespace.py -# -*- coding: utf-8 -*- from __future__ import unicode_literals import inspect @@ -44,36 +43,36 @@ from .model import Model, OrderedModel, SchemaModel from .reqparse import RequestParser from .utils import merge -# Container for each route applied to a Resource using @ns.route decorator ResourceRoute = namedtuple("ResourceRoute", "resource urls route_doc kwargs") class Namespace(object): - """ - Group resources together. - Namespace is to API what :class:`flask:flask.Blueprint` is for :class:`flask:flask.Flask`. - - :param str name: The namespace name - :param str description: An optional short description - :param str path: An optional prefix path. If not provided, prefix is ``/+name`` - :param list decorators: A list of decorators to apply to each resources - :param bool validate: Whether or not to perform validation on this namespace - :param bool ordered: Whether or not to preserve order on models and marshalling + def __init__( + self, + name, + description=None, + path=None, + decorators=None, + validate=None, + authorizations=None, + ordered=False, + **kwargs + ): ## ... source file abbreviated to get to http_method_funcs examples ... + for api in self.apis: + ns_urls = api.ns_urls(self, urls) + api.register_resource(self, resource, *ns_urls, **kwargs) + def route(self, *urls, **kwargs): - """ - A decorator to route resources. - """ def wrapper(cls): doc = kwargs.pop("doc", None) if doc is not None: - # build api doc intended only for this route kwargs["route_doc"] = self._build_doc(cls, doc) self.add_resource(cls, *urls, **kwargs) return cls @@ -98,7 +97,6 @@ class Namespace(object): return merge(getattr(cls, "__apidoc__", {}), doc) def doc(self, shortcut=None, **kwargs): - """A decorator to add some api documentation to the decorated object""" if isinstance(shortcut, six.text_type): kwargs["id"] = shortcut show = shortcut if isinstance(shortcut, bool) else True @@ -112,8 +110,8 @@ class Namespace(object): return wrapper -## ... source file continues with no further http_method_funcs examples... +## ... source file continues with no further http_method_funcs examples... ``` diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 8beb16b29..a5c7ad145 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -1,7 +1,7 @@ title: flask.views MethodView code examples category: page slug: flask-views-methodview-examples -sortorder: 500021017 +sortorder: 500021018 toc: False sidebartitle: flask.views MethodView meta: Python example code for the MethodView class from the flask.views module of the Flask project. @@ -24,17 +24,6 @@ FlaskBB is provided as open source ```python # views.py -# -*- coding: utf-8 -*- -""" - flaskbb.auth.views - ------------------ - - This view provides user authentication, registration and a view for - resetting the password of a user if he has lost his password - - :copyright: (c) 2014 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" import logging from datetime import datetime @@ -397,7 +386,6 @@ logger = logging.getLogger(__name__) ## ... source file continues with no further MethodView examples... - ``` @@ -416,7 +404,6 @@ Flask RESTX is provided as open source under the ```python # resource.py -# -*- coding: utf-8 -*- from __future__ import unicode_literals from flask import request @@ -429,17 +416,6 @@ from .utils import unpack ~~class Resource(MethodView): - """ - Represents an abstract RESTX resource. - - Concrete resources should extend from this class - and expose methods for each supported HTTP method. - If a resource is invoked with an unsupported HTTP method, - the API will return a response with status 405 Method Not Allowed. - Otherwise the appropriate method is called and passed all arguments - from the url rule used when adding the resource to an Api instance. - See :meth:`-flask_restx.Api.add_resource` for details. - """ representations = None method_decorators = [] @@ -448,15 +424,25 @@ from .utils import unpack self.api = api def dispatch_request(self, *args, **kwargs): - # Taken from flask meth = getattr(self, request.method.lower(), None) if meth is None and request.method == "HEAD": meth = getattr(self, "get", None) assert meth is not None, "Unimplemented method %r" % request.method + for decorator in self.method_decorators: + meth = decorator(meth) -## ... source file continues with no further MethodView examples... + self.validate_payload(meth) + resp = meth(*args, **kwargs) + + if isinstance(resp, BaseResponse): + return resp + + representations = self.representations or {} + + +## ... source file continues with no further MethodView examples... ``` @@ -481,30 +467,18 @@ The sandman2 project is provided under the ```python # service.py -"""Automatically generated REST API services from SQLAlchemy -ORM models or a database introspection.""" -# Third-party imports from flask import request, make_response import flask ~~from flask.views import MethodView from sqlalchemy import asc, desc -# Application imports from sandman2.exception import NotFoundException, BadRequestException from sandman2.model import db from sandman2.decorators import etag, validate_fields def add_link_headers(response, links): - """Return *response* with the proper link headers set, based on the contents - of *links*. - - :param response: :class:`flask.Response` response object for links to be - added - :param dict links: Dictionary of links to be added - :rtype :class:`flask.Response` : - """ link_string = '<{}>; rel=self'.format(links['self']) for link in links.values(): link_string += ', <{}>; rel=related'.format(link) @@ -513,11 +487,6 @@ def add_link_headers(response, links): def jsonify(resource): - """Return a Flask ``Response`` object containing a - JSON representation of *resource*. - - :param resource: The resource to act as the basis of the response - """ response = flask.jsonify(resource.to_dict()) response = add_link_headers(response, resource.links()) @@ -525,8 +494,6 @@ def jsonify(resource): def is_valid_method(model, resource=None): - """Return the error message to be sent to the client if the current - request passes fails any user-defined validation.""" validation_function_name = 'is_valid_{}'.format( request.method.lower()) if hasattr(model, validation_function_name): @@ -534,33 +501,32 @@ def is_valid_method(model, resource=None): ~~class Service(MethodView): - """The *Service* class is a generic extension of Flask's *MethodView*, - providing default RESTful functionality for a given ORM resource. - Each service has an associated *__model__* attribute which represents the - ORM resource it exposes. Services are JSON-only. HTML-based representation - is available through the admin interface. - """ - - #: The sandman2.model.Model-derived class to expose __model__ = None - #: The string used to describe the elements when a collection is - #: returned. __json_collection_name__ = 'resources' def delete(self, resource_id): - """Return an HTTP response object resulting from a HTTP DELETE call. - - :param resource_id: The value of the resource's primary key - """ resource = self._resource(resource_id) error_message = is_valid_method(self.__model__, resource) if error_message: + raise BadRequestException(error_message) + db.session().delete(resource) + db.session().commit() + return self._no_content_response() + @etag + def get(self, resource_id=None): + if request.path.endswith('meta'): + return self._meta() + + if resource_id is None: + error_message = is_valid_method(self.__model__) + if error_message: + raise BadRequestException(error_message) -## ... source file continues with no further MethodView examples... +## ... source file continues with no further MethodView examples... ``` diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 672ead42b..6860f32a2 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -1,7 +1,7 @@ title: flask.views View code examples category: page slug: flask-views-view-examples -sortorder: 500021018 +sortorder: 500021019 toc: False sidebartitle: flask.views View meta: Python example code for the View class from the flask.views module of the Flask project. @@ -24,16 +24,6 @@ FlaskBB is provided as open source ```python # views.py -# -*- coding: utf-8 -*- -""" - flaskbb.utils.views - ------------------- - - This module contains some helpers for creating views. - - :copyright: (c) 2016 by the FlaskBB Team. - :license: BSD, see LICENSE for more details. -""" from flaskbb.utils.helpers import render_template ~~from flask.views import View @@ -48,8 +38,8 @@ from flaskbb.utils.helpers import render_template return render_template(self.template, **view_model) -## ... source file continues with no further View examples... +## ... source file continues with no further View examples... ``` diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html index e18014699..267b49183 100644 --- a/theme/templates/code-examples/flask.html +++ b/theme/templates/code-examples/flask.html @@ -34,7 +34,8 @@

flask.sessions SessionInterface

flask.signals - Namespace + Namespace, + got_request_exception

flask.templating render_template From 0b1c41fcce83d66549650b9074db6a8980facd41 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 21 Jun 2020 17:29:31 -0400 Subject: [PATCH 129/302] add new django translation code examples --- ...django-utils-translation-activate.markdown | 231 ++++++ ...-utils-translation-deactivate-all.markdown | 213 +++++ ...slation-get-language-from-request.markdown | 194 +++++ ...go-utils-translation-get-language.markdown | 314 ++++++++ ...go-utils-translation-gettext-lazy.markdown | 50 ++ .../django-utils-translation-gettext.markdown | 760 ++++++++++++++++++ ...-translation-language-session-key.markdown | 55 ++ ...django-utils-translation-ngettext.markdown | 208 +++++ ...django-utils-translation-override.markdown | 200 +++++ ...o-utils-translation-pgettext-lazy.markdown | 183 +++++ ...django-utils-translation-pgettext.markdown | 115 +++ ...o-utils-translation-ugettext-lazy.markdown | 115 +++ ...django-utils-translation-ugettext.markdown | 120 +++ ...-utils-translation-ungettext-lazy.markdown | 107 +++ ...jango-utils-translation-ungettext.markdown | 235 ++++++ .../django/django-utils-translation.markdown | 474 +++++++++++ content/pages/meta/00-change-log.markdown | 18 + theme/templates/code-examples/django.html | 17 + 18 files changed, 3609 insertions(+) create mode 100644 content/pages/examples/django/django-utils-translation-activate.markdown create mode 100644 content/pages/examples/django/django-utils-translation-deactivate-all.markdown create mode 100644 content/pages/examples/django/django-utils-translation-get-language-from-request.markdown create mode 100644 content/pages/examples/django/django-utils-translation-get-language.markdown create mode 100644 content/pages/examples/django/django-utils-translation-gettext-lazy.markdown create mode 100644 content/pages/examples/django/django-utils-translation-gettext.markdown create mode 100644 content/pages/examples/django/django-utils-translation-language-session-key.markdown create mode 100644 content/pages/examples/django/django-utils-translation-ngettext.markdown create mode 100644 content/pages/examples/django/django-utils-translation-override.markdown create mode 100644 content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown create mode 100644 content/pages/examples/django/django-utils-translation-pgettext.markdown create mode 100644 content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown create mode 100644 content/pages/examples/django/django-utils-translation-ugettext.markdown create mode 100644 content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown create mode 100644 content/pages/examples/django/django-utils-translation-ungettext.markdown create mode 100644 content/pages/examples/django/django-utils-translation.markdown diff --git a/content/pages/examples/django/django-utils-translation-activate.markdown b/content/pages/examples/django/django-utils-translation-activate.markdown new file mode 100644 index 000000000..1442cd3da --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-activate.markdown @@ -0,0 +1,231 @@ +title: django.utils.translation activate code examples +category: page +slug: django-utils-translation-activate-examples +sortorder: 500011494 +toc: False +sidebartitle: django.utils.translation activate +meta: Python example code for the activate function from the django.utils.translation module of the Django project. + + +activate is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_pool.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_pool.py) + +```python +# plugin_pool.py +from operator import attrgetter + +from django.core.exceptions import ImproperlyConfigured +from django.conf.urls import url, include +from django.template.defaultfilters import slugify +from django.utils.encoding import force_text +from django.utils.functional import cached_property +from django.utils.module_loading import autodiscover_modules +~~from django.utils.translation import get_language, deactivate_all, activate +from django.template import TemplateDoesNotExist, TemplateSyntaxError + +from six import string_types, text_type + +from cms.exceptions import PluginAlreadyRegistered, PluginNotRegistered +from cms.plugin_base import CMSPluginBase +from cms.utils.conf import get_cms_setting +from cms.utils.helpers import normalize_name + + +class PluginPool(object): + + def __init__(self): + self.plugins = {} + self.discovered = False + + def _clear_cached(self): + if 'registered_plugins' in self.__dict__: + del self.__dict__['registered_plugins'] + + if 'plugins_with_extra_menu' in self.__dict__: + del self.__dict__['plugins_with_extra_menu'] + + if 'plugins_with_extra_placeholder_menu' in self.__dict__: + + +## ... source file abbreviated to get to activate examples ... + + + + def get_plugin(self, name): + self.discover_plugins() + return self.plugins[name] + + def get_patterns(self): + self.discover_plugins() + + lang = get_language() + deactivate_all() + + try: + url_patterns = [] + for plugin in self.registered_plugins: + p = plugin() + slug = slugify(force_text(normalize_name(p.__class__.__name__))) + url_patterns += [ + url(r'^plugin/%s/' % (slug,), include(p.plugin_urls)), + ] + finally: +~~ activate(lang) + + return url_patterns + + def get_system_plugins(self): + self.discover_plugins() + return [plugin.__name__ for plugin in self.plugins.values() if plugin.system] + + @cached_property + def registered_plugins(self): + return self.get_all_plugins() + + @cached_property + def plugins_with_extra_menu(self): + plugin_classes = [cls for cls in self.registered_plugins + if cls._has_extra_plugin_menu_items] + return plugin_classes + + @cached_property + def plugins_with_extra_placeholder_menu(self): + plugin_classes = [cls for cls in self.registered_plugins + if cls._has_extra_placeholder_menu_items] + return plugin_classes + + + + +## ... source file continues with no further activate examples... + +``` + + +## Example 2 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / tests / test_templatetags.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/tests/test_templatetags.py) + +```python +# test_templatetags.py +import pytest +from django.template.base import TemplateSyntaxError +~~from django.utils.translation import activate, deactivate_all + +from sitetree.exceptions import SiteTreeError +from sitetree.settings import ALIAS_THIS_ANCESTOR_CHILDREN, ALIAS_THIS_CHILDREN, ALIAS_THIS_PARENT_SIBLINGS, \ + ALIAS_THIS_SIBLINGS, ALIAS_TRUNK + + +def test_items_hook(template_render_tag, template_context, common_tree): + + from sitetree.toolbox import register_items_hook + + with pytest.raises(SiteTreeError): + register_items_hook(lambda: []) + + def my_processor(tree_items, tree_sender): + for item in tree_items: + item.hint = f'hooked_hint_{item.title}' + return tree_items + + register_items_hook(my_processor) + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', template_context()) + + assert 'hooked_hint_Darwin' in result + assert 'hooked_hint_Australia' in result + assert 'hooked_hint_China' in result + + +## ... source file abbreviated to get to activate examples ... + + + from sitetree.toolbox import register_i18n_trees + + build_tree( + {'alias': 'i18tree'}, + [{'title': 'My title', 'url': '/url_default/'}], + ) + build_tree( + {'alias': 'i18tree_ru'}, + [{'title': 'Заголовок', 'url': '/url_ru/'}], + ) + build_tree( + {'alias': 'i18tree_pt-br'}, + [{'title': 'Meu Título', 'url': '/url_pt-br/'}], + ) + build_tree( + {'alias': 'i18tree_zh-hans'}, + [{'title': '我蒂特', 'url': '/url_zh-hans/'}], + ) + register_i18n_trees(['i18tree']) + +~~ activate('en') + result = template_render_tag('sitetree', 'sitetree_tree from "i18tree"', template_context()) + + assert '/url_default/' in result + assert 'My title' in result + +~~ activate('ru') + result = template_render_tag('sitetree', 'sitetree_tree from "i18tree"', template_context()) + + assert '/url_ru/' in result + assert 'Заголовок' in result + +~~ activate('pt-br') + result = template_render_tag('sitetree', 'sitetree_tree from "i18tree"', template_context()) + + assert '/url_pt-br/' in result + assert 'Meu Título' in result + +~~ activate('zh-hans') + result = template_render_tag('sitetree', 'sitetree_tree from "i18tree"', template_context()) + + assert '/url_zh-hans/' in result + assert '我蒂特' in result + + deactivate_all() + + +def test_restricted(user_create, template_render_tag, template_context, common_tree): + context = template_context() + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert '"/contacts/australia/darwin/"' in result + assert '"/contacts/australia/alice/"' not in result + + context = template_context(user=user_create()) + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert '"/contacts/australia/darwin/"' not in result + assert '"/contacts/australia/alice/"' in result + + +def test_permissions(user_create, build_tree, template_render_tag, template_context): + + + +## ... source file continues with no further activate examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-deactivate-all.markdown b/content/pages/examples/django/django-utils-translation-deactivate-all.markdown new file mode 100644 index 000000000..c35b0be19 --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-deactivate-all.markdown @@ -0,0 +1,213 @@ +title: django.utils.translation deactivate_all code examples +category: page +slug: django-utils-translation-deactivate-all-examples +sortorder: 500011495 +toc: False +sidebartitle: django.utils.translation deactivate_all +meta: Python example code for the deactivate_all function from the django.utils.translation module of the Django project. + + +deactivate_all is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_pool.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_pool.py) + +```python +# plugin_pool.py +from operator import attrgetter + +from django.core.exceptions import ImproperlyConfigured +from django.conf.urls import url, include +from django.template.defaultfilters import slugify +from django.utils.encoding import force_text +from django.utils.functional import cached_property +from django.utils.module_loading import autodiscover_modules +~~from django.utils.translation import get_language, deactivate_all, activate +from django.template import TemplateDoesNotExist, TemplateSyntaxError + +from six import string_types, text_type + +from cms.exceptions import PluginAlreadyRegistered, PluginNotRegistered +from cms.plugin_base import CMSPluginBase +from cms.utils.conf import get_cms_setting +from cms.utils.helpers import normalize_name + + +class PluginPool(object): + + def __init__(self): + self.plugins = {} + self.discovered = False + + def _clear_cached(self): + if 'registered_plugins' in self.__dict__: + del self.__dict__['registered_plugins'] + + if 'plugins_with_extra_menu' in self.__dict__: + del self.__dict__['plugins_with_extra_menu'] + + if 'plugins_with_extra_placeholder_menu' in self.__dict__: + + +## ... source file abbreviated to get to deactivate_all examples ... + + + + if placeholder: + plugins = (plugin for plugin in plugins + if not plugin.requires_parent_plugin(placeholder, page)) + return sorted(plugins, key=attrgetter('module')) + + def get_text_enabled_plugins(self, placeholder, page): + plugins = set(self.get_all_plugins(placeholder, page)) + plugins.update(self.get_all_plugins(placeholder, page, 'text_only_plugins')) + return sorted((p for p in plugins if p.text_enabled), + key=attrgetter('module', 'name')) + + def get_plugin(self, name): + self.discover_plugins() + return self.plugins[name] + + def get_patterns(self): + self.discover_plugins() + + lang = get_language() +~~ deactivate_all() + + try: + url_patterns = [] + for plugin in self.registered_plugins: + p = plugin() + slug = slugify(force_text(normalize_name(p.__class__.__name__))) + url_patterns += [ + url(r'^plugin/%s/' % (slug,), include(p.plugin_urls)), + ] + finally: + activate(lang) + + return url_patterns + + def get_system_plugins(self): + self.discover_plugins() + return [plugin.__name__ for plugin in self.plugins.values() if plugin.system] + + @cached_property + def registered_plugins(self): + return self.get_all_plugins() + + @cached_property + def plugins_with_extra_menu(self): + + +## ... source file continues with no further deactivate_all examples... + +``` + + +## Example 2 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / tests / test_templatetags.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/tests/test_templatetags.py) + +```python +# test_templatetags.py +import pytest +from django.template.base import TemplateSyntaxError +~~from django.utils.translation import activate, deactivate_all + +from sitetree.exceptions import SiteTreeError +from sitetree.settings import ALIAS_THIS_ANCESTOR_CHILDREN, ALIAS_THIS_CHILDREN, ALIAS_THIS_PARENT_SIBLINGS, \ + ALIAS_THIS_SIBLINGS, ALIAS_TRUNK + + +def test_items_hook(template_render_tag, template_context, common_tree): + + from sitetree.toolbox import register_items_hook + + with pytest.raises(SiteTreeError): + register_items_hook(lambda: []) + + def my_processor(tree_items, tree_sender): + for item in tree_items: + item.hint = f'hooked_hint_{item.title}' + return tree_items + + register_items_hook(my_processor) + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', template_context()) + + assert 'hooked_hint_Darwin' in result + assert 'hooked_hint_Australia' in result + assert 'hooked_hint_China' in result + + +## ... source file abbreviated to get to deactivate_all examples ... + + + assert 'My title' in result + + activate('ru') + result = template_render_tag('sitetree', 'sitetree_tree from "i18tree"', template_context()) + + assert '/url_ru/' in result + assert 'Заголовок' in result + + activate('pt-br') + result = template_render_tag('sitetree', 'sitetree_tree from "i18tree"', template_context()) + + assert '/url_pt-br/' in result + assert 'Meu Título' in result + + activate('zh-hans') + result = template_render_tag('sitetree', 'sitetree_tree from "i18tree"', template_context()) + + assert '/url_zh-hans/' in result + assert '我蒂特' in result + +~~ deactivate_all() + + +def test_restricted(user_create, template_render_tag, template_context, common_tree): + context = template_context() + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert '"/contacts/australia/darwin/"' in result + assert '"/contacts/australia/alice/"' not in result + + context = template_context(user=user_create()) + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert '"/contacts/australia/darwin/"' not in result + assert '"/contacts/australia/alice/"' in result + + +def test_permissions(user_create, build_tree, template_render_tag, template_context): + + from sitetree.models import TreeItem + + build_tree( + {'alias': 'restricted_tree'}, + [ + {'title': 'Minjilang', 'access_restricted': True, 'url': '/contacts/australia/minjilang/'}, + + +## ... source file continues with no further deactivate_all examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown b/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown new file mode 100644 index 000000000..0b7d3d996 --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown @@ -0,0 +1,194 @@ +title: django.utils.translation get_language_from_request code examples +category: page +slug: django-utils-translation-get-language-from-request-examples +sortorder: 500011497 +toc: False +sidebartitle: django.utils.translation get_language_from_request +meta: Python example code for the get_language_from_request function from the django.utils.translation module of the Django project. + + +get_language_from_request is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / templatetags / djng_tags.py**](https://github.com/jrief/django-angular/blob/master/djng/templatetags/djng_tags.py) + +```python +# djng_tags.py +import json + +from django.template import Library +from django.template.base import Node, NodeList, TextNode, VariableNode +from django.utils.html import format_html +from django.utils.safestring import mark_safe +~~from django.utils.translation import get_language_from_request + +from djng.core.urlresolvers import get_all_remote_methods, get_current_remote_methods + + +register = Library() + + +@register.simple_tag(name='djng_all_rmi') +def djng_all_rmi(): + return mark_safe(json.dumps(get_all_remote_methods())) + + +@register.simple_tag(name='djng_current_rmi', takes_context=True) +def djng_current_rmi(context): + return mark_safe(json.dumps(get_current_remote_methods(context.get('view')))) + + +@register.simple_tag(name='load_djng_urls', takes_context=True) +def djng_urls(context, *namespaces): + raise DeprecationWarning( + "load_djng_urls templatetag is deprecated and has been removed from this version of django-angular." + "Please refer to documentation for updated way to manage django urls in angular.") + + + + +## ... source file abbreviated to get to get_language_from_request examples ... + + + values = [parser.compile_filter(bit) for bit in bits[1:]] + django_nodelist = parser.parse(('endangularjs',)) + angular_nodelist = NodeList() + for node in django_nodelist: + if isinstance(node, VariableNode): + tokens = node.filter_expression.token.split('.') + token = tokens[0] + for part in tokens[1:]: + if part.isdigit(): + token += '[%s]' % part + else: + token += '.%s' % part + node = TextNode('{{ %s }}' % token) + angular_nodelist.append(node) + parser.delete_first_token() + return AngularJsNode(django_nodelist, angular_nodelist, values[0]) + + +@register.simple_tag(name='djng_locale_script', takes_context=True) +def djng_locale_script(context, default_language='en'): +~~ language = get_language_from_request(context['request']) + if not language: + language = default_language + return format_html('angular-locale_{}.js', language.lower()) + + + +## ... source file continues with no further get_language_from_request examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / views.py**](https://github.com/divio/django-cms/blob/develop/cms/./views.py) + +```python +# views.py + +from django.conf import settings +from django.contrib.auth import REDIRECT_FIELD_NAME, login as auth_login +from django.contrib.auth.views import redirect_to_login +from django.http import HttpResponse, HttpResponseRedirect +from django.urls import reverse +from django.utils.cache import patch_cache_control +from django.utils.http import is_safe_url, urlquote +from django.utils.timezone import now +~~from django.utils.translation import get_language_from_request +from django.views.decorators.http import require_POST + +from cms.cache.page import get_page_cache +from cms.exceptions import LanguageError +from cms.forms.login import CMSToolbarLoginForm +from cms.models.pagemodel import TreeNode +from cms.page_rendering import _handle_no_page, render_page, render_object_structure, _render_welcome_page +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils import get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import (get_fallback_languages, get_public_languages, + get_redirect_on_fallback, get_language_list, + get_default_language_for_site, + is_language_prefix_patterns_used) +from cms.utils.page import get_page_from_request +from cms.utils.page_permissions import user_can_change_page + + +def _clean_redirect_url(redirect_url, language): + if (redirect_url and is_language_prefix_patterns_used() and redirect_url[0] == "/" + and not redirect_url.startswith('/%s/' % language)): + redirect_url = "/%s/%s" % (language, redirect_url.lstrip("/")) + return redirect_url + + + +## ... source file abbreviated to get to get_language_from_request examples ... + + + return response + + site = get_current_site() + page = get_page_from_request(request, use_path=slug) + toolbar = get_toolbar_from_request(request) + tree_nodes = TreeNode.objects.get_for_site(site) + + if not page and not slug and not tree_nodes.exists(): + return _render_welcome_page(request) + + if not page: + _handle_no_page(request) + + request.current_page = page + + if hasattr(request, 'user') and request.user.is_staff: + user_languages = get_language_list(site_id=site.pk) + else: + user_languages = get_public_languages(site_id=site.pk) + +~~ request_language = get_language_from_request(request, check_path=True) + + if not page.is_home and request_language not in user_languages: + return _handle_no_page(request) + + available_languages = [ + language for language in user_languages + if language in list(page.get_published_languages()) + ] + + own_urls = [ + request.build_absolute_uri(request.path), + '/%s' % request.path, + request.path, + ] + + try: + redirect_on_fallback = get_redirect_on_fallback(request_language, site_id=site.pk) + except LanguageError: + redirect_on_fallback = False + + if request_language not in user_languages: + default_language = get_default_language_for_site(site.pk) + fallbacks = get_fallback_languages(default_language, site_id=site.pk) + fallbacks = [default_language] + fallbacks + + +## ... source file continues with no further get_language_from_request examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-get-language.markdown b/content/pages/examples/django/django-utils-translation-get-language.markdown new file mode 100644 index 000000000..b0cdc386a --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-get-language.markdown @@ -0,0 +1,314 @@ +title: django.utils.translation get_language code examples +category: page +slug: django-utils-translation-get-language-examples +sortorder: 500011496 +toc: False +sidebartitle: django.utils.translation get_language +meta: Python example code for the get_language function from the django.utils.translation module of the Django project. + + +get_language is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_pool.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_pool.py) + +```python +# plugin_pool.py +from operator import attrgetter + +from django.core.exceptions import ImproperlyConfigured +from django.conf.urls import url, include +from django.template.defaultfilters import slugify +from django.utils.encoding import force_text +from django.utils.functional import cached_property +from django.utils.module_loading import autodiscover_modules +~~from django.utils.translation import get_language, deactivate_all, activate +from django.template import TemplateDoesNotExist, TemplateSyntaxError + +from six import string_types, text_type + +from cms.exceptions import PluginAlreadyRegistered, PluginNotRegistered +from cms.plugin_base import CMSPluginBase +from cms.utils.conf import get_cms_setting +from cms.utils.helpers import normalize_name + + +class PluginPool(object): + + def __init__(self): + self.plugins = {} + self.discovered = False + + def _clear_cached(self): + if 'registered_plugins' in self.__dict__: + del self.__dict__['registered_plugins'] + + if 'plugins_with_extra_menu' in self.__dict__: + del self.__dict__['plugins_with_extra_menu'] + + if 'plugins_with_extra_placeholder_menu' in self.__dict__: + + +## ... source file abbreviated to get to get_language examples ... + + + plugins = (plugin for plugin in plugins if plugin.__name__ not in excluded_plugins) + + if placeholder: + plugins = (plugin for plugin in plugins + if not plugin.requires_parent_plugin(placeholder, page)) + return sorted(plugins, key=attrgetter('module')) + + def get_text_enabled_plugins(self, placeholder, page): + plugins = set(self.get_all_plugins(placeholder, page)) + plugins.update(self.get_all_plugins(placeholder, page, 'text_only_plugins')) + return sorted((p for p in plugins if p.text_enabled), + key=attrgetter('module', 'name')) + + def get_plugin(self, name): + self.discover_plugins() + return self.plugins[name] + + def get_patterns(self): + self.discover_plugins() + +~~ lang = get_language() + deactivate_all() + + try: + url_patterns = [] + for plugin in self.registered_plugins: + p = plugin() + slug = slugify(force_text(normalize_name(p.__class__.__name__))) + url_patterns += [ + url(r'^plugin/%s/' % (slug,), include(p.plugin_urls)), + ] + finally: + activate(lang) + + return url_patterns + + def get_system_plugins(self): + self.discover_plugins() + return [plugin.__name__ for plugin in self.plugins.values() if plugin.system] + + @cached_property + def registered_plugins(self): + return self.get_all_plugins() + + @cached_property + + +## ... source file continues with no further get_language examples... + +``` + + +## Example 2 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / sitetreeapp.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./sitetreeapp.py) + +```python +# sitetreeapp.py +import warnings +from collections import defaultdict +from copy import deepcopy +from inspect import getfullargspec +from sys import exc_info +from threading import local +from typing import Callable, List, Optional, Dict, Union, Sequence, Any, Tuple + +from django.conf import settings +from django.core.cache import cache +from django.db.models import signals, QuerySet +from django.template.base import ( + FilterExpression, Lexer, Parser, Token, Variable, VariableDoesNotExist, VARIABLE_TAG_START, Context) +from django.template.defaulttags import url as url_tag +from django.template.loader import get_template +from django.utils import module_loading +from django.utils.http import urlquote +~~from django.utils.translation import get_language + +from .compat import TOKEN_BLOCK, TOKEN_TEXT, TOKEN_VAR +from .exceptions import SiteTreeError +from .settings import ( + ALIAS_TRUNK, ALIAS_THIS_CHILDREN, ALIAS_THIS_SIBLINGS, ALIAS_THIS_PARENT_SIBLINGS, ALIAS_THIS_ANCESTOR_CHILDREN, + UNRESOLVED_ITEM_MARKER, RAISE_ITEMS_ERRORS_ON_DEBUG, CACHE_TIMEOUT, DYNAMIC_ONLY, ADMIN_APP_NAME, SITETREE_CLS) +from .utils import get_tree_model, get_tree_item_model, import_app_sitetree_module, generate_id_for + +if False: # pragma: nocover + from django.contrib.auth.models import User # noqa + from .models import TreeItemBase, TreeBase + +TypeDynamicTrees = Dict[str, Union[Dict[str, List['TreeBase']], List['TreeBase']]] + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + +_ITEMS_PROCESSOR: Optional[Callable] = None + +_ITEMS_PROCESSOR_ARGS_LEN: int = 0 + +_I18N_TREES: List[str] = [] + + + +## ... source file abbreviated to get to get_language examples ... + + + if key not in self.cache[entry_name]: + self.cache[entry_name][key] = {} + + self.cache[entry_name][key].update(value) + + def set_entry(self, entry_name: str, key: str, value: Any): + self.cache[entry_name][key] = value + + +class SiteTree: + + cache_cls = Cache # Allow customizations. + + def __init__(self): + self.init(context=None) + + def init(self, context: Optional[Context]): + self.cache = self.cache_cls() + self.current_page_context = context + self.current_request = context.get('request', None) if context else None +~~ self.current_lang = get_language() + + self._current_app_is_admin = None + self._current_user_permissions = _UNSET + self._items_urls = {} # Resolved urls are cache for a request. + self._current_items = {} + + def resolve_tree_i18n_alias(self, alias: str) -> str: + if alias not in _I18N_TREES: + return alias + + current_language_code = self.current_lang + i18n_tree_alias = f'{alias}_{current_language_code}' + trees_count = self.cache.get_entry('tree_aliases', i18n_tree_alias) + + if trees_count is False: + trees_count = MODEL_TREE_CLASS.objects.filter(alias=i18n_tree_alias).count() + self.cache.set_entry('tree_aliases', i18n_tree_alias, trees_count) + + if trees_count: + alias = i18n_tree_alias + + return alias + + @staticmethod + + +## ... source file continues with no further get_language examples... + +``` + + +## Example 3 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / users / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/users/models.py) + +```python +# models.py +import os +import uuid + +from django.conf import settings +from django.db import models +from django.utils.translation import gettext_lazy as _ +~~from django.utils.translation import get_language + + +def upload_avatar_to(instance, filename): + filename, ext = os.path.splitext(filename) + return os.path.join( + 'avatar_images', + 'avatar_{uuid}_{filename}{ext}'.format( + uuid=uuid.uuid4(), filename=filename, ext=ext) + ) + + +class UserProfile(models.Model): + user = models.OneToOneField( + settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='wagtail_userprofile' + ) + + submitted_notifications = models.BooleanField( + verbose_name=_('submitted notifications'), + default=True, + help_text=_("Receive notification when a page is submitted for moderation") + ) + + approved_notifications = models.BooleanField( + verbose_name=_('approved notifications'), + + +## ... source file abbreviated to get to get_language examples ... + + + ) + + current_time_zone = models.CharField( + verbose_name=_('current time zone'), + max_length=40, + help_text=_("Select your current time zone"), + default='' + ) + + avatar = models.ImageField( + verbose_name=_('profile picture'), + upload_to=upload_avatar_to, + blank=True, + ) + + @classmethod + def get_for_user(cls, user): + return cls.objects.get_or_create(user=user)[0] + + def get_preferred_language(self): +~~ return self.preferred_language or get_language() + + def get_current_time_zone(self): + return self.current_time_zone or settings.TIME_ZONE + + def __str__(self): + return self.user.get_username() + + class Meta: + verbose_name = _('user profile') + verbose_name_plural = _('user profiles') + + + +## ... source file continues with no further get_language examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown new file mode 100644 index 000000000..dd7ed3bab --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown @@ -0,0 +1,50 @@ +title: django.utils.translation gettext_lazy code examples +category: page +slug: django-utils-translation-gettext-lazy-examples +sortorder: 500011499 +toc: False +sidebartitle: django.utils.translation gettext_lazy +meta: Python example code for the gettext_lazy function from the django.utils.translation module of the Django project. + + +gettext_lazy is a function within the django.utils.translation module of the Django project. + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / forms.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/forms.py) + +```python +# forms.py +from django import forms +from django.utils.crypto import constant_time_compare +from django.utils.translation import gettext as _ +~~from django.utils.translation import gettext_lazy + + +class PasswordViewRestrictionForm(forms.Form): +~~ password = forms.CharField(label=gettext_lazy("Password"), widget=forms.PasswordInput) + return_url = forms.CharField(widget=forms.HiddenInput) + + def __init__(self, *args, **kwargs): + self.restriction = kwargs.pop('instance') + super().__init__(*args, **kwargs) + + def clean_password(self): + data = self.cleaned_data['password'] + if not constant_time_compare(data, self.restriction.password): + raise forms.ValidationError(_("The password you have entered is not correct. Please try again.")) + + return data + + + +## ... source file continues with no further gettext_lazy examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-gettext.markdown b/content/pages/examples/django/django-utils-translation-gettext.markdown new file mode 100644 index 000000000..28b65593e --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-gettext.markdown @@ -0,0 +1,760 @@ +title: django.utils.translation gettext code examples +category: page +slug: django-utils-translation-gettext-examples +sortorder: 500011498 +toc: False +sidebartitle: django.utils.translation gettext +meta: Python example code for the gettext function from the django.utils.translation module of the Django project. + + +gettext is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / forms.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py) + +```python +# forms.py +from __future__ import absolute_import + +import warnings +from importlib import import_module + +from django import forms +from django.contrib.auth.tokens import PasswordResetTokenGenerator +from django.contrib.sites.shortcuts import get_current_site +from django.core import exceptions, validators +from django.urls import reverse +~~from django.utils.translation import gettext, gettext_lazy as _, pgettext + +from ..utils import ( + build_absolute_uri, + get_username_max_length, + set_form_field_order, +) +from . import app_settings +from .adapter import get_adapter +from .app_settings import AuthenticationMethod +from .models import EmailAddress +from .utils import ( + filter_users_by_email, + get_user_model, + perform_login, + setup_user_email, + sync_user_email_addresses, + url_str_to_user_pk, + user_email, + user_pk_to_url_str, + user_username, +) + + +class EmailAwarePasswordResetTokenGenerator(PasswordResetTokenGenerator): + + +## ... source file abbreviated to get to gettext examples ... + + + username_field.max_length) + + default_field_order = [ + 'email', + 'email2', # ignored when not present + 'username', + 'password1', + 'password2' # ignored when not present + ] + if app_settings.SIGNUP_EMAIL_ENTER_TWICE: + self.fields["email2"] = forms.EmailField( + label=_("E-mail (again)"), + widget=forms.TextInput( + attrs={ + 'type': 'email', + 'placeholder': _('E-mail address confirmation') + } + ) + ) + if email_required: +~~ self.fields['email'].label = gettext("E-mail") + self.fields['email'].required = True + else: +~~ self.fields['email'].label = gettext("E-mail (optional)") + self.fields['email'].required = False + self.fields['email'].widget.is_required = False + if self.username_required: + default_field_order = [ + 'username', + 'email', + 'email2', # ignored when not present + 'password1', + 'password2' # ignored when not present + ] + + if not self.username_required: + del self.fields["username"] + + set_form_field_order( + self, + getattr(self, 'field_order', None) or default_field_order) + + def clean_username(self): + value = self.cleaned_data["username"] + value = get_adapter().clean_username(value) + return value + + def clean_email(self): + + +## ... source file continues with no further gettext examples... + +``` + + +## Example 2 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / admin.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./admin.py) + +```python +# admin.py +from collections import OrderedDict + +from django import forms +from django.conf import settings +from django.contrib import admin, messages +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth import get_user_model +from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse, path +~~from django.utils.translation import gettext_lazy as _ +~~from django.utils.translation import gettext +from guardian.forms import GroupObjectPermissionsForm, UserObjectPermissionsForm +from django.contrib.auth.models import Group +from guardian.shortcuts import (get_group_perms, get_groups_with_perms, get_perms_for_model, get_user_perms, + get_users_with_perms) + + +class AdminUserObjectPermissionsForm(UserObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class AdminGroupObjectPermissionsForm(GroupObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class GuardedModelAdminMixin: + change_form_template = \ + 'admin/guardian/model/change_form.html' + obj_perms_manage_template = \ + 'admin/guardian/model/obj_perms_manage.html' + obj_perms_manage_user_template = \ + + +## ... source file abbreviated to get to gettext examples ... + + + + return render(request, self.get_obj_perms_manage_template(), context) + + def get_obj_perms_manage_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage.html' + return self.obj_perms_manage_template + + def obj_perms_manage_user_view(self, request, object_pk, user_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + user = get_object_or_404(get_user_model(), pk=user_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_user_form(request) + form = form_class(user, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() +~~ msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user.pk] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['user_obj'] = user + context['user_perms'] = get_user_perms(user, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_user_template(), context) + + def get_obj_perms_manage_user_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + + +## ... source file abbreviated to get to gettext examples ... + + + return UserManage + + def get_obj_perms_group_select_form(self, request): + return GroupManage + + def get_obj_perms_manage_user_form(self, request): + return AdminUserObjectPermissionsForm + + def obj_perms_manage_group_view(self, request, object_pk, group_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + group = get_object_or_404(Group, id=group_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_group_form(request) + form = form_class(group, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() +~~ msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group.id] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['group_obj'] = group + context['group_perms'] = get_group_perms(group, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_group_template(), context) + + def get_obj_perms_manage_group_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_group.html' + + +## ... source file continues with no further gettext examples... + +``` + + +## Example 3 from django-taggit +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([source code](https://github.com/jazzband/django-debug-toolbar) and +[PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / models.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./models.py) + +```python +# models.py +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.db import IntegrityError, models, router, transaction +from django.utils.text import slugify +~~from django.utils.translation import gettext, gettext_lazy as _ + +try: + from unidecode import unidecode +except ImportError: + + def unidecode(tag): + return tag + + +class TagBase(models.Model): + name = models.CharField(verbose_name=_("name"), unique=True, max_length=100) + slug = models.SlugField(verbose_name=_("slug"), unique=True, max_length=100) + + def __str__(self): + return self.name + + def __gt__(self, other): + return self.name.lower() > other.name.lower() + + def __lt__(self, other): + return self.name.lower() < other.name.lower() + + class Meta: + abstract = True + + +## ... source file abbreviated to get to gettext examples ... + + + i += 1 + else: + return super().save(*args, **kwargs) + + def slugify(self, tag, i=None): + slug = slugify(unidecode(tag)) + if i is not None: + slug += "_%d" % i + return slug + + +class Tag(TagBase): + class Meta: + verbose_name = _("tag") + verbose_name_plural = _("tags") + app_label = "taggit" + + +class ItemBase(models.Model): + def __str__(self): +~~ return gettext("%(object)s tagged with %(tag)s") % { + "object": self.content_object, + "tag": self.tag, + } + + class Meta: + abstract = True + + @classmethod + def tag_model(cls): + field = cls._meta.get_field("tag") + return field.remote_field.model + + @classmethod + def tag_relname(cls): + field = cls._meta.get_field("tag") + return field.remote_field.related_name + + @classmethod + def lookup_kwargs(cls, instance): + return {"content_object": instance} + + @classmethod + def tags_for(cls, model, instance=None, **extra_filters): + kwargs = extra_filters or {} + + +## ... source file continues with no further gettext examples... + +``` + + +## Example 4 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms.py) + +```python +# forms.py + "TextInputPrepend", + "CreateForm", + "DeleteForm", + "PermissionsForm", + "DirFilterForm", + "SearchForm", +] + +from datetime import timedelta + +from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model +from django.core import validators +from django.core.validators import RegexValidator +from django.forms.widgets import HiddenInput +from django.shortcuts import get_object_or_404 +from django.urls import Resolver404, resolve +from django.utils import timezone +from django.utils.safestring import mark_safe +~~from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.plugins.base import PluginSettingsFormMixin +from wiki.editors import getEditor + +from .forms_account_handling import UserCreationForm, UserUpdateForm + +validate_slug_numbers = RegexValidator( + r"^[0-9]+$", + _("A 'slug' cannot consist solely of numbers."), + "invalid", + inverse_match=True, +) + + +class WikiSlugField(forms.CharField): + + default_validators = [validators.validate_slug, validate_slug_numbers] + + def __init__(self, *args, **kwargs): + self.allow_unicode = kwargs.pop("allow_unicode", False) + if self.allow_unicode: + + +## ... source file abbreviated to get to gettext examples ... + + + super().__init__(*args, **kwargs) + + +def _clean_slug(slug, urlpath): + if slug.startswith("_"): + raise forms.ValidationError(gettext("A slug may not begin with an underscore.")) + if slug == "admin": + raise forms.ValidationError(gettext("'admin' is not a permitted slug name.")) + + if settings.URL_CASE_SENSITIVE: + already_existing_slug = models.URLPath.objects.filter(slug=slug, parent=urlpath) + else: + slug = slug.lower() + already_existing_slug = models.URLPath.objects.filter( + slug__iexact=slug, parent=urlpath + ) + if already_existing_slug: + already_urlpath = already_existing_slug[0] + if already_urlpath.article and already_urlpath.article.current_revision.deleted: + raise forms.ValidationError( +~~ gettext('A deleted article with slug "%s" already exists.') + % already_urlpath.slug + ) + else: + raise forms.ValidationError( +~~ gettext('A slug named "%s" already exists.') % already_urlpath.slug + ) + + if settings.CHECK_SLUG_URL_AVAILABLE: + try: + match = resolve(urlpath.path + "/" + slug + "/") + if match.app_name != "wiki": + raise forms.ValidationError( +~~ gettext("This slug conflicts with an existing URL.") + ) + except Resolver404: + pass + + return slug + + +User = get_user_model() +Group = apps.get_model(settings.GROUP_MODEL) + + +class SpamProtectionMixin: + + + revision_model = models.ArticleRevision + + def check_spam(self): # noqa + request = self.request + user = None + ip_address = None + if request.user.is_authenticated: + user = request.user + else: + ip_address = request.META.get("REMOTE_ADDR", None) + + if not (user or ip_address): + raise forms.ValidationError( +~~ gettext( + "Spam protection failed to find both a logged in user and an IP address." + ) + ) + + def check_interval(from_time, max_count, interval_name): + from_time = timezone.now() - timedelta( + minutes=settings.REVISIONS_MINUTES_LOOKBACK + ) + revisions = self.revision_model.objects.filter(created__gte=from_time,) + if user: + revisions = revisions.filter(user=user) + if ip_address: + revisions = revisions.filter(ip_address=ip_address) + revisions = revisions.count() + if revisions >= max_count: + raise forms.ValidationError( +~~ gettext( + "Spam protection: You are only allowed to create or edit %(revisions)d article(s) per %(interval_name)s." + ) + % {"revisions": max_count, "interval_name": interval_name} + ) + + if not settings.LOG_IPS_ANONYMOUS: + return + if request.user.has_perm("wiki.moderator"): + return + + from_time = timezone.now() - timedelta( + minutes=settings.REVISIONS_MINUTES_LOOKBACK + ) + if request.user.is_authenticated: + per_minute = settings.REVISIONS_PER_MINUTES + else: + per_minute = settings.REVISIONS_PER_MINUTES_ANONYMOUS + check_interval( + from_time, + per_minute, + _("minute") + if settings.REVISIONS_MINUTES_LOOKBACK == 1 + else (_("%d minutes") % settings.REVISIONS_MINUTES_LOOKBACK), + ) + + +## ... source file abbreviated to get to gettext examples ... + + + if provided_content: + self.presumed_revision = self.initial_revision.id + else: + newdata["content"] = simple_merge( + content, data.get("content", "") + ) + newdata["title"] = current_revision.title + kwargs["data"] = newdata + else: + kwargs["data"] = data + + kwargs["initial"] = initial + + super().__init__(*args, **kwargs) + + def clean_title(self): + title = self.cleaned_data.get("title", None) + title = (title or "").strip() + if not title: + raise forms.ValidationError( +~~ gettext("Article is missing title or has an invalid title") + ) + return title + + def clean(self): + if self.no_clean or self.preview: + return self.cleaned_data + if not str(self.initial_revision.id) == str(self.presumed_revision): + raise forms.ValidationError( +~~ gettext( + "While you were editing, someone else changed the revision. Your contents have been automatically merged with the new contents. Please review the text below." + ) + ) + if ( + "title" in self.cleaned_data + and self.cleaned_data["title"] == self.initial_revision.title + and self.cleaned_data["content"] == self.initial_revision.content + ): + raise forms.ValidationError(gettext("No changes made. Nothing to save.")) + self.check_spam() + return self.cleaned_data + + +class SelectWidgetBootstrap(forms.Select): + + def __init__(self, attrs=None, choices=()): + if attrs is None: + attrs = {"class": ""} + elif "class" not in attrs: + attrs["class"] = "" + attrs["class"] += " form-control" + + super().__init__(attrs, choices) + + + +## ... source file abbreviated to get to gettext examples ... + + + super().__init__(*args, **kwargs) + + confirm = forms.BooleanField(required=False, label=_("Yes, I am sure")) + purge = forms.BooleanField( + widget=HiddenInput(), + required=False, + label=_("Purge"), + help_text=_( + "Purge the article: Completely remove it (and all its contents) with no undo. Purging is a good idea if you want to free the slug such that users can create new articles in its place." + ), + ) + revision = forms.ModelChoiceField( + models.ArticleRevision.objects.all(), widget=HiddenInput(), required=False + ) + + def clean(self): + if not self.cleaned_data["confirm"]: + raise forms.ValidationError(gettext("You are not sure enough!")) + if self.cleaned_data["revision"] != self.article.current_revision: + raise forms.ValidationError( +~~ gettext( + "While you tried to delete this article, it was modified. TAKE CARE!" + ) + ) + return self.cleaned_data + + +class PermissionsForm(PluginSettingsFormMixin, forms.ModelForm): + + locked = forms.BooleanField( + label=_("Lock article"), + help_text=_("Deny all users access to edit this article."), + required=False, + ) + + settings_form_headline = _("Permissions") + settings_order = 5 + settings_write_access = False + + owner_username = forms.CharField( + required=False, + label=_("Owner"), + help_text=_("Enter the username of the owner."), + ) + group = forms.ModelChoiceField( + + +## ... source file continues with no further gettext examples... + +``` + + +## Example 5 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / images / wagtail_hooks.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/wagtail_hooks.py) + +```python +# wagtail_hooks.py +from django.conf.urls import include, url +from django.urls import reverse +from django.utils.html import format_html +~~from django.utils.translation import gettext_lazy as _ +~~from django.utils.translation import gettext, ngettext + +import wagtail.admin.rich_text.editors.draftail.features as draftail_features +from wagtail.admin.menu import MenuItem +from wagtail.admin.navigation import get_site_for_user +from wagtail.admin.rich_text import HalloPlugin +from wagtail.admin.search import SearchArea +from wagtail.admin.site_summary import SummaryItem +from wagtail.core import hooks +from wagtail.images import admin_urls, get_image_model, image_operations +from wagtail.images.api.admin.views import ImagesAdminAPIViewSet +from wagtail.images.forms import GroupImagePermissionFormSet +from wagtail.images.permissions import permission_policy +from wagtail.images.rich_text import ImageEmbedHandler +from wagtail.images.rich_text.contentstate import ContentstateImageConversionRule +from wagtail.images.rich_text.editor_html import EditorHTMLImageConversionRule + + +@hooks.register('register_admin_urls') +def register_admin_urls(): + return [ + url(r'^images/', include(admin_urls, namespace='wagtailimages')), + ] + + + + +## ... source file abbreviated to get to gettext examples ... + + +def register_image_feature(features): + features.register_embed_type(ImageEmbedHandler) + + features.register_editor_plugin( + 'hallo', 'image', + HalloPlugin( + name='hallowagtailimage', + js=[ + 'wagtailimages/js/image-chooser-modal.js', + 'wagtailimages/js/hallo-plugins/hallo-wagtailimage.js', + ], + ) + ) + + features.register_converter_rule('editorhtml', 'image', EditorHTMLImageConversionRule) + + features.register_editor_plugin( + 'draftail', 'image', draftail_features.EntityFeature({ + 'type': 'IMAGE', + 'icon': 'image', +~~ 'description': gettext('Image'), + 'attributes': ['id', 'src', 'alt', 'format'], + 'whitelist': { + 'id': True, + } + }, js=[ + 'wagtailimages/js/image-chooser-modal.js', + ]) + ) + + features.register_converter_rule('contentstate', 'image', ContentstateImageConversionRule) + + features.default_features.append('image') + + +@hooks.register('register_image_operations') +def register_image_operations(): + return [ + ('original', image_operations.DoNothingOperation), + ('fill', image_operations.FillOperation), + ('min', image_operations.MinMaxOperation), + ('max', image_operations.MinMaxOperation), + ('width', image_operations.WidthHeightOperation), + ('height', image_operations.WidthHeightOperation), + ('scale', image_operations.ScaleOperation), + + +## ... source file continues with no further gettext examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-language-session-key.markdown b/content/pages/examples/django/django-utils-translation-language-session-key.markdown new file mode 100644 index 000000000..4d5e63725 --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-language-session-key.markdown @@ -0,0 +1,55 @@ +title: django.utils.translation LANGUAGE_SESSION_KEY code examples +category: page +slug: django-utils-translation-language-session-key-examples +sortorder: 500011493 +toc: False +sidebartitle: django.utils.translation LANGUAGE_SESSION_KEY +meta: Python example code for the LANGUAGE_SESSION_KEY class from the django.utils.translation module of the Django project. + + +LANGUAGE_SESSION_KEY is a class within the django.utils.translation module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / middleware / language.py**](https://github.com/divio/django-cms/blob/develop/cms/middleware/language.py) + +```python +# language.py +import datetime + +~~from django.utils.translation import LANGUAGE_SESSION_KEY, get_language +from django.conf import settings + +from cms.utils.compat import DJANGO_2_2 +from cms.utils.compat.dj import MiddlewareMixin + + +class LanguageCookieMiddleware(MiddlewareMixin): + def process_response(self, request, response): + language = get_language() + if hasattr(request, 'session') and DJANGO_2_2: +~~ session_language = request.session.get(LANGUAGE_SESSION_KEY, None) + if session_language and not session_language == language: +~~ request.session[LANGUAGE_SESSION_KEY] = language + request.session.save() + if settings.LANGUAGE_COOKIE_NAME in request.COOKIES and \ + request.COOKIES[settings.LANGUAGE_COOKIE_NAME] == language: + return response + max_age = 365 * 24 * 60 * 60 # 10 years + expires = datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age) + response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language, expires=expires) + return response + + + +## ... source file continues with no further LANGUAGE_SESSION_KEY examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-ngettext.markdown b/content/pages/examples/django/django-utils-translation-ngettext.markdown new file mode 100644 index 000000000..1cfcbf7e2 --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-ngettext.markdown @@ -0,0 +1,208 @@ +title: django.utils.translation ngettext code examples +category: page +slug: django-utils-translation-ngettext-examples +sortorder: 500011500 +toc: False +sidebartitle: django.utils.translation ngettext +meta: Python example code for the ngettext function from the django.utils.translation module of the Django project. + + +ngettext is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / article.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/article.py) + +```python +# article.py +import difflib +import logging +from urllib.parse import urljoin + +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.db import transaction +from django.db.models import Q +from django.http import Http404 +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.shortcuts import render +from django.urls import reverse +from django.utils.decorators import method_decorator +from django.utils.translation import gettext as _ +~~from django.utils.translation import ngettext +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.generic import DetailView +from django.views.generic import FormView +from django.views.generic import ListView +from django.views.generic import RedirectView +from django.views.generic import TemplateView +from django.views.generic import View +from wiki import editors +from wiki import forms +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.exceptions import NoRootURL +from wiki.core.paginator import WikiPaginator +from wiki.core.plugins import registry as plugin_registry +from wiki.core.utils import object_to_json_response +from wiki.decorators import get_article +from wiki.views.mixins import ArticleMixin + +log = logging.getLogger(__name__) + + +class ArticleView(ArticleMixin, TemplateView): + + +## ... source file abbreviated to get to ngettext examples ... + + + src_len = len(src_path) + pos = src_path.rfind("/", 0, src_len - 1) + slug = src_path[pos + 1 : src_len - 1] + parent_urlpath = models.URLPath.get_by_path(src_path[0 : max(pos, 0)]) + + link = "[wiki:/{path}](wiki:/{path})".format(path=dst_path) + urlpath_new = models.URLPath._create_urlpath_from_request( + self.request, + self.article, + parent_urlpath, + slug, + _("Moved: {title}").format(title=descendant.article), + _("Article moved to {link}").format(link=link), + _("Created redirect (auto)"), + ) + urlpath_new.moved_to = descendant + urlpath_new.save() + + messages.success( + self.request, +~~ ngettext( + "Article successfully moved! Created {n} redirect.", + "Article successfully moved! Created {n} redirects.", + len(descendants), + ).format(n=len(descendants)), + ) + + else: + messages.success(self.request, _("Article successfully moved!")) + return redirect("wiki:get", path=self.urlpath.path) + + +class Deleted(Delete): + + + template_name = "wiki/deleted.html" + form_class = forms.DeleteForm + + @method_decorator(get_article(can_read=True, deleted_contents=True)) + def dispatch(self, request, article, *args, **kwargs): + + self.urlpath = kwargs.get("urlpath", None) + self.article = article + + if self.urlpath: + + +## ... source file continues with no further ngettext examples... + +``` + + +## Example 2 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / images / wagtail_hooks.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/wagtail_hooks.py) + +```python +# wagtail_hooks.py +from django.conf.urls import include, url +from django.urls import reverse +from django.utils.html import format_html +from django.utils.translation import gettext_lazy as _ +~~from django.utils.translation import gettext, ngettext + +import wagtail.admin.rich_text.editors.draftail.features as draftail_features +from wagtail.admin.menu import MenuItem +from wagtail.admin.navigation import get_site_for_user +from wagtail.admin.rich_text import HalloPlugin +from wagtail.admin.search import SearchArea +from wagtail.admin.site_summary import SummaryItem +from wagtail.core import hooks +from wagtail.images import admin_urls, get_image_model, image_operations +from wagtail.images.api.admin.views import ImagesAdminAPIViewSet +from wagtail.images.forms import GroupImagePermissionFormSet +from wagtail.images.permissions import permission_policy +from wagtail.images.rich_text import ImageEmbedHandler +from wagtail.images.rich_text.contentstate import ContentstateImageConversionRule +from wagtail.images.rich_text.editor_html import EditorHTMLImageConversionRule + + +@hooks.register('register_admin_urls') +def register_admin_urls(): + return [ + url(r'^images/', include(admin_urls, namespace='wagtailimages')), + ] + + + + +## ... source file abbreviated to get to ngettext examples ... + + +def register_images_search_area(): + return ImagesSearchArea( + _('Images'), reverse('wagtailimages:index'), + name='images', + classnames='icon icon-image', + order=200) + + +@hooks.register('register_group_permission_panel') +def register_image_permissions_panel(): + return GroupImagePermissionFormSet + + +@hooks.register('describe_collection_contents') +def describe_collection_docs(collection): + images_count = get_image_model().objects.filter(collection=collection).count() + if images_count: + url = reverse('wagtailimages:index') + ('?collection_id=%d' % collection.id) + return { + 'count': images_count, +~~ 'count_text': ngettext( + "%(count)s image", + "%(count)s images", + images_count + ) % {'count': images_count}, + 'url': url, + } + + + +## ... source file continues with no further ngettext examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-override.markdown b/content/pages/examples/django/django-utils-translation-override.markdown new file mode 100644 index 000000000..701e02c49 --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-override.markdown @@ -0,0 +1,200 @@ +title: django.utils.translation override code examples +category: page +slug: django-utils-translation-override-examples +sortorder: 500011501 +toc: False +sidebartitle: django.utils.translation override +meta: Python example code for the override function from the django.utils.translation module of the Django project. + + +override is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / appresolver.py**](https://github.com/divio/django-cms/blob/develop/cms/./appresolver.py) + +```python +# appresolver.py +from collections import OrderedDict +from importlib import import_module + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db import OperationalError, ProgrammingError +~~from django.utils.translation import get_language, override +from django.urls import Resolver404, reverse + +from six import string_types + +from cms.apphook_pool import apphook_pool +from cms.models.pagemodel import Page +from cms.utils import get_current_site +from cms.utils.compat import DJANGO_1_11 +from cms.utils.compat.dj import RegexPattern, URLPattern, URLResolver +from cms.utils.i18n import get_language_list +from cms.utils.moderator import use_draft + + +APP_RESOLVERS = [] + + +def clear_app_resolvers(): + global APP_RESOLVERS + APP_RESOLVERS = [] + + +def applications_page_check(request, current_page=None, path=None): + if current_page: + return current_page + + +## ... source file abbreviated to get to override examples ... + + + + hooked_applications = OrderedDict() + + titles = (title_qs.exclude(page__application_urls=None) + .exclude(page__application_urls='') + .order_by('-page__node__path').select_related()) + for title in titles: + path = title.path + mix_id = "%s:%s:%s" % ( + path + "/", title.page.application_urls, title.language) + if mix_id in included: + continue + if not settings.APPEND_SLASH: + path += '/' + app = apphook_pool.get_apphook(title.page.application_urls) + if not app: + continue + if title.page_id not in hooked_applications: + hooked_applications[title.page_id] = {} + app_ns = app.app_name, title.page.application_namespace +~~ with override(title.language): + hooked_applications[title.page_id][title.language] = ( + app_ns, get_patterns_for_title(path, title), app) + included.append(mix_id) + app_patterns = [] + for page_id in hooked_applications.keys(): + resolver = None + for lang in hooked_applications[page_id].keys(): + (app_ns, inst_ns), current_patterns, app = hooked_applications[page_id][lang] # nopyflakes + if not resolver: + regex_pattern = RegexPattern(r'') if not DJANGO_1_11 else r'' + resolver = AppRegexURLResolver( + regex_pattern, 'app_resolver', app_name=app_ns, namespace=inst_ns) + resolver.page_id = page_id + if app.permissions: + _set_permissions(current_patterns, app.exclude_permissions) + + resolver.url_patterns_dict[lang] = current_patterns + app_patterns.append(resolver) + APP_RESOLVERS.append(resolver) + return app_patterns + + + +## ... source file continues with no further override examples... + +``` + + +## Example 2 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / mail.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/mail.py) + +```python +# mail.py +import logging + +from django.conf import settings +from django.core.mail import get_connection +from django.core.mail.message import EmailMultiAlternatives +from django.template.loader import render_to_string +~~from django.utils.translation import override + +from wagtail.admin.auth import users_with_page_permission +from wagtail.core.models import PageRevision +from wagtail.users.models import UserProfile + + +logger = logging.getLogger('wagtail.admin') + + +def send_mail(subject, message, recipient_list, from_email=None, **kwargs): + if not from_email: + if hasattr(settings, 'WAGTAILADMIN_NOTIFICATION_FROM_EMAIL'): + from_email = settings.WAGTAILADMIN_NOTIFICATION_FROM_EMAIL + elif hasattr(settings, 'DEFAULT_FROM_EMAIL'): + from_email = settings.DEFAULT_FROM_EMAIL + else: + from_email = 'webmaster@localhost' + + connection = kwargs.get('connection', False) or get_connection( + username=kwargs.get('auth_user', None), + password=kwargs.get('auth_password', None), + fail_silently=kwargs.get('fail_silently', None), + ) + multi_alt_kwargs = { + + +## ... source file abbreviated to get to override examples ... + + + ) + ] + + if not email_recipients: + return True + + template_subject = 'wagtailadmin/notifications/' + notification + '_subject.txt' + template_text = 'wagtailadmin/notifications/' + notification + '.txt' + template_html = 'wagtailadmin/notifications/' + notification + '.html' + + context = { + "revision": revision, + "settings": settings, + } + + sent_count = 0 + for recipient in email_recipients: + try: + context["user"] = recipient + +~~ with override(recipient.wagtail_userprofile.get_preferred_language()): + email_subject = render_to_string(template_subject, context).strip() + email_content = render_to_string(template_text, context).strip() + + kwargs = {} + if getattr(settings, 'WAGTAILADMIN_NOTIFICATION_USE_HTML', False): + kwargs['html_message'] = render_to_string(template_html, context) + + send_mail(email_subject, email_content, [recipient.email], **kwargs) + sent_count += 1 + except Exception: + logger.exception( + "Failed to send notification email '%s' to %s", + email_subject, recipient.email + ) + + return sent_count == len(email_recipients) + + + +## ... source file continues with no further override examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown new file mode 100644 index 000000000..18758dcf8 --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown @@ -0,0 +1,183 @@ +title: django.utils.translation pgettext_lazy code examples +category: page +slug: django-utils-translation-pgettext-lazy-examples +sortorder: 500011503 +toc: False +sidebartitle: django.utils.translation pgettext_lazy +meta: Python example code for the pgettext_lazy function from the django.utils.translation module of the Django project. + + +pgettext_lazy is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms.py) + +```python +# forms.py + "TextInputPrepend", + "CreateForm", + "DeleteForm", + "PermissionsForm", + "DirFilterForm", + "SearchForm", +] + +from datetime import timedelta + +from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model +from django.core import validators +from django.core.validators import RegexValidator +from django.forms.widgets import HiddenInput +from django.shortcuts import get_object_or_404 +from django.urls import Resolver404, resolve +from django.utils import timezone +from django.utils.safestring import mark_safe +~~from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.plugins.base import PluginSettingsFormMixin +from wiki.editors import getEditor + +from .forms_account_handling import UserCreationForm, UserUpdateForm + +validate_slug_numbers = RegexValidator( + r"^[0-9]+$", + _("A 'slug' cannot consist solely of numbers."), + "invalid", + inverse_match=True, +) + + +class WikiSlugField(forms.CharField): + + default_validators = [validators.validate_slug, validate_slug_numbers] + + def __init__(self, *args, **kwargs): + self.allow_unicode = kwargs.pop("allow_unicode", False) + if self.allow_unicode: + + +## ... source file abbreviated to get to pgettext_lazy examples ... + + + ) + + def clean(self): + cd = super().clean() + if cd.get("slug"): + dest_path = get_object_or_404( + models.URLPath, pk=self.cleaned_data["destination"] + ) + cd["slug"] = _clean_slug(cd["slug"], dest_path) + return cd + + +class EditForm(forms.Form, SpamProtectionMixin): + + title = forms.CharField(label=_("Title"),) + content = forms.CharField( + label=_("Contents"), required=False, widget=getEditor().get_widget() + ) # @UndefinedVariable + + summary = forms.CharField( +~~ label=pgettext_lazy("Revision comment", "Summary"), + help_text=_( + "Give a short reason for your edit, which will be stated in the revision log." + ), + required=False, + ) + + current_revision = forms.IntegerField(required=False, widget=forms.HiddenInput()) + + def __init__(self, request, current_revision, *args, **kwargs): + + self.request = request + self.no_clean = kwargs.pop("no_clean", False) + self.preview = kwargs.pop("preview", False) + self.initial_revision = current_revision + self.presumed_revision = None + if current_revision: + provided_content = True + content = kwargs.pop("content", None) + if content is None: + provided_content = False + content = current_revision.content + initial = { + "content": content, + "title": current_revision.title, + + +## ... source file abbreviated to get to pgettext_lazy examples ... + + + +class CreateForm(forms.Form, SpamProtectionMixin): + def __init__(self, request, urlpath_parent, *args, **kwargs): + super().__init__(*args, **kwargs) + self.request = request + self.urlpath_parent = urlpath_parent + + title = forms.CharField(label=_("Title"),) + slug = WikiSlugField( + label=_("Slug"), + help_text=_( + "This will be the address where your article can be found. Use only alphanumeric characters and - or _.
Note: If you change the slug later on, links pointing to this article are not updated." + ), + max_length=models.URLPath.SLUG_MAX_LENGTH, + ) + content = forms.CharField( + label=_("Contents"), required=False, widget=getEditor().get_widget() + ) # @UndefinedVariable + + summary = forms.CharField( +~~ label=pgettext_lazy("Revision comment", "Summary"), + help_text=_("Write a brief message for the article's history log."), + required=False, + ) + + def clean_slug(self): + return _clean_slug(self.cleaned_data["slug"], self.urlpath_parent) + + def clean(self): + self.check_spam() + return self.cleaned_data + + +class DeleteForm(forms.Form): + def __init__(self, *args, **kwargs): + self.article = kwargs.pop("article") + self.has_children = kwargs.pop("has_children") + super().__init__(*args, **kwargs) + + confirm = forms.BooleanField(required=False, label=_("Yes, I am sure")) + purge = forms.BooleanField( + widget=HiddenInput(), + required=False, + label=_("Purge"), + help_text=_( + + +## ... source file continues with no further pgettext_lazy examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-pgettext.markdown b/content/pages/examples/django/django-utils-translation-pgettext.markdown new file mode 100644 index 000000000..cc4eac5ee --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-pgettext.markdown @@ -0,0 +1,115 @@ +title: django.utils.translation pgettext code examples +category: page +slug: django-utils-translation-pgettext-examples +sortorder: 500011502 +toc: False +sidebartitle: django.utils.translation pgettext +meta: Python example code for the pgettext function from the django.utils.translation module of the Django project. + + +pgettext is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / forms.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py) + +```python +# forms.py +from __future__ import absolute_import + +import warnings +from importlib import import_module + +from django import forms +from django.contrib.auth.tokens import PasswordResetTokenGenerator +from django.contrib.sites.shortcuts import get_current_site +from django.core import exceptions, validators +from django.urls import reverse +~~from django.utils.translation import gettext, gettext_lazy as _, pgettext + +from ..utils import ( + build_absolute_uri, + get_username_max_length, + set_form_field_order, +) +from . import app_settings +from .adapter import get_adapter +from .app_settings import AuthenticationMethod +from .models import EmailAddress +from .utils import ( + filter_users_by_email, + get_user_model, + perform_login, + setup_user_email, + sync_user_email_addresses, + url_str_to_user_pk, + user_email, + user_pk_to_url_str, + user_username, +) + + +class EmailAwarePasswordResetTokenGenerator(PasswordResetTokenGenerator): + + +## ... source file abbreviated to get to pgettext examples ... + + + 'placeholder': + _('E-mail address'), + 'autofocus': 'autofocus'}) + login_field = forms.EmailField(label=_("E-mail"), + widget=login_widget) + elif app_settings.AUTHENTICATION_METHOD \ + == AuthenticationMethod.USERNAME: + login_widget = forms.TextInput(attrs={'placeholder': + _('Username'), + 'autofocus': 'autofocus'}) + login_field = forms.CharField( + label=_("Username"), + widget=login_widget, + max_length=get_username_max_length()) + else: + assert app_settings.AUTHENTICATION_METHOD \ + == AuthenticationMethod.USERNAME_EMAIL + login_widget = forms.TextInput(attrs={'placeholder': + _('Username or e-mail'), + 'autofocus': 'autofocus'}) +~~ login_field = forms.CharField(label=pgettext("field label", + "Login"), + widget=login_widget) + self.fields["login"] = login_field + set_form_field_order(self, ["login", "password", "remember"]) + if app_settings.SESSION_REMEMBER is not None: + del self.fields['remember'] + + def user_credentials(self): + credentials = {} + login = self.cleaned_data["login"] + if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: + credentials["email"] = login + elif ( + app_settings.AUTHENTICATION_METHOD == + AuthenticationMethod.USERNAME): + credentials["username"] = login + else: + if self._is_login_email(login): + credentials["email"] = login + credentials["username"] = login + credentials["password"] = self.cleaned_data["password"] + return credentials + + def clean_login(self): + + +## ... source file continues with no further pgettext examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown new file mode 100644 index 000000000..e8b3da9d2 --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown @@ -0,0 +1,115 @@ +title: django.utils.translation ugettext_lazy code examples +category: page +slug: django-utils-translation-ugettext-lazy-examples +sortorder: 500011505 +toc: False +sidebartitle: django.utils.translation ugettext_lazy +meta: Python example code for the ugettext_lazy function from the django.utils.translation module of the Django project. + + +ugettext_lazy is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / imageadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/imageadmin.py) + +```python +# imageadmin.py +from __future__ import absolute_import + +from django import forms +from django.utils.translation import ugettext as _ +~~from django.utils.translation import ugettext_lazy + +from ..settings import FILER_IMAGE_MODEL +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import string_concat +from ..utils.loader import load_model +from .fileadmin import FileAdmin + + +Image = load_model(FILER_IMAGE_MODEL) + + +class ImageAdminForm(forms.ModelForm): + subject_location = forms.CharField( + max_length=64, required=False, + label=_('Subject location'), + help_text=_('Location of the main subject of the scene. ' + 'Format: "x,y".')) + + def sidebar_image_ratio(self): + if self.instance: + return '%.6F' % self.instance.sidebar_image_ratio() + else: + return '' + + def _set_previous_subject_location(self, cleaned_data): + subject_location = self.instance.subject_location + cleaned_data['subject_location'] = subject_location + self.data = self.data.copy() + self.data['subject_location'] = subject_location + + def clean_subject_location(self): + cleaned_data = super(ImageAdminForm, self).clean() + subject_location = cleaned_data['subject_location'] + if not subject_location: + return subject_location + + coordinates = normalize_subject_location(subject_location) + + if not coordinates: +~~ err_msg = ugettext_lazy('Invalid subject location format. ') + err_code = 'invalid_subject_format' + + elif ( + coordinates[0] > self.instance.width + or coordinates[1] > self.instance.height + ): +~~ err_msg = ugettext_lazy( + 'Subject location is outside of the image. ') + err_code = 'subject_out_of_bounds' + else: + return subject_location + + self._set_previous_subject_location(cleaned_data) + raise forms.ValidationError( + string_concat( + err_msg, +~~ ugettext_lazy('Your input: "{subject_location}". '.format( + subject_location=subject_location)), + 'Previous value is restored.'), + code=err_code) + + class Meta(object): + model = Image + exclude = () + + class Media(object): + css = { + } + js = ( + + ) + + +class ImageAdmin(FileAdmin): + change_form_template = 'admin/filer/image/change_form.html' + form = ImageAdminForm + + +if FILER_IMAGE_MODEL == 'filer.Image': + extra_main_fields = ('author', 'default_alt_text', 'default_caption',) +else: + + +## ... source file continues with no further ugettext_lazy examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-ugettext.markdown b/content/pages/examples/django/django-utils-translation-ugettext.markdown new file mode 100644 index 000000000..12b70ad87 --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-ugettext.markdown @@ -0,0 +1,120 @@ +title: django.utils.translation ugettext code examples +category: page +slug: django-utils-translation-ugettext-examples +sortorder: 500011504 +toc: False +sidebartitle: django.utils.translation ugettext +meta: Python example code for the ugettext function from the django.utils.translation module of the Django project. + + +ugettext is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_base.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_base.py) + +```python +# plugin_base.py +import json +import re + +from django.shortcuts import render as render_to_response + +from django import forms +from django.contrib import admin +from django.contrib import messages +from django.core.exceptions import ( + ImproperlyConfigured, + ObjectDoesNotExist, + ValidationError, +) +from django.utils.encoding import force_text, smart_str +from django.utils.html import escapejs +~~from django.utils.translation import ugettext, ugettext_lazy as _ + +from six import with_metaclass, python_2_unicode_compatible + +from cms import operations +from cms.exceptions import SubClassNeededError +from cms.models import CMSPlugin +from cms.toolbar.utils import get_plugin_tree_as_json, get_plugin_toolbar_info +from cms.utils.conf import get_cms_setting + + +class CMSPluginBaseMetaclass(forms.MediaDefiningClass): + def __new__(cls, name, bases, attrs): + super_new = super(CMSPluginBaseMetaclass, cls).__new__ + parents = [base for base in bases if isinstance(base, CMSPluginBaseMetaclass)] + if not parents: + return super_new(cls, name, bases, attrs) + new_plugin = super_new(cls, name, bases, attrs) + if not issubclass(new_plugin.model, CMSPlugin): + raise SubClassNeededError( + "The 'model' attribute on CMSPluginBase subclasses must be " + "either CMSPlugin or a subclass of CMSPlugin. %r on %r is not." + % (new_plugin.model, new_plugin) + ) + if (not hasattr(new_plugin, 'render_template') and + + +## ... source file abbreviated to get to ugettext examples ... + + + return "%s - %s" % (force_text(self.name), force_text(instance)) + + def get_fieldsets(self, request, obj=None): + fieldsets = super(CMSPluginBase, self).get_fieldsets(request, obj) + + for name, data in fieldsets: + if data.get('fields'): # if fieldset with non-empty fields is found, return fieldsets + return fieldsets + + if self.inlines: + return [] # if plugin has inlines but no own fields return empty fieldsets to remove empty white fieldset + + try: # if all fieldsets are empty (assuming there is only one fieldset then) add description + fieldsets[0][1]['description'] = self.get_empty_change_form_text(obj=obj) + except KeyError: + pass + return fieldsets + + @classmethod + def get_empty_change_form_text(cls, obj=None): +~~ return ugettext('There are no further settings for this plugin. Please press save.') + + @classmethod + def get_child_class_overrides(cls, slot, page): + from cms.utils.placeholder import get_placeholder_conf + + template = page.get_template() if page else None + + ph_conf = get_placeholder_conf('child_classes', slot, template, default={}) + return ph_conf.get(cls.__name__, cls.child_classes) + + @classmethod + def get_child_plugin_candidates(cls, slot, page): + from cms.plugin_pool import plugin_pool + return plugin_pool.registered_plugins + + @classmethod + def get_child_classes(cls, slot, page, instance=None): + child_classes = cls.get_child_class_overrides(slot, page) + + if child_classes: + return child_classes + + installed_plugins = cls.get_child_plugin_candidates(slot, page) + + + +## ... source file continues with no further ugettext examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown new file mode 100644 index 000000000..322d48bf1 --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown @@ -0,0 +1,107 @@ +title: django.utils.translation ungettext_lazy code examples +category: page +slug: django-utils-translation-ungettext-lazy-examples +sortorder: 500011507 +toc: False +sidebartitle: django.utils.translation ungettext_lazy +meta: Python example code for the ungettext_lazy function from the django.utils.translation module of the Django project. + + +ungettext_lazy is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / fields.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/fields.py) + +```python +# fields.py +import re +import mimetypes + +from django.conf import settings +from django.contrib.staticfiles.storage import staticfiles_storage +from django.core import signing +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.files.storage import default_storage +from django.core.files.uploadedfile import InMemoryUploadedFile, TemporaryUploadedFile +from django.urls import reverse_lazy +from django.forms import fields, models as model_fields, widgets +from django.utils.html import format_html +from django.utils.module_loading import import_string +from django.utils.safestring import mark_safe +~~from django.utils.translation import ugettext_lazy as _, ungettext_lazy + +from djng import app_settings +from .widgets import DropFileWidget, DropImageWidget + + +class DefaultFieldMixin(object): + render_label = True + + def has_subwidgets(self): + return False + + def get_potential_errors(self): + return self.get_input_required_errors() + + def get_input_required_errors(self): + errors = [] + if self.required: + self.widget.attrs['ng-required'] = 'true' + for key, msg in self.error_messages.items(): + if key == 'required': + errors.append(('$error.required', msg)) + return errors + + def get_min_max_length_errors(self): + errors = [] + if getattr(self, 'min_length', None): + self.widget.attrs['ng-minlength'] = self.min_length + if getattr(self, 'max_length', None): + self.widget.attrs['ng-maxlength'] = self.max_length + for item in self.validators: + if getattr(item, 'code', None) == 'min_length': +~~ message = ungettext_lazy( + 'Ensure this value has at least %(limit_value)d character', + 'Ensure this value has at least %(limit_value)d characters', + 'limit_value') + errors.append(('$error.minlength', message % {'limit_value': self.min_length})) + if getattr(item, 'code', None) == 'max_length': +~~ message = ungettext_lazy( + 'Ensure this value has at most %(limit_value)d character', + 'Ensure this value has at most %(limit_value)d characters', + 'limit_value') + errors.append(('$error.maxlength', message % {'limit_value': self.max_length})) + return errors + + def get_min_max_value_errors(self): + errors = [] + if isinstance(getattr(self, 'min_value', None), int): + self.widget.attrs['min'] = self.min_value + if isinstance(getattr(self, 'max_value', None), int): + self.widget.attrs['max'] = self.max_value + errkeys = [] + for key, msg in self.error_messages.items(): + if key == 'min_value': + errors.append(('$error.min', msg)) + errkeys.append(key) + if key == 'max_value': + errors.append(('$error.max', msg)) + errkeys.append(key) + for item in self.validators: + if getattr(item, 'code', None) == 'min_value' and 'min_value' not in errkeys: + errors.append(('$error.min', item.message % {'limit_value': self.min_value})) + errkeys.append('min_value') + + +## ... source file continues with no further ungettext_lazy examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-ungettext.markdown b/content/pages/examples/django/django-utils-translation-ungettext.markdown new file mode 100644 index 000000000..2d1e5714d --- /dev/null +++ b/content/pages/examples/django/django-utils-translation-ungettext.markdown @@ -0,0 +1,235 @@ +title: django.utils.translation ungettext code examples +category: page +slug: django-utils-translation-ungettext-examples +sortorder: 500011506 +toc: False +sidebartitle: django.utils.translation ungettext +meta: Python example code for the ungettext function from the django.utils.translation module of the Django project. + + +ungettext is a function within the django.utils.translation module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / folderadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/folderadmin.py) + +```python +# folderadmin.py +import re +from collections import OrderedDict + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import messages +from django.contrib.admin import helpers +from django.contrib.admin.utils import capfirst, quote, unquote +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.db import models, router +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils.encoding import force_text +from django.utils.html import escape +from django.utils.http import urlquote, urlunquote +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +~~from django.utils.translation import ugettext_lazy, ungettext + +from .. import settings +from ..models import ( + File, Folder, FolderPermission, FolderRoot, ImagesWithMissingData, + UnsortedImages, tools, +) +from ..settings import FILER_IMAGE_MODEL, FILER_PAGINATE_BY +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import get_delete_permission +from ..utils.filer_easy_thumbnails import FilerActionThumbnailer +from ..utils.loader import load_model +from . import views +from .forms import CopyFilesAndFoldersForm, RenameFilesForm, ResizeImagesForm +from .patched.admin_utils import get_deleted_objects +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import ( + AdminContext, admin_url_params_encoded, check_files_edit_permissions, + check_files_read_permissions, check_folder_edit_permissions, + check_folder_read_permissions, popup_status, userperms_for_request, +) + + +Image = load_model(FILER_IMAGE_MODEL) + + + +## ... source file abbreviated to get to ungettext examples ... + + + "actions on them. No items have been changed.") + self.message_user(request, msg) + + if ( + actions and request.method == 'POST' + and helpers.ACTION_CHECKBOX_NAME in request.POST + and 'index' not in request.POST + and '_save' not in request.POST + ): + if selected: + response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) + if response: + return response + + if actions: + action_form = self.action_form(auto_id=None) + action_form.fields['action'].choices = self.get_action_choices(request) + else: + action_form = None + +~~ selection_note_all = ungettext('%(total_count)s selected', + 'All %(total_count)s selected', paginator.count) + + try: + paginated_items = paginator.page(request.GET.get('page', 1)) + except PageNotAnInteger: + paginated_items = paginator.page(1) + except EmptyPage: + paginated_items = paginator.page(paginator.num_pages) + + context = self.admin_site.each_context(request) + context.update({ + 'folder': folder, + 'clipboard_files': File.objects.filter( + in_clipboards__clipboarditem__clipboard__user=request.user + ).distinct(), + 'paginator': paginator, + 'paginated_items': paginated_items, + 'virtual_items': virtual_items, + 'uploader_connections': settings.FILER_UPLOADER_CONNECTIONS, + 'permissions': permissions, + 'permstest': userperms_for_request(folder, request), + 'current_url': request.path, + 'title': _('Directory listing for %(folder_name)s') % {'folder_name': folder.name}, + 'search_string': ' '.join(search_terms), + + +## ... source file continues with no further ungettext examples... + +``` + + +## Example 2 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / admin.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./admin.py) + +```python +# admin.py +from django.contrib.admin.options import ModelAdmin, csrf_protect_m +from django.contrib.admin.views.main import SEARCH_VAR, ChangeList +from django.core.exceptions import PermissionDenied +from django.core.paginator import InvalidPage, Paginator +from django.shortcuts import render +from django.utils.encoding import force_str +~~from django.utils.translation import ungettext + +from haystack import connections +from haystack.constants import DEFAULT_ALIAS +from haystack.query import SearchQuerySet +from haystack.utils import get_model_ct_tuple + + +class SearchChangeList(ChangeList): + def __init__(self, **kwargs): + self.haystack_connection = kwargs.pop("haystack_connection", DEFAULT_ALIAS) + super(SearchChangeList, self).__init__(**kwargs) + + def get_results(self, request): + if SEARCH_VAR not in request.GET: + return super(SearchChangeList, self).get_results(request) + + sqs = ( + SearchQuerySet(self.haystack_connection) + .models(self.model) + .auto_query(request.GET[SEARCH_VAR]) + .load_all() + ) + + paginator = Paginator(sqs, self.list_per_page) + + +## ... source file abbreviated to get to ungettext examples ... + + + "search_fields": self.search_fields, + "list_select_related": self.list_select_related, + "list_per_page": self.list_per_page, + "list_editable": self.list_editable, + "list_max_show_all": self.list_max_show_all, + "model_admin": self, + } + if hasattr(self, 'get_sortable_by'): # Django 2.1+ + kwargs["sortable_by"] = self.get_sortable_by(request) + changelist = SearchChangeList(**kwargs) + changelist.formset = None + media = self.media + + actions = self.get_actions(request) + if actions: + action_form = self.action_form(auto_id=None) + action_form.fields["action"].choices = self.get_action_choices(request) + else: + action_form = None + +~~ selection_note = ungettext( + "0 of %(count)d selected", + "of %(count)d selected", + len(changelist.result_list), + ) +~~ selection_note_all = ungettext( + "%(total_count)s selected", + "All %(total_count)s selected", + changelist.result_count, + ) + + context = { + "module_name": force_str(self.model._meta.verbose_name_plural), + "selection_note": selection_note % {"count": len(changelist.result_list)}, + "selection_note_all": selection_note_all + % {"total_count": changelist.result_count}, + "title": changelist.title, + "is_popup": changelist.is_popup, + "cl": changelist, + "media": media, + "has_add_permission": self.has_add_permission(request), + "opts": changelist.opts, + "app_label": self.model._meta.app_label, + "action_form": action_form, + "actions_on_top": self.actions_on_top, + "actions_on_bottom": self.actions_on_bottom, + "actions_selection_counter": getattr(self, "actions_selection_counter", 0), + } + context.update(extra_context or {}) + request.current_app = self.admin_site.name + + +## ... source file continues with no further ungettext examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation.markdown b/content/pages/examples/django/django-utils-translation.markdown new file mode 100644 index 000000000..79d1cc0b3 --- /dev/null +++ b/content/pages/examples/django/django-utils-translation.markdown @@ -0,0 +1,474 @@ +title: django.utils translation code examples +category: page +slug: django-utils-translation-examples +sortorder: 500011417 +toc: False +sidebartitle: django.utils translation +meta: Python example code for the translation function from the django.utils module of the Django project. + + +translation is a function within the django.utils module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / placeholderadmin.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/placeholderadmin.py) + +```python +# placeholderadmin.py +import uuid +import warnings + +from django.conf.urls import url +from django.contrib.admin.helpers import AdminForm +from django.contrib.admin.utils import get_deleted_objects +from django.core.exceptions import PermissionDenied +from django.db import router, transaction +from django.http import ( + HttpResponse, + HttpResponseBadRequest, + HttpResponseForbidden, + HttpResponseNotFound, + HttpResponseRedirect, +) +from django.shortcuts import get_list_or_404, get_object_or_404, render +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_text +~~from django.utils import translation +from django.utils.translation import ugettext as _ +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.decorators.http import require_POST + +from six.moves.urllib.parse import parse_qsl, urlparse + +from six import get_unbound_function, get_method_function + +from cms import operations +from cms.admin.forms import PluginAddValidationForm +from cms.constants import SLUG_REGEXP +from cms.exceptions import PluginLimitReached +from cms.models.placeholdermodel import Placeholder +from cms.models.placeholderpluginmodel import PlaceholderReference +from cms.models.pluginmodel import CMSPlugin +from cms.plugin_pool import plugin_pool +from cms.signals import pre_placeholder_operation, post_placeholder_operation +from cms.toolbar.utils import get_plugin_tree_as_json +from cms.utils import copy_plugins, get_current_site +from cms.utils.compat import DJANGO_2_0 +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import get_language_code, get_language_list +from cms.utils.plugins import has_reached_plugin_limit, reorder_plugins +from cms.utils.urlutils import admin_reverse + + +## ... source file abbreviated to get to translation examples ... + + + 'cancel': True, + }) + return render(request, 'admin/cms/page/plugin/confirm_form.html', context) + if not cancel_clicked and request.method == 'POST' and saved_successfully: + return render(request, 'admin/cms/page/plugin/confirm_form.html', context) + return render(request, 'admin/cms/page/plugin/change_form.html', context) + + +class PlaceholderAdminMixin(object): + + def _get_attached_admin(self, placeholder): + return placeholder._get_attached_admin(admin_site=self.admin_site) + + def _get_operation_language(self, request): + site = get_current_site() + parsed_url = urlparse(request.GET['cms_path']) + queries = dict(parse_qsl(parsed_url.query)) + language = queries.get('language') + + if not language: +~~ language = translation.get_language_from_path(parsed_url.path) + return get_language_code(language, site_id=site.pk) + + def _get_operation_origin(self, request): + return urlparse(request.GET['cms_path']).path + + def _send_pre_placeholder_operation(self, request, operation, **kwargs): + token = str(uuid.uuid4()) + + if not request.GET.get('cms_path'): + warnings.warn('All custom placeholder admin endpoints require ' + 'a "cms_path" GET query which points to the path ' + 'where the request originates from.' + 'This backwards compatible shim will be removed on 3.5 ' + 'and an HttpBadRequest response will be returned instead.', + UserWarning) + return token + + pre_placeholder_operation.send( + sender=self.__class__, + operation=operation, + request=request, + language=self._get_operation_language(request), + token=token, + origin=self._get_operation_origin(request), + + +## ... source file continues with no further translation examples... + +``` + + +## Example 2 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / gis / widgets.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/gis/widgets.py) + +```python +# widgets.py +from django.conf import settings +from django.template.defaultfilters import safe +~~from django.utils import translation + +import floppyforms as forms + +from urllib.parse import urlencode + +try: + from django.contrib.gis import gdal, geos +except ImportError: + + +__all__ = ('GeometryWidget', 'GeometryCollectionWidget', + 'PointWidget', 'MultiPointWidget', + 'LineStringWidget', 'MultiLineStringWidget', + 'PolygonWidget', 'MultiPolygonWidget', + 'BaseGeometryWidget', 'BaseMetacartaWidget', + 'BaseOsmWidget', 'BaseGMapWidget') + + +class BaseGeometryWidget(forms.Textarea): + display_wkt = False + map_width = 600 + map_height = 400 + map_srid = 4326 + template_name = 'floppyforms/gis/openlayers.html' + + +## ... source file abbreviated to get to translation examples ... + + + if value: + srid = self.map_srid + if value.srid != srid: + try: + ogr = value.ogr + ogr.transform(srid) + wkt = ogr.wkt + except gdal.GDALException: + pass # wkt left as an empty string + else: + wkt = value.wkt + context = super(BaseGeometryWidget, self).get_context(name, wkt, attrs) + context['module'] = 'map_%s' % name.replace('-', '_') + context['name'] = name + + + if hasattr(settings, 'ADMIN_MEDIA_PREFIX'): + context['ADMIN_MEDIA_PREFIX'] = settings.ADMIN_MEDIA_PREFIX + else: + context['ADMIN_MEDIA_PREFIX'] = settings.STATIC_URL + 'admin/' +~~ context['LANGUAGE_BIDI'] = translation.get_language_bidi() + return context + + +class GeometryWidget(BaseGeometryWidget): + pass + + +class GeometryCollectionWidget(GeometryWidget): + is_collection = True + geom_type = 'GEOMETRYCOLLECTION' + + +class PointWidget(BaseGeometryWidget): + is_point = True + geom_type = 'POINT' + + +class MultiPointWidget(PointWidget): + is_collection = True + geom_type = 'MULTIPOINT' + + +class LineStringWidget(BaseGeometryWidget): + is_linestring = True + + +## ... source file continues with no further translation examples... + +``` + + +## Example 3 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import datetime +import json +from django.template import Context +~~from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 + from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters + + +## ... source file abbreviated to get to translation examples ... + + + model_admin.date_hierarchy, search_fields, list_select_related, + model_admin.list_per_page, model_admin.list_max_show_all, + model_admin.list_editable, model_admin] + + try: + sortable_by = model_admin.get_sortable_by(request) + change_list_args.append(sortable_by) + except AttributeError: + pass + + try: + cl = ChangeList(*change_list_args) + queryset = cl.get_queryset(request) + except IncorrectLookupParameters: + pass + + return queryset + + +def get_possible_language_codes(): +~~ language_code = translation.get_language() + + language_code = language_code.replace('_', '-').lower() + language_codes = [] + + split = language_code.split('-', 2) + if len(split) == 2: + language_code = '%s-%s' % (split[0].lower(), split[1].upper()) if split[0] != split[1] else split[0] + + language_codes.append(language_code) + + if len(split) == 2: + language_codes.append(split[0].lower()) + + return language_codes + + +def get_original_menu_items(context): + if context.get('user') and user_is_authenticated(context['user']): + pinned_apps = PinnedApplication.objects.filter(user=context['user'].pk).values_list('app_label', flat=True) + else: + pinned_apps = [] + + original_app_list = get_app_list(context) + + + +## ... source file continues with no further translation examples... + +``` + + +## Example 4 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / models / article.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/models/article.py) + +```python +# article.py +from django.conf import settings as django_settings +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.core.cache import cache +from django.db import models +from django.db.models.fields import GenericIPAddressField as IPAddressField +from django.db.models.signals import post_save +from django.db.models.signals import pre_delete +from django.db.models.signals import pre_save +from django.urls import reverse +~~from django.utils import translation +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ +from mptt.models import MPTTModel +from wiki import managers +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.markdown import article_markdown +from wiki.decorators import disable_signal_for_loaddata + +__all__ = [ + "Article", + "ArticleForObject", + "ArticleRevision", + "BaseRevisionMixin", +] + + +class Article(models.Model): + + objects = managers.ArticleManager() + + current_revision = models.OneToOneField( + "ArticleRevision", + verbose_name=_("current revision"), + + +## ... source file abbreviated to get to translation examples ... + + + permissions = ( + ("moderate", _("Can edit all articles and lock/unlock/restore")), + ("assign", _("Can change ownership of any article")), + ("grant", _("Can assign permissions to other users")), + ) + + def render(self, preview_content=None, user=None): + if not self.current_revision: + return "" + if preview_content: + content = preview_content + else: + content = self.current_revision.content + return mark_safe( + article_markdown( + content, self, preview=preview_content is not None, user=user + ) + ) + + def get_cache_key(self): +~~ lang = translation.get_language() + + return "wiki:article:{id}:{lang}".format( + id=self.current_revision.id if self.current_revision else self.id, lang=lang + ) + + def get_cache_content_key(self, user=None): + return "{key}:{user}".format( + key=self.get_cache_key(), user=user.get_username() if user else "" + ) + + def get_cached_content(self, user=None): + + cache_key = self.get_cache_key() + cache_content_key = self.get_cache_content_key(user) + + cached_items = cache.get(cache_key, list()) + + if cache_content_key in cached_items: + cached_content = cache.get(cache_content_key) + if cached_content is not None: + return mark_safe(cached_content) + + cached_content = self.render(user=user) + cached_items.append(cache_content_key) + + +## ... source file continues with no further translation examples... + +``` + + +## Example 5 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / middleware.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./middleware.py) + +```python +# middleware.py +import django.middleware.locale +import django.shortcuts +~~from django.utils import translation +from django.utils.deprecation import MiddlewareMixin + + +class RequestLocaleMiddleware(MiddlewareMixin): + def process_view(self, request, view_func, view_args, view_kwargs): + if request.method == 'GET': + language = request.GET.get('lang') + if language: +~~ translation.activate(language) +~~ request.session[translation.LANGUAGE_SESSION_KEY] = translation.get_language() + query = request.GET.copy() + del query['lang'] + path = '?'.join([request.path, query.urlencode()]) + return django.shortcuts.redirect(path) + + + +## ... source file continues with no further translation examples... + +``` + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index e4042bacf..167242cf4 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,24 @@ on GitHub. ## 2020 ### June +* Added new example code for [Django](/django.html) modules: + * django.utils.translation + [LANGUAGE_SESSION_KEY](/django-utils-translation-language-session-key-examples.html), + [activate](/django-utils-translation-activate-examples.html), + [deactivate_all](/django-utils-translation-deactivate-all-examples.html), + [get_language](/django-utils-translation-get-language-examples.html), + [get_language_from_request](/django-utils-translation-get-language-from-request-examples.html), + [gettext](/django-utils-translation-gettext-examples.html), + [gettext_lazy](/django-utils-translation-gettext-lazy-examples.html), + [ngettext](/django-utils-translation-ngettext-examples.html), + [override](/django-utils-translation-override-examples.html), + [pgettext](/django-utils-translation-pgettext-examples.html), + [pgettext_lazy](/django-utils-translation-pgettext-lazy-examples.html), + [ugettext](/django-utils-translation-ugettext-examples.html), + [ugettext_lazy](/django-utils-translation-ugettext-lazy-examples.html), + [ungettex](/django-utils-translation-ungettext-examples.html), + and + [ungettext_lazy](/django-utils-translation-ungettext-lazy-examples.html) * Added new example code pages for Flask modules: * flask.blueprints [Blueprint](/flask-blueprints-blueprint-examples.html) * flask.ctx [has_app_context](/flask-ctx-has-app-context-examples.html) and diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 42aab9774..e9a01ae5b 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -75,5 +75,22 @@

django.template.response TemplateResponse

django.utils.timezone

+

django.utils.translation + LANGUAGE_SESSION_KEY, + activate, + deactivate_all, + get_language, + get_language_from_request, + gettext, + gettext_lazy, + ngettext, + override, + pgettext, + pgettext_lazy, + ugettext, + ugettext_lazy, + ungettext, + ungettext_lazy +

From bc39be2882065e4e6a804faee3303bc3c9b673b5 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 22 Jun 2020 07:42:00 -0400 Subject: [PATCH 130/302] new powershell resource and fixing issue on development environments page --- .../00-development-environments.markdown | 22 +++++++++++-------- .../10-powershell.markdown | 7 ++++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/content/pages/02-development-environments/00-development-environments.markdown b/content/pages/02-development-environments/00-development-environments.markdown index 1a71cbc68..cb27c7ee4 100644 --- a/content/pages/02-development-environments/00-development-environments.markdown +++ b/content/pages/02-development-environments/00-development-environments.markdown @@ -8,17 +8,21 @@ meta: Development environments allow programmers to read, write and work with co A development environment is a combination of a -[text editor](/text-editors-ides.html) and a Python runtime environment. -The text editor allows you to write the code. The runtime environment -implementation such as [CPython](https://github.com/python/cpython) -or [PyPy](https://pypy.org/) provides the method for executing your code. +[text editor](/text-editors-ides.html) and a Python runtime implementation. +The text editor allows you to write code for your applications. The runtime +implementation, such as [CPython](https://github.com/python/cpython) +or [PyPy](https://pypy.org/), provides the method for executing your code. tmux plus Vim editor on a dark background. -A text editor can be as simple as Notepad on Windows or more complicated -as a complete integrated development environment (IDE) such as -[PyCharm](https://www.jetbrains.com/pycharm/) which runs on any major -operating system. +A text editor can be as simple as Notepad running on Windows or a more +complicated +[integrated development environment (IDE)](/text-editors-ides.html) with +syntax checking, integrated [test runner](/testing.html) and code highlighting. +A couple of common IDEs for Python development are +[PyCharm](https://www.jetbrains.com/pycharm/) and +[VSCode](https://code.visualstudio.com/), both of which runs on any major +[operating system](/operating-systems.html). ## Why is a development environment necessary? @@ -89,7 +93,7 @@ getting started and then require payment as you scale up your application. [Stdlib](https://stdlib.com/) that can integrate with external [web APIs](/application-programming-interfaces.html). -* [GitLab Web IDE](https://about.gitlab.com/2018/06/15/introducing-gitlab-s-integrated-development-environment/) +* [GitLab Web IDE](https://docs.gitlab.com/ee/user/project/web_ide/) is integrated into the GitLab web application for modifying your [Git](/git.html) repository files directly in your browser. diff --git a/content/pages/02-development-environments/10-powershell.markdown b/content/pages/02-development-environments/10-powershell.markdown index 8ff71b563..d4449544b 100644 --- a/content/pages/02-development-environments/10-powershell.markdown +++ b/content/pages/02-development-environments/10-powershell.markdown @@ -39,6 +39,13 @@ of a Python programmer's give historical perspective on how the Windows shell has evolved from MS-DOS days into the current Windows 10 world. +* [Learning a New REST API with PowerShell](https://www.cloudsavvyit.com/2454/learning-a-new-rest-api-with-powershell/) + covers how to create the common GET, POST, PUT and DELETE requests that are + used to work with [RESTful APIs](/application-programming-interfaces.html). + The the tutorial also contains some tips and tricks for reading API + documentation and how to use PowerShell more effectively in these + situations. + * [PowerShell in Azure Functions](http://www.brianbunke.com/blog/2018/02/27/powershell-in-azure-functions/) shows you how to use PowerShell scripting language code in your Azure Functions. The language is only in experimental mode on Azure Functions From fa3506302bb372391dd8d9c76d351498c05218e4 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 22 Jun 2020 22:10:06 -0400 Subject: [PATCH 131/302] adding new code examples --- ...-contrib-admin-helpers-actionform.markdown | 91 +++++ ...o-contrib-admin-helpers-adminform.markdown | 109 ++++++ .../django-contrib-admin-helpers.markdown | 347 ++++++++++++++++++ ...trib-admin-options-csrf-protect-m.markdown | 111 ++++++ ...options-incorrectlookupparameters.markdown | 77 ++++ ...ontrib-admin-options-is-popup-var.markdown | 113 ++++++ ...-contrib-admin-options-modeladmin.markdown | 61 +++ ...contrib-admin-sites-notregistered.markdown | 66 ++++ .../django-contrib-admin-sites-site.markdown | 290 +++++++++++++++ content/pages/meta/00-change-log.markdown | 14 + theme/templates/code-examples/django.html | 24 +- 11 files changed, 1299 insertions(+), 4 deletions(-) create mode 100644 content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown create mode 100644 content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown create mode 100644 content/pages/examples/django/django-contrib-admin-helpers.markdown create mode 100644 content/pages/examples/django/django-contrib-admin-options-csrf-protect-m.markdown create mode 100644 content/pages/examples/django/django-contrib-admin-options-incorrectlookupparameters.markdown create mode 100644 content/pages/examples/django/django-contrib-admin-options-is-popup-var.markdown create mode 100644 content/pages/examples/django/django-contrib-admin-options-modeladmin.markdown create mode 100644 content/pages/examples/django/django-contrib-admin-sites-notregistered.markdown create mode 100644 content/pages/examples/django/django-contrib-admin-sites-site.markdown diff --git a/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown b/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown new file mode 100644 index 000000000..295784080 --- /dev/null +++ b/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown @@ -0,0 +1,91 @@ +title: django.contrib.admin.helpers ActionForm code examples +category: page +slug: django-contrib-admin-helpers-actionform-examples +sortorder: 500011020 +toc: False +sidebartitle: django.contrib.admin.helpers ActionForm +meta: Python example code for the ActionForm class from the django.contrib.admin.helpers module of the Django project. + + +ActionForm is a class within the django.contrib.admin.helpers module of the Django project. + + +## Example 1 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / forms.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./forms.py) + +```python +# forms.py +import os.path + +from django import forms +~~from django.contrib.admin.helpers import ActionForm +from django.utils.translation import gettext_lazy as _ + + +class ImportForm(forms.Form): + import_file = forms.FileField( + label=_('File to import') + ) + input_format = forms.ChoiceField( + label=_('Format'), + choices=(), + ) + + def __init__(self, import_formats, *args, **kwargs): + super().__init__(*args, **kwargs) + choices = [] + for i, f in enumerate(import_formats): + choices.append((str(i), f().get_title(),)) + if len(import_formats) > 1: + choices.insert(0, ('', '---')) + + self.fields['input_format'].choices = choices + + +class ConfirmImportForm(forms.Form): + + +## ... source file abbreviated to get to ActionForm examples ... + + + + +class ExportForm(forms.Form): + file_format = forms.ChoiceField( + label=_('Format'), + choices=(), + ) + + def __init__(self, formats, *args, **kwargs): + super().__init__(*args, **kwargs) + choices = [] + for i, f in enumerate(formats): + choices.append((str(i), f().get_title(),)) + if len(formats) > 1: + choices.insert(0, ('', '---')) + + self.fields['file_format'].choices = choices + + +def export_action_form_factory(formats): +~~ class _ExportActionForm(ActionForm): + file_format = forms.ChoiceField( + label=_('Format'), choices=formats, required=False) + _ExportActionForm.__name__ = str('ExportActionForm') + + return _ExportActionForm + + + +## ... source file continues with no further ActionForm examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown b/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown new file mode 100644 index 000000000..404238124 --- /dev/null +++ b/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown @@ -0,0 +1,109 @@ +title: django.contrib.admin.helpers AdminForm code examples +category: page +slug: django-contrib-admin-helpers-adminform-examples +sortorder: 500011021 +toc: False +sidebartitle: django.contrib.admin.helpers AdminForm +meta: Python example code for the AdminForm class from the django.contrib.admin.helpers module of the Django project. + + +AdminForm is a class within the django.contrib.admin.helpers module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / placeholderadmin.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/placeholderadmin.py) + +```python +# placeholderadmin.py +import uuid +import warnings + +from django.conf.urls import url +~~from django.contrib.admin.helpers import AdminForm +from django.contrib.admin.utils import get_deleted_objects +from django.core.exceptions import PermissionDenied +from django.db import router, transaction +from django.http import ( + HttpResponse, + HttpResponseBadRequest, + HttpResponseForbidden, + HttpResponseNotFound, + HttpResponseRedirect, +) +from django.shortcuts import get_list_or_404, get_object_or_404, render +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_text +from django.utils import translation +from django.utils.translation import ugettext as _ +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.decorators.http import require_POST + +from six.moves.urllib.parse import parse_qsl, urlparse + +from six import get_unbound_function, get_method_function + +from cms import operations + + +## ... source file abbreviated to get to AdminForm examples ... + + + context = { + 'opts': opts, + 'message': force_text(_("Field %s not found")) % raw_fields + } + return render(request, 'admin/cms/page/plugin/error_form.html', context) + if not request.user.has_perm("{0}.change_{1}".format(self.model._meta.app_label, + self.model._meta.model_name)): + context = { + 'opts': opts, + 'message': force_text(_("You do not have permission to edit this item")) + } + return render(request, 'admin/cms/page/plugin/error_form.html', context) + form_class = self.get_form(request, obj, fields=fields) + if not cancel_clicked and request.method == 'POST': + form = form_class(instance=obj, data=request.POST) + if form.is_valid(): + form.save() + saved_successfully = True + else: + form = form_class(instance=obj) +~~ admin_form = AdminForm(form, fieldsets=[(None, {'fields': fields})], prepopulated_fields={}, + model_admin=self) + media = self.media + admin_form.media + context = { + 'CMS_MEDIA_URL': get_cms_setting('MEDIA_URL'), + 'title': opts.verbose_name, + 'plugin': None, + 'plugin_id': None, + 'adminform': admin_form, + 'add': False, + 'is_popup': True, + 'media': media, + 'opts': opts, + 'change': True, + 'save_as': False, + 'has_add_permission': False, + 'window_close_timeout': 10, + } + if cancel_clicked: + context.update({ + 'cancel': True, + }) + return render(request, 'admin/cms/page/plugin/confirm_form.html', context) + if not cancel_clicked and request.method == 'POST' and saved_successfully: + return render(request, 'admin/cms/page/plugin/confirm_form.html', context) + + +## ... source file continues with no further AdminForm examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-admin-helpers.markdown b/content/pages/examples/django/django-contrib-admin-helpers.markdown new file mode 100644 index 000000000..abdc2a87f --- /dev/null +++ b/content/pages/examples/django/django-contrib-admin-helpers.markdown @@ -0,0 +1,347 @@ +title: django.contrib.admin helpers code examples +category: page +slug: django-contrib-admin-helpers-examples +sortorder: 500011017 +toc: False +sidebartitle: django.contrib.admin helpers +meta: Python example code for the helpers function from the django.contrib.admin module of the Django project. + + +helpers is a function within the django.contrib.admin module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / folderadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/folderadmin.py) + +```python +# folderadmin.py +from __future__ import absolute_import, division, unicode_literals + +import itertools +import os +import re +from collections import OrderedDict + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import messages +~~from django.contrib.admin import helpers +from django.contrib.admin.utils import capfirst, quote, unquote +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.db import models, router +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils.encoding import force_text +from django.utils.html import escape +from django.utils.http import urlquote, urlunquote +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy, ungettext + +from .. import settings +from ..models import ( + File, Folder, FolderPermission, FolderRoot, ImagesWithMissingData, + UnsortedImages, tools, +) +from ..settings import FILER_IMAGE_MODEL, FILER_PAGINATE_BY +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import get_delete_permission +from ..utils.filer_easy_thumbnails import FilerActionThumbnailer +from ..utils.loader import load_model + + +## ... source file abbreviated to get to helpers examples ... + + + else: + raise PermissionDenied + + selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) + if ( + actions and request.method == 'POST' + and 'index' in request.POST + and '_save' not in request.POST + ): + if selected: + response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) + if response: + return response + else: + msg = _("Items must be selected in order to perform " + "actions on them. No items have been changed.") + self.message_user(request, msg) + + if ( + actions and request.method == 'POST' +~~ and helpers.ACTION_CHECKBOX_NAME in request.POST + and 'index' not in request.POST + and '_save' not in request.POST + ): + if selected: + response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) + if response: + return response + + if actions: + action_form = self.action_form(auto_id=None) + action_form.fields['action'].choices = self.get_action_choices(request) + else: + action_form = None + + selection_note_all = ungettext('%(total_count)s selected', + 'All %(total_count)s selected', paginator.count) + + try: + paginated_items = paginator.page(request.GET.get('page', 1)) + except PageNotAnInteger: + paginated_items = paginator.page(1) + except EmptyPage: + paginated_items = paginator.page(paginator.num_pages) + + + +## ... source file abbreviated to get to helpers examples ... + + + if all_perms_needed or all_protected: + title = _("Cannot delete files and/or folders") + else: + title = _("Are you sure?") + + context = self.admin_site.each_context(request) + context.update({ + "title": title, + "instance": current_folder, + "breadcrumbs_action": _("Delete files and/or folders"), + "deletable_objects": all_deletable_objects, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": all_perms_needed, + "protected": all_protected, + "opts": opts, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request), + "root_path": reverse('admin:index'), + "app_label": app_label, +~~ "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + + return render( + request, + "admin/filer/delete_selected_files_confirmation.html", + context + ) + + delete_files_or_folders.short_description = ugettext_lazy( + "Delete selected files and/or folders") + + def _format_callback(self, obj, user, admin_site, perms_needed): + has_admin = obj.__class__ in admin_site._registry + opts = obj._meta + if has_admin: + admin_url = reverse('%s:%s_%s_change' + % (admin_site.name, + opts.app_label, + opts.object_name.lower()), + None, (quote(obj._get_pk_val()),)) + p = get_delete_permission(opts) + if not user.has_perm(p): + perms_needed.add(opts.verbose_name) + return mark_safe('%s: %s' % + + +## ... source file abbreviated to get to helpers examples ... + + + self._move_files_and_folders_impl(files_queryset, folders_queryset, destination) + self.message_user(request, _("Successfully moved %(count)d files and/or folders to folder '%(destination)s'.") % { + "count": n, + "destination": destination, + }) + return None + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Move files and/or folders"), + "instance": current_folder, + "breadcrumbs_action": _("Move files and/or folders"), + "to_move": to_move, + "destination_folders": folders, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, +~~ "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + + return render(request, "admin/filer/folder/choose_move_destination.html", context) + + move_files_and_folders.short_description = ugettext_lazy("Move selected files and/or folders") + + def _rename_file(self, file_obj, form_data, counter, global_counter): + original_basename, original_extension = os.path.splitext(file_obj.original_filename) + if file_obj.name: + current_basename, current_extension = os.path.splitext(file_obj.name) + else: + current_basename = "" + current_extension = "" + file_obj.name = form_data['rename_format'] % { + 'original_filename': file_obj.original_filename, + 'original_basename': original_basename, + 'original_extension': original_extension, + 'current_filename': file_obj.name or "", + 'current_basename': current_basename, + 'current_extension': current_extension, + 'current_folder': getattr(file_obj.folder, 'name', ''), + 'counter': counter + 1, # 1-based + 'global_counter': global_counter + 1, # 1-based + } + + +## ... source file abbreviated to get to helpers examples ... + + + self.message_user(request, _("Successfully renamed %(count)d files.") % { + "count": n, + }) + return None + else: + form = RenameFilesForm() + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Rename files"), + "instance": current_folder, + "breadcrumbs_action": _("Rename files"), + "to_rename": to_rename, + "rename_form": form, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, +~~ "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + + return render(request, "admin/filer/folder/choose_rename_format.html", context) + + rename_files.short_description = ugettext_lazy("Rename files") + + def _generate_new_filename(self, filename, suffix): + basename, extension = os.path.splitext(filename) + return basename + suffix + extension + + def _copy_file(self, file_obj, destination, suffix, overwrite): + if overwrite: + raise NotImplementedError + + + filename = self._generate_new_filename(file_obj.file.name, suffix) + + file_obj.pk = None + file_obj.id = None + file_obj.save() + file_obj.folder = destination + file_obj._file_data_changed_hint = False # no need to update size, sha1, etc. + file_obj.file = file_obj._copy_file(filename) + file_obj.original_filename = self._generate_new_filename(file_obj.original_filename, suffix) + + +## ... source file abbreviated to get to helpers examples ... + + + if current_folder: + selected_destination_folder = current_folder.pk + else: + selected_destination_folder = 0 + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Copy files and/or folders"), + "instance": current_folder, + "breadcrumbs_action": _("Copy files and/or folders"), + "to_copy": to_copy, + "destination_folders": folders, + "selected_destination_folder": selected_destination_folder, + "copy_form": form, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, +~~ "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + + return render(request, "admin/filer/folder/choose_copy_destination.html", context) + + copy_files_and_folders.short_description = ugettext_lazy("Copy selected files and/or folders") + + def _check_resize_perms(self, request, files_queryset, folders_queryset): + try: + check_files_read_permissions(request, files_queryset) + check_folder_read_permissions(request, folders_queryset) + check_files_edit_permissions(request, files_queryset) + except PermissionDenied: + return True + return False + + def _list_folders_to_resize(self, request, folders): + for fo in folders: + children = list(self._list_folders_to_resize(request, fo.children.all())) + children.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(fo.files) if isinstance(f, Image)]) + if children: + yield self._format_callback(fo, request.user, self.admin_site, set()) + yield children + + def _list_all_to_resize(self, request, files_queryset, folders_queryset): + + +## ... source file abbreviated to get to helpers examples ... + + + n = self._resize_images_impl(files_queryset, folders_queryset, form.cleaned_data) + self.message_user(request, _("Successfully resized %(count)d images.") % {"count": n, }) + return None + else: + form = ResizeImagesForm() + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Resize images"), + "instance": current_folder, + "breadcrumbs_action": _("Resize images"), + "to_resize": to_resize, + "resize_form": form, + "cmsplugin_enabled": 'cmsplugin_filer_image' in django_settings.INSTALLED_APPS, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, +~~ "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + + return render(request, "admin/filer/folder/choose_images_resize_options.html", context) + + resize_images.short_description = ugettext_lazy("Resize selected images") + + + +## ... source file continues with no further helpers examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-admin-options-csrf-protect-m.markdown b/content/pages/examples/django/django-contrib-admin-options-csrf-protect-m.markdown new file mode 100644 index 000000000..04bb8a8c2 --- /dev/null +++ b/content/pages/examples/django/django-contrib-admin-options-csrf-protect-m.markdown @@ -0,0 +1,111 @@ +title: django.contrib.admin.options csrf_protect_m code examples +category: page +slug: django-contrib-admin-options-csrf-protect-m-examples +sortorder: 500011025 +toc: False +sidebartitle: django.contrib.admin.options csrf_protect_m +meta: Python example code for the csrf_protect_m function from the django.contrib.admin.options module of the Django project. + + +csrf_protect_m is a function within the django.contrib.admin.options module of the Django project. + + +## Example 1 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / admin.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./admin.py) + +```python +# admin.py +~~from django.contrib.admin.options import ModelAdmin, csrf_protect_m +from django.contrib.admin.views.main import SEARCH_VAR, ChangeList +from django.core.exceptions import PermissionDenied +from django.core.paginator import InvalidPage, Paginator +from django.shortcuts import render +from django.utils.encoding import force_str +from django.utils.translation import ungettext + +from haystack import connections +from haystack.constants import DEFAULT_ALIAS +from haystack.query import SearchQuerySet +from haystack.utils import get_model_ct_tuple + + +class SearchChangeList(ChangeList): + def __init__(self, **kwargs): + self.haystack_connection = kwargs.pop("haystack_connection", DEFAULT_ALIAS) + super(SearchChangeList, self).__init__(**kwargs) + + def get_results(self, request): + if SEARCH_VAR not in request.GET: + return super(SearchChangeList, self).get_results(request) + + sqs = ( + SearchQuerySet(self.haystack_connection) + + +## ... source file abbreviated to get to csrf_protect_m examples ... + + + can_show_all = result_count <= self.list_max_show_all + multi_page = result_count > self.list_per_page + + try: + result_list = paginator.page(self.page_num + 1).object_list + result_list = [result.object for result in result_list] + except InvalidPage: + result_list = () + + self.result_count = result_count + self.full_result_count = full_result_count + self.result_list = result_list + self.can_show_all = can_show_all + self.multi_page = multi_page + self.paginator = paginator + + +class SearchModelAdminMixin(object): + haystack_connection = DEFAULT_ALIAS + +~~ @csrf_protect_m + def changelist_view(self, request, extra_context=None): + if not self.has_change_permission(request, None): + raise PermissionDenied + + if SEARCH_VAR not in request.GET: + return super(SearchModelAdminMixin, self).changelist_view( + request, extra_context + ) + + indexed_models = ( + connections[self.haystack_connection] + .get_unified_index() + .get_indexed_models() + ) + + if self.model not in indexed_models: + return super(SearchModelAdminMixin, self).changelist_view( + request, extra_context + ) + + list_display = list(self.list_display) + + kwargs = { + "haystack_connection": self.haystack_connection, + + +## ... source file continues with no further csrf_protect_m examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-admin-options-incorrectlookupparameters.markdown b/content/pages/examples/django/django-contrib-admin-options-incorrectlookupparameters.markdown new file mode 100644 index 000000000..875707238 --- /dev/null +++ b/content/pages/examples/django/django-contrib-admin-options-incorrectlookupparameters.markdown @@ -0,0 +1,77 @@ +title: django.contrib.admin.options IncorrectLookupParameters code examples +category: page +slug: django-contrib-admin-options-incorrectlookupparameters-examples +sortorder: 500011023 +toc: False +sidebartitle: django.contrib.admin.options IncorrectLookupParameters +meta: Python example code for the IncorrectLookupParameters class from the django.contrib.admin.options module of the Django project. + + +IncorrectLookupParameters is a class within the django.contrib.admin.options module of the Django project. + + +## Example 1 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 + from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +~~from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + kwargs.setdefault('content_type', 'application/json') + data = json.dumps(data, cls=encoder) + super(JsonResponse, self).__init__(content=data, **kwargs) + + +def get_app_list(context, order=True): + admin_site = get_admin_site(context) + request = context['request'] + + +## ... source file continues with no further IncorrectLookupParameters examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-admin-options-is-popup-var.markdown b/content/pages/examples/django/django-contrib-admin-options-is-popup-var.markdown new file mode 100644 index 000000000..95e8741ae --- /dev/null +++ b/content/pages/examples/django/django-contrib-admin-options-is-popup-var.markdown @@ -0,0 +1,113 @@ +title: django.contrib.admin.options IS_POPUP_VAR code examples +category: page +slug: django-contrib-admin-options-is-popup-var-examples +sortorder: 500011022 +toc: False +sidebartitle: django.contrib.admin.options IS_POPUP_VAR +meta: Python example code for the IS_POPUP_VAR class from the django.contrib.admin.options module of the Django project. + + +IS_POPUP_VAR is a class within the django.contrib.admin.options module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / pageadmin.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/pageadmin.py) + +```python +# pageadmin.py +from collections import namedtuple +import copy +import json +import sys +import uuid + + +import django +from django.contrib.admin.helpers import AdminForm +from django.conf import settings +from django.conf.urls import url +from django.contrib import admin, messages +from django.contrib.admin.models import LogEntry, CHANGE +~~from django.contrib.admin.options import IS_POPUP_VAR +from django.contrib.admin.utils import get_deleted_objects +from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.models import Site +from django.core.exceptions import (ObjectDoesNotExist, + PermissionDenied, ValidationError) +from django.db import router, transaction +from django.db.models import Q, Prefetch +from django.http import ( + HttpResponseRedirect, + HttpResponse, + Http404, + HttpResponseBadRequest, + HttpResponseForbidden, +) +from django.shortcuts import render, get_object_or_404 +from django.template.defaultfilters import escape +from django.template.loader import get_template +from django.template.response import SimpleTemplateResponse, TemplateResponse +from django.utils.encoding import force_text +from django.utils.translation import ugettext, ugettext_lazy as _, get_language +from django.utils.decorators import method_decorator +from django.views.decorators.http import require_POST +from django.http import QueryDict + + + +## ... source file continues with no further IS_POPUP_VAR examples... + +``` + + +## Example 2 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / tools.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/tools.py) + +```python +# tools.py +from __future__ import absolute_import, unicode_literals + +~~from django.contrib.admin.options import IS_POPUP_VAR +from django.core.exceptions import PermissionDenied +from django.utils.http import urlencode + + +ALLOWED_PICK_TYPES = ('folder', 'file') + + +def check_files_edit_permissions(request, files): + for f in files: + if not f.has_edit_permission(request): + raise PermissionDenied + + +def check_folder_edit_permissions(request, folders): + for f in folders: + if not f.has_edit_permission(request): + raise PermissionDenied + check_files_edit_permissions(request, f.files) + check_folder_edit_permissions(request, f.children.all()) + + +def check_files_read_permissions(request, files): + for f in files: + if not f.has_read_permission(request): + + +## ... source file continues with no further IS_POPUP_VAR examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-admin-options-modeladmin.markdown b/content/pages/examples/django/django-contrib-admin-options-modeladmin.markdown new file mode 100644 index 000000000..7d8b6b845 --- /dev/null +++ b/content/pages/examples/django/django-contrib-admin-options-modeladmin.markdown @@ -0,0 +1,61 @@ +title: django.contrib.admin.options ModelAdmin code examples +category: page +slug: django-contrib-admin-options-modeladmin-examples +sortorder: 500011024 +toc: False +sidebartitle: django.contrib.admin.options ModelAdmin +meta: Python example code for the ModelAdmin class from the django.contrib.admin.options module of the Django project. + + +ModelAdmin is a class within the django.contrib.admin.options module of the Django project. + + +## Example 1 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / admin.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./admin.py) + +```python +# admin.py +~~from django.contrib.admin.options import ModelAdmin, csrf_protect_m +from django.contrib.admin.views.main import SEARCH_VAR, ChangeList +from django.core.exceptions import PermissionDenied +from django.core.paginator import InvalidPage, Paginator +from django.shortcuts import render +from django.utils.encoding import force_str +from django.utils.translation import ungettext + +from haystack import connections +from haystack.constants import DEFAULT_ALIAS +from haystack.query import SearchQuerySet +from haystack.utils import get_model_ct_tuple + + +class SearchChangeList(ChangeList): + def __init__(self, **kwargs): + self.haystack_connection = kwargs.pop("haystack_connection", DEFAULT_ALIAS) + super(SearchChangeList, self).__init__(**kwargs) + + def get_results(self, request): + if SEARCH_VAR not in request.GET: + return super(SearchChangeList, self).get_results(request) + + sqs = ( + SearchQuerySet(self.haystack_connection) + + +## ... source file continues with no further ModelAdmin examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-admin-sites-notregistered.markdown b/content/pages/examples/django/django-contrib-admin-sites-notregistered.markdown new file mode 100644 index 000000000..731cd623b --- /dev/null +++ b/content/pages/examples/django/django-contrib-admin-sites-notregistered.markdown @@ -0,0 +1,66 @@ +title: django.contrib.admin.sites NotRegistered code examples +category: page +slug: django-contrib-admin-sites-notregistered-examples +sortorder: 500011026 +toc: False +sidebartitle: django.contrib.admin.sites NotRegistered +meta: Python example code for the NotRegistered class from the django.contrib.admin.sites module of the Django project. + + +NotRegistered is a class within the django.contrib.admin.sites module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / admin.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./admin.py) + +```python +# admin.py +from typing import Tuple, Type, Optional + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import admin +from django.contrib import messages +~~from django.contrib.admin.sites import NotRegistered +from django.http import HttpResponseRedirect, HttpRequest, HttpResponse +from django.urls import get_urlconf, get_resolver +from django.utils.translation import gettext_lazy as _ + +from .fields import TreeItemChoiceField +from .settings import MODEL_TREE, MODEL_TREE_ITEM +from .utils import get_tree_model, get_tree_item_model, get_app_n_model + +if False: # pragma: nocover + from .models import TreeItemBase, TreeBase # noqa + + +SMUGGLER_INSTALLED = 'smuggler' in django_settings.INSTALLED_APPS + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + +_TREE_ADMIN = lambda: TreeAdmin +_ITEM_ADMIN = lambda: TreeItemAdmin + + +def get_model_url_name(model_nfo: Tuple[str, str], page: str, with_namespace: bool = False) -> str: + prefix = '' + if with_namespace: + + +## ... source file continues with no further NotRegistered examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-admin-sites-site.markdown b/content/pages/examples/django/django-contrib-admin-sites-site.markdown new file mode 100644 index 000000000..2aabe9df0 --- /dev/null +++ b/content/pages/examples/django/django-contrib-admin-sites-site.markdown @@ -0,0 +1,290 @@ +title: django.contrib.admin.sites site code examples +category: page +slug: django-contrib-admin-sites-site-examples +sortorder: 500011027 +toc: False +sidebartitle: django.contrib.admin.sites site +meta: Python example code for the site function from the django.contrib.admin.sites module of the Django project. + + +site is a function within the django.contrib.admin.sites module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / tests / test_admin.py**](https://github.com/divio/django-cms/blob/develop/cms/tests/test_admin.py) + +```python +# test_admin.py +import json +import datetime + +from djangocms_text_ckeditor.cms_plugins import TextPlugin +from djangocms_text_ckeditor.models import Text +from django.contrib import admin +from django.contrib.admin.models import LogEntry +~~from django.contrib.admin.sites import site +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Permission +from django.contrib.sites.models import Site +from django.urls import reverse +from django.http import (Http404, HttpResponseBadRequest, + HttpResponseNotFound) +from django.utils.encoding import force_text, smart_str +from django.utils import timezone + +from cms import api +from cms.api import create_page, create_title, add_plugin, publish_page +from cms.admin.pageadmin import PageAdmin +from cms.constants import TEMPLATE_INHERITANCE_MAGIC +from cms.models import StaticPlaceholder +from cms.models.pagemodel import Page, PageType +from cms.models.permissionmodels import GlobalPagePermission, PagePermission +from cms.models.placeholdermodel import Placeholder +from cms.models.pluginmodel import CMSPlugin +from cms.models.titlemodels import Title +from cms.test_utils import testcases as base +from cms.test_utils.testcases import ( + CMSTestCase, URL_CMS_PAGE_DELETE, URL_CMS_PAGE,URL_CMS_TRANSLATION_DELETE, + URL_CMS_PAGE_CHANGE_LANGUAGE, URL_CMS_PAGE_CHANGE, + URL_CMS_PAGE_PUBLISHED, +) +from cms.utils.conf import get_cms_setting +from cms.utils.urlutils import admin_reverse + + +class AdminTestsBase(CMSTestCase): + @property + def admin_class(self): +~~ return site._registry[Page] + + def _get_guys(self, admin_only=False, use_global_permissions=True): + admin_user = self.get_superuser() + + if admin_only: + return admin_user + staff_user = self._get_staff_user(use_global_permissions) + return admin_user, staff_user + + def _get_staff_user(self, use_global_permissions=True): + USERNAME = 'test' + + if get_user_model().USERNAME_FIELD == 'email': + normal_guy = get_user_model().objects.create_user(USERNAME, 'test@test.com', 'test@test.com') + else: + normal_guy = get_user_model().objects.create_user(USERNAME, 'test@test.com', USERNAME) + + normal_guy.is_staff = True + normal_guy.is_active = True + perms = Permission.objects.filter( + codename__in=['change_page', 'change_title', 'add_page', 'add_title', 'delete_page', 'delete_title'] + ) + normal_guy.save() + normal_guy.user_permissions.set(perms) + if use_global_permissions: + gpp = GlobalPagePermission.objects.create( + user=normal_guy, + can_change=True, + can_delete=True, + can_change_advanced_settings=False, + can_publish=True, + can_change_permissions=False, + can_move_page=True, + ) + gpp.sites.set(Site.objects.all()) + return normal_guy + + +class AdminTestCase(AdminTestsBase): + + def test_extension_not_in_admin(self): + admin_user, staff = self._get_guys() + with self.login_user_context(admin_user): + request = self.get_request(URL_CMS_PAGE_CHANGE % 1, 'en',) +~~ response = site.index(request) + self.assertNotContains(response, '/mytitleextension/') + self.assertNotContains(response, '/mypageextension/') + + def test_2apphooks_with_same_namespace(self): + PAGE1 = 'Test Page' + PAGE2 = 'Test page 2' + APPLICATION_URLS = 'project.sampleapp.urls' + + admin_user, normal_guy = self._get_guys() + + current_site = Site.objects.get(pk=1) + + page = create_page(PAGE1, "nav_playground.html", "en", + site=current_site, created_by=admin_user) + page2 = create_page(PAGE2, "nav_playground.html", "en", + site=current_site, created_by=admin_user) + + page.application_urls = APPLICATION_URLS + page.application_namespace = "space1" + page.save() + page2.application_urls = APPLICATION_URLS + page2.save() + + page_data = { + + +## ... source file abbreviated to get to site examples ... + + + admin_user = self.get_superuser() + create_page("home", "nav_playground.html", "en", + created_by=admin_user, published=True) + page = create_page("delete-page", "nav_playground.html", "en", + created_by=admin_user, published=True) + create_page('child-page', "nav_playground.html", "de", + created_by=admin_user, published=True, parent=page) + body = page.placeholders.get(slot='body') + add_plugin(body, 'TextPlugin', 'en', body='text') + page.publish('en') + with self.login_user_context(admin_user): + data = {'post': 'yes'} + response = self.client.post(URL_CMS_PAGE_DELETE % page.pk, data) + self.assertRedirects(response, URL_CMS_PAGE) + + def test_search_fields(self): + superuser = self.get_superuser() + from django.contrib.admin import site + + with self.login_user_context(superuser): +~~ for model, admin_instance in site._registry.items(): + if model._meta.app_label != 'cms': + continue + if not admin_instance.search_fields: + continue + url = admin_reverse('cms_%s_changelist' % model._meta.model_name) + response = self.client.get('%s?q=1' % url) + errmsg = response.content + self.assertEqual(response.status_code, 200, errmsg) + + def test_pagetree_filtered(self): + superuser = self.get_superuser() + create_page("root-page", "nav_playground.html", "en", + created_by=superuser, published=True) + with self.login_user_context(superuser): + url = admin_reverse('cms_page_changelist') + response = self.client.get('%s?template__exact=nav_playground.html' % url) + errmsg = response.content + self.assertEqual(response.status_code, 200, errmsg) + + def test_delete_translation(self): + admin_user = self.get_superuser() + page = create_page("delete-page-translation", "nav_playground.html", "en", + created_by=admin_user, published=True) + create_title("de", "delete-page-translation-2", page, slug="delete-page-translation-2") + + +## ... source file abbreviated to get to site examples ... + + + page_admin = PageAdmin(Page, None) + page_admin._current_page = page + page.publish("en") + draft_page = page.get_draft_object() + admin_url = reverse("admin:cms_page_edit_title_fields", args=( + draft_page.pk, language + )) + + post_data = { + 'title': "A Title" + } + with self.login_user_context(admin_user): + self.client.post(admin_url, post_data) + draft_page = Page.objects.get(pk=page.pk).get_draft_object() + self.assertTrue(draft_page.is_dirty('en')) + + +class NoDBAdminTests(CMSTestCase): + @property + def admin_class(self): +~~ return site._registry[Page] + + def test_lookup_allowed_site__exact(self): + self.assertTrue(self.admin_class.lookup_allowed('site__exact', '1')) + + def test_lookup_allowed_published(self): + self.assertTrue(self.admin_class.lookup_allowed('published', value='1')) + + +class PluginPermissionTests(AdminTestsBase): + def setUp(self): + self._page = create_page('test page', 'nav_playground.html', 'en') + self._placeholder = self._page.placeholders.all()[0] + + def _get_admin(self): + User = get_user_model() + + fields = dict(email="admin@django-cms.org", is_staff=True, is_active=True) + + if (User.USERNAME_FIELD != 'email'): + fields[User.USERNAME_FIELD] = "admin" + + admin_user = User(**fields) + + admin_user.set_password('admin') + + +## ... source file abbreviated to get to site examples ... + + + page2_data = { + 'reverse_id': 'p1', + 'template': 'col_two.html', + } + + with self.login_user_context(superuser): + response = self.client.post(page2_endpoint, page2_data) + expected_error = ( + '
    ' + '
  • A page with this reverse URL id exists already.
' + ) + self.assertEqual(response.status_code, 200) + self.assertContains(response, expected_error.format(page2.pk), html=True) + + def test_advanced_settings_endpoint(self): + admin_user = self.get_superuser() + site = Site.objects.get_current() + page = create_page('Page 1', 'nav_playground.html', 'en') + page_data = { + 'language': 'en', +~~ 'site': site.pk, + 'template': 'col_two.html', + } + path = admin_reverse('cms_page_advanced', args=(page.pk,)) + + with self.login_user_context(admin_user): + en_path = path + u"?language=en" + redirect_path = admin_reverse('cms_page_changelist') + '?language=en' + response = self.client.post(en_path, page_data) + self.assertRedirects(response, redirect_path) + self.assertEqual(Page.objects.get(pk=page.pk).template, 'col_two.html') + + page_data['language'] = 'de' + page_data['template'] = 'nav_playground.html' + + with self.login_user_context(admin_user): + de_path = path + u"?language=de" + redirect_path = admin_reverse('cms_page_change', args=(page.pk,)) + '?language=de' + response = self.client.post(de_path, page_data) + self.assertRedirects(response, redirect_path) + self.assertEqual(Page.objects.get(pk=page.pk).template, 'col_two.html') + + de_translation = create_title('de', title='Page 1', page=page.reload()) + de_translation.slug = '' + de_translation.save() + + +## ... source file continues with no further site examples... + +``` + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 167242cf4..9bb138701 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -16,6 +16,20 @@ on GitHub. ## 2020 ### June * Added new example code for [Django](/django.html) modules: + * [django.contrib.admin.helpers](/django-contrib-admin-helpers-examples.html), + [ActionForm](/django-contrib-admin-helpers-actionform-examples.html), + and + [AdminForm](/django-contrib-admin-helpers-adminform-examples.html) + * django.contrib.admin.options + [IS_POPUP_VAR](/django-contrib-admin-options-is-popup-var-examples.html), + [IncorrectLookupParameters](/django-contrib-admin-options-incorrectlookupparameters-examples.html), + [ModelAdmin](/django-contrib-admin-options-modeladmin-examples.html), + and + [csrf_protect_m](/django-contrib-admin-options-csrf-protect-m-examples.html) + * django.contrib.admin.sites + [NotRegistered](/django-contrib-admin-sites-notregistered-examples.html) + and + [site](/django-contrib-admin-sites-site-examples.html) * django.utils.translation [LANGUAGE_SESSION_KEY](/django-utils-translation-language-session-key-examples.html), [activate](/django-utils-translation-activate-examples.html), diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index e9a01ae5b..4311fe2ac 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -11,10 +11,26 @@

django.conf

django.contrib.admin filters.SimpleListFilter, - sites.register, - auth.get_user_model, - auth.decorators login_required, - auth.hashers.make_password +

+

django.contrib.admin.helpers + ActionForm, + AdminForm +

+

django.contrib.admin.options + IS_POPUP_VAR, + IncorrectLookupParameters, + ModelAdmin, + csrf_protect_m +

+

django.contrib.admin.sites + NotRegistered, + register, + site +

+

django.contrib.auth + get_user_model, + decorators login_required, + hashers make_password

django.core mail.send_mail, From dbf15a41794406c8ab69b0e2a8dfb07dfbfe96ff Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 23 Jun 2020 07:40:20 -0400 Subject: [PATCH 132/302] add description to http method funcs --- .../examples/flask/flask-views-http-method-funcs.markdown | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 34c63f4cb..878905478 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -7,7 +7,12 @@ sidebartitle: flask.views http_method_funcs meta: Python example code for the http_method_funcs function from the flask.views module of the Flask project. -http_method_funcs is a function within the flask.views module of the Flask project. +`http_method_funcs` is an immutable Python set within the +[flask.views module](https://github.com/pallets/flask/blob/master/src/flask/views.py) +of the [Flask](/flask.html) project. It contains strings of the HTTP methods +"get", "post", "head", "options", "delete", "put", "trace", and "patch", +which is useful for checking if an HTTP method is valid by comparing it +against the items in this set. ## Example 1 from flask-restx From d906a94d022e318850e4fd7e4afce8c15a101607 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 24 Jun 2020 20:46:22 -0400 Subject: [PATCH 133/302] adding some django core modules --- .../04-web-development/23-javascript.markdown | 9 + .../django/django-core-cache.markdown | 115 ++++ .../django/django-core-checks.markdown | 388 ++++++++++++ .../django/django-core-exceptions.markdown | 183 ++++++ .../examples/django/django-core-mail.markdown | 348 +++++++++++ .../django/django-core-management.markdown | 568 ++++++++++++++++++ .../django/django-core-serializers.markdown | 111 ++++ .../django/django-core-signals.markdown | 164 +++++ .../django/django-core-signing.markdown | 310 ++++++++++ .../django/django-core-validators.markdown | 436 ++++++++++++++ .../flask/flask-blueprints-blueprint.markdown | 69 ++- .../flask/flask-cli-with-appcontext.markdown | 10 + .../flask/flask-ctx-has-app-context.markdown | 5 + .../flask-ctx-has-request-context.markdown | 10 +- .../flask-example-projects-code.markdown | 7 + .../flask/flask-globals-current-app.markdown | 183 +++++- .../flask/flask-globals-request.markdown | 155 ++++- .../flask/flask-globals-session.markdown | 15 + .../flask/flask-helpers-flash.markdown | 103 +++- .../flask-helpers-make-response.markdown | 15 + .../flask/flask-helpers-url-for.markdown | 15 + .../flask/flask-json-jsonify.markdown | 40 ++ .../flask-sessions-badsignature.markdown | 11 + .../flask-sessions-sessioninterface.markdown | 5 + ...ask-signals-got-request-exception.markdown | 5 + .../flask-templating-render-template.markdown | 140 ++++- .../flask-views-http-method-funcs.markdown | 5 + .../flask/flask-views-methodview.markdown | 17 +- content/pages/meta/00-change-log.markdown | 11 + theme/templates/code-examples/django.html | 11 +- 30 files changed, 3405 insertions(+), 59 deletions(-) create mode 100644 content/pages/examples/django/django-core-cache.markdown create mode 100644 content/pages/examples/django/django-core-checks.markdown create mode 100644 content/pages/examples/django/django-core-exceptions.markdown create mode 100644 content/pages/examples/django/django-core-mail.markdown create mode 100644 content/pages/examples/django/django-core-management.markdown create mode 100644 content/pages/examples/django/django-core-serializers.markdown create mode 100644 content/pages/examples/django/django-core-signals.markdown create mode 100644 content/pages/examples/django/django-core-signing.markdown create mode 100644 content/pages/examples/django/django-core-validators.markdown diff --git a/content/pages/04-web-development/23-javascript.markdown b/content/pages/04-web-development/23-javascript.markdown index e4910976d..8440dcc4f 100644 --- a/content/pages/04-web-development/23-javascript.markdown +++ b/content/pages/04-web-development/23-javascript.markdown @@ -130,6 +130,15 @@ Allen Wirfs-Brock for more context on the language's evolution. * [Learn JS data](http://learnjsdata.com/) teaches how to manipulate data using JavaScript in a browser or on the server using Node.js. +* [A Beginner's Guide to JavaScript's Prototype](https://ui.dev/beginners-guide-to-javascript-prototype/) + explains the fundamentals of JavaScript's object system, which is + a prototype-based model and different from many other common + programming languages' object models. + +* [Understanding Data Types in JavaScript](https://www.digitalocean.com/community/tutorials/understanding-data-types-in-javascript) + examines JavaScript's dynamic data type model and how it manifests + in the way numbers, string, Booleans and arrays are used. + ### JavaScript learning checklist 1. Create a simple HTML file with basic elements in it. Use the diff --git a/content/pages/examples/django/django-core-cache.markdown b/content/pages/examples/django/django-core-cache.markdown new file mode 100644 index 000000000..f8bb4baf2 --- /dev/null +++ b/content/pages/examples/django/django-core-cache.markdown @@ -0,0 +1,115 @@ +title: django.core cache code examples +category: page +slug: django-core-cache-examples +sortorder: 500011078 +toc: False +sidebartitle: django.core cache +meta: Python example code for the cache function from the django.core module of the Django project. + + +cache is a function within the django.core module of the Django project. + + +## Example 1 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / panels / cache.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/cache.py) + +```python +# cache.py +import inspect +import sys +import time +from collections import OrderedDict + +from django.conf import settings +~~from django.core import cache +from django.core.cache import CacheHandler, caches as original_caches +from django.core.cache.backends.base import BaseCache +from django.dispatch import Signal +from django.middleware import cache as middleware_cache +from django.utils.translation import gettext_lazy as _, ngettext as __ + +from debug_toolbar import settings as dt_settings +from debug_toolbar.panels import Panel +from debug_toolbar.utils import ( + get_stack, + get_template_info, + render_stacktrace, + tidy_stacktrace, +) + +cache_called = Signal() + + +def send_signal(method): + def wrapped(self, *args, **kwargs): + t = time.time() + value = method(self, *args, **kwargs) + t = time.time() - t + + + +## ... source file abbreviated to get to cache examples ... + + + @property + def nav_subtitle(self): + cache_calls = len(self.calls) + return __( + "%(cache_calls)d call in %(time).2fms", + "%(cache_calls)d calls in %(time).2fms", + cache_calls, + ) % {"cache_calls": cache_calls, "time": self.total_time} + + @property + def title(self): + count = len(getattr(settings, "CACHES", ["default"])) + return __( + "Cache calls from %(count)d backend", + "Cache calls from %(count)d backends", + count, + ) % {"count": count} + + def enable_instrumentation(self): + if isinstance(middleware_cache.caches, CacheHandlerPatch): +~~ cache.caches = middleware_cache.caches + else: +~~ cache.caches = CacheHandlerPatch() + + def disable_instrumentation(self): +~~ cache.caches = original_caches + middleware_cache.caches = original_caches + + def generate_stats(self, request, response): + self.record_stats( + { + "total_calls": len(self.calls), + "calls": self.calls, + "total_time": self.total_time, + "hits": self.hits, + "misses": self.misses, + "counts": self.counts, + } + ) + + def generate_server_timing(self, request, response): + stats = self.get_stats() + value = stats.get("total_time", 0) + title = "Cache {} Calls".format(stats.get("total_calls", 0)) + self.record_server_timing("total_time", title, value) + + + +## ... source file continues with no further cache examples... + +``` + diff --git a/content/pages/examples/django/django-core-checks.markdown b/content/pages/examples/django/django-core-checks.markdown new file mode 100644 index 000000000..c4bceb4db --- /dev/null +++ b/content/pages/examples/django/django-core-checks.markdown @@ -0,0 +1,388 @@ +title: django.core checks code examples +category: page +slug: django-core-checks-examples +sortorder: 500011079 +toc: False +sidebartitle: django.core checks +meta: Python example code for the checks function from the django.core module of the Django project. + + +checks is a function within the django.core module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / tests / test_apphooks.py**](https://github.com/divio/django-cms/blob/develop/cms/tests/test_apphooks.py) + +```python +# test_apphooks.py +import sys +import mock + +from django.contrib.admin.models import CHANGE, LogEntry +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Permission +from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.models import Site +~~from django.core import checks +from django.core.cache import cache +from django.core.checks.urls import check_url_config +from django.test.utils import override_settings +from django.urls import NoReverseMatch, clear_url_caches, resolve, reverse +from django.utils.timezone import now +from django.utils.translation import override as force_language + +from six import string_types + +from cms.admin.forms import AdvancedSettingsForm +from cms.api import create_page, create_title +from cms.app_base import CMSApp +from cms.apphook_pool import apphook_pool +from cms.appresolver import applications_page_check, clear_app_resolvers, get_app_patterns +from cms.constants import PUBLISHER_STATE_DIRTY +from cms.models import Title, Page +from cms.middleware.page import get_page +from cms.test_utils.project.placeholderapp.models import Example1 +from cms.test_utils.testcases import CMSTestCase +from cms.tests.test_menu_utils import DumbPageLanguageUrl +from cms.toolbar.toolbar import CMSToolbar +from cms.utils.conf import get_cms_setting +from cms.utils.urlutils import admin_reverse +from menus.menu_pool import menu_pool + + +## ... source file abbreviated to get to checks examples ... + + + create_title("de", "aphooked-page-de", page) + self.assertTrue(page.publish('en')) + self.assertTrue(page.publish('de')) + self.assertTrue(blank_page.publish('en')) + with force_language("en"): + response = self.client.get(self.get_pages_root()) + self.assertTemplateUsed(response, 'sampleapp/home.html') + self.assertContains(response, '<--noplaceholder-->') + response = self.client.get('/en/blankapp/') + self.assertTemplateUsed(response, 'nav_playground.html') + + self.apphook_clear() + + @override_settings(ROOT_URLCONF='cms.test_utils.project.urls_for_apphook_tests') + def test_apphook_does_not_crash_django_checks(self): + self.apphook_clear() + superuser = get_user_model().objects.create_superuser('admin', 'admin@admin.com', 'admin') + create_page("apphooked-page", "nav_playground.html", "en", + created_by=superuser, published=True, apphook="SampleApp") + self.reload_urls() +~~ checks.run_checks() + self.apphook_clear() + + @override_settings(ROOT_URLCONF='cms.test_utils.project.urls_for_apphook_tests') + def test_apphook_on_root_reverse(self): + self.apphook_clear() + superuser = get_user_model().objects.create_superuser('admin', 'admin@admin.com', 'admin') + page = create_page("apphooked-page", "nav_playground.html", "en", + created_by=superuser, published=True, apphook="SampleApp") + create_title("de", "aphooked-page-de", page) + self.assertTrue(page.publish('de')) + self.assertTrue(page.publish('en')) + + self.reload_urls() + + self.assertFalse(reverse('sample-settings').startswith('//')) + self.apphook_clear() + + @override_settings(ROOT_URLCONF='cms.test_utils.project.urls_for_apphook_tests') + def test_multisite_apphooks(self): + self.apphook_clear() + site1, _ = Site.objects.get_or_create(pk=1) + site2, _ = Site.objects.get_or_create(pk=2) + superuser = get_user_model().objects.create_superuser('admin', 'admin@admin.com', 'admin') + home_site_1 = create_page( + + +## ... source file continues with no further checks examples... + +``` + + +## Example 2 from django-cors-headers +[django-cors-headers](https://github.com/ottoyiu/django-cors-headers) +is an +[open source](https://github.com/ottoyiu/django-cors-headers/blob/master/LICENSE) +library for enabling +[Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) +handling in your [Django](/django.html) web applications and appropriately +dealing with HTTP headers for CORS requests. + +[**django-cors-headers / src/corsheaders / checks.py**](https://github.com/ottoyiu/django-cors-headers/blob/master/src/corsheaders/./checks.py) + +```python +# checks.py +import re +from collections.abc import Sequence +from numbers import Integral +from urllib.parse import urlparse + +from django.conf import settings +~~from django.core import checks + +from corsheaders.conf import conf + +re_type = type(re.compile("")) + + +@checks.register +def check_settings(app_configs, **kwargs): + errors = [] + + if not is_sequence(conf.CORS_ALLOW_HEADERS, str): + errors.append( +~~ checks.Error( + "CORS_ALLOW_HEADERS should be a sequence of strings.", + id="corsheaders.E001", + ) + ) + + if not is_sequence(conf.CORS_ALLOW_METHODS, str): + errors.append( +~~ checks.Error( + "CORS_ALLOW_METHODS should be a sequence of strings.", + id="corsheaders.E002", + ) + ) + + if not isinstance(conf.CORS_ALLOW_CREDENTIALS, bool): + errors.append( +~~ checks.Error( + "CORS_ALLOW_CREDENTIALS should be a bool.", id="corsheaders.E003" + ) + ) + + if ( + not isinstance(conf.CORS_PREFLIGHT_MAX_AGE, Integral) + or conf.CORS_PREFLIGHT_MAX_AGE < 0 + ): + errors.append( +~~ checks.Error( + ( + "CORS_PREFLIGHT_MAX_AGE should be an integer greater than " + + "or equal to zero." + ), + id="corsheaders.E004", + ) + ) + + if not isinstance(conf.CORS_ORIGIN_ALLOW_ALL, bool): + errors.append( +~~ checks.Error( + "CORS_ORIGIN_ALLOW_ALL should be a bool.", id="corsheaders.E005" + ) + ) + + if not is_sequence(conf.CORS_ORIGIN_WHITELIST, str): + errors.append( +~~ checks.Error( + "CORS_ORIGIN_WHITELIST should be a sequence of strings.", + id="corsheaders.E006", + ) + ) + else: + special_origin_values = ( + "null", + "file://", + ) + for origin in conf.CORS_ORIGIN_WHITELIST: + if origin in special_origin_values: + continue + parsed = urlparse(origin) + if parsed.scheme == "" or parsed.netloc == "": + errors.append( +~~ checks.Error( + ( + "Origin {} in CORS_ORIGIN_WHITELIST is missing " + + " scheme or netloc" + ).format(repr(origin)), + id="corsheaders.E013", + hint=( + "Add a scheme (e.g. https://) or netloc (e.g. " + + "example.com)." + ), + ) + ) + else: + for part in ("path", "params", "query", "fragment"): + if getattr(parsed, part) != "": + errors.append( +~~ checks.Error( + ( + "Origin {} in CORS_ORIGIN_WHITELIST should " + + "not have {}" + ).format(repr(origin), part), + id="corsheaders.E014", + ) + ) + + if not is_sequence(conf.CORS_ORIGIN_REGEX_WHITELIST, (str, re_type)): + errors.append( +~~ checks.Error( + ( + "CORS_ORIGIN_REGEX_WHITELIST should be a sequence of " + + "strings and/or compiled regexes." + ), + id="corsheaders.E007", + ) + ) + + if not is_sequence(conf.CORS_EXPOSE_HEADERS, str): + errors.append( +~~ checks.Error( + "CORS_EXPOSE_HEADERS should be a sequence.", id="corsheaders.E008" + ) + ) + + if not isinstance(conf.CORS_URLS_REGEX, (str, re_type)): + errors.append( +~~ checks.Error( + "CORS_URLS_REGEX should be a string or regex.", id="corsheaders.E009" + ) + ) + + if not isinstance(conf.CORS_REPLACE_HTTPS_REFERER, bool): + errors.append( +~~ checks.Error( + "CORS_REPLACE_HTTPS_REFERER should be a bool.", id="corsheaders.E011" + ) + ) + + if hasattr(settings, "CORS_MODEL"): + errors.append( +~~ checks.Error( + ( + "The CORS_MODEL setting has been removed - see " + + "django-cors-headers' HISTORY." + ), + id="corsheaders.E012", + ) + ) + + return errors + + +def is_sequence(thing, type_or_types): + return isinstance(thing, Sequence) and all( + isinstance(x, type_or_types) for x in thing + ) + + + +## ... source file continues with no further checks examples... + +``` + + +## Example 3 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / snippets / tests.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/snippets/tests.py) + +```python +# tests.py +import json + +from django.contrib.admin.utils import quote +from django.contrib.auth import get_user_model +from django.contrib.auth.models import AnonymousUser, Permission +~~from django.core import checks +from django.core.exceptions import ValidationError +from django.core.files.base import ContentFile +from django.core.files.uploadedfile import SimpleUploadedFile +from django.http import HttpRequest, HttpResponse +from django.test import RequestFactory, TestCase +from django.test.utils import override_settings +from django.urls import reverse +from taggit.models import Tag + +from wagtail.admin.edit_handlers import FieldPanel +from wagtail.admin.forms import WagtailAdminModelForm +from wagtail.core.models import Page +from wagtail.snippets.blocks import SnippetChooserBlock +from wagtail.snippets.edit_handlers import SnippetChooserPanel +from wagtail.snippets.models import SNIPPET_MODELS, register_snippet +from wagtail.snippets.views.snippets import get_snippet_edit_handler +from wagtail.tests.snippets.forms import FancySnippetForm +from wagtail.tests.snippets.models import ( + AlphaSnippet, FancySnippet, FileUploadSnippet, RegisterDecorator, RegisterFunction, + SearchableSnippet, StandardSnippet, StandardSnippetWithCustomPrimaryKey, ZuluSnippet) +from wagtail.tests.testapp.models import ( + Advert, AdvertWithCustomPrimaryKey, AdvertWithCustomUUIDPrimaryKey, AdvertWithTabbedInterface, + SnippetChooserModel, SnippetChooserModelWithCustomPrimaryKey) +from wagtail.tests.utils import WagtailTestUtils + + +## ... source file abbreviated to get to checks examples ... + + + def setUp(self): + self.login() + + def get(self, pk, params=None): + return self.client.get(reverse('wagtailsnippets:chosen', + args=('tests', 'advertwithcustomuuidprimarykey', quote(pk))), + params or {}) + + def test_choose_a_page(self): + response = self.get(pk=AdvertWithCustomUUIDPrimaryKey.objects.all()[0].pk) + response_json = json.loads(response.content.decode()) + self.assertEqual(response_json['step'], 'chosen') + + +class TestPanelConfigurationChecks(TestCase, WagtailTestUtils): + + def setUp(self): + self.warning_id = 'wagtailadmin.W002' + + def get_checks_result(): +~~ checks_result = checks.run_checks(tags=['panels']) + return [ + warning for warning in + checks_result if warning.id == self.warning_id] + + self.get_checks_result = get_checks_result + + def test_model_with_single_tabbed_panel_only(self): + + StandardSnippet.content_panels = [FieldPanel('text')] + +~~ warning = checks.Warning( + "StandardSnippet.content_panels will have no effect on snippets editing", + hint="""Ensure that StandardSnippet uses `panels` instead of `content_panels`\ +or set up an `edit_handler` if you want a tabbed editing interface. +There are no default tabs on non-Page models so there will be no\ + Content tab for the content_panels to render in.""", + obj=StandardSnippet, + id='wagtailadmin.W002', + ) + + checks_results = self.get_checks_result() + + self.assertEqual([warning], checks_results) + + delattr(StandardSnippet, 'content_panels') + + + +## ... source file continues with no further checks examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions.markdown b/content/pages/examples/django/django-core-exceptions.markdown new file mode 100644 index 000000000..b1aa162cf --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions.markdown @@ -0,0 +1,183 @@ +title: django.core exceptions code examples +category: page +slug: django-core-exceptions-examples +sortorder: 500011080 +toc: False +sidebartitle: django.core exceptions +meta: Python example code for the exceptions function from the django.core module of the Django project. + + +exceptions is a function within the django.core module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / forms.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py) + +```python +# forms.py +from __future__ import absolute_import + +import warnings +from importlib import import_module + +from django import forms +from django.contrib.auth.tokens import PasswordResetTokenGenerator +from django.contrib.sites.shortcuts import get_current_site +~~from django.core import exceptions, validators +from django.urls import reverse +from django.utils.translation import gettext, gettext_lazy as _, pgettext + +from ..utils import ( + build_absolute_uri, + get_username_max_length, + set_form_field_order, +) +from . import app_settings +from .adapter import get_adapter +from .app_settings import AuthenticationMethod +from .models import EmailAddress +from .utils import ( + filter_users_by_email, + get_user_model, + perform_login, + setup_user_email, + sync_user_email_addresses, + url_str_to_user_pk, + user_email, + user_pk_to_url_str, + user_username, +) + + + +## ... source file abbreviated to get to exceptions examples ... + + + credentials["email"] = login + elif ( + app_settings.AUTHENTICATION_METHOD == + AuthenticationMethod.USERNAME): + credentials["username"] = login + else: + if self._is_login_email(login): + credentials["email"] = login + credentials["username"] = login + credentials["password"] = self.cleaned_data["password"] + return credentials + + def clean_login(self): + login = self.cleaned_data['login'] + return login.strip() + + def _is_login_email(self, login): + try: + validators.validate_email(login) + ret = True +~~ except exceptions.ValidationError: + ret = False + return ret + + def clean(self): + super(LoginForm, self).clean() + if self._errors: + return + credentials = self.user_credentials() + user = get_adapter(self.request).authenticate( + self.request, + **credentials) + if user: + self.user = user + else: + auth_method = app_settings.AUTHENTICATION_METHOD + if auth_method == app_settings.AuthenticationMethod.USERNAME_EMAIL: + login = self.cleaned_data['login'] + if self._is_login_email(login): + auth_method = app_settings.AuthenticationMethod.EMAIL + else: + auth_method = app_settings.AuthenticationMethod.USERNAME + raise forms.ValidationError( + self.error_messages['%s_password_mismatch' % auth_method]) + return self.cleaned_data + + +## ... source file abbreviated to get to exceptions examples ... + + + remember = self.cleaned_data['remember'] + if remember: + request.session.set_expiry(app_settings.SESSION_COOKIE_AGE) + else: + request.session.set_expiry(0) + return ret + + +class _DummyCustomSignupForm(forms.Form): + + def signup(self, request, user): + pass + + +def _base_signup_form_class(): + if not app_settings.SIGNUP_FORM_CLASS: + return _DummyCustomSignupForm + try: + fc_module, fc_classname = app_settings.SIGNUP_FORM_CLASS.rsplit('.', 1) + except ValueError: +~~ raise exceptions.ImproperlyConfigured('%s does not point to a form' + ' class' + % app_settings.SIGNUP_FORM_CLASS) + try: + mod = import_module(fc_module) + except ImportError as e: +~~ raise exceptions.ImproperlyConfigured('Error importing form class %s:' + ' "%s"' % (fc_module, e)) + try: + fc_class = getattr(mod, fc_classname) + except AttributeError: +~~ raise exceptions.ImproperlyConfigured('Module "%s" does not define a' + ' "%s" class' % (fc_module, + fc_classname)) + if not hasattr(fc_class, 'signup'): + if hasattr(fc_class, 'save'): + warnings.warn("The custom signup form must offer" + " a `def signup(self, request, user)` method", + DeprecationWarning) + else: +~~ raise exceptions.ImproperlyConfigured( + 'The custom signup form must implement a "signup" method') + return fc_class + + +class BaseSignupForm(_base_signup_form_class()): + username = forms.CharField(label=_("Username"), + min_length=app_settings.USERNAME_MIN_LENGTH, + widget=forms.TextInput( + attrs={'placeholder': + _('Username'), + 'autofocus': 'autofocus'})) + email = forms.EmailField(widget=forms.TextInput( + attrs={'type': 'email', + 'placeholder': _('E-mail address')})) + + def __init__(self, *args, **kwargs): + email_required = kwargs.pop('email_required', + app_settings.EMAIL_REQUIRED) + self.username_required = kwargs.pop('username_required', + app_settings.USERNAME_REQUIRED) + super(BaseSignupForm, self).__init__(*args, **kwargs) + username_field = self.fields['username'] + username_field.max_length = get_username_max_length() + username_field.validators.append( + + +## ... source file continues with no further exceptions examples... + +``` + diff --git a/content/pages/examples/django/django-core-mail.markdown b/content/pages/examples/django/django-core-mail.markdown new file mode 100644 index 000000000..bb83122b4 --- /dev/null +++ b/content/pages/examples/django/django-core-mail.markdown @@ -0,0 +1,348 @@ +title: django.core mail code examples +category: page +slug: django-core-mail-examples +sortorder: 500011081 +toc: False +sidebartitle: django.core mail +meta: Python example code for the mail function from the django.core module of the Django project. + + +mail is a function within the django.core module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / tests.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/tests.py) + +```python +# tests.py +from __future__ import absolute_import + +import json +import uuid +from datetime import timedelta + +from django import forms +from django.conf import settings +from django.contrib.auth.models import AbstractUser, AnonymousUser +from django.contrib.sites.models import Site +~~from django.core import mail, validators +from django.core.exceptions import ValidationError +from django.db import models +from django.http import HttpResponseRedirect +from django.template import Context, Template +from django.test.client import Client, RequestFactory +from django.test.utils import override_settings +from django.urls import reverse +from django.utils.timezone import now + +from allauth.account.forms import BaseSignupForm, ResetPasswordForm, SignupForm +from allauth.account.models import ( + EmailAddress, + EmailConfirmation, + EmailConfirmationHMAC, +) +from allauth.tests import Mock, TestCase, patch +from allauth.utils import get_user_model, get_username_max_length + +from . import app_settings +from .adapter import get_adapter +from .auth_backends import AuthenticationBackend +from .signals import user_logged_in, user_logged_out +from .utils import ( + filter_users_by_username, + + +## ... source file abbreviated to get to mail examples ... + + + + def _password_set_or_change_redirect(self, urlname, usable_password): + self._create_user_and_login(usable_password) + return self.client.get(reverse(urlname)) + + def test_ajax_password_change(self): + self._create_user_and_login() + resp = self.client.post( + reverse('account_change_password'), + data={'oldpassword': 'doe', + 'password1': 'AbCdEf!123', + 'password2': 'AbCdEf!123456'}, + HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(resp['content-type'], 'application/json') + data = json.loads(resp.content.decode('utf8')) + assert ('same password' in + data['form']['fields']['password2']['errors'][0]) + + def test_password_forgotten_username_hint(self): + user = self._request_new_password() +~~ body = mail.outbox[0].body + assert user.username in body + + @override_settings( + ACCOUNT_AUTHENTICATION_METHOD=app_settings.AuthenticationMethod.EMAIL) + def test_password_forgotten_no_username_hint(self): + user = self._request_new_password() +~~ body = mail.outbox[0].body + assert user.username not in body + + def _request_new_password(self): + user = get_user_model().objects.create( + username='john', email="john@example.org", is_active=True) + user.set_password('doe') + user.save() + self.client.post( + reverse('account_reset_password'), + data={'email': 'john@example.org'}) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(mail.outbox[0].to, ["john@example.org"]) + return user + + def test_password_reset_flow_with_empty_session(self): + self._request_new_password() +~~ body = mail.outbox[0].body + self.assertGreater(body.find('https://'), 0) + + url = body[body.find('/password/reset/'):].split()[0] + resp = self.client.get(url) + + reset_pass_url = resp.url + + resp = self.client_class().get(reset_pass_url) + + self.assertTemplateUsed( + resp, + 'account/password_reset_from_key.%s' % + app_settings.TEMPLATE_EXTENSION) + + self.assertTrue(resp.context_data['token_fail']) + + def test_password_reset_flow(self): + user = self._request_new_password() +~~ body = mail.outbox[0].body + self.assertGreater(body.find('https://'), 0) + + url = body[body.find('/password/reset/'):].split()[0] + resp = self.client.get(url) + url = resp.url + resp = self.client.get(url) + self.assertTemplateUsed( + resp, + 'account/password_reset_from_key.%s' % + app_settings.TEMPLATE_EXTENSION) + self.assertFalse('token_fail' in resp.context_data) + + resp = self.client.post(url, + {'password1': 'newpass123', + 'password2': 'newpass123'}) + self.assertRedirects(resp, + reverse('account_reset_password_from_key_done')) + + user = get_user_model().objects.get(pk=user.pk) + self.assertTrue(user.check_password('newpass123')) + + resp = self.client.post(url, + {'password1': 'newpass123', + 'password2': 'newpass123'}) + + +## ... source file abbreviated to get to mail examples ... + + + app_settings.TEMPLATE_EXTENSION) + self.assertTrue(resp.context_data['token_fail']) + + response = self.client.get(url) + self.assertTemplateUsed( + response, + 'account/password_reset_from_key.%s' % + app_settings.TEMPLATE_EXTENSION) + self.assertTrue(response.context_data['token_fail']) + + response = self.client.post(url, + {'password1': 'newpass123', + 'password2': 'newpass123'}, + HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 400) + data = json.loads(response.content.decode('utf8')) + assert 'invalid' in data['form']['errors'][0] + + def test_password_reset_flow_with_email_changed(self): + user = self._request_new_password() +~~ body = mail.outbox[0].body + self.assertGreater(body.find('https://'), 0) + EmailAddress.objects.create( + user=user, + email='other@email.org') + url = body[body.find('/password/reset/'):].split()[0] + resp = self.client.get(url) + self.assertTemplateUsed( + resp, + 'account/password_reset_from_key.%s' % + app_settings.TEMPLATE_EXTENSION) + self.assertTrue('token_fail' in resp.context_data) + + @override_settings(ACCOUNT_LOGIN_ON_PASSWORD_RESET=True) + def test_password_reset_ACCOUNT_LOGIN_ON_PASSWORD_RESET(self): + user = self._request_new_password() +~~ body = mail.outbox[0].body + url = body[body.find('/password/reset/'):].split()[0] + resp = self.client.get(url) + resp = self.client.post( + resp.url, + {'password1': 'newpass123', + 'password2': 'newpass123'}) + self.assertTrue(user.is_authenticated) + self.assertRedirects(resp, '/confirm-email/') + + @override_settings(ACCOUNT_EMAIL_CONFIRMATION_HMAC=False) + def test_email_verification_mandatory(self): + c = Client() + resp = c.post(reverse('account_signup'), + {'username': 'johndoe', + 'email': 'john@example.com', + 'password1': 'johndoe', + 'password2': 'johndoe'}, + follow=True) + self.assertEqual(resp.status_code, 200) + self.assertEqual(mail.outbox[0].to, ['john@example.com']) + self.assertGreater(mail.outbox[0].body.find('https://'), 0) + self.assertEqual(len(mail.outbox), 1) + self.assertTemplateUsed( + resp, + + +## ... source file continues with no further mail examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / tests / test_mail.py**](https://github.com/divio/django-cms/blob/develop/cms/tests/test_mail.py) + +```python +# test_mail.py +from django.contrib.auth import get_user_model +~~from django.core import mail + +from cms.api import create_page_user +from cms.test_utils.testcases import CMSTestCase +from cms.utils.mail import mail_page_user_change + + +class MailTestCase(CMSTestCase): + def setUp(self): +~~ mail.outbox = [] # reset outbox + + def test_mail_page_user_change(self): + user = get_user_model().objects.create_superuser("username", "username@django-cms.org", "username") + user = create_page_user(user, user, grant_all=True) + mail_page_user_change(user) + self.assertEqual(len(mail.outbox), 1) + + + +## ... source file continues with no further mail examples... + +``` + + +## Example 3 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / tests / test_tasks.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/tests/test_tasks.py) + +```python +# test_tasks.py +from django.test import TestCase +from explorer.app_settings import EXPLORER_DEFAULT_CONNECTION as CONN +from explorer.tasks import execute_query, snapshot_queries, truncate_querylogs, build_schema_cache_async +from explorer.tests.factories import SimpleQueryFactory +~~from django.core import mail +from mock import Mock, patch +from six import StringIO +from explorer.models import QueryLog +from datetime import datetime, timedelta + + +class TestTasks(TestCase): + + @patch('explorer.tasks.s3_upload') + def test_async_results(self, mocked_upload): + mocked_upload.return_value = 'http://s3.com/your-file.csv' + + q = SimpleQueryFactory(sql='select 1 "a", 2 "b", 3 "c";', title="testquery") + execute_query(q.id, 'cc@epantry.com') + + output = StringIO() + output.write('a,b,c\r\n1,2,3\r\n') + + self.assertEqual(len(mail.outbox), 2) +~~ self.assertIn('[SQL Explorer] Your query is running', mail.outbox[0].subject) +~~ self.assertIn('[SQL Explorer] Report ', mail.outbox[1].subject) + self.assertEqual(mocked_upload.call_args[0][1].getvalue(), output.getvalue()) + self.assertEqual(mocked_upload.call_count, 1) + + @patch('explorer.tasks.s3_upload') + def test_async_results_fails_with_message(self, mocked_upload): + mocked_upload.return_value = 'http://s3.com/your-file.csv' + + q = SimpleQueryFactory(sql='select x from foo;', title="testquery") + execute_query(q.id, 'cc@epantry.com') + + output = StringIO() + output.write('a,b,c\r\n1,2,3\r\n') + + self.assertEqual(len(mail.outbox), 2) +~~ self.assertIn('[SQL Explorer] Error ', mail.outbox[1].subject) + self.assertEqual(mocked_upload.call_count, 0) + + @patch('explorer.tasks.s3_upload') + def test_snapshots(self, mocked_upload): + mocked_upload.return_value = 'http://s3.com/your-file.csv' + + SimpleQueryFactory(snapshot=True) + SimpleQueryFactory(snapshot=True) + SimpleQueryFactory(snapshot=True) + SimpleQueryFactory(snapshot=False) + + snapshot_queries() + self.assertEqual(mocked_upload.call_count, 3) + + def test_truncating_querylogs(self): + QueryLog(sql='foo').save() + QueryLog.objects.filter(sql='foo').update(run_at=datetime.now() - timedelta(days=30)) + QueryLog(sql='bar').save() + QueryLog.objects.filter(sql='bar').update(run_at=datetime.now() - timedelta(days=29)) + truncate_querylogs(30) + self.assertEqual(QueryLog.objects.count(), 1) + + @patch('explorer.schema.build_schema_info') + def test_build_schema_cache_async(self, mocked_build): + + +## ... source file continues with no further mail examples... + +``` + diff --git a/content/pages/examples/django/django-core-management.markdown b/content/pages/examples/django/django-core-management.markdown new file mode 100644 index 000000000..2f6a72bf9 --- /dev/null +++ b/content/pages/examples/django/django-core-management.markdown @@ -0,0 +1,568 @@ +title: django.core management code examples +category: page +slug: django-core-management-examples +sortorder: 500011082 +toc: False +sidebartitle: django.core management +meta: Python example code for the management function from the django.core module of the Django project. + + +management is a function within the django.core module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / tests / test_management.py**](https://github.com/divio/django-cms/blob/develop/cms/tests/test_management.py) + +```python +# test_management.py +from __future__ import unicode_literals +import uuid +from cms.test_utils.project.sampleapp.cms_apps import SampleApp +from cms.test_utils.util.context_managers import apphooks + +from six.moves import StringIO + +from django.conf import settings +from django.contrib.sites.models import Site +~~from django.core import management +from django.core.management import CommandError +from django.test.utils import override_settings + +from cms.api import create_page, add_plugin, create_title +from cms.management.commands.subcommands.list import plugin_report +from cms.models import Page, StaticPlaceholder +from cms.models.placeholdermodel import Placeholder +from cms.models.pluginmodel import CMSPlugin +from cms.test_utils.fixtures.navextenders import NavextendersFixture +from cms.test_utils.testcases import CMSTestCase +from djangocms_text_ckeditor.cms_plugins import TextPlugin + + +APPHOOK = "SampleApp" +PLUGIN = "TextPlugin" + +TEST_INSTALLED_APPS = [ + "django.contrib.auth", + "cms", + "menus", + "sekizai", + "treebeard", +] + settings.PLUGIN_APPS +if settings.AUTH_USER_MODEL == "emailuserapp.EmailUser": + TEST_INSTALLED_APPS.append("cms.test_utils.project.emailuserapp") +if settings.AUTH_USER_MODEL == "customuserapp.User": + TEST_INSTALLED_APPS.append("cms.test_utils.project.customuserapp") + + +class ManagementTestCase(CMSTestCase): + @override_settings(INSTALLED_APPS=TEST_INSTALLED_APPS) + def test_list_apphooks(self): + with apphooks(SampleApp): + out = StringIO() + create_page('Hello Title', "nav_playground.html", "en", apphook=APPHOOK) + self.assertEqual(Page.objects.filter(application_urls=APPHOOK).count(), 1) +~~ management.call_command( + "cms", + "list", + "apphooks", + interactive=False, + stdout=out, + ) + self.assertEqual(out.getvalue(), "SampleApp (draft)\n") + + def test_uninstall_apphooks_without_apphook(self): + with apphooks(): + out = StringIO() +~~ management.call_command( + "cms", + "uninstall", + "apphooks", + APPHOOK, + interactive=False, + stdout=out, + ) + self.assertEqual(out.getvalue(), "no 'SampleApp' apphooks found\n") + + def test_fix_tree(self): + create_page("home", "nav_playground.html", "en") + page1 = create_page("page", "nav_playground.html", "en") + page1.node.depth = 3 + page1.node.numchild = 4 + page1.node.path = "00100010" + page1.node.save() + out = StringIO() +~~ management.call_command('cms', 'fix-tree', interactive=False, stdout=out) + self.assertEqual(out.getvalue(), 'fixing page tree\nfixing plugin tree\nall done\n') + page1 = page1.reload() + self.assertEqual(page1.node.path, "0002") + self.assertEqual(page1.node.depth, 1) + self.assertEqual(page1.node.numchild, 0) + + def test_fix_tree_regression_5641(self): + alpha = create_page("Alpha", "nav_playground.html", "en", published=True) + beta = create_page("Beta", "nav_playground.html", "en", published=False) + gamma = create_page("Gamma", "nav_playground.html", "en", published=False) + delta = create_page("Delta", "nav_playground.html", "en", published=True) + theta = create_page("Theta", "nav_playground.html", "en", published=True) + + beta.move_page(alpha.node, position='last-child') + gamma.move_page(beta.node, position='last-child') + delta.move_page(gamma.node, position='last-child') + theta.move_page(delta.node, position='last-child') + + out = StringIO() +~~ management.call_command('cms', 'fix-tree', interactive=False, stdout=out) + + tree = [ + (alpha, '0001'), + (beta, '00010001'), + (gamma, '000100010001'), + (delta, '0001000100010001'), + (theta, '00010001000100010001'), + ] + + for page, path in tree: + self.assertEqual(page.node.path, path) + + @override_settings(INSTALLED_APPS=TEST_INSTALLED_APPS) + def test_uninstall_apphooks_with_apphook(self): + with apphooks(SampleApp): + out = StringIO() + create_page('Hello Title', "nav_playground.html", "en", apphook=APPHOOK) + self.assertEqual(Page.objects.filter(application_urls=APPHOOK).count(), 1) +~~ management.call_command( + "cms", + "uninstall", + "apphooks", + APPHOOK, + interactive=False, + stdout=out, + ) + self.assertEqual(out.getvalue(), "1 'SampleApp' apphooks uninstalled\n") + self.assertEqual(Page.objects.filter(application_urls=APPHOOK).count(), 0) + + @override_settings(INSTALLED_APPS=TEST_INSTALLED_APPS) + def test_list_plugins(self): + out = StringIO() + placeholder = Placeholder.objects.create(slot="test") + add_plugin(placeholder, TextPlugin, "en", body="en body") + add_plugin(placeholder, TextPlugin, "en", body="en body") + link_plugin = add_plugin(placeholder, "LinkPlugin", "en", + name="A Link", external_link="https://www.django-cms.org") + self.assertEqual( + CMSPlugin.objects.filter(plugin_type=PLUGIN).count(), + 2) + self.assertEqual( + CMSPlugin.objects.filter(plugin_type="LinkPlugin").count(), + 1) + + instanceless_plugin = CMSPlugin(language="en", plugin_type="TextPlugin") + instanceless_plugin.save() + + bogus_plugin = CMSPlugin(language="en", plugin_type="BogusPlugin") + bogus_plugin.save() + +~~ management.call_command('cms', 'list', 'plugins', interactive=False, stdout=out) + report = plugin_report() + + self.assertEqual( + len(report), + 3) + + bogus_plugins_report = report[0] + self.assertEqual( + bogus_plugins_report["model"], + None) + + self.assertEqual( + bogus_plugins_report["type"], + u'BogusPlugin') + + self.assertEqual( + bogus_plugins_report["instances"][0], + bogus_plugin) + + link_plugins_report = report[1] + self.assertEqual( + link_plugins_report["model"], + link_plugin.__class__) + + + +## ... source file abbreviated to get to management examples ... + + + bogus_plugins_report = report[0] + self.assertEqual( + len(bogus_plugins_report["instances"]), + 1) + + link_plugins_report = report[1] + self.assertEqual( + len(link_plugins_report["instances"]), + 1) + + text_plugins_report = report[2] + self.assertEqual( + len(text_plugins_report["instances"]), + 3) + + self.assertEqual( + len(text_plugins_report["unsaved_instances"]), + 1) + + out = StringIO() +~~ management.call_command('cms', 'delete-orphaned-plugins', interactive=False, stdout=out) + report = plugin_report() + + self.assertEqual( + len(report), + 2) + + link_plugins_report = report[0] + self.assertEqual( + len(link_plugins_report["instances"]), + 1) + + text_plugins_report = report[1] + self.assertEqual( + len(text_plugins_report["instances"]), + 2) + + self.assertEqual( + len(text_plugins_report["unsaved_instances"]), + 0) + + def test_uninstall_plugins_without_plugin(self): + out = StringIO() +~~ management.call_command('cms', 'uninstall', 'plugins', PLUGIN, interactive=False, stdout=out) + self.assertEqual(out.getvalue(), "no 'TextPlugin' plugins found\n") + + @override_settings(INSTALLED_APPS=TEST_INSTALLED_APPS) + def test_uninstall_plugins_with_plugin(self): + out = StringIO() + placeholder = Placeholder.objects.create(slot="test") + add_plugin(placeholder, TextPlugin, "en", body="en body") + self.assertEqual(CMSPlugin.objects.filter(plugin_type=PLUGIN).count(), 1) +~~ management.call_command('cms', 'uninstall', 'plugins', PLUGIN, interactive=False, stdout=out) + self.assertEqual(out.getvalue(), "1 'TextPlugin' plugins uninstalled\n") + self.assertEqual(CMSPlugin.objects.filter(plugin_type=PLUGIN).count(), 0) + + def test_publisher_public(self): + admin = self.get_superuser() + create_page( + 'home', + published=True, + language='de', + template='nav_playground.html', + created_by=admin, + ) + page_1 = create_page( + 'página 1', + published=True, + language='de', + template='nav_playground.html', + created_by=admin, + ) + page_1.unpublish('de') + + page_2 = create_page( + 'página 2', + published=True, + language='de', + template='nav_playground.html', + created_by=admin, + ) + page_2.unpublish('de') + +~~ management.call_command( + 'cms', + 'publisher-publish', + '-l de', + '--unpublished', + interactive=False, + ) + + self.assertEqual(Page.objects.public().count(), 3) + + +class PageFixtureManagementTestCase(NavextendersFixture, CMSTestCase): + + def _fill_page_body(self, page, lang): + ph_en = page.placeholders.get(slot="body") + mcol1 = add_plugin(ph_en, "MultiColumnPlugin", lang, position="first-child") + add_plugin(ph_en, "ColumnPlugin", lang, position="first-child", target=mcol1) + col2 = add_plugin(ph_en, "ColumnPlugin", lang, position="first-child", target=mcol1) + mcol2 = add_plugin(ph_en, "MultiColumnPlugin", lang, position="first-child", target=col2) + add_plugin(ph_en, "ColumnPlugin", lang, position="first-child", target=mcol2) + col4 = add_plugin(ph_en, "ColumnPlugin", lang, position="first-child", target=mcol2) + add_plugin(ph_en, "LinkPlugin", lang, target=col4, + name="A Link", external_link="https://www.django-cms.org") + static_placeholder = StaticPlaceholder(code=str(uuid.uuid4()), site_id=1) + static_placeholder.save() + add_plugin(static_placeholder.draft, "TextPlugin", lang, body="example content") + + def setUp(self): + pages = Page.objects.drafts() + for page in pages: + self._fill_page_body(page, "en") + + def test_copy_langs(self): + site = 1 + number_start_plugins = CMSPlugin.objects.all().count() + + out = StringIO() +~~ management.call_command( + 'cms', 'copy', 'lang', '--from-lang=en', '--to-lang=de', interactive=False, stdout=out + ) + pages = Page.objects.on_site(site).drafts() + for page in pages: + self.assertEqual(set((u'en', u'de')), set(page.get_languages())) + self.assertEqual(CMSPlugin.objects.all().count(), number_start_plugins*2) + self.assertEqual(CMSPlugin.objects.filter(language='en').count(), number_start_plugins) + self.assertEqual(CMSPlugin.objects.filter(language='de').count(), number_start_plugins) + + root_page = Page.objects.get_home(site) + root_plugins = CMSPlugin.objects.filter(placeholder=root_page.placeholders.get(slot="body")) + + first_plugin_en, _ = root_plugins.get(language='en', parent=None).get_plugin_instance() + first_plugin_de, _ = root_plugins.get(language='de', parent=None).get_plugin_instance() + + self.assertEqual(first_plugin_en.plugin_type, first_plugin_de.plugin_type) + + link_en, _ = root_plugins.get(language='en', plugin_type='LinkPlugin').get_plugin_instance() + link_de, _ = root_plugins.get(language='de', plugin_type='LinkPlugin').get_plugin_instance() + + self.assertEqual(link_en.external_link, link_de.external_link) + self.assertEqual(link_en.get_position_in_placeholder(), link_de.get_position_in_placeholder()) + + stack_plugins = CMSPlugin.objects.filter(placeholder=StaticPlaceholder.objects.order_by('?')[0].draft) + + stack_text_en, _ = stack_plugins.get(language='en', plugin_type='TextPlugin').get_plugin_instance() + stack_text_de, _ = stack_plugins.get(language='de', plugin_type='TextPlugin').get_plugin_instance() + + self.assertEqual(stack_text_en.plugin_type, stack_text_de.plugin_type) + self.assertEqual(stack_text_en.body, stack_text_de.body) + + def test_copy_langs_no_content(self): + site = 1 + number_start_plugins = CMSPlugin.objects.all().count() + + out = StringIO() +~~ management.call_command( + 'cms', 'copy', 'lang', '--from-lang=en', '--to-lang=de', '--skip-content', + interactive=False, stdout=out + ) + pages = Page.objects.on_site(site).drafts() + for page in pages: + self.assertEqual(set((u'en', u'de')), set(page.get_languages())) + self.assertEqual(CMSPlugin.objects.all().count(), number_start_plugins) + self.assertEqual(CMSPlugin.objects.filter(language='en').count(), number_start_plugins) + self.assertEqual(CMSPlugin.objects.filter(language='de').count(), 0) + + root_page = Page.objects.get_home(site) + root_plugins = CMSPlugin.objects.filter( + placeholder=root_page.placeholders.get(slot="body")) + + first_plugin_en, _ = root_plugins.get(language='en', parent=None).get_plugin_instance() + first_plugin_de = None + with self.assertRaises(CMSPlugin.DoesNotExist): + first_plugin_de, _ = root_plugins.get(language='de', parent=None).get_plugin_instance() + + self.assertIsNone(first_plugin_de) + + stack_plugins = CMSPlugin.objects.filter( + placeholder=StaticPlaceholder.objects.order_by('?')[0].draft) + + stack_text_en, _ = stack_plugins.get(language='en', + plugin_type='TextPlugin').get_plugin_instance() + with self.assertRaises(CMSPlugin.DoesNotExist): + stack_text_de, _ = stack_plugins.get(language='de', + plugin_type='TextPlugin').get_plugin_instance() + + def test_copy_sites(self): + site_1_pk = 1 + site_1 = Site.objects.get(pk=site_1_pk) + site_2 = Site.objects.create(name='site 2') + site_2_pk = site_2.pk + phs = [] + for page in Page.objects.on_site(site_1_pk).drafts(): + phs.extend(page.placeholders.values_list('pk', flat=True)) + number_start_plugins = CMSPlugin.objects.filter(placeholder__in=phs).count() + + out = StringIO() +~~ management.call_command( + 'cms', 'copy', 'site', '--from-site=%s' % site_1_pk, '--to-site=%s' % site_2_pk, + stdout=out + ) + for page in Page.objects.on_site(site_1_pk).drafts(): + page.publish('en') + for page in Page.objects.on_site(site_2_pk).drafts(): + page.publish('en') + + pages_1 = list(Page.objects.drafts().on_site(site_1).select_related('node').order_by('node__path')) + pages_2 = list(Page.objects.drafts().on_site(site_2).select_related('node').order_by('node__path')) + for index, page in enumerate(pages_1): + self.assertEqual(page.get_title('en'), pages_2[index].get_title('en')) + self.assertEqual(page.node.depth, pages_2[index].node.depth) + + phs_1 = [] + phs_2 = [] + for page in Page.objects.on_site(site_1_pk).drafts(): + phs_1.extend(page.placeholders.values_list('pk', flat=True)) + for page in Page.objects.on_site(site_2_pk).drafts(): + phs_2.extend(page.placeholders.values_list('pk', flat=True)) + + self.assertEqual(CMSPlugin.objects.filter(placeholder__in=phs_1).count(), number_start_plugins) + self.assertEqual(CMSPlugin.objects.filter(placeholder__in=phs_2).count(), number_start_plugins) + + + +## ... source file abbreviated to get to management examples ... + + + + first_plugin_1, _ = root_plugins_1.get(language='en', parent=None).get_plugin_instance() + first_plugin_2, _ = root_plugins_2.get(language='en', parent=None).get_plugin_instance() + + self.assertEqual(first_plugin_1.plugin_type, first_plugin_2.plugin_type) + + link_1, _ = root_plugins_1.get(language='en', plugin_type='LinkPlugin').get_plugin_instance() + link_2, _ = root_plugins_2.get(language='en', plugin_type='LinkPlugin').get_plugin_instance() + + self.assertEqual(link_1.external_link, link_2.external_link) + self.assertEqual(link_1.get_position_in_placeholder(), link_2.get_position_in_placeholder()) + + def test_copy_existing_title(self): + site = 1 + number_start_plugins = CMSPlugin.objects.all().count() + + root_page = Page.objects.get_home(site) + create_title("de", "root page de", root_page) + + out = StringIO() +~~ management.call_command( + 'cms', 'copy', 'lang', '--from-lang=en', '--to-lang=de', interactive=False, stdout=out + ) + pages = Page.objects.on_site(site).drafts() + for page in pages: + self.assertEqual(set((u'en', u'de')), set(page.get_languages())) + + self.assertEqual("root page de", Page.objects.get_home(site).get_title("de")) + + self.assertEqual(CMSPlugin.objects.all().count(), number_start_plugins*2) + self.assertEqual(CMSPlugin.objects.filter(language='en').count(), number_start_plugins) + self.assertEqual(CMSPlugin.objects.filter(language='de').count(), number_start_plugins) + + def test_copy_filled_placeholder(self): + site = 1 + number_start_plugins = CMSPlugin.objects.all().count() + + root_page = Page.objects.get_home(site) + create_title("de", "root page de", root_page) + ph = root_page.placeholders.get(slot="body") + add_plugin(ph, "TextPlugin", "de", body="Hello World") + + out = StringIO() +~~ management.call_command( + 'cms', 'copy', 'lang', '--from-lang=en', '--to-lang=de', interactive=False, stdout=out + ) + + self.assertEqual(CMSPlugin.objects.filter(language='en').count(), number_start_plugins) + self.assertEqual(CMSPlugin.objects.filter(language='de').count(), number_start_plugins-6) + + def test_copy_filled_placeholder_force_copy(self): + site = 1 + number_start_plugins = CMSPlugin.objects.all().count() + + root_page = Page.objects.get_home(site) + create_title("de", "root page de", root_page) + ph = root_page.placeholders.get(slot="body") + add_plugin(ph, "TextPlugin", "de", body="Hello World") + + root_plugins = CMSPlugin.objects.filter(placeholder=ph) + text_de_orig, _ = root_plugins.get(language='de', plugin_type='TextPlugin').get_plugin_instance() + + out = StringIO() +~~ management.call_command( + 'cms', 'copy', 'lang', '--from-lang=en', '--to-lang=de', '--force', interactive=False, + stdout=out + ) + + CMSPlugin.objects.filter(placeholder=root_page.placeholders.get(slot="body")) + + self.assertEqual(CMSPlugin.objects.filter(language='en').count(), number_start_plugins) + self.assertEqual(CMSPlugin.objects.filter(language='de').count(), number_start_plugins+1) + + def test_copy_from_non_existing_lang(self): + site = 1 + out = StringIO() +~~ management.call_command( + 'cms', 'copy', 'lang', '--from-lang=de', '--to-lang=fr', verbosity=3, + interactive=False, stdout=out + ) + text = out.getvalue() + page_count = Page.objects.on_site(site).drafts().count() + 1 + for idx in range(1, page_count): + self.assertTrue("Skipping page page%d, language de not defined" % idx in text) + + def test_copy_site_safe(self): + site_other = 1 + site_active = 2 + origina_site1_langs = {} + + number_start_plugins = CMSPlugin.objects.all().count() + site_obj = Site.objects.create(domain="sample2.com", name="sample2.com", pk=site_active) + + for page in Page.objects.on_site(1).drafts(): + origina_site1_langs[page.pk] = set(page.get_languages()) + + p1 = create_page('page1', published=True, in_navigation=True, language='de', template='nav_playground.html', site=site_obj) + create_page('page4', published=True, in_navigation=True, language='de', template='nav_playground.html', site=site_obj) + create_page('page2', published=True, in_navigation=True, parent=p1, language='de', template='nav_playground.html', site=site_obj) + + for page in Page.objects.on_site(site_active).drafts(): + self._fill_page_body(page, 'de') + + number_site2_plugins = CMSPlugin.objects.all().count() - number_start_plugins + + out = StringIO() +~~ management.call_command( + 'cms', 'copy', 'lang', '--from-lang=de', '--to-lang=fr', '--site=%s' % site_active, + interactive=False, stdout=out + ) + + for page in Page.objects.on_site(site_other).drafts(): + self.assertEqual(origina_site1_langs[page.pk], set(page.get_languages())) + + for page in Page.objects.on_site(site_active).drafts(): + self.assertEqual(set(('de', 'fr')), set(page.get_languages())) + + self.assertEqual(CMSPlugin.objects.filter(language='en').count(), number_start_plugins) + self.assertEqual(CMSPlugin.objects.filter(language='de').count(), number_site2_plugins) + self.assertEqual(CMSPlugin.objects.filter(language='fr').count(), number_site2_plugins) + self.assertEqual(CMSPlugin.objects.all().count(), number_start_plugins + number_site2_plugins*2) + + def test_copy_bad_languages(self): + out = StringIO() + with self.assertRaises(CommandError) as command_error: +~~ management.call_command( + 'cms', 'copy', 'lang', '--from-lang=it', '--to-lang=fr', interactive=False, + stdout=out + ) + + self.assertEqual(str(command_error.exception), 'Both languages have to be present in settings.LANGUAGES and settings.CMS_LANGUAGES') + + + +## ... source file continues with no further management examples... + +``` + diff --git a/content/pages/examples/django/django-core-serializers.markdown b/content/pages/examples/django/django-core-serializers.markdown new file mode 100644 index 000000000..e6d03713a --- /dev/null +++ b/content/pages/examples/django/django-core-serializers.markdown @@ -0,0 +1,111 @@ +title: django.core serializers code examples +category: page +slug: django-core-serializers-examples +sortorder: 500011083 +toc: False +sidebartitle: django.core serializers +meta: Python example code for the serializers function from the django.core module of the Django project. + + +serializers is a function within the django.core module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / views / crud.py**](https://github.com/jrief/django-angular/blob/master/djng/views/crud.py) + +```python +# crud.py +import json + +from django.core.exceptions import ValidationError +~~from django.core import serializers +from django.forms.models import modelform_factory +from django.views.generic import FormView + +from djng.views.mixins import JSONBaseMixin, JSONResponseException + + +class NgMissingParameterError(ValueError): + pass + + +class NgCRUDView(JSONBaseMixin, FormView): + model = None + fields = None + form_class = None + slug_field = 'slug' + serializer_name = 'python' + serialize_natural_keys = False + + allowed_methods = ['GET', 'POST', 'DELETE'] + exclude_methods = [] + + def get_allowed_methods(self): + return [method for method in self.allowed_methods if method not in self.exclude_methods] + + + +## ... source file abbreviated to get to serializers examples ... + + + def get_form_class(self): + return self.form_class or modelform_factory(self.model, exclude=[]) + + def build_json_response(self, data, **kwargs): + return self.json_response(self.serialize_queryset(data), separators=(',', ':'), **kwargs) + + def error_json_response(self, message, status_code=400, detail=None): + response_data = { + "message": message, + "detail": detail, + } + return self.json_response(response_data, status=status_code, separators=(',', ':')) + + def serialize_queryset(self, queryset): + object_data = [] + is_queryset = False + query_fields = self.get_fields() + try: + iter(queryset) + is_queryset = True +~~ raw_data = serializers.serialize(self.serializer_name, queryset, fields=query_fields, + use_natural_keys=self.serialize_natural_keys) + except TypeError: # Not iterable +~~ raw_data = serializers.serialize(self.serializer_name, [queryset, ], fields=query_fields, + use_natural_keys=self.serialize_natural_keys) + + for obj in raw_data: # Add pk to fields + obj['fields']['pk'] = obj['pk'] + object_data.append(obj['fields']) + + if is_queryset: + return object_data + return object_data[0] # If there's only one object + + def get_form_kwargs(self): + kwargs = super(NgCRUDView, self).get_form_kwargs() + kwargs['data'] = json.loads(self.request.body.decode('utf-8')) + + if 'pk' in self.request.GET or self.slug_field in self.request.GET: + kwargs['instance'] = self.get_object() + return kwargs + + def get_object(self): + if 'pk' in self.request.GET: + return self.model.objects.get(pk=self.request.GET['pk']) + elif self.slug_field in self.request.GET: + return self.model.objects.get(**{self.slug_field: self.request.GET[self.slug_field]}) + raise NgMissingParameterError( + + +## ... source file continues with no further serializers examples... + +``` + diff --git a/content/pages/examples/django/django-core-signals.markdown b/content/pages/examples/django/django-core-signals.markdown new file mode 100644 index 000000000..409f32a45 --- /dev/null +++ b/content/pages/examples/django/django-core-signals.markdown @@ -0,0 +1,164 @@ +title: django.core signals code examples +category: page +slug: django-core-signals-examples +sortorder: 500011084 +toc: False +sidebartitle: django.core signals +meta: Python example code for the signals function from the django.core module of the Django project. + + +signals is a function within the django.core module of the Django project. + + +## Example 1 from django-webtest +[django-webtest](https://github.com/django-webtest/django-webtest) +([PyPI package information](https://pypi.org/project/django-webtest/)) +is a [Django](/django.html) extension that makes it easier to use +[WebTest](http://docs.pylonsproject.org/projects/webtest/) with +your projects. + +The project is open sourced under the +[MIT license](https://github.com/django-webtest/django-webtest/blob/master/LICENSE.txt). + +[**django-webtest / django_webtest / __init__.py**](https://github.com/django-webtest/django-webtest/blob/master/django_webtest/./__init__.py) + +```python +# __init__.py +import copy + +from django.conf import settings +from django.test.signals import template_rendered +from django.core.handlers.wsgi import WSGIHandler +from django.test import TestCase, TransactionTestCase +from django.test.client import store_rendered_templates + +from functools import partial + +try: + from importlib import import_module +except ImportError: + from django.utils.importlib import import_module + +~~from django.core import signals +try: + from django.db import close_old_connections +except ImportError: + from django.db import close_connection + close_old_connections = None +try: + from django.core.servers.basehttp import ( + AdminMediaHandler as StaticFilesHandler) +except ImportError: + from django.contrib.staticfiles.handlers import StaticFilesHandler + +from webtest import TestApp +try: + from webtest.utils import NoDefault +except ImportError: + NoDefault = '' + +from django_webtest.response import DjangoWebtestResponse +from django_webtest.compat import to_string, to_wsgi_safe_string + + +_notgiven = object() + + + + +## ... source file abbreviated to get to signals examples ... + + + def set_user(self, user): + if user is None and 'WEBTEST_USER' in self.extra_environ: + del self.extra_environ['WEBTEST_USER'] + if user is not None: + self.extra_environ = self._update_environ(self.extra_environ, user) + + def _update_environ(self, environ, user=_notgiven): + environ = environ or {} + + if user is not _notgiven: + if user is None: + environ['WEBTEST_USER'] = '' + else: + username = _get_username(user) + environ['WEBTEST_USER'] = to_wsgi_safe_string(username) + + return environ + + def do_request(self, req, status, expect_errors): + if close_old_connections is not None: # Django 1.6+ +~~ signals.request_started.disconnect(close_old_connections) +~~ signals.request_finished.disconnect(close_old_connections) + else: # Django < 1.6 +~~ signals.request_finished.disconnect(close_connection) + + try: + req.environ.setdefault('REMOTE_ADDR', '127.0.0.1') + + req.environ['REMOTE_ADDR'] = to_string(req.environ['REMOTE_ADDR']) + req.environ['PATH_INFO'] = to_string(req.environ['PATH_INFO']) + + data = {} + on_template_render = partial(store_rendered_templates, data) + template_rendered.connect(on_template_render) + + response = super(DjangoTestApp, self).do_request(req, status, + expect_errors) + + def flattend(detail): + if len(data[detail]) == 1: + return data[detail][0] + return data[detail] + + response.context = None + response.template = None + response.templates = data.get('templates', None) + + if data.get('context'): + response.context = flattend('context') + + if data.get('template'): + response.template = flattend('template') + elif data.get('templates'): + response.template = flattend('templates') + + response.__class__ = self.response_class + return response + finally: + if close_old_connections: # Django 1.6+ +~~ signals.request_started.connect(close_old_connections) +~~ signals.request_finished.connect(close_old_connections) + else: # Django < 1.6 +~~ signals.request_finished.connect(close_connection) + + def get(self, url, *args, **kwargs): + extra_environ = kwargs.get('extra_environ') + user = kwargs.pop('user', _notgiven) + auto_follow = kwargs.pop('auto_follow', False) + + kwargs['extra_environ'] = self._update_environ(extra_environ, user) + response = super(DjangoTestApp, self).get(url, *args, **kwargs) + + def is_redirect(r): + return r.status_int >= 300 and r.status_int < 400 + while auto_follow and is_redirect(response): + response = response.follow(**kwargs) + + return response + + def post(self, url, *args, **kwargs): + extra_environ = kwargs.get('extra_environ') + user = kwargs.pop('user', _notgiven) + kwargs['extra_environ'] = self._update_environ(extra_environ, user) + return super(DjangoTestApp, self).post(url, *args, **kwargs) + + def put(self, url, *args, **kwargs): + extra_environ = kwargs.get('extra_environ') + + +## ... source file continues with no further signals examples... + +``` + diff --git a/content/pages/examples/django/django-core-signing.markdown b/content/pages/examples/django/django-core-signing.markdown new file mode 100644 index 000000000..3d3050903 --- /dev/null +++ b/content/pages/examples/django/django-core-signing.markdown @@ -0,0 +1,310 @@ +title: django.core signing code examples +category: page +slug: django-core-signing-examples +sortorder: 500011085 +toc: False +sidebartitle: django.core signing +meta: Python example code for the signing function from the django.core module of the Django project. + + +signing is a function within the django.core module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / models.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/models.py) + +```python +# models.py +from __future__ import unicode_literals + +import datetime + +~~from django.core import signing +from django.db import models, transaction +from django.utils import timezone +from django.utils.crypto import get_random_string +from django.utils.translation import gettext_lazy as _ + +from .. import app_settings as allauth_app_settings +from . import app_settings, signals +from .adapter import get_adapter +from .managers import EmailAddressManager, EmailConfirmationManager +from .utils import user_email + + +class EmailAddress(models.Model): + + user = models.ForeignKey(allauth_app_settings.USER_MODEL, + verbose_name=_('user'), + on_delete=models.CASCADE) + email = models.EmailField(unique=app_settings.UNIQUE_EMAIL, + max_length=app_settings.EMAIL_MAX_LENGTH, + verbose_name=_('e-mail address')) + verified = models.BooleanField(verbose_name=_('verified'), default=False) + primary = models.BooleanField(verbose_name=_('primary'), default=False) + + objects = EmailAddressManager() + + +## ... source file abbreviated to get to signing examples ... + + + email_address=email_address) + return email_address + + def send(self, request=None, signup=False): + get_adapter(request).send_confirmation_mail(request, self, signup) + self.sent = timezone.now() + self.save() + signals.email_confirmation_sent.send(sender=self.__class__, + request=request, + confirmation=self, + signup=signup) + + +class EmailConfirmationHMAC: + + def __init__(self, email_address): + self.email_address = email_address + + @property + def key(self): +~~ return signing.dumps( + obj=self.email_address.pk, + salt=app_settings.SALT) + + @classmethod + def from_key(cls, key): + try: + max_age = ( + 60 * 60 * 24 * app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS) +~~ pk = signing.loads( + key, + max_age=max_age, + salt=app_settings.SALT) + ret = EmailConfirmationHMAC(EmailAddress.objects.get(pk=pk)) + except (signing.SignatureExpired, +~~ signing.BadSignature, + EmailAddress.DoesNotExist): + ret = None + return ret + + def confirm(self, request): + if not self.email_address.verified: + email_address = self.email_address + get_adapter(request).confirm_email(request, email_address) + signals.email_confirmed.send(sender=self.__class__, + request=request, + email_address=email_address) + return email_address + + def send(self, request=None, signup=False): + get_adapter(request).send_confirmation_mail(request, self, signup) + signals.email_confirmation_sent.send(sender=self.__class__, + request=request, + confirmation=self, + signup=signup) + + + +## ... source file continues with no further signing examples... + +``` + + +## Example 2 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / fields.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/fields.py) + +```python +# fields.py +import re +import mimetypes + +from django.conf import settings +from django.contrib.staticfiles.storage import staticfiles_storage +~~from django.core import signing +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.files.storage import default_storage +from django.core.files.uploadedfile import InMemoryUploadedFile, TemporaryUploadedFile +from django.urls import reverse_lazy +from django.forms import fields, models as model_fields, widgets +from django.utils.html import format_html +from django.utils.module_loading import import_string +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext_lazy as _, ungettext_lazy + +from djng import app_settings +from .widgets import DropFileWidget, DropImageWidget + + +class DefaultFieldMixin(object): + render_label = True + + def has_subwidgets(self): + return False + + def get_potential_errors(self): + return self.get_input_required_errors() + + def get_input_required_errors(self): + + +## ... source file abbreviated to get to signing examples ... + + + pass + + +class TypedMultipleChoiceField(MultipleFieldMixin, fields.TypedMultipleChoiceField): + pass + + +class UUIDField(DefaultFieldMixin, fields.UUIDField): + def get_potential_errors(self): + errors = self.get_input_required_errors() + errors.extend(self.get_min_max_length_errors()) + return errors + + +class FileFieldMixin(DefaultFieldMixin): + def to_python(self, value): + try: + current_file = None + if ':' in value['current_file']: + current_file = self.signer.unsign(value['current_file']) +~~ except signing.BadSignature: + raise ValidationError("Got bogus upstream data") + except (KeyError, TypeError): + pass + + try: + obj = '' + if ':' in value['temp_name']: + temp_name = self.signer.unsign(value['temp_name']) + temp_file = self.storage.open(temp_name, 'rb') + file_size = self.storage.size(temp_name) + if file_size < settings.FILE_UPLOAD_MAX_MEMORY_SIZE: + obj = InMemoryUploadedFile( + file=temp_file, + field_name=None, + name=value['file_name'], + charset=value['charset'], + content_type=value['content_type'], + content_type_extra=value['content_type_extra'], + size=file_size, + ) + else: + obj = TemporaryUploadedFile( + value['file_name'], + value['content_type'], + 0, + value['charset'], + content_type_extra=value['content_type_extra'], + ) + while True: + chunk = temp_file.read(0x10000) + if not chunk: + break + obj.file.write(chunk) + obj.file.seek(0) + obj.file.size = file_size + self.storage.delete(temp_name) + self.remove_current(current_file) + elif value['temp_name'] == 'delete': + self.remove_current(current_file) +~~ except signing.BadSignature: + raise ValidationError("Got bogus upstream data") + except (IOError, KeyError, TypeError): + obj = current_file + except Exception as excp: + raise ValidationError("File upload failed. {}: {}".format(excp.__class__.__name__, excp)) + return obj + + def remove_current(self, filename): + if filename: + default_storage.delete(filename) + + +class FileField(FileFieldMixin, fields.FileField): + storage = app_settings.upload_storage +~~ signer = signing.Signer() + + def __init__(self, *args, **kwargs): + accept = kwargs.pop('accept', '*/*') + fileupload_url = kwargs.pop('fileupload_url', reverse_lazy('fileupload')) + area_label = kwargs.pop('area_label', _("Drop file here or click to upload")) + attrs = { + 'accept': accept, + 'ngf-pattern': accept, + } + kwargs.update(widget=DropFileWidget(area_label, fileupload_url, attrs=attrs)) + super(FileField, self).__init__(*args, **kwargs) + + @classmethod + def preview(cls, file_obj): + available_name = cls.storage.get_available_name(file_obj.name) + temp_name = cls.storage.save(available_name, file_obj) + extension = mimetypes.guess_extension(file_obj.content_type) + if extension: + extension = extension[1:] + else: + extension = '_blank' + icon_url = staticfiles_storage.url('djng/icons/{}.png'.format(extension)) + return { + 'url': 'url({})'.format(icon_url), + 'temp_name': cls.signer.sign(temp_name), + 'file_name': file_obj.name, + 'file_size': file_obj.size, + 'charset': file_obj.charset, + 'content_type': file_obj.content_type, + 'content_type_extra': file_obj.content_type_extra, + } + + +class ImageField(FileFieldMixin, fields.ImageField): + storage = app_settings.upload_storage +~~ signer = signing.Signer() + + def __init__(self, *args, **kwargs): + if 'easy_thumbnails' not in settings.INSTALLED_APPS: + raise ImproperlyConfigured("'djng.forms.fields.ImageField' requires 'easy-thubnails' to be installed") + accept = kwargs.pop('accept', 'image/*') + fileupload_url = kwargs.pop('fileupload_url', reverse_lazy('fileupload')) + area_label = kwargs.pop('area_label', _("Drop image here or click to upload")) + attrs = { + 'accept': accept, + 'ngf-pattern': accept, + } + kwargs.update(widget=DropImageWidget(area_label, fileupload_url, attrs=attrs)) + super(ImageField, self).__init__(*args, **kwargs) + + def remove_current(self, image_name): + from easy_thumbnails.models import Source, Thumbnail + + try: + source = Source.objects.get(name=image_name) + for thumb in Thumbnail.objects.filter(source=source): + default_storage.delete(thumb.name) + thumb.delete() + source.delete() + except Source.DoesNotExist: + + +## ... source file continues with no further signing examples... + +``` + diff --git a/content/pages/examples/django/django-core-validators.markdown b/content/pages/examples/django/django-core-validators.markdown new file mode 100644 index 000000000..3d795e521 --- /dev/null +++ b/content/pages/examples/django/django-core-validators.markdown @@ -0,0 +1,436 @@ +title: django.core validators code examples +category: page +slug: django-core-validators-examples +sortorder: 500011086 +toc: False +sidebartitle: django.core validators +meta: Python example code for the validators function from the django.core module of the Django project. + + +validators is a function within the django.core module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / forms.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/forms.py) + +```python +# forms.py +from __future__ import absolute_import + +import warnings +from importlib import import_module + +from django import forms +from django.contrib.auth.tokens import PasswordResetTokenGenerator +from django.contrib.sites.shortcuts import get_current_site +~~from django.core import exceptions, validators +from django.urls import reverse +from django.utils.translation import gettext, gettext_lazy as _, pgettext + +from ..utils import ( + build_absolute_uri, + get_username_max_length, + set_form_field_order, +) +from . import app_settings +from .adapter import get_adapter +from .app_settings import AuthenticationMethod +from .models import EmailAddress +from .utils import ( + filter_users_by_email, + get_user_model, + perform_login, + setup_user_email, + sync_user_email_addresses, + url_str_to_user_pk, + user_email, + user_pk_to_url_str, + user_username, +) + + + +## ... source file abbreviated to get to validators examples ... + + + login = self.cleaned_data["login"] + if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: + credentials["email"] = login + elif ( + app_settings.AUTHENTICATION_METHOD == + AuthenticationMethod.USERNAME): + credentials["username"] = login + else: + if self._is_login_email(login): + credentials["email"] = login + credentials["username"] = login + credentials["password"] = self.cleaned_data["password"] + return credentials + + def clean_login(self): + login = self.cleaned_data['login'] + return login.strip() + + def _is_login_email(self, login): + try: +~~ validators.validate_email(login) + ret = True + except exceptions.ValidationError: + ret = False + return ret + + def clean(self): + super(LoginForm, self).clean() + if self._errors: + return + credentials = self.user_credentials() + user = get_adapter(self.request).authenticate( + self.request, + **credentials) + if user: + self.user = user + else: + auth_method = app_settings.AUTHENTICATION_METHOD + if auth_method == app_settings.AuthenticationMethod.USERNAME_EMAIL: + login = self.cleaned_data['login'] + if self._is_login_email(login): + auth_method = app_settings.AuthenticationMethod.EMAIL + else: + auth_method = app_settings.AuthenticationMethod.USERNAME + raise forms.ValidationError( + + +## ... source file abbreviated to get to validators examples ... + + +class BaseSignupForm(_base_signup_form_class()): + username = forms.CharField(label=_("Username"), + min_length=app_settings.USERNAME_MIN_LENGTH, + widget=forms.TextInput( + attrs={'placeholder': + _('Username'), + 'autofocus': 'autofocus'})) + email = forms.EmailField(widget=forms.TextInput( + attrs={'type': 'email', + 'placeholder': _('E-mail address')})) + + def __init__(self, *args, **kwargs): + email_required = kwargs.pop('email_required', + app_settings.EMAIL_REQUIRED) + self.username_required = kwargs.pop('username_required', + app_settings.USERNAME_REQUIRED) + super(BaseSignupForm, self).__init__(*args, **kwargs) + username_field = self.fields['username'] + username_field.max_length = get_username_max_length() + username_field.validators.append( +~~ validators.MaxLengthValidator(username_field.max_length)) + username_field.widget.attrs['maxlength'] = str( + username_field.max_length) + + default_field_order = [ + 'email', + 'email2', # ignored when not present + 'username', + 'password1', + 'password2' # ignored when not present + ] + if app_settings.SIGNUP_EMAIL_ENTER_TWICE: + self.fields["email2"] = forms.EmailField( + label=_("E-mail (again)"), + widget=forms.TextInput( + attrs={ + 'type': 'email', + 'placeholder': _('E-mail address confirmation') + } + ) + ) + if email_required: + self.fields['email'].label = gettext("E-mail") + self.fields['email'].required = True + else: + + +## ... source file continues with no further validators examples... + +``` + + +## Example 2 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / utils / field_mapping.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/utils/field_mapping.py) + +```python +# field_mapping.py +import inspect + +~~from django.core import validators +from django.db import models +from django.utils.text import capfirst + +from rest_framework.compat import postgres_fields +from rest_framework.validators import UniqueValidator + +NUMERIC_FIELD_TYPES = ( + models.IntegerField, models.FloatField, models.DecimalField, models.DurationField, +) + + +class ClassLookupDict: + def __init__(self, mapping): + self.mapping = mapping + + def __getitem__(self, key): + if hasattr(key, '_proxy_class'): + base_class = key._proxy_class + else: + base_class = key.__class__ + + for cls in inspect.getmro(base_class): + if cls in self.mapping: + return self.mapping[cls] + + +## ... source file abbreviated to get to validators examples ... + + + if isinstance(model_field, models.FilePathField): + kwargs['path'] = model_field.path + + if model_field.match is not None: + kwargs['match'] = model_field.match + + if model_field.recursive is not False: + kwargs['recursive'] = model_field.recursive + + if model_field.allow_files is not True: + kwargs['allow_files'] = model_field.allow_files + + if model_field.allow_folders is not False: + kwargs['allow_folders'] = model_field.allow_folders + + if model_field.choices: + kwargs['choices'] = model_field.choices + else: + max_value = next(( + validator.limit_value for validator in validator_kwarg +~~ if isinstance(validator, validators.MaxValueValidator) + ), None) + if max_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): + kwargs['max_value'] = max_value + validator_kwarg = [ + validator for validator in validator_kwarg +~~ if not isinstance(validator, validators.MaxValueValidator) + ] + + min_value = next(( + validator.limit_value for validator in validator_kwarg +~~ if isinstance(validator, validators.MinValueValidator) + ), None) + if min_value is not None and isinstance(model_field, NUMERIC_FIELD_TYPES): + kwargs['min_value'] = min_value + validator_kwarg = [ + validator for validator in validator_kwarg +~~ if not isinstance(validator, validators.MinValueValidator) + ] + + if isinstance(model_field, models.URLField): + validator_kwarg = [ + validator for validator in validator_kwarg +~~ if not isinstance(validator, validators.URLValidator) + ] + + if isinstance(model_field, models.EmailField): + validator_kwarg = [ + validator for validator in validator_kwarg +~~ if validator is not validators.validate_email + ] + + if isinstance(model_field, models.SlugField): + validator_kwarg = [ + validator for validator in validator_kwarg +~~ if validator is not validators.validate_slug + ] + + if isinstance(model_field, models.GenericIPAddressField): + validator_kwarg = [ + validator for validator in validator_kwarg +~~ if validator is not validators.validate_ipv46_address + ] + if isinstance(model_field, models.DecimalField): + validator_kwarg = [ + validator for validator in validator_kwarg +~~ if not isinstance(validator, validators.DecimalValidator) + ] + + max_length = getattr(model_field, 'max_length', None) + if max_length is not None and (isinstance(model_field, (models.CharField, models.TextField, models.FileField))): + kwargs['max_length'] = max_length + validator_kwarg = [ + validator for validator in validator_kwarg +~~ if not isinstance(validator, validators.MaxLengthValidator) + ] + + min_length = next(( + validator.limit_value for validator in validator_kwarg +~~ if isinstance(validator, validators.MinLengthValidator) + ), None) + if min_length is not None and isinstance(model_field, models.CharField): + kwargs['min_length'] = min_length + validator_kwarg = [ + validator for validator in validator_kwarg +~~ if not isinstance(validator, validators.MinLengthValidator) + ] + + if getattr(model_field, 'unique', False): + unique_error_message = model_field.error_messages.get('unique', None) + if unique_error_message: + unique_error_message = unique_error_message % { + 'model_name': model_field.model._meta.verbose_name, + 'field_label': model_field.verbose_name + } + validator = UniqueValidator( + queryset=model_field.model._default_manager, + message=unique_error_message) + validator_kwarg.append(validator) + + if validator_kwarg: + kwargs['validators'] = validator_kwarg + + return kwargs + + +def get_relation_kwargs(field_name, relation_info): + model_field, related_model, to_many, to_field, has_through_model, reverse = relation_info + kwargs = { + 'queryset': related_model._default_manager, + + +## ... source file continues with no further validators examples... + +``` + + +## Example 3 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms.py) + +```python +# forms.py + "UserUpdateForm", + "WikiSlugField", + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", + "TextInputPrepend", + "CreateForm", + "DeleteForm", + "PermissionsForm", + "DirFilterForm", + "SearchForm", +] + +from datetime import timedelta + +from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model +~~from django.core import validators +from django.core.validators import RegexValidator +from django.forms.widgets import HiddenInput +from django.shortcuts import get_object_or_404 +from django.urls import Resolver404, resolve +from django.utils import timezone +from django.utils.safestring import mark_safe +from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.plugins.base import PluginSettingsFormMixin +from wiki.editors import getEditor + +from .forms_account_handling import UserCreationForm, UserUpdateForm + +validate_slug_numbers = RegexValidator( + r"^[0-9]+$", + _("A 'slug' cannot consist solely of numbers."), + "invalid", + inverse_match=True, +) + + +class WikiSlugField(forms.CharField): + + default_validators = [validators.validate_slug, validate_slug_numbers] + + def __init__(self, *args, **kwargs): + self.allow_unicode = kwargs.pop("allow_unicode", False) + if self.allow_unicode: + self.default_validators = [ +~~ validators.validate_unicode_slug, + validate_slug_numbers, + ] + super().__init__(*args, **kwargs) + + +def _clean_slug(slug, urlpath): + if slug.startswith("_"): + raise forms.ValidationError(gettext("A slug may not begin with an underscore.")) + if slug == "admin": + raise forms.ValidationError(gettext("'admin' is not a permitted slug name.")) + + if settings.URL_CASE_SENSITIVE: + already_existing_slug = models.URLPath.objects.filter(slug=slug, parent=urlpath) + else: + slug = slug.lower() + already_existing_slug = models.URLPath.objects.filter( + slug__iexact=slug, parent=urlpath + ) + if already_existing_slug: + already_urlpath = already_existing_slug[0] + if already_urlpath.article and already_urlpath.article.current_revision.deleted: + raise forms.ValidationError( + gettext('A deleted article with slug "%s" already exists.') + % already_urlpath.slug + + +## ... source file continues with no further validators examples... + +``` + diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 3d35a04a7..cdbf17509 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -61,6 +61,11 @@ def dynamic_class_import(class_path): ## ... source file abbreviated to get to Blueprint examples ... + + @property + def app_name(self): + return self.get_app.config["APP_NAME"] + @property def app_theme(self): return self.get_app.config["APP_THEME"] @@ -160,6 +165,11 @@ from flaskbb.utils.helpers import ( ## ... source file abbreviated to get to Blueprint examples ... + else: + try: + db.session.commit() + except Exception: # noqa + logger.exception("Database error while activating account") db.session.rollback() flash( _( @@ -257,7 +267,58 @@ def about(): ``` -## Example 4 from flask-debugtoolbar +## Example 4 from flask-bookshelf +[flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the +example [Flask](/flask.html) application that developers create when +going through +[this Flask series of blog posts](https://damyanon.net/tags/flask-series/). + +[**flask-bookshelf / bookshelf / admin / controllers.py**](https://github.com/damyanbogoev/flask-bookshelf/blob/master/bookshelf/admin/controllers.py) + +```python +# controllers.py +from sqlalchemy import exc +~~from flask import Blueprint, render_template, flash +from flask import current_app, redirect, request, url_for +from flask_security.decorators import roles_required +from bookshelf.admin.forms.author_forms import CreateAuthorForm +from bookshelf.cache import cache +from bookshelf.data.models import Author, db + + +~~admin = Blueprint("admin", __name__, template_folder="templates") + + +@admin.route("/") +@roles_required("admin") +def index(): + return render_template("admin_index.htm") + + +@admin.route("/author/create", methods=["GET", "POST"]) +@roles_required("admin") +def create_author(): + form = CreateAuthorForm(request.form) + if request.method == "POST" and form.validate(): + names = form.names.data + current_app.logger.info("Adding a new author %s.", (names)) + author = Author(names) + + try: + db.session.add(author) + db.session.commit() + cache.clear() + flash("Author successfully created.") + except exc.SQLAlchemyError as e: + flash("Author was not created.") + + +## ... source file continues with no further Blueprint examples... + +``` + + +## Example 5 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -327,7 +388,7 @@ class DebugToolbarExtension(object): ``` -## Example 5 from flask-restx +## Example 6 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -379,7 +440,7 @@ def swagger_static(filename): ``` -## Example 6 from Flask-WTF +## Example 7 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -432,7 +493,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 7 from tedivms-flask +## Example 8 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index 235174a36..5435b7acf 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -66,6 +66,11 @@ class FlaskBBGroup(FlaskGroup): ## ... source file abbreviated to get to with_appcontext examples ... + "'instance' next to the package or module is assumed to " + "be the instance path.") +@click.option("--version", expose_value=False, callback=get_version, + is_flag=True, is_eager=True, help="Show the FlaskBB version.") +@click.pass_context @click_log.simple_verbosity_option(logger) def flaskbb(ctx): if ctx.invoked_subcommand is None: @@ -116,6 +121,11 @@ def install(welcome, force, username, email, password, no_plugins): ## ... source file abbreviated to get to with_appcontext examples ... + + if fixture or all_latest: + try: + settings = import_string( + "flaskbb.fixtures.{}".format(fixture) ) settings = settings.fixture except ImportError: diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index 6330688e7..3be521eec 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -62,6 +62,11 @@ def marshal(data, fields, envelope=None, skip_none=False, mask=None, ordered=Fal + out = OrderedDict(items) if ordered else dict(items) + + if envelope: + out = OrderedDict([(envelope, out)]) if ordered else {envelope: out} + return out, has_wildcards["present"] diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index d4c8e9aec..98fe607a3 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -54,11 +54,11 @@ class BabelManager(BaseManager): appbuilder_parent_dir, "translations" ) if "BABEL_TRANSLATION_DIRECTORIES" in app.config: - - -## ... source file abbreviated to get to has_request_context examples ... - - + current_translation_directories = app.config.get( + "BABEL_TRANSLATION_DIRECTORIES" + ) + translations_path = ( + appbuilder_translations_path + ";" + current_translation_directories ) else: translations_path = appbuilder_translations_path + ";translations" diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index 5f126aeaf..411fdaa24 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -33,6 +33,13 @@ as open source under the [MIT license](https://github.com/anfederico/Flaskex/blob/master/LICENSE.txt). +### Flask Bookshelf +[flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the +example [Flask](/flask.html) application that developers create when +going through +[this Flask series of blog posts](https://damyanon.net/tags/flask-series/). + + ### Flask JSONDash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 709e62294..06330d075 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -59,6 +59,11 @@ class MenuItem(object): ## ... source file abbreviated to get to current_app examples ... + self.menu = [] + if reverse: + extra_classes = extra_classes + "navbar-inverse" + self.extra_classes = extra_classes + @property def reverse(self): return "navbar-inverse" in self.extra_classes @@ -109,6 +114,11 @@ class MenuItem(object): ## ... source file abbreviated to get to current_app examples ... + self.add_category( + category=category, icon=category_icon, label=category_label + ) + new_menu_item = MenuItem( + name=name, href=href, icon=icon, label=label, baseview=baseview ) self.find(category).childs.append(new_menu_item) @@ -191,6 +201,11 @@ from flaskbb.utils.helpers import ( ## ... source file abbreviated to get to current_app examples ... + + reauth_manager = self.reauthentication_factory() + try: + reauth_manager.reauthenticate( + user=current_user, secret=form.password.data ) confirm_login() flash(_("Reauthenticated."), "success") @@ -332,6 +347,11 @@ class Role(db.Model): ## ... source file abbreviated to get to current_app examples ... + if role is None: + role = Role(name=r) + role.permissions = roles[r][0] + role.index = roles[r][1] + role.default = roles[r][2] db.session.add(role) db.session.commit() @@ -384,7 +404,112 @@ class User(UserMixin, db.Model): ``` -## Example 4 from flask-debugtoolbar +## Example 4 from flask-bookshelf +[flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the +example [Flask](/flask.html) application that developers create when +going through +[this Flask series of blog posts](https://damyanon.net/tags/flask-series/). + +[**flask-bookshelf / bookshelf / __init__.py**](https://github.com/damyanbogoev/flask-bookshelf/blob/master/bookshelf/./__init__.py) + +```python +# __init__.py +~~from flask import abort, Flask, g, render_template, request, current_app +from flask_babel import Babel +from flask_security import current_user +from bookshelf.utils import get_instance_folder_path +from bookshelf.main.controllers import main +from bookshelf.admin.controllers import admin +from bookshelf.cache import cache +from bookshelf.config import configure_app +from bookshelf.data.models import db + +app = Flask( + __name__, + instance_path=get_instance_folder_path(), + instance_relative_config=True, + template_folder="templates", +) + +babel = Babel(app) +configure_app(app) +cache.init_app(app) +db.init_app(app) +app.jinja_env.add_extension("jinja2.ext.loopcontrols") + + +@app.url_defaults + + +## ... source file abbreviated to get to current_app examples ... + + + g.lang_code = values.pop("lang_code", None) + + +@app.before_request +def ensure_lang_support(): + lang_code = g.get("lang_code", None) + if lang_code and lang_code not in app.config["SUPPORTED_LANGUAGES"].keys(): + abort(404) + + +@babel.localeselector +def get_locale(): + return g.get("lang_code", app.config["BABEL_DEFAULT_LOCALE"]) + + +@babel.timezoneselector +def get_timezone(): + user = g.get("user", None) + if user is not None: + return user.timezone + return "UTC" + + +@app.errorhandler(404) +def page_not_found(error): +~~ current_app.logger.error("Page not found: %s", (request.path, error)) + return render_template("404.htm"), 404 + + +@app.errorhandler(500) +def internal_server_error(error): +~~ current_app.logger.error("Server Error: %s", (error)) + return render_template("500.htm"), 500 + + +@app.errorhandler(Exception) +def unhandled_exception(error): +~~ current_app.logger.error("Unhandled Exception: %s", (error)) + return render_template("500.htm"), 500 + + +@app.context_processor +def inject_data(): + return dict(user=current_user, lang_code=g.get("lang_code", None)) + + +@app.route("/") +@app.route("//") +@cache.cached(300) +def home(lang_code=None): + return render_template("index.htm") + + +app.register_blueprint(main, url_prefix="/main") +app.register_blueprint(main, url_prefix="//main") +app.register_blueprint(admin, url_prefix="/admin") +app.register_blueprint(admin, url_prefix="//admin") + + + +## ... source file continues with no further current_app examples... + +``` + + +## Example 5 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -433,6 +558,11 @@ def replace_insensitive(string, target, replacement): ## ... source file abbreviated to get to current_app examples ... + ), + } + + def dispatch_request(self): + req = _request_ctx_stack.top.request app = current_app if req.routing_exception is not None: @@ -527,7 +657,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 5 from flask_jsondash +## Example 6 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -620,7 +750,7 @@ def local_static(chart_config, static_config): ``` -## Example 6 from flask-login +## Example 7 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -674,6 +804,11 @@ def decode_cookie(cookie, key=None): ## ... source file abbreviated to get to current_app examples ... + if (not l_url.scheme or l_url.scheme == c_url.scheme) and \ + (not l_url.netloc or l_url.netloc == c_url.netloc): + return urlunparse(('', '', c_url.path, c_url.params, c_url.query, '')) + return current_url + def expand_login_view(login_view): if login_view.startswith(('https://', 'http://', '/')): @@ -862,7 +997,7 @@ def _secret_key(key=None): ``` -## Example 7 from flask-restx +## Example 8 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -921,6 +1056,11 @@ PY_TYPES = { ## ... source file abbreviated to get to current_app examples ... +) + + +def ref(model): + name = model.name if isinstance(model, ModelBase) else model return {"$ref": "#/definitions/{0}".format(quote(name, safe=""))} @@ -971,6 +1111,11 @@ def _clean_header(header): ## ... source file abbreviated to get to current_app examples ... + if self.api.contact and (self.api.contact_email or self.api.contact_url): + infos["contact"] = { + "name": _v(self.api.contact), + "email": _v(self.api.contact_email), + "url": _v(self.api.contact_url), } if self.api.license: infos["license"] = {"name": _v(self.api.license)} @@ -1050,6 +1195,11 @@ def _clean_header(header): ## ... source file abbreviated to get to current_app examples ... + else self.api.default_id(doc["name"], method) + ) + + def parameters_for(self, doc): + params = [] for name, param in iteritems(doc["params"]): param["name"] = name if "type" not in param and "schema" not in param: @@ -1104,7 +1254,7 @@ def _clean_header(header): ``` -## Example 8 from flask-sqlalchemy +## Example 9 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) ([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) and @@ -1164,6 +1314,11 @@ def _make_table(db): ## ... source file abbreviated to get to current_app examples ... + return _EngineConnector(self, self.get_app(app), bind) + + def get_engine(self, app=None, bind=None): + + app = self.get_app(app) state = get_state(app) with self._engine_lock: @@ -1216,7 +1371,7 @@ def _make_table(db): ``` -## Example 9 from Flask-WTF +## Example 10 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1347,6 +1502,11 @@ class _FlaskFormCSRF(CSRF): ## ... source file abbreviated to get to current_app examples ... + def csrf_protect(): + if not app.config['WTF_CSRF_ENABLED']: + return + + if not app.config['WTF_CSRF_CHECK_DEFAULT']: return if request.method not in app.config['WTF_CSRF_METHODS']: @@ -1468,7 +1628,7 @@ def same_origin(current_uri, compare_uri): ``` -## Example 10 from Flasky +## Example 11 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1523,7 +1683,7 @@ def run_migrations_online(): ``` -## Example 11 from sandman2 +## Example 12 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1574,6 +1734,11 @@ def get_app( ## ... source file abbreviated to get to current_app examples ... + cls.__model__.primary_key()) + return jsonify(routes) + return app + + def _register_error_handlers(app): @app.errorhandler(BadRequestException) @app.errorhandler(ForbiddenException) @@ -1643,7 +1808,7 @@ def register_model(cls, admin=None): ``` -## Example 12 from tedivms-flask +## Example 13 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 38b63dcc0..9a11eb58b 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -157,6 +157,11 @@ from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin, ## ... source file abbreviated to get to request examples ... + flash(_("Settings saved."), "success") + + return render_template( + "management/settings.html", + form=form, all_groups=all_groups, all_plugins=all_plugins, active_nav=active_nav @@ -219,6 +224,11 @@ class EditUser(MethodView): ## ... source file abbreviated to get to request examples ... + user.password = form.password.data + + user.save(groups=form.secondary_groups.data) + + flash(_('User updated.'), 'success') return redirect(url_for('management.edit_user', user_id=user.id)) return render_template( @@ -270,6 +280,11 @@ class DeleteUser(MethodView): ## ... source file abbreviated to get to request examples ... + form = self.form() + if form.validate_on_submit(): + form.save() + flash(_('User added.'), 'success') + return redirect(url_for('management.users')) return render_template( 'management/user_form.html', form=form, title=_('Add User') @@ -379,6 +394,11 @@ class BanUser(MethodView): ## ... source file abbreviated to get to request examples ... + return redirect(url_for("management.banned_users")) + + +class UnbanUser(MethodView): + decorators = [ allows.requires( IsAtleastModerator, on_fail=FlashAndRedirect( @@ -425,11 +445,8 @@ class BanUser(MethodView): user = User.query.filter_by(id=user_id).first_or_404() - - -## ... source file abbreviated to get to request examples ... - - + if user.unban(): + flash(_("User is now unbanned."), "success") else: flash(_("Could not unban user."), "danger") @@ -480,6 +497,11 @@ class AddGroup(MethodView): ## ... source file abbreviated to get to request examples ... + + if group.guest: + Guest.invalidate_cache() + + flash(_('Group updated.'), 'success') return redirect(url_for('management.groups', group_id=group.id)) return render_template( @@ -531,6 +553,11 @@ class DeleteGroup(MethodView): ## ... source file abbreviated to get to request examples ... + category = Category.query.filter_by(id=category_id).first_or_404() + + involved_users = User.query.filter( + Forum.category_id == category.id, Topic.forum_id == Forum.id, + Post.user_id == User.id ).all() category.delete(involved_users) @@ -626,6 +653,11 @@ class MarkReportRead(MethodView): ## ... source file abbreviated to get to request examples ... + report.zapped_by = current_user.id + report.zapped = time_utcnow() + report_list.append(report) + + db.session.add_all(report_list) db.session.commit() flash(_("All reports were marked as read."), "success") @@ -679,7 +711,66 @@ class DeleteReport(MethodView): ``` -## Example 3 from flask-debugtoolbar +## Example 3 from flask-bookshelf +[flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the +example [Flask](/flask.html) application that developers create when +going through +[this Flask series of blog posts](https://damyanon.net/tags/flask-series/). + +[**flask-bookshelf / bookshelf / admin / controllers.py**](https://github.com/damyanbogoev/flask-bookshelf/blob/master/bookshelf/admin/controllers.py) + +```python +# controllers.py +from sqlalchemy import exc +from flask import Blueprint, render_template, flash +~~from flask import current_app, redirect, request, url_for +from flask_security.decorators import roles_required +from bookshelf.admin.forms.author_forms import CreateAuthorForm +from bookshelf.cache import cache +from bookshelf.data.models import Author, db + + +admin = Blueprint("admin", __name__, template_folder="templates") + + +@admin.route("/") +@roles_required("admin") +def index(): + return render_template("admin_index.htm") + + +@admin.route("/author/create", methods=["GET", "POST"]) +@roles_required("admin") +def create_author(): + form = CreateAuthorForm(request.form) +~~ if request.method == "POST" and form.validate(): + names = form.names.data + current_app.logger.info("Adding a new author %s.", (names)) + author = Author(names) + + try: + db.session.add(author) + db.session.commit() + cache.clear() + flash("Author successfully created.") + except exc.SQLAlchemyError as e: + flash("Author was not created.") + current_app.logger.error(e) + + return redirect(url_for("admin.create_author")) + + return redirect(url_for("main.display_authors")) + + return render_template("create_author.htm", form=form) + + + +## ... source file continues with no further request examples... + +``` + + +## Example 4 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -728,6 +819,11 @@ def replace_insensitive(string, target, replacement): ## ... source file abbreviated to get to request examples ... + 'flask_debugtoolbar.panels.route_list.RouteListDebugPanel', + 'flask_debugtoolbar.panels.profiler.ProfilerDebugPanel', + 'flask_debugtoolbar.panels.g.GDebugPanel', + ), + } def dispatch_request(self): req = _request_ctx_stack.top.request @@ -821,7 +917,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 4 from flaskex +## Example 5 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -916,7 +1012,7 @@ if __name__ == "__main__": ``` -## Example 5 from flask-login +## Example 6 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -1011,6 +1107,11 @@ def login_fresh(): ## ... source file abbreviated to get to request examples ... + duration.days * 24 * 3600) * + 10**6) / 10.0**6 + except AttributeError: + raise Exception('duration must be a datetime.timedelta, ' + 'instead got: {0}'.format(duration)) current_app.login_manager._update_request_context_with_user(user) user_logged_in.send(current_app._get_current_object(), user=_get_user()) @@ -1089,11 +1190,7 @@ def set_login_view(login_view, blueprint=None): (current_app.login_manager .blueprint_login_views[None]) = (current_app.login_manager - - -## ... source file abbreviated to get to request examples ... - - + .login_view) current_app.login_manager.login_view = None else: @@ -1152,7 +1249,7 @@ def _secret_key(key=None): ``` -## Example 6 from flask-restx +## Example 7 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1204,6 +1301,11 @@ def marshal(data, fields, envelope=None, skip_none=False, mask=None, ordered=Fal + if envelope: + out = OrderedDict([(envelope, out)]) if ordered else {envelope: out} + + return out, has_wildcards["present"] + class marshal_with(object): @@ -1255,7 +1357,7 @@ class marshal_with_field(object): ``` -## Example 7 from Flask-WTF +## Example 8 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1306,6 +1408,11 @@ def generate_csrf(secret_key=None, token_key=None): ## ... source file abbreviated to get to request examples ... + app.extensions['csrf'] = self + + app.config.setdefault('WTF_CSRF_ENABLED', True) + app.config.setdefault('WTF_CSRF_CHECK_DEFAULT', True) + app.config['WTF_CSRF_METHODS'] = set(app.config.get( 'WTF_CSRF_METHODS', ['POST', 'PUT', 'PATCH', 'DELETE'] )) app.config.setdefault('WTF_CSRF_FIELD_NAME', 'csrf_token') @@ -1408,7 +1515,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 8 from flaskSaaS +## Example 9 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -1459,7 +1566,7 @@ admin.add_view(FileAdmin(path, '/static/', name='Static')) ``` -## Example 9 from newspie +## Example 10 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1601,6 +1708,11 @@ def parse_articles(response): ## ... source file abbreviated to get to request examples ... + article['source']['name'] + }) + return parsed_articles + + def count_pages(response): pages = 0 if response.get('status') == 'ok': @@ -1635,7 +1747,7 @@ if __name__ == '__main__': ``` -## Example 10 from sandman2 +## Example 11 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1761,6 +1873,11 @@ class Service(MethodView): ## ... source file abbreviated to get to request examples ... + raise BadRequestException(error_message) + resource.update(request.json) + db.session().merge(resource) + db.session().commit() + return jsonify(resource) resource = self.__model__(**request.json) # pylint: disable=not-callable error_message = is_valid_method(self.__model__, resource) @@ -1831,7 +1948,7 @@ class Service(MethodView): ``` -## Example 11 from tedivms-flask +## Example 12 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index bdc364cbd..23f1a5278 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -61,6 +61,11 @@ class BaseRegisterUser(PublicFormView): ## ... source file abbreviated to get to session examples ... + username=form.username.data, + first_name=form.first_name.data, + last_name=form.last_name.data, + email=form.email.data, + password=form.password.data, ) @@ -370,6 +375,11 @@ def decode_cookie(cookie, key=None): ## ... source file abbreviated to get to session examples ... + return login_view + else: + if request.view_args is None: + return url_for(login_view) + else: return url_for(login_view, **request.view_args) @@ -704,6 +714,11 @@ def get_config(): ## ... source file abbreviated to get to session examples ... + if 'CACHE_TYPE' not in app.config or not app.config['CACHE_TYPE']: + app.config['CACHE_TYPE'] = 'file' + + if app.config['CACHE_TYPE'] == 'file': + if 'CACHE_ROOT' not in app.config or not app.config['CACHE_ROOT']: app.config['CACHE_ROOT'] = '/tmp/%s' % __name__ session_opts['session.type'] = app.config['CACHE_TYPE'] diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 6174d3246..7f0bb3a9d 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -61,6 +61,11 @@ class BaseRegisterUser(PublicFormView): ## ... source file abbreviated to get to flash examples ... + ".activation", + _external=True, + activation_hash=register_user.registration_hash, + ) + msg.html = self.render_template( self.email_template, url=url, username=register_user.username, @@ -135,6 +140,11 @@ class RegisterUserDBView(BaseRegisterUser): ## ... source file abbreviated to get to flash examples ... + form = LoginForm_oid() + if form.validate_on_submit(): + session["remember_me"] = form.remember_me.data + return self.appbuilder.sm.oid.try_login( + form.openid.data, ask_for=["email", "fullname"] ) resp = session.pop("oid_resp", None) if resp: @@ -233,6 +243,11 @@ from .services.registration import ( +@impl(trylast=True) +def flaskbb_reauth_attempt(user, secret): + return DefaultFlaskBBReauthProvider().reauthenticate(user, secret) + + @impl def flaskbb_reauth_failed(user): MarkFailedReauth().handle_reauth_failure(user) @@ -283,7 +298,66 @@ def flaskbb_registration_post_processor(user): ``` -## Example 3 from flask_jsondash +## Example 3 from flask-bookshelf +[flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the +example [Flask](/flask.html) application that developers create when +going through +[this Flask series of blog posts](https://damyanon.net/tags/flask-series/). + +[**flask-bookshelf / bookshelf / admin / controllers.py**](https://github.com/damyanbogoev/flask-bookshelf/blob/master/bookshelf/admin/controllers.py) + +```python +# controllers.py +from sqlalchemy import exc +~~from flask import Blueprint, render_template, flash +from flask import current_app, redirect, request, url_for +from flask_security.decorators import roles_required +from bookshelf.admin.forms.author_forms import CreateAuthorForm +from bookshelf.cache import cache +from bookshelf.data.models import Author, db + + +admin = Blueprint("admin", __name__, template_folder="templates") + + +@admin.route("/") +@roles_required("admin") +def index(): + return render_template("admin_index.htm") + + +@admin.route("/author/create", methods=["GET", "POST"]) +@roles_required("admin") +def create_author(): + form = CreateAuthorForm(request.form) + if request.method == "POST" and form.validate(): + names = form.names.data + current_app.logger.info("Adding a new author %s.", (names)) + author = Author(names) + + try: + db.session.add(author) + db.session.commit() + cache.clear() +~~ flash("Author successfully created.") + except exc.SQLAlchemyError as e: +~~ flash("Author was not created.") + current_app.logger.error(e) + + return redirect(url_for("admin.create_author")) + + return redirect(url_for("main.display_authors")) + + return render_template("create_author.htm", form=form) + + + +## ... source file continues with no further flash examples... + +``` + + +## Example 4 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -332,6 +406,11 @@ charts = Blueprint( ## ... source file abbreviated to get to flash examples ... + pagination = utils.paginator(count=len(views), + page=page, per_page=per_page) + opts.update(limit=pagination.limit, skip=pagination.skip) + views = views[pagination.skip:pagination.next] + else: pagination = None categorized = utils.categorize_views(views) kwargs = dict( @@ -509,7 +588,7 @@ def clone(c_id): ``` -## Example 4 from flask-login +## Example 5 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -559,6 +638,11 @@ class LoginManager(object): ## ... source file abbreviated to get to flash examples ... + self.init_app(app, add_context_processor) + + def init_app(self, app, add_context_processor=True): + app.login_manager = self + app.after_request(self._update_remember_cookie) if add_context_processor: app.context_processor(_user_context_processor) @@ -607,11 +691,9 @@ class LoginManager(object): self._request_callback = callback return self.request_callback - - -## ... source file abbreviated to get to flash examples ... - - + @property + def request_callback(self): + return self._request_callback def unauthorized_handler(self, callback): self.unauthorized_callback = callback @@ -667,7 +749,7 @@ class LoginManager(object): ``` -## Example 5 from tedivms-flask +## Example 6 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -715,6 +797,11 @@ def user_admin_page(): ## ... source file abbreviated to get to flash examples ... + + form = UserProfileForm() + roles = Role.query.all() + form.roles.choices = [(x.id,x.name) for x in roles] + if form.validate(): user = User.query.filter(User.email == request.form['email']).first() if not user: diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 25d5144d1..a4142e466 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -60,6 +60,11 @@ def protect(allow_browser_login=False): ## ... source file abbreviated to get to make_response examples ... + return functools.update_wrapper(wraps, f) + + +def has_access_api(f): + if hasattr(f, "_permission_name"): permission_str = f._permission_name else: permission_str = f.__name__ @@ -242,6 +247,11 @@ def root(): ## ... source file abbreviated to get to make_response examples ... + if request.method == 'POST': + return do_post(page, category='search', current_query=query) + response = requests.get(EVERYTHING, + params=params, + headers={'Authorization': API_KEY}) pages = count_pages(response.json()) if page > pages: page = pages @@ -345,6 +355,11 @@ def jsonify(resource): ## ... source file abbreviated to get to make_response examples ... + for key, value in args.items(): + if value.startswith('%'): + filters.append(getattr(self.__model__, key).like(str(value), escape='/')) + elif key == 'sort': + direction = desc if value.startswith('-') else asc order.append(direction(getattr(self.__model__, value.lstrip('-')))) elif key == 'limit': limit = int(value) diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index e9953e153..abd2ed776 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -531,6 +531,11 @@ def signin(): ## ... source file abbreviated to get to url_for examples ... + return redirect(url_for('userbp.signin')) + return render_template('user/signin.html', form=form, title='Sign in') + + +@userbp.route('/signout') def signout(): logout_user() flash('Succesfully signed out.', 'positive') @@ -632,6 +637,11 @@ class Role(db.Model): + def unfollow(self, user): + f = self.followed.filter_by(followed_id=user.id).first() + if f: + db.session.delete(f) + def is_following(self, user): if user.id is None: return False @@ -686,6 +696,11 @@ class AnonymousUser(AnonymousUserMixin): ## ... source file abbreviated to get to url_for examples ... +@login_manager.user_loader +def load_user(user_id): + return User.query.get(int(user_id)) + + class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer, primary_key=True) diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 53b035a46..d7e15a919 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -60,6 +60,11 @@ def protect(allow_browser_login=False): ## ... source file abbreviated to get to jsonify examples ... + + +def has_access_api(f): + if hasattr(f, "_permission_name"): + permission_str = f._permission_name else: permission_str = f.__name__ @@ -156,6 +161,11 @@ from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin, ## ... source file abbreviated to get to jsonify examples ... + endpoint="management.overview" + ) + ) + ] + def post(self, user_id=None): if request.is_xhr: ids = request.get_json()["ids"] @@ -206,6 +216,11 @@ class AddUser(MethodView): ## ... source file abbreviated to get to jsonify examples ... + + data = [] + users = User.query.filter(User.id.in_(ids)).all() + for user in users: + if (current_user.id == user.id or Permission(IsAdmin, identity=user) and Permission(Not(IsAdmin), current_user)): continue @@ -256,6 +271,11 @@ class UnbanUser(MethodView): ## ... source file abbreviated to get to jsonify examples ... + + if not Permission(CanBanUser, identity=current_user): + flash( + _("You do not have the permissions to unban this user."), + "danger" ) return redirect(url_for("management.overview")) @@ -306,6 +326,11 @@ class Groups(MethodView): ## ... source file abbreviated to get to jsonify examples ... + on_fail=FlashAndRedirect( + message=_("You are not allowed to modify groups."), + level="danger", + endpoint="management.overview" + ) ) ] @@ -362,6 +387,11 @@ class Groups(MethodView): ## ... source file abbreviated to get to jsonify examples ... + endpoint="management.overview" + ) + ) + ] + def post(self, report_id=None): if request.is_xhr: @@ -412,6 +442,11 @@ class Groups(MethodView): ## ... source file abbreviated to get to jsonify examples ... + message=_("You are not allowed to view reports."), + level="danger", + endpoint="management.overview" + ) + ) ] def post(self, report_id=None): @@ -657,6 +692,11 @@ class Service(MethodView): ## ... source file abbreviated to get to jsonify examples ... + raise BadRequestException(error_message) + db.session().add(resource) + db.session().commit() + return self._created_response(resource) + def put(self, resource_id): resource = self.__model__.query.get(resource_id) if resource: diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 6cdb203b5..4424408ad 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -52,6 +52,17 @@ class FlaskBBTokenSerializer(tokens.TokenSerializer): ) def loads(self, raw_token): + try: + parsed = self._serializer.loads(raw_token) + except SignatureExpired: + raise tokens.TokenError.expired() +~~ except BadSignature: # pragma: no branch + raise tokens.TokenError.invalid() + except BadData: # pragma: no cover + raise tokens.TokenError.bad() + else: + return tokens.Token(user_id=parsed['id'], operation=parsed['op']) + ## ... source file continues with no further BadSignature examples... diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 0218ef33d..c2535df30 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -66,6 +66,11 @@ def get_config(): ## ... source file abbreviated to get to SessionInterface examples ... + cache = CacheManager(**parse_cache_config_options(cache_opts)) + + +def init_session_manager(app): + session_opts = {'cache.expire': 3600} if 'CACHE_TYPE' not in app.config or not app.config['CACHE_TYPE']: app.config['CACHE_TYPE'] = 'file' diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index ec72fbd25..10656212e 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -73,6 +73,11 @@ from ._http import HTTPStatus ## ... source file abbreviated to get to got_request_exception examples ... + except MethodNotAllowed as e: + valid_route_method = e.valid_methods[0] + rule, _ = adapter.match(method=valid_route_method, return_rule=True) + return self.owns_endpoint(rule.endpoint) + except NotFound: return self.catch_all_404s except Exception: pass diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 151151c1c..46eb898c7 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -136,7 +136,111 @@ def send_email(recipient, subject, template, **kwargs): ``` -## Example 3 from flaskex +## Example 3 from flask-bookshelf +[flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the +example [Flask](/flask.html) application that developers create when +going through +[this Flask series of blog posts](https://damyanon.net/tags/flask-series/). + +[**flask-bookshelf / bookshelf / __init__.py**](https://github.com/damyanbogoev/flask-bookshelf/blob/master/bookshelf/./__init__.py) + +```python +# __init__.py +~~from flask import abort, Flask, g, render_template, request, current_app +from flask_babel import Babel +from flask_security import current_user +from bookshelf.utils import get_instance_folder_path +from bookshelf.main.controllers import main +from bookshelf.admin.controllers import admin +from bookshelf.cache import cache +from bookshelf.config import configure_app +from bookshelf.data.models import db + +app = Flask( + __name__, + instance_path=get_instance_folder_path(), + instance_relative_config=True, + template_folder="templates", +) + +babel = Babel(app) +configure_app(app) +cache.init_app(app) +db.init_app(app) +app.jinja_env.add_extension("jinja2.ext.loopcontrols") + + +@app.url_defaults + + +## ... source file abbreviated to get to render_template examples ... + + + + +@app.before_request +def ensure_lang_support(): + lang_code = g.get("lang_code", None) + if lang_code and lang_code not in app.config["SUPPORTED_LANGUAGES"].keys(): + abort(404) + + +@babel.localeselector +def get_locale(): + return g.get("lang_code", app.config["BABEL_DEFAULT_LOCALE"]) + + +@babel.timezoneselector +def get_timezone(): + user = g.get("user", None) + if user is not None: + return user.timezone + return "UTC" + + +@app.errorhandler(404) +def page_not_found(error): + current_app.logger.error("Page not found: %s", (request.path, error)) +~~ return render_template("404.htm"), 404 + + +@app.errorhandler(500) +def internal_server_error(error): + current_app.logger.error("Server Error: %s", (error)) +~~ return render_template("500.htm"), 500 + + +@app.errorhandler(Exception) +def unhandled_exception(error): + current_app.logger.error("Unhandled Exception: %s", (error)) +~~ return render_template("500.htm"), 500 + + +@app.context_processor +def inject_data(): + return dict(user=current_user, lang_code=g.get("lang_code", None)) + + +@app.route("/") +@app.route("//") +@cache.cached(300) +def home(lang_code=None): +~~ return render_template("index.htm") + + +app.register_blueprint(main, url_prefix="/main") +app.register_blueprint(main, url_prefix="//main") +app.register_blueprint(admin, url_prefix="/admin") +app.register_blueprint(admin, url_prefix="//admin") + + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 4 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -231,7 +335,7 @@ if __name__ == "__main__": ``` -## Example 4 from flask_jsondash +## Example 5 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -280,6 +384,11 @@ charts = Blueprint( ## ... source file abbreviated to get to render_template examples ... + opts.update( + filter=dict(created_by=setting('JSONDASH_GLOBAL_USER'))) + views += list(adapter.read(**opts)) + else: + views = list(adapter.read(**opts)) if views: pagination = utils.paginator(count=len(views), page=page, per_page=per_page) @@ -369,7 +478,7 @@ def update(c_id): ``` -## Example 5 from flask-phone-input +## Example 6 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -427,7 +536,7 @@ def show_phone(): ``` -## Example 6 from flask-restx +## Example 7 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -482,7 +591,7 @@ def ui_for(api): ``` -## Example 7 from flaskSaaS +## Example 8 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -685,7 +794,7 @@ def paySuccess(): ``` -## Example 8 from Flasky +## Example 9 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -725,7 +834,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 9 from newspie +## Example 10 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -775,6 +884,11 @@ def root(): ## ... source file abbreviated to get to render_template examples ... + + +@APP.route('/category/', methods=['GET', 'POST']) +def category(category): + page = request.args.get('page', default=1, type=int) if page < 1: return redirect(url_for('category', category=category, page=1)) if request.method == 'POST' and category in CATEGORIES: @@ -825,6 +939,11 @@ def search(query): ## ... source file abbreviated to get to render_template examples ... + if response.get('status') == 'ok': + for article in response.get('articles'): + parsed_articles.append({ + 'published_at': + parser.isoparse(article['publishedAt'] ).strftime('%Y-%m-%d %H:%M'), 'title': article['title'], @@ -870,7 +989,7 @@ if __name__ == '__main__': ``` -## Example 10 from tedivms-flask +## Example 11 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -923,6 +1042,11 @@ def get_config(): ## ... source file abbreviated to get to render_template examples ... + session_opts['session.secret'] = app.secret_key + + class BeakerSessionInterface(SessionInterface): + def open_session(self, app, request): + session = request.environ['beaker.session'] return session def save_session(self, app, session, response): diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 878905478..9f857c663 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -69,6 +69,11 @@ class Namespace(object): ## ... source file abbreviated to get to http_method_funcs examples ... + return (self._path or ("/" + self.name)).rstrip("/") + + def add_resource(self, resource, *urls, **kwargs): + route_doc = kwargs.pop("route_doc", {}) + self.resources.append(ResourceRoute(resource, urls, route_doc, kwargs)) for api in self.apis: ns_urls = api.ns_urls(self, urls) api.register_resource(self, resource, *ns_urls, **kwargs) diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index a5c7ad145..431084a53 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -58,6 +58,11 @@ from flaskbb.utils.helpers import ( ## ... source file abbreviated to get to MethodView examples ... + get_available_languages, + redirect_or_next, + register_view, + registration_enabled, + render_template, requires_unactivated, ) from flaskbb.utils.settings import flaskbb_config @@ -182,6 +187,11 @@ logger = logging.getLogger(__name__) ## ... source file abbreviated to get to MethodView examples ... + service = self.registration_service_factory() + try: + service.register(registration_info) + except StopValidation as e: + form.populate_errors(e.reasons) return render_template("auth/register.html", form=form) except PersistenceError: logger.exception("Database error while persisting user") @@ -258,11 +268,8 @@ logger = logging.getLogger(__name__) return redirect(url_for('auth.forgot_password')) except StopValidation as e: form.populate_errors(e.reasons) - - -## ... source file abbreviated to get to MethodView examples ... - - + form.token.data = token + return render_template("auth/reset_password.html", form=form) except Exception: logger.exception("Error when resetting password") flash(_('Error when resetting password')) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 9bb138701..5c1ad6d3c 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -30,6 +30,17 @@ on GitHub. [NotRegistered](/django-contrib-admin-sites-notregistered-examples.html) and [site](/django-contrib-admin-sites-site-examples.html) + * django.core + [cache](/django-core-cache-examples.html), + [checks](/django-core-checks-examples.html), + [exceptions](/django-core-exceptions-examples.html), + [mail](/django-core-mail-examples.html), + [management](/django-core-management-examples.html), + [serializers](/django-core-serializers-examples.html), + [signals](/django-core-signals-examples.html), + [signing](/django-core-signing-examples.html), + and + [validators](/django-core-validators-examples.html) * django.utils.translation [LANGUAGE_SESSION_KEY](/django-utils-translation-language-session-key-examples.html), [activate](/django-utils-translation-activate-examples.html), diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 4311fe2ac..6351a51ff 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -33,9 +33,18 @@

django.contrib.auth hashers make_password

django.core + cache, + checks, + exceptions, + mail, mail.send_mail, mail.messages EmailMessage, - management.base BaseCommand + management, + management.base BaseCommand, + serializers, + signals, + signing, + validators

django.db OperationalError

django.db.models From 2e5ab269843f7116baefa42b32485057215d62ca Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 24 Jun 2020 21:20:58 -0400 Subject: [PATCH 134/302] working on sqlalchemy examples to make them better --- .../flask/flask-blueprints-blueprint.markdown | 55 +++ .../flask-sessions-badsignature.markdown | 86 ++++ .../sqlalchemy-dialects-mssql.markdown | 120 +++++ .../sqlalchemy-dialects-mysql.markdown | 118 +++++ .../sqlalchemy-dialects-oracle.markdown | 120 +++++ ...alchemy-dialects-postgresql-array.markdown | 112 +++++ ...ts-postgresql-base-pgtypecompiler.markdown | 61 +-- ...lchemy-dialects-postgresql-bigint.markdown | 62 +++ ...qlalchemy-dialects-postgresql-bit.markdown | 55 +++ ...ects-postgresql-excludeconstraint.markdown | 150 ++++++ ...chemy-dialects-postgresql-integer.markdown | 119 +++++ ...lalchemy-dialects-postgresql-json.markdown | 76 +++ ...resql-psycopg2-pgdialect-psycopg2.markdown | 60 +-- ...hemy-dialects-postgresql-tsvector.markdown | 60 +++ .../sqlalchemy-dialects-postgresql.markdown | 196 ++++++++ .../sqlalchemy-dialects-sqlite.markdown | 120 +++++ .../sqlalchemy-engine-connection.markdown | 231 +++++++++ ...emy-engine-default-defaultdialect.markdown | 51 +- .../sqlalchemy-engine-default.markdown | 115 +++++ .../sqlalchemy-engine-engine.markdown | 122 +++++ ...-engine-strategies-enginestrategy.markdown | 19 +- ...ine-strategies-mockenginestrategy.markdown | 53 +- .../sqlalchemy-engine-url-make-url.markdown | 292 ++--------- .../sqlalchemy/sqlalchemy-engine-url.markdown | 180 +++++++ ...lalchemy-events-schemaeventtarget.markdown | 43 +- .../sqlalchemy-exc-dataerror.markdown | 71 +-- .../sqlalchemy-exc-integrityerror.markdown | 125 +---- ...qlalchemy-exc-invalidrequesterror.markdown | 38 +- ...alchemy-exc-noinspectionavailable.markdown | 24 +- .../sqlalchemy-exc-operationalerror.markdown | 70 +-- .../sqlalchemy-exc-programmingerror.markdown | 70 +-- ...lalchemy-ext-automap-automap-base.markdown | 36 +- .../sqlalchemy-ext-compiler-compiles.markdown | 22 +- .../sqlalchemy-ext-compiler.markdown | 78 +++ ...-ext-declarative-declarative-base.markdown | 227 +++++++++ ...y-ext-declarative-declarativemeta.markdown | 186 +++++++ ...lchemy-ext-hybrid-hybrid-property.markdown | 13 +- .../sqlalchemy-ext-mutable-mutable.markdown | 13 +- .../sqlalchemy-inspection-inspect.markdown | 61 +-- ...-attributes-instrumentedattribute.markdown | 10 +- .../sqlalchemy-orm-attributes.markdown | 154 ++++++ .../sqlalchemy-orm-class-mapper.markdown | 124 +++++ ...-orm-collections-instrumentedlist.markdown | 8 +- .../sqlalchemy-orm-columnproperty.markdown | 124 +++++ .../sqlalchemy-orm-exc-noresultfound.markdown | 45 +- ...lchemy-orm-exc-unmappedclasserror.markdown | 9 +- ...emy-orm-exc-unmappedinstanceerror.markdown | 92 ++-- ...emy-orm-interfaces-mapperproperty.markdown | 48 +- ...emy-orm-interfaces-propcomparator.markdown | 24 +- .../sqlalchemy/sqlalchemy-orm-mapper.markdown | 288 +++++++++++ .../sqlalchemy-orm-mapperlib.markdown | 125 +++++ .../sqlalchemy-orm-object-session.markdown | 151 ++++++ ...emy-orm-properties-columnproperty.markdown | 150 +++--- ...m-properties-relationshipproperty.markdown | 158 ++---- ...lchemy-orm-session-object-session.markdown | 144 ++---- .../sqlalchemy-orm-session-session.markdown | 219 +-------- .../sqlalchemy-orm-synonymproperty.markdown | 121 +++++ .../sqlalchemy-orm-util-aliasedinsp.markdown | 63 ++- .../sqlalchemy-pool-nullpool.markdown | 126 +++++ .../sqlalchemy-pool-staticpool.markdown | 126 +++++ ...sqlalchemy-schema-checkconstraint.markdown | 8 +- .../sqlalchemy-schema-column.markdown | 252 +--------- .../sqlalchemy-schema-createindex.markdown | 53 +- .../sqlalchemy-schema-ddlelement.markdown | 18 +- ...chemy-schema-foreignkeyconstraint.markdown | 73 +-- ...chemy-schema-primarykeyconstraint.markdown | 34 +- .../sqlalchemy-schema-table.markdown | 75 +-- .../sqlalchemy-sql-clauseelement.markdown | 197 ++++++++ .../sqlalchemy/sqlalchemy-sql-column.markdown | 207 ++++++++ .../sqlalchemy-sql-elements-label.markdown | 54 +- ...hemy-sql-expression-clauseelement.markdown | 14 +- ...chemy-sql-expression-columnclause.markdown | 9 +- ...hemy-sql-expression-columnelement.markdown | 11 +- ...alchemy-sql-expression-executable.markdown | 14 +- ...my-sql-expression-functionelement.markdown | 5 +- ...my-sql-expression-unaryexpression.markdown | 8 +- ...emy-sql-functions-genericfunction.markdown | 6 +- .../sqlalchemy-sql-naming-conv.markdown | 66 +-- .../sqlalchemy-sql-schema-schemaitem.markdown | 165 +------ .../sqlalchemy/sqlalchemy-sql-schema.markdown | 123 +++++ .../sqlalchemy-sql-sqltypes.markdown | 456 +++++++++++++++++ .../sqlalchemy/sqlalchemy-sql-table.markdown | 460 ++++++++++++++++++ ...sqlalchemy-sql-util-clauseadapter.markdown | 5 +- .../sqlalchemy-sql-visitors-traverse.markdown | 24 +- .../sqlalchemy-types-integer.markdown | 53 +- .../sqlalchemy-types-nulltype.markdown | 53 +- ...qlalchemy-util-langhelpers-symbol.markdown | 32 +- .../sqlalchemy-util-ordereddict.markdown | 185 +++++++ .../sqlalchemy-util-orderedset.markdown | 196 ++++++++ ...qlalchemy-util-set-creation-order.markdown | 127 +++++ .../sqlalchemy-util-topological.markdown | 122 +++++ theme/templates/code-examples/sqlalchemy.html | 63 ++- 92 files changed, 6899 insertions(+), 2288 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index cdbf17509..3fc8f9a9c 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -488,6 +488,61 @@ def generate_csrf(secret_key=None, token_key=None): if field_name not in g: +## ... source file abbreviated to get to Blueprint examples ... + + + return None + + def protect(self): + if request.method not in current_app.config['WTF_CSRF_METHODS']: + return + + try: + validate_csrf(self._get_csrf_token()) + except ValidationError as e: + logger.info(e.args[0]) + self._error_response(e.args[0]) + + if request.is_secure and current_app.config['WTF_CSRF_SSL_STRICT']: + if not request.referrer: + self._error_response('The referrer header is missing.') + + good_referrer = 'https://{0}/'.format(request.host) + + if not same_origin(request.referrer, good_referrer): + self._error_response('The referrer does not match the host.') + + g.csrf_valid = True # mark this request as CSRF valid + + def exempt(self, view): + +~~ if isinstance(view, Blueprint): + self._exempt_blueprints.add(view.name) + return view + + if isinstance(view, string_types): + view_location = view + else: + view_location = '.'.join((view.__module__, view.__name__)) + + self._exempt_views.add(view_location) + return view + + def _error_response(self, reason): + raise CSRFError(reason) + + def error_handler(self, view): + + warnings.warn(FlaskWTFDeprecationWarning( + '"@csrf.error_handler" is deprecated. Use the standard Flask ' + 'error system with "@app.errorhandler(CSRFError)" instead. This ' + 'will be removed in 1.0.' + ), stacklevel=2) + + @wraps(view) + def handler(reason): + + ## ... source file continues with no further Blueprint examples... ``` diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 4424408ad..de44540e7 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -120,6 +120,92 @@ class Role(db.Model): 'Administrator': ( +## ... source file abbreviated to get to BadSignature examples ... + + + + @password.setter + def password(self, password): + self.password_hash = generate_password_hash(password) + + def verify_password(self, password): + return check_password_hash(self.password_hash, password) + + def generate_confirmation_token(self, expiration=604800): + + s = Serializer(current_app.config['SECRET_KEY'], expiration) + return s.dumps({'confirm': self.id}) + + def generate_email_change_token(self, new_email, expiration=3600): + s = Serializer(current_app.config['SECRET_KEY'], expiration) + return s.dumps({'change_email': self.id, 'new_email': new_email}) + + def generate_password_reset_token(self, expiration=3600): + s = Serializer(current_app.config['SECRET_KEY'], expiration) + return s.dumps({'reset': self.id}) + + def confirm_account(self, token): + s = Serializer(current_app.config['SECRET_KEY']) + try: + data = s.loads(token) +~~ except (BadSignature, SignatureExpired): + return False + if data.get('confirm') != self.id: + return False + self.confirmed = True + db.session.add(self) + db.session.commit() + return True + + def change_email(self, token): + s = Serializer(current_app.config['SECRET_KEY']) + try: + data = s.loads(token) +~~ except (BadSignature, SignatureExpired): + return False + if data.get('change_email') != self.id: + return False + new_email = data.get('new_email') + if new_email is None: + return False + if self.query.filter_by(email=new_email).first() is not None: + return False + self.email = new_email + db.session.add(self) + db.session.commit() + return True + + def reset_password(self, token, new_password): + s = Serializer(current_app.config['SECRET_KEY']) + try: + data = s.loads(token) +~~ except (BadSignature, SignatureExpired): + return False + if data.get('reset') != self.id: + return False + self.password = new_password + db.session.add(self) + db.session.commit() + return True + + @staticmethod + def generate_fake(count=100, **kwargs): + from sqlalchemy.exc import IntegrityError + from random import seed, choice + from faker import Faker + + fake = Faker() + roles = Role.query.all() + + seed() + for i in range(count): + u = User( + first_name=fake.first_name(), + last_name=fake.last_name(), + email=fake.email(), + password='password', + + ## ... source file continues with no further BadSignature examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown new file mode 100644 index 000000000..2762bcb44 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown @@ -0,0 +1,120 @@ +title: sqlalchemy.dialects mssql code examples +category: page +slug: sqlalchemy-dialects-mssql-examples +sortorder: 500031000 +toc: False +sidebartitle: sqlalchemy.dialects mssql +meta: Python example code for the mssql function from the sqlalchemy.dialects module of the SQLAlchemy project. + + +mssql is a function within the sqlalchemy.dialects module of the SQLAlchemy project. + + +## Example 1 from marshmallow-sqlalchemy +[marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) +([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/)) +is a code library that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) with the +[Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +data serialization tool. + +The marshmallow-sqlalchemy project is provided as open source under the +[MIT license](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/LICENSE). + +[**marshmallow-sqlalchemy / src/marshmallow_sqlalchemy / convert.py**](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/src/marshmallow_sqlalchemy/./convert.py) + +```python +# convert.py +import inspect +import functools +import warnings + +import uuid +import marshmallow as ma +from marshmallow import validate, fields +~~from sqlalchemy.dialects import postgresql, mysql, mssql +from sqlalchemy.orm import SynonymProperty +import sqlalchemy as sa + +from .exceptions import ModelConversionError +from .fields import Related, RelatedList + + +def _is_field(value): + return isinstance(value, type) and issubclass(value, fields.Field) + + +def _has_default(column): + return ( + column.default is not None + or column.server_default is not None + or _is_auto_increment(column) + ) + + +def _is_auto_increment(column): + return column.table is not None and column is column.table._autoincrement_column + + +def _postgres_array_factory(converter, data_type): + + +## ... source file abbreviated to get to mssql examples ... + + + +class ModelConverter: + + SQLA_TYPE_MAPPING = { + sa.Enum: fields.Field, + sa.JSON: fields.Raw, + postgresql.BIT: fields.Integer, + postgresql.OID: fields.Integer, + postgresql.UUID: fields.UUID, + postgresql.MACADDR: fields.String, + postgresql.INET: fields.String, + postgresql.CIDR: fields.String, + postgresql.JSON: fields.Raw, + postgresql.JSONB: fields.Raw, + postgresql.HSTORE: fields.Raw, + postgresql.ARRAY: _postgres_array_factory, + postgresql.MONEY: fields.Decimal, + postgresql.DATE: fields.Date, + postgresql.TIME: fields.Time, + mysql.BIT: fields.Integer, + mysql.YEAR: fields.Integer, + mysql.SET: fields.List, + mysql.ENUM: fields.Field, + mysql.INTEGER: fields.Integer, + mysql.DATETIME: fields.DateTime, +~~ mssql.BIT: fields.Integer, + } + DIRECTION_MAPPING = {"MANYTOONE": False, "MANYTOMANY": True, "ONETOMANY": True} + + def __init__(self, schema_cls=None): + self.schema_cls = schema_cls + + @property + def type_mapping(self): + if self.schema_cls: + return self.schema_cls.TYPE_MAPPING + else: + return ma.Schema.TYPE_MAPPING + + def fields_for_model( + self, + model, + *, + include_fk=False, + include_relationships=False, + fields=None, + exclude=None, + base_fields=None, + dict_cls=dict, + ): + + +## ... source file continues with no further mssql examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown new file mode 100644 index 000000000..4d624b9d0 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown @@ -0,0 +1,118 @@ +title: sqlalchemy.dialects mysql code examples +category: page +slug: sqlalchemy-dialects-mysql-examples +sortorder: 500031001 +toc: False +sidebartitle: sqlalchemy.dialects mysql +meta: Python example code for the mysql function from the sqlalchemy.dialects module of the SQLAlchemy project. + + +mysql is a function within the sqlalchemy.dialects module of the SQLAlchemy project. + + +## Example 1 from marshmallow-sqlalchemy +[marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) +([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/)) +is a code library that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) with the +[Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +data serialization tool. + +The marshmallow-sqlalchemy project is provided as open source under the +[MIT license](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/LICENSE). + +[**marshmallow-sqlalchemy / src/marshmallow_sqlalchemy / convert.py**](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/src/marshmallow_sqlalchemy/./convert.py) + +```python +# convert.py +import inspect +import functools +import warnings + +import uuid +import marshmallow as ma +from marshmallow import validate, fields +~~from sqlalchemy.dialects import postgresql, mysql, mssql +from sqlalchemy.orm import SynonymProperty +import sqlalchemy as sa + +from .exceptions import ModelConversionError +from .fields import Related, RelatedList + + +def _is_field(value): + return isinstance(value, type) and issubclass(value, fields.Field) + + +def _has_default(column): + return ( + column.default is not None + or column.server_default is not None + or _is_auto_increment(column) + ) + + +def _is_auto_increment(column): + return column.table is not None and column is column.table._autoincrement_column + + +def _postgres_array_factory(converter, data_type): + return functools.partial( + fields.List, converter._get_field_class_for_data_type(data_type.item_type) + ) + + +class ModelConverter: + + SQLA_TYPE_MAPPING = { + sa.Enum: fields.Field, + sa.JSON: fields.Raw, + postgresql.BIT: fields.Integer, + postgresql.OID: fields.Integer, + postgresql.UUID: fields.UUID, + postgresql.MACADDR: fields.String, + postgresql.INET: fields.String, + postgresql.CIDR: fields.String, + postgresql.JSON: fields.Raw, + postgresql.JSONB: fields.Raw, + postgresql.HSTORE: fields.Raw, + postgresql.ARRAY: _postgres_array_factory, + postgresql.MONEY: fields.Decimal, + postgresql.DATE: fields.Date, + postgresql.TIME: fields.Time, +~~ mysql.BIT: fields.Integer, +~~ mysql.YEAR: fields.Integer, +~~ mysql.SET: fields.List, +~~ mysql.ENUM: fields.Field, +~~ mysql.INTEGER: fields.Integer, +~~ mysql.DATETIME: fields.DateTime, + mssql.BIT: fields.Integer, + } + DIRECTION_MAPPING = {"MANYTOONE": False, "MANYTOMANY": True, "ONETOMANY": True} + + def __init__(self, schema_cls=None): + self.schema_cls = schema_cls + + @property + def type_mapping(self): + if self.schema_cls: + return self.schema_cls.TYPE_MAPPING + else: + return ma.Schema.TYPE_MAPPING + + def fields_for_model( + self, + model, + *, + include_fk=False, + include_relationships=False, + fields=None, + exclude=None, + base_fields=None, + dict_cls=dict, + + +## ... source file continues with no further mysql examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown new file mode 100644 index 000000000..f66c36fa7 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown @@ -0,0 +1,120 @@ +title: sqlalchemy.dialects oracle code examples +category: page +slug: sqlalchemy-dialects-oracle-examples +sortorder: 500031002 +toc: False +sidebartitle: sqlalchemy.dialects oracle +meta: Python example code for the oracle function from the sqlalchemy.dialects module of the SQLAlchemy project. + + +oracle is a function within the sqlalchemy.dialects module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / types / password.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/types/password.py) + +```python +# password.py +import weakref + +import six +from sqlalchemy import types +~~from sqlalchemy.dialects import oracle, postgresql, sqlite +from sqlalchemy.ext.mutable import Mutable + +from ..exceptions import ImproperlyConfigured +from .scalar_coercible import ScalarCoercible + +passlib = None +try: + import passlib + from passlib.context import LazyCryptContext +except ImportError: + pass + + +class Password(Mutable, object): + + @classmethod + def coerce(cls, key, value): + if isinstance(value, Password): + return value + + if isinstance(value, (six.string_types, six.binary_type)): + return cls(value, secret=True) + + super(Password, cls).coerce(key, value) + + +## ... source file abbreviated to get to oracle examples ... + + + if self._max_length is None: + self._max_length = self.calculate_max_length() + + return self._max_length + + def calculate_max_length(self): + max_lengths = [1024] + for name in self.context.schemes(): + scheme = getattr(__import__('passlib.hash').hash, name) + length = 4 + len(scheme.name) + length += len(str(getattr(scheme, 'max_rounds', ''))) + length += (getattr(scheme, 'max_salt_size', 0) or 0) + length += getattr( + scheme, + 'encoded_checksum_size', + scheme.checksum_size + ) + max_lengths.append(length) + + return max(max_lengths) + + def load_dialect_impl(self, dialect): + if dialect.name == 'postgresql': + impl = postgresql.BYTEA(self.length) + elif dialect.name == 'oracle': +~~ impl = oracle.RAW(self.length) + elif dialect.name == 'sqlite': + impl = sqlite.BLOB(self.length) + else: + impl = types.VARBINARY(self.length) + return dialect.type_descriptor(impl) + + def process_bind_param(self, value, dialect): + if isinstance(value, Password): + if value.secret is not None: + return self._hash(value.secret).encode('utf8') + + return value.hash + + if isinstance(value, six.string_types): + return self._hash(value).encode('utf8') + + def process_result_value(self, value, dialect): + if value is not None: + return Password(value, self.context) + + def _hash(self, value): + return getattr(self.context, self.hashing_method)(value) + + def _coerce(self, value): + + +## ... source file continues with no further oracle examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown new file mode 100644 index 000000000..dbe8b51dc --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown @@ -0,0 +1,112 @@ +title: sqlalchemy.dialects.postgresql ARRAY code examples +category: page +slug: sqlalchemy-dialects-postgresql-array-examples +sortorder: 500031005 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql ARRAY +meta: Python example code for the ARRAY class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +ARRAY is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / asserts.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/./asserts.py) + +```python +# asserts.py +from decimal import Decimal + +import sqlalchemy as sa +~~from sqlalchemy.dialects.postgresql import ARRAY +from sqlalchemy.exc import DataError, IntegrityError + + +def _update_field(obj, field, value): + session = sa.orm.object_session(obj) + column = sa.inspect(obj.__class__).columns[field] + query = column.table.update().values(**{column.key: value}) + session.execute(query) + session.flush() + + +def _expect_successful_update(obj, field, value, reraise_exc): + try: + _update_field(obj, field, value) + except (reraise_exc) as e: + session = sa.orm.object_session(obj) + session.rollback() + assert False, str(e) + + +def _expect_failing_update(obj, field, value, expected_exc): + try: + _update_field(obj, field, value) + except expected_exc: + pass + else: + raise AssertionError('Expected update to raise %s' % expected_exc) + finally: + session = sa.orm.object_session(obj) + session.rollback() + + +def _repeated_value(type_): +~~ if isinstance(type_, ARRAY): + if isinstance(type_.item_type, sa.Integer): + return [0] + elif isinstance(type_.item_type, sa.String): + return [u'a'] + elif isinstance(type_.item_type, sa.Numeric): + return [Decimal('0')] + else: + raise TypeError('Unknown array item type') + else: + return u'a' + + +def _expected_exception(type_): +~~ if isinstance(type_, ARRAY): + return IntegrityError + else: + return DataError + + +def assert_nullable(obj, column): + _expect_successful_update(obj, column, None, IntegrityError) + + +def assert_non_nullable(obj, column): + _expect_failing_update(obj, column, None, IntegrityError) + + +def assert_max_length(obj, column, max_length): + type_ = sa.inspect(obj.__class__).columns[column].type + _expect_successful_update( + obj, + column, + _repeated_value(type_) * max_length, + _expected_exception(type_) + ) + _expect_failing_update( + obj, + column, + + +## ... source file continues with no further ARRAY examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown index 10b44aeec..39a32c1b3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.dialects.postgresql.base PGTypeCompiler code examples category: page slug: sqlalchemy-dialects-postgresql-base-pgtypecompiler-examples -sortorder: 500031000 +sortorder: 500031012 toc: False sidebartitle: sqlalchemy.dialects.postgresql.base PGTypeCompiler meta: Python example code for the PGTypeCompiler class from the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. @@ -16,7 +16,7 @@ PGTypeCompiler is a class within the sqlalchemy.dialects.postgresql.base module and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -40,55 +40,26 @@ from .scalar_coercible import ScalarCoercible class LtreeType(types.Concatenable, types.UserDefinedType, ScalarCoercible): - """Postgresql LtreeType type. - The LtreeType datatype can be used for representing labels of data stored - in hierarchial tree-like structure. For more detailed information please - refer to http://www.postgresql.org/docs/current/static/ltree.html + class comparator_factory(types.Concatenable.Comparator): + def ancestor_of(self, other): + if isinstance(other, list): + return self.op('@>')(expression.cast(other, ARRAY(LtreeType))) + else: + return self.op('@>')(other) - :: + def descendant_of(self, other): + if isinstance(other, list): + return self.op('<@')(expression.cast(other, ARRAY(LtreeType))) + else: + return self.op('<@')(other) - from sqlalchemy_utils import LtreeType, Ltree - - - class DocumentSection(Base): - __tablename__ = 'document_section' - id = sa.Column(sa.Integer, autoincrement=True, primary_key=True) - path = sa.Column(LtreeType) - - - - -## ... source file abbreviated to get to PGTypeCompiler examples ... - - - __visit_name__ = 'LTXTQUERY' - - -ischema_names['ltree'] = LtreeType -ischema_names['lquery'] = LQUERY -ischema_names['ltxtquery'] = LTXTQUERY - - -def visit_LTREE(self, type_, **kw): - return 'LTREE' - - -def visit_LQUERY(self, type_, **kw): - return 'LQUERY' - - -def visit_LTXTQUERY(self, type_, **kw): - return 'LTXTQUERY' - - -~~PGTypeCompiler.visit_LTREE = visit_LTREE -~~PGTypeCompiler.visit_LQUERY = visit_LQUERY -~~PGTypeCompiler.visit_LTXTQUERY = visit_LTXTQUERY + def lquery(self, other): + if isinstance(other, list): + return self.op('?')(expression.cast(other, ARRAY(LQUERY))) ## ... source file continues with no further PGTypeCompiler examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown new file mode 100644 index 000000000..728a4450c --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown @@ -0,0 +1,62 @@ +title: sqlalchemy.dialects.postgresql BIGINT code examples +category: page +slug: sqlalchemy-dialects-postgresql-bigint-examples +sortorder: 500031006 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql BIGINT +meta: Python example code for the BIGINT class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +BIGINT is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / ddl / postgresql.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/ddl/postgresql.py) + +```python +# postgresql.py +import logging +import re + +from sqlalchemy import Column +from sqlalchemy import Numeric +from sqlalchemy import text +from sqlalchemy import types as sqltypes +~~from sqlalchemy.dialects.postgresql import BIGINT +from sqlalchemy.dialects.postgresql import ExcludeConstraint +from sqlalchemy.dialects.postgresql import INTEGER +from sqlalchemy.sql.expression import ColumnClause +from sqlalchemy.sql.expression import UnaryExpression +from sqlalchemy.types import NULLTYPE + +from .base import alter_column +from .base import alter_table +from .base import AlterColumn +from .base import ColumnComment +from .base import compiles +from .base import format_column_name +from .base import format_table_name +from .base import format_type +from .base import RenameTable +from .impl import DefaultImpl +from .. import util +from ..autogenerate import render +from ..operations import ops +from ..operations import schemaobj +from ..operations.base import BatchOperations +from ..operations.base import Operations +from ..util import compat +from ..util import sqla_compat + + +## ... source file continues with no further BIGINT examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown new file mode 100644 index 000000000..817d1ba8b --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown @@ -0,0 +1,55 @@ +title: sqlalchemy.dialects.postgresql BIT code examples +category: page +slug: sqlalchemy-dialects-postgresql-bit-examples +sortorder: 500031007 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql BIT +meta: Python example code for the BIT class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +BIT is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / types / bit.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/types/bit.py) + +```python +# bit.py +import sqlalchemy as sa +~~from sqlalchemy.dialects.postgresql import BIT + + +class BitType(sa.types.TypeDecorator): + impl = sa.types.BINARY + + def __init__(self, length=1, **kwargs): + self.length = length + sa.types.TypeDecorator.__init__(self, **kwargs) + + def load_dialect_impl(self, dialect): + if dialect.name == 'postgresql': + return dialect.type_descriptor(BIT(self.length)) + elif dialect.name == 'sqlite': + return dialect.type_descriptor(sa.String(self.length)) + else: + return dialect.type_descriptor(type(self.impl)(self.length)) + + + +## ... source file continues with no further BIT examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown new file mode 100644 index 000000000..a74008241 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown @@ -0,0 +1,150 @@ +title: sqlalchemy.dialects.postgresql ExcludeConstraint code examples +category: page +slug: sqlalchemy-dialects-postgresql-excludeconstraint-examples +sortorder: 500031008 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql ExcludeConstraint +meta: Python example code for the ExcludeConstraint class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +ExcludeConstraint is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / ddl / postgresql.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/ddl/postgresql.py) + +```python +# postgresql.py +import logging +import re + +from sqlalchemy import Column +from sqlalchemy import Numeric +from sqlalchemy import text +from sqlalchemy import types as sqltypes +from sqlalchemy.dialects.postgresql import BIGINT +~~from sqlalchemy.dialects.postgresql import ExcludeConstraint +from sqlalchemy.dialects.postgresql import INTEGER +from sqlalchemy.sql.expression import ColumnClause +from sqlalchemy.sql.expression import UnaryExpression +from sqlalchemy.types import NULLTYPE + +from .base import alter_column +from .base import alter_table +from .base import AlterColumn +from .base import ColumnComment +from .base import compiles +from .base import format_column_name +from .base import format_table_name +from .base import format_type +from .base import RenameTable +from .impl import DefaultImpl +from .. import util +from ..autogenerate import render +from ..operations import ops +from ..operations import schemaobj +from ..operations.base import BatchOperations +from ..operations.base import Operations +from ..util import compat +from ..util import sqla_compat + + + +## ... source file abbreviated to get to ExcludeConstraint examples ... + + + self.schema = schema + self._orig_constraint = _orig_constraint + self.kw = kw + + @classmethod + def from_constraint(cls, constraint): + constraint_table = sqla_compat._table_for_constraint(constraint) + + return cls( + constraint.name, + constraint_table.name, + [(expr, op) for expr, name, op in constraint._render_exprs], + where=constraint.where, + schema=constraint_table.schema, + _orig_constraint=constraint, + deferrable=constraint.deferrable, + initially=constraint.initially, + using=constraint.using, + ) + + def to_constraint(self, migration_context=None): + if self._orig_constraint is not None: + return self._orig_constraint + schema_obj = schemaobj.SchemaObjects(migration_context) + t = schema_obj.table(self.table_name, schema=self.schema) +~~ excl = ExcludeConstraint( + *self.elements, + name=self.constraint_name, + where=self.where, + **self.kw + ) + for expr, name, oper in excl._render_exprs: + t.append_column(Column(name, NULLTYPE)) + t.append_constraint(excl) + return excl + + @classmethod + def create_exclude_constraint( + cls, operations, constraint_name, table_name, *elements, **kw + ): + op = cls(constraint_name, table_name, elements, **kw) + return operations.invoke(op) + + @classmethod + def batch_create_exclude_constraint( + cls, operations, constraint_name, *elements, **kw + ): + kw["schema"] = operations.impl.schema + op = cls(constraint_name, operations.impl.table_name, elements, **kw) + return operations.invoke(op) + + +@render.renderers.dispatch_for(CreateExcludeConstraintOp) +def _add_exclude_constraint(autogen_context, op): + return _exclude_constraint(op.to_constraint(), autogen_context, alter=True) + + +~~@render._constraint_renderers.dispatch_for(ExcludeConstraint) +def _render_inline_exclude_constraint(constraint, autogen_context): + rendered = render._user_defined_render( + "exclude", constraint, autogen_context + ) + if rendered is not False: + return rendered + + return _exclude_constraint(constraint, autogen_context, False) + + +def _postgresql_autogenerate_prefix(autogen_context): + + imports = autogen_context.imports + if imports is not None: + imports.add("from sqlalchemy.dialects import postgresql") + return "postgresql." + + +def _exclude_constraint(constraint, autogen_context, alter): + opts = [] + + has_batch = autogen_context._has_batch + + if constraint.deferrable: + + +## ... source file continues with no further ExcludeConstraint examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown new file mode 100644 index 000000000..fc836281a --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown @@ -0,0 +1,119 @@ +title: sqlalchemy.dialects.postgresql INTEGER code examples +category: page +slug: sqlalchemy-dialects-postgresql-integer-examples +sortorder: 500031009 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql INTEGER +meta: Python example code for the INTEGER class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +INTEGER is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / ddl / postgresql.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/ddl/postgresql.py) + +```python +# postgresql.py +import logging +import re + +from sqlalchemy import Column +from sqlalchemy import Numeric +from sqlalchemy import text +from sqlalchemy import types as sqltypes +from sqlalchemy.dialects.postgresql import BIGINT +from sqlalchemy.dialects.postgresql import ExcludeConstraint +~~from sqlalchemy.dialects.postgresql import INTEGER +from sqlalchemy.sql.expression import ColumnClause +from sqlalchemy.sql.expression import UnaryExpression +from sqlalchemy.types import NULLTYPE + +from .base import alter_column +from .base import alter_table +from .base import AlterColumn +from .base import ColumnComment +from .base import compiles +from .base import format_column_name +from .base import format_table_name +from .base import format_type +from .base import RenameTable +from .impl import DefaultImpl +from .. import util +from ..autogenerate import render +from ..operations import ops +from ..operations import schemaobj +from ..operations.base import BatchOperations +from ..operations.base import Operations +from ..util import compat +from ..util import sqla_compat + + + + +## ... source file abbreviated to get to INTEGER examples ... + + + schema=schema, + using=using, + existing_type=existing_type, + existing_server_default=existing_server_default, + existing_nullable=existing_nullable, + ) + ) + + super(PostgresqlImpl, self).alter_column( + table_name, + column_name, + nullable=nullable, + server_default=server_default, + name=name, + schema=schema, + autoincrement=autoincrement, + existing_type=existing_type, + existing_server_default=existing_server_default, + existing_nullable=existing_nullable, + existing_autoincrement=existing_autoincrement, + **kw + ) + + def autogen_column_reflect(self, inspector, table, column_info): + if column_info.get("default") and isinstance( +~~ column_info["type"], (INTEGER, BIGINT) + ): + seq_match = re.match( + r"nextval\('(.+?)'::regclass\)", column_info["default"] + ) + if seq_match: + info = sqla_compat._exec_on_inspector( + inspector, + text( + "select c.relname, a.attname " + "from pg_class as c join " + "pg_depend d on d.objid=c.oid and " + "d.classid='pg_class'::regclass and " + "d.refclassid='pg_class'::regclass " + "join pg_class t on t.oid=d.refobjid " + "join pg_attribute a on a.attrelid=t.oid and " + "a.attnum=d.refobjsubid " + "where c.relkind='S' and c.relname=:seqname" + ), + seqname=seq_match.group(1), + ).first() + if info: + seqname, colname = info + if colname == column_info["name"]: + log.info( + + +## ... source file continues with no further INTEGER examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown new file mode 100644 index 000000000..b631b3e6f --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown @@ -0,0 +1,76 @@ +title: sqlalchemy.dialects.postgresql JSON code examples +category: page +slug: sqlalchemy-dialects-postgresql-json-examples +sortorder: 500031010 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql JSON +meta: Python example code for the JSON class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +JSON is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / types / json.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/types/json.py) + +```python +# json.py +from __future__ import absolute_import + +import six +import sqlalchemy as sa +from sqlalchemy.dialects.postgresql.base import ischema_names + +from ..exceptions import ImproperlyConfigured + +json = None +try: + import anyjson as json +except ImportError: + import json as json + +try: +~~ from sqlalchemy.dialects.postgresql import JSON + has_postgres_json = True +except ImportError: + class PostgresJSONType(sa.types.UserDefinedType): + def get_col_spec(self): + return 'json' + + ischema_names['json'] = PostgresJSONType + has_postgres_json = False + + +class JSONType(sa.types.TypeDecorator): + impl = sa.UnicodeText + + def __init__(self, *args, **kwargs): + if json is None: + raise ImproperlyConfigured( + 'JSONType needs anyjson package installed.' + ) + super(JSONType, self).__init__(*args, **kwargs) + + def load_dialect_impl(self, dialect): + if dialect.name == 'postgresql': + if has_postgres_json: + return dialect.type_descriptor(JSON()) + + +## ... source file continues with no further JSON examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown index 56f72e790..e25cfdca9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 code examples category: page slug: sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2-examples -sortorder: 500031000 +sortorder: 500031013 toc: False sidebartitle: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 meta: Python example code for the PGDialect_psycopg2 class from the sqlalchemy.dialects.postgresql.psycopg2 module of the SQLAlchemy project. @@ -16,7 +16,7 @@ PGDialect_psycopg2 is a class within the sqlalchemy.dialects.postgresql.psycopg2 and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -28,56 +28,6 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # pg_composite.py -""" -CompositeType provides means to interact with -`PostgreSQL composite types`_. Currently this type features: - -* Easy attribute access to composite type fields -* Supports SQLAlchemy TypeDecorator types -* Ability to include composite types as part of PostgreSQL arrays -* Type creation and dropping - -Installation -^^^^^^^^^^^^ - -CompositeType automatically attaches `before_create` and `after_drop` DDL -listeners. These listeners create and drop the composite type in the -database. This means it works out of the box in your test environment where -you create the tables on each test run. - -When you already have your database set up you should call -:func:`register_composites` after you've set up all models. - -:: - - register_composites(conn) - - - -Usage -^^^^^ - -:: - - -## ... source file abbreviated to get to PGDialect_psycopg2 examples ... - - - sa.Column('amount', sa.Integer) - ] - ) - ) - ) - - -.. _PostgreSQL composite types: - http://www.postgresql.org/docs/current/static/rowtypes.html - - -Related links: - -http://schinckel.net/2014/09/24/using-postgres-composite-types-in-django/ -""" from collections import namedtuple import six @@ -113,6 +63,11 @@ except ImportError: ## ... source file abbreviated to get to PGDialect_psycopg2 examples ... + bind.execute(CreateCompositeType(self)) + + def drop(self, bind=None, checkfirst=True): + if ( + checkfirst and bind.dialect.has_type(bind, self.name, schema=self.schema) ): bind.execute(DropCompositeType(self)) @@ -162,6 +117,5 @@ def before_create(target, connection, **kw): ## ... source file continues with no further PGDialect_psycopg2 examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown new file mode 100644 index 000000000..6b80a34e5 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown @@ -0,0 +1,60 @@ +title: sqlalchemy.dialects.postgresql TSVECTOR code examples +category: page +slug: sqlalchemy-dialects-postgresql-tsvector-examples +sortorder: 500031011 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql TSVECTOR +meta: Python example code for the TSVECTOR class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +TSVECTOR is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / types / ts_vector.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/types/ts_vector.py) + +```python +# ts_vector.py +import sqlalchemy as sa +~~from sqlalchemy.dialects.postgresql import TSVECTOR + + +class TSVectorType(sa.types.TypeDecorator): + impl = TSVECTOR + + class comparator_factory(TSVECTOR.Comparator): + def match(self, other, **kwargs): + if 'postgresql_regconfig' not in kwargs: + if 'regconfig' in self.type.options: + kwargs['postgresql_regconfig'] = ( + self.type.options['regconfig'] + ) +~~ return TSVECTOR.Comparator.match(self, other, **kwargs) + + def __or__(self, other): + return self.op('||')(other) + + def __init__(self, *args, **kwargs): + self.columns = args + self.options = kwargs + super(TSVectorType, self).__init__() + + + +## ... source file continues with no further TSVECTOR examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown new file mode 100644 index 000000000..698f06f37 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown @@ -0,0 +1,196 @@ +title: sqlalchemy.dialects postgresql code examples +category: page +slug: sqlalchemy-dialects-postgresql-examples +sortorder: 500031003 +toc: False +sidebartitle: sqlalchemy.dialects postgresql +meta: Python example code for the postgresql function from the sqlalchemy.dialects module of the SQLAlchemy project. + + +postgresql is a function within the sqlalchemy.dialects module of the SQLAlchemy project. + + +## Example 1 from marshmallow-sqlalchemy +[marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) +([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/)) +is a code library that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) with the +[Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +data serialization tool. + +The marshmallow-sqlalchemy project is provided as open source under the +[MIT license](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/LICENSE). + +[**marshmallow-sqlalchemy / src/marshmallow_sqlalchemy / convert.py**](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/src/marshmallow_sqlalchemy/./convert.py) + +```python +# convert.py +import inspect +import functools +import warnings + +import uuid +import marshmallow as ma +from marshmallow import validate, fields +~~from sqlalchemy.dialects import postgresql, mysql, mssql +from sqlalchemy.orm import SynonymProperty +import sqlalchemy as sa + +from .exceptions import ModelConversionError +from .fields import Related, RelatedList + + +def _is_field(value): + return isinstance(value, type) and issubclass(value, fields.Field) + + +def _has_default(column): + return ( + column.default is not None + or column.server_default is not None + or _is_auto_increment(column) + ) + + +def _is_auto_increment(column): + return column.table is not None and column is column.table._autoincrement_column + + +def _postgres_array_factory(converter, data_type): + return functools.partial( + fields.List, converter._get_field_class_for_data_type(data_type.item_type) + ) + + +class ModelConverter: + + SQLA_TYPE_MAPPING = { + sa.Enum: fields.Field, + sa.JSON: fields.Raw, +~~ postgresql.BIT: fields.Integer, +~~ postgresql.OID: fields.Integer, +~~ postgresql.UUID: fields.UUID, +~~ postgresql.MACADDR: fields.String, +~~ postgresql.INET: fields.String, +~~ postgresql.CIDR: fields.String, +~~ postgresql.JSON: fields.Raw, +~~ postgresql.JSONB: fields.Raw, +~~ postgresql.HSTORE: fields.Raw, +~~ postgresql.ARRAY: _postgres_array_factory, +~~ postgresql.MONEY: fields.Decimal, +~~ postgresql.DATE: fields.Date, +~~ postgresql.TIME: fields.Time, + mysql.BIT: fields.Integer, + mysql.YEAR: fields.Integer, + mysql.SET: fields.List, + mysql.ENUM: fields.Field, + mysql.INTEGER: fields.Integer, + mysql.DATETIME: fields.DateTime, + mssql.BIT: fields.Integer, + } + DIRECTION_MAPPING = {"MANYTOONE": False, "MANYTOMANY": True, "ONETOMANY": True} + + def __init__(self, schema_cls=None): + self.schema_cls = schema_cls + + @property + def type_mapping(self): + if self.schema_cls: + return self.schema_cls.TYPE_MAPPING + else: + return ma.Schema.TYPE_MAPPING + + def fields_for_model( + self, + model, + *, + + +## ... source file continues with no further postgresql examples... + +``` + + +## Example 2 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / expressions.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/./expressions.py) + +```python +# expressions.py +import sqlalchemy as sa +~~from sqlalchemy.dialects import postgresql +from sqlalchemy.ext.compiler import compiles +from sqlalchemy.sql.expression import ColumnElement, FunctionElement +from sqlalchemy.sql.functions import GenericFunction + +from .functions.orm import quote + + +class array_get(FunctionElement): + name = 'array_get' + + +@compiles(array_get) +def compile_array_get(element, compiler, **kw): + args = list(element.clauses) + if len(args) != 2: + raise Exception( + "Function 'array_get' expects two arguments (%d given)." % + len(args) + ) + + if not hasattr(args[1], 'value') or not isinstance(args[1].value, int): + raise Exception( + "Second argument should be an integer." + ) + return '(%s)[%s]' % ( + compiler.process(args[0]), + sa.text(str(args[1].value + 1)) + ) + + +class row_to_json(GenericFunction): + name = 'row_to_json' +~~ type = postgresql.JSON + + +@compiles(row_to_json, 'postgresql') +def compile_row_to_json(element, compiler, **kw): + return "%s(%s)" % (element.name, compiler.process(element.clauses)) + + +class json_array_length(GenericFunction): + name = 'json_array_length' + type = sa.Integer + + +@compiles(json_array_length, 'postgresql') +def compile_json_array_length(element, compiler, **kw): + return "%s(%s)" % (element.name, compiler.process(element.clauses)) + + +class Asterisk(ColumnElement): + def __init__(self, selectable): + self.selectable = selectable + + +@compiles(Asterisk) +def compile_asterisk(element, compiler, **kw): + + +## ... source file continues with no further postgresql examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown new file mode 100644 index 000000000..6674d26fc --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown @@ -0,0 +1,120 @@ +title: sqlalchemy.dialects sqlite code examples +category: page +slug: sqlalchemy-dialects-sqlite-examples +sortorder: 500031004 +toc: False +sidebartitle: sqlalchemy.dialects sqlite +meta: Python example code for the sqlite function from the sqlalchemy.dialects module of the SQLAlchemy project. + + +sqlite is a function within the sqlalchemy.dialects module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / types / password.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/types/password.py) + +```python +# password.py +import weakref + +import six +from sqlalchemy import types +~~from sqlalchemy.dialects import oracle, postgresql, sqlite +from sqlalchemy.ext.mutable import Mutable + +from ..exceptions import ImproperlyConfigured +from .scalar_coercible import ScalarCoercible + +passlib = None +try: + import passlib + from passlib.context import LazyCryptContext +except ImportError: + pass + + +class Password(Mutable, object): + + @classmethod + def coerce(cls, key, value): + if isinstance(value, Password): + return value + + if isinstance(value, (six.string_types, six.binary_type)): + return cls(value, secret=True) + + super(Password, cls).coerce(key, value) + + +## ... source file abbreviated to get to sqlite examples ... + + + + return self._max_length + + def calculate_max_length(self): + max_lengths = [1024] + for name in self.context.schemes(): + scheme = getattr(__import__('passlib.hash').hash, name) + length = 4 + len(scheme.name) + length += len(str(getattr(scheme, 'max_rounds', ''))) + length += (getattr(scheme, 'max_salt_size', 0) or 0) + length += getattr( + scheme, + 'encoded_checksum_size', + scheme.checksum_size + ) + max_lengths.append(length) + + return max(max_lengths) + + def load_dialect_impl(self, dialect): + if dialect.name == 'postgresql': + impl = postgresql.BYTEA(self.length) + elif dialect.name == 'oracle': + impl = oracle.RAW(self.length) + elif dialect.name == 'sqlite': +~~ impl = sqlite.BLOB(self.length) + else: + impl = types.VARBINARY(self.length) + return dialect.type_descriptor(impl) + + def process_bind_param(self, value, dialect): + if isinstance(value, Password): + if value.secret is not None: + return self._hash(value.secret).encode('utf8') + + return value.hash + + if isinstance(value, six.string_types): + return self._hash(value).encode('utf8') + + def process_result_value(self, value, dialect): + if value is not None: + return Password(value, self.context) + + def _hash(self, value): + return getattr(self.context, self.hashing_method)(value) + + def _coerce(self, value): + + if value is None: + + +## ... source file continues with no further sqlite examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown new file mode 100644 index 000000000..c177738b8 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown @@ -0,0 +1,231 @@ +title: sqlalchemy.engine Connection code examples +category: page +slug: sqlalchemy-engine-connection-examples +sortorder: 500031014 +toc: False +sidebartitle: sqlalchemy.engine Connection +meta: Python example code for the Connection class from the sqlalchemy.engine module of the SQLAlchemy project. + + +Connection is a class within the sqlalchemy.engine module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / runtime / migration.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/runtime/migration.py) + +```python +# migration.py +from contextlib import contextmanager +import logging +import sys + +from sqlalchemy import Column +from sqlalchemy import literal_column +from sqlalchemy import MetaData +from sqlalchemy import PrimaryKeyConstraint +from sqlalchemy import String +from sqlalchemy import Table +~~from sqlalchemy.engine import Connection +from sqlalchemy.engine import url as sqla_url +from sqlalchemy.engine.strategies import MockEngineStrategy + +from .. import ddl +from .. import util +from ..util import sqla_compat +from ..util.compat import callable +from ..util.compat import EncodedIO + +log = logging.getLogger(__name__) + + +class _ProxyTransaction(object): + def __init__(self, migration_context): + self.migration_context = migration_context + + @property + def _proxied_transaction(self): + return self.migration_context._transaction + + def rollback(self): + self._proxied_transaction.rollback() + + def commit(self): + + +## ... source file abbreviated to get to Connection examples ... + + + log.info("Generating static SQL") + log.info( + "Will assume %s DDL.", + "transactional" + if self.impl.transactional_ddl + else "non-transactional", + ) + + @classmethod + def configure( + cls, + connection=None, + url=None, + dialect_name=None, + dialect=None, + environment_context=None, + dialect_opts=None, + opts=None, + ): + if opts is None: + opts = {} + if dialect_opts is None: + dialect_opts = {} + + if connection: +~~ if not isinstance(connection, Connection): + util.warn( + "'connection' argument to configure() is expected " + "to be a sqlalchemy.engine.Connection instance, " + "got %r" % connection, + stacklevel=3, + ) + + dialect = connection.dialect + elif url: + url = sqla_url.make_url(url) + dialect = url.get_dialect()(**dialect_opts) + elif dialect_name: + url = sqla_url.make_url("%s://" % dialect_name) + dialect = url.get_dialect()(**dialect_opts) + elif not dialect: + raise Exception("Connection, url, or dialect_name is required.") + + return MigrationContext(dialect, connection, opts, environment_context) + + @contextmanager + def autocommit_block(self): + _in_connection_transaction = self._in_connection_transaction() + + if self.impl.transactional_ddl: + + +## ... source file continues with no further Connection examples... + +``` + + +## Example 2 from GINO +[GINO](https://github.com/fantix/gino) +([project documentation](https://python-gino.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/gino/)) +is an [object-relational mapper (ORM)](/object-relational-mappers-orms.html) +built on SQLAlchemy that is non-blocking and therefore designed to work properly +with asynchronously-run code, for example, an application written with +[asyncio](https://docs.python.org/3/library/asyncio.html). + +GINO is open sourced under the [BSD License](https://github.com/python-gino/gino/blob/master/LICENSE). + +[**GINO / src/gino / engine.py**](https://github.com/python-gino/gino/blob/master/src/gino/./engine.py) + +```python +# engine.py +import asyncio +import collections +import functools +import sys +import time +from contextvars import ContextVar + +from sqlalchemy.cutils import _distill_params +~~from sqlalchemy.engine import Engine, Connection +from sqlalchemy.sql import schema + +from .aiocontextvars import patch_asyncio +from .exceptions import MultipleResultsFound, NoResultFound +from .transaction import GinoTransaction + +patch_asyncio() + + +class _BaseDBAPIConnection: + _reset_agent = None + gino_conn = None + + def __init__(self, cursor_cls): + self._cursor_cls = cursor_cls + self._closed = False + + def commit(self): + pass + + def cursor(self): + return self._cursor_cls(self) + + @property + + +## ... source file abbreviated to get to Connection examples ... + + + +class _ReusingDBAPIConnection(_BaseDBAPIConnection): + def __init__(self, cursor_cls, root): + super().__init__(cursor_cls) + self._root = root + + @property + def raw_connection(self): + return self._root.raw_connection + + async def _acquire(self, timeout): + return await self._root.acquire(timeout=timeout) + + async def _release(self): + pass + + +class _bypass_no_param: + def keys(self): + return [] + + +_bypass_no_param = _bypass_no_param() + + +~~class _SAConnection(Connection): + def _execute_context(self, dialect, constructor, statement, parameters, *args): + if parameters == [_bypass_no_param]: + constructor = getattr( + self.dialect.execution_ctx_cls, + constructor.__name__ + "_prepared", + constructor, + ) + return super()._execute_context( + dialect, constructor, statement, parameters, *args + ) + + def _execute_baked_query(self, bq, multiparams, params): + elem = bq.query + if self._has_events or self.engine._has_events: + for fn in self.dispatch.before_execute: + _, multiparams, params = fn(self, elem, multiparams, params) + + distilled_params = _distill_params(multiparams, params) + + ret = self._execute_context( + self.dialect, + self.dialect.execution_ctx_cls._init_baked_query, + bq.compiled_sql, + distilled_params, + + +## ... source file continues with no further Connection examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown index cde35f4b3..c23c00a2b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.default DefaultDialect code examples category: page slug: sqlalchemy-engine-default-defaultdialect-examples -sortorder: 500031000 +sortorder: 500031018 toc: False sidebartitle: sqlalchemy.engine.default DefaultDialect meta: Python example code for the DefaultDialect class from the sqlalchemy.engine.default module of the SQLAlchemy project. @@ -22,52 +22,22 @@ database schema changes. The Alembic project is open sourced under the ```python # api.py -"""Provide the 'autogenerate' feature which can produce migration operations -automatically.""" - -import contextlib - -from sqlalchemy import inspect - -from . import compare -from . import render -from .. import util -from ..operations import ops - - -def compare_metadata(context, metadata): - """Compare a database schema to that given in a - :class:`-sqlalchemy.schema.MetaData` instance. - - The database connection is presented in the context - of a :class:`.MigrationContext` object, which - provides database connectivity as well as optional - comparison functions to use for datatypes and - server defaults - see the "autogenerate" arguments - at :meth:`.EnvironmentContext.configure` - for details on these. - - The return format is a list of "diff" directives, - each representing individual differences:: - - from alembic.migration import MigrationContext - from alembic.autogenerate import compare_metadata + ) + compare._populate_migration_script(autogen_context, migration_script) -## ... source file abbreviated to get to DefaultDialect examples ... + return migration_script +def render_python_code( + up_or_down_op, + sqlalchemy_module_prefix="sa.", + alembic_module_prefix="op.", + render_as_batch=False, imports=(), render_item=None, migration_context=None, ): - """Render Python code given an :class:`.UpgradeOps` or - :class:`.DowngradeOps` object. - - This is a convenience function that can be used to test the - autogenerate output of a user-defined :class:`.MigrationScript` structure. - - """ opts = { "sqlalchemy_module_prefix": sqlalchemy_module_prefix, "alembic_module_prefix": alembic_module_prefix, @@ -91,7 +61,6 @@ def compare_metadata(context, metadata): def _render_migration_diffs(context, template_args): - """legacy, used by test_autogen_composition at the moment""" autogen_context = AutogenContext(context) @@ -105,10 +74,10 @@ def _render_migration_diffs(context, template_args): ) render._render_python_into_templatevars( + autogen_context, migration_script, template_args ## ... source file continues with no further DefaultDialect examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown new file mode 100644 index 000000000..5680a677d --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown @@ -0,0 +1,115 @@ +title: sqlalchemy.engine default code examples +category: page +slug: sqlalchemy-engine-default-examples +sortorder: 500031016 +toc: False +sidebartitle: sqlalchemy.engine default +meta: Python example code for the default function from the sqlalchemy.engine module of the SQLAlchemy project. + + +default is a function within the sqlalchemy.engine module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / testing / assertions.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/testing/assertions.py) + +```python +# assertions.py +from __future__ import absolute_import + +import re + +from sqlalchemy import util +~~from sqlalchemy.engine import default +from sqlalchemy.testing.assertions import _expect_warnings +from sqlalchemy.testing.assertions import eq_ # noqa +from sqlalchemy.testing.assertions import is_ # noqa +from sqlalchemy.testing.assertions import is_false # noqa +from sqlalchemy.testing.assertions import is_not_ # noqa +from sqlalchemy.testing.assertions import is_true # noqa +from sqlalchemy.testing.assertions import ne_ # noqa +from sqlalchemy.util import decorator + +from ..util.compat import py3k + + +def assert_raises(except_cls, callable_, *args, **kw): + try: + callable_(*args, **kw) + success = False + except except_cls: + success = True + + assert success, "Callable did not raise an exception" + + +def assert_raises_message(except_cls, msg, callable_, *args, **kwargs): + try: + + +## ... source file abbreviated to get to default examples ... + + + e, + ) + print(util.text_type(e).encode("utf-8")) + + +def eq_ignore_whitespace(a, b, msg=None): + + a = re.sub(r"^\s+?|\n", "", a) + a = re.sub(r" {2,}", " ", a) + b = re.sub(r"^\s+?|\n", "", b) + b = re.sub(r" {2,}", " ", b) + + if py3k: + b = re.sub(r"!U", "", b) + else: + b = re.sub(r"!U", "u", b) + + assert a == b, msg or "%r != %r" % (a, b) + + +_dialect_mods = {} + + +def _get_dialect(name): + if name is None or name == "default": +~~ return default.DefaultDialect() + else: + try: + dialect_mod = _dialect_mods[name] + except KeyError: + dialect_mod = getattr( + __import__("sqlalchemy.dialects.%s" % name).dialects, name + ) + _dialect_mods[name] = dialect_mod + d = dialect_mod.dialect() + if name == "postgresql": + d.implicit_returning = True + elif name == "mssql": + d.legacy_schema_aliasing = False + return d + + +def expect_warnings(*messages, **kw): + return _expect_warnings(Warning, messages, **kw) + + +def emits_python_deprecation_warning(*messages): + + @decorator + def decorate(fn, *args, **kw): + + +## ... source file continues with no further default examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown new file mode 100644 index 000000000..f8b2ff3f2 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown @@ -0,0 +1,122 @@ +title: sqlalchemy.engine Engine code examples +category: page +slug: sqlalchemy-engine-engine-examples +sortorder: 500031015 +toc: False +sidebartitle: sqlalchemy.engine Engine +meta: Python example code for the Engine class from the sqlalchemy.engine module of the SQLAlchemy project. + + +Engine is a class within the sqlalchemy.engine module of the SQLAlchemy project. + + +## Example 1 from GINO +[GINO](https://github.com/fantix/gino) +([project documentation](https://python-gino.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/gino/)) +is an [object-relational mapper (ORM)](/object-relational-mappers-orms.html) +built on SQLAlchemy that is non-blocking and therefore designed to work properly +with asynchronously-run code, for example, an application written with +[asyncio](https://docs.python.org/3/library/asyncio.html). + +GINO is open sourced under the [BSD License](https://github.com/python-gino/gino/blob/master/LICENSE). + +[**GINO / src/gino / engine.py**](https://github.com/python-gino/gino/blob/master/src/gino/./engine.py) + +```python +# engine.py +import asyncio +import collections +import functools +import sys +import time +from contextvars import ContextVar + +from sqlalchemy.cutils import _distill_params +~~from sqlalchemy.engine import Engine, Connection +from sqlalchemy.sql import schema + +from .aiocontextvars import patch_asyncio +from .exceptions import MultipleResultsFound, NoResultFound +from .transaction import GinoTransaction + +patch_asyncio() + + +class _BaseDBAPIConnection: + _reset_agent = None + gino_conn = None + + def __init__(self, cursor_cls): + self._cursor_cls = cursor_cls + self._closed = False + + def commit(self): + pass + + def cursor(self): + return self._cursor_cls(self) + + @property + + +## ... source file abbreviated to get to Engine examples ... + + + return super()._execute_context( + dialect, constructor, statement, parameters, *args + ) + + def _execute_baked_query(self, bq, multiparams, params): + elem = bq.query + if self._has_events or self.engine._has_events: + for fn in self.dispatch.before_execute: + _, multiparams, params = fn(self, elem, multiparams, params) + + distilled_params = _distill_params(multiparams, params) + + ret = self._execute_context( + self.dialect, + self.dialect.execution_ctx_cls._init_baked_query, + bq.compiled_sql, + distilled_params, + bq, + distilled_params, + ) + if self._has_events or self.engine._has_events: + self.dispatch.after_execute(self, elem, multiparams, params, ret) + return ret + + +~~class _SAEngine(Engine): + _connection_cls = _SAConnection + + def __init__(self, dialect, **kwargs): + super().__init__(None, dialect, None, **kwargs) + + +class _AcquireContext: + __slots__ = ["_acquire", "_conn"] + + def __init__(self, acquire): + self._acquire = acquire + self._conn = None + + async def __aenter__(self): + self._conn = await self._acquire() + return self._conn + + async def __aexit__(self, exc_type, exc_val, exc_tb): + conn, self._conn = self._conn, None + await conn.release() + + def __await__(self): + return self._acquire().__await__() + + + +## ... source file continues with no further Engine examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown index 30891179e..b7f86cb16 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.strategies EngineStrategy code examples category: page slug: sqlalchemy-engine-strategies-enginestrategy-examples -sortorder: 500031000 +sortorder: 500031019 toc: False sidebartitle: sqlalchemy.engine.strategies EngineStrategy meta: Python example code for the EngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. @@ -37,14 +37,6 @@ from .engine import GinoEngine ~~class GinoStrategy(EngineStrategy): - """A SQLAlchemy engine strategy for GINO. - - This strategy is initialized automatically as :mod:`gino` is imported. - - If :func:`sqlalchemy.create_engine` uses ``strategy="gino"``, it will return a - :class:`-collections.abc.Coroutine`, and treat URL prefix ``postgresql://`` or - ``postgres://`` as ``postgresql+asyncpg://``. - """ name = "gino" engine_cls = GinoEngine @@ -62,9 +54,16 @@ from .engine import GinoEngine pop_kwarg = kwargs.pop + dialect_args = {} + for k in util.get_cls_kwargs(dialect_cls).union( + getattr(dialect_cls, "init_kwargs", set()) + ): + if k in kwargs: + dialect_args[k] = pop_kwarg(k) -## ... source file continues with no further EngineStrategy examples... +## ... source file continues with no further EngineStrategy examples... + ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown index 258f3f256..6b5e671ba 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.strategies MockEngineStrategy code examples category: page slug: sqlalchemy-engine-strategies-mockenginestrategy-examples -sortorder: 500031001 +sortorder: 500031020 toc: False sidebartitle: sqlalchemy.engine.strategies MockEngineStrategy meta: Python example code for the MockEngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. @@ -61,58 +61,7 @@ class _ProxyTransaction(object): -## ... source file abbreviated to get to MockEngineStrategy examples ... - - - except AttributeError: - return False - else: - return meth() - - def execute(self, sql, execution_options=None): - """Execute a SQL construct or string statement. - - The underlying execution mechanics are used, that is - if this is "offline mode" the SQL is written to the - output buffer, otherwise the SQL is emitted on - the current SQLAlchemy connection. - - """ - self.impl._exec(sql, execution_options) - - def _stdout_connection(self, connection): - def dump(construct, *multiparams, **params): - self.impl._exec(construct) - -~~ return MockEngineStrategy.MockConnection(self.dialect, dump) - - @property - def bind(self): - """Return the current "bind". - - In online mode, this is an instance of - :class:`sqlalchemy.engine.Connection`, and is suitable - for ad-hoc execution of any kind of usage described - in :ref:`sqlexpression_toplevel` as well as - for usage with the :meth:`sqlalchemy.schema.Table.create` - and :meth:`sqlalchemy.schema.MetaData.create_all` methods - of :class:`-sqlalchemy.schema.Table`, - :class:`-sqlalchemy.schema.MetaData`. - - Note that when "standard output" mode is enabled, - this bind will be a "mock" connection handler that cannot - return results and is only appropriate for a very limited - subset of commands. - - """ - return self.connection - - @property - def config(self): - - ## ... source file continues with no further MockEngineStrategy examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown index 13ea2be98..191d4322a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.url make_url code examples category: page slug: sqlalchemy-engine-url-make-url-examples -sortorder: 500031000 +sortorder: 500031021 toc: False sidebartitle: sqlalchemy.engine.url make_url meta: Python example code for the make_url function from the sqlalchemy.engine.url module of the SQLAlchemy project. @@ -76,6 +76,11 @@ def _make_table(db): ## ... source file abbreviated to get to make_url examples ... +class _EngineConnector: + def __init__(self, sa, app, bind=None): + self._sa = sa + self._app = app + self._engine = None self._connected_for = None self._bind = bind self._lock = Lock() @@ -117,229 +122,18 @@ def _make_table(db): if echo: options["echo"] = echo - # Give the config options set by a developer explicitly priority - # over decisions FSA makes. options.update(self._app.config["SQLALCHEMY_ENGINE_OPTIONS"]) - # Give options set in SQLAlchemy.__init__() ultimate priority + options.update(self._sa._engine_options) + return options -## ... source file continues with no further make_url examples... - - -``` - - -## Example 2 from sqlalchemy-utils -[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) -([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) -and -[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) -is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building -projects that involve more specific storage requirements such as -[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). -The wide array of -[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) -includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) -and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). - -[**sqlalchemy-utils / sqlalchemy_utils / functions / database.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/functions/database.py) - -```python -# database.py -try: - from collections.abc import Mapping, Sequence -except ImportError: # For python 2.7 support - from collections import Mapping, Sequence -import itertools -import os -from copy import copy - -import sqlalchemy as sa -~~from sqlalchemy.engine.url import make_url -from sqlalchemy.exc import OperationalError, ProgrammingError - -from ..utils import starts_with -from .orm import quote - - -def escape_like(string, escape_char='*'): - """ - Escape the string paremeter used in SQL LIKE expressions. - - :: - - from sqlalchemy_utils import escape_like - - - query = session.query(User).filter( - User.name.ilike(escape_like('John')) - ) - - - :param string: a string to escape - :param escape_char: escape character - """ - return ( - - -## ... source file abbreviated to get to make_url examples ... - - - database_exists(engine.url) #=> True - - """ - - def get_scalar_result(engine, sql): - result_proxy = engine.execute(sql) - result = result_proxy.scalar() - result_proxy.close() - engine.dispose() - return result - - def sqlite_file_exists(database): - if not os.path.isfile(database) or os.path.getsize(database) < 100: - return False - - with open(database, 'rb') as f: - header = f.read(100) - - return header[:16] == b'SQLite format 3\x00' - -~~ url = copy(make_url(url)) - database = url.database - if url.drivername.startswith('postgres'): - url.database = 'postgres' - else: - url.database = None - - engine = sa.create_engine(url) - - if engine.dialect.name == 'postgresql': - text = "SELECT 1 FROM pg_database WHERE datname='%s'" % database - return bool(get_scalar_result(engine, text)) - - elif engine.dialect.name == 'mysql': - text = ("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA " - "WHERE SCHEMA_NAME = '%s'" % database) - return bool(get_scalar_result(engine, text)) - - elif engine.dialect.name == 'sqlite': - if database: - return database == ':memory:' or sqlite_file_exists(database) - else: - # The default SQLAlchemy database is in memory, - # and :memory is not required, thus we should support that use-case - return True - - -## ... source file abbreviated to get to make_url examples ... - - - - :param url: A SQLAlchemy engine URL. - :param encoding: The encoding to create the database as. - :param template: - The name of the template from which to create the new database. At the - moment only supported by PostgreSQL driver. - - To create a database, you can pass a simple URL that would have - been passed to ``create_engine``. :: - - create_database('postgresql://postgres@localhost/name') - - You may also pass the url from an existing engine. :: - - create_database(engine.url) - - Has full support for mysql, postgres, and sqlite. In theory, - other database engines should be supported. - """ - -~~ url = copy(make_url(url)) - - database = url.database - - if url.drivername.startswith('postgres'): - url.database = 'postgres' - elif url.drivername.startswith('mssql'): - url.database = 'master' - elif not url.drivername.startswith('sqlite'): - url.database = None - - if url.drivername == 'mssql+pyodbc': - engine = sa.create_engine(url, connect_args={'autocommit': True}) - elif url.drivername == 'postgresql+pg8000': - engine = sa.create_engine(url, isolation_level='AUTOCOMMIT') - else: - engine = sa.create_engine(url) - result_proxy = None - - if engine.dialect.name == 'postgresql': - if not template: - template = 'template1' - - text = "CREATE DATABASE {0} ENCODING '{1}' TEMPLATE {2}".format( - quote(engine, database), - - -## ... source file abbreviated to get to make_url examples ... - - - result_proxy = engine.execute(text) - - if result_proxy is not None: - result_proxy.close() - engine.dispose() - - -def drop_database(url): - """Issue the appropriate DROP DATABASE statement. - - :param url: A SQLAlchemy engine URL. - - Works similar to the :ref:`create_database` method in that both url text - and a constructed url are accepted. :: - - drop_database('postgresql://postgres@localhost/name') - drop_database(engine.url) - - """ - -~~ url = copy(make_url(url)) - - database = url.database - - if url.drivername.startswith('postgres'): - url.database = 'postgres' - elif url.drivername.startswith('mssql'): - url.database = 'master' - elif not url.drivername.startswith('sqlite'): - url.database = None - - if url.drivername == 'mssql+pyodbc': - engine = sa.create_engine(url, connect_args={'autocommit': True}) - elif url.drivername == 'postgresql+pg8000': - engine = sa.create_engine(url, isolation_level='AUTOCOMMIT') - else: - engine = sa.create_engine(url) - conn_resource = None - - if engine.dialect.name == 'sqlite' and database != ':memory:': - if database: - os.remove(database) - - elif ( - engine.dialect.name == 'postgresql' and - ## ... source file continues with no further make_url examples... - ``` -## Example 3 from GINO +## Example 2 from GINO [GINO](https://github.com/fantix/gino) ([project documentation](https://python-gino.readthedocs.io/en/latest/) and @@ -370,43 +164,48 @@ from .schema import GinoSchemaVisitor, patch_schema class GinoExecutor: - """ - The default ``gino`` extension on - :class:`-sqlalchemy.sql.expression.Executable` constructs for implicit - execution. - Instances of this class are created when visiting the ``gino`` property of - :class:`-sqlalchemy.sql.expression.Executable` instances (also referred as - queries or clause elements), for example:: + __slots__ = ("_query",) + + def __init__(self, query): + self._query = query - await User.query.gino.first() + @property + def query(self): + return self._query - This allows GINO to add the asynchronous query APIs (:meth:`all`, - :meth:`first`, :meth:`one`, :meth:`one_or_none`, :meth:`scalar`, + def model(self, model): + if model is not None: + model = weakref.ref(model) ## ... source file abbreviated to get to make_url examples ... + if not hasattr(self, key) and key not in self.no_delegate: + setattr(self, key, getattr(mod, key)) + if ext: + if query_ext: + Executable.gino = property(self.query_executor) + if schema_ext: + SchemaItem.gino = property(self.schema_visitor) + patch_schema(self) + + @property + def Model(self): + return self._model + + @property + def bind(self): + if self._bind is None: return _PlaceHolder(UninitializedError("Gino engine is not initialized.")) return self._bind - # noinspection PyMethodOverriding,PyAttributeOutsideInit @bind.setter def bind(self, bind): self._bind = bind async def set_bind(self, bind, loop=None, **kwargs): - """ - Bind self to the given :class:`-.engine.GinoEngine` and return it. - - If the given ``bind`` is a string or - :class:`-sqlalchemy.engine.url.URL`, all arguments will be sent to - :func:`-gino.create_engine` to create a new engine, and return it. - - :return: :class:`-.engine.GinoEngine` - - """ if isinstance(bind, str): ~~ bind = make_url(bind) if isinstance(bind, URL): @@ -417,26 +216,25 @@ class GinoExecutor: return bind def pop_bind(self): - """ - Unbind self, and return the bound engine. - - This is usually used in a chained call to close the engine:: - - await db.pop_bind().close() - - :return: :class:`-.engine.GinoEngine` or ``None`` if self is not bound. - - """ from .bakery import Bakery self._bakery = Bakery() bind, self.bind = self.bind, None return bind + def with_bind(self, bind, loop=None, **kwargs): + return _BindContext(self, bind, loop, kwargs) + def __await__(self): + async def init(): + await self.set_bind(self.bind) + return self + + return init().__await__() -## ... source file continues with no further make_url examples... +## ... source file continues with no further make_url examples... + ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown new file mode 100644 index 000000000..be088c4df --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown @@ -0,0 +1,180 @@ +title: sqlalchemy.engine url code examples +category: page +slug: sqlalchemy-engine-url-examples +sortorder: 500031017 +toc: False +sidebartitle: sqlalchemy.engine url +meta: Python example code for the url function from the sqlalchemy.engine module of the SQLAlchemy project. + + +url is a function within the sqlalchemy.engine module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / util / messaging.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/util/messaging.py) + +```python +# messaging.py +import logging +import sys +import textwrap +import warnings + +~~from sqlalchemy.engine import url + +from .compat import binary_type +from .compat import collections_abc +from .compat import py27 +from .compat import string_types + +log = logging.getLogger(__name__) + +if py27: + logging.getLogger("alembic").addHandler(logging.NullHandler()) + + +try: + import fcntl + import termios + import struct + + ioctl = fcntl.ioctl(0, termios.TIOCGWINSZ, struct.pack("HHHH", 0, 0, 0, 0)) + _h, TERMWIDTH, _hp, _wp = struct.unpack("HHHH", ioctl) + if TERMWIDTH <= 0: # can occur if running in emacs pseudo-tty + TERMWIDTH = None +except (ImportError, IOError): + TERMWIDTH = None + + + +## ... source file abbreviated to get to url examples ... + + + try: + stream.write(t) + except IOError: + break + + +def status(_statmsg, fn, *arg, **kw): + newline = kw.pop("newline", False) + msg(_statmsg + " ...", newline, True) + try: + ret = fn(*arg, **kw) + write_outstream(sys.stdout, " done\n") + return ret + except: + write_outstream(sys.stdout, " FAILED\n") + raise + + +def err(message): + log.error(message) + msg("FAILED: %s" % message) + sys.exit(-1) + + +def obfuscate_url_pw(u): +~~ u = url.make_url(u) + if u.password: + u.password = "XXXXX" + return str(u) + + +def warn(msg, stacklevel=2): + warnings.warn(msg, UserWarning, stacklevel=stacklevel) + + +def msg(msg, newline=True, flush=False): + if TERMWIDTH is None: + write_outstream(sys.stdout, msg) + if newline: + write_outstream(sys.stdout, "\n") + else: + lines = textwrap.wrap(msg, TERMWIDTH) + if len(lines) > 1: + for line in lines[0:-1]: + write_outstream(sys.stdout, " ", line, "\n") + write_outstream(sys.stdout, " ", lines[-1], ("\n" if newline else "")) + if flush: + sys.stdout.flush() + + + + +## ... source file continues with no further url examples... + +``` + + +## Example 2 from GINO +[GINO](https://github.com/fantix/gino) +([project documentation](https://python-gino.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/gino/)) +is an [object-relational mapper (ORM)](/object-relational-mappers-orms.html) +built on SQLAlchemy that is non-blocking and therefore designed to work properly +with asynchronously-run code, for example, an application written with +[asyncio](https://docs.python.org/3/library/asyncio.html). + +GINO is open sourced under the [BSD License](https://github.com/python-gino/gino/blob/master/LICENSE). + +[**GINO / src/gino / strategies.py**](https://github.com/python-gino/gino/blob/master/src/gino/./strategies.py) + +```python +# strategies.py +import asyncio +from copy import copy + +~~from sqlalchemy.engine import url +from sqlalchemy import util +from sqlalchemy.engine.strategies import EngineStrategy + +from .engine import GinoEngine + + +class GinoStrategy(EngineStrategy): + + name = "gino" + engine_cls = GinoEngine + + async def create(self, name_or_url, loop=None, **kwargs): + engine_cls = self.engine_cls +~~ u = url.make_url(name_or_url) + if loop is None: + loop = asyncio.get_event_loop() + if u.drivername in {"postgresql", "postgres"}: + u = copy(u) + u.drivername = "postgresql+asyncpg" + + dialect_cls = u.get_dialect() + + pop_kwarg = kwargs.pop + + dialect_args = {} + for k in util.get_cls_kwargs(dialect_cls).union( + getattr(dialect_cls, "init_kwargs", set()) + ): + if k in kwargs: + dialect_args[k] = pop_kwarg(k) + + kwargs.pop("module", None) # unused + dbapi_args = {} + for k in util.get_func_kwargs(dialect_cls.dbapi): + if k in kwargs: + dbapi_args[k] = pop_kwarg(k) + dbapi = dialect_cls.dbapi(**dbapi_args) + dialect_args["dbapi"] = dbapi + + +## ... source file continues with no further url examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown index 97231ea13..c49de92da 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.events SchemaEventTarget code examples category: page slug: sqlalchemy-events-schemaeventtarget-examples -sortorder: 500031000 +sortorder: 500031022 toc: False sidebartitle: sqlalchemy.events SchemaEventTarget meta: Python example code for the SchemaEventTarget class from the sqlalchemy.events module of the SQLAlchemy project. @@ -62,6 +62,13 @@ class BatchOperationsImpl(object): ## ... source file abbreviated to get to SchemaEventTarget examples ... + self.table_kwargs = table_kwargs + self.temp_table_name = self._calc_temp_name(table.name) + self.new_table = None + + self.partial_reordering = partial_reordering # tuple of tuples + self.add_col_ordering = () # tuple of tuples + self.column_transfers = OrderedDict( (c.name, {"expr": c}) for c in self.table.c ) @@ -80,8 +87,6 @@ class BatchOperationsImpl(object): for c in self.table.c: c_copy = c.copy(schema=schema) c_copy.unique = c_copy.index = False - # ensure that the type object was copied, - # as we may need to modify it in-place ~~ if isinstance(c.type, SchemaEventTarget): assert c_copy.type is not c.type self.columns[c.name] = c_copy @@ -93,8 +98,6 @@ class BatchOperationsImpl(object): if _is_type_bound(const): continue elif self.reflected and isinstance(const, CheckConstraint): - # TODO: we are skipping reflected CheckConstraint because - # we have no way to determine _is_type_bound() for these. pass elif const.name: self.named_constraints[const.name] = const @@ -107,11 +110,25 @@ class BatchOperationsImpl(object): for k in self.table.kwargs: self.table_kwargs.setdefault(k, self.table.kwargs[k]) + def _adjust_self_columns_for_partial_reordering(self): + pairs = set() ## ... source file abbreviated to get to SchemaEventTarget examples ... + try: + for idx in self._gather_indexes_from_both_tables(): + op_impl.create_index(idx) + finally: + self.new_table.name = self.temp_table_name + + def alter_column( + self, + table_name, + column_name, + nullable=None, + server_default=False, name=None, type_=None, autoincrement=None, @@ -120,18 +137,11 @@ class BatchOperationsImpl(object): existing = self.columns[column_name] existing_transfer = self.column_transfers[column_name] if name is not None and name != column_name: - # note that we don't change '.key' - we keep referring - # to the renamed column by its old key in _create(). neat! existing.name = name existing_transfer["name"] = name if type_ is not None: type_ = sqltypes.to_instance(type_) - # old type is being discarded so turn off eventing - # rules. Alternatively we can - # erase the events set up by this type, but this is simpler. - # we also ignore the drop_constraint that will come here from - # Operations.implementation_for(alter_column) ~~ if isinstance(existing.type, SchemaEventTarget): existing.type._create_events = ( existing.type.create_constraint @@ -143,10 +153,6 @@ class BatchOperationsImpl(object): existing.type = type_ - # we *dont* however set events for the new type, because - # alter_column is invoked from - # Operations.implementation_for(alter_column) which already - # will emit an add_constraint() if nullable is not None: existing.nullable = nullable @@ -158,9 +164,12 @@ class BatchOperationsImpl(object): if autoincrement is not None: existing.autoincrement = bool(autoincrement) + def _setup_dependencies_for_add_column( + self, colname, insert_before, insert_after + ): + ## ... source file continues with no further SchemaEventTarget examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown index 3189a40b1..ae835f0d0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc DataError code examples category: page slug: sqlalchemy-exc-dataerror-examples -sortorder: 500031000 +sortorder: 500031023 toc: False sidebartitle: sqlalchemy.exc DataError meta: Python example code for the DataError class from the sqlalchemy.exc module of the SQLAlchemy project. @@ -16,7 +16,7 @@ DataError is a class within the sqlalchemy.exc module of the SQLAlchemy project. and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -28,22 +28,6 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # asserts.py -We can easily test the constraints by assert_* functions:: - - - from sqlalchemy_utils import ( - assert_nullable, - assert_non_nullable, - assert_max_length - ) - - assert_nullable(user, 'name') - assert_non_nullable(user, 'email') - assert_max_length(user, 'name', 200) - - # raises AssertionError because the max length of email is 255 - assert_max_length(user, 'email', 300) -""" from decimal import Decimal import sqlalchemy as sa @@ -75,58 +59,7 @@ def _expect_failing_update(obj, field, value, expected_exc): pass -## ... source file abbreviated to get to DataError examples ... - - - - -def _repeated_value(type_): - if isinstance(type_, ARRAY): - if isinstance(type_.item_type, sa.Integer): - return [0] - elif isinstance(type_.item_type, sa.String): - return [u'a'] - elif isinstance(type_.item_type, sa.Numeric): - return [Decimal('0')] - else: - raise TypeError('Unknown array item type') - else: - return u'a' - - -def _expected_exception(type_): - if isinstance(type_, ARRAY): - return IntegrityError - else: -~~ return DataError - - -def assert_nullable(obj, column): - """ - Assert that given column is nullable. This is checked by running an SQL - update that assigns given column as None. - - :param obj: SQLAlchemy declarative model object - :param column: Name of the column - """ - _expect_successful_update(obj, column, None, IntegrityError) - - -def assert_non_nullable(obj, column): - """ - Assert that given column is not nullable. This is checked by running an SQL - update that assigns given column as None. - - :param obj: SQLAlchemy declarative model object - :param column: Name of the column - """ - _expect_failing_update(obj, column, None, IntegrityError) - - - - ## ... source file continues with no further DataError examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown index 9c166a316..063ac6375 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc IntegrityError code examples category: page slug: sqlalchemy-exc-integrityerror-examples -sortorder: 500031001 +sortorder: 500031024 toc: False sidebartitle: sqlalchemy.exc IntegrityError meta: Python example code for the IntegrityError class from the sqlalchemy.exc module of the SQLAlchemy project. @@ -60,16 +60,27 @@ class Role(db.Model): 'Administrator': ( Permission.ADMINISTER, 'admin', + False # grants all permissions + ) + } + for r in roles: + role = Role.query.filter_by(name=r).first() ## ... source file abbreviated to get to IntegrityError examples ... + new_email = data.get('new_email') + if new_email is None: + return False + if self.query.filter_by(email=new_email).first() is not None: + return False + self.email = new_email + db.session.add(self) db.session.commit() return True def reset_password(self, token, new_password): - """Verify the new password for this user.""" s = Serializer(current_app.config['SECRET_KEY']) try: data = s.loads(token) @@ -84,7 +95,6 @@ class Role(db.Model): @staticmethod def generate_fake(count=100, **kwargs): - """Generate a number of fake users for testing.""" ~~ from sqlalchemy.exc import IntegrityError from random import seed, choice from faker import Faker @@ -128,8 +138,8 @@ def load_user(user_id): return User.query.get(int(user_id)) -## ... source file continues with no further IntegrityError examples... +## ... source file continues with no further IntegrityError examples... ``` @@ -140,7 +150,7 @@ def load_user(user_id): and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -152,22 +162,6 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # asserts.py -We can easily test the constraints by assert_* functions:: - - - from sqlalchemy_utils import ( - assert_nullable, - assert_non_nullable, - assert_max_length - ) - - assert_nullable(user, 'name') - assert_non_nullable(user, 'email') - assert_max_length(user, 'name', 200) - - # raises AssertionError because the max length of email is 255 - assert_max_length(user, 'email', 300) -""" from decimal import Decimal import sqlalchemy as sa @@ -199,96 +193,7 @@ def _expect_failing_update(obj, field, value, expected_exc): pass -## ... source file abbreviated to get to IntegrityError examples ... - - - session = sa.orm.object_session(obj) - session.rollback() - - -def _repeated_value(type_): - if isinstance(type_, ARRAY): - if isinstance(type_.item_type, sa.Integer): - return [0] - elif isinstance(type_.item_type, sa.String): - return [u'a'] - elif isinstance(type_.item_type, sa.Numeric): - return [Decimal('0')] - else: - raise TypeError('Unknown array item type') - else: - return u'a' - - -def _expected_exception(type_): - if isinstance(type_, ARRAY): -~~ return IntegrityError - else: - return DataError - - -def assert_nullable(obj, column): - """ - Assert that given column is nullable. This is checked by running an SQL - update that assigns given column as None. - - :param obj: SQLAlchemy declarative model object - :param column: Name of the column - """ - _expect_successful_update(obj, column, None, IntegrityError) - - -def assert_non_nullable(obj, column): - """ - Assert that given column is not nullable. This is checked by running an SQL - update that assigns given column as None. - - :param obj: SQLAlchemy declarative model object - :param column: Name of the column - """ - _expect_failing_update(obj, column, None, IntegrityError) - - -## ... source file abbreviated to get to IntegrityError examples ... - - - _repeated_value(type_) * max_length, - _expected_exception(type_) - ) - _expect_failing_update( - obj, - column, - _repeated_value(type_) * (max_length + 1), - _expected_exception(type_) - ) - - -def assert_min_value(obj, column, min_value): - """ - Assert that the given column must have a minimum value of `min_value`. - - :param obj: SQLAlchemy declarative model object - :param column: Name of the column - :param min_value: The minimum allowed value for given column - """ - _expect_successful_update(obj, column, min_value, IntegrityError) -~~ _expect_failing_update(obj, column, min_value - 1, IntegrityError) - - -def assert_max_value(obj, column, min_value): - """ - Assert that the given column must have a minimum value of `max_value`. - - :param obj: SQLAlchemy declarative model object - :param column: Name of the column - :param max_value: The maximum allowed value for given column - """ - _expect_successful_update(obj, column, min_value, IntegrityError) -~~ _expect_failing_update(obj, column, min_value + 1, IntegrityError) - - ## ... source file continues with no further IntegrityError examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown index 08dce6048..a51dadeac 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc InvalidRequestError code examples category: page slug: sqlalchemy-exc-invalidrequesterror-examples -sortorder: 500031002 +sortorder: 500031025 toc: False sidebartitle: sqlalchemy.exc InvalidRequestError meta: Python example code for the InvalidRequestError class from the sqlalchemy.exc module of the SQLAlchemy project. @@ -36,15 +36,6 @@ from .exceptions import GinoException class ColumnAttribute: - """The type of the column wrapper attributes on GINO models. - - This is the core utility to enable GINO models so that: - - * Accessing a column attribute on a model class returns the column itself - * Accessing a column attribute on a model instance returns the value for that column - - This utility is customizable by defining ``__attr_factory__`` in the model class. - """ def __init__(self, prop_name, column): self.prop_name = prop_name @@ -54,15 +45,29 @@ class ColumnAttribute: if instance is None: return self.column else: + return instance.__values__.get(self.prop_name) + + def __set__(self, instance, value): + instance.__values__[self.prop_name] = value + + def __delete__(self, instance): + raise AttributeError("Cannot delete value.") + + ## ... source file abbreviated to get to InvalidRequestError examples ... + updates[k] = sub_cls.__attr_factory__(k, v) + elif isinstance(v, (sa.Index, sa.Constraint)): + inspected_args.append(v) + elif isinstance(v, json_support.JSONProperty): + updates[k] = v + if table_name is None: return sub_cls._column_name_map = column_name_map - # handle __table_args__ table_args = updates.get( "__table_args__", getattr(sub_cls, "__table_args__", None) ) @@ -91,23 +96,22 @@ class ColumnAttribute: rv = sa.Table(table_name, sub_cls.__metadata__, *args, **table_kw) for k, v in updates.items(): setattr(sub_cls, k, v) + + json_prop_names = set() for each_cls in sub_cls.__mro__[::-1]: for k, v in each_cls.__dict__.items(): if isinstance(v, json_support.JSONProperty): + if not v.name: + v.name = k + json_prop_names.add(v.prop_name) json_col = getattr( sub_cls.__dict__.get(v.prop_name), "column", None ) if not isinstance(json_col, sa.Column) or not isinstance( json_col.type, sa.JSON - ): - raise AttributeError( - '{} "{}" requires a JSON[B] column "{}" ' - "which is not found or has a wrong type.".format( - type(v).__name__, v.name, v.prop_name, ## ... source file continues with no further InvalidRequestError examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown index 58381fa0a..86a9456a0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc NoInspectionAvailable code examples category: page slug: sqlalchemy-exc-noinspectionavailable-examples -sortorder: 500031003 +sortorder: 500031026 toc: False sidebartitle: sqlalchemy.exc NoInspectionAvailable meta: Python example code for the NoInspectionAvailable class from the sqlalchemy.exc module of the SQLAlchemy project. @@ -16,7 +16,7 @@ NoInspectionAvailable is a class within the sqlalchemy.exc module of the SQLAlch and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -55,20 +55,25 @@ def get_foreign_key_values(fk, obj): def group_foreign_keys(foreign_keys): - """ - Return a groupby iterator that groups given foreign keys by table. + foreign_keys = sorted( + foreign_keys, key=lambda key: key.constraint.table.name ## ... source file abbreviated to get to NoInspectionAvailable examples ... - This function does not support exotic mappers that use multiple tables + else: + ( + session.query(mapper.class_) + .filter_by(**old_values) + .update( + new_values, + 'evaluate' + ) + ) - .. seealso:: :func:`get_referencing_foreign_keys` - .. seealso:: :func:`merge_references` - .. versionadded: 0.26.0 - """ +def dependent_objects(obj, foreign_keys=None): if foreign_keys is None: foreign_keys = get_referencing_foreign_keys(obj) @@ -111,6 +116,5 @@ def _get_criteria(keys, class_, obj): ## ... source file continues with no further NoInspectionAvailable examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown index 2eab4498e..c065ffe2e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc OperationalError code examples category: page slug: sqlalchemy-exc-operationalerror-examples -sortorder: 500031004 +sortorder: 500031027 toc: False sidebartitle: sqlalchemy.exc OperationalError meta: Python example code for the OperationalError class from the sqlalchemy.exc module of the SQLAlchemy project. @@ -16,7 +16,7 @@ OperationalError is a class within the sqlalchemy.exc module of the SQLAlchemy p and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -45,36 +45,41 @@ from .orm import quote def escape_like(string, escape_char='*'): - """ - Escape the string paremeter used in SQL LIKE expressions. - - :: - - from sqlalchemy_utils import escape_like - + return ( + string + .replace(escape_char, escape_char * 2) + .replace('%', escape_char + '%') + .replace('_', escape_char + '_') + ) - query = session.query(User).filter( - User.name.ilike(escape_like('John')) - ) +def json_sql(value, scalars_to_json=True): + scalar_convert = sa.text + if scalars_to_json: + def scalar_convert(a): + return sa.func.to_json(sa.text(a)) - :param string: a string to escape - :param escape_char: escape character - """ - return ( - string + if isinstance(value, Mapping): + return sa.func.json_build_object( + *( + json_sql(v, scalars_to_json=False) ## ... source file abbreviated to get to OperationalError examples ... + text = "SELECT 1 FROM pg_database WHERE datname='%s'" % database + return bool(get_scalar_result(engine, text)) + + elif engine.dialect.name == 'mysql': + text = ("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA " + "WHERE SCHEMA_NAME = '%s'" % database) + return bool(get_scalar_result(engine, text)) elif engine.dialect.name == 'sqlite': if database: return database == ':memory:' or sqlite_file_exists(database) else: - # The default SQLAlchemy database is in memory, - # and :memory is not required, thus we should support that use-case return True else: @@ -96,27 +101,26 @@ def escape_like(string, escape_char='*'): def create_database(url, encoding='utf8', template=None): - """Issue the appropriate CREATE DATABASE statement. - - :param url: A SQLAlchemy engine URL. - :param encoding: The encoding to create the database as. - :param template: - The name of the template from which to create the new database. At the - moment only supported by PostgreSQL driver. - To create a database, you can pass a simple URL that would have - been passed to ``create_engine``. :: + url = copy(make_url(url)) - create_database('postgresql://postgres@localhost/name') + database = url.database - You may also pass the url from an existing engine. :: - - create_database(engine.url) + if url.drivername.startswith('postgres'): + url.database = 'postgres' + elif url.drivername.startswith('mssql'): + url.database = 'master' + elif not url.drivername.startswith('sqlite'): + url.database = None + if url.drivername == 'mssql+pyodbc': + engine = sa.create_engine(url, connect_args={'autocommit': True}) + elif url.drivername == 'postgresql+pg8000': + engine = sa.create_engine(url, isolation_level='AUTOCOMMIT') + else: ## ... source file continues with no further OperationalError examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown index 1e5d0c642..3348aba95 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc ProgrammingError code examples category: page slug: sqlalchemy-exc-programmingerror-examples -sortorder: 500031005 +sortorder: 500031028 toc: False sidebartitle: sqlalchemy.exc ProgrammingError meta: Python example code for the ProgrammingError class from the sqlalchemy.exc module of the SQLAlchemy project. @@ -16,7 +16,7 @@ ProgrammingError is a class within the sqlalchemy.exc module of the SQLAlchemy p and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -45,36 +45,41 @@ from .orm import quote def escape_like(string, escape_char='*'): - """ - Escape the string paremeter used in SQL LIKE expressions. - - :: - - from sqlalchemy_utils import escape_like - + return ( + string + .replace(escape_char, escape_char * 2) + .replace('%', escape_char + '%') + .replace('_', escape_char + '_') + ) - query = session.query(User).filter( - User.name.ilike(escape_like('John')) - ) +def json_sql(value, scalars_to_json=True): + scalar_convert = sa.text + if scalars_to_json: + def scalar_convert(a): + return sa.func.to_json(sa.text(a)) - :param string: a string to escape - :param escape_char: escape character - """ - return ( - string + if isinstance(value, Mapping): + return sa.func.json_build_object( + *( + json_sql(v, scalars_to_json=False) ## ... source file abbreviated to get to ProgrammingError examples ... + text = "SELECT 1 FROM pg_database WHERE datname='%s'" % database + return bool(get_scalar_result(engine, text)) + + elif engine.dialect.name == 'mysql': + text = ("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA " + "WHERE SCHEMA_NAME = '%s'" % database) + return bool(get_scalar_result(engine, text)) elif engine.dialect.name == 'sqlite': if database: return database == ':memory:' or sqlite_file_exists(database) else: - # The default SQLAlchemy database is in memory, - # and :memory is not required, thus we should support that use-case return True else: @@ -96,27 +101,26 @@ def escape_like(string, escape_char='*'): def create_database(url, encoding='utf8', template=None): - """Issue the appropriate CREATE DATABASE statement. - - :param url: A SQLAlchemy engine URL. - :param encoding: The encoding to create the database as. - :param template: - The name of the template from which to create the new database. At the - moment only supported by PostgreSQL driver. - To create a database, you can pass a simple URL that would have - been passed to ``create_engine``. :: + url = copy(make_url(url)) - create_database('postgresql://postgres@localhost/name') + database = url.database - You may also pass the url from an existing engine. :: - - create_database(engine.url) + if url.drivername.startswith('postgres'): + url.database = 'postgres' + elif url.drivername.startswith('mssql'): + url.database = 'master' + elif not url.drivername.startswith('sqlite'): + url.database = None + if url.drivername == 'mssql+pyodbc': + engine = sa.create_engine(url, connect_args={'autocommit': True}) + elif url.drivername == 'postgresql+pg8000': + engine = sa.create_engine(url, isolation_level='AUTOCOMMIT') + else: ## ... source file continues with no further ProgrammingError examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown index 173a4af63..7239b8da7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.automap automap_base code examples category: page slug: sqlalchemy-ext-automap-automap-base-examples -sortorder: 500031000 +sortorder: 500031030 toc: False sidebartitle: sqlalchemy.ext.automap automap_base meta: Python example code for the automap_base function from the sqlalchemy.ext.automap module of the SQLAlchemy project. @@ -30,13 +30,10 @@ The sandman2 project is provided under the ```python # model.py -"""Module containing code related to *sandman2* ORM models.""" -# Standard library imports import datetime from decimal import Decimal -# Third-party imports from sqlalchemy.inspection import inspect from flask_sqlalchemy import SQLAlchemy # pylint: disable=import-error,no-name-in-module ~~from sqlalchemy.ext.automap import automap_base @@ -46,39 +43,44 @@ db = SQLAlchemy() class Model(object): - """The sandman2 Model class is the base class for all RESTful resources. - There is a one-to-one mapping between a table in the database and a - :class:`sandman2.model.Model`. - """ - #: The relative URL this resource should live at. __url__ = None - #: The API version of this resource (not yet used). __version__ = '1' - #: The HTTP methods this resource supports (default=all). __methods__ = { 'GET', 'POST', 'PUT', 'PATCH', 'DELETE', + 'HEAD', + 'OPTIONS' + } + + @classmethod + def required(cls): + columns = [] ## ... source file abbreviated to get to automap_base examples ... + instance = getattr(self, relationship.key) + if instance: + link_dict[str(relationship.key)] = instance.resource_uri() + return link_dict + + def resource_uri(self): + return self.__url__ + '/' + str(getattr(self, self.primary_key())) + + def update(self, attributes): + for attribute in attributes: setattr(self, attribute, attributes[attribute]) return self @classmethod def description(cls): - """Return a field->data type dictionary describing this model - as reported by the database. - - :rtype: dict - """ description = {} for column in cls.__table__.columns: # pylint: disable=no-member @@ -92,8 +94,8 @@ DeclarativeModel = declarative_base(cls=(db.Model, Model)) ~~AutomapModel = automap_base(DeclarativeModel) -## ... source file continues with no further automap_base examples... +## ... source file continues with no further automap_base examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown index 38f1df941..6456ae517 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.compiler compiles code examples category: page slug: sqlalchemy-ext-compiler-compiles-examples -sortorder: 500031000 +sortorder: 500031031 toc: False sidebartitle: sqlalchemy.ext.compiler compiles meta: Python example code for the compiles function from the sqlalchemy.ext.compiler module of the SQLAlchemy project. @@ -59,12 +59,17 @@ sqla_120 = _vers >= (1, 2, 0) ## ... source file abbreviated to get to compiles examples ... - is the same length as the .expressions collection. Ultimately - SQLAlchemy should support text() expressions in indexes. + if isinstance(text_, compat.string_types): + c = Column(text_, sqltypes.NULLTYPE) + table.append_column(c) + return c + elif isinstance(text_, TextClause): + return _textual_index_element(table, text_) + else: + raise ValueError("String or text() construct expected") - See SQLAlchemy issue 3174. - """ +class _textual_index_element(sql.ColumnElement): __visit_name__ = "_textual_idx_element" @@ -112,12 +117,11 @@ def _get_constraint_final_name(constraint, dialect): if constraint.name is None: return None elif sqla_14: - # for SQLAlchemy 1.4 we would like to have the option to expand + return dialect.identifier_preparer.format_constraint( ## ... source file continues with no further compiles examples... - ``` @@ -127,7 +131,7 @@ def _get_constraint_final_name(constraint, dialect): and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -201,8 +205,8 @@ def compile_asterisk(element, compiler, **kw): return '%s.*' % quote(compiler.dialect, element.selectable.name) -## ... source file continues with no further compiles examples... +## ... source file continues with no further compiles examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown new file mode 100644 index 000000000..220bcde50 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown @@ -0,0 +1,78 @@ +title: sqlalchemy.ext compiler code examples +category: page +slug: sqlalchemy-ext-compiler-examples +sortorder: 500031029 +toc: False +sidebartitle: sqlalchemy.ext compiler +meta: Python example code for the compiler function from the sqlalchemy.ext module of the SQLAlchemy project. + + +compiler is a function within the sqlalchemy.ext module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / view.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/./view.py) + +```python +# view.py +import sqlalchemy as sa +~~from sqlalchemy.ext import compiler +from sqlalchemy.schema import DDLElement, PrimaryKeyConstraint + + +class CreateView(DDLElement): + def __init__(self, name, selectable, materialized=False): + self.name = name + self.selectable = selectable + self.materialized = materialized + + +@compiler.compiles(CreateView) +def compile_create_materialized_view(element, compiler, **kw): + return 'CREATE {}VIEW {} AS {}'.format( + 'MATERIALIZED ' if element.materialized else '', + element.name, +~~ compiler.sql_compiler.process(element.selectable, literal_binds=True), + ) + + +class DropView(DDLElement): + def __init__(self, name, materialized=False, cascade=True): + self.name = name + self.materialized = materialized + self.cascade = cascade + + +@compiler.compiles(DropView) +def compile_drop_materialized_view(element, compiler, **kw): + return 'DROP {}VIEW IF EXISTS {} {}'.format( + 'MATERIALIZED ' if element.materialized else '', + element.name, + 'CASCADE' if element.cascade else '' + ) + + +def create_table_from_selectable( + name, + selectable, + indexes=None, + metadata=None, + + +## ... source file continues with no further compiler examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown new file mode 100644 index 000000000..b39c901de --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown @@ -0,0 +1,227 @@ +title: sqlalchemy.ext.declarative declarative_base code examples +category: page +slug: sqlalchemy-ext-declarative-declarative-base-examples +sortorder: 500031033 +toc: False +sidebartitle: sqlalchemy.ext.declarative declarative_base +meta: Python example code for the declarative_base function from the sqlalchemy.ext.declarative module of the SQLAlchemy project. + + +declarative_base is a function within the sqlalchemy.ext.declarative module of the SQLAlchemy project. + + +## Example 1 from flask-sqlalchemy +[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) +([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) +and +[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a +[Flask](/flask.html) extension that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy +provides helper functions that reduce the amount of common boilerplate +code that you have to frequently write yourself if you did not use this +library when combining Flask with SQLAlchemy. + +flask-sqlalchemy is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). + +[**flask-sqlalchemy / src/flask_sqlalchemy / __init__.py**](https://github.com/pallets/flask-sqlalchemy/blob/master/src/flask_sqlalchemy/./__init__.py) + +```python +# __init__.py +import functools +import os +import sys +import warnings +from math import ceil +from operator import itemgetter +from threading import Lock +from time import perf_counter + +import sqlalchemy +from flask import _app_ctx_stack +from flask import abort +from flask import current_app +from flask import request +from flask.signals import Namespace +from sqlalchemy import event +from sqlalchemy import inspect +from sqlalchemy import orm +from sqlalchemy.engine.url import make_url +~~from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.declarative import DeclarativeMeta +from sqlalchemy.orm.exc import UnmappedClassError +from sqlalchemy.orm.session import Session as SessionBase + +from .model import DefaultMeta +from .model import Model + +__version__ = "3.0.0.dev" + +_signals = Namespace() +models_committed = _signals.signal("models-committed") +before_models_committed = _signals.signal("before-models-committed") + + +def _make_table(db): + def _make_table(*args, **kwargs): + if len(args) > 1 and isinstance(args[1], db.Column): + args = (args[0], db.metadata) + args[1:] + info = kwargs.pop("info", None) or {} + info.setdefault("bind_key", None) + kwargs["info"] = info + return sqlalchemy.Table(*args, **kwargs) + + return _make_table + + +## ... source file abbreviated to get to declarative_base examples ... + + + _include_sqlalchemy(self, query_class) + + if app is not None: + self.init_app(app) + + @property + def metadata(self): + + return self.Model.metadata + + def create_scoped_session(self, options=None): + + if options is None: + options = {} + + scopefunc = options.pop("scopefunc", _app_ctx_stack.__ident_func__) + options.setdefault("query_cls", self.Query) + return orm.scoped_session(self.create_session(options), scopefunc=scopefunc) + + def create_session(self, options): + + return orm.sessionmaker(class_=SignallingSession, db=self, **options) + + def make_declarative_base(self, model, metadata=None): + if not isinstance(model, DeclarativeMeta): +~~ model = declarative_base( + cls=model, name="Model", metadata=metadata, metaclass=DefaultMeta + ) + + if metadata is not None and model.metadata is not metadata: + model.metadata = metadata + + if not getattr(model, "query_class", None): + model.query_class = self.Query + + model.query = _QueryProperty(self) + return model + + def init_app(self, app): + + if not ( + app.config.get("SQLALCHEMY_DATABASE_URI") + or app.config.get("SQLALCHEMY_BINDS") + ): + raise RuntimeError( + "Either SQLALCHEMY_DATABASE_URI or SQLALCHEMY_BINDS needs to be set." + ) + + app.config.setdefault("SQLALCHEMY_DATABASE_URI", None) + app.config.setdefault("SQLALCHEMY_BINDS", None) + + +## ... source file continues with no further declarative_base examples... + +``` + + +## Example 2 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / model.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./model.py) + +```python +# model.py + +import datetime +from decimal import Decimal + +from sqlalchemy.inspection import inspect +from flask_sqlalchemy import SQLAlchemy # pylint: disable=import-error,no-name-in-module +from sqlalchemy.ext.automap import automap_base +~~from sqlalchemy.ext.declarative import declarative_base + +db = SQLAlchemy() + +class Model(object): + + + __url__ = None + + __version__ = '1' + + __methods__ = { + 'GET', + 'POST', + 'PUT', + 'PATCH', + 'DELETE', + 'HEAD', + 'OPTIONS' + } + + @classmethod + def required(cls): + columns = [] + for column in cls.__table__.columns: # pylint: disable=no-member + + +## ... source file abbreviated to get to declarative_base examples ... + + + if 'collection' not in relationship.key: + instance = getattr(self, relationship.key) + if instance: + link_dict[str(relationship.key)] = instance.resource_uri() + return link_dict + + def resource_uri(self): + return self.__url__ + '/' + str(getattr(self, self.primary_key())) + + def update(self, attributes): + for attribute in attributes: + setattr(self, attribute, attributes[attribute]) + return self + + @classmethod + def description(cls): + + description = {} + for column in cls.__table__.columns: # pylint: disable=no-member + column_description = str(column.type) + if not column.nullable: + column_description += ' (required)' + description[column.name] = column_description + return description + +~~DeclarativeModel = declarative_base(cls=(db.Model, Model)) +AutomapModel = automap_base(DeclarativeModel) + + + +## ... source file continues with no further declarative_base examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown new file mode 100644 index 000000000..f95eb1d1a --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown @@ -0,0 +1,186 @@ +title: sqlalchemy.ext.declarative DeclarativeMeta code examples +category: page +slug: sqlalchemy-ext-declarative-declarativemeta-examples +sortorder: 500031032 +toc: False +sidebartitle: sqlalchemy.ext.declarative DeclarativeMeta +meta: Python example code for the DeclarativeMeta class from the sqlalchemy.ext.declarative module of the SQLAlchemy project. + + +DeclarativeMeta is a class within the sqlalchemy.ext.declarative module of the SQLAlchemy project. + + +## Example 1 from flask-sqlalchemy +[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) +([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) +and +[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a +[Flask](/flask.html) extension that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy +provides helper functions that reduce the amount of common boilerplate +code that you have to frequently write yourself if you did not use this +library when combining Flask with SQLAlchemy. + +flask-sqlalchemy is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). + +[**flask-sqlalchemy / src/flask_sqlalchemy / __init__.py**](https://github.com/pallets/flask-sqlalchemy/blob/master/src/flask_sqlalchemy/./__init__.py) + +```python +# __init__.py +import functools +import os +import sys +import warnings +from math import ceil +from operator import itemgetter +from threading import Lock +from time import perf_counter + +import sqlalchemy +from flask import _app_ctx_stack +from flask import abort +from flask import current_app +from flask import request +from flask.signals import Namespace +from sqlalchemy import event +from sqlalchemy import inspect +from sqlalchemy import orm +from sqlalchemy.engine.url import make_url +from sqlalchemy.ext.declarative import declarative_base +~~from sqlalchemy.ext.declarative import DeclarativeMeta +from sqlalchemy.orm.exc import UnmappedClassError +from sqlalchemy.orm.session import Session as SessionBase + +from .model import DefaultMeta +from .model import Model + +__version__ = "3.0.0.dev" + +_signals = Namespace() +models_committed = _signals.signal("models-committed") +before_models_committed = _signals.signal("before-models-committed") + + +def _make_table(db): + def _make_table(*args, **kwargs): + if len(args) > 1 and isinstance(args[1], db.Column): + args = (args[0], db.metadata) + args[1:] + info = kwargs.pop("info", None) or {} + info.setdefault("bind_key", None) + kwargs["info"] = info + return sqlalchemy.Table(*args, **kwargs) + + return _make_table + + + +## ... source file abbreviated to get to DeclarativeMeta examples ... + + + self._engine_options = engine_options or {} + _include_sqlalchemy(self, query_class) + + if app is not None: + self.init_app(app) + + @property + def metadata(self): + + return self.Model.metadata + + def create_scoped_session(self, options=None): + + if options is None: + options = {} + + scopefunc = options.pop("scopefunc", _app_ctx_stack.__ident_func__) + options.setdefault("query_cls", self.Query) + return orm.scoped_session(self.create_session(options), scopefunc=scopefunc) + + def create_session(self, options): + + return orm.sessionmaker(class_=SignallingSession, db=self, **options) + + def make_declarative_base(self, model, metadata=None): +~~ if not isinstance(model, DeclarativeMeta): + model = declarative_base( + cls=model, name="Model", metadata=metadata, metaclass=DefaultMeta + ) + + if metadata is not None and model.metadata is not metadata: + model.metadata = metadata + + if not getattr(model, "query_class", None): + model.query_class = self.Query + + model.query = _QueryProperty(self) + return model + + def init_app(self, app): + + if not ( + app.config.get("SQLALCHEMY_DATABASE_URI") + or app.config.get("SQLALCHEMY_BINDS") + ): + raise RuntimeError( + "Either SQLALCHEMY_DATABASE_URI or SQLALCHEMY_BINDS needs to be set." + ) + + app.config.setdefault("SQLALCHEMY_DATABASE_URI", None) + + +## ... source file continues with no further DeclarativeMeta examples... + +``` + + +## Example 2 from marshmallow-sqlalchemy +[marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) +([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/)) +is a code library that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) with the +[Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +data serialization tool. + +The marshmallow-sqlalchemy project is provided as open source under the +[MIT license](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/LICENSE). + +[**marshmallow-sqlalchemy / src/marshmallow_sqlalchemy / schema / sqlalchemy_schema.py**](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/src/marshmallow_sqlalchemy/schema/sqlalchemy_schema.py) + +```python +# sqlalchemy_schema.py +from marshmallow.fields import Field +from marshmallow.schema import Schema, SchemaMeta, SchemaOpts +import sqlalchemy as sa +~~from sqlalchemy.ext.declarative import DeclarativeMeta + +from ..convert import ModelConverter +from ..exceptions import IncorrectSchemaTypeError +from .load_instance_mixin import LoadInstanceMixin + + +class SQLAlchemyAutoField(Field): + def __init__(self, *, column_name=None, model=None, table=None, field_kwargs): + super().__init__() + + if model and table: + raise ValueError("Cannot pass both `model` and `table` options.") + + self.column_name = column_name + self.model = model + self.table = table + self.field_kwargs = field_kwargs + + def create_field(self, schema_opts, column_name, converter): + model = self.model or schema_opts.model + if model: + return converter.field_for(model, column_name, **self.field_kwargs) + else: + table = self.table if self.table is not None else schema_opts.table + + +## ... source file continues with no further DeclarativeMeta examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown index 826650e0f..e35598ca4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.hybrid hybrid_property code examples category: page slug: sqlalchemy-ext-hybrid-hybrid-property-examples -sortorder: 500031000 +sortorder: 500031034 toc: False sidebartitle: sqlalchemy.ext.hybrid hybrid_property meta: Python example code for the hybrid_property function from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. @@ -16,7 +16,7 @@ hybrid_property is a function within the sqlalchemy.ext.hybrid module of the SQL and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -49,7 +49,6 @@ def get_locale(): try: return babel.Locale('en') except AttributeError: - # As babel is optional, we may raise an AttributeError accessing it raise ImproperlyConfigured( 'Could not load get_locale function using Babel. Either ' 'install Babel or make a similar function and override it ' @@ -58,11 +57,17 @@ def get_locale(): if six.PY2: + def get_args_count(func): ## ... source file abbreviated to get to hybrid_property examples ... + return getattr(obj, attr.key)[default_locale] + except (TypeError, KeyError): + return self.default_value + return getter + def setter_factory(self, attr): def setter(obj, value): if getattr(obj, attr.key) is None: @@ -90,8 +95,8 @@ if six.PY2: ) -## ... source file continues with no further hybrid_property examples... +## ... source file continues with no further hybrid_property examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown index a03885c36..c555eb5de 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.mutable Mutable code examples category: page slug: sqlalchemy-ext-mutable-mutable-examples -sortorder: 500031000 +sortorder: 500031035 toc: False sidebartitle: sqlalchemy.ext.mutable Mutable meta: Python example code for the Mutable class from the sqlalchemy.ext.mutable module of the SQLAlchemy project. @@ -16,7 +16,7 @@ Mutable is a class within the sqlalchemy.ext.mutable module of the SQLAlchemy pr and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -59,22 +59,21 @@ except ImportError: super(Password, cls).coerce(key, value) def __init__(self, value, context=None, secret=False): - # Store the hash (if it is one). self.hash = value if not secret else None - # Store the secret if we have one. self.secret = value if secret else None - # The hash should be bytes. if isinstance(self.hash, six.text_type): self.hash = self.hash.encode('utf8') - # Save weakref of the password context (if we have one) self.context = weakref.proxy(context) if context is not None else None + def __eq__(self, value): + if self.hash is None or value is None: + return self.hash is value -## ... source file continues with no further Mutable examples... +## ... source file continues with no further Mutable examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown index 3319bf372..b25b9d3d4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.inspection inspect code examples category: page slug: sqlalchemy-inspection-inspect-examples -sortorder: 500031000 +sortorder: 500031036 toc: False sidebartitle: sqlalchemy.inspection inspect meta: Python example code for the inspect function from the sqlalchemy.inspection module of the SQLAlchemy project. @@ -30,13 +30,10 @@ The sandman2 project is provided under the ```python # model.py -"""Module containing code related to *sandman2* ORM models.""" -# Standard library imports import datetime from decimal import Decimal -# Third-party imports ~~from sqlalchemy.inspection import inspect from flask_sqlalchemy import SQLAlchemy # pylint: disable=import-error,no-name-in-module from sqlalchemy.ext.automap import automap_base @@ -46,28 +43,39 @@ db = SQLAlchemy() class Model(object): - """The sandman2 Model class is the base class for all RESTful resources. - There is a one-to-one mapping between a table in the database and a - :class:`sandman2.model.Model`. - """ - #: The relative URL this resource should live at. __url__ = None - #: The API version of this resource (not yet used). __version__ = '1' - #: The HTTP methods this resource supports (default=all). __methods__ = { 'GET', 'POST', 'PUT', + 'PATCH', + 'DELETE', + 'HEAD', + 'OPTIONS' + } + + @classmethod ## ... source file abbreviated to get to inspect examples ... - """ + for column in cls.__table__.columns: # pylint: disable=no-member + if column.nullable: + columns.append(column.name) + return columns + + @classmethod + def primary_key(cls): + return list( + cls.__table__.primary_key.columns)[ # pylint: disable=no-member + 0].key + + def to_dict(self): result_dict = {} for column in self.__table__.columns.keys(): # pylint: disable=no-member value = result_dict[column] = getattr(self, column, None) @@ -80,12 +88,6 @@ class Model(object): return result_dict def links(self): - """Return a dictionary of links to related resources that should be - included in the *Link* header of an HTTP response. - - :rtype: dict - - """ link_dict = {'self': self.resource_uri()} ~~ for relationship in inspect( # pylint: disable=maybe-no-member self.__class__).relationships: @@ -96,26 +98,25 @@ class Model(object): return link_dict def resource_uri(self): - """Return the URI to this specific resource. - - :rtype: str - - """ return self.__url__ + '/' + str(getattr(self, self.primary_key())) def update(self, attributes): - """Update the current instance based on attribute->value items in - *attributes*. - - :param dict attributes: Dictionary of attributes to be updated - :rtype: :class:`sandman2.model.Model` - """ for attribute in attributes: setattr(self, attribute, attributes[attribute]) + return self + @classmethod + def description(cls): -## ... source file continues with no further inspect examples... + description = {} + for column in cls.__table__.columns: # pylint: disable=no-member + column_description = str(column.type) + if not column.nullable: + column_description += ' (required)' + description[column.name] = column_description +## ... source file continues with no further inspect examples... + ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown index ea4ada1e5..351aa565d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.attributes InstrumentedAttribute code examples category: page slug: sqlalchemy-orm-attributes-instrumentedattribute-examples -sortorder: 500031000 +sortorder: 500031044 toc: False sidebartitle: sqlalchemy.orm.attributes InstrumentedAttribute meta: Python example code for the InstrumentedAttribute class from the sqlalchemy.orm.attributes module of the SQLAlchemy project. @@ -16,7 +16,7 @@ InstrumentedAttribute is a class within the sqlalchemy.orm.attributes module of and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -59,6 +59,11 @@ class Path(object): ## ... source file abbreviated to get to InstrumentedAttribute examples ... + return "%s('%s')" % (self.__class__.__name__, self.path) + + def index(self, element): + return self.parts.index(element) + def __getitem__(self, slice): result = self.parts[slice] if isinstance(result, list): @@ -108,6 +113,5 @@ class AttrPath(object): ## ... source file continues with no further InstrumentedAttribute examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown new file mode 100644 index 000000000..14beb308b --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown @@ -0,0 +1,154 @@ +title: sqlalchemy.orm attributes code examples +category: page +slug: sqlalchemy-orm-attributes-examples +sortorder: 500031039 +toc: False +sidebartitle: sqlalchemy.orm attributes +meta: Python example code for the attributes function from the sqlalchemy.orm module of the SQLAlchemy project. + + +attributes is a function within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / generic.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/./generic.py) + +```python +# generic.py +try: + from collections.abc import Iterable +except ImportError: # For python 2.7 support + from collections import Iterable + +import six +import sqlalchemy as sa +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import attributes, class_mapper, ColumnProperty +from sqlalchemy.orm.interfaces import MapperProperty, PropComparator +from sqlalchemy.orm.session import _state_session +from sqlalchemy.util import set_creation_order + +from .exceptions import ImproperlyConfigured +from .functions import identity + + +class GenericAttributeImpl(attributes.ScalarAttributeImpl): +~~ def get(self, state, dict_, passive=attributes.PASSIVE_OFF): + if self.key in dict_: + return dict_[self.key] + + session = _state_session(state) + if session is None: + return None + + discriminator = self.get_state_discriminator(state) + target_class = state.class_._decl_class_registry.get(discriminator) + + if target_class is None: + return None + + id = self.get_state_id(state) + + +## ... source file abbreviated to get to attributes examples ... + + + self.property = prop + self._parententity = parentmapper + + def __eq__(self, other): + discriminator = six.text_type(type(other).__name__) + q = self.property._discriminator_col == discriminator + other_id = identity(other) + for index, id in enumerate(self.property._id_cols): + q &= id == other_id[index] + return q + + def __ne__(self, other): + return -(self == other) + + def is_type(self, other): + mapper = sa.inspect(other) + class_names = [six.text_type(other.__name__)] + class_names.extend([ + six.text_type(submapper.class_.__name__) + for submapper in mapper._inheriting_mappers + ]) + + return self.property._discriminator_col.in_(class_names) + + def instrument_class(self, mapper): +~~ attributes.register_attribute( + mapper.class_, + self.key, + comparator=self.Comparator(self, mapper), + parententity=mapper, + doc=self.doc, + impl_class=GenericAttributeImpl, + parent_token=self + ) + + +def generic_relationship(*args, **kwargs): + return GenericRelationshipProperty(*args, **kwargs) + + + target = session.query(target_class).get(id) + + return target + + def get_state_discriminator(self, state): + discriminator = self.parent_token.discriminator + if isinstance(discriminator, hybrid_property): + return getattr(state.obj(), discriminator.__name__) + else: + return state.attrs[discriminator.key].value + + def get_state_id(self, state): + return tuple(state.attrs[id.key].value for id in self.parent_token.id) + + def set(self, state, dict_, initiator, +~~ passive=attributes.PASSIVE_OFF, + check_old=None, + pop=False): + + dict_[self.key] = initiator + + if initiator is None: + for id in self.parent_token.id: + dict_[id.key] = None + dict_[self.parent_token.discriminator.key] = None + else: + class_ = type(initiator) + mapper = class_mapper(class_) + + pk = mapper.identity_key_from_instance(initiator)[1] + + discriminator = six.text_type(class_.__name__) + + for index, id in enumerate(self.parent_token.id): + dict_[id.key] = pk[index] + dict_[self.parent_token.discriminator.key] = discriminator + + +class GenericRelationshipProperty(MapperProperty): + + + +## ... source file continues with no further attributes examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown new file mode 100644 index 000000000..428d2ef43 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown @@ -0,0 +1,124 @@ +title: sqlalchemy.orm class_mapper code examples +category: page +slug: sqlalchemy-orm-class-mapper-examples +sortorder: 500031040 +toc: False +sidebartitle: sqlalchemy.orm class_mapper +meta: Python example code for the class_mapper function from the sqlalchemy.orm module of the SQLAlchemy project. + + +class_mapper is a function within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / generic.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/./generic.py) + +```python +# generic.py +try: + from collections.abc import Iterable +except ImportError: # For python 2.7 support + from collections import Iterable + +import six +import sqlalchemy as sa +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import attributes, class_mapper, ColumnProperty +from sqlalchemy.orm.interfaces import MapperProperty, PropComparator +from sqlalchemy.orm.session import _state_session +from sqlalchemy.util import set_creation_order + +from .exceptions import ImproperlyConfigured +from .functions import identity + + +class GenericAttributeImpl(attributes.ScalarAttributeImpl): + def get(self, state, dict_, passive=attributes.PASSIVE_OFF): + if self.key in dict_: + return dict_[self.key] + + session = _state_session(state) + if session is None: + return None + + discriminator = self.get_state_discriminator(state) + target_class = state.class_._decl_class_registry.get(discriminator) + + if target_class is None: + return None + + id = self.get_state_id(state) + + +## ... source file abbreviated to get to class_mapper examples ... + + + return target + + def get_state_discriminator(self, state): + discriminator = self.parent_token.discriminator + if isinstance(discriminator, hybrid_property): + return getattr(state.obj(), discriminator.__name__) + else: + return state.attrs[discriminator.key].value + + def get_state_id(self, state): + return tuple(state.attrs[id.key].value for id in self.parent_token.id) + + def set(self, state, dict_, initiator, + passive=attributes.PASSIVE_OFF, + check_old=None, + pop=False): + + dict_[self.key] = initiator + + if initiator is None: + for id in self.parent_token.id: + dict_[id.key] = None + dict_[self.parent_token.discriminator.key] = None + else: + class_ = type(initiator) +~~ mapper = class_mapper(class_) + + pk = mapper.identity_key_from_instance(initiator)[1] + + discriminator = six.text_type(class_.__name__) + + for index, id in enumerate(self.parent_token.id): + dict_[id.key] = pk[index] + dict_[self.parent_token.discriminator.key] = discriminator + + +class GenericRelationshipProperty(MapperProperty): + + def __init__(self, discriminator, id, doc=None): + super(GenericRelationshipProperty, self).__init__() + self._discriminator_col = discriminator + self._id_cols = id + self._id = None + self._discriminator = None + self.doc = doc + + set_creation_order(self) + + def _column_to_property(self, column): + if isinstance(column, hybrid_property): + + +## ... source file continues with no further class_mapper examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown index 81a553d14..89c079192 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.collections InstrumentedList code examples category: page slug: sqlalchemy-orm-collections-instrumentedlist-examples -sortorder: 500031000 +sortorder: 500031045 toc: False sidebartitle: sqlalchemy.orm.collections InstrumentedList meta: Python example code for the InstrumentedList class from the sqlalchemy.orm.collections module of the SQLAlchemy project. @@ -16,7 +16,7 @@ InstrumentedList is a class within the sqlalchemy.orm.collections module of the and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -74,8 +74,6 @@ from .enriched_datetime.enriched_datetime_type import EnrichedDateTimeType # no ~~class InstrumentedList(_InstrumentedList): - """Enhanced version of SQLAlchemy InstrumentedList. Provides some - additional functionality.""" def any(self, attr): return any(getattr(item, attr) for item in self) @@ -91,8 +89,8 @@ def instrumented_list(f): return wrapper -## ... source file continues with no further InstrumentedList examples... +## ... source file continues with no further InstrumentedList examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown new file mode 100644 index 000000000..cb571896b --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown @@ -0,0 +1,124 @@ +title: sqlalchemy.orm ColumnProperty code examples +category: page +slug: sqlalchemy-orm-columnproperty-examples +sortorder: 500031037 +toc: False +sidebartitle: sqlalchemy.orm ColumnProperty +meta: Python example code for the ColumnProperty class from the sqlalchemy.orm module of the SQLAlchemy project. + + +ColumnProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / generic.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/./generic.py) + +```python +# generic.py +try: + from collections.abc import Iterable +except ImportError: # For python 2.7 support + from collections import Iterable + +import six +import sqlalchemy as sa +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import attributes, class_mapper, ColumnProperty +from sqlalchemy.orm.interfaces import MapperProperty, PropComparator +from sqlalchemy.orm.session import _state_session +from sqlalchemy.util import set_creation_order + +from .exceptions import ImproperlyConfigured +from .functions import identity + + +class GenericAttributeImpl(attributes.ScalarAttributeImpl): + def get(self, state, dict_, passive=attributes.PASSIVE_OFF): + if self.key in dict_: + return dict_[self.key] + + session = _state_session(state) + if session is None: + return None + + discriminator = self.get_state_discriminator(state) + target_class = state.class_._decl_class_registry.get(discriminator) + + if target_class is None: + return None + + id = self.get_state_id(state) + + +## ... source file abbreviated to get to ColumnProperty examples ... + + + for index, id in enumerate(self.parent_token.id): + dict_[id.key] = pk[index] + dict_[self.parent_token.discriminator.key] = discriminator + + +class GenericRelationshipProperty(MapperProperty): + + def __init__(self, discriminator, id, doc=None): + super(GenericRelationshipProperty, self).__init__() + self._discriminator_col = discriminator + self._id_cols = id + self._id = None + self._discriminator = None + self.doc = doc + + set_creation_order(self) + + def _column_to_property(self, column): + if isinstance(column, hybrid_property): + attr_key = column.__name__ + for key, attr in self.parent.all_orm_descriptors.items(): + if key == attr_key: + return attr + else: + for key, attr in self.parent.attrs.items(): +~~ if isinstance(attr, ColumnProperty): + if attr.columns[0].name == column.name: + return attr + + def init(self): + def convert_strings(column): + if isinstance(column, six.string_types): + return self.parent.columns[column] + return column + + self._discriminator_col = convert_strings(self._discriminator_col) + self._id_cols = convert_strings(self._id_cols) + + if isinstance(self._id_cols, Iterable): + self._id_cols = list(map(convert_strings, self._id_cols)) + else: + self._id_cols = [self._id_cols] + + self.discriminator = self._column_to_property(self._discriminator_col) + + if self.discriminator is None: + raise ImproperlyConfigured( + 'Could not find discriminator descriptor.' + ) + + + +## ... source file continues with no further ColumnProperty examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown index 2a45836fd..0b12e850a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc NoResultFound code examples category: page slug: sqlalchemy-orm-exc-noresultfound-examples -sortorder: 500031000 +sortorder: 500031046 toc: False sidebartitle: sqlalchemy.orm.exc NoResultFound meta: Python example code for the NoResultFound class from the sqlalchemy.orm.exc module of the SQLAlchemy project. @@ -33,10 +33,6 @@ from sqlalchemy import inspect def get_primary_keys(model): - """Get primary key properties for a SQLAlchemy model. - - :param model: SQLAlchemy model class - """ mapper = model.__mapper__ return [mapper.get_property_by_column(column) for column in mapper.primary_key] @@ -47,24 +43,33 @@ def ensure_list(value): class RelatedList(fields.List): def get_value(self, obj, attr, accessor=None): - # Do not call `fields.List`'s get_value as it calls the container's - # `get_value` if the container has `attribute`. - # Instead call the `get_value` from the parent of `fields.List` - # so the special handling is avoided. return super(fields.List, self).get_value(obj, attr, accessor=accessor) +class Related(fields.Field): + + default_error_messages = { + "invalid": "Could not deserialize related value {value!r}; " + "expected a dictionary with keys {keys!r}" + } + + def __init__(self, column=None, **kwargs): ## ... source file abbreviated to get to NoResultFound examples ... - """Deserialize a serialized value to a model instance. + return self.root.session + + @property + def transient(self): + return self.root.transient - If the parent schema is transient, create a new (transient) instance. - Otherwise, attempt to find an existing instance in the database. - :param value: The value to deserialize. - """ + def _serialize(self, value, attr, obj): + ret = {prop.key: getattr(value, prop.key, None) for prop in self.related_keys} + return ret if len(ret) > 1 else list(ret.values())[0] + + def _deserialize(self, value, *args, **kwargs): if not isinstance(value, dict): if len(self.related_keys) != 1: keys = [prop.key for prop in self.related_keys] @@ -80,24 +85,15 @@ class RelatedList(fields.List): self.session.query(self.related_model), value ) ~~ except NoResultFound: - # The related-object DNE in the DB, but we still want to deserialize it - # ...perhaps we want to add it to the DB later return self.related_model(**value) return result def _get_existing_instance(self, query, value): - """Retrieve the related object from an existing instance in the DB. - - :param query: A SQLAlchemy `Query ` object. - :param value: The serialized value to mapto an existing instance. -~~ :raises NoResultFound: if there is no matching record. - """ if self.columns: result = query.filter_by( **{prop.key: value.get(prop.key) for prop in self.related_keys} ).one() else: - # Use a faster path if the related key is the primary key. lookup_values = [value.get(prop.key) for prop in self.related_keys] try: result = query.get(lookup_values) @@ -113,7 +109,6 @@ class RelatedList(fields.List): class Nested(fields.Nested): - """Nested field that inherits the session from its parent.""" def _deserialize(self, *args, **kwargs): if hasattr(self.schema, "session"): @@ -122,8 +117,8 @@ class Nested(fields.Nested): return super()._deserialize(*args, **kwargs) -## ... source file continues with no further NoResultFound examples... +## ... source file continues with no further NoResultFound examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown index 3868a5693..ff5cd6d24 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc UnmappedClassError code examples category: page slug: sqlalchemy-orm-exc-unmappedclasserror-examples -sortorder: 500031001 +sortorder: 500031047 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedClassError meta: Python example code for the UnmappedClassError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. @@ -28,6 +28,7 @@ flask-sqlalchemy is provided as open source under the ```python # __init__.py +import functools import os import sys import warnings @@ -78,6 +79,11 @@ def _make_table(db): ## ... source file abbreviated to get to UnmappedClassError examples ... + else: + per_page = 20 + + items = self.limit(per_page).offset((page - 1) * per_page).all() + if not items and page != 1 and error_out: abort(404) @@ -127,6 +133,5 @@ class _EngineConnector: ## ... source file continues with no further UnmappedClassError examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown index 6379d20e7..8f1d456cb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc UnmappedInstanceError code examples category: page slug: sqlalchemy-orm-exc-unmappedinstanceerror-examples -sortorder: 500031002 +sortorder: 500031048 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedInstanceError meta: Python example code for the UnmappedInstanceError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. @@ -16,7 +16,7 @@ UnmappedInstanceError is a class within the sqlalchemy.orm.exc module of the SQL and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -49,41 +49,46 @@ from ..utils import is_sequence def get_class_by_table(base, table, data=None): - """ - Return declarative class associated with given table. If no class is found - this function returns `None`. If multiple classes were found (polymorphic - cases) additional `data` parameter can be given to hint which class - to return. - - :: - - class User(Base): - __tablename__ = 'entity' - id = sa.Column(sa.Integer, primary_key=True) - name = sa.Column(sa.String) - - - get_class_by_table(Base, User.__table__) # User class + found_classes = set( + c for c in base._decl_class_registry.values() + if hasattr(c, '__table__') and c.__table__ is table + ) + if len(found_classes) > 1: + if not data: + raise ValueError( + "Multiple declarative classes found for table '{0}'. " + "Please provide data parameter for this function to be able " + "to determine polymorphic scenarios.".format( + table.name + ) + ) + else: + for cls in found_classes: ## ... source file abbreviated to get to UnmappedInstanceError examples ... - Return the bind for given SQLAlchemy Engine / Connection / declarative - model object. - - :param obj: SQLAlchemy Engine / Connection / declarative model object - - :: - - from sqlalchemy_utils import get_bind - - - get_bind(session) # Connection object - - get_bind(user) - - """ + mappers = [ + mapper for mapper in mapperlib._mapper_registry + if mixed in mapper.tables + ] + if len(mappers) > 1: + raise ValueError( + "Multiple mappers found for table '%s'." % mixed.name + ) + elif not mappers: + raise ValueError( + "Could not get mapper for table '%s'." % mixed.name + ) + else: + return mappers[0] + if not isclass(mixed): + mixed = type(mixed) + return sa.inspect(mixed) + + +def get_bind(obj): if hasattr(obj, 'bind'): conn = obj.bind else: @@ -101,23 +106,22 @@ def get_class_by_table(base, table, data=None): def get_primary_keys(mixed): - """ - Return an OrderedDict of all primary keys for given Table object, - declarative class or declarative class instance. - - :param mixed: - SA Table object, SA declarative class or SA declarative class instance - - :: - - get_primary_keys(User) + return OrderedDict( + ( + (key, column) for key, column in get_columns(mixed).items() + if column.primary_key + ) + ) - get_primary_keys(User()) +def get_tables(mixed): + if isinstance(mixed, sa.Table): + return [mixed] + elif isinstance(mixed, sa.Column): + return [mixed.table] ## ... source file continues with no further UnmappedInstanceError examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown index 3d8b2e124..e2b5ddebe 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.interfaces MapperProperty code examples category: page slug: sqlalchemy-orm-interfaces-mapperproperty-examples -sortorder: 500031000 +sortorder: 500031049 toc: False sidebartitle: sqlalchemy.orm.interfaces MapperProperty meta: Python example code for the MapperProperty class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. @@ -16,7 +16,7 @@ MapperProperty is a class within the sqlalchemy.orm.interfaces module of the SQL and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -50,36 +50,41 @@ class GenericAttributeImpl(attributes.ScalarAttributeImpl): if self.key in dict_: return dict_[self.key] - # Retrieve the session bound to the state in order to perform - # a lazy query for the attribute. session = _state_session(state) if session is None: - # State is not bound to a session; we cannot proceed. return None - # Find class for discriminator. - # TODO: Perhaps optimize with some sort of lookup? discriminator = self.get_state_discriminator(state) target_class = state.class_._decl_class_registry.get(discriminator) + if target_class is None: + return None + + id = self.get_state_id(state) + ## ... source file abbreviated to get to MapperProperty examples ... - # Nullify relationship args + + def set(self, state, dict_, initiator, + passive=attributes.PASSIVE_OFF, + check_old=None, + pop=False): + + dict_[self.key] = initiator + + if initiator is None: for id in self.parent_token.id: dict_[id.key] = None dict_[self.parent_token.discriminator.key] = None else: - # Get the primary key of the initiator and ensure we - # can support this assignment. class_ = type(initiator) mapper = class_mapper(class_) pk = mapper.identity_key_from_instance(initiator)[1] - # Set the identifier and the discriminator. discriminator = six.text_type(class_.__name__) for index, id in enumerate(self.parent_token.id): @@ -88,16 +93,6 @@ class GenericAttributeImpl(attributes.ScalarAttributeImpl): ~~class GenericRelationshipProperty(MapperProperty): - """A generic form of the relationship property. - - Creates a 1 to many relationship between the parent model - and any other models using a descriminator (the table name). - - :param discriminator - Field to discriminate which model we are referring to. - :param id: - Field to point to the model we are referring to. - """ def __init__(self, discriminator, id, doc=None): super(GenericRelationshipProperty, self).__init__() @@ -112,10 +107,19 @@ class GenericAttributeImpl(attributes.ScalarAttributeImpl): def _column_to_property(self, column): if isinstance(column, hybrid_property): attr_key = column.__name__ + for key, attr in self.parent.all_orm_descriptors.items(): + if key == attr_key: + return attr + else: + for key, attr in self.parent.attrs.items(): + if isinstance(attr, ColumnProperty): + if attr.columns[0].name == column.name: + return attr + def init(self): -## ... source file continues with no further MapperProperty examples... +## ... source file continues with no further MapperProperty examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown index 14669ace5..94a056d53 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.interfaces PropComparator code examples category: page slug: sqlalchemy-orm-interfaces-propcomparator-examples -sortorder: 500031001 +sortorder: 500031050 toc: False sidebartitle: sqlalchemy.orm.interfaces PropComparator meta: Python example code for the PropComparator class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. @@ -16,7 +16,7 @@ PropComparator is a class within the sqlalchemy.orm.interfaces module of the SQL and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -50,23 +50,28 @@ class GenericAttributeImpl(attributes.ScalarAttributeImpl): if self.key in dict_: return dict_[self.key] - # Retrieve the session bound to the state in order to perform - # a lazy query for the attribute. session = _state_session(state) if session is None: - # State is not bound to a session; we cannot proceed. return None - # Find class for discriminator. - # TODO: Perhaps optimize with some sort of lookup? discriminator = self.get_state_discriminator(state) target_class = state.class_._decl_class_registry.get(discriminator) + if target_class is None: + return None + + id = self.get_state_id(state) + ## ... source file abbreviated to get to PropComparator examples ... + return attr + + def init(self): + def convert_strings(column): + if isinstance(column, six.string_types): return self.parent.columns[column] return column @@ -105,17 +110,16 @@ class GenericAttributeImpl(attributes.ScalarAttributeImpl): def is_type(self, other): mapper = sa.inspect(other) - # Iterate through the weak sequence in order to get the actual - # mappers class_names = [six.text_type(other.__name__)] class_names.extend([ six.text_type(submapper.class_.__name__) for submapper in mapper._inheriting_mappers ]) + return self.property._discriminator_col.in_(class_names) -## ... source file continues with no further PropComparator examples... +## ... source file continues with no further PropComparator examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown new file mode 100644 index 000000000..06e8a331b --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown @@ -0,0 +1,288 @@ +title: sqlalchemy.orm mapper code examples +category: page +slug: sqlalchemy-orm-mapper-examples +sortorder: 500031041 +toc: False +sidebartitle: sqlalchemy.orm mapper +meta: Python example code for the mapper function from the sqlalchemy.orm module of the SQLAlchemy project. + + +mapper is a function within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / functions / orm.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/functions/orm.py) + +```python +# orm.py +from collections import OrderedDict +from functools import partial +from inspect import isclass +from operator import attrgetter + +import six +import sqlalchemy as sa +from sqlalchemy.engine.interfaces import Dialect +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import mapperlib +from sqlalchemy.orm.attributes import InstrumentedAttribute +from sqlalchemy.orm.exc import UnmappedInstanceError +from sqlalchemy.orm.properties import ColumnProperty, RelationshipProperty +from sqlalchemy.orm.query import _ColumnEntity +from sqlalchemy.orm.session import object_session +from sqlalchemy.orm.util import AliasedInsp + +from ..utils import is_sequence + + +def get_class_by_table(base, table, data=None): + found_classes = set( + c for c in base._decl_class_registry.values() + if hasattr(c, '__table__') and c.__table__ is table + ) + if len(found_classes) > 1: + if not data: + raise ValueError( + "Multiple declarative classes found for table '{0}'. " + "Please provide data parameter for this function to be able " + "to determine polymorphic scenarios.".format( + table.name + ) + ) + else: + for cls in found_classes: + mapper = sa.inspect(cls) +~~ polymorphic_on = mapper.polymorphic_on.name + if polymorphic_on in data: +~~ if data[polymorphic_on] == mapper.polymorphic_identity: + return cls + raise ValueError( + "Multiple declarative classes found for table '{0}'. Given " + "data row does not match any polymorphic identity of the " + "found classes.".format( + table.name + ) + ) + elif found_classes: + return found_classes.pop() + return None + + +def get_type(expr): + if hasattr(expr, 'type'): + return expr.type + elif isinstance(expr, InstrumentedAttribute): + expr = expr.property + + if isinstance(expr, ColumnProperty): + return expr.columns[0].type + elif isinstance(expr, RelationshipProperty): + return expr.mapper.class_ + raise TypeError("Couldn't inspect type.") + + +def cast_if(expression, type_): + try: + expr_type = get_type(expression) + except TypeError: + expr_type = expression + check_type = type_().python_type + else: + check_type = type_ + + return ( + sa.cast(expression, type_) + if not isinstance(expr_type, check_type) + else expression + ) + + +def get_column_key(model, column): + mapper = sa.inspect(model) + try: +~~ return mapper.get_property_by_column(column).key + except sa.orm.exc.UnmappedColumnError: +~~ for key, c in mapper.columns.items(): + if c.name == column.name and c.table is column.table: + return key + raise sa.orm.exc.UnmappedColumnError( + 'No column %s is configured on mapper %s...' % + (column, mapper) + ) + + +def get_mapper(mixed): + if isinstance(mixed, sa.orm.query._MapperEntity): + mixed = mixed.expr + elif isinstance(mixed, sa.Column): + mixed = mixed.table + elif isinstance(mixed, sa.orm.query._ColumnEntity): + mixed = mixed.expr + + if isinstance(mixed, sa.orm.Mapper): + return mixed + if isinstance(mixed, sa.orm.util.AliasedClass): + return sa.inspect(mixed).mapper + if isinstance(mixed, sa.sql.selectable.Alias): + mixed = mixed.element + if isinstance(mixed, AliasedInsp): + return mixed.mapper + if isinstance(mixed, sa.orm.attributes.InstrumentedAttribute): + mixed = mixed.class_ + if isinstance(mixed, sa.Table): + mappers = [ + mapper for mapper in mapperlib._mapper_registry +~~ if mixed in mapper.tables + ] + if len(mappers) > 1: + raise ValueError( + "Multiple mappers found for table '%s'." % mixed.name + ) + elif not mappers: + raise ValueError( + "Could not get mapper for table '%s'." % mixed.name + ) + else: + return mappers[0] + if not isclass(mixed): + mixed = type(mixed) + return sa.inspect(mixed) + + +def get_bind(obj): + if hasattr(obj, 'bind'): + conn = obj.bind + else: + try: + conn = object_session(obj).bind + except UnmappedInstanceError: + conn = obj + + +## ... source file abbreviated to get to mapper examples ... + + +def get_primary_keys(mixed): + return OrderedDict( + ( + (key, column) for key, column in get_columns(mixed).items() + if column.primary_key + ) + ) + + +def get_tables(mixed): + if isinstance(mixed, sa.Table): + return [mixed] + elif isinstance(mixed, sa.Column): + return [mixed.table] + elif isinstance(mixed, sa.orm.attributes.InstrumentedAttribute): + return mixed.parent.tables + elif isinstance(mixed, sa.orm.query._ColumnEntity): + mixed = mixed.expr + + mapper = get_mapper(mixed) + + polymorphic_mappers = get_polymorphic_mappers(mapper) + if polymorphic_mappers: + tables = sum((m.tables for m in polymorphic_mappers), []) + else: +~~ tables = mapper.tables + return tables + + +def get_columns(mixed): + if isinstance(mixed, sa.sql.selectable.Selectable): + return mixed.c + if isinstance(mixed, sa.orm.util.AliasedClass): + return sa.inspect(mixed).mapper.columns + if isinstance(mixed, sa.orm.Mapper): + return mixed.columns + if isinstance(mixed, InstrumentedAttribute): + return mixed.property.columns + if isinstance(mixed, ColumnProperty): + return mixed.columns + if isinstance(mixed, sa.Column): + return [mixed] + if not isclass(mixed): + mixed = mixed.__class__ + return sa.inspect(mixed).columns + + +def table_name(obj): + class_ = getattr(obj, 'class_', obj) + + + +## ... source file abbreviated to get to mapper examples ... + + + return attr + else: + entity = get_query_entity_by_alias(query, entity) + if entity: + descriptor = get_descriptor(entity, attr) + if ( + hasattr(descriptor, 'property') and + isinstance(descriptor.property, sa.orm.RelationshipProperty) + ): + return + return descriptor + + +def get_descriptor(entity, attr): + mapper = sa.inspect(entity) + + for key, descriptor in get_all_descriptors(mapper).items(): + if attr == key: + prop = ( + descriptor.property + if hasattr(descriptor, 'property') + else None + ) + if isinstance(prop, ColumnProperty): + if isinstance(entity, sa.orm.util.AliasedClass): +~~ for c in mapper.selectable.c: + if c.key == attr: + return c + else: + return getattr(prop.parent.class_, attr) + else: + + if isinstance(entity, sa.orm.util.AliasedClass): + return getattr(entity, attr) + try: + return getattr(mapper.class_, attr) + except AttributeError: + pass + + +def get_all_descriptors(expr): + if isinstance(expr, sa.sql.selectable.Selectable): + return expr.c + insp = sa.inspect(expr) + try: + polymorphic_mappers = get_polymorphic_mappers(insp) + except sa.exc.NoInspectionAvailable: + return get_mapper(expr).all_orm_descriptors + else: + attrs = dict(get_mapper(expr).all_orm_descriptors) + + +## ... source file continues with no further mapper examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown new file mode 100644 index 000000000..0d48f4a71 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown @@ -0,0 +1,125 @@ +title: sqlalchemy.orm mapperlib code examples +category: page +slug: sqlalchemy-orm-mapperlib-examples +sortorder: 500031042 +toc: False +sidebartitle: sqlalchemy.orm mapperlib +meta: Python example code for the mapperlib function from the sqlalchemy.orm module of the SQLAlchemy project. + + +mapperlib is a function within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / functions / orm.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/functions/orm.py) + +```python +# orm.py +from collections import OrderedDict +from functools import partial +from inspect import isclass +from operator import attrgetter + +import six +import sqlalchemy as sa +from sqlalchemy.engine.interfaces import Dialect +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import mapperlib +from sqlalchemy.orm.attributes import InstrumentedAttribute +from sqlalchemy.orm.exc import UnmappedInstanceError +from sqlalchemy.orm.properties import ColumnProperty, RelationshipProperty +from sqlalchemy.orm.query import _ColumnEntity +from sqlalchemy.orm.session import object_session +from sqlalchemy.orm.util import AliasedInsp + +from ..utils import is_sequence + + +def get_class_by_table(base, table, data=None): + found_classes = set( + c for c in base._decl_class_registry.values() + if hasattr(c, '__table__') and c.__table__ is table + ) + if len(found_classes) > 1: + if not data: + raise ValueError( + "Multiple declarative classes found for table '{0}'. " + "Please provide data parameter for this function to be able " + "to determine polymorphic scenarios.".format( + table.name + ) + ) + + +## ... source file abbreviated to get to mapperlib examples ... + + + 'No column %s is configured on mapper %s...' % + (column, mapper) + ) + + +def get_mapper(mixed): + if isinstance(mixed, sa.orm.query._MapperEntity): + mixed = mixed.expr + elif isinstance(mixed, sa.Column): + mixed = mixed.table + elif isinstance(mixed, sa.orm.query._ColumnEntity): + mixed = mixed.expr + + if isinstance(mixed, sa.orm.Mapper): + return mixed + if isinstance(mixed, sa.orm.util.AliasedClass): + return sa.inspect(mixed).mapper + if isinstance(mixed, sa.sql.selectable.Alias): + mixed = mixed.element + if isinstance(mixed, AliasedInsp): + return mixed.mapper + if isinstance(mixed, sa.orm.attributes.InstrumentedAttribute): + mixed = mixed.class_ + if isinstance(mixed, sa.Table): + mappers = [ +~~ mapper for mapper in mapperlib._mapper_registry + if mixed in mapper.tables + ] + if len(mappers) > 1: + raise ValueError( + "Multiple mappers found for table '%s'." % mixed.name + ) + elif not mappers: + raise ValueError( + "Could not get mapper for table '%s'." % mixed.name + ) + else: + return mappers[0] + if not isclass(mixed): + mixed = type(mixed) + return sa.inspect(mixed) + + +def get_bind(obj): + if hasattr(obj, 'bind'): + conn = obj.bind + else: + try: + conn = object_session(obj).bind + except UnmappedInstanceError: + + +## ... source file continues with no further mapperlib examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown new file mode 100644 index 000000000..93077e1bc --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown @@ -0,0 +1,151 @@ +title: sqlalchemy.orm object_session code examples +category: page +slug: sqlalchemy-orm-object-session-examples +sortorder: 500031043 +toc: False +sidebartitle: sqlalchemy.orm object_session +meta: Python example code for the object_session function from the sqlalchemy.orm module of the SQLAlchemy project. + + +object_session is a function within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / functions / foreign_keys.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/functions/foreign_keys.py) + +```python +# foreign_keys.py +from collections import defaultdict +from itertools import groupby + +import sqlalchemy as sa +from sqlalchemy.exc import NoInspectionAvailable +~~from sqlalchemy.orm import object_session +from sqlalchemy.schema import ForeignKeyConstraint, MetaData, Table + +from ..query_chain import QueryChain +from .database import has_index +from .orm import get_column_key, get_mapper, get_tables + + +def get_foreign_key_values(fk, obj): + return dict( + ( + fk.constraint.columns.values()[index].key, + getattr(obj, element.column.key) + ) + for + index, element + in + enumerate(fk.constraint.elements) + ) + + +def group_foreign_keys(foreign_keys): + foreign_keys = sorted( + foreign_keys, key=lambda key: key.constraint.table.name + ) + return groupby(foreign_keys, lambda key: key.constraint.table) + + +def get_referencing_foreign_keys(mixed): + if isinstance(mixed, sa.Table): + tables = [mixed] + else: + tables = get_tables(mixed) + + referencing_foreign_keys = set() + + for table in mixed.metadata.tables.values(): + if table not in tables: + for constraint in table.constraints: + if isinstance(constraint, sa.sql.schema.ForeignKeyConstraint): + for fk in constraint.elements: + if any(fk.references(t) for t in tables): + referencing_foreign_keys.add(fk) + return referencing_foreign_keys + + +def merge_references(from_, to, foreign_keys=None): + if from_.__tablename__ != to.__tablename__: + raise TypeError('The tables of given arguments do not match.') + +~~ session = object_session(from_) + foreign_keys = get_referencing_foreign_keys(from_) + + for fk in foreign_keys: + old_values = get_foreign_key_values(fk, from_) + new_values = get_foreign_key_values(fk, to) + criteria = ( + getattr(fk.constraint.table.c, key) == value + for key, value in old_values.items() + ) + try: + mapper = get_mapper(fk.constraint.table) + except ValueError: + query = ( + fk.constraint.table + .update() + .where(sa.and_(*criteria)) + .values(new_values) + ) + session.execute(query) + else: + ( + session.query(mapper.class_) + .filter_by(**old_values) + .update( + new_values, + 'evaluate' + ) + ) + + +def dependent_objects(obj, foreign_keys=None): + if foreign_keys is None: + foreign_keys = get_referencing_foreign_keys(obj) + +~~ session = object_session(obj) + + chain = QueryChain([]) + classes = obj.__class__._decl_class_registry + + for table, keys in group_foreign_keys(foreign_keys): + keys = list(keys) + for class_ in classes.values(): + try: + mapper = sa.inspect(class_) + except NoInspectionAvailable: + continue + parent_mapper = mapper.inherits + if ( + table in mapper.tables and + not (parent_mapper and table in parent_mapper.tables) + ): + query = session.query(class_).filter( + sa.or_(*_get_criteria(keys, class_, obj)) + ) + chain.queries.append(query) + return chain + + +def _get_criteria(keys, class_, obj): + + +## ... source file continues with no further object_session examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown index c4044ad05..a4cf1e077 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.properties ColumnProperty code examples category: page slug: sqlalchemy-orm-properties-columnproperty-examples -sortorder: 500031000 +sortorder: 500031051 toc: False sidebartitle: sqlalchemy.orm.properties ColumnProperty meta: Python example code for the ColumnProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. @@ -16,7 +16,7 @@ ColumnProperty is a class within the sqlalchemy.orm.properties module of the SQL and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -49,27 +49,21 @@ from ..utils import is_sequence def get_class_by_table(base, table, data=None): - """ - Return declarative class associated with given table. If no class is found - this function returns `None`. If multiple classes were found (polymorphic - cases) additional `data` parameter can be given to hint which class - to return. - - :: - - class User(Base): - __tablename__ = 'entity' - id = sa.Column(sa.Integer, primary_key=True) - name = sa.Column(sa.String) - - - get_class_by_table(Base, User.__table__) # User class - - - -## ... source file abbreviated to get to ColumnProperty examples ... - - + found_classes = set( + c for c in base._decl_class_registry.values() + if hasattr(c, '__table__') and c.__table__ is table + ) + if len(found_classes) > 1: + if not data: + raise ValueError( + "Multiple declarative classes found for table '{0}'. " + "Please provide data parameter for this function to be able " + "to determine polymorphic scenarios.".format( + table.name + ) + ) + else: + for cls in found_classes: mapper = sa.inspect(cls) polymorphic_on = mapper.polymorphic_on.name if polymorphic_on in data: @@ -88,41 +82,6 @@ def get_class_by_table(base, table, data=None): def get_type(expr): - """ - Return the associated type with given Column, InstrumentedAttribute, -~~ ColumnProperty, RelationshipProperty or other similar SQLAlchemy construct. - - For constructs wrapping columns this is the column type. For relationships - this function returns the relationship mapper class. - - :param expr: -~~ SQLAlchemy Column, InstrumentedAttribute, ColumnProperty or other - similar SA construct. - - :: - - class User(Base): - __tablename__ = 'user' - id = sa.Column(sa.Integer, primary_key=True) - name = sa.Column(sa.String) - - - class Article(Base): - __tablename__ = 'article' - id = sa.Column(sa.Integer, primary_key=True) - author_id = sa.Column(sa.Integer, sa.ForeignKey(User.id)) - author = sa.orm.relationship(User) - - - get_type(User.__table__.c.name) # sa.String() - get_type(User.name) # sa.String() - get_type(User.name.property) # sa.String() - - get_type(Article.author) # User - - - .. versionadded: 0.30.9 - """ if hasattr(expr, 'type'): return expr.type elif isinstance(expr, InstrumentedAttribute): @@ -136,40 +95,45 @@ def get_type(expr): def cast_if(expression, type_): - """ - Produce a CAST expression but only if given expression is not of given type - already. - - Assume we have a model with two fields id (Integer) and name (String). - - :: - - import sqlalchemy as sa - from sqlalchemy_utils import cast_if - + try: + expr_type = get_type(expression) + except TypeError: + expr_type = expression + check_type = type_().python_type + else: + check_type = type_ - cast_if(User.id, sa.Integer) # "user".id - cast_if(User.name, sa.String) # "user".name - cast_if(User.id, sa.String) # CAST("user".id AS TEXT) + return ( + sa.cast(expression, type_) + if not isinstance(expr_type, check_type) + else expression + ) +def get_column_key(model, column): + mapper = sa.inspect(model) ## ... source file abbreviated to get to ColumnProperty examples ... + return [mixed.table] + elif isinstance(mixed, sa.orm.attributes.InstrumentedAttribute): + return mixed.parent.tables + elif isinstance(mixed, sa.orm.query._ColumnEntity): + mixed = mixed.expr - get_columns(User.__mapper__) - - get_columns(sa.orm.aliased(User)) + mapper = get_mapper(mixed) - get_columns(sa.orm.alised(User.__table__)) + polymorphic_mappers = get_polymorphic_mappers(mapper) + if polymorphic_mappers: + tables = sum((m.tables for m in polymorphic_mappers), []) + else: + tables = mapper.tables + return tables - :param mixed: - SA Table object, SA Mapper, SA declarative class, SA declarative class - instance or an alias of any of these objects - """ +def get_columns(mixed): if isinstance(mixed, sa.sql.selectable.Selectable): return mixed.c if isinstance(mixed, sa.orm.util.AliasedClass): @@ -188,10 +152,6 @@ def cast_if(expression, type_): def table_name(obj): - """ - Return table name of given target, declarative class or the - table name where the declarative attribute is bound to. - """ class_ = getattr(obj, 'class_', obj) try: @@ -205,9 +165,18 @@ def table_name(obj): pass +def getattrs(obj, attrs): + return map(partial(getattr, obj), attrs) + + ## ... source file abbreviated to get to ColumnProperty examples ... +def get_query_descriptor(query, entity, attr): + if attr in query_labels(query): + return attr + else: + entity = get_query_entity_by_alias(query, entity) if entity: descriptor = get_descriptor(entity, attr) if ( @@ -234,14 +203,8 @@ def get_descriptor(entity, attr): if c.key == attr: return c else: - # If the property belongs to a class that uses - # polymorphic inheritance we have to take into account - # situations where the attribute exists in child class - # but not in parent class. return getattr(prop.parent.class_, attr) else: - # Handle synonyms, relationship properties and hybrid - # properties if isinstance(entity, sa.orm.util.AliasedClass): return getattr(entity, attr) @@ -253,10 +216,15 @@ def get_descriptor(entity, attr): def get_all_descriptors(expr): if isinstance(expr, sa.sql.selectable.Selectable): + return expr.c + insp = sa.inspect(expr) + try: + polymorphic_mappers = get_polymorphic_mappers(insp) + except sa.exc.NoInspectionAvailable: + return get_mapper(expr).all_orm_descriptors ## ... source file continues with no further ColumnProperty examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown index 5262638dd..808657a3a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.properties RelationshipProperty code examples category: page slug: sqlalchemy-orm-properties-relationshipproperty-examples -sortorder: 500031001 +sortorder: 500031052 toc: False sidebartitle: sqlalchemy.orm.properties RelationshipProperty meta: Python example code for the RelationshipProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. @@ -16,7 +16,7 @@ RelationshipProperty is a class within the sqlalchemy.orm.properties module of t and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -49,27 +49,21 @@ from ..utils import is_sequence def get_class_by_table(base, table, data=None): - """ - Return declarative class associated with given table. If no class is found - this function returns `None`. If multiple classes were found (polymorphic - cases) additional `data` parameter can be given to hint which class - to return. - - :: - - class User(Base): - __tablename__ = 'entity' - id = sa.Column(sa.Integer, primary_key=True) - name = sa.Column(sa.String) - - - get_class_by_table(Base, User.__table__) # User class - - - -## ... source file abbreviated to get to RelationshipProperty examples ... - - + found_classes = set( + c for c in base._decl_class_registry.values() + if hasattr(c, '__table__') and c.__table__ is table + ) + if len(found_classes) > 1: + if not data: + raise ValueError( + "Multiple declarative classes found for table '{0}'. " + "Please provide data parameter for this function to be able " + "to determine polymorphic scenarios.".format( + table.name + ) + ) + else: + for cls in found_classes: mapper = sa.inspect(cls) polymorphic_on = mapper.polymorphic_on.name if polymorphic_on in data: @@ -88,41 +82,6 @@ def get_class_by_table(base, table, data=None): def get_type(expr): - """ - Return the associated type with given Column, InstrumentedAttribute, -~~ ColumnProperty, RelationshipProperty or other similar SQLAlchemy construct. - - For constructs wrapping columns this is the column type. For relationships - this function returns the relationship mapper class. - - :param expr: - SQLAlchemy Column, InstrumentedAttribute, ColumnProperty or other - similar SA construct. - - :: - - class User(Base): - __tablename__ = 'user' - id = sa.Column(sa.Integer, primary_key=True) - name = sa.Column(sa.String) - - - class Article(Base): - __tablename__ = 'article' - id = sa.Column(sa.Integer, primary_key=True) - author_id = sa.Column(sa.Integer, sa.ForeignKey(User.id)) - author = sa.orm.relationship(User) - - - get_type(User.__table__.c.name) # sa.String() - get_type(User.name) # sa.String() - get_type(User.name.property) # sa.String() - - get_type(Article.author) # User - - - .. versionadded: 0.30.9 - """ if hasattr(expr, 'type'): return expr.type elif isinstance(expr, InstrumentedAttribute): @@ -136,79 +95,28 @@ def get_type(expr): def cast_if(expression, type_): - """ - Produce a CAST expression but only if given expression is not of given type - already. - - Assume we have a model with two fields id (Integer) and name (String). - - :: - - import sqlalchemy as sa - from sqlalchemy_utils import cast_if - - - cast_if(User.id, sa.Integer) # "user".id - cast_if(User.name, sa.String) # "user".name - cast_if(User.id, sa.String) # CAST("user".id AS TEXT) - - - This function supports scalar values as well. - - - -## ... source file abbreviated to get to RelationshipProperty examples ... - - - if name == alias: - return entity - - -def get_polymorphic_mappers(mixed): - if isinstance(mixed, AliasedInsp): - return mixed.with_polymorphic_mappers + try: + expr_type = get_type(expression) + except TypeError: + expr_type = expression + check_type = type_().python_type else: - return mixed.polymorphic_map.values() + check_type = type_ + return ( + sa.cast(expression, type_) + if not isinstance(expr_type, check_type) + else expression + ) -def get_query_descriptor(query, entity, attr): - if attr in query_labels(query): - return attr - else: - entity = get_query_entity_by_alias(query, entity) - if entity: - descriptor = get_descriptor(entity, attr) - if ( - hasattr(descriptor, 'property') and -~~ isinstance(descriptor.property, sa.orm.RelationshipProperty) - ): - return - return descriptor - - -def get_descriptor(entity, attr): - mapper = sa.inspect(entity) - - for key, descriptor in get_all_descriptors(mapper).items(): - if attr == key: - prop = ( - descriptor.property - if hasattr(descriptor, 'property') - else None - ) - if isinstance(prop, ColumnProperty): - if isinstance(entity, sa.orm.util.AliasedClass): - for c in mapper.selectable.c: - if c.key == attr: - return c - else: - # If the property belongs to a class that uses - # polymorphic inheritance we have to take into account - # situations where the attribute exists in child class +def get_column_key(model, column): + mapper = sa.inspect(model) + try: + return mapper.get_property_by_column(column).key -## ... source file continues with no further RelationshipProperty examples... +## ... source file continues with no further RelationshipProperty examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown index 78fe06f00..66b851c6b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.session object_session code examples category: page slug: sqlalchemy-orm-session-object-session-examples -sortorder: 500031001 +sortorder: 500031054 toc: False sidebartitle: sqlalchemy.orm.session object_session meta: Python example code for the object_session function from the sqlalchemy.orm.session module of the SQLAlchemy project. @@ -16,7 +16,7 @@ object_session is a function within the sqlalchemy.orm.session module of the SQL and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -49,45 +49,50 @@ from ..utils import is_sequence def get_class_by_table(base, table, data=None): - """ - Return declarative class associated with given table. If no class is found - this function returns `None`. If multiple classes were found (polymorphic - cases) additional `data` parameter can be given to hint which class - to return. - - :: - - class User(Base): - __tablename__ = 'entity' - id = sa.Column(sa.Integer, primary_key=True) - name = sa.Column(sa.String) - - - get_class_by_table(Base, User.__table__) # User class - - - This function also supports models using single table inheritance. + found_classes = set( + c for c in base._decl_class_registry.values() + if hasattr(c, '__table__') and c.__table__ is table + ) + if len(found_classes) > 1: + if not data: + raise ValueError( + "Multiple declarative classes found for table '{0}'. " + "Please provide data parameter for this function to be able " + "to determine polymorphic scenarios.".format( + table.name + ) + ) + else: + for cls in found_classes: + mapper = sa.inspect(cls) + polymorphic_on = mapper.polymorphic_on.name + if polymorphic_on in data: ## ... source file abbreviated to get to object_session examples ... - """ - Return the bind for given SQLAlchemy Engine / Connection / declarative - model object. - - :param obj: SQLAlchemy Engine / Connection / declarative model object - - :: - - from sqlalchemy_utils import get_bind - - - get_bind(session) # Connection object + if isinstance(mixed, sa.Table): + mappers = [ + mapper for mapper in mapperlib._mapper_registry + if mixed in mapper.tables + ] + if len(mappers) > 1: + raise ValueError( + "Multiple mappers found for table '%s'." % mixed.name + ) + elif not mappers: + raise ValueError( + "Could not get mapper for table '%s'." % mixed.name + ) + else: + return mappers[0] + if not isclass(mixed): + mixed = type(mixed) + return sa.inspect(mixed) - get_bind(user) - """ +def get_bind(obj): if hasattr(obj, 'bind'): conn = obj.bind else: @@ -105,72 +110,21 @@ def get_class_by_table(base, table, data=None): def get_primary_keys(mixed): - """ - Return an OrderedDict of all primary keys for given Table object, - declarative class or declarative class instance. - - :param mixed: - SA Table object, SA declarative class or SA declarative class instance - - :: - - get_primary_keys(User) - - get_primary_keys(User()) - - -## ... source file abbreviated to get to object_session examples ... - - - else: - tmp.append(value) - last = tmp - elif isinstance(last, InstrumentedAttribute): - last = getter(last.property.mapper.class_) - elif last is None: - return None - else: - last = getter(last) - if condition is not None: - if is_sequence(last): - last = [v for v in last if condition(v)] - else: - if not condition(last): - return None - - return last - - -def is_deleted(obj): -~~ return obj in sa.orm.object_session(obj).deleted - - -def has_changes(obj, attrs=None, exclude=None): - """ - Simple shortcut function for checking if given attributes of given - declarative model object have changed during the session. Without - parameters this checks if given object has any modificiations. Additionally - exclude parameter can be given to check if given object has any changes - in any attributes other than the ones given in exclude. - - - :: - - - from sqlalchemy_utils import has_changes - - - user = User() - - has_changes(user, 'name') # False + return OrderedDict( + ( + (key, column) for key, column in get_columns(mixed).items() + if column.primary_key + ) + ) - user.name = u'someone' - has_changes(user, 'name') # True +def get_tables(mixed): + if isinstance(mixed, sa.Table): + return [mixed] + elif isinstance(mixed, sa.Column): ## ... source file continues with no further object_session examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown index e641e1917..4744c4d33 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.session Session code examples category: page slug: sqlalchemy-orm-session-session-examples -sortorder: 500031000 +sortorder: 500031053 toc: False sidebartitle: sqlalchemy.orm.session Session meta: Python example code for the Session class from the sqlalchemy.orm.session module of the SQLAlchemy project. @@ -28,6 +28,8 @@ flask-sqlalchemy is provided as open source under the ```python # __init__.py +import functools +import os import sys import warnings from math import ceil @@ -75,222 +77,7 @@ def _make_table(db): def _set_default_query_class(d, cls): -## ... source file abbreviated to get to Session examples ... - - - return self.end_time - self.start_time - - def __repr__(self): - return ( - f"" - ) - - -def _calling_context(app_path): - frm = sys._getframe(1) - while frm.f_back is not None: - name = frm.f_globals.get("__name__") - if name and (name == app_path or name.startswith(f"{app_path}.")): - funcname = frm.f_code.co_name - return f"{frm.f_code.co_filename}:{frm.f_lineno} ({funcname})" - frm = frm.f_back - return "" - - -~~class SignallingSession(SessionBase): - """The signalling session is the default session that Flask-SQLAlchemy - uses. It extends the default session system with bind selection and - modification tracking. - - If you want to use a different session you can override the - :meth:`SQLAlchemy.create_session` function. - - .. versionadded:: 2.0 - - .. versionadded:: 2.1 - The `binds` option was added, which allows a session to be joined - to an external transaction. - """ - - def __init__(self, db, autocommit=False, autoflush=True, **options): - #: The application that this session belongs to. - self.app = app = db.get_app() - track_modifications = app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] - bind = options.pop("bind", None) or db.engine - binds = options.pop("binds", db.get_binds(app)) - - if track_modifications: -~~ _SessionSignalEvents.register(self) - -~~ SessionBase.__init__( - self, - autocommit=autocommit, - autoflush=autoflush, - bind=bind, - binds=binds, - **options, - ) - - def get_bind(self, mapper=None, clause=None): - """Return the engine or connection for a given model or - table, using the ``__bind_key__`` if it is set. - """ - # mapper is None if someone tries to just get a connection - if mapper is not None: - try: - # SA >= 1.3 - persist_selectable = mapper.persist_selectable - except AttributeError: - # SA < 1.3 - persist_selectable = mapper.mapped_table - - info = getattr(persist_selectable, "info", {}) - bind_key = info.get("bind_key") - if bind_key is not None: - state = get_state(self.app) - return state.db.get_engine(self.app, bind=bind_key) -~~ return SessionBase.get_bind(self, mapper, clause) - - -~~class _SessionSignalEvents: - @classmethod - def register(cls, session): - if not hasattr(session, "_model_changes"): - session._model_changes = {} - - event.listen(session, "before_flush", cls.record_ops) - event.listen(session, "before_commit", cls.record_ops) - event.listen(session, "before_commit", cls.before_commit) - event.listen(session, "after_commit", cls.after_commit) - event.listen(session, "after_rollback", cls.after_rollback) - - @classmethod - def unregister(cls, session): - if hasattr(session, "_model_changes"): - del session._model_changes - - event.remove(session, "before_flush", cls.record_ops) - event.remove(session, "before_commit", cls.record_ops) - event.remove(session, "before_commit", cls.before_commit) - event.remove(session, "after_commit", cls.after_commit) - event.remove(session, "after_rollback", cls.after_rollback) - - @staticmethod - def record_ops(session, flush_context=None, instances=None): - - -## ... source file abbreviated to get to Session examples ... - - - class User(db.Model): - username = db.Column(db.String(80), unique=True) - pw_hash = db.Column(db.String(80)) - - You can still use :mod:`sqlalchemy` and :mod:`sqlalchemy.orm` directly, but - note that Flask-SQLAlchemy customizations are available only through an - instance of this :class:`SQLAlchemy` class. Query classes default to - :class:`BaseQuery` for `db.Query`, `db.Model.query_class`, and the default - query_class for `db.relationship` and `db.backref`. If you use these - interfaces through :mod:`sqlalchemy` and :mod:`sqlalchemy.orm` directly, - the default query class will be that of :mod:`sqlalchemy`. - - .. admonition:: Check types carefully - - Don't perform type or `isinstance` checks against `db.Table`, which - emulates `Table` behavior but is not a class. `db.Table` exposes the - `Table` interface, but is a function which allows omission of metadata. - - The ``session_options`` parameter, if provided, is a dict of parameters - to be passed to the session constructor. See -~~ :class:`-sqlalchemy.orm.session.Session` for the standard options. - - The ``engine_options`` parameter, if provided, is a dict of parameters - to be passed to create engine. See :func:`-sqlalchemy.create_engine` - for the standard options. The values given here will be merged with and - override anything set in the ``'SQLALCHEMY_ENGINE_OPTIONS'`` config - variable or othewise set by this library. - - .. versionchanged:: 3.0 - Removed the ``use_native_unicode`` parameter and config. - - .. versionchanged:: 3.0 - ``COMMIT_ON_TEARDOWN`` is deprecated and will be removed in - version 3.1. Call ``db.session.commit()`` directly instead. - - .. versionchanged:: 2.4 - Added the ``engine_options`` parameter. - - .. versionchanged:: 2.1 - Added the ``metadata`` parameter. This allows for setting custom - naming conventions among other, non-trivial things. - - .. versionchanged:: 2.1 - Added the ``query_class`` parameter, to allow customisation - of the query class, in place of the default of - - -## ... source file abbreviated to get to Session examples ... - - - created and removed with the request/response cycle, and should be fine - in most cases. - - :param options: dict of keyword arguments passed to session class in - ``create_session`` - """ - - if options is None: - options = {} - - scopefunc = options.pop("scopefunc", _app_ctx_stack.__ident_func__) - options.setdefault("query_cls", self.Query) - return orm.scoped_session(self.create_session(options), scopefunc=scopefunc) - - def create_session(self, options): - """Create the session factory used by :meth:`create_scoped_session`. - - The factory **must** return an object that SQLAlchemy recognizes as a session, - or registering session events may raise an exception. - -~~ Valid factories include a :class:`-sqlalchemy.orm.session.Session` - class or a :class:`-sqlalchemy.orm.session.sessionmaker`. - - The default implementation creates a ``sessionmaker`` for -~~ :class:`SignallingSession`. - - :param options: dict of keyword arguments passed to session class - """ - -~~ return orm.sessionmaker(class_=SignallingSession, db=self, **options) - - def make_declarative_base(self, model, metadata=None): - """Creates the declarative base that all models will inherit from. - - :param model: base model class (or a tuple of base classes) to pass - to :func:`-sqlalchemy.ext.declarative.declarative_base`. Or a class - returned from ``declarative_base``, in which case a new base class - is not created. - :param metadata: :class:`-sqlalchemy.MetaData` instance to use, or - none to use SQLAlchemy's default. - - .. versionchanged 2.3.0:: - ``model`` can be an existing declarative base in order to support - complex customization such as changing the metaclass. - """ - if not isinstance(model, DeclarativeMeta): - model = declarative_base( - cls=model, name="Model", metadata=metadata, metaclass=DefaultMeta - ) - - # if user passed in a declarative base and a metaclass for some reason, - # make sure the base uses the metaclass - if metadata is not None and model.metadata is not metadata: - model.metadata = metadata - - ## ... source file continues with no further Session examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown new file mode 100644 index 000000000..dc2a0290f --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown @@ -0,0 +1,121 @@ +title: sqlalchemy.orm SynonymProperty code examples +category: page +slug: sqlalchemy-orm-synonymproperty-examples +sortorder: 500031038 +toc: False +sidebartitle: sqlalchemy.orm SynonymProperty +meta: Python example code for the SynonymProperty class from the sqlalchemy.orm module of the SQLAlchemy project. + + +SynonymProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from marshmallow-sqlalchemy +[marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) +([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/)) +is a code library that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) with the +[Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +data serialization tool. + +The marshmallow-sqlalchemy project is provided as open source under the +[MIT license](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/LICENSE). + +[**marshmallow-sqlalchemy / src/marshmallow_sqlalchemy / convert.py**](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/src/marshmallow_sqlalchemy/./convert.py) + +```python +# convert.py +import inspect +import functools +import warnings + +import uuid +import marshmallow as ma +from marshmallow import validate, fields +from sqlalchemy.dialects import postgresql, mysql, mssql +~~from sqlalchemy.orm import SynonymProperty +import sqlalchemy as sa + +from .exceptions import ModelConversionError +from .fields import Related, RelatedList + + +def _is_field(value): + return isinstance(value, type) and issubclass(value, fields.Field) + + +def _has_default(column): + return ( + column.default is not None + or column.server_default is not None + or _is_auto_increment(column) + ) + + +def _is_auto_increment(column): + return column.table is not None and column is column.table._autoincrement_column + + +def _postgres_array_factory(converter, data_type): + return functools.partial( + + +## ... source file abbreviated to get to SynonymProperty examples ... + + + @property + def type_mapping(self): + if self.schema_cls: + return self.schema_cls.TYPE_MAPPING + else: + return ma.Schema.TYPE_MAPPING + + def fields_for_model( + self, + model, + *, + include_fk=False, + include_relationships=False, + fields=None, + exclude=None, + base_fields=None, + dict_cls=dict, + ): + result = dict_cls() + base_fields = base_fields or {} + for prop in model.__mapper__.iterate_properties: + key = self._get_field_name(prop) + if self._should_exclude_field(prop, fields=fields, exclude=exclude): + result[key] = None + continue +~~ if isinstance(prop, SynonymProperty): + continue + if hasattr(prop, "columns"): + if not include_fk: + for column in prop.columns: + if not column.foreign_keys: + break + else: + continue + if not include_relationships and hasattr(prop, "direction"): + continue + field = base_fields.get(key) or self.property2field(prop) + if field: + result[key] = field + return result + + def fields_for_table( + self, + table, + *, + include_fk=False, + fields=None, + exclude=None, + base_fields=None, + dict_cls=dict, + + +## ... source file continues with no further SynonymProperty examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown index aa2704c0b..5277f775b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.util AliasedInsp code examples category: page slug: sqlalchemy-orm-util-aliasedinsp-examples -sortorder: 500031000 +sortorder: 500031055 toc: False sidebartitle: sqlalchemy.orm.util AliasedInsp meta: Python example code for the AliasedInsp class from the sqlalchemy.orm.util module of the SQLAlchemy project. @@ -16,7 +16,7 @@ AliasedInsp is a class within the sqlalchemy.orm.util module of the SQLAlchemy p and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -49,37 +49,42 @@ from ..utils import is_sequence def get_class_by_table(base, table, data=None): - """ - Return declarative class associated with given table. If no class is found - this function returns `None`. If multiple classes were found (polymorphic - cases) additional `data` parameter can be given to hint which class - to return. - - :: - - class User(Base): - __tablename__ = 'entity' - id = sa.Column(sa.Integer, primary_key=True) - name = sa.Column(sa.String) - - - get_class_by_table(Base, User.__table__) # User class - - - This function also supports models using single table inheritance. - Additional data paratemer should be provided in these case. + found_classes = set( + c for c in base._decl_class_registry.values() + if hasattr(c, '__table__') and c.__table__ is table + ) + if len(found_classes) > 1: + if not data: + raise ValueError( + "Multiple declarative classes found for table '{0}'. " + "Please provide data parameter for this function to be able " + "to determine polymorphic scenarios.".format( + table.name + ) + ) + else: + for cls in found_classes: + mapper = sa.inspect(cls) + polymorphic_on = mapper.polymorphic_on.name + if polymorphic_on in data: + if data[polymorphic_on] == mapper.polymorphic_identity: ## ... source file abbreviated to get to AliasedInsp examples ... + return mapper.get_property_by_column(column).key + except sa.orm.exc.UnmappedColumnError: + for key, c in mapper.columns.items(): + if c.name == column.name and c.table is column.table: + return key + raise sa.orm.exc.UnmappedColumnError( + 'No column %s is configured on mapper %s...' % + (column, mapper) + ) - Raises: - ValueError: if multiple mappers were found for given argument - - .. versionadded: 0.26.1 - """ +def get_mapper(mixed): if isinstance(mixed, sa.orm.query._MapperEntity): mixed = mixed.expr elif isinstance(mixed, sa.Column): @@ -123,6 +128,11 @@ def get_bind(obj): ## ... source file abbreviated to get to AliasedInsp examples ... + else d['entity'] + for d in query.column_descriptions + ] + return [ + get_query_entity(expr) for expr in exprs ] + [ get_query_entity(entity) for entity in query._join_entities ] @@ -194,6 +204,5 @@ def get_descriptor(entity, attr): ## ... source file continues with no further AliasedInsp examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown new file mode 100644 index 000000000..0ae099971 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown @@ -0,0 +1,126 @@ +title: sqlalchemy.pool NullPool code examples +category: page +slug: sqlalchemy-pool-nullpool-examples +sortorder: 500031056 +toc: False +sidebartitle: sqlalchemy.pool NullPool +meta: Python example code for the NullPool class from the sqlalchemy.pool module of the SQLAlchemy project. + + +NullPool is a class within the sqlalchemy.pool module of the SQLAlchemy project. + + +## Example 1 from flask-sqlalchemy +[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) +([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) +and +[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a +[Flask](/flask.html) extension that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy +provides helper functions that reduce the amount of common boilerplate +code that you have to frequently write yourself if you did not use this +library when combining Flask with SQLAlchemy. + +flask-sqlalchemy is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). + +[**flask-sqlalchemy / src/flask_sqlalchemy / __init__.py**](https://github.com/pallets/flask-sqlalchemy/blob/master/src/flask_sqlalchemy/./__init__.py) + +```python +# __init__.py +import functools +import os +import sys +import warnings +from math import ceil +from operator import itemgetter +from threading import Lock +from time import perf_counter + +import sqlalchemy +from flask import _app_ctx_stack +from flask import abort +from flask import current_app +from flask import request +from flask.signals import Namespace +from sqlalchemy import event +from sqlalchemy import inspect +from sqlalchemy import orm +from sqlalchemy.engine.url import make_url +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.declarative import DeclarativeMeta +from sqlalchemy.orm.exc import UnmappedClassError +from sqlalchemy.orm.session import Session as SessionBase + +from .model import DefaultMeta +from .model import Model + +__version__ = "3.0.0.dev" + +_signals = Namespace() +models_committed = _signals.signal("models-committed") +before_models_committed = _signals.signal("before-models-committed") + + +def _make_table(db): + + +## ... source file abbreviated to get to NullPool examples ... + + + def apply_driver_hacks(self, app, sa_url, options): + if sa_url.drivername.startswith("mysql"): + sa_url.query.setdefault("charset", "utf8") + if sa_url.drivername != "mysql+gaerdbms": + options.setdefault("pool_size", 10) + options.setdefault("pool_recycle", 7200) + elif sa_url.drivername == "sqlite": + pool_size = options.get("pool_size") + detected_in_memory = False + if sa_url.database in (None, "", ":memory:"): + detected_in_memory = True + from sqlalchemy.pool import StaticPool + + options["poolclass"] = StaticPool + if "connect_args" not in options: + options["connect_args"] = {} + options["connect_args"]["check_same_thread"] = False + + if pool_size == 0: + raise RuntimeError( + "SQLite in memory database with an " + "empty queue not possible due to data " + "loss." + ) + elif not pool_size: +~~ from sqlalchemy.pool import NullPool + + options["poolclass"] = NullPool + + if not detected_in_memory and not os.path.isabs(sa_url.database): + os.makedirs(app.instance_path, exist_ok=True) + sa_url.database = os.path.join(app.instance_path, sa_url.database) + + @property + def engine(self): + return self.get_engine() + + def make_connector(self, app=None, bind=None): + return _EngineConnector(self, self.get_app(app), bind) + + def get_engine(self, app=None, bind=None): + + app = self.get_app(app) + state = get_state(app) + + with self._engine_lock: + connector = state.connectors.get(bind) + + if connector is None: + connector = self.make_connector(app, bind) + + +## ... source file continues with no further NullPool examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown new file mode 100644 index 000000000..b9f193759 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown @@ -0,0 +1,126 @@ +title: sqlalchemy.pool StaticPool code examples +category: page +slug: sqlalchemy-pool-staticpool-examples +sortorder: 500031057 +toc: False +sidebartitle: sqlalchemy.pool StaticPool +meta: Python example code for the StaticPool class from the sqlalchemy.pool module of the SQLAlchemy project. + + +StaticPool is a class within the sqlalchemy.pool module of the SQLAlchemy project. + + +## Example 1 from flask-sqlalchemy +[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) +([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) +and +[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a +[Flask](/flask.html) extension that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy +provides helper functions that reduce the amount of common boilerplate +code that you have to frequently write yourself if you did not use this +library when combining Flask with SQLAlchemy. + +flask-sqlalchemy is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). + +[**flask-sqlalchemy / src/flask_sqlalchemy / __init__.py**](https://github.com/pallets/flask-sqlalchemy/blob/master/src/flask_sqlalchemy/./__init__.py) + +```python +# __init__.py +import functools +import os +import sys +import warnings +from math import ceil +from operator import itemgetter +from threading import Lock +from time import perf_counter + +import sqlalchemy +from flask import _app_ctx_stack +from flask import abort +from flask import current_app +from flask import request +from flask.signals import Namespace +from sqlalchemy import event +from sqlalchemy import inspect +from sqlalchemy import orm +from sqlalchemy.engine.url import make_url +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.declarative import DeclarativeMeta +from sqlalchemy.orm.exc import UnmappedClassError +from sqlalchemy.orm.session import Session as SessionBase + +from .model import DefaultMeta +from .model import Model + +__version__ = "3.0.0.dev" + +_signals = Namespace() +models_committed = _signals.signal("models-committed") +before_models_committed = _signals.signal("before-models-committed") + + +def _make_table(db): + + +## ... source file abbreviated to get to StaticPool examples ... + + + if app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"]: + warnings.warn( + "'COMMIT_ON_TEARDOWN' is deprecated and will be" + " removed in version 3.1. Call" + " 'db.session.commit()'` directly instead.", + DeprecationWarning, + ) + + if response_or_exc is None: + self.session.commit() + + self.session.remove() + return response_or_exc + + def apply_driver_hacks(self, app, sa_url, options): + if sa_url.drivername.startswith("mysql"): + sa_url.query.setdefault("charset", "utf8") + if sa_url.drivername != "mysql+gaerdbms": + options.setdefault("pool_size", 10) + options.setdefault("pool_recycle", 7200) + elif sa_url.drivername == "sqlite": + pool_size = options.get("pool_size") + detected_in_memory = False + if sa_url.database in (None, "", ":memory:"): + detected_in_memory = True +~~ from sqlalchemy.pool import StaticPool + + options["poolclass"] = StaticPool + if "connect_args" not in options: + options["connect_args"] = {} + options["connect_args"]["check_same_thread"] = False + + if pool_size == 0: + raise RuntimeError( + "SQLite in memory database with an " + "empty queue not possible due to data " + "loss." + ) + elif not pool_size: + from sqlalchemy.pool import NullPool + + options["poolclass"] = NullPool + + if not detected_in_memory and not os.path.isabs(sa_url.database): + os.makedirs(app.instance_path, exist_ok=True) + sa_url.database = os.path.join(app.instance_path, sa_url.database) + + @property + def engine(self): + return self.get_engine() + + +## ... source file continues with no further StaticPool examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown index d8dd057c8..5081ff05f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CheckConstraint code examples category: page slug: sqlalchemy-schema-checkconstraint-examples -sortorder: 500031000 +sortorder: 500031058 toc: False sidebartitle: sqlalchemy.schema CheckConstraint meta: Python example code for the CheckConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. @@ -60,6 +60,11 @@ sqla_1216 = _vers >= (1, 2, 16) ## ... source file abbreviated to get to CheckConstraint examples ... +def _exec_on_inspector(inspector, statement, **params): + if sqla_14: + with inspector._operation_context() as conn: + return conn.execute(statement, params) + else: return inspector.bind.execute(statement, params) @@ -109,6 +114,5 @@ def _fk_spec(constraint): ## ... source file continues with no further CheckConstraint examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown index 253b4eb13..a66e757f1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Column code examples category: page slug: sqlalchemy-schema-column-examples -sortorder: 500031001 +sortorder: 500031059 toc: False sidebartitle: sqlalchemy.schema Column meta: Python example code for the Column class from the sqlalchemy.schema module of the SQLAlchemy project. @@ -61,8 +61,17 @@ sqla_13 = _vers >= (1, 3) ## ... source file abbreviated to get to Column examples ... + tokens = spec.split(".") + tokens.pop(-1) # colname + tablekey = ".".join(tokens) + return tablekey == constraint.parent.key + + +def _is_type_bound(constraint): + return constraint._type_bound + + def _find_columns(clause): - """locate Column objects within the given expression.""" cols = set() traverse(clause, {}, {"column": cols.add}) @@ -70,16 +79,12 @@ def _find_columns(clause): def _remove_column_from_collection(collection, column): - """remove a column from a ColumnCollection.""" - # workaround for older SQLAlchemy, remove the - # same object that's present to_remove = collection[column.key] collection.remove(to_remove) def _textual_index_column(table, text_): - """a workaround for the Index construct's severe lack of flexibility""" if isinstance(text_, compat.string_types): ~~ c = Column(text_, sqltypes.NULLTYPE) table.append_column(c) @@ -90,21 +95,7 @@ def _textual_index_column(table, text_): raise ValueError("String or text() construct expected") -~~class _textual_index_element(sql.ColumnElement): - """Wrap around a sqlalchemy text() construct in such a way that - we appear like a column-oriented SQL expression to an Index - construct. - - The issue here is that currently the Postgresql dialect, the biggest - recipient of functional indexes, keys all the index expressions to - the corresponding column expressions when rendering CREATE INDEX, - so the Index we create here needs to have a .columns collection that - is the same length as the .expressions collection. Ultimately - SQLAlchemy should support text() expressions in indexes. - - See SQLAlchemy issue 3174. - - """ +class _textual_index_element(sql.ColumnElement): __visit_name__ = "_textual_idx_element" @@ -112,7 +103,7 @@ def _textual_index_column(table, text_): self.table = table self.text = text self.key = text.text -~~ self.fake_column = schema.Column(self.text.text, sqltypes.NULLTYPE) + self.fake_column = schema.Column(self.text.text, sqltypes.NULLTYPE) table.append_column(self.fake_column) def get_children(self): @@ -120,28 +111,10 @@ def _textual_index_column(table, text_): @compiles(_textual_index_element) -def _render_textual_index_column(element, compiler, **kw): - return compiler.process(element.text, **kw) - - -class _literal_bindparam(_BindParamClause): - pass - - -@compiles(_literal_bindparam) -def _render_literal_bindparam(element, compiler, **kw): - return compiler.render_literal_bindparam(element, **kw) - - -def _get_index_expressions(idx): - return list(idx.expressions) - - ## ... source file continues with no further Column examples... - ``` @@ -172,48 +145,9 @@ from .declarative import Model class Loader: - """The abstract base class of loaders. - - Loaders are used to load raw database rows into expected results. - :class:`-gino.engine.GinoEngine` will use the loader set on the ``loader`` value of - the :meth:`-sqlalchemy.sql.expression.Executable.execution_options`, for example:: - - from sqlalchemy import text, create_engine -~~ from gino.loader import ColumnLoader - - e = await create_engine("postgresql://localhost/gino", strategy="gino") - q = text("SELECT now() as ts") -~~ loader = ColumnLoader("ts") - ts = await e.first(q.execution_options(loader=loader)) # datetime - - """ @classmethod def get(cls, value): - """Automatically create a loader based on the type of the given value. - - +-------------------------------------------+--------------------------+ - | value type | loader type | - +===========================================+==========================+ - | :class:`tuple` | :class:`-TupleLoader` | - +-------------------------------------------+--------------------------+ - | :func:`callable` | :class:`-CallableLoader` | - +-------------------------------------------+--------------------------+ -~~ | :class:`-sqlalchemy.schema.Column`, | :class:`-ColumnLoader` | - | :class:`-sqlalchemy.sql.expression.Label` | | - +-------------------------------------------+--------------------------+ - | :class:`-gino.declarative.Model` | :class:`-ModelLoader` | - +-------------------------------------------+--------------------------+ - | :class:`-gino.crud.Alias` | :class:`-AliasLoader` | - +-------------------------------------------+--------------------------+ - | :class:`-Loader` | as is | - +-------------------------------------------+--------------------------+ - | any other types | :class:`-ValueLoader` | - +-------------------------------------------+--------------------------+ - - :param value: Any supported value above. - :return: A loader instance. - """ from .crud import Alias if isinstance(value, Loader): @@ -223,9 +157,9 @@ class Loader: elif isinstance(value, Alias): rv = AliasLoader(value) ~~ elif isinstance(value, Column): -~~ rv = ColumnLoader(value) + rv = ColumnLoader(value) elif isinstance(value, Label): -~~ rv = ColumnLoader(value.name) + rv = ColumnLoader(value.name) elif isinstance(value, tuple): rv = TupleLoader(value) elif callable(value): @@ -236,12 +170,6 @@ class Loader: @property def query(self): - """Generate a query from this loader. - - This is an experimental feature, not all loaders support this. - - :return: A query instance with the ``loader`` execution option set to self. - """ rv = select(self.get_columns()) from_clause = self.get_from() if from_clause is not None: @@ -249,23 +177,12 @@ class Loader: return rv.execution_options(loader=self) def do_load(self, row, context): - """Interface used by GINO to run the loader. - - -## ... source file abbreviated to get to Column examples ... - + raise NotImplementedError + def get_columns(self): return [] def get_from(self): - """Generate a clause to be used in - :meth:`-sqlalchemy.sql.expression.Select.select_from` from this loader. - - This is an experimental feature, this method is supposed to be called by - :attr:`-query`. - - :return: A :class:`-sqlalchemy.sql.expression.FromClause` instance, or ``None``. - """ return None def __getattr__(self, item): @@ -275,7 +192,7 @@ class Loader: _none = object() -~~def _get_column(model, column_or_name) -> Column: +def _get_column(model, column_or_name) -> Column: if isinstance(column_or_name, str): return getattr(model, column_or_name) @@ -283,7 +200,7 @@ _none = object() if column_or_name in model: return column_or_name raise AttributeError( -~~ "Column {} does not belong to model {}".format(column_or_name, model) + "Column {} does not belong to model {}".format(column_or_name, model) ) raise TypeError( @@ -292,51 +209,6 @@ _none = object() class ModelLoader(Loader): - """A loader that loads a row into a GINO model instance. - - This loader generates an instance of the given ``model`` type and fills the instance - with attributes according to the other given parameters: - - * Load each column attribute listed in the given ``columns`` positional arguments. - * If ``columns`` is not given, all defined columns of the ``model`` will be loaded. - * For each keyword argument, its value will be used to generate a loader using - :meth:`Loader.get`, and the loaded value will be :func:`setattr` to the model - instance under the name of the key. - - .. note: - - The loader does not affect the query. You must have the values in the SQL result - before you can use loaders to load them into model instances. - - - -## ... source file abbreviated to get to Column examples ... - - - ).execution_options( - loader=ModelLoader(User, id=1) - ) - - ``1`` is then converted into a :class:`-ValueLoader` and mocked the ``id`` attribute - of all returned ``User`` instances as ``1``. - - Nest another :class:`-ModelLoader`:: - - sqlalchemy.select( - [user.outerjoin(Company)] - ).execution_options( - loader=ModelLoader(User, company=Company) - ) - - Likewise, ``Company`` is converted into a :class:`-ModelLoader` to load the - ``Company`` columns from the joined result, and the ``Company`` instances are set to - the ``company`` attribute of each ``User`` instance using :func:`setattr`. - - :param model: A subclass of :class:`-gino.declarative.Model` to instantiate. -~~ :param columns: A list of :class:`-sqlalchemy.schema.Column` or :class:`str` to - load, default is all the columns in the model. - :param extras: Additional attributes to load on the model instance. - """ def __init__(self, model, *columns, **extras): self.model = model @@ -349,95 +221,9 @@ class ModelLoader(Loader): self.on_clause = None def _do_load(self, row): - values = dict((c.name, row[c]) for c in self.columns if c in row) - if all((v is None) for v in values.values()): - return None - rv = self.model() - for c in self.columns: - if c in row: - # noinspection PyProtectedMember - instance_key = self.model._column_name_map.invert_get(c.name) - rv.__values__[instance_key] = row[c] - - -## ... source file abbreviated to get to Column examples ... - - - self.extras.update((key, self.get(value)) for key, value in extras.items()) - return self - - def on(self, on_clause): - """Specify the ``on_clause`` for generating joined queries. - - This is an experimental feature, used by :meth:`-get_from`. - - :param on_clause: An expression to feed into - :func:`-sqlalchemy.sql.expression.join`. - :return: ``self`` for chaining. - """ - - self.on_clause = on_clause - return self - - def distinct(self, *columns): - """Configure this loader to reuse instances that have the same values of all the - give columns. - -~~ :param columns: Preferably :class:`-sqlalchemy.schema.Column` instances. - :return: ``self`` for chaining. - """ - self._distinct = columns - return self - - def none_as_none(self, enabled=True): - """Deprecated method for compatibility, does nothing.""" - if not enabled: - warnings.warn( - "Disabling none_as_none is not supported.", DeprecationWarning, - ) - return self - - -class AliasLoader(ModelLoader): - """The same as :class:`-ModelLoader`, kept for compatibility.""" - - def __init__(self, alias, *columns, **extras): - super().__init__(alias, *columns, **extras) - - -~~class ColumnLoader(Loader): - """Load a given column in the row. - - :param column: The column name as :class:`str`, or a -~~ :class:`-sqlalchemy.schema.Column` instance to avoid name conflict. - """ - - def __init__(self, column): - self.column = column - - def do_load(self, row, context): - """Interface used by GINO to run the loader. - - :param row: A :class:`-sqlalchemy.engine.RowProxy` instance. - :param context: Not used. - :return: The value of the specified column, followed by ``True``. - """ - - return row[self.column], True - - -class TupleLoader(Loader): - """Load multiple values into a tuple. - - :param values: A :class:`tuple`, each item is converted into a loader with - :func:`Loader.get`. - """ - - def __init__(self, values): ## ... source file continues with no further Column examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown index fb34a4997..cec4dce11 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CreateIndex code examples category: page slug: sqlalchemy-schema-createindex-examples -sortorder: 500031002 +sortorder: 500031060 toc: False sidebartitle: sqlalchemy.schema CreateIndex meta: Python example code for the CreateIndex class from the sqlalchemy.schema module of the SQLAlchemy project. @@ -52,58 +52,7 @@ class MSSQLImpl(DefaultImpl): -## ... source file abbreviated to get to CreateIndex examples ... - - - super(MSSQLImpl, self).alter_column( - table_name, - column_name, - schema=schema, - server_default=server_default, - ) - - if name is not None: - super(MSSQLImpl, self).alter_column( - table_name, column_name, schema=schema, name=name - ) - - def create_index(self, index): - # this likely defaults to None if not present, so get() - # should normally not return the default value. being - # defensive in any case - mssql_include = index.kwargs.get("mssql_include", None) or () - for col in mssql_include: - if col not in index.table.c: - index.table.append_column(Column(col, sqltypes.NullType)) -~~ self._exec(CreateIndex(index)) - - def bulk_insert(self, table, rows, **kw): - if self.as_sql: - self._exec( - "SET IDENTITY_INSERT %s ON" - % self.dialect.identifier_preparer.format_table(table) - ) - super(MSSQLImpl, self).bulk_insert(table, rows, **kw) - self._exec( - "SET IDENTITY_INSERT %s OFF" - % self.dialect.identifier_preparer.format_table(table) - ) - else: - super(MSSQLImpl, self).bulk_insert(table, rows, **kw) - - def drop_column(self, table_name, column, schema=None, **kw): - drop_default = kw.pop("mssql_drop_default", False) - if drop_default: - self._exec( - _ExecDropConstraint( - table_name, column, "sys.default_constraints", schema - ) - ) - drop_check = kw.pop("mssql_drop_check", False) - - ## ... source file continues with no further CreateIndex examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown index 3e82e1d3a..c5cca2e2a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema DDLElement code examples category: page slug: sqlalchemy-schema-ddlelement-examples -sortorder: 500031004 +sortorder: 500031061 toc: False sidebartitle: sqlalchemy.schema DDLElement meta: Python example code for the DDLElement class from the sqlalchemy.schema module of the SQLAlchemy project. @@ -42,12 +42,6 @@ from ..util.sqla_compat import _table_for_constraint # noqa ~~class AlterTable(DDLElement): - """Represent an ALTER TABLE statement. - - Only the string name and optional schema name of the table - is required, not a full Table object. - - """ def __init__(self, table_name, schema=None): self.table_name = table_name @@ -65,11 +59,16 @@ class AlterColumn(AlterTable): self, name, column_name, + schema=None, + existing_type=None, + existing_nullable=None, + existing_server_default=None, + existing_comment=None, + ): ## ... source file continues with no further DDLElement examples... - ``` @@ -79,7 +78,7 @@ class AlterColumn(AlterTable): and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -141,6 +140,5 @@ def create_table_from_selectable( ## ... source file continues with no further DDLElement examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown index 88dbcff97..d01595dda 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema ForeignKeyConstraint code examples category: page slug: sqlalchemy-schema-foreignkeyconstraint-examples -sortorder: 500031006 +sortorder: 500031062 toc: False sidebartitle: sqlalchemy.schema ForeignKeyConstraint meta: Python example code for the ForeignKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. @@ -62,6 +62,11 @@ sqla_14 = _vers >= (1, 4) ## ... source file abbreviated to get to ForeignKeyConstraint examples ... +def _connectable_has_table(connectable, tablename, schemaname): + if sqla_14: + return inspect(connectable).has_table(tablename, schemaname) + else: + return connectable.dialect.has_table( connectable, tablename, schemaname ) @@ -118,7 +123,6 @@ def _fk_spec(constraint): ## ... source file continues with no further ForeignKeyConstraint examples... - ``` @@ -128,7 +132,7 @@ def _fk_spec(constraint): and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -167,66 +171,21 @@ def get_foreign_key_values(fk, obj): def group_foreign_keys(foreign_keys): - """ - Return a groupby iterator that groups given foreign keys by table. - - :param foreign_keys: a sequence of foreign keys + foreign_keys = sorted( + foreign_keys, key=lambda key: key.constraint.table.name + ) + return groupby(foreign_keys, lambda key: key.constraint.table) ## ... source file abbreviated to get to ForeignKeyConstraint examples ... - TextItem. - - :: - - # This will check all foreign keys that reference either article table - # or textitem table. - get_referencing_foreign_keys(Article) - - .. seealso:: :func:`get_tables` - """ - if isinstance(mixed, sa.Table): - tables = [mixed] - else: - tables = get_tables(mixed) - - referencing_foreign_keys = set() - - for table in mixed.metadata.tables.values(): - if table not in tables: - for constraint in table.constraints: -~~ if isinstance(constraint, sa.sql.schema.ForeignKeyConstraint): - for fk in constraint.elements: - if any(fk.references(t) for t in tables): - referencing_foreign_keys.add(fk) - return referencing_foreign_keys + ) + criteria.append(sa.and_(*subcriteria)) + return criteria -def merge_references(from_, to, foreign_keys=None): - """ - Merge the references of an entity into another entity. - - Consider the following models:: - - class User(self.Base): - __tablename__ = 'user' - id = sa.Column(sa.Integer, primary_key=True) - name = sa.Column(sa.String(255)) - - def __repr__(self): - return 'User(name=%r)' % self.name - - class BlogPost(self.Base): - __tablename__ = 'blog_post' - id = sa.Column(sa.Integer, primary_key=True) - title = sa.Column(sa.String(255)) - - -## ... source file abbreviated to get to ForeignKeyConstraint examples ... - - - """ +def non_indexed_foreign_keys(metadata, engine=None): reflected_metadata = MetaData() if metadata.bind is None and engine is None: @@ -261,8 +220,8 @@ def get_fk_constraint_for_columns(table, *columns): return constraint -## ... source file continues with no further ForeignKeyConstraint examples... +## ... source file continues with no further ForeignKeyConstraint examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown index 3f3189188..56771d70e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema PrimaryKeyConstraint code examples category: page slug: sqlalchemy-schema-primarykeyconstraint-examples -sortorder: 500031007 +sortorder: 500031063 toc: False sidebartitle: sqlalchemy.schema PrimaryKeyConstraint meta: Python example code for the PrimaryKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. @@ -16,7 +16,7 @@ PrimaryKeyConstraint is a class within the sqlalchemy.schema module of the SQLAl and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -60,6 +60,11 @@ class DropView(DDLElement): ## ... source file abbreviated to get to PrimaryKeyConstraint examples ... + name, + selectable, + indexes=None, + metadata=None, + aliases=None ): if indexes is None: indexes = [] @@ -92,23 +97,22 @@ def create_materialized_view( indexes=None, aliases=None ): - """ Create a view on a given metadata - - :param name: The name of the view to create. - :param selectable: An SQLAlchemy selectable e.g. a select() statement. - :param metadata: - An SQLAlchemy Metadata instance that stores the features of the - database being described. - :param indexes: An optional list of SQLAlchemy Index instances. - :param aliases: - An optional dictionary containing with keys as column names and values - as column aliases. + table = create_table_from_selectable( + name=name, + selectable=selectable, + indexes=indexes, + metadata=None, + aliases=aliases + ) - Same as for ``create_view`` except that a ``CREATE MATERIALIZED VIEW`` + sa.event.listen( + metadata, + 'after_create', + CreateView(name, selectable, materialized=True) + ) ## ... source file continues with no further PrimaryKeyConstraint examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown index bb3cacb12..5b0a22dfb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Table code examples category: page slug: sqlalchemy-schema-table-examples -sortorder: 500031008 +sortorder: 500031064 toc: False sidebartitle: sqlalchemy.schema Table meta: Python example code for the Table class from the sqlalchemy.schema module of the SQLAlchemy project. @@ -16,7 +16,7 @@ Table is a class within the sqlalchemy.schema module of the SQLAlchemy project. and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -55,74 +55,29 @@ def get_foreign_key_values(fk, obj): def group_foreign_keys(foreign_keys): - """ - Return a groupby iterator that groups given foreign keys by table. - - :param foreign_keys: a sequence of foreign keys - - -## ... source file abbreviated to get to Table examples ... - - - # do something - pass - - - .. seealso:: :func:`get_referencing_foreign_keys` - - .. versionadded: 0.26.1 - """ foreign_keys = sorted( foreign_keys, key=lambda key: key.constraint.table.name ) return groupby(foreign_keys, lambda key: key.constraint.table) -def get_referencing_foreign_keys(mixed): - """ - Returns referencing foreign keys for given Table object or declarative - class. - - :param mixed: -~~ SA Table object or SA declarative class - - :: - - get_referencing_foreign_keys(User) # set([ForeignKey('user.id')]) - - get_referencing_foreign_keys(User.__table__) - - - This function also understands inheritance. This means it returns - all foreign keys that reference any table in the class inheritance tree. - - Let's say you have three classes which use joined table inheritance, - namely TextItem, Article and BlogPost with Article and BlogPost inheriting - TextItem. - - :: - - # This will check all foreign keys that reference either article table - # or textitem table. - get_referencing_foreign_keys(Article) - - .. seealso:: :func:`get_tables` - """ - if isinstance(mixed, sa.Table): - - ## ... source file abbreviated to get to Table examples ... -def non_indexed_foreign_keys(metadata, engine=None): - """ - Finds all non indexed foreign keys from all tables of given MetaData. + getattr(class_, get_column_key(class_, column)) == + getattr( + obj, + sa.inspect(type(obj)) + .get_property_by_column( + foreign_column + ).key + ) + ) + criteria.append(sa.and_(*subcriteria)) + return criteria - Very useful for optimizing postgresql database and finding out which - foreign keys need indexes. - :param metadata: MetaData object to inspect tables from - """ +def non_indexed_foreign_keys(metadata, engine=None): reflected_metadata = MetaData() if metadata.bind is None and engine is None: @@ -157,8 +112,8 @@ def get_fk_constraint_for_columns(table, *columns): return constraint -## ... source file continues with no further Table examples... +## ... source file continues with no further Table examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown new file mode 100644 index 000000000..221a204ee --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown @@ -0,0 +1,197 @@ +title: sqlalchemy.sql ClauseElement code examples +category: page +slug: sqlalchemy-sql-clauseelement-examples +sortorder: 500031065 +toc: False +sidebartitle: sqlalchemy.sql ClauseElement +meta: Python example code for the ClauseElement class from the sqlalchemy.sql module of the SQLAlchemy project. + + +ClauseElement is a class within the sqlalchemy.sql module of the SQLAlchemy project. + + +## Example 1 from GINO +[GINO](https://github.com/fantix/gino) +([project documentation](https://python-gino.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/gino/)) +is an [object-relational mapper (ORM)](/object-relational-mappers-orms.html) +built on SQLAlchemy that is non-blocking and therefore designed to work properly +with asynchronously-run code, for example, an application written with +[asyncio](https://docs.python.org/3/library/asyncio.html). + +GINO is open sourced under the [BSD License](https://github.com/python-gino/gino/blob/master/LICENSE). + +[**GINO / src/gino / crud.py**](https://github.com/python-gino/gino/blob/master/src/gino/./crud.py) + +```python +# crud.py +import inspect +import itertools +import weakref + +import sqlalchemy as sa +~~from sqlalchemy.sql import ClauseElement + +from . import json_support +from .declarative import Model, InvertDict +from .exceptions import NoSuchRowError +from .loader import AliasLoader, ModelLoader + +DEFAULT = object() + + +class _Create: + def __get__(self, instance, owner): + if instance is None: + return owner._create_without_instance + else: + return instance._create + + +class _Query: + def __get__(self, instance, owner): + owner._check_abstract() + q = sa.select([owner.__table__]) + if instance is not None: + q = q.where(instance.lookup()) + return q.execution_options(model=weakref.ref(owner)) + + +## ... source file abbreviated to get to ClauseElement examples ... + + + owner._check_abstract() + q = owner.__table__.delete() + return q.execution_options(model=weakref.ref(owner)) + else: + return instance._delete + + +class UpdateRequest: + + def __init__(self, instance: "CRUDModel"): + self._instance = instance + self._values = {} + self._props = {} + self._literal = True + self._locator = None + if instance.__table__ is not None: + try: + self._locator = instance.lookup() + except LookupError: + pass + + def _set(self, key, value): + self._values[key] = value + + def _set_prop(self, prop, value): +~~ if isinstance(value, ClauseElement): + self._literal = False + self._props[prop] = value + + async def apply(self, bind=None, timeout=DEFAULT): + if self._locator is None: + raise TypeError( + "Model {} has no table, primary key or custom lookup()".format( + self._instance.__class__.__name__ + ) + ) + cls = type(self._instance) + values = self._values.copy() + + json_updates = {} + for prop, value in self._props.items(): + value = prop.save(self._instance, value) + updates = json_updates.setdefault(prop.prop_name, {}) + if self._literal: + updates[prop.name] = value + else: + if isinstance(value, int): + value = sa.cast(value, sa.BigInteger) +~~ elif not isinstance(value, ClauseElement): + value = sa.cast(value, sa.Unicode) + updates[sa.cast(prop.name, sa.Unicode)] = value + for prop_name, updates in json_updates.items(): + prop = getattr(cls, prop_name) + from .dialects.asyncpg import JSONB + + if isinstance(prop.type, JSONB): + if self._literal: + values[prop_name] = prop.concat(updates) + else: + values[prop_name] = prop.concat( + sa.func.jsonb_build_object(*itertools.chain(*updates.items())) + ) + else: + raise TypeError( + "{} is not supported to update json " + "properties in Gino. Please consider using " + "JSONB.".format(prop.type) + ) + + opts = dict(return_model=False) + if timeout is not DEFAULT: + opts["timeout"] = timeout + clause = ( + + +## ... source file abbreviated to get to ClauseElement examples ... + + + ) + if bind is None: + bind = cls.__metadata__.bind + row = await bind.first(clause) + if not row: + raise NoSuchRowError() + for k, v in row.items(): + self._instance.__values__[self._instance._column_name_map.invert_get(k)] = v + for prop in self._props: + prop.reload(self._instance) + return self + + def update(self, **values): + + cls = type(self._instance) + for key, value in values.items(): + prop = cls.__dict__.get(key) + if isinstance(prop, json_support.JSONProperty): + value_from = "__profile__" + method = self._set_prop + k = prop + else: + value_from = "__values__" + method = self._set + k = key +~~ if not isinstance(value, ClauseElement): + setattr(self._instance, key, value) + value = getattr(self._instance, value_from)[key] + method(k, value) + return self + + +class Alias: + + def __init__(self, model, *args, **kwargs): + model._check_abstract() + self.model = model + self.alias = model.__table__.alias(*args, **kwargs) + + def __getattr__(self, item): + rv = getattr( + self.alias.columns, + item, + getattr(self.alias, item, getattr(self.model, item, DEFAULT)), + ) + if rv is DEFAULT: + raise AttributeError + return rv + + def __iter__(self): + + +## ... source file continues with no further ClauseElement examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown new file mode 100644 index 000000000..94282701f --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown @@ -0,0 +1,207 @@ +title: sqlalchemy.sql column code examples +category: page +slug: sqlalchemy-sql-column-examples +sortorder: 500031066 +toc: False +sidebartitle: sqlalchemy.sql column +meta: Python example code for the column function from the sqlalchemy.sql module of the SQLAlchemy project. + + +column is a function within the sqlalchemy.sql module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / operations / ops.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/operations/ops.py) + +```python +# ops.py +import re + +from sqlalchemy.types import NULLTYPE + +from . import schemaobj +from .base import BatchOperations +from .base import Operations +from .. import util +from ..util import sqla_compat + + +class MigrateOperation(object): + + @util.memoized_property + def info(self): + return {} + + _mutations = frozenset() + + +class AddConstraintOp(MigrateOperation): + + add_constraint_ops = util.Dispatcher() + + @property + def constraint_type(self): + raise NotImplementedError() + + @classmethod + def register_add_constraint(cls, type_): + def go(klass): + cls.add_constraint_ops.dispatch_for(type_)(klass.from_constraint) + return klass + + return go + + +## ... source file abbreviated to get to column examples ... + + + @classmethod + def bulk_insert(cls, operations, table, rows, multiinsert=True): + + op = cls(table, rows, multiinsert=multiinsert) + operations.invoke(op) + + +@Operations.register_operation("execute") +class ExecuteSQLOp(MigrateOperation): + + def __init__(self, sqltext, execution_options=None): + self.sqltext = sqltext + self.execution_options = execution_options + + @classmethod + def execute(cls, operations, sqltext, execution_options=None): + r"""Execute the given SQL using the current migration context. + + The given SQL can be a plain string, e.g.:: + + op.execute("INSERT INTO table (foo) VALUES ('some value')") + + Or it can be any kind of Core SQL Expression construct, such as + below where we use an update construct:: + +~~ from sqlalchemy.sql import table, column + from sqlalchemy import String + from alembic import op + + account = table('account', +~~ column('name', String) + ) + op.execute( + account.update().\\ + where(account.c.name==op.inline_literal('account 1')).\\ + values({'name':op.inline_literal('account 2')}) + ) + + Above, we made use of the SQLAlchemy + :func:`sqlalchemy.sql.expression.table` and + :func:`sqlalchemy.sql.expression.column` constructs to make a brief, + ad-hoc table construct just for our UPDATE statement. A full + :class:`-sqlalchemy.schema.Table` construct of course works perfectly + fine as well, though note it's a recommended practice to at least + ensure the definition of a table is self-contained within the migration + script, rather than imported from a module that may break compatibility + with older migrations. + + In a SQL script context, the statement is emitted directly to the + output stream. There is *no* return result, however, as this + function is oriented towards generating a change script + that can run in "offline" mode. Additionally, parameterized + statements are discouraged here, as they *will not work* in offline + mode. Above, we use :meth:`.inline_literal` where parameters are + to be used. + When producing MySQL-compatible migration files, + it is recommended that the ``existing_type``, + ``existing_server_default``, and ``existing_nullable`` + parameters be present, if not being altered. + + Type changes which are against the SQLAlchemy + "schema" types :class:`-sqlalchemy.types.Boolean` + and :class:`-sqlalchemy.types.Enum` may also + add or drop constraints which accompany those + types on backends that don't support them natively. + The ``existing_type`` argument is + used in this case to identify and remove a previous + constraint that was bound to the type object. + + :param table_name: string name of the target table. + :param column_name: string name of the target column, + as it exists before the operation begins. + :param nullable: Optional; specify ``True`` or ``False`` + to alter the column's nullability. + :param server_default: Optional; specify a string + SQL expression, :func:`-sqlalchemy.sql.expression.text`, + or :class:`-sqlalchemy.schema.DefaultClause` to indicate + an alteration to the column's default value. + Set to ``None`` to have the default removed. + :param comment: optional string text of a new comment to add to the +~~ column. + + .. versionadded:: 1.0.6 + + :param new_column_name: Optional; specify a string name here to + indicate the new name within a column rename operation. + :param type\_: Optional; a :class:`-sqlalchemy.types.TypeEngine` + type object to specify a change to the column's type. + For SQLAlchemy types that also indicate a constraint (i.e. + :class:`-sqlalchemy.types.Boolean`, :class:`-sqlalchemy.types.Enum`), + the constraint is also generated. + :param autoincrement: set the ``AUTO_INCREMENT`` flag of the column; + currently understood by the MySQL dialect. + :param existing_type: Optional; a + :class:`-sqlalchemy.types.TypeEngine` + type object to specify the previous type. This + is required for all MySQL column alter operations that + don't otherwise specify a new type, as well as for + when nullability is being changed on a SQL Server +~~ column. It is also used if the type is a so-called + SQLlchemy "schema" type which may define a constraint (i.e. + :class:`-sqlalchemy.types.Boolean`, + :class:`-sqlalchemy.types.Enum`), + so that the constraint can be dropped. + :param existing_server_default: Optional; The existing +~~ default value of the column. Required on MySQL if + an existing default is not being changed; else MySQL + removes the default. + :param existing_nullable: Optional; the existing nullability +~~ of the column. Required on MySQL if the existing nullability + is not being changed; else MySQL sets this to NULL. + :param existing_autoincrement: Optional; the existing autoincrement +~~ of the column. Used for MySQL's system of altering a column + that specifies ``AUTO_INCREMENT``. + :param existing_comment: string text of the existing comment on the + column to be maintained. Required on MySQL if the existing comment + on the column is not being changed. + + .. versionadded:: 1.0.6 + + :param schema: Optional schema name to operate within. To control + quoting of the schema outside of the default behavior, use + the SQLAlchemy construct + :class:`-sqlalchemy.sql.elements.quoted_name`. + + .. versionadded:: 0.7.0 'schema' can now accept a + :class:`-sqlalchemy.sql.elements.quoted_name` construct. + + :param postgresql_using: String argument which will indicate a + SQL expression to render within the Postgresql-specific USING clause + within ALTER COLUMN. This string is taken directly as raw SQL which + must explicitly include any necessary quoting or escaping of tokens + within the expression. + + .. versionadded:: 0.8.8 + + batch migration context. + + +## ... source file continues with no further column examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown index f0cad754c..44b6aa309 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.elements Label code examples category: page slug: sqlalchemy-sql-elements-label-examples -sortorder: 500031000 +sortorder: 500031070 toc: False sidebartitle: sqlalchemy.sql.elements Label meta: Python example code for the Label class from the sqlalchemy.sql.elements module of the SQLAlchemy project. @@ -37,48 +37,9 @@ from .declarative import Model class Loader: - """The abstract base class of loaders. - - Loaders are used to load raw database rows into expected results. - :class:`-gino.engine.GinoEngine` will use the loader set on the ``loader`` value of - the :meth:`-sqlalchemy.sql.expression.Executable.execution_options`, for example:: - - from sqlalchemy import text, create_engine - from gino.loader import ColumnLoader - - e = await create_engine("postgresql://localhost/gino", strategy="gino") - q = text("SELECT now() as ts") - loader = ColumnLoader("ts") - ts = await e.first(q.execution_options(loader=loader)) # datetime - - """ @classmethod def get(cls, value): - """Automatically create a loader based on the type of the given value. - - +-------------------------------------------+--------------------------+ - | value type | loader type | - +===========================================+==========================+ - | :class:`tuple` | :class:`-TupleLoader` | - +-------------------------------------------+--------------------------+ - | :func:`callable` | :class:`-CallableLoader` | - +-------------------------------------------+--------------------------+ - | :class:`-sqlalchemy.schema.Column`, | :class:`-ColumnLoader` | -~~ | :class:`-sqlalchemy.sql.expression.Label` | | - +-------------------------------------------+--------------------------+ - | :class:`-gino.declarative.Model` | :class:`-ModelLoader` | - +-------------------------------------------+--------------------------+ - | :class:`-gino.crud.Alias` | :class:`-AliasLoader` | - +-------------------------------------------+--------------------------+ - | :class:`-Loader` | as is | - +-------------------------------------------+--------------------------+ - | any other types | :class:`-ValueLoader` | - +-------------------------------------------+--------------------------+ - - :param value: Any supported value above. - :return: A loader instance. - """ from .crud import Alias if isinstance(value, Loader): @@ -101,12 +62,6 @@ class Loader: @property def query(self): - """Generate a query from this loader. - - This is an experimental feature, not all loaders support this. - - :return: A query instance with the ``loader`` execution option set to self. - """ rv = select(self.get_columns()) from_clause = self.get_from() if from_clause is not None: @@ -114,10 +69,15 @@ class Loader: return rv.execution_options(loader=self) def do_load(self, row, context): + raise NotImplementedError + def get_columns(self): + return [] -## ... source file continues with no further Label examples... + def get_from(self): +## ... source file continues with no further Label examples... + ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown index d27d13bb2..cfa0eed12 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ClauseElement code examples category: page slug: sqlalchemy-sql-expression-clauseelement-examples -sortorder: 500031000 +sortorder: 500031071 toc: False sidebartitle: sqlalchemy.sql.expression ClauseElement meta: Python example code for the ClauseElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. @@ -56,6 +56,11 @@ class MSSQLImpl(DefaultImpl): ## ... source file abbreviated to get to ClauseElement examples ... + super(MSSQLImpl, self).bulk_insert(table, rows, **kw) + + def drop_column(self, table_name, column, schema=None, **kw): + drop_default = kw.pop("mssql_drop_default", False) + if drop_default: self._exec( _ExecDropConstraint( table_name, column, "sys.default_constraints", schema @@ -99,9 +104,6 @@ def _exec_drop_col_constraint(element, compiler, **kw): element.colname, element.type_, ) - # from http://www.mssqltips.com/sqlservertip/1425/\ - # working-with-default-constraints-in-sql-server/ - # TODO: needs table formatting, etc. return """declare @const_name varchar(256) select @const_name = [name] from %(type)s where parent_object_id = object_id('%(schema_dot)s%(tname)s') @@ -109,10 +111,12 @@ and col_name(parent_object_id, parent_column_id) = '%(colname)s' exec('alter table %(tname_quoted)s drop constraint ' + @const_name)""" % { "type": type_, "tname": tname, + "colname": colname, + "tname_quoted": format_table_name(compiler, tname, schema), + "schema_dot": schema + "." if schema else "", ## ... source file continues with no further ClauseElement examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown index 0fd13712d..1f8d63349 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ColumnClause code examples category: page slug: sqlalchemy-sql-expression-columnclause-examples -sortorder: 500031001 +sortorder: 500031072 toc: False sidebartitle: sqlalchemy.sql.expression ColumnClause meta: Python example code for the ColumnClause class from the sqlalchemy.sql.expression module of the SQLAlchemy project. @@ -62,6 +62,11 @@ log = logging.getLogger(__name__) ## ... source file abbreviated to get to ColumnClause examples ... + return "%(prefix)screate_exclude_constraint(%(args)s)" % { + "prefix": render._alembic_autogenerate_prefix(autogen_context), + "args": ", ".join(args), + } + else: args = [ "(%s, %r)" % (_render_potential_column(sqltext, autogen_context), opstring) @@ -96,8 +101,8 @@ def _render_potential_column(value, autogen_context): ) -## ... source file continues with no further ColumnClause examples... +## ... source file continues with no further ColumnClause examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown index 09f26ceea..7a80a6826 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ColumnElement code examples category: page slug: sqlalchemy-sql-expression-columnelement-examples -sortorder: 500031002 +sortorder: 500031073 toc: False sidebartitle: sqlalchemy.sql.expression ColumnElement meta: Python example code for the ColumnElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. @@ -16,7 +16,7 @@ ColumnElement is a class within the sqlalchemy.sql.expression module of the SQLA and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -56,9 +56,8 @@ def compile_array_get(element, compiler, **kw): ) return '(%s)[%s]' % ( compiler.process(args[0]), - - -## ... source file abbreviated to get to ColumnElement examples ... + sa.text(str(args[1].value + 1)) + ) class row_to_json(GenericFunction): @@ -91,8 +90,8 @@ def compile_asterisk(element, compiler, **kw): return '%s.*' % quote(compiler.dialect, element.selectable.name) -## ... source file continues with no further ColumnElement examples... +## ... source file continues with no further ColumnElement examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown index d1904a484..d3a29174e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression Executable code examples category: page slug: sqlalchemy-sql-expression-executable-examples -sortorder: 500031003 +sortorder: 500031074 toc: False sidebartitle: sqlalchemy.sql.expression Executable meta: Python example code for the Executable class from the sqlalchemy.sql.expression module of the SQLAlchemy project. @@ -57,6 +57,11 @@ class MSSQLImpl(DefaultImpl): ## ... source file abbreviated to get to Executable examples ... + super(MSSQLImpl, self).bulk_insert(table, rows, **kw) + + def drop_column(self, table_name, column, schema=None, **kw): + drop_default = kw.pop("mssql_drop_default", False) + if drop_default: self._exec( _ExecDropConstraint( table_name, column, "sys.default_constraints", schema @@ -100,9 +105,6 @@ def _exec_drop_col_constraint(element, compiler, **kw): element.colname, element.type_, ) - # from http://www.mssqltips.com/sqlservertip/1425/\ - # working-with-default-constraints-in-sql-server/ - # TODO: needs table formatting, etc. return """declare @const_name varchar(256) select @const_name = [name] from %(type)s where parent_object_id = object_id('%(schema_dot)s%(tname)s') @@ -110,10 +112,12 @@ and col_name(parent_object_id, parent_column_id) = '%(colname)s' exec('alter table %(tname_quoted)s drop constraint ' + @const_name)""" % { "type": type_, "tname": tname, + "colname": colname, + "tname_quoted": format_table_name(compiler, tname, schema), + "schema_dot": schema + "." if schema else "", ## ... source file continues with no further Executable examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown index 2bc01ff41..42c5f6751 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression FunctionElement code examples category: page slug: sqlalchemy-sql-expression-functionelement-examples -sortorder: 500031005 +sortorder: 500031075 toc: False sidebartitle: sqlalchemy.sql.expression FunctionElement meta: Python example code for the FunctionElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. @@ -16,7 +16,7 @@ FunctionElement is a class within the sqlalchemy.sql.expression module of the SQ and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -66,6 +66,5 @@ class row_to_json(GenericFunction): ## ... source file continues with no further FunctionElement examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown index ba2a20f4b..06d39b662 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression UnaryExpression code examples category: page slug: sqlalchemy-sql-expression-unaryexpression-examples -sortorder: 500031006 +sortorder: 500031076 toc: False sidebartitle: sqlalchemy.sql.expression UnaryExpression meta: Python example code for the UnaryExpression class from the sqlalchemy.sql.expression module of the SQLAlchemy project. @@ -63,6 +63,11 @@ log = logging.getLogger(__name__) ## ... source file abbreviated to get to UnaryExpression examples ... + + def correct_for_autogen_constraints( + self, + conn_unique_constraints, + conn_indexes, metadata_unique_constraints, metadata_indexes, ): @@ -112,6 +117,5 @@ log = logging.getLogger(__name__) ## ... source file continues with no further UnaryExpression examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown index 2c25ec956..c98b60aeb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.functions GenericFunction code examples category: page slug: sqlalchemy-sql-functions-genericfunction-examples -sortorder: 500031000 +sortorder: 500031077 toc: False sidebartitle: sqlalchemy.sql.functions GenericFunction meta: Python example code for the GenericFunction class from the sqlalchemy.sql.functions module of the SQLAlchemy project. @@ -16,7 +16,7 @@ GenericFunction is a class within the sqlalchemy.sql.functions module of the SQL and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -90,8 +90,8 @@ def compile_asterisk(element, compiler, **kw): return '%s.*' % quote(compiler.dialect, element.selectable.name) -## ... source file continues with no further GenericFunction examples... +## ... source file continues with no further GenericFunction examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown index 71ec2f617..825a648d8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.naming conv code examples category: page slug: sqlalchemy-sql-naming-conv-examples -sortorder: 500031000 +sortorder: 500031078 toc: False sidebartitle: sqlalchemy.sql.naming conv meta: Python example code for the conv function from the sqlalchemy.sql.naming module of the SQLAlchemy project. @@ -43,48 +43,53 @@ except: class Operations(util.ModuleClsProxy): - """Define high level migration operations. - Each operation corresponds to some schema migration operation, - executed against a particular :class:`.MigrationContext` - which in turn represents connectivity to a database, - or a file output stream. + _to_impl = util.Dispatcher() - While :class:`.Operations` is normally configured as - part of the :meth:`.EnvironmentContext.run_migrations` - method called from an ``env.py`` script, a standalone - :class:`.Operations` instance can be - made for use cases external to regular Alembic - migrations by passing in a :class:`.MigrationContext`:: - - from alembic.migration import MigrationContext - from alembic.operations import Operations + def __init__(self, migration_context, impl=None): + self.migration_context = migration_context + if impl is None: + self.impl = migration_context.impl + else: + self.impl = impl - conn = myengine.connect() + self.schema_obj = schemaobj.SchemaObjects(migration_context) + @classmethod + def register_operation(cls, name, sourcename=None): -## ... source file abbreviated to get to conv examples ... + def register(op_cls): + if sourcename is None: + fn = getattr(op_cls, name) - contains the naming convention - ``{"ck": "ck_bool_%(table_name)s_%(constraint_name)s"}``, then the - output of the following: +## ... source file abbreviated to get to conv examples ... - op.add_column('t', 'x', Boolean(name='x')) - will be:: + recreate, + copy_from, + table_args, + table_kwargs, + reflect_args, + reflect_kwargs, + naming_convention, + partial_reordering, + ) + batch_op = BatchOperations(self.migration_context, impl=impl) + yield batch_op + impl.flush() - CONSTRAINT ck_bool_t_x CHECK (x in (1, 0))) + def get_context(self): - The function is rendered in the output of autogenerate when - a particular constraint name is already converted, for SQLAlchemy - version **0.9.4 and greater only**. Even though ``naming_convention`` - was introduced in 0.9.2, the string disambiguation service is new - as of 0.9.4. + return self.migration_context - .. versionadded:: 0.6.4 + def invoke(self, operation): + fn = self._to_impl.dispatch( + operation, self.migration_context.impl.__dialect__ + ) + return fn(self, operation) - """ + def f(self, name): if conv: ~~ return conv(name) else: @@ -115,6 +120,5 @@ class Operations(util.ModuleClsProxy): ## ... source file continues with no further conv examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown index ed53983f1..c929aff38 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.schema SchemaItem code examples category: page slug: sqlalchemy-sql-schema-schemaitem-examples -sortorder: 500031000 +sortorder: 500031079 toc: False sidebartitle: sqlalchemy.sql.schema SchemaItem meta: Python example code for the SchemaItem class from the sqlalchemy.sql.schema module of the SQLAlchemy project. @@ -41,113 +41,26 @@ from .schema import GinoSchemaVisitor, patch_schema class GinoExecutor: - """ - The default ``gino`` extension on - :class:`-sqlalchemy.sql.expression.Executable` constructs for implicit - execution. - Instances of this class are created when visiting the ``gino`` property of - :class:`-sqlalchemy.sql.expression.Executable` instances (also referred as - queries or clause elements), for example:: + __slots__ = ("_query",) - await User.query.gino.first() + def __init__(self, query): + self._query = query - This allows GINO to add the asynchronous query APIs (:meth:`all`, - :meth:`first`, :meth:`one`, :meth:`one_or_none`, :meth:`scalar`, - :meth:`status`, :meth:`iterate`) to SQLAlchemy query clauses without - messing up with existing synchronous ones. - - -## ... source file abbreviated to get to SchemaItem examples ... - - - `Alembic `_. In usual cases, you would - want to define one global :class:`-.Gino` instance, usually under the name - of ``db``, representing the database used in your application. - - You may define tables in `the official way `_ - SQLAlchemy core recommended, but more often in GINO we define model classes - with ``db.Model`` as their parent class to represent tables, for its - objective interface and CRUD operations. Please read :doc:`/how-to/crud` - for more information. - - For convenience, :class:`Gino` instance delegated all properties publicly - exposed by :mod:`sqlalchemy`, so that you can define tables / models - without importing :mod:`sqlalchemy`:: - - id = db.Column(db.BigInteger(), primary_key=True) - - Similar to :class:`-sqlalchemy.schema.MetaData`, a :class:`-.Gino` object - can bind to a :class:`-gino.engine.GinoEngine` instance, hereby allowing - `"implicit execution" `_ through the ``gino`` - extension on :class:`-sqlalchemy.sql.expression.Executable` or -~~ :class:`-sqlalchemy.schema.SchemaItem` constructs:: - - await User.query.gino.first() - await db.gino.create_all() - - Differently, GINO encourages the use of implicit execution and manages - transactional context correctly. - - Binding to a connection object is not supported. - - To set a bind property, you can simply set your - :class:`-gino.engine.GinoEngine` object on :attr:`db.bind `, or - set it to ``None`` to unbind. However, the creation of engine usually - happens at the same time. Therefore, GINO provided several convenient ways - doing so: - - 1. :meth:`-Gino.with_bind` returning an asynchronous context manager:: - - async with db.with_bind('postgresql://...') as engine: - - 2. :meth:`-Gino.set_bind` and :meth:`-Gino.pop_bind`:: + @property + def query(self): + return self._query - engine = await db.set_bind('postgresql://...') - await db.pop_bind().close() + def model(self, model): + if model is not None: + model = weakref.ref(model) + return self.execution_options(model=model) ## ... source file abbreviated to get to SchemaItem examples ... - - Default is :class:`(CRUDModel, ) `. - - """ - - query_executor = GinoExecutor - """ - The overridable ``gino`` extension class on - :class:`-sqlalchemy.sql.expression.Executable`. - - This class will be set as the getter method of the property ``gino`` on - :class:`-sqlalchemy.sql.expression.Executable` and its subclasses, if - ``ext`` and ``query_ext`` arguments are both ``True``. Default is - :class:`GinoExecutor`. - - """ - - schema_visitor = GinoSchemaVisitor - """ - The overridable ``gino`` extension class on -~~ :class:`-sqlalchemy.schema.SchemaItem`. - - This class will be set as the getter method of the property ``gino`` on -~~ :class:`-sqlalchemy.schema.SchemaItem` and its subclasses, if ``ext`` and - ``schema_ext`` arguments are both ``True``. Default is - :class:`-gino.schema.GinoSchemaVisitor`. - - """ - - no_delegate = {"create_engine", "engine_from_config"} - """ - A set of symbols from :mod:`sqlalchemy` which is not delegated by - :class:`Gino`. - - """ - - def __init__( self, bind=None, model_classes=None, @@ -156,31 +69,6 @@ class GinoExecutor: ext=True, **kwargs ): - """ - :param bind: A :class:`-.engine.GinoEngine` instance to bind. Also - accepts string or :class:`-sqlalchemy.engine.url.URL`, - which will be passed to - :func:`-gino.create_engine` when this :class:`Gino` - instance is awaited. Default is ``None``. - :param model_classes: A :class:`tuple` of base class and mixin classes - to create the :attr:`-.Gino.Model` class. Default - is :class:`(CRUDModel, ) `. - :param query_ext: Boolean value to control the installation of the - ``gino`` extension on - :class:`-sqlalchemy.sql.expression.Executable` for - implicit execution. Default is to install (``True``). - :param schema_ext: Boolean value to control the installation of the - ``gino`` extension on -~~ :class:`-sqlalchemy.schema.SchemaItem` for implicit - execution. Default is to install (``True``). - :param ext: Boolean value to control the installation of the two - ``gino`` extensions. ``False`` for no extension at all, - while it depends on the two individual switches when this - is set to ``True`` (default). - :param kwargs: Other arguments accepted by - :class:`-sqlalchemy.schema.MetaData`. - - """ super().__init__(bind=bind, **kwargs) if model_classes is None: model_classes = self.model_base_classes @@ -201,32 +89,31 @@ class GinoExecutor: ~~ SchemaItem.gino = property(self.schema_visitor) patch_schema(self) - # noinspection PyPep8Naming @property def Model(self): - """ - Declarative base class for models, subclass of - :class:`gino.declarative.Model`. Defining subclasses of this class will - result new tables added to this :class:`Gino` metadata. - - """ return self._model @property def bind(self): - """ - An :class:`-.engine.GinoEngine` to which this :class:`Gino` is bound. + if self._bind is None: + return _PlaceHolder(UninitializedError("Gino engine is not initialized.")) + return self._bind - This is a simple property with no getter or setter hook - what you set - is what you get. To achieve the same result as it is in SQLAlchemy - - setting a string or :class:`-sqlalchemy.engine.url.URL` and getting an - engine instance, use :meth:`set_bind` (or ``await`` on this - :class:`Gino` object after setting a string or - :class:`-sqlalchemy.engine.url.URL`). + @bind.setter + def bind(self, bind): + self._bind = bind + async def set_bind(self, bind, loop=None, **kwargs): + if isinstance(bind, str): + bind = make_url(bind) + if isinstance(bind, URL): + from . import create_engine -## ... source file continues with no further SchemaItem examples... + bind = await create_engine(bind, loop=loop, bakery=self._bakery, **kwargs) + self.bind = bind +## ... source file continues with no further SchemaItem examples... + ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown new file mode 100644 index 000000000..71236dbd6 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown @@ -0,0 +1,123 @@ +title: sqlalchemy.sql schema code examples +category: page +slug: sqlalchemy-sql-schema-examples +sortorder: 500031067 +toc: False +sidebartitle: sqlalchemy.sql schema +meta: Python example code for the schema function from the sqlalchemy.sql module of the SQLAlchemy project. + + +schema is a function within the sqlalchemy.sql module of the SQLAlchemy project. + + +## Example 1 from GINO +[GINO](https://github.com/fantix/gino) +([project documentation](https://python-gino.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/gino/)) +is an [object-relational mapper (ORM)](/object-relational-mappers-orms.html) +built on SQLAlchemy that is non-blocking and therefore designed to work properly +with asynchronously-run code, for example, an application written with +[asyncio](https://docs.python.org/3/library/asyncio.html). + +GINO is open sourced under the [BSD License](https://github.com/python-gino/gino/blob/master/LICENSE). + +[**GINO / src/gino / engine.py**](https://github.com/python-gino/gino/blob/master/src/gino/./engine.py) + +```python +# engine.py +import asyncio +import collections +import functools +import sys +import time +from contextvars import ContextVar + +from sqlalchemy.cutils import _distill_params +from sqlalchemy.engine import Engine, Connection +~~from sqlalchemy.sql import schema + +from .aiocontextvars import patch_asyncio +from .exceptions import MultipleResultsFound, NoResultFound +from .transaction import GinoTransaction + +patch_asyncio() + + +class _BaseDBAPIConnection: + _reset_agent = None + gino_conn = None + + def __init__(self, cursor_cls): + self._cursor_cls = cursor_cls + self._closed = False + + def commit(self): + pass + + def cursor(self): + return self._cursor_cls(self) + + @property + def raw_connection(self): + + +## ... source file abbreviated to get to schema examples ... + + + self._tx_ctx = args + + async def __aenter__(self): + conn = await self._conn_ctx.__aenter__() + try: + args, kwargs = self._tx_ctx + self._tx_ctx = conn.transaction(*args, **kwargs) + return await self._tx_ctx.__aenter__() + except Exception: + await self._conn_ctx.__aexit__(*sys.exc_info()) + raise + + async def __aexit__(self, *exc_info): + try: + tx, self._tx_ctx = self._tx_ctx, None + return await tx.__aexit__(*exc_info) + except Exception: + exc_info = sys.exc_info() + raise + finally: + await self._conn_ctx.__aexit__(*exc_info) + + +class GinoConnection: + +~~ schema_for_object = schema._schema_getter(None) + + def __init__(self, dialect, sa_conn, stack=None): + self._dialect = dialect + self._sa_conn = sa_conn + self._stack = stack + + @property + def _dbapi_conn(self): + return self._sa_conn.connection + + @property + def raw_connection(self): + return self._dbapi_conn.raw_connection + + async def get_raw_connection(self, *, timeout=None): + return await self._dbapi_conn.acquire(timeout=timeout) + + async def release(self, *, permanent=True): + if permanent and self._stack is not None: + dbapi_conn = self._stack.remove(lambda x: x.gino_conn is self) + if dbapi_conn: + await dbapi_conn.release(True) + else: + raise ValueError("This connection is already released.") + + +## ... source file continues with no further schema examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown new file mode 100644 index 000000000..f5bb8941d --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown @@ -0,0 +1,456 @@ +title: sqlalchemy.sql sqltypes code examples +category: page +slug: sqlalchemy-sql-sqltypes-examples +sortorder: 500031068 +toc: False +sidebartitle: sqlalchemy.sql sqltypes +meta: Python example code for the sqltypes function from the sqlalchemy.sql module of the SQLAlchemy project. + + +sqltypes is a function within the sqlalchemy.sql module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / ddl / oracle.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/ddl/oracle.py) + +```python +# oracle.py +from sqlalchemy.ext.compiler import compiles +~~from sqlalchemy.sql import sqltypes + +from .base import AddColumn +from .base import alter_table +from .base import ColumnComment +from .base import ColumnDefault +from .base import ColumnName +from .base import ColumnNullable +from .base import ColumnType +from .base import format_column_name +from .base import format_server_default +from .base import format_table_name +from .base import format_type +from .base import RenameTable +from .impl import DefaultImpl + + +class OracleImpl(DefaultImpl): + __dialect__ = "oracle" + transactional_ddl = False + batch_separator = "/" + command_terminator = "" + type_synonyms = DefaultImpl.type_synonyms + ( + {"VARCHAR", "VARCHAR2"}, + {"BIGINT", "INTEGER", "SMALLINT", "DECIMAL", "NUMERIC", "NUMBER"}, + + +## ... source file abbreviated to get to sqltypes examples ... + + +def visit_column_name(element, compiler, **kw): + return "%s RENAME COLUMN %s TO %s" % ( + alter_table(compiler, element.table_name, element.schema), + format_column_name(compiler, element.column_name), + format_column_name(compiler, element.newname), + ) + + +@compiles(ColumnDefault, "oracle") +def visit_column_default(element, compiler, **kw): + return "%s %s %s" % ( + alter_table(compiler, element.table_name, element.schema), + alter_column(compiler, element.column_name), + "DEFAULT %s" % format_server_default(compiler, element.default) + if element.default is not None + else "DEFAULT NULL", + ) + + +@compiles(ColumnComment, "oracle") +def visit_column_comment(element, compiler, **kw): + ddl = "COMMENT ON COLUMN {table_name}.{column_name} IS {comment}" + + comment = compiler.sql_compiler.render_literal_value( + (element.comment if element.comment is not None else ""), +~~ sqltypes.String(), + ) + + return ddl.format( + table_name=element.table_name, + column_name=element.column_name, + comment=comment, + ) + + +@compiles(RenameTable, "oracle") +def visit_rename_table(element, compiler, **kw): + return "%s RENAME TO %s" % ( + alter_table(compiler, element.table_name, element.schema), + format_table_name(compiler, element.new_table_name, None), + ) + + +def alter_column(compiler, name): + return "MODIFY %s" % format_column_name(compiler, name) + + +def add_column(compiler, column, **kw): + return "ADD %s" % compiler.get_column_specification(column, **kw) + + + +## ... source file continues with no further sqltypes examples... + +``` + + +## Example 2 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / app.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./app.py) + +```python +# app.py + +from flask import Flask, current_app, jsonify +~~from sqlalchemy.sql import sqltypes + +from sandman2.exception import ( + BadRequestException, + ForbiddenException, + NotFoundException, + NotAcceptableException, + NotImplementedException, + ConflictException, + ServerErrorException, + ServiceUnavailableException, + ) +from sandman2.service import Service +from sandman2.model import db, Model, AutomapModel +from sandman2.admin import CustomAdminView +from flask_admin import Admin +from flask_httpauth import HTTPBasicAuth + +auth = HTTPBasicAuth() + +def get_app( + database_uri, + exclude_tables=None, + user_models=None, + reflect_all=True, + + +## ... source file abbreviated to get to sqltypes examples ... + + +def _reflect_all(exclude_tables=None, admin=None, read_only=False, schema=None): + AutomapModel.prepare( # pylint:disable=maybe-no-member + db.engine, reflect=True, schema=schema) + for cls in AutomapModel.classes: + if exclude_tables and cls.__table__.name in exclude_tables: + continue + if read_only: + cls.__methods__ = {'GET'} + register_model(cls, admin) + + +def register_model(cls, admin=None): + cls.__url__ = '/{}'.format(cls.__name__.lower()) + service_class = type( + cls.__name__ + 'Service', + (Service,), + { + '__model__': cls, + }) + + cols = list(cls().__table__.primary_key.columns) + + primary_key_type = 'string' + if len(cols) == 1: + col_type = cols[0].type +~~ if isinstance(col_type, sqltypes.String): + primary_key_type = 'string' +~~ elif isinstance(col_type, sqltypes.Integer): + primary_key_type = 'int' +~~ elif isinstance(col_type, sqltypes.Numeric): + primary_key_type = 'float' + + register_service(service_class, primary_key_type) + if admin is not None: + admin.add_view(CustomAdminView(cls, db.session)) + + +def _register_user_models(user_models, admin=None, schema=None): + if any([issubclass(cls, AutomapModel) for cls in user_models]): + AutomapModel.prepare( # pylint:disable=maybe-no-member + db.engine, reflect=True, schema=schema) + + for user_model in user_models: + register_model(user_model, admin) + + + +## ... source file continues with no further sqltypes examples... + +``` + + +## Example 3 from GINO +[GINO](https://github.com/fantix/gino) +([project documentation](https://python-gino.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/gino/)) +is an [object-relational mapper (ORM)](/object-relational-mappers-orms.html) +built on SQLAlchemy that is non-blocking and therefore designed to work properly +with asynchronously-run code, for example, an application written with +[asyncio](https://docs.python.org/3/library/asyncio.html). + +GINO is open sourced under the [BSD License](https://github.com/python-gino/gino/blob/master/LICENSE). + +[**GINO / src/gino / dialects / asyncpg.py**](https://github.com/python-gino/gino/blob/master/src/gino/dialects/asyncpg.py) + +```python +# asyncpg.py +import inspect +import itertools +import time +import warnings + +import asyncpg +from sqlalchemy import util, exc, sql +from sqlalchemy.dialects.postgresql import ( # noqa: F401 + ARRAY, + CreateEnumType, + DropEnumType, + JSON, + JSONB, + json, +) +from sqlalchemy.dialects.postgresql.base import ( + ENUM, + PGCompiler, + PGDialect, + PGExecutionContext, +) +~~from sqlalchemy.sql import sqltypes + +from . import base + +try: + import click +except ImportError: + click = None +JSON_COLTYPE = 114 +JSONB_COLTYPE = 3802 + + +class AsyncpgDBAPI(base.BaseDBAPI): + Error = asyncpg.PostgresError, asyncpg.InterfaceError + + +class AsyncpgCompiler(PGCompiler): + @property + def bindtemplate(self): + return self._bindtemplate + + @bindtemplate.setter + def bindtemplate(self, val): + self._bindtemplate = val.replace(":", "$") + + + +## ... source file abbreviated to get to sqltypes examples ... + + + return [util.text_type(elem) for elem in value] + + return process + + +class AsyncpgDialect(PGDialect, base.AsyncDialectMixin): + driver = "asyncpg" + supports_native_decimal = True + dbapi_class = AsyncpgDBAPI + statement_compiler = AsyncpgCompiler + execution_ctx_cls = AsyncpgExecutionContext + cursor_cls = DBAPICursor + init_kwargs = set( + itertools.chain( + ("bakery", "prebake"), + *[ + inspect.getfullargspec(f).kwonlydefaults.keys() + for f in [asyncpg.create_pool, asyncpg.connect] + ], + ) + ) + colspecs = util.update_copy( + PGDialect.colspecs, + { + ENUM: AsyncEnum, +~~ sqltypes.Enum: AsyncEnum, +~~ sqltypes.NullType: GinoNullType, +~~ sqltypes.JSON.JSONPathType: AsyncpgJSONPathType, + }, + ) + + def __init__(self, *args, bakery=None, **kwargs): + self._pool_kwargs = {} + self._init_hook = None + for k in self.init_kwargs: + if k in kwargs: + if k == "init": + self._init_hook = kwargs.pop(k) + else: + self._pool_kwargs[k] = kwargs.pop(k) + super().__init__(*args, **kwargs) + self._init_mixin(bakery) + + async def init_pool(self, url, loop, pool_class=None): + if pool_class is None: + pool_class = Pool + return await pool_class( + url, loop, bakery=self._bakery, init=self.on_connect(), **self._pool_kwargs + ) + + def transaction(self, raw_conn, args, kwargs): + return Transaction(raw_conn.transaction(*args, **kwargs)) + + +## ... source file abbreviated to get to sqltypes examples ... + + + return self._init_hook + + async def set_isolation_level(self, connection, level): + level = level.replace("_", " ") + if level not in self._isolation_lookup: + raise exc.ArgumentError( + "Invalid value '%s' for isolation_level. " + "Valid isolation levels for %s are %s" + % (level, self.name, ", ".join(self._isolation_lookup)) + ) + await connection.execute( + "SET SESSION CHARACTERISTICS AS TRANSACTION " "ISOLATION LEVEL %s" % level + ) + await connection.execute("COMMIT") + + async def get_isolation_level(self, connection): + val = await connection.fetchval("show transaction isolation level") + return val.upper() + + async def has_schema(self, connection, schema): + row = await connection.first( + sql.text( + "select nspname from pg_namespace " "where lower(nspname)=:schema" + ).bindparams( + sql.bindparam( +~~ "schema", util.text_type(schema.lower()), type_=sqltypes.Unicode, + ) + ) + ) + + return bool(row) + + async def has_table(self, connection, table_name, schema=None): + if schema is None: + row = await connection.first( + sql.text( + "select relname from pg_class c join pg_namespace n on " + "n.oid=c.relnamespace where " + "pg_catalog.pg_table_is_visible(c.oid) " + "and relname=:name" + ).bindparams( + sql.bindparam( +~~ "name", util.text_type(table_name), type_=sqltypes.Unicode + ), + ) + ) + else: + row = await connection.first( + sql.text( + "select relname from pg_class c join pg_namespace n on " + "n.oid=c.relnamespace where n.nspname=:schema and " + "relname=:name" + ).bindparams( + sql.bindparam( +~~ "name", util.text_type(table_name), type_=sqltypes.Unicode, + ), + sql.bindparam( +~~ "schema", util.text_type(schema), type_=sqltypes.Unicode, + ), + ) + ) + return bool(row) + + async def has_sequence(self, connection, sequence_name, schema=None): + if schema is None: + row = await connection.first( + sql.text( + "SELECT relname FROM pg_class c join pg_namespace n on " + "n.oid=c.relnamespace where relkind='S' and " + "n.nspname=current_schema() " + "and relname=:name" + ).bindparams( + sql.bindparam( +~~ "name", util.text_type(sequence_name), type_=sqltypes.Unicode, + ) + ) + ) + else: + row = await connection.first( + sql.text( + "SELECT relname FROM pg_class c join pg_namespace n on " + "n.oid=c.relnamespace where relkind='S' and " + "n.nspname=:schema and relname=:name" + ).bindparams( + sql.bindparam( +~~ "name", util.text_type(sequence_name), type_=sqltypes.Unicode, + ), + sql.bindparam( +~~ "schema", util.text_type(schema), type_=sqltypes.Unicode, + ), + ) + ) + + return bool(row) + + async def has_type(self, connection, type_name, schema=None): + if schema is not None: + query = """ + SELECT EXISTS ( + SELECT * FROM pg_catalog.pg_type t, pg_catalog.pg_namespace n + WHERE t.typnamespace = n.oid + AND t.typname = :typname + AND n.nspname = :nspname + ) + SELECT EXISTS ( + SELECT * FROM pg_catalog.pg_type t + WHERE t.typname = :typname + AND pg_type_is_visible(t.oid) + ) + + + +## ... source file continues with no further sqltypes examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown new file mode 100644 index 000000000..c19d97cc9 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown @@ -0,0 +1,460 @@ +title: sqlalchemy.sql table code examples +category: page +slug: sqlalchemy-sql-table-examples +sortorder: 500031069 +toc: False +sidebartitle: sqlalchemy.sql table +meta: Python example code for the table function from the sqlalchemy.sql module of the SQLAlchemy project. + + +table is a function within the sqlalchemy.sql module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / operations / ops.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/operations/ops.py) + +```python +# ops.py +import re + +from sqlalchemy.types import NULLTYPE + +from . import schemaobj +from .base import BatchOperations +from .base import Operations +from .. import util +from ..util import sqla_compat + + +class MigrateOperation(object): + + @util.memoized_property + def info(self): + return {} + + _mutations = frozenset() + + +class AddConstraintOp(MigrateOperation): + + add_constraint_ops = util.Dispatcher() + + @property + def constraint_type(self): + raise NotImplementedError() + + @classmethod + def register_add_constraint(cls, type_): + def go(klass): + cls.add_constraint_ops.dispatch_for(type_)(klass.from_constraint) + return klass + + return go + + +## ... source file abbreviated to get to table examples ... + + + @classmethod + def bulk_insert(cls, operations, table, rows, multiinsert=True): + + op = cls(table, rows, multiinsert=multiinsert) + operations.invoke(op) + + +@Operations.register_operation("execute") +class ExecuteSQLOp(MigrateOperation): + + def __init__(self, sqltext, execution_options=None): + self.sqltext = sqltext + self.execution_options = execution_options + + @classmethod + def execute(cls, operations, sqltext, execution_options=None): + r"""Execute the given SQL using the current migration context. + + The given SQL can be a plain string, e.g.:: + + op.execute("INSERT INTO table (foo) VALUES ('some value')") + + Or it can be any kind of Core SQL Expression construct, such as + below where we use an update construct:: + +~~ from sqlalchemy.sql import table, column + from sqlalchemy import String + from alembic import op + +~~ account = table('account', + column('name', String) + ) + op.execute( + account.update().\\ + where(account.c.name==op.inline_literal('account 1')).\\ + values({'name':op.inline_literal('account 2')}) + ) + + Above, we made use of the SQLAlchemy + :func:`sqlalchemy.sql.expression.table` and + :func:`sqlalchemy.sql.expression.column` constructs to make a brief, + ad-hoc table construct just for our UPDATE statement. A full + :class:`-sqlalchemy.schema.Table` construct of course works perfectly + fine as well, though note it's a recommended practice to at least + ensure the definition of a table is self-contained within the migration + script, rather than imported from a module that may break compatibility + with older migrations. + + In a SQL script context, the statement is emitted directly to the + output stream. There is *no* return result, however, as this + function is oriented towards generating a change script + that can run in "offline" mode. Additionally, parameterized + statements are discouraged here, as they *will not work* in offline + mode. Above, we use :meth:`.inline_literal` where parameters are + unique=False, + **kw + ): + r"""Issue a "create index" instruction using the current + migration context. + + e.g.:: + + from alembic import op + op.create_index('ik_test', 't1', ['foo', 'bar']) + + Functional indexes can be produced by using the + :func:`sqlalchemy.sql.expression.text` construct:: + + from alembic import op + from sqlalchemy import text + op.create_index('ik_test', 't1', [text('lower(foo)')]) + + .. versionadded:: 0.6.7 support for making use of the + :func:`-sqlalchemy.sql.expression.text` construct in + conjunction with + :meth:`.Operations.create_index` in + order to produce functional expressions within CREATE INDEX. + + :param index_name: name of the index. +~~ :param table_name: name of the owning table. + :param columns: a list consisting of string column names and/or + :func:`-sqlalchemy.sql.expression.text` constructs. + :param schema: Optional schema name to operate within. To control + quoting of the schema outside of the default behavior, use + the SQLAlchemy construct + :class:`-sqlalchemy.sql.elements.quoted_name`. + + .. versionadded:: 0.7.0 'schema' can now accept a + :class:`-sqlalchemy.sql.elements.quoted_name` construct. + + :param unique: If True, create a unique index. + + :param quote: + Force quoting of this column's name on or off, corresponding + to ``True`` or ``False``. When left at its default + of ``None``, the column identifier will be quoted according to + whether the name is case sensitive (identifiers with at least one + upper case character are treated as case sensitive), or if it's a + reserved word. This flag is only needed to force quoting of a + reserved word which is not known by the SQLAlchemy dialect. + + :param \**kw: Additional keyword arguments not mentioned above are + dialect specific, and passed in the form + ``_``. + + +## ... source file abbreviated to get to table examples ... + + + schema_obj = schemaobj.SchemaObjects(migration_context) + + return schema_obj.index( + self.index_name, + self.table_name, + ["x"], + schema=self.schema, + **self.kw + ) + + @classmethod + @util._with_legacy_names( + [("name", "index_name"), ("tablename", "table_name")] + ) + def drop_index( + cls, operations, index_name, table_name=None, schema=None, **kw + ): + r"""Issue a "drop index" instruction using the current + migration context. + + e.g.:: + + drop_index("accounts") + + :param index_name: name of the index. +~~ :param table_name: name of the owning table. Some + backends such as Microsoft SQL Server require this. + :param schema: Optional schema name to operate within. To control + quoting of the schema outside of the default behavior, use + the SQLAlchemy construct + :class:`-sqlalchemy.sql.elements.quoted_name`. + + .. versionadded:: 0.7.0 'schema' can now accept a + :class:`-sqlalchemy.sql.elements.quoted_name` construct. + + :param \**kw: Additional keyword arguments not mentioned above are + dialect specific, and passed in the form + ``_``. + See the documentation regarding an individual dialect at + :ref:`dialect_toplevel` for detail on documented arguments. + + .. versionadded:: 0.9.5 Support for dialect-specific keyword + arguments for DROP INDEX + + .. versionchanged:: 0.8.0 The following positional argument names + have been changed: + + * name -> index_name + + current batch migration context. + + +## ... source file abbreviated to get to table examples ... + + + + .. versionchanged:: 0.8.0 The following positional argument names + have been changed: + + * name -> index_name + + + def __init__( + self, table_name, columns, schema=None, _orig_table=None, **kw + ): + self.table_name = table_name + self.columns = columns + self.schema = schema + self.kw = kw + self._orig_table = _orig_table + + def reverse(self): + return DropTableOp.from_table(self.to_table()) + + def to_diff_tuple(self): + return ("add_table", self.to_table()) + + @classmethod + def from_table(cls, table): + return cls( +~~ table.name, + list(table.c) + list(table.constraints), +~~ schema=table.schema, + _orig_table=table, + **table.kwargs + ) + + def to_table(self, migration_context=None): + if self._orig_table is not None: + return self._orig_table + schema_obj = schemaobj.SchemaObjects(migration_context) + + return schema_obj.table( + self.table_name, *self.columns, schema=self.schema, **self.kw + ) + + @classmethod + @util._with_legacy_names([("name", "table_name")]) + def create_table(cls, operations, table_name, *columns, **kw): + r"""Issue a "create table" instruction using the current migration + context. + + This directive receives an argument list similar to that of the + traditional :class:`sqlalchemy.schema.Table` construct, but without the + metadata:: + + +## ... source file abbreviated to get to table examples ... + + + current migration context. + + Generally, only that aspect of the column which + is being changed, i.e. name, type, nullability, + default, needs to be specified. Multiple changes + can also be specified at once and the backend should + "do the right thing", emitting each change either + separately or together as the backend allows. + + MySQL has special requirements here, since MySQL + cannot ALTER a column without a full specification. + When producing MySQL-compatible migration files, + it is recommended that the ``existing_type``, + ``existing_server_default``, and ``existing_nullable`` + parameters be present, if not being altered. + + Type changes which are against the SQLAlchemy + "schema" types :class:`-sqlalchemy.types.Boolean` + and :class:`-sqlalchemy.types.Enum` may also + add or drop constraints which accompany those + types on backends that don't support them natively. + The ``existing_type`` argument is + used in this case to identify and remove a previous + constraint that was bound to the type object. + +~~ :param table_name: string name of the target table. + :param column_name: string name of the target column, + as it exists before the operation begins. + :param nullable: Optional; specify ``True`` or ``False`` + to alter the column's nullability. + :param server_default: Optional; specify a string + SQL expression, :func:`-sqlalchemy.sql.expression.text`, + or :class:`-sqlalchemy.schema.DefaultClause` to indicate + an alteration to the column's default value. + Set to ``None`` to have the default removed. + :param comment: optional string text of a new comment to add to the + column. + + .. versionadded:: 1.0.6 + + :param new_column_name: Optional; specify a string name here to + indicate the new name within a column rename operation. + :param type\_: Optional; a :class:`-sqlalchemy.types.TypeEngine` + type object to specify a change to the column's type. + For SQLAlchemy types that also indicate a constraint (i.e. + :class:`-sqlalchemy.types.Boolean`, :class:`-sqlalchemy.types.Enum`), + the constraint is also generated. + :param autoincrement: set the ``AUTO_INCREMENT`` flag of the column; + currently understood by the MySQL dialect. + :param existing_type: Optional; a + + +## ... source file abbreviated to get to table examples ... + + + + .. versionadded:: 1.0.6 + + :param schema: Optional schema name to operate within. To control + quoting of the schema outside of the default behavior, use + the SQLAlchemy construct + :class:`-sqlalchemy.sql.elements.quoted_name`. + + .. versionadded:: 0.7.0 'schema' can now accept a + :class:`-sqlalchemy.sql.elements.quoted_name` construct. + + :param postgresql_using: String argument which will indicate a + SQL expression to render within the Postgresql-specific USING clause + within ALTER COLUMN. This string is taken directly as raw SQL which + must explicitly include any necessary quoting or escaping of tokens + within the expression. + + .. versionadded:: 0.8.8 + + batch migration context. + + Parameters are the same as that of :meth:`.Operations.alter_column`, + as well as the following option(s): + + :param insert_before: String name of an existing column which this +~~ column should be placed before, when creating the new table. + + .. versionadded:: 1.4.0 + + :param insert_before: String name of an existing column which this +~~ column should be placed after, when creating the new table. If + both :paramref:`.BatchOperations.alter_column.insert_before` + and :paramref:`.BatchOperations.alter_column.insert_after` are + omitted, the column is inserted after the last existing column +~~ in the table. + + .. versionadded:: 1.4.0 + + .. seealso:: + + :meth:`.Operations.alter_column` + + + + def __init__(self, table_name, column, schema=None, **kw): + super(AddColumnOp, self).__init__(table_name, schema=schema) + self.column = column + self.kw = kw + + def reverse(self): + return DropColumnOp.from_column_and_tablename( + self.schema, self.table_name, self.column + ) + + def to_diff_tuple(self): + return ("add_column", self.schema, self.table_name, self.column) + + def to_column(self): + return self.column + + from sqlalchemy import INTEGER, VARCHAR, NVARCHAR, Column + + +## ... source file abbreviated to get to table examples ... + + + have been changed: + + * name -> table_name + + + def __init__( + self, table_name, schema=None, table_kw=None, _orig_table=None + ): + self.table_name = table_name + self.schema = schema + self.table_kw = table_kw or {} + self._orig_table = _orig_table + + def to_diff_tuple(self): + return ("remove_table", self.to_table()) + + def reverse(self): + if self._orig_table is None: + raise ValueError( + "operation is not reversible; " "original table is not present" + ) + return CreateTableOp.from_table(self._orig_table) + + @classmethod + def from_table(cls, table): +~~ return cls(table.name, schema=table.schema, _orig_table=table) + + def to_table(self, migration_context=None): + if self._orig_table is not None: + return self._orig_table + schema_obj = schemaobj.SchemaObjects(migration_context) + return schema_obj.table( + self.table_name, schema=self.schema, **self.table_kw + ) + + @classmethod + @util._with_legacy_names([("name", "table_name")]) + def drop_table(cls, operations, table_name, schema=None, **kw): + r"""Issue a "drop table" instruction using the current + migration context. + + + e.g.:: + + drop_table("accounts") + + :param table_name: Name of the table + :param schema: Optional schema name to operate within. To control + quoting of the schema outside of the default behavior, use + the SQLAlchemy construct + + +## ... source file continues with no further table examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown index 0026dab17..5cc63d3eb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.util ClauseAdapter code examples category: page slug: sqlalchemy-sql-util-clauseadapter-examples -sortorder: 500031000 +sortorder: 500031080 toc: False sidebartitle: sqlalchemy.sql.util ClauseAdapter meta: Python example code for the ClauseAdapter class from the sqlalchemy.sql.util module of the SQLAlchemy project. @@ -16,7 +16,7 @@ ClauseAdapter is a class within the sqlalchemy.sql.util module of the SQLAlchemy and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -74,6 +74,5 @@ def inverse_join(selectable, left_alias, right_alias, relationship): ## ... source file continues with no further ClauseAdapter examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown index f10c7a759..70e302798 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.visitors traverse code examples category: page slug: sqlalchemy-sql-visitors-traverse-examples -sortorder: 500031000 +sortorder: 500031081 toc: False sidebartitle: sqlalchemy.sql.visitors traverse meta: Python example code for the traverse function from the sqlalchemy.sql.visitors module of the SQLAlchemy project. @@ -66,6 +66,15 @@ try: ## ... source file abbreviated to get to traverse examples ... + target_schema, + target_table, + target_columns, + onupdate, + ondelete, + deferrable, + initially, + ) + def _fk_is_self_referential(constraint): spec = constraint.elements[0]._get_colspec() @@ -76,14 +85,10 @@ def _fk_is_self_referential(constraint): def _is_type_bound(constraint): - # this deals with SQLAlchemy #3260, don't copy CHECK constraints - # that will be generated by the type. - # new feature added for #3260 return constraint._type_bound def _find_columns(clause): - """locate Column objects within the given expression.""" cols = set() ~~ traverse(clause, {}, {"column": cols.add}) @@ -91,16 +96,12 @@ def _find_columns(clause): def _remove_column_from_collection(collection, column): - """remove a column from a ColumnCollection.""" - # workaround for older SQLAlchemy, remove the - # same object that's present to_remove = collection[column.key] collection.remove(to_remove) def _textual_index_column(table, text_): - """a workaround for the Index construct's severe lack of flexibility""" if isinstance(text_, compat.string_types): c = Column(text_, sqltypes.NULLTYPE) table.append_column(c) @@ -111,10 +112,13 @@ def _textual_index_column(table, text_): raise ValueError("String or text() construct expected") +class _textual_index_element(sql.ColumnElement): + __visit_name__ = "_textual_idx_element" -## ... source file continues with no further traverse examples... +## ... source file continues with no further traverse examples... + ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown index 95c4bd778..3f359aa1a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Integer code examples category: page slug: sqlalchemy-types-integer-examples -sortorder: 500031000 +sortorder: 500031082 toc: False sidebartitle: sqlalchemy.types Integer meta: Python example code for the Integer class from the sqlalchemy.types module of the SQLAlchemy project. @@ -50,58 +50,7 @@ class SchemaObjects(object): local_cols, -## ... source file abbreviated to get to Integer examples ... - - - return f - - def unique_constraint(self, name, source, local_cols, schema=None, **kw): - t = sa_schema.Table( - source, - self.metadata(), - *[sa_schema.Column(n, NULLTYPE) for n in local_cols], - schema=schema - ) - kw["name"] = name - uq = sa_schema.UniqueConstraint(*[t.c[n] for n in local_cols], **kw) - # TODO: need event tests to ensure the event - # is fired off here - t.append_constraint(uq) - return uq - - def check_constraint(self, name, source, condition, schema=None, **kw): - t = sa_schema.Table( - source, - self.metadata(), -~~ sa_schema.Column("x", Integer), - schema=schema, - ) - ck = sa_schema.CheckConstraint(condition, name=name, **kw) - t.append_constraint(ck) - return ck - - def generic_constraint(self, name, table_name, type_, schema=None, **kw): - t = self.table(table_name, schema=schema) - types = { - "foreignkey": lambda name: sa_schema.ForeignKeyConstraint( - [], [], name=name - ), - "primary": sa_schema.PrimaryKeyConstraint, - "unique": sa_schema.UniqueConstraint, - "check": lambda name: sa_schema.CheckConstraint("", name=name), - None: sa_schema.Constraint, - } - try: - const = types[type_] - except KeyError: - raise TypeError( - "'type' can be one of %s" - % ", ".join(sorted(repr(x) for x in types)) - ) - - ## ... source file continues with no further Integer examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown index fdab3e548..588c8d556 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types NULLTYPE code examples category: page slug: sqlalchemy-types-nulltype-examples -sortorder: 500031001 +sortorder: 500031083 toc: False sidebartitle: sqlalchemy.types NULLTYPE meta: Python example code for the NULLTYPE class from the sqlalchemy.types module of the SQLAlchemy project. @@ -61,58 +61,7 @@ log = logging.getLogger(__name__) -## ... source file abbreviated to get to NULLTYPE examples ... - - - where=constraint.where, - schema=constraint_table.schema, - _orig_constraint=constraint, - deferrable=constraint.deferrable, - initially=constraint.initially, - using=constraint.using, - ) - - def to_constraint(self, migration_context=None): - if self._orig_constraint is not None: - return self._orig_constraint - schema_obj = schemaobj.SchemaObjects(migration_context) - t = schema_obj.table(self.table_name, schema=self.schema) - excl = ExcludeConstraint( - *self.elements, - name=self.constraint_name, - where=self.where, - **self.kw - ) - for expr, name, oper in excl._render_exprs: -~~ t.append_column(Column(name, NULLTYPE)) - t.append_constraint(excl) - return excl - - @classmethod - def create_exclude_constraint( - cls, operations, constraint_name, table_name, *elements, **kw - ): - """Issue an alter to create an EXCLUDE constraint using the - current migration context. - - .. note:: This method is Postgresql specific, and additionally - requires at least SQLAlchemy 1.0. - - e.g.:: - - from alembic import op - - op.create_exclude_constraint( - "user_excl", - "user", - - ("period", '&&'), - ("group", '='), - where=("group != 'some group'") - - ## ... source file continues with no further NULLTYPE examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown index 3d56da6da..09fee035e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util.langhelpers symbol code examples category: page slug: sqlalchemy-util-langhelpers-symbol-examples -sortorder: 500031000 +sortorder: 500031088 toc: False sidebartitle: sqlalchemy.util.langhelpers symbol meta: Python example code for the symbol function from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. @@ -16,7 +16,7 @@ symbol is a function within the sqlalchemy.util.langhelpers module of the SQLAlc and [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building projects that involve more specific storage requirements such as [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). The wide array of @@ -35,23 +35,6 @@ import sqlalchemy as sa class Timestamp(object): - """Adds `created` and `updated` columns to a derived declarative model. - - The `created` column is handled through a default and the `updated` - column is handled through a `before_update` event that propagates - for all derived declarative models. - - :: - - - import sqlalchemy as sa - from sqlalchemy_utils import Timestamp - - - class SomeModel(Base, Timestamp): - __tablename__ = 'somemodel' - id = sa.Column(sa.Integer, primary_key=True) - """ created = sa.Column(sa.DateTime, default=datetime.utcnow, nullable=False) updated = sa.Column(sa.DateTime, default=datetime.utcnow, nullable=False) @@ -59,8 +42,6 @@ class Timestamp(object): @sa.event.listens_for(Timestamp, 'before_update', propagate=True) def timestamp_before_update(mapper, connection, target): - # When a model with a timestamp is updated; force update the updated - # timestamp. target.updated = datetime.utcnow() @@ -85,14 +66,13 @@ def _generic_repr_method(self, fields): def generic_repr(*fields): - """Adds generic ``__repr__()`` method to a declarative SQLAlchemy model. - - In case if some fields are not loaded from a database, it doesn't - force their loading and instead repesents them as ````. + if len(fields) == 1 and callable(fields[0]): + target = fields[0] + target.__repr__ = lambda self: _generic_repr_method(self, fields=None) + return target ## ... source file continues with no further symbol examples... - ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown new file mode 100644 index 000000000..4fa8828fb --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown @@ -0,0 +1,185 @@ +title: sqlalchemy.util OrderedDict code examples +category: page +slug: sqlalchemy-util-ordereddict-examples +sortorder: 500031084 +toc: False +sidebartitle: sqlalchemy.util OrderedDict +meta: Python example code for the OrderedDict class from the sqlalchemy.util module of the SQLAlchemy project. + + +OrderedDict is a class within the sqlalchemy.util module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / operations / batch.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/operations/batch.py) + +```python +# batch.py +from sqlalchemy import CheckConstraint +from sqlalchemy import Column +from sqlalchemy import ForeignKeyConstraint +from sqlalchemy import Index +from sqlalchemy import MetaData +from sqlalchemy import PrimaryKeyConstraint +from sqlalchemy import schema as sql_schema +from sqlalchemy import select +from sqlalchemy import Table +from sqlalchemy import types as sqltypes +from sqlalchemy.events import SchemaEventTarget +~~from sqlalchemy.util import OrderedDict +from sqlalchemy.util import topological + +from ..util import exc +from ..util.sqla_compat import _columns_for_constraint +from ..util.sqla_compat import _fk_is_self_referential +from ..util.sqla_compat import _is_type_bound +from ..util.sqla_compat import _remove_column_from_collection + + +class BatchOperationsImpl(object): + def __init__( + self, + operations, + table_name, + schema, + recreate, + copy_from, + table_args, + table_kwargs, + reflect_args, + reflect_kwargs, + naming_convention, + partial_reordering, + ): + + +## ... source file abbreviated to get to OrderedDict examples ... + + + + def drop_table(self, table): + raise NotImplementedError("Can't drop table in batch mode") + + +class ApplyBatchImpl(object): + def __init__( + self, + impl, + table, + table_args, + table_kwargs, + reflected, + partial_reordering=(), + ): + self.impl = impl + self.table = table # this is a Table object + self.table_args = table_args + self.table_kwargs = table_kwargs + self.temp_table_name = self._calc_temp_name(table.name) + self.new_table = None + + self.partial_reordering = partial_reordering # tuple of tuples + self.add_col_ordering = () # tuple of tuples + +~~ self.column_transfers = OrderedDict( + (c.name, {"expr": c}) for c in self.table.c + ) + self.existing_ordering = list(self.column_transfers) + + self.reflected = reflected + self._grab_table_elements() + + @classmethod + def _calc_temp_name(cls, tablename): + return ("_alembic_tmp_%s" % tablename)[0:50] + + def _grab_table_elements(self): + schema = self.table.schema +~~ self.columns = OrderedDict() + for c in self.table.c: + c_copy = c.copy(schema=schema) + c_copy.unique = c_copy.index = False + if isinstance(c.type, SchemaEventTarget): + assert c_copy.type is not c.type + self.columns[c.name] = c_copy + self.named_constraints = {} + self.unnamed_constraints = [] + self.indexes = {} + self.new_indexes = {} + for const in self.table.constraints: + if _is_type_bound(const): + continue + elif self.reflected and isinstance(const, CheckConstraint): + pass + elif const.name: + self.named_constraints[const.name] = const + else: + self.unnamed_constraints.append(const) + + for idx in self.table.indexes: + self.indexes[idx.name] = idx + + for k in self.table.kwargs: + self.table_kwargs.setdefault(k, self.table.kwargs[k]) + + def _adjust_self_columns_for_partial_reordering(self): + pairs = set() + + col_by_idx = list(self.columns) + + if self.partial_reordering: + for tuple_ in self.partial_reordering: + for index, elem in enumerate(tuple_): + if index > 0: + pairs.add((tuple_[index - 1], elem)) + else: + for index, elem in enumerate(self.existing_ordering): + if index > 0: + pairs.add((col_by_idx[index - 1], elem)) + + pairs.update(self.add_col_ordering) + + pairs = [p for p in pairs if p[0] != p[1]] + + sorted_ = list( + topological.sort(pairs, col_by_idx, deterministic_order=True) + ) +~~ self.columns = OrderedDict((k, self.columns[k]) for k in sorted_) +~~ self.column_transfers = OrderedDict( + (k, self.column_transfers[k]) for k in sorted_ + ) + + def _transfer_elements_to_new_table(self): + assert self.new_table is None, "Can only create new table once" + + m = MetaData() + schema = self.table.schema + + if self.partial_reordering or self.add_col_ordering: + self._adjust_self_columns_for_partial_reordering() + + self.new_table = new_table = Table( + self.temp_table_name, + m, + *(list(self.columns.values()) + list(self.table_args)), + schema=schema, + **self.table_kwargs + ) + + for const in ( + list(self.named_constraints.values()) + self.unnamed_constraints + ): + + + +## ... source file continues with no further OrderedDict examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown new file mode 100644 index 000000000..575948d06 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown @@ -0,0 +1,196 @@ +title: sqlalchemy.util OrderedSet code examples +category: page +slug: sqlalchemy-util-orderedset-examples +sortorder: 500031085 +toc: False +sidebartitle: sqlalchemy.util OrderedSet +meta: Python example code for the OrderedSet class from the sqlalchemy.util module of the SQLAlchemy project. + + +OrderedSet is a class within the sqlalchemy.util module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / autogenerate / compare.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/autogenerate/compare.py) + +```python +# compare.py +import contextlib +import logging +import re + +from sqlalchemy import event +from sqlalchemy import inspect +from sqlalchemy import schema as sa_schema +from sqlalchemy import types as sqltypes +~~from sqlalchemy.util import OrderedSet + +from alembic.ddl.base import _fk_spec +from .render import _user_defined_render +from .. import util +from ..operations import ops +from ..util import compat +from ..util import sqla_compat + +log = logging.getLogger(__name__) + + +def _populate_migration_script(autogen_context, migration_script): + upgrade_ops = migration_script.upgrade_ops_list[-1] + downgrade_ops = migration_script.downgrade_ops_list[-1] + + _produce_net_changes(autogen_context, upgrade_ops) + upgrade_ops.reverse_into(downgrade_ops) + + +comparators = util.Dispatcher(uselist=True) + + +def _produce_net_changes(autogen_context, upgrade_ops): + + + +## ... source file abbreviated to get to OrderedSet examples ... + + + + comparators.dispatch("schema", autogen_context.dialect.name)( + autogen_context, upgrade_ops, schemas + ) + + +@comparators.dispatch_for("schema") +def _autogen_for_tables(autogen_context, upgrade_ops, schemas): + inspector = autogen_context.inspector + + conn_table_names = set() + + version_table_schema = ( + autogen_context.migration_context.version_table_schema + ) + version_table = autogen_context.migration_context.version_table + + for s in schemas: + tables = set(inspector.get_table_names(schema=s)) + if s == version_table_schema: + tables = tables.difference( + [autogen_context.migration_context.version_table] + ) + conn_table_names.update(zip([s] * len(tables), tables)) + +~~ metadata_table_names = OrderedSet( + [(table.schema, table.name) for table in autogen_context.sorted_tables] + ).difference([(version_table_schema, version_table)]) + + _compare_tables( + conn_table_names, + metadata_table_names, + inspector, + upgrade_ops, + autogen_context, + ) + + +def _compare_tables( + conn_table_names, + metadata_table_names, + inspector, + upgrade_ops, + autogen_context, +): + + default_schema = inspector.bind.dialect.default_schema_name + +~~ metadata_table_names_no_dflt_schema = OrderedSet( + [ + (schema if schema != default_schema else None, tname) + for schema, tname in metadata_table_names + ] + ) + + tname_to_table = dict( + ( + no_dflt_schema, + autogen_context.table_key_to_table[ + sa_schema._get_table_key(tname, schema) + ], + ) + for no_dflt_schema, (schema, tname) in zip( + metadata_table_names_no_dflt_schema, metadata_table_names + ) + ) + metadata_table_names = metadata_table_names_no_dflt_schema + + for s, tname in metadata_table_names.difference(conn_table_names): + name = "%s.%s" % (s, tname) if s else tname + metadata_table = tname_to_table[(s, tname)] + if autogen_context.run_filters( + metadata_table, tname, "table", False, None + + +## ... source file abbreviated to get to OrderedSet examples ... + + + onupdate=options.get("onupdate"), + ondelete=options.get("ondelete"), + deferrable=options.get("deferrable"), + initially=options.get("initially"), + name=params["name"], + ) + conn_table.append_constraint(const) + return const + + +@contextlib.contextmanager +def _compare_columns( + schema, + tname, + conn_table, + metadata_table, + modify_table_ops, + autogen_context, + inspector, +): + name = "%s.%s" % (schema, tname) if schema else tname + metadata_cols_by_name = dict( + (c.name, c) for c in metadata_table.c if not c.system + ) + conn_col_names = dict((c.name, c) for c in conn_table.c) +~~ metadata_col_names = OrderedSet(sorted(metadata_cols_by_name)) + + for cname in metadata_col_names.difference(conn_col_names): + if autogen_context.run_filters( + metadata_cols_by_name[cname], cname, "column", False, None + ): + modify_table_ops.ops.append( + ops.AddColumnOp.from_column_and_tablename( + schema, tname, metadata_cols_by_name[cname] + ) + ) + log.info("Detected added column '%s.%s'", name, cname) + + for colname in metadata_col_names.intersection(conn_col_names): + metadata_col = metadata_cols_by_name[colname] + conn_col = conn_table.c[colname] + if not autogen_context.run_filters( + metadata_col, colname, "column", False, conn_col + ): + continue + alter_column_op = ops.AlterColumnOp(tname, colname, schema=schema) + + comparators.dispatch("column")( + autogen_context, + alter_column_op, + + +## ... source file continues with no further OrderedSet examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown new file mode 100644 index 000000000..59fafe928 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown @@ -0,0 +1,127 @@ +title: sqlalchemy.util set_creation_order code examples +category: page +slug: sqlalchemy-util-set-creation-order-examples +sortorder: 500031086 +toc: False +sidebartitle: sqlalchemy.util set_creation_order +meta: Python example code for the set_creation_order function from the sqlalchemy.util module of the SQLAlchemy project. + + +set_creation_order is a function within the sqlalchemy.util module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-utils +[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) +([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) +is a code library with various helper functions and new data types +that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building +projects that involve more specific storage requirements such as +[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). +The wide array of +[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) +includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) +and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +[**sqlalchemy-utils / sqlalchemy_utils / generic.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/./generic.py) + +```python +# generic.py +try: + from collections.abc import Iterable +except ImportError: # For python 2.7 support + from collections import Iterable + +import six +import sqlalchemy as sa +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm import attributes, class_mapper, ColumnProperty +from sqlalchemy.orm.interfaces import MapperProperty, PropComparator +from sqlalchemy.orm.session import _state_session +~~from sqlalchemy.util import set_creation_order + +from .exceptions import ImproperlyConfigured +from .functions import identity + + +class GenericAttributeImpl(attributes.ScalarAttributeImpl): + def get(self, state, dict_, passive=attributes.PASSIVE_OFF): + if self.key in dict_: + return dict_[self.key] + + session = _state_session(state) + if session is None: + return None + + discriminator = self.get_state_discriminator(state) + target_class = state.class_._decl_class_registry.get(discriminator) + + if target_class is None: + return None + + id = self.get_state_id(state) + + target = session.query(target_class).get(id) + + + +## ... source file abbreviated to get to set_creation_order examples ... + + + dict_[id.key] = None + dict_[self.parent_token.discriminator.key] = None + else: + class_ = type(initiator) + mapper = class_mapper(class_) + + pk = mapper.identity_key_from_instance(initiator)[1] + + discriminator = six.text_type(class_.__name__) + + for index, id in enumerate(self.parent_token.id): + dict_[id.key] = pk[index] + dict_[self.parent_token.discriminator.key] = discriminator + + +class GenericRelationshipProperty(MapperProperty): + + def __init__(self, discriminator, id, doc=None): + super(GenericRelationshipProperty, self).__init__() + self._discriminator_col = discriminator + self._id_cols = id + self._id = None + self._discriminator = None + self.doc = doc + +~~ set_creation_order(self) + + def _column_to_property(self, column): + if isinstance(column, hybrid_property): + attr_key = column.__name__ + for key, attr in self.parent.all_orm_descriptors.items(): + if key == attr_key: + return attr + else: + for key, attr in self.parent.attrs.items(): + if isinstance(attr, ColumnProperty): + if attr.columns[0].name == column.name: + return attr + + def init(self): + def convert_strings(column): + if isinstance(column, six.string_types): + return self.parent.columns[column] + return column + + self._discriminator_col = convert_strings(self._discriminator_col) + self._id_cols = convert_strings(self._id_cols) + + if isinstance(self._id_cols, Iterable): + self._id_cols = list(map(convert_strings, self._id_cols)) + + +## ... source file continues with no further set_creation_order examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown new file mode 100644 index 000000000..9a047c0f1 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown @@ -0,0 +1,122 @@ +title: sqlalchemy.util topological code examples +category: page +slug: sqlalchemy-util-topological-examples +sortorder: 500031087 +toc: False +sidebartitle: sqlalchemy.util topological +meta: Python example code for the topological function from the sqlalchemy.util module of the SQLAlchemy project. + + +topological is a function within the sqlalchemy.util module of the SQLAlchemy project. + + +## Example 1 from alembic +[Alembic](https://github.com/sqlalchemy/alembic) +([project documentation](https://alembic.sqlalchemy.org/) and +[PyPI page](https://pypi.org/project/alembic/)) +is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make +database schema changes. The Alembic project is open sourced under the +[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). + +[**alembic / alembic / operations / batch.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/operations/batch.py) + +```python +# batch.py +from sqlalchemy import CheckConstraint +from sqlalchemy import Column +from sqlalchemy import ForeignKeyConstraint +from sqlalchemy import Index +from sqlalchemy import MetaData +from sqlalchemy import PrimaryKeyConstraint +from sqlalchemy import schema as sql_schema +from sqlalchemy import select +from sqlalchemy import Table +from sqlalchemy import types as sqltypes +from sqlalchemy.events import SchemaEventTarget +from sqlalchemy.util import OrderedDict +~~from sqlalchemy.util import topological + +from ..util import exc +from ..util.sqla_compat import _columns_for_constraint +from ..util.sqla_compat import _fk_is_self_referential +from ..util.sqla_compat import _is_type_bound +from ..util.sqla_compat import _remove_column_from_collection + + +class BatchOperationsImpl(object): + def __init__( + self, + operations, + table_name, + schema, + recreate, + copy_from, + table_args, + table_kwargs, + reflect_args, + reflect_kwargs, + naming_convention, + partial_reordering, + ): + self.operations = operations + + +## ... source file abbreviated to get to topological examples ... + + + self.indexes[idx.name] = idx + + for k in self.table.kwargs: + self.table_kwargs.setdefault(k, self.table.kwargs[k]) + + def _adjust_self_columns_for_partial_reordering(self): + pairs = set() + + col_by_idx = list(self.columns) + + if self.partial_reordering: + for tuple_ in self.partial_reordering: + for index, elem in enumerate(tuple_): + if index > 0: + pairs.add((tuple_[index - 1], elem)) + else: + for index, elem in enumerate(self.existing_ordering): + if index > 0: + pairs.add((col_by_idx[index - 1], elem)) + + pairs.update(self.add_col_ordering) + + pairs = [p for p in pairs if p[0] != p[1]] + + sorted_ = list( +~~ topological.sort(pairs, col_by_idx, deterministic_order=True) + ) + self.columns = OrderedDict((k, self.columns[k]) for k in sorted_) + self.column_transfers = OrderedDict( + (k, self.column_transfers[k]) for k in sorted_ + ) + + def _transfer_elements_to_new_table(self): + assert self.new_table is None, "Can only create new table once" + + m = MetaData() + schema = self.table.schema + + if self.partial_reordering or self.add_col_ordering: + self._adjust_self_columns_for_partial_reordering() + + self.new_table = new_table = Table( + self.temp_table_name, + m, + *(list(self.columns.values()) + list(self.table_args)), + schema=schema, + **self.table_kwargs + ) + + for const in ( + + +## ... source file continues with no further topological examples... + +``` + diff --git a/theme/templates/code-examples/sqlalchemy.html b/theme/templates/code-examples/sqlalchemy.html index aa5cb6ba8..492b04430 100644 --- a/theme/templates/code-examples/sqlalchemy.html +++ b/theme/templates/code-examples/sqlalchemy.html @@ -1,15 +1,39 @@

SQLAlchemy: -Extensions, Plug-ins and Related Libraries & +Extensions,Plug-ins and Related Libraries & Example Projects and Code

+

sqlalchemy.dialects + mssql, + mysql, + oracle, + postgresql, + sqlite +

+

sqlalchemy.dialects.postgresql + ARRAY, + BIGINT, + BIT, + ExcludeConstraint, + INTEGER, + JSON, + TSVECTOR, + array, + json +

sqlalchemy.dialects.postgresql.base PGTypeCompiler

sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2

+

sqlalchemy.engine + Connection, + Engine, + default, + url +

sqlalchemy.engine.default DefaultDialect

@@ -31,12 +55,19 @@

sqlalchemy.exc OperationalError, ProgrammingError

+

sqlalchemy.ext + compiler +

sqlalchemy.ext.automap automap_base

sqlalchemy.ext.compiler compiles

+

sqlalchemy.ext.declarative + DeclarativeMeta, + declarative_base +

sqlalchemy.ext.hybrid HYBRID_PROPERTY, hybrid_property @@ -47,6 +78,16 @@

sqlalchemy.ext.mutable

sqlalchemy.inspection inspect

+

sqlalchemy.orm + ColumnProperty, + Mapper, + SynonymProperty, + attributes, + class_mapper, + mapper, + mapperlib, + object_session +

sqlalchemy.orm.attributes InstrumentedAttribute

@@ -73,17 +114,26 @@

sqlalchemy.orm.session

sqlalchemy.orm.util AliasedInsp

+

sqlalchemy.pool + NullPool, + StaticPool +

sqlalchemy.schema CheckConstraint, Column, CreateIndex, - DDL, DDLElement, - ForeignKey, ForeignKeyConstraint, PrimaryKeyConstraint, Table

+

sqlalchemy.sql + ClauseElement, + column, + schema, + sqltypes, + table +

sqlalchemy.sql.elements Label

@@ -92,7 +142,6 @@

sqlalchemy.sql.expression ColumnClause, ColumnElement, Executable, - Function, FunctionElement, UnaryExpression

@@ -117,6 +166,12 @@

sqlalchemy.types NULLTYPE, NullType

+

sqlalchemy.util + OrderedDict, + OrderedSet, + set_creation_order, + topological +

sqlalchemy.util.langhelpers symbol

From 25a7e5e92862c1897dea77d99ca2cff6f3d29bec Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 26 Jun 2020 10:20:59 -0400 Subject: [PATCH 135/302] adding more examples for flask applications --- .../examples/flask/flask-app-flask.markdown | 769 ++++++++++++++++++ .../examples/flask/flask-app-headers.markdown | 136 ++++ .../flask/flask-blueprints-blueprint.markdown | 5 +- .../flask/flask-cli-flaskgroup.markdown | 2 +- .../flask/flask-cli-scriptinfo.markdown | 2 +- .../flask/flask-cli-with-appcontext.markdown | 2 +- .../flask/flask-ctx-has-app-context.markdown | 2 +- .../flask-ctx-has-request-context.markdown | 2 +- .../flask/flask-globals-current-app.markdown | 2 +- .../examples/flask/flask-globals-g.markdown | 739 +++++++++++++++++ .../flask/flask-globals-request.markdown | 2 +- .../flask/flask-globals-session.markdown | 2 +- .../flask/flask-helpers-flash.markdown | 2 +- .../flask-helpers-make-response.markdown | 2 +- .../flask/flask-helpers-url-for.markdown | 2 +- .../flask/flask-json-jsonify.markdown | 2 +- .../flask-sessions-badsignature.markdown | 2 +- .../flask-sessions-sessioninterface.markdown | 2 +- ...ask-signals-got-request-exception.markdown | 2 +- .../flask/flask-signals-namespace.markdown | 2 +- .../flask-templating-render-template.markdown | 2 +- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 2 +- .../examples/flask/flask-views-view.markdown | 2 +- theme/templates/code-examples/flask.html | 5 + 25 files changed, 1672 insertions(+), 22 deletions(-) create mode 100644 content/pages/examples/flask/flask-app-flask.markdown create mode 100644 content/pages/examples/flask/flask-app-headers.markdown create mode 100644 content/pages/examples/flask/flask-globals-g.markdown diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown new file mode 100644 index 000000000..083192a16 --- /dev/null +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -0,0 +1,769 @@ +title: flask.app Flask code examples +category: page +slug: flask-app-flask-examples +sortorder: 500021000 +toc: False +sidebartitle: flask.app Flask +meta: Python example code for the Flask class from the flask.app module of the Flask project. + + +Flask is a class within the flask.app module of the Flask project. + + +## Example 1 from Flask AppBuilder +[Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) +([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) +and +[example apps](https://github.com/dpgaspar/Flask-AppBuilder/tree/master/examples)) +is a web application generator that uses Flask to automatically create +the code for database-driven applications based on parameters set +by the user. The generated applications include default security settings, +forms, and internationalization support. + +Flask App Builder is provided under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/LICENSE). + +[**Flask AppBuilder / flask_appbuilder / tests / _test_ldapsearch.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/tests/_test_ldapsearch.py) + +```python +# _test_ldapsearch.py +import logging +import unittest + +~~from flask import Flask +from flask_appbuilder import AppBuilder, SQLA +import jinja2 +import ldap +from mockldap import MockLdap + + +logging.basicConfig(format="%(asctime)s:%(levelname)s:%(name)s:%(message)s") +logging.getLogger().setLevel(logging.DEBUG) +log = logging.getLogger(__name__) + + +class LDAPSearchTestCase(unittest.TestCase): + + top = ("o=test", {"o": ["test"]}) + example = ("ou=example,o=test", {"ou": ["example"]}) + manager = ( + "cn=manager,ou=example,o=test", + {"cn": ["manager"], "userPassword": ["ldaptest"]}, + ) + alice = ( + "cn=alice,ou=example,o=test", + { + "cn": ["alice"], + "memberOf": ["cn=group,ou=groups,o=test"], + "userPassword": ["alicepw"], + }, + ) + group = ( + "cn=group,ou=groups,o=test", + {"cn": ["group"], "member": ["cn=alice,ou=example,o=test"]}, + ) + + directory = dict([top, example, group, manager, alice]) + + @classmethod + def setUpClass(cls): + cls.mockldap = MockLdap(cls.directory) + + @classmethod + def tearDownClass(cls): + del cls.mockldap + + def setUp(self): + + self.mockldap.start() + self.ldapobj = self.mockldap["ldap://localhost/"] + +~~ self.app = Flask(__name__) + self.app.jinja_env.undefined = jinja2.StrictUndefined + self.db = SQLA(self.app) + + self.app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False + self.app.config["AUTH_LDAP_UID_FIELD"] = "cn" + self.app.config["AUTH_LDAP_ALLOW_SELF_SIGNED"] = False + self.app.config["AUTH_LDAP_USE_TLS"] = False + self.app.config["AUTH_LDAP_SERVER"] = "ldap://localhost/" + self.app.config["AUTH_LDAP_SEARCH"] = "ou=example,o=test" + self.app.config["AUTH_LDAP_APPEND_DOMAIN"] = False + self.app.config["AUTH_LDAP_FIRSTNAME_FIELD"] = None + self.app.config["AUTH_LDAP_LASTNAME_FIELD"] = None + self.app.config["AUTH_LDAP_EMAIL_FIELD"] = None + + def tearDown(self): + self.mockldap.stop() + del self.ldapobj + log.debug("TEAR DOWN") + + self.appbuilder = None + self.app = None + self.db = None + + def test_ldapsearch(self): + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 2 from FlaskBB +[FlaskBB](https://github.com/flaskbb/flaskbb) +([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based +forum web application. The web app allows users to chat in an open +message board or send private messages in plain text or +[Markdown](/markdown.html). + +FlaskBB is provided as open source +[under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). + +[**FlaskBB / flaskbb / app.py**](https://github.com/flaskbb/flaskbb/blob/master/flaskbb/./app.py) + +```python +# app.py +import logging +import logging.config +import os +import sys +import time +import warnings +from datetime import datetime + +~~from flask import Flask, request +from flask_login import current_user +from sqlalchemy import event +from sqlalchemy.engine import Engine +from sqlalchemy.exc import OperationalError, ProgrammingError + +from flaskbb._compat import iteritems, string_types +from flaskbb.extensions import (alembic, allows, babel, cache, celery, csrf, + db, debugtoolbar, limiter, login_manager, mail, + redis_store, themes, whooshee) +from flaskbb.plugins import spec +from flaskbb.plugins.manager import FlaskBBPluginManager +from flaskbb.plugins.models import PluginRegistry +from flaskbb.plugins.utils import remove_zombie_plugins_from_db, template_hook +from flaskbb.user.models import Guest, User +from flaskbb.utils.helpers import (app_config_from_env, crop_title, + format_date, format_datetime, + forum_is_unread, get_alembic_locations, + get_flaskbb_config, is_online, mark_online, + render_template, time_since, time_utcnow, + topic_is_unread) +from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin, + IsAtleastModerator, can_delete_topic, + can_edit_post, can_moderate, + can_post_reply, can_post_topic, + has_permission, + permission_with_identity) +from flaskbb.utils.search import (ForumWhoosheer, PostWhoosheer, + TopicWhoosheer, UserWhoosheer) +from flaskbb.utils.settings import flaskbb_config +from flaskbb.utils.translations import FlaskBBDomain + +from . import markup # noqa +from .auth import views as auth_views # noqa +from .deprecation import FlaskBBDeprecation +from .display.navigation import NavigationContentType +from .forum import views as forum_views # noqa +from .management import views as management_views # noqa +from .user import views as user_views # noqa + +logger = logging.getLogger(__name__) + + +def create_app(config=None, instance_path=None): + +~~ app = Flask( + "flaskbb", instance_path=instance_path, instance_relative_config=True + ) + + if not os.path.exists(app.instance_path): + os.makedirs(app.instance_path) + + configure_app(app, config) + configure_celery_app(app, celery) + configure_extensions(app) + load_plugins(app) + configure_blueprints(app) + configure_template_filters(app) + configure_context_processors(app) + configure_before_handlers(app) + configure_errorhandlers(app) + configure_migrations(app) + configure_translations(app) + app.pluggy.hook.flaskbb_additional_setup(app=app, pluggy=app.pluggy) + + return app + + +def configure_app(app, config): + app.config.from_object("flaskbb.configs.default.DefaultConfig") + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 3 from flask-base +[flask-base](https://github.com/hack4impact/flask-base) +([project documentation](http://hack4impact.github.io/flask-base/)) +provides boilerplate code for new [Flask](/flask.html) web apps. +The purpose of the boilerplate is to stitch together disparate +libraries that are commonly used in Flask projects, such as +[Redis](/redis.html) for fast caching and transient data storage, +[SendGrid](https://www.twilio.com/sendgrid) for transactional email, +[SQLAlchemy](/sqlalchemy.html) for persistent data storage through a +[relational database](/databases.html) backend, +[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +handling and many others. + +flask-base is provided as open source under the +[MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md). + +[**flask-base / app / __init__.py**](https://github.com/hack4impact/flask-base/blob/master/app/./__init__.py) + +```python +# __init__.py +import os + +~~from flask import Flask +from flask_assets import Environment +from flask_compress import Compress +from flask_login import LoginManager +from flask_mail import Mail +from flask_rq import RQ +from flask_sqlalchemy import SQLAlchemy +from flask_wtf import CSRFProtect + +from app.assets import app_css, app_js, vendor_css, vendor_js +from config import config as Config + +basedir = os.path.abspath(os.path.dirname(__file__)) + +mail = Mail() +db = SQLAlchemy() +csrf = CSRFProtect() +compress = Compress() + +login_manager = LoginManager() +login_manager.session_protection = 'strong' +login_manager.login_view = 'account.login' + + +def create_app(config): +~~ app = Flask(__name__) + config_name = config + + if not isinstance(config, str): + config_name = os.getenv('FLASK_CONFIG', 'default') + + app.config.from_object(Config[config_name]) + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + + Config[config_name].init_app(app) + + mail.init_app(app) + db.init_app(app) + login_manager.init_app(app) + csrf.init_app(app) + compress.init_app(app) + RQ(app) + + from .utils import register_template_utils + register_template_utils(app) + + assets_env = Environment(app) + dirs = ['assets/styles', 'assets/scripts'] + for path in dirs: + assets_env.append_path(os.path.join(basedir, path)) + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 4 from flask-bookshelf +[flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the +example [Flask](/flask.html) application that developers create when +going through +[this Flask series of blog posts](https://damyanon.net/tags/flask-series/). + +[**flask-bookshelf / bookshelf / __init__.py**](https://github.com/damyanbogoev/flask-bookshelf/blob/master/bookshelf/./__init__.py) + +```python +# __init__.py +~~from flask import abort, Flask, g, render_template, request, current_app +from flask_babel import Babel +from flask_security import current_user +from bookshelf.utils import get_instance_folder_path +from bookshelf.main.controllers import main +from bookshelf.admin.controllers import admin +from bookshelf.cache import cache +from bookshelf.config import configure_app +from bookshelf.data.models import db + +~~app = Flask( + __name__, + instance_path=get_instance_folder_path(), + instance_relative_config=True, + template_folder="templates", +) + +babel = Babel(app) +configure_app(app) +cache.init_app(app) +db.init_app(app) +app.jinja_env.add_extension("jinja2.ext.loopcontrols") + + +@app.url_defaults +def set_language_code(endpoint, values): + if "lang_code" in values or not g.get("lang_code", None): + return + if app.url_map.is_endpoint_expecting(endpoint, "lang_code"): + values["lang_code"] = g.lang_code + + +@app.url_value_preprocessor +def get_lang_code(endpoint, values): + if values is not None: + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 5 from flaskex +[Flaskex](https://github.com/anfederico/Flaskex) is a working example +[Flask](/flask.html) web application intended as a base to build your +own applications upon. The application comes with pre-built sign up, log in +and related screens, as well as a database backend. Flaskex is provided +as open source under the +[MIT license](https://github.com/anfederico/Flaskex/blob/master/LICENSE.txt). + +[**flaskex / app.py**](https://github.com/anfederico/Flaskex/blob/master/././app.py) + +```python +# app.py + +from scripts import tabledef +from scripts import forms +from scripts import helpers +~~from flask import Flask, redirect, url_for, render_template, request, session +import json +import sys +import os + +~~app = Flask(__name__) +app.secret_key = os.urandom(12) # Generic key for dev purposes only + + +@app.route('/', methods=['GET', 'POST']) +def login(): + if not session.get('logged_in'): + form = forms.LoginForm(request.form) + if request.method == 'POST': + username = request.form['username'].lower() + password = request.form['password'] + if form.validate(): + if helpers.credentials_valid(username, password): + session['logged_in'] = True + session['username'] = username + return json.dumps({'status': 'Login successful'}) + return json.dumps({'status': 'Invalid user/pass'}) + return json.dumps({'status': 'Both fields required'}) + return render_template('login.html', form=form) + user = helpers.get_user() + return render_template('home.html', user=user) + + +@app.route("/logout") +def logout(): + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 6 from flask-phone-input +[flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) +is an example application that ties together the +[intTellInput.js](https://github.com/jackocnr/intl-tel-input) +JavaScript plugin with the +[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) form-handling +library. flask-phone-input is provided as open source under the +[MIT license](https://github.com/miguelgrinberg/flask-phone-input/blob/1a1c227c044474ce0fe133493d7f8b0fb8312409/LICENSE). + +[**flask-phone-input / app.py**](https://github.com/miguelgrinberg/flask-phone-input/blob/master/././app.py) + +```python +# app.py +~~from flask import Flask, render_template, session, redirect, url_for +from flask_bootstrap import Bootstrap +from flask_wtf import FlaskForm +import phonenumbers +from wtforms import StringField, SubmitField +from wtforms.validators import DataRequired, ValidationError + +~~app = Flask(__name__) +app.config['SECRET_KEY'] = 'top-secret!' +Bootstrap(app) + + +class PhoneForm(FlaskForm): + phone = StringField('Phone', validators=[DataRequired()]) + submit = SubmitField('Submit') + + def validate_phone(self, phone): + try: + p = phonenumbers.parse(phone.data) + if not phonenumbers.is_valid_number(p): + raise ValueError() + except (phonenumbers.phonenumberutil.NumberParseException, ValueError): + raise ValidationError('Invalid phone number') + + +@app.route('/', methods=['GET', 'POST']) +def index(): + form = PhoneForm() + if form.validate_on_submit(): + session['phone'] = form.phone.data + return redirect(url_for('show_phone')) + return render_template('index.html', form=form) + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 7 from flaskSaaS +[flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate +starter project to build a software-as-a-service (SaaS) web application +in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The +boilerplate relies on many common Flask extensions such as +[Flask-WTF](https://flask-wtf.readthedocs.io/en/latest/), +[Flask-Login](https://flask-login.readthedocs.io/en/latest/), +[Flask-Admin](https://flask-admin.readthedocs.io/en/latest/), and +many others. The project is provided as open source under the +[MIT license](https://github.com/alectrocute/flaskSaaS/blob/master/LICENSE). + +[**flaskSaaS / app / __init__.py**](https://github.com/alectrocute/flaskSaaS/blob/master/app/./__init__.py) + +```python +# __init__.py +~~from flask import Flask + +~~app = Flask(__name__) + +app.config.from_object('app.config') + +from app.logger_setup import logger + +from flask.ext.sqlalchemy import SQLAlchemy +db = SQLAlchemy(app) + +from flask.ext.mail import Mail +mail = Mail(app) + +from flask_debugtoolbar import DebugToolbarExtension +app.config['DEBUG_TB_TEMPLATE_EDITOR_ENABLED'] = True +app.config['DEBUG_TB_PROFILER_ENABLED'] = True +toolbar = DebugToolbarExtension(app) + +from flask.ext.bcrypt import Bcrypt +bcrypt = Bcrypt(app) + +from app.views import main, user, error +app.register_blueprint(user.userbp) + +from flask.ext.login import LoginManager +from app.models import User + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 8 from Flasky +[Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful +example application by +[Miguel Grinberg](https://github.com/miguelgrinberg) that he builds +while teaching developers how to use [Flask](/flask.html) in +[his books and videos](https://courses.miguelgrinberg.com/). Flasky +is [open sourced under the MIT license](https://github.com/miguelgrinberg/flasky/blob/master/LICENSE). + +[**Flasky / app / __init__.py**](https://github.com/miguelgrinberg/flasky/blob/master/./app/__init__.py) + +```python +# __init__.py +~~from flask import Flask +from flask_bootstrap import Bootstrap +from flask_mail import Mail +from flask_moment import Moment +from flask_sqlalchemy import SQLAlchemy +from flask_login import LoginManager +from flask_pagedown import PageDown +from config import config + +bootstrap = Bootstrap() +mail = Mail() +moment = Moment() +db = SQLAlchemy() +pagedown = PageDown() + +login_manager = LoginManager() +login_manager.login_view = 'auth.login' + + +def create_app(config_name): +~~ app = Flask(__name__) + app.config.from_object(config[config_name]) + config[config_name].init_app(app) + + bootstrap.init_app(app) + mail.init_app(app) + moment.init_app(app) + db.init_app(app) + login_manager.init_app(app) + pagedown.init_app(app) + + if app.config['SSL_REDIRECT']: + from flask_sslify import SSLify + sslify = SSLify(app) + + from .main import main as main_blueprint + app.register_blueprint(main_blueprint) + + from .auth import auth as auth_blueprint + app.register_blueprint(auth_blueprint, url_prefix='/auth') + + from .api import api as api_blueprint + app.register_blueprint(api_blueprint, url_prefix='/api/v1') + + return app + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 9 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / app.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./app.py) + +```python +# app.py + +~~from flask import Flask, current_app, jsonify +from sqlalchemy.sql import sqltypes + +from sandman2.exception import ( + BadRequestException, + ForbiddenException, + NotFoundException, + NotAcceptableException, + NotImplementedException, + ConflictException, + ServerErrorException, + ServiceUnavailableException, + ) +from sandman2.service import Service +from sandman2.model import db, Model, AutomapModel +from sandman2.admin import CustomAdminView +from flask_admin import Admin +from flask_httpauth import HTTPBasicAuth + +auth = HTTPBasicAuth() + +def get_app( + database_uri, + exclude_tables=None, + user_models=None, + reflect_all=True, + read_only=False, + schema=None): +~~ app = Flask('sandman2') + app.config['SQLALCHEMY_DATABASE_URI'] = database_uri + app.config['SANDMAN2_READ_ONLY'] = read_only + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + app.classes = [] + db.init_app(app) + admin = Admin(app, base_template='layout.html', template_mode='bootstrap3') + _register_error_handlers(app) + if user_models: + with app.app_context(): + _register_user_models(user_models, admin, schema=schema) + elif reflect_all: + with app.app_context(): + _reflect_all(exclude_tables, admin, read_only, schema=schema) + + @app.route('/') + def index(): + routes = {} + for cls in app.classes: + routes[cls.__model__.__name__] = '{}{{/{}}}'.format( + cls.__model__.__url__, + cls.__model__.primary_key()) + return jsonify(routes) + return app + + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 10 from tedivms-flask +[tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a +base of [Flask](/flask.html) code and related projects such as +[Celery](/celery.html) which provides a template to start your own +Flask web app. The project comes baked with an admin panel, +[API authentication and authorization](/application-programming-interfaces.html), +[SQLAlchemy](/sqlalchemy.html) and many other common libraries that are +often used with Flask. + +The project's code is provided as open source under the +[BSD 2-Clause "Simplified" license](https://github.com/tedivm/tedivms-flask/blob/master/LICENSE.txt). + +[**tedivms-flask / app / __init__.py**](https://github.com/tedivm/tedivms-flask/blob/master/app/./__init__.py) + +```python +# __init__.py +import boto3 +from celery import Celery +from datetime import datetime +import os +import requests +import yaml + +~~from flask import Flask, session, render_template +from flask_mail import Mail +from flask_migrate import Migrate, MigrateCommand +from flask.sessions import SessionInterface +from flask_sqlalchemy import SQLAlchemy +from flask_user import user_logged_out +from flask_wtf.csrf import CSRFProtect + +from beaker.cache import CacheManager +from beaker.util import parse_cache_config_options +from beaker.middleware import SessionMiddleware + +db = SQLAlchemy() +csrf_protect = CSRFProtect() +mail = Mail() +migrate = Migrate() + + +def get_config(): +~~ app = Flask(__name__) + + app.config.from_object('app.settings') + if 'APPLICATION_SETTINGS' in os.environ: + app.config.from_envvar(os.environ['APPLICATION_SETTINGS']) + if 'AWS_SECRETS_MANAGER_CONFIG' in os.environ: + secret_config = get_secrets(os.environ['AWS_SECRETS_MANAGER_CONFIG']) + app.config.update(secret_config) + elif 'AWS_SECRETS_MANAGER_CONFIG' in app.config: + secret_config = get_secrets(app.config['AWS_SECRETS_MANAGER_CONFIG']) + app.config.update(secret_config) + for setting in app.config: + if setting in os.environ: + if os.environ[setting].lower() == 'true': + app.config[setting] = True + elif os.environ[setting].lower() == 'false': + app.config[setting] = False + else: + app.config[setting] = os.environ[setting] + if app.config.get('USER_LDAP', False): + app.config['USER_ENABLE_USERNAME'] = True + return app.config + + +def get_secrets(secret_name, region=False): + + +## ... source file abbreviated to get to Flask examples ... + + + + return yaml.safe_load(secret) + + +def get_secret_region(): + if 'AWS_SECRETS_REGION' in os.environ: + return os.environ['AWS_SECRETS_REGION'] + + boto3_session = boto3.session.Session() + if boto3_session.region_name: + return boto3_session.region_name + + r = requests.get('http://169.254.169.254/latest/dynamic/instance-identity/document', timeout=0.2) + r.raise_for_status() + data = r.json() + return data['region'] + + +base_config = get_config() + +celery = Celery(__name__, broker=base_config['CELERY_BROKER']) +cache = None # Initiate below, but define here for scope reasons. + + +def create_app(extra_config_settings={}): +~~ app = Flask(__name__) + + base_config = get_config() + app.config.update(base_config) + app.config.update(extra_config_settings) + + + db.init_app(app) + + migrate.init_app(app, db) + + mail.init_app(app) + + csrf_protect.init_app(app) + + cache = init_cache_manager(app) + + init_session_manager(app) + + init_celery_service(app) + + init_error_handlers(app) + + from app.extensions.jinja import jinja_extensions_blueprint + app.register_blueprint(jinja_extensions_blueprint) + + +## ... source file continues with no further Flask examples... + +``` + diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown new file mode 100644 index 000000000..71209d085 --- /dev/null +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -0,0 +1,136 @@ +title: flask.app Headers code examples +category: page +slug: flask-app-headers-examples +sortorder: 500021001 +toc: False +sidebartitle: flask.app Headers +meta: Python example code for the Headers class from the flask.app module of the Flask project. + + +Headers is a class within the flask.app module of the Flask project. + + +## Example 1 from flask-restx +[Flask RESTX](https://github.com/python-restx/flask-restx) is an +extension that makes it easier to build +[RESTful APIs](/application-programming-interfaces.html) into +your applications. Flask RESTX aims for minimal configuration to +get basic APIs running for existing applications and it exposes +endpoint documentation using [Swagger](https://swagger.io/). + +Flask RESTX is provided as open source under the +[BSD 3-Clause license](https://github.com/python-restx/flask-restx/blob/master/LICENSE). + +[**flask-restx / flask_restx / api.py**](https://github.com/python-restx/flask-restx/blob/master/flask_restx/./api.py) + +```python +# api.py +from __future__ import unicode_literals + +import difflib +import inspect +from itertools import chain +import logging +import operator +import re +import six +import sys + +from collections import OrderedDict +from functools import wraps, partial +from types import MethodType + +from flask import url_for, request, current_app +from flask import make_response as original_flask_make_response +from flask.helpers import _endpoint_from_view_func +from flask.signals import got_request_exception + +from jsonschema import RefResolver + +from werkzeug.utils import cached_property +~~from werkzeug.datastructures import Headers +from werkzeug.exceptions import ( + HTTPException, + MethodNotAllowed, + NotFound, + NotAcceptable, + InternalServerError, +) +from werkzeug.wrappers import BaseResponse + +from . import apidoc +from .mask import ParseError, MaskError +from .namespace import Namespace +from .postman import PostmanCollectionV1 +from .resource import Resource +from .swagger import Swagger +from .utils import default_id, camel_to_dash, unpack +from .representations import output_json +from ._http import HTTPStatus + +RE_RULES = re.compile("(<.*>)") + +HEADERS_BLACKLIST = ("Content-Length",) + +DEFAULT_REPRESENTATIONS = [("application/json", output_json)] + + +## ... source file abbreviated to get to Headers examples ... + + + return self.handle_error(e) + except Exception as f: + return original_handler(f) + return original_handler(e) + + def handle_error(self, e): + got_request_exception.send(current_app._get_current_object(), exception=e) + + if ( + not isinstance(e, HTTPException) + and current_app.propagate_exceptions + and not isinstance(e, tuple(self.error_handlers.keys())) + ): + + exc_type, exc_value, tb = sys.exc_info() + if exc_value is e: + raise + else: + raise e + + include_message_in_response = current_app.config.get( + "ERROR_INCLUDE_MESSAGE", True + ) + default_data = {} + +~~ headers = Headers() + + for typecheck, handler in six.iteritems(self._own_and_child_error_handlers): + if isinstance(e, typecheck): + result = handler(e) + default_data, code, headers = unpack( + result, HTTPStatus.INTERNAL_SERVER_ERROR + ) + break + else: + if isinstance(e, HTTPException): + code = HTTPStatus(e.code) + if include_message_in_response: + default_data = {"message": getattr(e, "description", code.phrase)} + headers = e.get_response().headers + elif self._default_error_handler: + result = self._default_error_handler(e) + default_data, code, headers = unpack( + result, HTTPStatus.INTERNAL_SERVER_ERROR + ) + else: + code = HTTPStatus.INTERNAL_SERVER_ERROR + if include_message_in_response: + default_data = { + "message": code.phrase, + + +## ... source file continues with no further Headers examples... + +``` + diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 3fc8f9a9c..4e111ee5b 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -1,13 +1,14 @@ title: flask.blueprints Blueprint code examples category: page slug: flask-blueprints-blueprint-examples -sortorder: 500021000 +sortorder: 500021002 toc: False sidebartitle: flask.blueprints Blueprint meta: Python example code for the Blueprint class from the flask.blueprints module of the Flask project. -Blueprint is a class within the flask.blueprints module of the Flask project. +A Blueprint in [Flask](/flask.html) is +[a "mold" or template for creating parts of web applications](https://stackoverflow.com/questions/24420857/what-are-flask-blueprints-exactly). ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 83d9b0766..7ac0b6adb 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -1,7 +1,7 @@ title: flask.cli FlaskGroup code examples category: page slug: flask-cli-flaskgroup-examples -sortorder: 500021001 +sortorder: 500021003 toc: False sidebartitle: flask.cli FlaskGroup meta: Python example code for the FlaskGroup class from the flask.cli module of the Flask project. diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index 7a2103213..9e0138c16 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -1,7 +1,7 @@ title: flask.cli ScriptInfo code examples category: page slug: flask-cli-scriptinfo-examples -sortorder: 500021002 +sortorder: 500021004 toc: False sidebartitle: flask.cli ScriptInfo meta: Python example code for the ScriptInfo class from the flask.cli module of the Flask project. diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index 5435b7acf..d80fdd38e 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -1,7 +1,7 @@ title: flask.cli with_appcontext code examples category: page slug: flask-cli-with-appcontext-examples -sortorder: 500021003 +sortorder: 500021005 toc: False sidebartitle: flask.cli with_appcontext meta: Python example code for the with_appcontext function from the flask.cli module of the Flask project. diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index 3be521eec..c8c65831c 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -1,7 +1,7 @@ title: flask.ctx has_app_context code examples category: page slug: flask-ctx-has-app-context-examples -sortorder: 500021004 +sortorder: 500021006 toc: False sidebartitle: flask.ctx has_app_context meta: Python example code for the has_app_context function from the flask.ctx module of the Flask project. diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index 98fe607a3..9308d4883 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -1,7 +1,7 @@ title: flask.ctx has_request_context code examples category: page slug: flask-ctx-has-request-context-examples -sortorder: 500021005 +sortorder: 500021007 toc: False sidebartitle: flask.ctx has_request_context meta: Python example code for the has_request_context function from the flask.ctx module of the Flask project. diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 06330d075..fa63924b1 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -1,7 +1,7 @@ title: flask.globals current_app code examples category: page slug: flask-globals-current-app-examples -sortorder: 500021006 +sortorder: 500021008 toc: False sidebartitle: flask.globals current_app meta: Python example code for the current_app function from the flask.globals module of the Flask project. diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown new file mode 100644 index 000000000..d8cb2b218 --- /dev/null +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -0,0 +1,739 @@ +title: flask.globals g code examples +category: page +slug: flask-globals-g-examples +sortorder: 500021009 +toc: False +sidebartitle: flask.globals g +meta: Python example code for the g function from the flask.globals module of the Flask project. + + +g is a function within the flask.globals module of the Flask project. + + +## Example 1 from Flask AppBuilder +[Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) +([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) +and +[example apps](https://github.com/dpgaspar/Flask-AppBuilder/tree/master/examples)) +is a web application generator that uses Flask to automatically create +the code for database-driven applications based on parameters set +by the user. The generated applications include default security settings, +forms, and internationalization support. + +Flask App Builder is provided under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/LICENSE). + +[**Flask AppBuilder / flask_appbuilder / security / manager.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/security/manager.py) + +```python +# manager.py +import base64 +import datetime +import json +import logging +import re +from typing import Dict, List, Set + +~~from flask import g, session, url_for +from flask_babel import lazy_gettext as _ +from flask_jwt_extended import current_user as current_user_jwt +from flask_jwt_extended import JWTManager +from flask_login import current_user, LoginManager +from flask_openid import OpenID +from werkzeug.security import check_password_hash, generate_password_hash + +from .api import SecurityApi +from .registerviews import ( + RegisterUserDBView, + RegisterUserOAuthView, + RegisterUserOIDView, +) +from .views import ( + AuthDBView, + AuthLDAPView, + AuthOAuthView, + AuthOIDView, + AuthRemoteUserView, + PermissionModelView, + PermissionViewModelView, + RegisterUserModelView, + ResetMyPasswordView, + ResetPasswordView, + + +## ... source file abbreviated to get to g examples ... + + + return self.appbuilder.get_app.config["AUTH_LDAP_TLS_CACERTDIR"] + + @property + def auth_ldap_tls_cacertfile(self): + return self.appbuilder.get_app.config["AUTH_LDAP_TLS_CACERTFILE"] + + @property + def auth_ldap_tls_certfile(self): + return self.appbuilder.get_app.config["AUTH_LDAP_TLS_CERTFILE"] + + @property + def auth_ldap_tls_keyfile(self): + return self.appbuilder.get_app.config["AUTH_LDAP_TLS_KEYFILE"] + + @property + def openid_providers(self): + return self.appbuilder.get_app.config["OPENID_PROVIDERS"] + + @property + def oauth_providers(self): + return self.appbuilder.get_app.config["OAUTH_PROVIDERS"] + + @property + def current_user(self): + if current_user.is_authenticated: +~~ return g.user + elif current_user_jwt: + return current_user_jwt + + def oauth_user_info_getter(self, f): + + def wraps(provider, response=None): + ret = f(self, provider, response=response) + if not type(ret) == dict: + log.error( + "OAuth user info decorated function " + "did not returned a dict, but: {0}".format(type(ret)) + ) + return {} + return ret + + self.oauth_user_info = wraps + return wraps + + def get_oauth_token_key_name(self, provider): + for _provider in self.oauth_providers: + if _provider["name"] == provider: + return _provider.get("token_key", "oauth_token") + + def get_oauth_token_secret_name(self, provider): + + +## ... source file abbreviated to get to g examples ... + + + role, permission_name, view_menu_name + ): + result.add(view_menu_name) + else: + db_role_ids.append(role.id) + pvms_names = [ + pvm.view_menu.name + for pvm in self.find_roles_permission_view_menus( + permission_name, db_role_ids + ) + ] + result.update(pvms_names) + return result + + def has_access(self, permission_name, view_name): + if current_user.is_authenticated: + return self._has_view_access(g.user, permission_name, view_name) + elif current_user_jwt: + return self._has_view_access(current_user_jwt, permission_name, view_name) + else: + return self.is_item_public(permission_name, view_name) + + def get_user_menu_access(self, menu_names: List[str] = None) -> Set[str]: + if current_user.is_authenticated: + return self._get_user_permission_view_menus( +~~ g.user, "menu_access", view_menus_name=menu_names + ) + elif current_user_jwt: + return self._get_user_permission_view_menus( + current_user_jwt, "menu_access", view_menus_name=menu_names + ) + else: + return self._get_user_permission_view_menus( + None, "menu_access", view_menus_name=menu_names + ) + + def add_permissions_view(self, base_permissions, view_menu): + view_menu_db = self.add_view_menu(view_menu) + perm_views = self.find_permissions_view_menu(view_menu_db) + + if not perm_views: + for permission in base_permissions: + pv = self.add_permission_view_menu(permission, view_menu) + if self.auth_role_admin not in self.builtin_roles: + role_admin = self.find_role(self.auth_role_admin) + self.add_permission_role(role_admin, pv) + else: + role_admin = self.find_role(self.auth_role_admin) + for permission in base_permissions: + if not self.exist_permission_on_views(perm_views, permission): + + +## ... source file abbreviated to get to g examples ... + + + raise NotImplementedError + + def add_permission_view_menu(self, permission_name, view_menu_name): + raise NotImplementedError + + def del_permission_view_menu(self, permission_name, view_menu_name, cascade=True): + raise NotImplementedError + + def exist_permission_on_views(self, lst, item): + raise NotImplementedError + + def exist_permission_on_view(self, lst, permission, view_menu): + raise NotImplementedError + + def add_permission_role(self, role, perm_view): + raise NotImplementedError + + def del_permission_role(self, role, perm_view): + raise NotImplementedError + + def load_user(self, pk): + return self.get_user_by_id(int(pk)) + + def load_user_jwt(self, pk): + user = self.load_user(pk) +~~ g.user = user + return user + + @staticmethod + def before_request(): +~~ g.user = current_user + + + +## ... source file continues with no further g examples... + +``` + + +## Example 2 from flask-bookshelf +[flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the +example [Flask](/flask.html) application that developers create when +going through +[this Flask series of blog posts](https://damyanon.net/tags/flask-series/). + +[**flask-bookshelf / bookshelf / __init__.py**](https://github.com/damyanbogoev/flask-bookshelf/blob/master/bookshelf/./__init__.py) + +```python +# __init__.py +~~from flask import abort, Flask, g, render_template, request, current_app +from flask_babel import Babel +from flask_security import current_user +from bookshelf.utils import get_instance_folder_path +from bookshelf.main.controllers import main +from bookshelf.admin.controllers import admin +from bookshelf.cache import cache +from bookshelf.config import configure_app +from bookshelf.data.models import db + +app = Flask( + __name__, + instance_path=get_instance_folder_path(), + instance_relative_config=True, + template_folder="templates", +) + +babel = Babel(app) +configure_app(app) +cache.init_app(app) +db.init_app(app) +app.jinja_env.add_extension("jinja2.ext.loopcontrols") + + +@app.url_defaults +def set_language_code(endpoint, values): +~~ if "lang_code" in values or not g.get("lang_code", None): + return + if app.url_map.is_endpoint_expecting(endpoint, "lang_code"): +~~ values["lang_code"] = g.lang_code + + +@app.url_value_preprocessor +def get_lang_code(endpoint, values): + if values is not None: +~~ g.lang_code = values.pop("lang_code", None) + + +@app.before_request +def ensure_lang_support(): +~~ lang_code = g.get("lang_code", None) + if lang_code and lang_code not in app.config["SUPPORTED_LANGUAGES"].keys(): + abort(404) + + +@babel.localeselector +def get_locale(): +~~ return g.get("lang_code", app.config["BABEL_DEFAULT_LOCALE"]) + + +@babel.timezoneselector +def get_timezone(): +~~ user = g.get("user", None) + if user is not None: + return user.timezone + return "UTC" + + +@app.errorhandler(404) +def page_not_found(error): + current_app.logger.error("Page not found: %s", (request.path, error)) + return render_template("404.htm"), 404 + + +@app.errorhandler(500) +def internal_server_error(error): + current_app.logger.error("Server Error: %s", (error)) + return render_template("500.htm"), 500 + + +@app.errorhandler(Exception) +def unhandled_exception(error): + current_app.logger.error("Unhandled Exception: %s", (error)) + return render_template("500.htm"), 500 + + +@app.context_processor +def inject_data(): +~~ return dict(user=current_user, lang_code=g.get("lang_code", None)) + + +@app.route("/") +@app.route("//") +@cache.cached(300) +def home(lang_code=None): + return render_template("index.htm") + + +app.register_blueprint(main, url_prefix="/main") +app.register_blueprint(main, url_prefix="//main") +app.register_blueprint(admin, url_prefix="/admin") +app.register_blueprint(admin, url_prefix="//admin") + + + +## ... source file continues with no further g examples... + +``` + + +## Example 3 from flask-debugtoolbar +[Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) +([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/Flask-DebugToolbar/)) +is a [Flask](/flask.html) conversion of the popular +[Django Debug Toolbar](https://github.com/jazzband/django-debug-toolbar) +project. This extension creates a sidebar with useful debugging +information when you are running a Flask application in development +mode. The project is provided as open source under +[this license](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/LICENSE). + +[**flask-debugtoolbar / flask_debugtoolbar / __init__.py**](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/flask_debugtoolbar/./__init__.py) + +```python +# __init__.py +import os +import warnings + +~~from flask import Blueprint, current_app, request, g, send_from_directory, url_for +from flask.globals import _request_ctx_stack +from jinja2 import Environment, PackageLoader +from werkzeug.urls import url_quote_plus + +from flask_debugtoolbar.compat import iteritems +from flask_debugtoolbar.toolbar import DebugToolbar +from flask_debugtoolbar.utils import decode_text + +try: + from importlib.metadata import version + + __version__ = version("Flask-DebugToolbar") +except ImportError: + import pkg_resources + + __version__ = pkg_resources.get_distribution("Flask-DebugToolbar").version + + +module = Blueprint('debugtoolbar', __name__) + + +def replace_insensitive(string, target, replacement): + no_case = string.lower() + index = no_case.rfind(target.lower()) + + +## ... source file abbreviated to get to g examples ... + + + rule = req.url_rule + + if getattr(rule, 'provide_automatic_options', False) \ + and req.method == 'OPTIONS': + return app.make_default_options_response() + + view_func = app.view_functions[rule.endpoint] + view_func = self.process_view(app, view_func, req.view_args) + + return view_func(**req.view_args) + + def _show_toolbar(self): + if request.blueprint == 'debugtoolbar': + return False + + hosts = current_app.config['DEBUG_TB_HOSTS'] + if hosts and request.remote_addr not in hosts: + return False + + return True + + def send_static_file(self, filename): + return send_from_directory(self._static_dir, filename) + + def process_request(self): +~~ g.debug_toolbar = self + + if not self._show_toolbar(): + return + + real_request = request._get_current_object() + + self.debug_toolbars[real_request] = ( + DebugToolbar(real_request, self.jinja_env)) + + for panel in self.debug_toolbars[real_request].panels: + panel.process_request(real_request) + + def process_view(self, app, view_func, view_kwargs): + real_request = request._get_current_object() + try: + toolbar = self.debug_toolbars[real_request] + except KeyError: + return view_func + + for panel in toolbar.panels: + new_view = panel.process_view(real_request, view_func, view_kwargs) + if new_view: + view_func = new_view + + + +## ... source file continues with no further g examples... + +``` + + +## Example 4 from Flask-WTF +[Flask-WTF](https://github.com/lepture/flask-wtf) +([project documentation](https://flask-wtf.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/Flask-WTF/)) +provides a bridge between [Flask](/flask.html) and the the +[WTForms](https://wtforms.readthedocs.io/en/2.3.x/) form-handling library. +It makes it easier to use WTForms by reducing boilerplate code and +shorter examples for common form operations as well as common security +practices such as [CSRF](/cross-site-request-forgery-csrf.html). + +[**Flask-WTF / flask_wtf / csrf.py**](https://github.com/lepture/flask-wtf/blob/master/flask_wtf/./csrf.py) + +```python +# csrf.py +import hashlib +import logging +import os +import warnings +from functools import wraps + +~~from flask import Blueprint, current_app, g, request, session +from itsdangerous import BadData, SignatureExpired, URLSafeTimedSerializer +from werkzeug.exceptions import BadRequest +from werkzeug.security import safe_str_cmp +from wtforms import ValidationError +from wtforms.csrf.core import CSRF + +from ._compat import FlaskWTFDeprecationWarning, string_types, urlparse + +__all__ = ('generate_csrf', 'validate_csrf', 'CSRFProtect') +logger = logging.getLogger(__name__) + + +def generate_csrf(secret_key=None, token_key=None): + + secret_key = _get_config( + secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, + message='A secret key is required to use CSRF.' + ) + field_name = _get_config( + token_key, 'WTF_CSRF_FIELD_NAME', 'csrf_token', + message='A field name is required to use CSRF.' + ) + +~~ if field_name not in g: + s = URLSafeTimedSerializer(secret_key, salt='wtf-csrf-token') + + if field_name not in session: + session[field_name] = hashlib.sha1(os.urandom(64)).hexdigest() + + try: + token = s.dumps(session[field_name]) + except TypeError: + session[field_name] = hashlib.sha1(os.urandom(64)).hexdigest() + token = s.dumps(session[field_name]) + + setattr(g, field_name, token) + +~~ return g.get(field_name) + + +def validate_csrf(data, secret_key=None, time_limit=None, token_key=None): + + secret_key = _get_config( + secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, + message='A secret key is required to use CSRF.' + ) + field_name = _get_config( + token_key, 'WTF_CSRF_FIELD_NAME', 'csrf_token', + message='A field name is required to use CSRF.' + ) + time_limit = _get_config( + time_limit, 'WTF_CSRF_TIME_LIMIT', 3600, required=False + ) + + if not data: + raise ValidationError('The CSRF token is missing.') + + if field_name not in session: + raise ValidationError('The CSRF session token is missing.') + + s = URLSafeTimedSerializer(secret_key, salt='wtf-csrf-token') + + + +## ... source file abbreviated to get to g examples ... + + + value, config_name, default=None, + required=True, message='CSRF is not configured.' +): + + if value is None: + value = current_app.config.get(config_name, default) + + if required and value is None: + raise RuntimeError(message) + + return value + + +class _FlaskFormCSRF(CSRF): + def setup_form(self, form): + self.meta = form.meta + return super(_FlaskFormCSRF, self).setup_form(form) + + def generate_csrf_token(self, csrf_token_field): + return generate_csrf( + secret_key=self.meta.csrf_secret, + token_key=self.meta.csrf_field_name + ) + + def validate_csrf_token(self, form, field): +~~ if g.get('csrf_valid', False): + return + + try: + validate_csrf( + field.data, + self.meta.csrf_secret, + self.meta.csrf_time_limit, + self.meta.csrf_field_name + ) + except ValidationError as e: + logger.info(e.args[0]) + raise + + +class CSRFProtect(object): + + def __init__(self, app=None): + self._exempt_views = set() + self._exempt_blueprints = set() + + if app: + self.init_app(app) + + def init_app(self, app): + + +## ... source file abbreviated to get to g examples ... + + + + if csrf_token: + return csrf_token + + return None + + def protect(self): + if request.method not in current_app.config['WTF_CSRF_METHODS']: + return + + try: + validate_csrf(self._get_csrf_token()) + except ValidationError as e: + logger.info(e.args[0]) + self._error_response(e.args[0]) + + if request.is_secure and current_app.config['WTF_CSRF_SSL_STRICT']: + if not request.referrer: + self._error_response('The referrer header is missing.') + + good_referrer = 'https://{0}/'.format(request.host) + + if not same_origin(request.referrer, good_referrer): + self._error_response('The referrer does not match the host.') + +~~ g.csrf_valid = True # mark this request as CSRF valid + + def exempt(self, view): + + if isinstance(view, Blueprint): + self._exempt_blueprints.add(view.name) + return view + + if isinstance(view, string_types): + view_location = view + else: + view_location = '.'.join((view.__module__, view.__name__)) + + self._exempt_views.add(view_location) + return view + + def _error_response(self, reason): + raise CSRFError(reason) + + def error_handler(self, view): + + warnings.warn(FlaskWTFDeprecationWarning( + '"@csrf.error_handler" is deprecated. Use the standard Flask ' + 'error system with "@app.errorhandler(CSRFError)" instead. This ' + 'will be removed in 1.0.' + + +## ... source file continues with no further g examples... + +``` + + +## Example 5 from tedivms-flask +[tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a +base of [Flask](/flask.html) code and related projects such as +[Celery](/celery.html) which provides a template to start your own +Flask web app. The project comes baked with an admin panel, +[API authentication and authorization](/application-programming-interfaces.html), +[SQLAlchemy](/sqlalchemy.html) and many other common libraries that are +often used with Flask. + +The project's code is provided as open source under the +[BSD 2-Clause "Simplified" license](https://github.com/tedivm/tedivms-flask/blob/master/LICENSE.txt). + +[**tedivms-flask / app / extensions / ldap.py**](https://github.com/tedivm/tedivms-flask/blob/master/app/extensions/ldap.py) + +```python +# ldap.py + +~~from flask import current_app, g +from flask_login import current_user +from flask_user import UserManager +from flask_user.forms import LoginForm +from flask_user.translation_utils import lazy_gettext as _ # map _() to lazy_gettext() + +import datetime +from ldap3 import Server, Connection, ALL +from app import db +from app.models import user_models + + +def authenticate(user, password): + s = Server(current_app.config['LDAP_HOST'], get_info=ALL) # define an unsecure LDAP server, requesting info on DSE and schema + + user_dn = get_dn_from_user(user) + c = Connection(current_app.config['LDAP_HOST'], user=user_dn, password=password) + + if not c.bind(): + print('Unable to bind user %s' % (user_dn)) + return False + + return True + + + + +## ... source file abbreviated to get to g examples ... + + + email_attribute = current_app.config.get('LDAP_EMAIL_ATTRIBUTE', False) + if not email_attribute: + return False + conn = get_bound_connection() + user_search = get_dn_from_user(user) + user_object = '(objectclass=%s)' % (current_app.config['LDAP_USER_OBJECT_CLASS'],) + conn.search(user_search, user_object, attributes=[email_attribute]) + if len(conn.entries) < 1: + return False + return getattr(conn.entries[0], email_attribute, False)[0] + + +def user_in_group(user, group): + conn = get_bound_connection() + group_search = get_dn_from_group(group) + group_object = '(objectclass=%s)' % (current_app.config['LDAP_GROUP_OBJECT_CLASS'],) + conn.search(group_search, group_object, attributes=['memberUid']) + if len(conn.entries) < 1: + return False + members = conn.entries[0].memberUid + return user in members + + +def get_bound_connection(): +~~ if 'ldap_connection' in g: +~~ return g.ldap_connection + server = Server(current_app.config['LDAP_HOST'], get_info=ALL) # define an unsecure LDAP server, requesting info on DSE and schema +~~ g.ldap_connection = Connection(server, current_app.config['LDAP_BIND_DN'], current_app.config['LDAP_BIND_PASSWORD'], auto_bind=True) +~~ return g.ldap_connection + + +def get_dn_from_user(user): + return "%s=%s,%s" % (current_app.config['LDAP_USERNAME_ATTRIBUTE'], user, current_app.config['LDAP_USER_BASE'] ) + + +def get_dn_from_group(group): + return '%s=%s,%s' % (current_app.config['LDAP_GROUP_ATTRIBUTE'], group, current_app.config['LDAP_GROUP_BASE']) + + +class TedivmLoginForm(LoginForm): + + def validate_user(self): + user_manager = current_app.user_manager + if current_app.config.get('USER_LDAP', False): + if not authenticate(self.username.data, self.password.data): + return False + user = user_manager.db_manager.find_user_by_username(self.username.data) + if not user: + email = get_user_email(self.username.data) + if not email: + email = None + + user = user_models.User(username=self.username.data, +def get_user_email(user): + + +## ... source file continues with no further g examples... + +``` + diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 9a11eb58b..b3fcc03b7 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -1,7 +1,7 @@ title: flask.globals request code examples category: page slug: flask-globals-request-examples -sortorder: 500021007 +sortorder: 500021010 toc: False sidebartitle: flask.globals request meta: Python example code for the request function from the flask.globals module of the Flask project. diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 23f1a5278..cd0bacce9 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -1,7 +1,7 @@ title: flask.globals session code examples category: page slug: flask-globals-session-examples -sortorder: 500021008 +sortorder: 500021011 toc: False sidebartitle: flask.globals session meta: Python example code for the session function from the flask.globals module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 7f0bb3a9d..8ed328ea1 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -1,7 +1,7 @@ title: flask.helpers flash code examples category: page slug: flask-helpers-flash-examples -sortorder: 500021009 +sortorder: 500021012 toc: False sidebartitle: flask.helpers flash meta: Python example code for the flash function from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index a4142e466..70fdd1661 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -1,7 +1,7 @@ title: flask.helpers make_response code examples category: page slug: flask-helpers-make-response-examples -sortorder: 500021010 +sortorder: 500021013 toc: False sidebartitle: flask.helpers make_response meta: Python example code for the make_response function from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index abd2ed776..3523e5a99 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -1,7 +1,7 @@ title: flask.helpers url_for code examples category: page slug: flask-helpers-url-for-examples -sortorder: 500021011 +sortorder: 500021014 toc: False sidebartitle: flask.helpers url_for meta: Python example code for the url_for function from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index d7e15a919..c809be34d 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -1,7 +1,7 @@ title: flask.json jsonify code examples category: page slug: flask-json-jsonify-examples -sortorder: 500021012 +sortorder: 500021015 toc: False sidebartitle: flask.json jsonify meta: Python example code for the jsonify function from the flask.json module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index de44540e7..29e57226b 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -1,7 +1,7 @@ title: flask.sessions BadSignature code examples category: page slug: flask-sessions-badsignature-examples -sortorder: 500021013 +sortorder: 500021016 toc: False sidebartitle: flask.sessions BadSignature meta: Python example code for the BadSignature class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index c2535df30..5202aee23 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionInterface code examples category: page slug: flask-sessions-sessioninterface-examples -sortorder: 500021014 +sortorder: 500021017 toc: False sidebartitle: flask.sessions SessionInterface meta: Python example code for the SessionInterface class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index 10656212e..57ec055c3 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -1,7 +1,7 @@ title: flask.signals got_request_exception code examples category: page slug: flask-signals-got-request-exception-examples -sortorder: 500021016 +sortorder: 500021019 toc: False sidebartitle: flask.signals got_request_exception meta: Python example code for the got_request_exception function from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index 3abceb212..a8789833e 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -1,7 +1,7 @@ title: flask.signals Namespace code examples category: page slug: flask-signals-namespace-examples -sortorder: 500021015 +sortorder: 500021018 toc: False sidebartitle: flask.signals Namespace meta: Python example code for the Namespace class from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 46eb898c7..be4ce784e 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template code examples category: page slug: flask-templating-render-template-examples -sortorder: 500021017 +sortorder: 500021020 toc: False sidebartitle: flask.templating render_template meta: Python example code for the render_template function from the flask.templating module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 9f857c663..fb1e3a230 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -1,7 +1,7 @@ title: flask.views http_method_funcs code examples category: page slug: flask-views-http-method-funcs-examples -sortorder: 500021020 +sortorder: 500021023 toc: False sidebartitle: flask.views http_method_funcs meta: Python example code for the http_method_funcs function from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 431084a53..ce91d3a5d 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -1,7 +1,7 @@ title: flask.views MethodView code examples category: page slug: flask-views-methodview-examples -sortorder: 500021018 +sortorder: 500021021 toc: False sidebartitle: flask.views MethodView meta: Python example code for the MethodView class from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 6860f32a2..789e25816 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -1,7 +1,7 @@ title: flask.views View code examples category: page slug: flask-views-view-examples -sortorder: 500021019 +sortorder: 500021022 toc: False sidebartitle: flask.views View meta: Python example code for the View class from the flask.views module of the Flask project. diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html index 267b49183..2545e031d 100644 --- a/theme/templates/code-examples/flask.html +++ b/theme/templates/code-examples/flask.html @@ -4,6 +4,10 @@

Flask: Extensions,Plug-ins and Related Libraries & Example Projects and Code

+

flask.app + Flask, + Headers +

flask.blueprints Blueprint

@@ -18,6 +22,7 @@

flask.ctx

flask.globals current_app, + g, request, session

From d6b0fb1df1086de069011d8758b7f41b93ca5619 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 26 Jun 2020 18:02:34 -0400 Subject: [PATCH 136/302] adding flask badrequest examples --- .../flask/flask-app-badrequest.markdown | 177 ++++++++++++++++++ .../examples/flask/flask-app-flask.markdown | 79 +++----- .../examples/flask/flask-app-headers.markdown | 2 +- .../flask/flask-blueprints-blueprint.markdown | 2 +- .../flask/flask-cli-flaskgroup.markdown | 2 +- .../flask/flask-cli-scriptinfo.markdown | 2 +- .../flask/flask-cli-with-appcontext.markdown | 2 +- .../flask/flask-ctx-has-app-context.markdown | 2 +- .../flask-ctx-has-request-context.markdown | 2 +- .../flask/flask-globals-current-app.markdown | 2 +- .../examples/flask/flask-globals-g.markdown | 2 +- .../flask/flask-globals-request.markdown | 2 +- .../flask/flask-globals-session.markdown | 2 +- .../flask/flask-helpers-flash.markdown | 2 +- .../flask-helpers-make-response.markdown | 2 +- .../flask/flask-helpers-url-for.markdown | 2 +- .../flask/flask-json-jsonify.markdown | 2 +- .../flask-sessions-badsignature.markdown | 2 +- .../flask-sessions-sessioninterface.markdown | 2 +- ...ask-signals-got-request-exception.markdown | 2 +- .../flask/flask-signals-namespace.markdown | 2 +- .../flask-templating-render-template.markdown | 2 +- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 2 +- .../examples/flask/flask-views-view.markdown | 2 +- theme/templates/code-examples/flask.html | 1 + 26 files changed, 222 insertions(+), 81 deletions(-) create mode 100644 content/pages/examples/flask/flask-app-badrequest.markdown diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown new file mode 100644 index 000000000..6ba3c819b --- /dev/null +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -0,0 +1,177 @@ +title: flask.app BadRequest code examples +category: page +slug: flask-app-badrequest-examples +sortorder: 500021000 +toc: False +sidebartitle: flask.app BadRequest +meta: Python example code for the BadRequest class from the flask.app module of the Flask project. + + +BadRequest is a class within the flask.app module of the Flask project. + + +## Example 1 from Flask AppBuilder +[Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) +([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) +and +[example apps](https://github.com/dpgaspar/Flask-AppBuilder/tree/master/examples)) +is a web application generator that uses Flask to automatically create +the code for database-driven applications based on parameters set +by the user. The generated applications include default security settings, +forms, and internationalization support. + +Flask App Builder is provided under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/LICENSE). + +[**Flask AppBuilder / flask_appbuilder / api / __init__.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/api/__init__.py) + +```python +# __init__.py +import functools +import json +import logging +import re +import traceback +from typing import Dict, Optional +import urllib.parse + +from apispec import APISpec, yaml_utils +from apispec.exceptions import DuplicateComponentNameError +from flask import Blueprint, current_app, jsonify, make_response, request, Response +from flask_babel import lazy_gettext as _ +import jsonschema +from marshmallow import ValidationError +from marshmallow_sqlalchemy.fields import Related, RelatedList +import prison +from sqlalchemy.exc import IntegrityError +~~from werkzeug.exceptions import BadRequest +import yaml + +from .convert import Model2SchemaConverter +from .schemas import get_info_schema, get_item_schema, get_list_schema +from .._compat import as_unicode +from ..const import ( + API_ADD_COLUMNS_RES_KEY, + API_ADD_COLUMNS_RIS_KEY, + API_ADD_TITLE_RES_KEY, + API_ADD_TITLE_RIS_KEY, + API_DESCRIPTION_COLUMNS_RES_KEY, + API_DESCRIPTION_COLUMNS_RIS_KEY, + API_EDIT_COLUMNS_RES_KEY, + API_EDIT_COLUMNS_RIS_KEY, + API_EDIT_TITLE_RES_KEY, + API_EDIT_TITLE_RIS_KEY, + API_FILTERS_RES_KEY, + API_FILTERS_RIS_KEY, + API_LABEL_COLUMNS_RES_KEY, + API_LABEL_COLUMNS_RIS_KEY, + API_LIST_COLUMNS_RES_KEY, + API_LIST_COLUMNS_RIS_KEY, + API_LIST_TITLE_RES_KEY, + API_LIST_TITLE_RIS_KEY, + + +## ... source file continues with no further BadRequest examples... + +``` + + +## Example 2 from Flask-WTF +[Flask-WTF](https://github.com/lepture/flask-wtf) +([project documentation](https://flask-wtf.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/Flask-WTF/)) +provides a bridge between [Flask](/flask.html) and the the +[WTForms](https://wtforms.readthedocs.io/en/2.3.x/) form-handling library. +It makes it easier to use WTForms by reducing boilerplate code and +shorter examples for common form operations as well as common security +practices such as [CSRF](/cross-site-request-forgery-csrf.html). + +[**Flask-WTF / flask_wtf / csrf.py**](https://github.com/lepture/flask-wtf/blob/master/flask_wtf/./csrf.py) + +```python +# csrf.py +import hashlib +import logging +import os +import warnings +from functools import wraps + +from flask import Blueprint, current_app, g, request, session +from itsdangerous import BadData, SignatureExpired, URLSafeTimedSerializer +~~from werkzeug.exceptions import BadRequest +from werkzeug.security import safe_str_cmp +from wtforms import ValidationError +from wtforms.csrf.core import CSRF + +from ._compat import FlaskWTFDeprecationWarning, string_types, urlparse + +__all__ = ('generate_csrf', 'validate_csrf', 'CSRFProtect') +logger = logging.getLogger(__name__) + + +def generate_csrf(secret_key=None, token_key=None): + + secret_key = _get_config( + secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, + message='A secret key is required to use CSRF.' + ) + field_name = _get_config( + token_key, 'WTF_CSRF_FIELD_NAME', 'csrf_token', + message='A field name is required to use CSRF.' + ) + + if field_name not in g: + s = URLSafeTimedSerializer(secret_key, salt='wtf-csrf-token') + + + +## ... source file abbreviated to get to BadRequest examples ... + + + warnings.warn(FlaskWTFDeprecationWarning( + '"@csrf.error_handler" is deprecated. Use the standard Flask ' + 'error system with "@app.errorhandler(CSRFError)" instead. This ' + 'will be removed in 1.0.' + ), stacklevel=2) + + @wraps(view) + def handler(reason): + response = current_app.make_response(view(reason)) + raise CSRFError(response=response) + + self._error_response = handler + return view + + +class CsrfProtect(CSRFProtect): + + def __init__(self, app=None): + warnings.warn(FlaskWTFDeprecationWarning( + '"flask_wtf.CsrfProtect" has been renamed to "CSRFProtect" ' + 'and will be removed in 1.0.' + ), stacklevel=2) + super(CsrfProtect, self).__init__(app=app) + + +~~class CSRFError(BadRequest): + + description = 'CSRF validation failed.' + + +def same_origin(current_uri, compare_uri): + current = urlparse(current_uri) + compare = urlparse(compare_uri) + + return ( + current.scheme == compare.scheme + and current.hostname == compare.hostname + and current.port == compare.port + ) + + + +## ... source file continues with no further BadRequest examples... + +``` + diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 083192a16..22ee0405e 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -1,7 +1,7 @@ title: flask.app Flask code examples category: page slug: flask-app-flask-examples -sortorder: 500021000 +sortorder: 500021001 toc: False sidebartitle: flask.app Flask meta: Python example code for the Flask class from the flask.app module of the Flask project. @@ -23,18 +23,15 @@ forms, and internationalization support. Flask App Builder is provided under the [BSD 3-Clause "New" or "Revised" license](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/LICENSE). -[**Flask AppBuilder / flask_appbuilder / tests / _test_ldapsearch.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/tests/_test_ldapsearch.py) +[**Flask AppBuilder / flask_appbuilder / tests / _test_oauth_registration_role.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/tests/_test_oauth_registration_role.py) ```python -# _test_ldapsearch.py +# _test_oauth_registration_role.py import logging import unittest ~~from flask import Flask from flask_appbuilder import AppBuilder, SQLA -import jinja2 -import ldap -from mockldap import MockLdap logging.basicConfig(format="%(asctime)s:%(levelname)s:%(name)s:%(message)s") @@ -42,67 +39,33 @@ logging.getLogger().setLevel(logging.DEBUG) log = logging.getLogger(__name__) -class LDAPSearchTestCase(unittest.TestCase): - - top = ("o=test", {"o": ["test"]}) - example = ("ou=example,o=test", {"ou": ["example"]}) - manager = ( - "cn=manager,ou=example,o=test", - {"cn": ["manager"], "userPassword": ["ldaptest"]}, - ) - alice = ( - "cn=alice,ou=example,o=test", - { - "cn": ["alice"], - "memberOf": ["cn=group,ou=groups,o=test"], - "userPassword": ["alicepw"], - }, - ) - group = ( - "cn=group,ou=groups,o=test", - {"cn": ["group"], "member": ["cn=alice,ou=example,o=test"]}, - ) - - directory = dict([top, example, group, manager, alice]) - - @classmethod - def setUpClass(cls): - cls.mockldap = MockLdap(cls.directory) - - @classmethod - def tearDownClass(cls): - del cls.mockldap - +class OAuthRegistrationRoleTestCase(unittest.TestCase): def setUp(self): - - self.mockldap.start() - self.ldapobj = self.mockldap["ldap://localhost/"] - ~~ self.app = Flask(__name__) - self.app.jinja_env.undefined = jinja2.StrictUndefined - self.db = SQLA(self.app) - self.app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False - self.app.config["AUTH_LDAP_UID_FIELD"] = "cn" - self.app.config["AUTH_LDAP_ALLOW_SELF_SIGNED"] = False - self.app.config["AUTH_LDAP_USE_TLS"] = False - self.app.config["AUTH_LDAP_SERVER"] = "ldap://localhost/" - self.app.config["AUTH_LDAP_SEARCH"] = "ou=example,o=test" - self.app.config["AUTH_LDAP_APPEND_DOMAIN"] = False - self.app.config["AUTH_LDAP_FIRSTNAME_FIELD"] = None - self.app.config["AUTH_LDAP_LASTNAME_FIELD"] = None - self.app.config["AUTH_LDAP_EMAIL_FIELD"] = None + self.db = SQLA(self.app) def tearDown(self): - self.mockldap.stop() - del self.ldapobj - log.debug("TEAR DOWN") - self.appbuilder = None self.app = None self.db = None - def test_ldapsearch(self): + def test_self_registration_not_enabled(self): + self.app.config["AUTH_USER_REGISTRATION"] = False + self.appbuilder = AppBuilder(self.app, self.db.session) + + result = self.appbuilder.sm.auth_user_oauth(userinfo={"username": "testuser"}) + + self.assertIsNone(result) + self.assertEqual(len(self.appbuilder.sm.get_all_users()), 0) + + def test_register_and_attach_static_role(self): + self.app.config["AUTH_USER_REGISTRATION"] = True + self.app.config["AUTH_USER_REGISTRATION_ROLE"] = "Public" + self.appbuilder = AppBuilder(self.app, self.db.session) + + user = self.appbuilder.sm.auth_user_oauth(userinfo={"username": "testuser"}) + ## ... source file continues with no further Flask examples... diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index 71209d085..5627cb4c8 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -1,7 +1,7 @@ title: flask.app Headers code examples category: page slug: flask-app-headers-examples -sortorder: 500021001 +sortorder: 500021002 toc: False sidebartitle: flask.app Headers meta: Python example code for the Headers class from the flask.app module of the Flask project. diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 4e111ee5b..7cc70e1b5 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -1,7 +1,7 @@ title: flask.blueprints Blueprint code examples category: page slug: flask-blueprints-blueprint-examples -sortorder: 500021002 +sortorder: 500021003 toc: False sidebartitle: flask.blueprints Blueprint meta: Python example code for the Blueprint class from the flask.blueprints module of the Flask project. diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 7ac0b6adb..500108616 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -1,7 +1,7 @@ title: flask.cli FlaskGroup code examples category: page slug: flask-cli-flaskgroup-examples -sortorder: 500021003 +sortorder: 500021004 toc: False sidebartitle: flask.cli FlaskGroup meta: Python example code for the FlaskGroup class from the flask.cli module of the Flask project. diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index 9e0138c16..5ccacdfdc 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -1,7 +1,7 @@ title: flask.cli ScriptInfo code examples category: page slug: flask-cli-scriptinfo-examples -sortorder: 500021004 +sortorder: 500021005 toc: False sidebartitle: flask.cli ScriptInfo meta: Python example code for the ScriptInfo class from the flask.cli module of the Flask project. diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index d80fdd38e..5bc95f594 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -1,7 +1,7 @@ title: flask.cli with_appcontext code examples category: page slug: flask-cli-with-appcontext-examples -sortorder: 500021005 +sortorder: 500021006 toc: False sidebartitle: flask.cli with_appcontext meta: Python example code for the with_appcontext function from the flask.cli module of the Flask project. diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index c8c65831c..588b02488 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -1,7 +1,7 @@ title: flask.ctx has_app_context code examples category: page slug: flask-ctx-has-app-context-examples -sortorder: 500021006 +sortorder: 500021007 toc: False sidebartitle: flask.ctx has_app_context meta: Python example code for the has_app_context function from the flask.ctx module of the Flask project. diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index 9308d4883..692c9c433 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -1,7 +1,7 @@ title: flask.ctx has_request_context code examples category: page slug: flask-ctx-has-request-context-examples -sortorder: 500021007 +sortorder: 500021008 toc: False sidebartitle: flask.ctx has_request_context meta: Python example code for the has_request_context function from the flask.ctx module of the Flask project. diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index fa63924b1..863df30d6 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -1,7 +1,7 @@ title: flask.globals current_app code examples category: page slug: flask-globals-current-app-examples -sortorder: 500021008 +sortorder: 500021009 toc: False sidebartitle: flask.globals current_app meta: Python example code for the current_app function from the flask.globals module of the Flask project. diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index d8cb2b218..f1d5bf40b 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -1,7 +1,7 @@ title: flask.globals g code examples category: page slug: flask-globals-g-examples -sortorder: 500021009 +sortorder: 500021010 toc: False sidebartitle: flask.globals g meta: Python example code for the g function from the flask.globals module of the Flask project. diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index b3fcc03b7..d82e58bc6 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -1,7 +1,7 @@ title: flask.globals request code examples category: page slug: flask-globals-request-examples -sortorder: 500021010 +sortorder: 500021011 toc: False sidebartitle: flask.globals request meta: Python example code for the request function from the flask.globals module of the Flask project. diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index cd0bacce9..b066c6381 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -1,7 +1,7 @@ title: flask.globals session code examples category: page slug: flask-globals-session-examples -sortorder: 500021011 +sortorder: 500021012 toc: False sidebartitle: flask.globals session meta: Python example code for the session function from the flask.globals module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 8ed328ea1..f70cddc19 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -1,7 +1,7 @@ title: flask.helpers flash code examples category: page slug: flask-helpers-flash-examples -sortorder: 500021012 +sortorder: 500021013 toc: False sidebartitle: flask.helpers flash meta: Python example code for the flash function from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 70fdd1661..778110a7c 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -1,7 +1,7 @@ title: flask.helpers make_response code examples category: page slug: flask-helpers-make-response-examples -sortorder: 500021013 +sortorder: 500021014 toc: False sidebartitle: flask.helpers make_response meta: Python example code for the make_response function from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 3523e5a99..e16c5b336 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -1,7 +1,7 @@ title: flask.helpers url_for code examples category: page slug: flask-helpers-url-for-examples -sortorder: 500021014 +sortorder: 500021015 toc: False sidebartitle: flask.helpers url_for meta: Python example code for the url_for function from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index c809be34d..d1773f5a8 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -1,7 +1,7 @@ title: flask.json jsonify code examples category: page slug: flask-json-jsonify-examples -sortorder: 500021015 +sortorder: 500021016 toc: False sidebartitle: flask.json jsonify meta: Python example code for the jsonify function from the flask.json module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 29e57226b..f91b4062b 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -1,7 +1,7 @@ title: flask.sessions BadSignature code examples category: page slug: flask-sessions-badsignature-examples -sortorder: 500021016 +sortorder: 500021017 toc: False sidebartitle: flask.sessions BadSignature meta: Python example code for the BadSignature class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 5202aee23..67c22a4ae 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionInterface code examples category: page slug: flask-sessions-sessioninterface-examples -sortorder: 500021017 +sortorder: 500021018 toc: False sidebartitle: flask.sessions SessionInterface meta: Python example code for the SessionInterface class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index 57ec055c3..b4f1c7245 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -1,7 +1,7 @@ title: flask.signals got_request_exception code examples category: page slug: flask-signals-got-request-exception-examples -sortorder: 500021019 +sortorder: 500021020 toc: False sidebartitle: flask.signals got_request_exception meta: Python example code for the got_request_exception function from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index a8789833e..51693ea5a 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -1,7 +1,7 @@ title: flask.signals Namespace code examples category: page slug: flask-signals-namespace-examples -sortorder: 500021018 +sortorder: 500021019 toc: False sidebartitle: flask.signals Namespace meta: Python example code for the Namespace class from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index be4ce784e..063f8ba54 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template code examples category: page slug: flask-templating-render-template-examples -sortorder: 500021020 +sortorder: 500021021 toc: False sidebartitle: flask.templating render_template meta: Python example code for the render_template function from the flask.templating module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index fb1e3a230..5cc3b7ba2 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -1,7 +1,7 @@ title: flask.views http_method_funcs code examples category: page slug: flask-views-http-method-funcs-examples -sortorder: 500021023 +sortorder: 500021024 toc: False sidebartitle: flask.views http_method_funcs meta: Python example code for the http_method_funcs function from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index ce91d3a5d..fa3eb409d 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -1,7 +1,7 @@ title: flask.views MethodView code examples category: page slug: flask-views-methodview-examples -sortorder: 500021021 +sortorder: 500021022 toc: False sidebartitle: flask.views MethodView meta: Python example code for the MethodView class from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 789e25816..3002e534b 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -1,7 +1,7 @@ title: flask.views View code examples category: page slug: flask-views-view-examples -sortorder: 500021022 +sortorder: 500021023 toc: False sidebartitle: flask.views View meta: Python example code for the View class from the flask.views module of the Flask project. diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html index 2545e031d..51a4c4975 100644 --- a/theme/templates/code-examples/flask.html +++ b/theme/templates/code-examples/flask.html @@ -5,6 +5,7 @@

Flask: Example Projects and Code

flask.app + BadRequest, Flask, Headers

From 532662ce82781a86600d6c3ad4f9664e6a63cde1 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 26 Jun 2020 20:39:28 -0400 Subject: [PATCH 137/302] add render template string flask example --- .../examples/flask/flask-app-flask.markdown | 65 +++++- .../flask/flask-blueprints-blueprint.markdown | 49 ++++- .../flask-example-projects-code.markdown | 6 + .../flask/flask-helpers-url-for.markdown | 199 ++++++++++++++++++ .../flask/flask-json-jsonify.markdown | 106 +++++++++- ...templating-render-template-string.markdown | 96 +++++++++ .../flask-templating-render-template.markdown | 106 +++++++++- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 2 +- .../examples/flask/flask-views-view.markdown | 89 +++++++- theme/templates/code-examples/flask.html | 3 +- 11 files changed, 712 insertions(+), 11 deletions(-) create mode 100644 content/pages/examples/flask/flask-templating-render-template-string.markdown diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 22ee0405e..d2f6ab7c2 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -521,7 +521,68 @@ def create_app(config_name): ``` -## Example 9 from sandman2 +## Example 9 from Datadog Flask Example App +The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) +contains many examples of the [Flask](/flask.html) core functions +available to a developer using the [web framework](/web-frameworks.html). + +[**Datadog Flask Example App / python/flask/app / app.py**](https://github.com/DataDog/trace-examples/blob/master/python/flask/app/./app.py) + +```python +# app.py +from ddtrace import patch_all; patch_all(flask=True, requests=True) # noqa + +from ddtrace import tracer + +~~from flask import Flask, Response +from flask import after_this_request +from flask import abort, jsonify, render_template, url_for +from flask.views import View +from werkzeug.routing import Rule + +from flask_caching import Cache +from flask_cors import CORS + +import requests + +from .blueprint import bp +from .exceptions import AppException +from .limiter import limiter +from .signals import connect_signals + +~~app = Flask(__name__) + +app.register_blueprint(bp) + +connect_signals(app) + +CORS(app) +Cache(app, config=dict(CACHE_TYPE='simple')) +limiter.init_app(app) + + +@app.context_processor +def inject_url_map(): + return dict(url_map=app.url_map) + + +@app.before_first_request +def before_first_request(): + print('Hook: before_first_request') + + +@app.before_request +def before_request(): + print('Hook: before_request') + + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 10 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -602,7 +663,7 @@ def get_app( ``` -## Example 10 from tedivms-flask +## Example 11 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 7cc70e1b5..1c1f44d29 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -549,7 +549,54 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 8 from tedivms-flask +## Example 8 from Datadog Flask Example App +The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) +contains many examples of the [Flask](/flask.html) core functions +available to a developer using the [web framework](/web-frameworks.html). + +[**Datadog Flask Example App / python/flask/app / blueprint.py**](https://github.com/DataDog/trace-examples/blob/master/python/flask/app/./blueprint.py) + +```python +# blueprint.py +from ddtrace import Pin +~~from flask import abort, Blueprint, render_template_string + +from .limiter import limiter + + +~~bp = Blueprint('bp', __name__, url_prefix='/bp/') + +Pin.override(bp, service='flask-bp', app='flask', app_type='web') + + +@bp.before_request +def bp_before_request(): + print('Hook: bp_before_request') + + +@bp.before_app_request +def bp_before_app_request(): + print('Hook: bp_before_app_request') + + +@bp.before_app_first_request +def bp_before_app_first_request(): + print('Hook: bp_before_app_first_request') + + +@bp.after_request +def bp_after_request(response): + print('Hook: bp_after_request') + return response + + + +## ... source file continues with no further Blueprint examples... + +``` + + +## Example 9 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index 411fdaa24..26c43b5ab 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -13,6 +13,12 @@ in various ways. The code within the projects can show you how to build your own applications. +### Datadog Flask example +The [Datadog Flask app](https://github.com/DataDog/trace-examples/tree/master/python/flask) +contains many examples of the [Flask](/flask.html) core functions +available to a developer using the [web framework](/web-frameworks.html). + + ### FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index e16c5b336..443c595c2 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -783,6 +783,205 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body) +## ... source file continues with no further url_for examples... + +``` + + +## Example 9 from Datadog Flask Example App +The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) +contains many examples of the [Flask](/flask.html) core functions +available to a developer using the [web framework](/web-frameworks.html). + +[**Datadog Flask Example App / python/flask/app / app.py**](https://github.com/DataDog/trace-examples/blob/master/python/flask/app/./app.py) + +```python +# app.py +from ddtrace import patch_all; patch_all(flask=True, requests=True) # noqa + +from ddtrace import tracer + +from flask import Flask, Response +from flask import after_this_request +~~from flask import abort, jsonify, render_template, url_for +from flask.views import View +from werkzeug.routing import Rule + +from flask_caching import Cache +from flask_cors import CORS + +import requests + +from .blueprint import bp +from .exceptions import AppException +from .limiter import limiter +from .signals import connect_signals + +app = Flask(__name__) + +app.register_blueprint(bp) + +connect_signals(app) + +CORS(app) +Cache(app, config=dict(CACHE_TYPE='simple')) +limiter.init_app(app) + + + + +## ... source file abbreviated to get to url_for examples ... + + +@app.after_request +def after_request(response): + print('Hook: after_request') + return response + + +@app.teardown_request +def teardown_request(response): + print('Hook: teardown_request') + return response + + +@app.teardown_appcontext +def teardown_appcontext(appcontext): + print('Hook: teardown_appcontext') + + +@app.route('/') +@limiter.limit('10 per second') +def index(): + routes = [ + dict( + rule='GET /', + description=['Endpoint for this page, which uses render_template().'], + links=[ +~~ dict(label='GET /', url=url_for('index')), + ], + ), + dict( + rule='GET /joke', + description=[ + 'Endpoint which uses requests to fetch a joke from icanhazdadjoke.com.', + 'This endpoint also registers a flask.after_this_request hook.' + ], + links=[ +~~ dict(label='GET /joke', url=url_for('joke')), + ], + ), + dict( + rule='GET /json', + description=[ + 'Endpoint which uses jsonify to return a JSON object to the user.', + ], + links=[ +~~ dict(label='GET /json', url=url_for('json')), + ], + ), + dict( + rule='GET /custom-endpoint/', + description=[ + ('Endpoint which was registered manually using @app.endpoint() ' + 'and app.add_url_rule()'), + 'This endpoint also has a /custom-endpoint/ url configured with a default ', + ('We have also attached a @tracer.wrap() to the endpoint and added a ' + 'with tracer.trace(): to the body of the view as well.'), + ], + links=[ +~~ dict(label='GET /custom-endpoint', url=url_for('custom-endpoint')), +~~ dict(label='GET /custom-endpoint/hello', url=url_for('custom-endpoint', msg='hello')), + ], + ), + dict( + rule='GET /custom-error', + description=[ + 'Endpoint which raises a customer user-defined Exception (non HTTPException)', + ], + links=[ +~~ dict(label='GET /custom-error', url=url_for('custom_error')), + ], + ), + dict( + rule='GET /stream', + description=[ + 'Endpoint which uses a generator to stream the response back to the user.', + ], + links=[ +~~ dict(label='GET /stream', url=url_for('stream')), + ], + ), + dict( + rule='GET /abort/', + description=[ + 'Endpoint which calls abort(code) for us', + ], + links=[ +~~ dict(label='GET /abort/{}'.format(code), url=url_for('abort_endpoint', code=code)) + for code in [400, 401, 403, 404, 500] + ], + ), + dict( + rule='GET /hello/', + description=[ + 'Endpoint which was generated from a flask.views.View', + ], + links=[ +~~ dict(label='GET /hello/Flask', url=url_for('myview', name='Flask')), + ], + ), + dict( + rule='GET /bp/', + description=[ + 'Blueprint endpoint that uses render_template_string()', + ], + links=[ +~~ dict(label='GET /bp/', url=url_for('bp.index')), + ], + ), + dict( + rule='GET /bp/unknown', + description=[ + 'Blueprint endpoint that calls abort(404)', + ], + links=[ +~~ dict(label='GET /bp/unkown', url=url_for('bp.unknown')), + ], + ), + dict( + rule='GET /static/test.txt', + description=[ + 'Endpoint to fetch a simple .txt static file.', + ], + links=[ +~~ dict(label='GET /static/test.txt', url=url_for('static', filename='test.txt')), + ], + ), + ] + return render_template('index.jinja2', routes=routes) + + +@app.route('/joke') +def joke(): + res = requests.get('https://icanhazdadjoke.com/', headers=dict(Accept='text/plain')) + res.raise_for_status() + + @after_this_request + def after_joke(response): + print('Hook: after_this_request') + return response + + return res.content + + +@app.route('/json') +def json(): + return jsonify(hello='world') + + + + ## ... source file continues with no further url_for examples... ``` diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index d1773f5a8..476fd9766 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -581,7 +581,109 @@ def contact(): ``` -## Example 4 from sandman2 +## Example 4 from Datadog Flask Example App +The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) +contains many examples of the [Flask](/flask.html) core functions +available to a developer using the [web framework](/web-frameworks.html). + +[**Datadog Flask Example App / python/flask/app / app.py**](https://github.com/DataDog/trace-examples/blob/master/python/flask/app/./app.py) + +```python +# app.py +from ddtrace import patch_all; patch_all(flask=True, requests=True) # noqa + +from ddtrace import tracer + +from flask import Flask, Response +from flask import after_this_request +~~from flask import abort, jsonify, render_template, url_for +from flask.views import View +from werkzeug.routing import Rule + +from flask_caching import Cache +from flask_cors import CORS + +import requests + +from .blueprint import bp +from .exceptions import AppException +from .limiter import limiter +from .signals import connect_signals + +app = Flask(__name__) + +app.register_blueprint(bp) + +connect_signals(app) + +CORS(app) +Cache(app, config=dict(CACHE_TYPE='simple')) +limiter.init_app(app) + + + + +## ... source file abbreviated to get to jsonify examples ... + + + 'Endpoint to fetch a simple .txt static file.', + ], + links=[ + dict(label='GET /static/test.txt', url=url_for('static', filename='test.txt')), + ], + ), + ] + return render_template('index.jinja2', routes=routes) + + +@app.route('/joke') +def joke(): + res = requests.get('https://icanhazdadjoke.com/', headers=dict(Accept='text/plain')) + res.raise_for_status() + + @after_this_request + def after_joke(response): + print('Hook: after_this_request') + return response + + return res.content + + +@app.route('/json') +def json(): +~~ return jsonify(hello='world') + + +app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint', defaults=dict(msg='Hello'))) +app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) + +@app.endpoint('custom-endpoint') +@tracer.wrap('my-custom-endpoint') +def custom_endpoint(msg): + with tracer.trace('my-custom-endpoint.respond'): + return msg + + +@app.route('/custom-error') +def custom_error(): + raise AppException('custom app exception') + + +@app.route('/stream') +def stream(): + def generate(): + for i in range(100): + yield '{}\n'.format(i) + + return Response(generate(), mimetype='text/plain') + + +## ... source file continues with no further jsonify examples... + +``` + + +## Example 5 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -749,7 +851,7 @@ class Service(MethodView): ``` -## Example 5 from tedivms-flask +## Example 6 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown new file mode 100644 index 000000000..73e306609 --- /dev/null +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -0,0 +1,96 @@ +title: flask.templating render_template_string code examples +category: page +slug: flask-templating-render-template-string-examples +sortorder: 500021022 +toc: False +sidebartitle: flask.templating render_template_string +meta: Python example code for the render_template_string function from the flask.templating module of the Flask project. + + +render_template_string is a function within the flask.templating module of the Flask project. + + +## Example 1 from Datadog Flask Example App +The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) +contains many examples of the [Flask](/flask.html) core functions +available to a developer using the [web framework](/web-frameworks.html). + +[**Datadog Flask Example App / python/flask/app / blueprint.py**](https://github.com/DataDog/trace-examples/blob/master/python/flask/app/./blueprint.py) + +```python +# blueprint.py +from ddtrace import Pin +~~from flask import abort, Blueprint, render_template_string + +from .limiter import limiter + + +bp = Blueprint('bp', __name__, url_prefix='/bp/') + +Pin.override(bp, service='flask-bp', app='flask', app_type='web') + + +@bp.before_request +def bp_before_request(): + print('Hook: bp_before_request') + + +@bp.before_app_request +def bp_before_app_request(): + print('Hook: bp_before_app_request') + + +@bp.before_app_first_request +def bp_before_app_first_request(): + print('Hook: bp_before_app_first_request') + + + + +## ... source file abbreviated to get to render_template_string examples ... + + + print('Hook: bp_after_request') + return response + + +@bp.after_app_request +def bp_after_app_request(response): + print('Hook: bp_after_app_request') + return response + + +@bp.teardown_request +def bp_teardown_request(response): + print('Hook: bp_teardown_request') + return response + + +@bp.teardown_app_request +def bp_teardown_app_request(response): + print('Hook: bp_teardown_app_request') + return response + + +@bp.route('/') +@limiter.limit('10 per second') +def index(): +~~ return render_template_string('

Blueprint

') + + +@bp.route('/unknown') +@limiter.exempt +def unknown(): + abort(404) + + +@bp.errorhandler(404) +def bp_not_found(e): + return 'oh no....', 404 + + + +## ... source file continues with no further render_template_string examples... + +``` + diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 063f8ba54..5e657e288 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -834,7 +834,109 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 10 from newspie +## Example 10 from Datadog Flask Example App +The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) +contains many examples of the [Flask](/flask.html) core functions +available to a developer using the [web framework](/web-frameworks.html). + +[**Datadog Flask Example App / python/flask/app / app.py**](https://github.com/DataDog/trace-examples/blob/master/python/flask/app/./app.py) + +```python +# app.py +from ddtrace import patch_all; patch_all(flask=True, requests=True) # noqa + +from ddtrace import tracer + +from flask import Flask, Response +from flask import after_this_request +~~from flask import abort, jsonify, render_template, url_for +from flask.views import View +from werkzeug.routing import Rule + +from flask_caching import Cache +from flask_cors import CORS + +import requests + +from .blueprint import bp +from .exceptions import AppException +from .limiter import limiter +from .signals import connect_signals + +app = Flask(__name__) + +app.register_blueprint(bp) + +connect_signals(app) + +CORS(app) +Cache(app, config=dict(CACHE_TYPE='simple')) +limiter.init_app(app) + + + + +## ... source file abbreviated to get to render_template examples ... + + + 'Blueprint endpoint that uses render_template_string()', + ], + links=[ + dict(label='GET /bp/', url=url_for('bp.index')), + ], + ), + dict( + rule='GET /bp/unknown', + description=[ + 'Blueprint endpoint that calls abort(404)', + ], + links=[ + dict(label='GET /bp/unkown', url=url_for('bp.unknown')), + ], + ), + dict( + rule='GET /static/test.txt', + description=[ + 'Endpoint to fetch a simple .txt static file.', + ], + links=[ + dict(label='GET /static/test.txt', url=url_for('static', filename='test.txt')), + ], + ), + ] +~~ return render_template('index.jinja2', routes=routes) + + +@app.route('/joke') +def joke(): + res = requests.get('https://icanhazdadjoke.com/', headers=dict(Accept='text/plain')) + res.raise_for_status() + + @after_this_request + def after_joke(response): + print('Hook: after_this_request') + return response + + return res.content + + +@app.route('/json') +def json(): + return jsonify(hello='world') + + +app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint', defaults=dict(msg='Hello'))) +app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) + +@app.endpoint('custom-endpoint') + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 11 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -989,7 +1091,7 @@ if __name__ == '__main__': ``` -## Example 11 from tedivms-flask +## Example 12 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 5cc3b7ba2..05e841dd5 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -1,7 +1,7 @@ title: flask.views http_method_funcs code examples category: page slug: flask-views-http-method-funcs-examples -sortorder: 500021024 +sortorder: 500021025 toc: False sidebartitle: flask.views http_method_funcs meta: Python example code for the http_method_funcs function from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index fa3eb409d..44f6c0830 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -1,7 +1,7 @@ title: flask.views MethodView code examples category: page slug: flask-views-methodview-examples -sortorder: 500021022 +sortorder: 500021023 toc: False sidebartitle: flask.views MethodView meta: Python example code for the MethodView class from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 3002e534b..b7963d606 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -1,7 +1,7 @@ title: flask.views View code examples category: page slug: flask-views-view-examples -sortorder: 500021023 +sortorder: 500021024 toc: False sidebartitle: flask.views View meta: Python example code for the View class from the flask.views module of the Flask project. @@ -39,6 +39,93 @@ from flaskbb.utils.helpers import render_template +## ... source file continues with no further View examples... + +``` + + +## Example 2 from Datadog Flask Example App +The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) +contains many examples of the [Flask](/flask.html) core functions +available to a developer using the [web framework](/web-frameworks.html). + +[**Datadog Flask Example App / python/flask/app / app.py**](https://github.com/DataDog/trace-examples/blob/master/python/flask/app/./app.py) + +```python +# app.py +from ddtrace import patch_all; patch_all(flask=True, requests=True) # noqa + +from ddtrace import tracer + +from flask import Flask, Response +from flask import after_this_request +from flask import abort, jsonify, render_template, url_for +~~from flask.views import View +from werkzeug.routing import Rule + +from flask_caching import Cache +from flask_cors import CORS + +import requests + +from .blueprint import bp +from .exceptions import AppException +from .limiter import limiter +from .signals import connect_signals + +app = Flask(__name__) + +app.register_blueprint(bp) + +connect_signals(app) + +CORS(app) +Cache(app, config=dict(CACHE_TYPE='simple')) +limiter.init_app(app) + + +@app.context_processor + + +## ... source file abbreviated to get to View examples ... + + + +@app.route('/stream') +def stream(): + def generate(): + for i in range(100): + yield '{}\n'.format(i) + + return Response(generate(), mimetype='text/plain') + + +@app.route('/abort/') +def abort_endpoint(code): + abort(code) + + +@app.errorhandler(404) +def handle_404(e): + return '404', 404 + + +@app.errorhandler(500) +def handle_500(e): + return '500', 500 + + +~~class MyView(View): + methods = ['GET'] + + def dispatch_request(self, name): + return 'Hello %s!' % name + + +app.add_url_rule('/hello/', view_func=MyView.as_view('myview')) + + + ## ... source file continues with no further View examples... ``` diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html index 51a4c4975..6efa389ba 100644 --- a/theme/templates/code-examples/flask.html +++ b/theme/templates/code-examples/flask.html @@ -44,7 +44,8 @@

flask.signals got_request_exception

flask.templating - render_template + render_template, + render_template_string

flask.views MethodView, From 6fa03de46033795b88c7778c81c9f825fcd13afd Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 26 Jun 2020 20:55:24 -0400 Subject: [PATCH 138/302] add badrequest --- .../flask/flask-app-badrequest.markdown | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 6ba3c819b..51daeeb0c 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -71,6 +71,61 @@ from ..const import ( API_LIST_TITLE_RIS_KEY, +## ... source file abbreviated to get to BadRequest examples ... + + + API_SELECT_COLUMNS_RIS_KEY, + API_SHOW_COLUMNS_RES_KEY, + API_SHOW_COLUMNS_RIS_KEY, + API_SHOW_TITLE_RES_KEY, + API_SHOW_TITLE_RIS_KEY, + API_URI_RIS_KEY, + PERMISSION_PREFIX, +) +from ..exceptions import FABException, InvalidOrderByColumnFABException +from ..security.decorators import permission_name, protect + +log = logging.getLogger(__name__) + + +def get_error_msg(): + if current_app.config.get("FAB_API_SHOW_STACKTRACE"): + return traceback.format_exc() + return "Fatal error" + + +def safe(f): + + def wraps(self, *args, **kwargs): + try: + return f(self, *args, **kwargs) +~~ except BadRequest as e: + return self.response_400(message=str(e)) + except Exception as e: + logging.exception(e) + return self.response_500(message=get_error_msg()) + + return functools.update_wrapper(wraps, f) + + +def rison(schema=None): + + def _rison(f): + def wraps(self, *args, **kwargs): + value = request.args.get(API_URI_RIS_KEY, None) + kwargs["rison"] = dict() + if value: + try: + kwargs["rison"] = prison.loads(value) + except prison.decoder.ParserException: + if current_app.config.get("FAB_API_ALLOW_JSON_QS", True): + try: + kwargs["rison"] = json.loads( + urllib.parse.parse_qs(f"{API_URI_RIS_KEY}={value}").get( + API_URI_RIS_KEY + )[0] + + ## ... source file continues with no further BadRequest examples... ``` From 4ba4ac27d25799378e8c7874188f77454a281ce5 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 27 Jun 2020 07:52:29 -0400 Subject: [PATCH 139/302] adding flask security example code --- .../flask-ctx-after-this-request.markdown | 286 ++++++++++++++++++ .../flask/flask-ctx-has-app-context.markdown | 2 +- .../flask-ctx-has-request-context.markdown | 2 +- .../flask/flask-extensions-plug-ins.markdown | 16 + .../flask/flask-globals-current-app.markdown | 269 +++++++++++++++- .../examples/flask/flask-globals-g.markdown | 124 +++++++- .../flask/flask-globals-request.markdown | 228 +++++++++++++- .../flask/flask-globals-session.markdown | 90 +++++- .../flask/flask-helpers-flash.markdown | 124 +++++++- .../flask-helpers-make-response.markdown | 138 ++++++++- .../flask/flask-helpers-url-for.markdown | 126 +++++++- .../flask/flask-json-jsonencoder.markdown | 138 +++++++++ .../flask/flask-json-jsonify.markdown | 2 +- .../flask-sessions-badsignature.markdown | 156 +++++++++- .../flask-sessions-sessioninterface.markdown | 2 +- ...ask-signals-got-request-exception.markdown | 2 +- .../flask/flask-signals-namespace.markdown | 2 +- ...templating-render-template-string.markdown | 2 +- .../flask-templating-render-template.markdown | 120 +++++++- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 2 +- .../examples/flask/flask-views-view.markdown | 2 +- theme/templates/code-examples/flask.html | 2 + 23 files changed, 1801 insertions(+), 36 deletions(-) create mode 100644 content/pages/examples/flask/flask-ctx-after-this-request.markdown create mode 100644 content/pages/examples/flask/flask-json-jsonencoder.markdown diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown new file mode 100644 index 000000000..d60ea73da --- /dev/null +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -0,0 +1,286 @@ +title: flask.ctx after_this_request code examples +category: page +slug: flask-ctx-after-this-request-examples +sortorder: 500021007 +toc: False +sidebartitle: flask.ctx after_this_request +meta: Python example code for the after_this_request function from the flask.ctx module of the Flask project. + + +after_this_request is a function within the flask.ctx module of the Flask project. + + +## Example 1 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / unified_signin.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./unified_signin.py) + +```python +# unified_signin.py + +import time + +from flask import current_app as app +~~from flask import abort, after_this_request, request, session +from flask_login import current_user +from werkzeug.datastructures import MultiDict +from werkzeug.local import LocalProxy +from wtforms import BooleanField, RadioField, StringField, SubmitField, validators + +from .confirmable import requires_confirmation +from .decorators import anonymous_user_required, auth_required, unauth_csrf +from .forms import Form, Required, get_form_field_label +from .quart_compat import get_quart_status +from .signals import us_profile_changed, us_security_token_sent +from .twofactor import is_tf_setup, tf_login +from .utils import ( + _, + SmsSenderFactory, + base_render_json, + check_and_get_token_status, + config_value, + do_flash, + find_user, + get_identity_attributes, + get_post_login_redirect, + get_post_verify_redirect, + get_message, + get_url, + + +## ... source file abbreviated to get to after_this_request examples ... + + + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def validate(self): + if not super().validate(): + return False + + if not _security._totp_factory.verify_totp( + token=self.passcode.data, + totp_secret=self.totp_secret, + user=self.user, + window=config_value("US_TOKEN_VALIDITY"), + ): + self.passcode.errors.append(get_message("INVALID_PASSWORD_CODE")[0]) + return False + + return True + + +def _send_code_helper(form): + user = form.user + method = form.chosen_method.data + totp_secrets = _datastore.us_get_totp_secrets(user) + if method == "email" and method not in totp_secrets: +~~ after_this_request(_commit) + totp_secrets[method] = _security._totp_factory.generate_totp_secret() + _datastore.us_put_totp_secrets(user, totp_secrets) + + msg = user.us_send_security_token( + method, + totp_secret=totp_secrets[method], + phone_number=getattr(user, "us_phone_number", None), + send_magic_link=True, + ) + code_sent = True + if msg: + code_sent = False + form.chosen_method.errors.append(msg) + return code_sent, msg + + +@anonymous_user_required +@unauth_csrf(fall_through=True) +def us_signin_send_code(): + form_class = _security.us_signin_form + + if request.is_json: + if request.content_length: + form = form_class(MultiDict(request.get_json()), meta=suppress_form_csrf()) + + +## ... source file abbreviated to get to after_this_request examples ... + + + else: + return redirect(get_post_login_redirect()) + + form_class = _security.us_signin_form + + if request.is_json: + if request.content_length: + form = form_class(MultiDict(request.get_json()), meta=suppress_form_csrf()) + else: + form = form_class(formdata=None, meta=suppress_form_csrf()) + else: + form = form_class(meta=suppress_form_csrf()) + form.submit.data = True + + if form.validate_on_submit(): + remember_me = form.remember.data if "remember" in form else None + if ( + config_value("TWO_FACTOR") + and form.authn_via in config_value("US_MFA_REQUIRED") + and (config_value("TWO_FACTOR_REQUIRED") or is_tf_setup(form.user)) + ): + return tf_login( + form.user, remember=remember_me, primary_authn_via=form.authn_via + ) + +~~ after_this_request(_commit) + login_user(form.user, remember=remember_me, authn_via=[form.authn_via]) + + if _security._want_json(request): + return base_render_json(form, include_auth_token=True) + + return redirect(get_post_login_redirect()) + + code_methods = _compute_code_methods() + if _security._want_json(request): + payload = { + "available_methods": config_value("US_ENABLED_METHODS"), + "code_methods": code_methods, + "identity_attributes": get_identity_attributes(), + } + return base_render_json(form, include_user=False, additional=payload) + + if current_user.is_authenticated: + return redirect(get_post_login_redirect()) + + form.passcode.data = None + return _security.render_template( + config_value("US_SIGNIN_TEMPLATE"), + us_signin_form=form, + available_methods=config_value("US_ENABLED_METHODS"), + + +## ... source file abbreviated to get to after_this_request examples ... + + + if _security.redirect_behavior == "spa": + return redirect( + get_url( + _security.login_error_view, + qparams=user.get_redirect_qparams({c: m}), + ) + ) + do_flash(m, c) + return redirect(url_for_security("us_signin")) + + if ( + config_value("TWO_FACTOR") + and "email" in config_value("US_MFA_REQUIRED") + and (config_value("TWO_FACTOR_REQUIRED") or is_tf_setup(user)) + ): + if _security.redirect_behavior == "spa": + return redirect( + get_url( + _security.login_error_view, + qparams=user.get_redirect_qparams({"tf_required": 1}), + ) + ) + return tf_login(user, primary_authn_via="email") + + login_user(user, authn_via=["email"]) +~~ after_this_request(_commit) + if _security.redirect_behavior == "spa": + return redirect( + get_url(_security.post_login_view, qparams=user.get_redirect_qparams()) + ) + + do_flash(*get_message("PASSWORDLESS_LOGIN_SUCCESSFUL")) + return redirect(get_post_login_redirect()) + + +@auth_required( + within=lambda: config_value("FRESHNESS"), + grace=lambda: config_value("FRESHNESS_GRACE_PERIOD"), +) +def us_setup(): + form_class = _security.us_setup_form + + if request.is_json: + if request.content_length: + form = form_class(MultiDict(request.get_json()), meta=suppress_form_csrf()) + else: + form = form_class(formdata=None, meta=suppress_form_csrf()) + else: + form = form_class(meta=suppress_form_csrf()) + + + +## ... source file abbreviated to get to after_this_request examples ... + + + form_class = _security.us_setup_validate_form + + if request.is_json: + form = form_class(MultiDict(request.get_json()), meta=suppress_form_csrf()) + else: + form = form_class(meta=suppress_form_csrf()) + + expired, invalid, state = check_and_get_token_status( + token, "us_setup", get_within_delta("US_SETUP_WITHIN") + ) + if invalid: + m, c = get_message("API_ERROR") + if expired: + m, c = get_message("US_SETUP_EXPIRED", within=config_value("US_SETUP_WITHIN")) + if invalid or expired: + if _security._want_json(request): + payload = json_error_response(errors=m) + return _security._render_json(payload, 400, None, None) + do_flash(m, c) + return redirect(url_for_security("us_setup")) + + form.totp_secret = state["totp_secret"] + form.user = current_user + + if form.validate_on_submit(): +~~ after_this_request(_commit) + method = state["chosen_method"] + phone = state["phone_number"] if method == "sms" else None + _datastore.us_set(current_user, method, state["totp_secret"], phone) + + us_profile_changed.send( + app._get_current_object(), user=current_user, method=method + ) + if _security._want_json(request): + return base_render_json( + form, + include_user=False, + additional=dict( + chosen_method=method, phone=current_user.us_phone_number + ), + ) + else: + do_flash(*get_message("US_SETUP_SUCCESSFUL")) + return redirect( + get_url(_security.us_post_setup_view) + or get_url(_security.post_login_view) + ) + + if _security._want_json(request): + return base_render_json(form, include_user=False) + + +## ... source file continues with no further after_this_request examples... + +``` + diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index 588b02488..f14cffe90 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -1,7 +1,7 @@ title: flask.ctx has_app_context code examples category: page slug: flask-ctx-has-app-context-examples -sortorder: 500021007 +sortorder: 500021008 toc: False sidebartitle: flask.ctx has_app_context meta: Python example code for the has_app_context function from the flask.ctx module of the Flask project. diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index 692c9c433..d54b14955 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -1,7 +1,7 @@ title: flask.ctx has_request_context code examples category: page slug: flask-ctx-has-request-context-examples -sortorder: 500021008 +sortorder: 500021009 toc: False sidebartitle: flask.ctx has_request_context meta: Python example code for the has_request_context function from the flask.ctx module of the Flask project. diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown index ffd934ead..f32958cb6 100644 --- a/content/pages/examples/flask/flask-extensions-plug-ins.markdown +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -102,6 +102,22 @@ Flask RESTX is provided as open source under the [BSD 3-Clause license](https://github.com/python-restx/flask-restx/blob/master/LICENSE). +### Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + + ### Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 863df30d6..95c935af7 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -1,7 +1,7 @@ title: flask.globals current_app code examples category: page slug: flask-globals-current-app-examples -sortorder: 500021009 +sortorder: 500021010 toc: False sidebartitle: flask.globals current_app meta: Python example code for the current_app function from the flask.globals module of the Flask project. @@ -1628,7 +1628,268 @@ def same_origin(current_uri, compare_uri): ``` -## Example 11 from Flasky +## Example 11 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / core.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./core.py) + +```python +# core.py + +from datetime import datetime, timedelta +import warnings + +import pkg_resources +~~from flask import _request_ctx_stack, current_app, render_template +from flask_babelex import Domain +from flask_login import AnonymousUserMixin, LoginManager +from flask_login import UserMixin as BaseUserMixin +from flask_login import current_user +from flask_principal import Identity, Principal, RoleNeed, UserNeed, identity_loaded +from itsdangerous import URLSafeTimedSerializer +from passlib.context import CryptContext +from werkzeug.datastructures import ImmutableList +from werkzeug.local import LocalProxy + +from .decorators import ( + default_reauthn_handler, + default_unauthn_handler, + default_unauthz_handler, +) +from .forms import ( + ChangePasswordForm, + ConfirmRegisterForm, + ForgotPasswordForm, + LoginForm, + PasswordlessLoginForm, + RegisterForm, + ResetPasswordForm, + SendConfirmationForm, + + +## ... source file abbreviated to get to current_app examples ... + + + UnifiedSigninSetupValidateForm, + UnifiedVerifyForm, + us_send_security_token, +) +from .totp import Totp +from .utils import _ +from .utils import config_value as cv +from .utils import ( + FsJsonEncoder, + FsPermNeed, + csrf_cookie_handler, + default_want_json, + default_password_validator, + get_config, + get_identity_attribute, + get_identity_attributes, + get_message, + localize_callback, + set_request_attr, + uia_email_mapper, + url_for_security, + verify_and_update_password, +) +from .views import create_blueprint, default_render_json + +~~_security = LocalProxy(lambda: current_app.extensions["security"]) +_datastore = LocalProxy(lambda: _security.datastore) + +AUTHN_MECHANISMS = ("basic", "session", "token") + + +_default_config = { + "BLUEPRINT_NAME": "security", + "CLI_ROLES_NAME": "roles", + "CLI_USERS_NAME": "users", + "URL_PREFIX": None, + "SUBDOMAIN": None, + "FLASH_MESSAGES": True, + "I18N_DOMAIN": "flask_security", + "I18N_DIRNAME": pkg_resources.resource_filename("flask_security", "translations"), + "PASSWORD_HASH": "bcrypt", + "PASSWORD_SALT": None, + "PASSWORD_SINGLE_HASH": { + "django_argon2", + "django_bcrypt_sha256", + "django_pbkdf2_sha256", + "django_pbkdf2_sha1", + "django_bcrypt", + "django_salted_md5", + "django_salted_sha1", + + +## ... source file abbreviated to get to current_app examples ... + + + "SEND_CONFIRMATION_TEMPLATE": "security/send_confirmation.html", + "SEND_LOGIN_TEMPLATE": "security/send_login.html", + "VERIFY_TEMPLATE": "security/verify.html", + "TWO_FACTOR_VERIFY_CODE_TEMPLATE": "security/two_factor_verify_code.html", + "TWO_FACTOR_SETUP_TEMPLATE": "security/two_factor_setup.html", + "CONFIRMABLE": False, + "REGISTERABLE": False, + "RECOVERABLE": False, + "TRACKABLE": False, + "PASSWORDLESS": False, + "CHANGEABLE": False, + "TWO_FACTOR": False, + "SEND_REGISTER_EMAIL": True, + "SEND_PASSWORD_CHANGE_EMAIL": True, + "SEND_PASSWORD_RESET_EMAIL": True, + "SEND_PASSWORD_RESET_NOTICE_EMAIL": True, + "LOGIN_WITHIN": "1 days", + "TWO_FACTOR_AUTHENTICATOR_VALIDITY": 120, + "TWO_FACTOR_MAIL_VALIDITY": 300, + "TWO_FACTOR_SMS_VALIDITY": 120, + "CONFIRM_EMAIL_WITHIN": "5 days", + "RESET_PASSWORD_WITHIN": "5 days", + "LOGIN_WITHOUT_CONFIRMATION": False, + "AUTO_LOGIN_AFTER_CONFIRM": True, + "EMAIL_SENDER": LocalProxy( +~~ lambda: current_app.config.get("MAIL_DEFAULT_SENDER", "no-reply@localhost") + ), + "TWO_FACTOR_RESCUE_MAIL": "no-reply@localhost", + "TOKEN_AUTHENTICATION_KEY": "auth_token", + "TOKEN_AUTHENTICATION_HEADER": "Authentication-Token", + "TOKEN_MAX_AGE": None, + "CONFIRM_SALT": "confirm-salt", + "RESET_SALT": "reset-salt", + "LOGIN_SALT": "login-salt", + "CHANGE_SALT": "change-salt", + "REMEMBER_SALT": "remember-salt", + "DEFAULT_REMEMBER_ME": False, + "DEFAULT_HTTP_AUTH_REALM": _("Login Required"), + "EMAIL_SUBJECT_REGISTER": _("Welcome"), + "EMAIL_SUBJECT_CONFIRM": _("Please confirm your email"), + "EMAIL_SUBJECT_PASSWORDLESS": _("Login instructions"), + "EMAIL_SUBJECT_PASSWORD_NOTICE": _("Your password has been reset"), + "EMAIL_SUBJECT_PASSWORD_CHANGE_NOTICE": _("Your password has been changed"), + "EMAIL_SUBJECT_PASSWORD_RESET": _("Password reset instructions"), + "EMAIL_PLAINTEXT": True, + "EMAIL_HTML": True, + "EMAIL_SUBJECT_TWO_FACTOR": _("Two-factor Login"), + "EMAIL_SUBJECT_TWO_FACTOR_RESCUE": _("Two-factor Rescue"), + "USER_IDENTITY_ATTRIBUTES": [ + {"email": {"mapper": uia_email_mapper, "case_insensitive": True}} + + +## ... source file abbreviated to get to current_app examples ... + + + + for key, value in _default_config.items(): + app.config.setdefault("SECURITY_" + key, value) + + for key, value in _default_messages.items(): + app.config.setdefault("SECURITY_MSG_" + key, value) + + identity_loaded.connect_via(app)(_on_identity_loaded) + + self._state = state = _get_state(app, datastore, **kwargs) + if hasattr(datastore, "user_model") and not hasattr( + datastore.user_model, "fs_uniquifier" + ): # pragma: no cover + raise ValueError("User model must contain fs_uniquifier as of 4.0.0") + + if register_blueprint: + bp = create_blueprint( + app, state, __name__, json_encoder=kwargs["json_encoder_cls"] + ) + app.register_blueprint(bp) + app.context_processor(_context_processor) + + @app.before_first_request + def _register_i18n(): + if "_" not in app.jinja_env.globals: +~~ current_app.jinja_env.globals["_"] = state.i18n_domain.gettext +~~ current_app.jinja_env.globals["_fsdomain"] = state.i18n_domain.gettext + + @app.before_first_request + def _csrf_init(): +~~ if not current_app.config.get("WTF_CSRF_ENABLED", True): + return +~~ csrf = current_app.extensions.get("csrf", None) + + if cv("CSRF_PROTECT_MECHANISMS") != AUTHN_MECHANISMS: + if not csrf: + raise ValueError( + "CSRF_PROTECT_MECHANISMS defined but" + " CsrfProtect not part of application" + ) +~~ if current_app.config.get("WTF_CSRF_CHECK_DEFAULT", True): + raise ValueError( + "WTF_CSRF_CHECK_DEFAULT must be set to False if" + " CSRF_PROTECT_MECHANISMS is set" + ) + if ( + cv("CSRF_IGNORE_UNAUTH_ENDPOINTS") + and csrf +~~ and current_app.config.get("WTF_CSRF_CHECK_DEFAULT", False) + ): + raise ValueError( + "To ignore unauth endpoints you must set WTF_CSRF_CHECK_DEFAULT" + " to False" + ) + + csrf_cookie = cv("CSRF_COOKIE") + if csrf_cookie and csrf_cookie["key"] and not csrf: + raise ValueError( + "CSRF_COOKIE defined however CsrfProtect not part of application" + ) + + if csrf: + csrf.exempt("flask_security.views.logout") + if csrf_cookie and csrf_cookie["key"]: +~~ current_app.after_request(csrf_cookie_handler) +~~ current_app.config["WTF_CSRF_HEADERS"].append(cv("CSRF_HEADER")) + + @app.before_first_request + def _init_phone_util(): + state._phone_util = state.phone_util_cls() + + @app.before_first_request + def _init_mail_util(): + state._mail_util = state.mail_util_cls() + + app.extensions["security"] = state + + if hasattr(app, "cli"): + from .cli import users, roles + + if state.cli_users_name: + app.cli.add_command(users, state.cli_users_name) + if state.cli_roles_name: + app.cli.add_command(roles, state.cli_roles_name) + + for newc, oldc in [ + ("SECURITY_SMS_SERVICE", "SECURITY_TWO_FACTOR_SMS_SERVICE"), + ("SECURITY_SMS_SERVICE_CONFIG", "SECURITY_TWO_FACTOR_SMS_SERVICE_CONFIG"), + ("SECURITY_TOTP_SECRETS", "SECURITY_TWO_FACTOR_SECRET"), + ("SECURITY_TOTP_ISSUER", "SECURITY_TWO_FACTOR_URI_SERVICE_NAME"), + + +## ... source file continues with no further current_app examples... + +``` + + +## Example 12 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1683,7 +1944,7 @@ def run_migrations_online(): ``` -## Example 12 from sandman2 +## Example 13 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1808,7 +2069,7 @@ def register_model(cls, admin=None): ``` -## Example 13 from tedivms-flask +## Example 14 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index f1d5bf40b..77a6e4e26 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -1,7 +1,7 @@ title: flask.globals g code examples category: page slug: flask-globals-g-examples -sortorder: 500021010 +sortorder: 500021011 toc: False sidebartitle: flask.globals g meta: Python example code for the g function from the flask.globals module of the Flask project. @@ -630,7 +630,127 @@ class CSRFProtect(object): ``` -## Example 5 from tedivms-flask +## Example 5 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / utils.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./utils.py) + +```python +# utils.py +import abc +import base64 +import datetime +from functools import partial +import hashlib +import hmac +import time +from typing import Dict, List +import warnings +from datetime import timedelta +from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode +import urllib.request +import urllib.error + +~~from flask import _request_ctx_stack, current_app, flash, g, request, session, url_for +from flask.json import JSONEncoder +from flask_login import login_user as _login_user +from flask_login import logout_user as _logout_user +from flask_login import current_user +from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME +from flask_principal import AnonymousIdentity, Identity, identity_changed, Need +from flask_wtf import csrf +from wtforms import validators, ValidationError +from itsdangerous import BadSignature, SignatureExpired +from speaklater import is_lazy_string +from werkzeug.local import LocalProxy +from werkzeug.datastructures import MultiDict +from .quart_compat import best +from .signals import user_authenticated + +_security = LocalProxy(lambda: current_app.extensions["security"]) + +_datastore = LocalProxy(lambda: _security.datastore) + +_pwd_context = LocalProxy(lambda: _security.pwd_context) + +_hashing_context = LocalProxy(lambda: _security.hashing_context) + +localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) + + +## ... source file abbreviated to get to g examples ... + + + user.login_count = user.login_count + 1 if user.login_count else 1 + + _datastore.put(user) + + session["fs_cc"] = "set" # CSRF cookie + session["fs_paa"] = time.time() # Primary authentication at - timestamp + + identity_changed.send( + current_app._get_current_object(), identity=Identity(user.fs_uniquifier) + ) + + user_authenticated.send( + current_app._get_current_object(), user=user, authn_via=authn_via + ) + return True + + +def logout_user(): + + for key in ("identity.name", "identity.auth_type", "fs_paa", "fs_gexp"): + session.pop(key, None) + + csrf_field_name = find_csrf_field_name() + if csrf_field_name: + session.pop(csrf_field_name, None) +~~ g.pop(csrf_field_name, None) + session["fs_cc"] = "clear" + identity_changed.send( + current_app._get_current_object(), identity=AnonymousIdentity() + ) + _logout_user() + + +def check_and_update_authn_fresh(within, grace, method=None): + + if method == "basic": + return True + + if within.total_seconds() < 0: + return True + + if "fs_paa" not in session: + return False + + now = datetime.datetime.utcnow() + new_exp = now + grace + grace_ts = int(new_exp.timestamp()) + + fs_gexp = session.get("fs_gexp", None) + if fs_gexp: + + +## ... source file continues with no further g examples... + +``` + + +## Example 6 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index d82e58bc6..8e026e352 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -1,7 +1,7 @@ title: flask.globals request code examples category: page slug: flask-globals-request-examples -sortorder: 500021011 +sortorder: 500021012 toc: False sidebartitle: flask.globals request meta: Python example code for the request function from the flask.globals module of the Flask project. @@ -1566,7 +1566,227 @@ admin.add_view(FileAdmin(path, '/static/', name='Static')) ``` -## Example 10 from newspie +## Example 10 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / forms.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./forms.py) + +```python +# forms.py + +import inspect + +~~from flask import Markup, current_app, request +from flask_login import current_user +from flask_wtf import FlaskForm as BaseForm +from speaklater import is_lazy_string, make_lazy_string +from werkzeug.local import LocalProxy +from wtforms import ( + BooleanField, + Field, + HiddenField, + PasswordField, + RadioField, + StringField, + SubmitField, + ValidationError, + validators, +) + +from .confirmable import requires_confirmation +from .utils import ( + _, + _datastore, + config_value, + do_flash, + find_user, + get_identity_attribute, + + +## ... source file abbreviated to get to request examples ... + + + +class RegisterFormMixin: + submit = SubmitField(get_form_field_label("register")) + + def to_dict(self, only_user): + + def is_field_and_user_attr(member): + if not isinstance(member, Field): + return False + + if only_user is True: + return hasattr(_datastore.user_model, member.name) + else: + return True + + fields = inspect.getmembers(self, is_field_and_user_attr) + return {key: value.data for key, value in fields} + + +class SendConfirmationForm(Form, UserEmailFormMixin): + + submit = SubmitField(get_form_field_label("send_confirmation")) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) +~~ if request.method == "GET": +~~ self.email.data = request.args.get("email", None) + + def validate(self): + if not super().validate(): + return False + if self.user.confirmed_at is not None: + self.email.errors.append(get_message("ALREADY_CONFIRMED")[0]) + return False + return True + + +class ForgotPasswordForm(Form, UserEmailFormMixin): + + submit = SubmitField(get_form_field_label("recover_password")) + + def validate(self): + if not super().validate(): + return False + if not self.user.is_active: + self.email.errors.append(get_message("DISABLED_ACCOUNT")[0]) + return False + if requires_confirmation(self.user): + self.email.errors.append(get_message("CONFIRMATION_REQUIRED")[0]) + return False + return True + + +## ... source file abbreviated to get to request examples ... + + + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def validate(self): + if not super().validate(): + return False + if not self.user.is_active: + self.email.errors.append(get_message("DISABLED_ACCOUNT")[0]) + return False + return True + + +class LoginForm(Form, NextFormMixin): + + email = StringField(get_form_field_label("email"), validators=[email_required]) + password = PasswordField( + get_form_field_label("password"), validators=[password_required] + ) + remember = BooleanField(get_form_field_label("remember_me")) + submit = SubmitField(get_form_field_label("login")) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if not self.next.data: +~~ self.next.data = request.args.get("next", "") + self.remember.default = config_value("DEFAULT_REMEMBER_ME") + if ( + current_app.extensions["security"].recoverable + and not self.password.description + ): + html = Markup( + '{message}'.format( + url=url_for_security("forgot_password"), + message=get_message("FORGOT_PASSWORD")[0], + ) + ) + self.password.description = html + + def validate(self): + if not super().validate(): + return False + + self.user = find_user(self.email.data) + + if self.user is None: + self.email.errors.append(get_message("USER_DOES_NOT_EXIST")[0]) + hash_password(self.password.data) + return False + if not self.user.password: + + +## ... source file abbreviated to get to request examples ... + + + +class RegisterForm(ConfirmRegisterForm, NextFormMixin): + + password_confirm = PasswordField( + get_form_field_label("retype_password"), + validators=[ + EqualTo("password", message="RETYPE_PASSWORD_MISMATCH"), + validators.Optional(), + ], + ) + + def validate(self): + if not super().validate(): + return False + if not config_value("UNIFIED_SIGNIN"): + if not self.password_confirm.data or not self.password_confirm.data.strip(): + self.password_confirm.errors.append( + get_message("PASSWORD_NOT_PROVIDED")[0] + ) + return False + return True + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if not self.next.data: +~~ self.next.data = request.args.get("next", "") + + +class ResetPasswordForm(Form, NewPasswordFormMixin, PasswordConfirmFormMixin): + + submit = SubmitField(get_form_field_label("reset_password")) + + def validate(self): + if not super().validate(): + return False + + pbad = _security._password_validator( + self.password.data, False, user=current_user + ) + if pbad: + self.password.errors.extend(pbad) + return False + return True + + +class ChangePasswordForm(Form, PasswordFormMixin): + + new_password = PasswordField( + get_form_field_label("new_password"), validators=[password_required] + ) + + +## ... source file continues with no further request examples... + +``` + + +## Example 11 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1747,7 +1967,7 @@ if __name__ == '__main__': ``` -## Example 11 from sandman2 +## Example 12 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1948,7 +2168,7 @@ class Service(MethodView): ``` -## Example 12 from tedivms-flask +## Example 13 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index b066c6381..f03f1637b 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -1,7 +1,7 @@ title: flask.globals session code examples category: page slug: flask-globals-session-examples -sortorder: 500021012 +sortorder: 500021013 toc: False sidebartitle: flask.globals session meta: Python example code for the session function from the flask.globals module of the Flask project. @@ -661,7 +661,93 @@ logger = wrap_logger( ``` -## Example 7 from tedivms-flask +## Example 7 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / twofactor.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./twofactor.py) + +```python +# twofactor.py + +~~from flask import current_app as app, redirect, request, session +from werkzeug.datastructures import MultiDict +from werkzeug.local import LocalProxy + +from .utils import ( + SmsSenderFactory, + base_render_json, + config_value, + do_flash, + login_user, + json_error_response, + send_mail, + url_for_security, +) +from .signals import ( + tf_code_confirmed, + tf_disabled, + tf_security_token_sent, + tf_profile_changed, +) + +_security = LocalProxy(lambda: app.extensions["security"]) +_datastore = LocalProxy(lambda: _security.datastore) + + +def tf_clean_session(): + if config_value("TWO_FACTOR"): + for k in [ + "tf_state", + "tf_user_id", + "tf_primary_method", + "tf_remember_login", + "tf_totp_secret", + ]: +~~ session.pop(k, None) + + +def tf_send_security_token(user, method, totp_secret, phone_number): + token_to_be_sent = _security._totp_factory.generate_totp_password(totp_secret) + if method == "email" or method == "mail": + send_mail( + config_value("EMAIL_SUBJECT_TWO_FACTOR"), + user.email, + "two_factor_instructions", + user=user, + token=token_to_be_sent, + username=user.calc_username(), + ) + elif method == "sms": + msg = "Use this code to log in: %s" % token_to_be_sent + from_number = config_value("SMS_SERVICE_CONFIG")["PHONE_NUMBER"] + to_number = phone_number + sms_sender = SmsSenderFactory.createSender(config_value("SMS_SERVICE")) + sms_sender.send_sms(from_number=from_number, to_number=to_number, msg=msg) + + elif method == "google_authenticator" or method == "authenticator": + pass + tf_security_token_sent.send( + app._get_current_object(), + + +## ... source file continues with no further session examples... + +``` + + +## Example 8 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index f70cddc19..cddfd69e1 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -1,7 +1,7 @@ title: flask.helpers flash code examples category: page slug: flask-helpers-flash-examples -sortorder: 500021013 +sortorder: 500021014 toc: False sidebartitle: flask.helpers flash meta: Python example code for the flash function from the flask.helpers module of the Flask project. @@ -749,7 +749,127 @@ class LoginManager(object): ``` -## Example 6 from tedivms-flask +## Example 6 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / utils.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./utils.py) + +```python +# utils.py +import abc +import base64 +import datetime +from functools import partial +import hashlib +import hmac +import time +from typing import Dict, List +import warnings +from datetime import timedelta +from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode +import urllib.request +import urllib.error + +~~from flask import _request_ctx_stack, current_app, flash, g, request, session, url_for +from flask.json import JSONEncoder +from flask_login import login_user as _login_user +from flask_login import logout_user as _logout_user +from flask_login import current_user +from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME +from flask_principal import AnonymousIdentity, Identity, identity_changed, Need +from flask_wtf import csrf +from wtforms import validators, ValidationError +from itsdangerous import BadSignature, SignatureExpired +from speaklater import is_lazy_string +from werkzeug.local import LocalProxy +from werkzeug.datastructures import MultiDict +from .quart_compat import best +from .signals import user_authenticated + +_security = LocalProxy(lambda: current_app.extensions["security"]) + +_datastore = LocalProxy(lambda: _security.datastore) + +_pwd_context = LocalProxy(lambda: _security.pwd_context) + +_hashing_context = LocalProxy(lambda: _security.hashing_context) + +localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) + + +## ... source file abbreviated to get to flash examples ... + + + string = string.encode("utf-8") + return string + + +def hash_data(data): + return _hashing_context.hash(encode_string(data)) + + +def verify_hash(hashed_data, compare_data): + return _hashing_context.verify(encode_string(compare_data), hashed_data) + + +def suppress_form_csrf(): + if get_request_attr("fs_ignore_csrf"): + return {"csrf": False} + if ( + config_value("CSRF_IGNORE_UNAUTH_ENDPOINTS") + and not current_user.is_authenticated + ): + return {"csrf": False} + return {} + + +def do_flash(message, category=None): + if config_value("FLASH_MESSAGES"): +~~ flash(message, category) + + +def get_url(endpoint_or_url, qparams=None): + try: + return transform_url(url_for(endpoint_or_url), qparams) + except Exception: + if _security.redirect_host: + url = transform_url( + endpoint_or_url, qparams, netloc=_security.redirect_host + ) + else: + url = transform_url(endpoint_or_url, qparams) + + return url + + +def slash_url_suffix(url, suffix): + + return url.endswith("/") and ("%s/" % suffix) or ("/%s" % suffix) + + +def transform_url(url, qparams=None, **kwargs): + if not url: + return url + + +## ... source file continues with no further flash examples... + +``` + + +## Example 7 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 778110a7c..14c79bf24 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -1,7 +1,7 @@ title: flask.helpers make_response code examples category: page slug: flask-helpers-make-response-examples -sortorder: 500021014 +sortorder: 500021015 toc: False sidebartitle: flask.helpers make_response meta: Python example code for the make_response function from the flask.helpers module of the Flask project. @@ -197,7 +197,139 @@ def crossdomain( ``` -## Example 3 from newspie +## Example 3 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / views.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./views.py) + +```python +# views.py + +import time + +from flask import ( + Blueprint, + abort, + after_this_request, + current_app, + jsonify, + request, + session, +) +from flask_login import current_user +from werkzeug.datastructures import MultiDict +from werkzeug.local import LocalProxy + +from .changeable import change_user_password +from .confirmable import ( + confirm_email_token_status, + confirm_user, + send_confirmation_instructions, +) +from .decorators import anonymous_user_required, auth_required, unauth_csrf +from .passwordless import login_token_status, send_login_instructions +from .quart_compat import get_quart_status +from .unified_signin import ( + us_signin, + us_signin_send_code, + us_qrcode, + us_setup, + us_setup_validate, + us_verify, + us_verify_link, + us_verify_send_code, +) + + +## ... source file abbreviated to get to make_response examples ... + + + get_message, + get_post_login_redirect, + get_post_logout_redirect, + get_post_register_redirect, + get_post_verify_redirect, + get_request_attr, + get_url, + json_error_response, + login_user, + logout_user, + send_mail, + slash_url_suffix, + suppress_form_csrf, + url_for_security, +) + +if get_quart_status(): # pragma: no cover + from quart import make_response, redirect + + async def _commit(response=None): + _datastore.commit() + return response + + +else: +~~ from flask import make_response, redirect + + def _commit(response=None): + _datastore.commit() + return response + + +_security = LocalProxy(lambda: current_app.extensions["security"]) +_datastore = LocalProxy(lambda: _security.datastore) + + +def default_render_json(payload, code, headers, user): + if headers is None: + headers = dict() + headers["Content-Type"] = "application/json" + payload = dict(meta=dict(code=code), response=payload) +~~ return make_response(jsonify(payload), code, headers) + + +def _ctx(endpoint): + return _security._run_ctx_processor(endpoint) + + +@unauth_csrf(fall_through=True) +def login(): + + if current_user.is_authenticated and request.method == "POST": + + if _security._want_json(request): + payload = json_error_response( + errors=get_message("ANONYMOUS_USER_REQUIRED")[0] + ) + return _security._render_json(payload, 400, None, None) + else: + return redirect(get_post_login_redirect()) + + form_class = _security.login_form + + if request.is_json: + if request.content_length: + form = form_class(MultiDict(request.get_json()), meta=suppress_form_csrf()) + + +## ... source file continues with no further make_response examples... + +``` + + +## Example 4 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -304,7 +436,7 @@ def parse_articles(response): ``` -## Example 4 from sandman2 +## Example 5 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 443c595c2..642641758 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -1,7 +1,7 @@ title: flask.helpers url_for code examples category: page slug: flask-helpers-url-for-examples -sortorder: 500021015 +sortorder: 500021016 toc: False sidebartitle: flask.helpers url_for meta: Python example code for the url_for function from the flask.helpers module of the Flask project. @@ -588,7 +588,127 @@ def reset(token): ``` -## Example 8 from Flasky +## Example 8 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / utils.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./utils.py) + +```python +# utils.py +import abc +import base64 +import datetime +from functools import partial +import hashlib +import hmac +import time +from typing import Dict, List +import warnings +from datetime import timedelta +from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode +import urllib.request +import urllib.error + +~~from flask import _request_ctx_stack, current_app, flash, g, request, session, url_for +from flask.json import JSONEncoder +from flask_login import login_user as _login_user +from flask_login import logout_user as _logout_user +from flask_login import current_user +from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME +from flask_principal import AnonymousIdentity, Identity, identity_changed, Need +from flask_wtf import csrf +from wtforms import validators, ValidationError +from itsdangerous import BadSignature, SignatureExpired +from speaklater import is_lazy_string +from werkzeug.local import LocalProxy +from werkzeug.datastructures import MultiDict +from .quart_compat import best +from .signals import user_authenticated + +_security = LocalProxy(lambda: current_app.extensions["security"]) + +_datastore = LocalProxy(lambda: _security.datastore) + +_pwd_context = LocalProxy(lambda: _security.pwd_context) + +_hashing_context = LocalProxy(lambda: _security.hashing_context) + +localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) + + +## ... source file abbreviated to get to url_for examples ... + + + return url + + +def slash_url_suffix(url, suffix): + + return url.endswith("/") and ("%s/" % suffix) or ("/%s" % suffix) + + +def transform_url(url, qparams=None, **kwargs): + if not url: + return url + link_parse = urlsplit(url) + if qparams: + current_query = dict(parse_qsl(link_parse.query)) + current_query.update(qparams) + link_parse = link_parse._replace(query=urlencode(current_query)) + return urlunsplit(link_parse._replace(**kwargs)) + + +def get_security_endpoint_name(endpoint): + return f"{_security.blueprint_name}.{endpoint}" + + +def url_for_security(endpoint, **values): + endpoint = get_security_endpoint_name(endpoint) +~~ return url_for(endpoint, **values) + + +def validate_redirect_url(url): + if url is None or url.strip() == "": + return False + url_next = urlsplit(url) + url_base = urlsplit(request.host_url) + if (url_next.netloc or url_next.scheme) and url_next.netloc != url_base.netloc: + return False + return True + + +def get_post_action_redirect(config_key, declared=None): + urls = [ + get_url(request.args.get("next", None)), + get_url(request.form.get("next", None)), + find_redirect(config_key), + ] + if declared: + urls.insert(0, declared) + for url in urls: + if validate_redirect_url(url): + return url + + + +## ... source file continues with no further url_for examples... + +``` + + +## Example 9 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -788,7 +908,7 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body) ``` -## Example 9 from Datadog Flask Example App +## Example 10 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown new file mode 100644 index 000000000..206aa2c25 --- /dev/null +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -0,0 +1,138 @@ +title: flask.json JSONEncoder code examples +category: page +slug: flask-json-jsonencoder-examples +sortorder: 500021017 +toc: False +sidebartitle: flask.json JSONEncoder +meta: Python example code for the JSONEncoder class from the flask.json module of the Flask project. + + +JSONEncoder is a class within the flask.json module of the Flask project. + + +## Example 1 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / utils.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./utils.py) + +```python +# utils.py +import abc +import base64 +import datetime +from functools import partial +import hashlib +import hmac +import time +from typing import Dict, List +import warnings +from datetime import timedelta +from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode +import urllib.request +import urllib.error + +from flask import _request_ctx_stack, current_app, flash, g, request, session, url_for +~~from flask.json import JSONEncoder +from flask_login import login_user as _login_user +from flask_login import logout_user as _logout_user +from flask_login import current_user +from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME +from flask_principal import AnonymousIdentity, Identity, identity_changed, Need +from flask_wtf import csrf +from wtforms import validators, ValidationError +from itsdangerous import BadSignature, SignatureExpired +from speaklater import is_lazy_string +from werkzeug.local import LocalProxy +from werkzeug.datastructures import MultiDict +from .quart_compat import best +from .signals import user_authenticated + +_security = LocalProxy(lambda: current_app.extensions["security"]) + +_datastore = LocalProxy(lambda: _security.datastore) + +_pwd_context = LocalProxy(lambda: _security.pwd_context) + +_hashing_context = LocalProxy(lambda: _security.hashing_context) + +localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) + + + +## ... source file abbreviated to get to JSONEncoder examples ... + + + accept_mimetypes = req.accept_mimetypes + if not hasattr(req.accept_mimetypes, "best"): # pragma: no cover + accept_mimetypes.best = best + if accept_mimetypes.best == "application/json": + return True + return False + + +def json_error_response(errors): + if isinstance(errors, str): + response_json = dict(error=errors) + elif isinstance(errors, dict): + response_json = dict(errors=errors) + else: + raise TypeError("The errors argument should be either a str or dict.") + + return response_json + + +~~class FsJsonEncoder(JSONEncoder): + + def default(self, obj): + if is_lazy_string(obj): + return str(obj) + else: +~~ return JSONEncoder.default(self, obj) + + +class SmsSenderBaseClass(metaclass=abc.ABCMeta): + def __init__(self): + pass + + @abc.abstractmethod + def send_sms(self, from_number, to_number, msg): # pragma: no cover + return + + +class DummySmsSender(SmsSenderBaseClass): + def send_sms(self, from_number, to_number, msg): # pragma: no cover + return + + +class SmsSenderFactory: + senders = {"Dummy": DummySmsSender} + + @classmethod + def createSender(cls, name, *args, **kwargs): + return cls.senders[name](*args, **kwargs) + + + return _security._render_json(payload, code, headers=None, user=user) + + +def default_want_json(req): + if req.is_json: + return True + + +## ... source file continues with no further JSONEncoder examples... + +``` + diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 476fd9766..d4d8fd9b3 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -1,7 +1,7 @@ title: flask.json jsonify code examples category: page slug: flask-json-jsonify-examples -sortorder: 500021016 +sortorder: 500021018 toc: False sidebartitle: flask.json jsonify meta: Python example code for the jsonify function from the flask.json module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index f91b4062b..9832b0c9a 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -1,7 +1,7 @@ title: flask.sessions BadSignature code examples category: page slug: flask-sessions-badsignature-examples -sortorder: 500021017 +sortorder: 500021019 toc: False sidebartitle: flask.sessions BadSignature meta: Python example code for the BadSignature class from the flask.sessions module of the Flask project. @@ -210,3 +210,157 @@ class Role(db.Model): ``` + +## Example 3 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / utils.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./utils.py) + +```python +# utils.py +import abc +import base64 +import datetime +from functools import partial +import hashlib +import hmac +import time +from typing import Dict, List +import warnings +from datetime import timedelta +from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode +import urllib.request +import urllib.error + +from flask import _request_ctx_stack, current_app, flash, g, request, session, url_for +from flask.json import JSONEncoder +from flask_login import login_user as _login_user +from flask_login import logout_user as _logout_user +from flask_login import current_user +from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME +from flask_principal import AnonymousIdentity, Identity, identity_changed, Need +from flask_wtf import csrf +from wtforms import validators, ValidationError +~~from itsdangerous import BadSignature, SignatureExpired +from speaklater import is_lazy_string +from werkzeug.local import LocalProxy +from werkzeug.datastructures import MultiDict +from .quart_compat import best +from .signals import user_authenticated + +_security = LocalProxy(lambda: current_app.extensions["security"]) + +_datastore = LocalProxy(lambda: _security.datastore) + +_pwd_context = LocalProxy(lambda: _security.pwd_context) + +_hashing_context = LocalProxy(lambda: _security.hashing_context) + +localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) + +FsPermNeed = partial(Need, "fsperm") +FsPermNeed.__doc__ = """A need with the method preset to `"fsperm"`.""" + + +def _(translate): + return translate + + + + +## ... source file abbreviated to get to BadSignature examples ... + + + if config_value("EMAIL_PLAINTEXT"): + body = _security.render_template("%s/%s.txt" % ctx, **context) + if config_value("EMAIL_HTML"): + html = _security.render_template("%s/%s.html" % ctx, **context) + + sender = _security.email_sender + if isinstance(sender, LocalProxy): + sender = sender._get_current_object() + + _security._mail_util.send_mail( + template, subject, recipient, str(sender), body, html, context.get("user", None) + ) + + +def get_token_status(token, serializer, max_age=None, return_data=False): + serializer = getattr(_security, serializer + "_serializer") + max_age = get_max_age(max_age) + user, data = None, None + expired, invalid = False, False + + try: + data = serializer.loads(token, max_age=max_age) + except SignatureExpired: + d, data = serializer.loads_unsafe(token) + expired = True +~~ except (BadSignature, TypeError, ValueError): + invalid = True + + if data: + user = _datastore.find_user(fs_uniquifier=data[0]) + + expired = expired and (user is not None) + + if return_data: + return expired, invalid, user, data + else: + return expired, invalid, user + + +def check_and_get_token_status(token, serializer, within=None): + serializer = getattr(_security, serializer + "_serializer") + max_age = within.total_seconds() + data = None + expired, invalid = False, False + + try: + data = serializer.loads(token, max_age=max_age) + except SignatureExpired: + d, data = serializer.loads_unsafe(token) + expired = True +~~ except (BadSignature, TypeError, ValueError): + invalid = True + + return expired, invalid, data + + +def get_identity_attributes(app=None) -> List: + app = app or current_app + iattrs = app.config["SECURITY_USER_IDENTITY_ATTRIBUTES"] + if iattrs: + return [[*f][0] for f in iattrs] + return [] + + +def get_identity_attribute(attr, app=None) -> Dict: + app = app or current_app + iattrs = app.config["SECURITY_USER_IDENTITY_ATTRIBUTES"] + if iattrs: + details = [ + mapping[attr] for mapping in iattrs if list(mapping.keys())[0] == attr + ] + if details: + return details[0] + return {} + + + +## ... source file continues with no further BadSignature examples... + +``` + diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 67c22a4ae..e358fa4ac 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionInterface code examples category: page slug: flask-sessions-sessioninterface-examples -sortorder: 500021018 +sortorder: 500021020 toc: False sidebartitle: flask.sessions SessionInterface meta: Python example code for the SessionInterface class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index b4f1c7245..4d2092929 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -1,7 +1,7 @@ title: flask.signals got_request_exception code examples category: page slug: flask-signals-got-request-exception-examples -sortorder: 500021020 +sortorder: 500021022 toc: False sidebartitle: flask.signals got_request_exception meta: Python example code for the got_request_exception function from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index 51693ea5a..2d0dbc406 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -1,7 +1,7 @@ title: flask.signals Namespace code examples category: page slug: flask-signals-namespace-examples -sortorder: 500021019 +sortorder: 500021021 toc: False sidebartitle: flask.signals Namespace meta: Python example code for the Namespace class from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 73e306609..672d84387 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template_string code examples category: page slug: flask-templating-render-template-string-examples -sortorder: 500021022 +sortorder: 500021024 toc: False sidebartitle: flask.templating render_template_string meta: Python example code for the render_template_string function from the flask.templating module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 5e657e288..ab99a560d 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template code examples category: page slug: flask-templating-render-template-examples -sortorder: 500021021 +sortorder: 500021023 toc: False sidebartitle: flask.templating render_template meta: Python example code for the render_template function from the flask.templating module of the Flask project. @@ -794,7 +794,117 @@ def paySuccess(): ``` -## Example 9 from Flasky +## Example 9 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / core.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./core.py) + +```python +# core.py + +from datetime import datetime, timedelta +import warnings + +import pkg_resources +~~from flask import _request_ctx_stack, current_app, render_template +from flask_babelex import Domain +from flask_login import AnonymousUserMixin, LoginManager +from flask_login import UserMixin as BaseUserMixin +from flask_login import current_user +from flask_principal import Identity, Principal, RoleNeed, UserNeed, identity_loaded +from itsdangerous import URLSafeTimedSerializer +from passlib.context import CryptContext +from werkzeug.datastructures import ImmutableList +from werkzeug.local import LocalProxy + +from .decorators import ( + default_reauthn_handler, + default_unauthn_handler, + default_unauthz_handler, +) +from .forms import ( + ChangePasswordForm, + ConfirmRegisterForm, + ForgotPasswordForm, + LoginForm, + PasswordlessLoginForm, + RegisterForm, + ResetPasswordForm, + SendConfirmationForm, + + +## ... source file abbreviated to get to render_template examples ... + + + sms_service = cv("SMS_SERVICE", app=app) + if sms_service == "Twilio": # pragma: no cover + self._check_modules("twilio", "SMS") + if state.phone_util_cls == PhoneUtil: + self._check_modules("phonenumbers", "SMS") + + secrets = cv("TOTP_SECRETS", app=app) + issuer = cv("TOTP_ISSUER", app=app) + if not secrets or not issuer: + raise ValueError("Both TOTP_SECRETS and TOTP_ISSUER must be set") + state.totp_factory(state.totp_cls(secrets, issuer)) + + if cv("PASSWORD_COMPLEXITY_CHECKER", app=app) == "zxcvbn": + self._check_modules("zxcvbn", "PASSWORD_COMPLEXITY_CHECKER") + return state + + def _check_modules(self, module, config_name): # pragma: no cover + from importlib.util import find_spec + + module_exists = find_spec(module) + if not module_exists: + raise ValueError(f"{module} is required for {config_name}") + + return module_exists + +~~ def render_template(self, *args, **kwargs): +~~ return render_template(*args, **kwargs) + + def render_json(self, cb): + self._state._render_json = cb + + def want_json(self, fn): + self._state._want_json = fn + + def unauthz_handler(self, cb): + self._state._unauthz_handler = cb + + def unauthn_handler(self, cb): + self._state._unauthn_handler = cb + + def reauthn_handler(self, cb): + self._state._reauthn_handler = cb + + def password_validator(self, cb): + self._state._password_validator = cb + + def __getattr__(self, name): + return getattr(self._state, name, None) + + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 10 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -834,7 +944,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 10 from Datadog Flask Example App +## Example 11 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -936,7 +1046,7 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 11 from newspie +## Example 12 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1091,7 +1201,7 @@ if __name__ == '__main__': ``` -## Example 12 from tedivms-flask +## Example 13 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 05e841dd5..3053f90c1 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -1,7 +1,7 @@ title: flask.views http_method_funcs code examples category: page slug: flask-views-http-method-funcs-examples -sortorder: 500021025 +sortorder: 500021027 toc: False sidebartitle: flask.views http_method_funcs meta: Python example code for the http_method_funcs function from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 44f6c0830..0b0510547 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -1,7 +1,7 @@ title: flask.views MethodView code examples category: page slug: flask-views-methodview-examples -sortorder: 500021023 +sortorder: 500021025 toc: False sidebartitle: flask.views MethodView meta: Python example code for the MethodView class from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index b7963d606..8ef176e62 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -1,7 +1,7 @@ title: flask.views View code examples category: page slug: flask-views-view-examples -sortorder: 500021024 +sortorder: 500021026 toc: False sidebartitle: flask.views View meta: Python example code for the View class from the flask.views module of the Flask project. diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html index 6efa389ba..b88ee4edb 100644 --- a/theme/templates/code-examples/flask.html +++ b/theme/templates/code-examples/flask.html @@ -18,6 +18,7 @@

flask.cli with_appcontext

flask.ctx + after_this_request, has_app_context, has_request_context

@@ -33,6 +34,7 @@

flask.helpers url_for

flask.json + JSONEncoder, jsonify

flask.sessions From 5996ef9a1eaa0457f3e0b0ce7052b633fe0e2a39 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 27 Jun 2020 07:55:14 -0400 Subject: [PATCH 140/302] update changelog --- content/pages/meta/00-change-log.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 5c1ad6d3c..ea439b483 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -60,9 +60,11 @@ on GitHub. [ungettext_lazy](/django-utils-translation-ungettext-lazy-examples.html) * Added new example code pages for Flask modules: * flask.blueprints [Blueprint](/flask-blueprints-blueprint-examples.html) - * flask.ctx [has_app_context](/flask-ctx-has-app-context-examples.html) and + * flask.ctx [after_this_request](/flask-ctx-after-this-request-examples.html), + [has_app_context](/flask-ctx-has-app-context-examples.html) and [has_request_context](/flask-ctx-has-request-context-examples.html) * flask.globals [current_app](/flask-globals-current-app-examples.html) + * flask.json [JSONEncoder](/flask-json-jsonencoder-examples.html) * flask.sessions [BadSignature](/flask-sessions-badsignature-examples.html) ### May From 14a32f0edc48c14cfba0533ffe78b599b7ae184b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 27 Jun 2020 08:11:02 -0400 Subject: [PATCH 141/302] add more flask code examples --- .../examples/flask/flask-app-flask.markdown | 91 +++- .../flask/flask-blueprints-blueprint.markdown | 111 +++- .../flask/flask-extensions-plug-ins.markdown | 13 + .../flask/flask-globals-current-app.markdown | 113 ++++- .../examples/flask/flask-globals-g.markdown | 99 +++- .../flask/flask-globals-request.markdown | 70 ++- .../flask/flask-globals-session.markdown | 110 +++- .../flask/flask-helpers-flash.markdown | 475 +++++++++++++++++- .../flask/flask-helpers-url-for.markdown | 153 +++++- .../flask/flask-signals-namespace.markdown | 50 ++ ...templating-render-template-string.markdown | 105 +++- .../flask-templating-render-template.markdown | 100 +++- theme/templates/code-examples/flask.html | 2 +- 13 files changed, 1469 insertions(+), 23 deletions(-) diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index d2f6ab7c2..236bf9c6e 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -457,7 +457,90 @@ from app.models import User ``` -## Example 8 from Flasky +## Example 8 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / user_manager.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./user_manager.py) + +```python +# user_manager.py + + +import datetime + +~~from flask import abort, Blueprint, current_app, Flask, session +from flask_login import LoginManager +from wtforms import ValidationError + +from . import ConfigError +from . import forms +from .db_manager import DBManager +from .email_manager import EmailManager +from .password_manager import PasswordManager +from .token_manager import TokenManager +from .translation_utils import lazy_gettext as _ # map _() to lazy_gettext() +from .user_manager__settings import UserManager__Settings +from .user_manager__utils import UserManager__Utils +from .user_manager__views import UserManager__Views + + +class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views): + + def __init__(self, app, db, UserClass, **kwargs): + + self.app = app + if app: + self.init_app(app, db, UserClass, **kwargs) + + def init_app( + self, app, db, UserClass, + UserInvitationClass=None, + UserEmailClass=None, + RoleClass=None, # Only used for testing + ): + +~~ if not isinstance(app, Flask): + raise TypeError("flask_user.UserManager.init_app(): Parameter 'app' is an instance of class '%s' " + "instead of a subclass of class 'flask.Flask'." + % app.__class__.__name__) + + app.user_manager = self + + self.db = db + + for attrib_name in dir(self): + if attrib_name[0:5] == 'USER_': + default_value = getattr(UserManager, attrib_name) + setattr(self, attrib_name, app.config.get(attrib_name, default_value)) + + if not self.USER_EMAIL_SENDER_EMAIL: + default_sender = app.config.get('DEFAULT_MAIL_SENDER', None) + default_sender = app.config.get('MAIL_DEFAULT_SENDER', default_sender) + if default_sender: + if default_sender[-1:] == '>': + start = default_sender.rfind('<') + if start >= 1: + self.USER_EMAIL_SENDER_EMAIL = default_sender[start + 1:-1] + if not self.USER_EMAIL_SENDER_NAME: + self.USER_EMAIL_SENDER_NAME = default_sender[0:start].strip(' "') + else: + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 9 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -521,7 +604,7 @@ def create_app(config_name): ``` -## Example 9 from Datadog Flask Example App +## Example 10 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -582,7 +665,7 @@ def before_request(): ``` -## Example 10 from sandman2 +## Example 11 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -663,7 +746,7 @@ def get_app( ``` -## Example 11 from tedivms-flask +## Example 12 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 1c1f44d29..4c270de83 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -549,7 +549,114 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 8 from Datadog Flask Example App +## Example 8 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / user_manager.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./user_manager.py) + +```python +# user_manager.py + + +import datetime + +~~from flask import abort, Blueprint, current_app, Flask, session +from flask_login import LoginManager +from wtforms import ValidationError + +from . import ConfigError +from . import forms +from .db_manager import DBManager +from .email_manager import EmailManager +from .password_manager import PasswordManager +from .token_manager import TokenManager +from .translation_utils import lazy_gettext as _ # map _() to lazy_gettext() +from .user_manager__settings import UserManager__Settings +from .user_manager__utils import UserManager__Utils +from .user_manager__views import UserManager__Views + + +class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views): + + def __init__(self, app, db, UserClass, **kwargs): + + self.app = app + if app: + self.init_app(app, db, UserClass, **kwargs) + + def init_app( + + +## ... source file abbreviated to get to Blueprint examples ... + + + + @self.login_manager.user_loader + def load_user_by_user_token(user_token): + user = self.db_manager.UserClass.get_user_by_token(user_token) + return user + + self.babel = app.extensions.get('babel', None) + from .translation_utils import init_translations + init_translations(self.babel) + + if not hasattr(app.jinja_env, 'install_gettext_callables'): + app.jinja_env.add_extension('jinja2.ext.i18n') + app.jinja_env.install_null_translations() + + def flask_user_context_processor(): + def call_or_get(function_or_property): + return function_or_property() if callable(function_or_property) else function_or_property + + return dict( + user_manager=current_app.user_manager, + call_or_get=call_or_get, + ) + + app.context_processor(flask_user_context_processor) + +~~ blueprint = Blueprint('flask_user', __name__, template_folder='templates') + app.register_blueprint(blueprint) + + self.AddEmailFormClass = forms.AddEmailForm + self.ChangePasswordFormClass = forms.ChangePasswordForm + self.ChangeUsernameFormClass = forms.ChangeUsernameForm + self.EditUserProfileFormClass = forms.EditUserProfileForm + self.ForgotPasswordFormClass = forms.ForgotPasswordForm + self.InviteUserFormClass = forms.InviteUserForm + self.LoginFormClass = forms.LoginForm + self.RegisterFormClass = forms.RegisterForm + self.ResendEmailConfirmationFormClass = forms.ResendEmailConfirmationForm + self.ResetPasswordFormClass = forms.ResetPasswordForm + + self.db_manager = DBManager(app, db, UserClass, UserEmailClass, UserInvitationClass, RoleClass) + + self.password_manager = PasswordManager(app) + + if self.USER_ENABLE_EMAIL: + from .email_adapters.smtp_email_adapter import SMTPEmailAdapter + self.email_adapter = SMTPEmailAdapter(app) + + if self.USER_ENABLE_EMAIL: + self.email_manager = EmailManager(app) + + + +## ... source file continues with no further Blueprint examples... + +``` + + +## Example 9 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -596,7 +703,7 @@ def bp_after_request(response): ``` -## Example 9 from tedivms-flask +## Example 10 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown index f32958cb6..e0af09567 100644 --- a/content/pages/examples/flask/flask-extensions-plug-ins.markdown +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -118,6 +118,19 @@ The Flask-Security-Too project is provided as open source under the [MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). +### Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + + ### Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 95c935af7..5e2b5769c 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -1889,7 +1889,114 @@ _default_config = { ``` -## Example 12 from Flasky +## Example 12 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / user_manager.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./user_manager.py) + +```python +# user_manager.py + + +import datetime + +~~from flask import abort, Blueprint, current_app, Flask, session +from flask_login import LoginManager +from wtforms import ValidationError + +from . import ConfigError +from . import forms +from .db_manager import DBManager +from .email_manager import EmailManager +from .password_manager import PasswordManager +from .token_manager import TokenManager +from .translation_utils import lazy_gettext as _ # map _() to lazy_gettext() +from .user_manager__settings import UserManager__Settings +from .user_manager__utils import UserManager__Utils +from .user_manager__views import UserManager__Views + + +class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views): + + def __init__(self, app, db, UserClass, **kwargs): + + self.app = app + if app: + self.init_app(app, db, UserClass, **kwargs) + + def init_app( + + +## ... source file abbreviated to get to current_app examples ... + + + def advance_session_timeout(): + session.permanent = True # Timeout after app.permanent_session_lifetime period + session.modified = True # Advance session timeout each time a user visits a page + + self.login_manager = LoginManager(app) + self.login_manager.login_view = 'user.login' + + @self.login_manager.user_loader + def load_user_by_user_token(user_token): + user = self.db_manager.UserClass.get_user_by_token(user_token) + return user + + self.babel = app.extensions.get('babel', None) + from .translation_utils import init_translations + init_translations(self.babel) + + if not hasattr(app.jinja_env, 'install_gettext_callables'): + app.jinja_env.add_extension('jinja2.ext.i18n') + app.jinja_env.install_null_translations() + + def flask_user_context_processor(): + def call_or_get(function_or_property): + return function_or_property() if callable(function_or_property) else function_or_property + + return dict( +~~ user_manager=current_app.user_manager, + call_or_get=call_or_get, + ) + + app.context_processor(flask_user_context_processor) + + blueprint = Blueprint('flask_user', __name__, template_folder='templates') + app.register_blueprint(blueprint) + + self.AddEmailFormClass = forms.AddEmailForm + self.ChangePasswordFormClass = forms.ChangePasswordForm + self.ChangeUsernameFormClass = forms.ChangeUsernameForm + self.EditUserProfileFormClass = forms.EditUserProfileForm + self.ForgotPasswordFormClass = forms.ForgotPasswordForm + self.InviteUserFormClass = forms.InviteUserForm + self.LoginFormClass = forms.LoginForm + self.RegisterFormClass = forms.RegisterForm + self.ResendEmailConfirmationFormClass = forms.ResendEmailConfirmationForm + self.ResetPasswordFormClass = forms.ResetPasswordForm + + self.db_manager = DBManager(app, db, UserClass, UserEmailClass, UserInvitationClass, RoleClass) + + self.password_manager = PasswordManager(app) + + if self.USER_ENABLE_EMAIL: + + +## ... source file continues with no further current_app examples... + +``` + + +## Example 13 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1944,7 +2051,7 @@ def run_migrations_online(): ``` -## Example 13 from sandman2 +## Example 14 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2069,7 +2176,7 @@ def register_model(cls, admin=None): ``` -## Example 14 from tedivms-flask +## Example 15 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 77a6e4e26..855724a61 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -750,7 +750,104 @@ def check_and_update_authn_fresh(within, grace, method=None): ``` -## Example 6 from tedivms-flask +## Example 6 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / decorators.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./decorators.py) + +```python +# decorators.py + + +from functools import wraps +~~from flask import current_app, g +from flask_login import current_user + +def _is_logged_in_with_confirmed_email(user_manager): + if user_manager.call_or_get(current_user.is_authenticated): + unconfirmed_email_allowed = \ + getattr(g, '_flask_user_allow_unconfirmed_email', False) + + if unconfirmed_email_allowed or user_manager.db_manager.user_has_confirmed_email(current_user): + return True + + return False + + +def login_required(view_function): + @wraps(view_function) # Tells debuggers that is is a function wrapper + def decorator(*args, **kwargs): + user_manager = current_app.user_manager + + allowed = _is_logged_in_with_confirmed_email(user_manager) + if not allowed: + return user_manager.unauthenticated_view() + + return view_function(*args, **kwargs) + + + +## ... source file abbreviated to get to g examples ... + + +def roles_required(*role_names): + def wrapper(view_function): + + @wraps(view_function) # Tells debuggers that is is a function wrapper + def decorator(*args, **kwargs): + user_manager = current_app.user_manager + + allowed = _is_logged_in_with_confirmed_email(user_manager) + if not allowed: + return user_manager.unauthenticated_view() + + if not current_user.has_roles(*role_names): + return user_manager.unauthorized_view() + + return view_function(*args, **kwargs) + + return decorator + + return wrapper + + + +def allow_unconfirmed_email(view_function): + @wraps(view_function) # Tells debuggers that is is a function wrapper + def decorator(*args, **kwargs): +~~ g._flask_user_allow_unconfirmed_email = True + + try: + user_manager = current_app.user_manager + + allowed = _is_logged_in_with_confirmed_email(user_manager) + if not allowed: + return user_manager.unauthenticated_view() + + return view_function(*args, **kwargs) + + finally: +~~ g._flask_user_allow_unconfirmed_email = False + + return decorator + + + +## ... source file continues with no further g examples... + +``` + + +## Example 7 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 8e026e352..f7fa4402a 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -1786,7 +1786,71 @@ class ChangePasswordForm(Form, PasswordFormMixin): ``` -## Example 11 from newspie +## Example 11 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / translation_utils.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./translation_utils.py) + +```python +# translation_utils.py + + +import os +~~from flask import request + +_translations_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'translations') + +try: + from flask_babelex import Domain + + domain_translations = Domain(_translations_dir, domain='flask_user') +except ImportError: + domain_translations = None + +def gettext(string, **variables): + return domain_translations.gettext(string, **variables) if domain_translations else string % variables + +def lazy_gettext(string, **variables): + return domain_translations.lazy_gettext(string, **variables) if domain_translations else string % variables + +def get_language_codes(): + language_codes = [] + for folder in os.listdir(_translations_dir): + locale_dir = os.path.join(_translations_dir, folder, 'LC_MESSAGES') + if not os.path.isdir(locale_dir): + continue + language_codes.append(folder) + return language_codes + +def init_translations(babel): + if babel: + babel._default_domain = domain_translations + + if babel.locale_selector_func is None: + def get_locale(): + available_language_codes = get_language_codes() +~~ language_code = request.accept_languages.best_match(available_language_codes) + return language_code + + babel.locale_selector_func = get_locale + + + +## ... source file continues with no further request examples... + +``` + + +## Example 12 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1967,7 +2031,7 @@ if __name__ == '__main__': ``` -## Example 12 from sandman2 +## Example 13 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2168,7 +2232,7 @@ class Service(MethodView): ``` -## Example 13 from tedivms-flask +## Example 14 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index f03f1637b..46b34a7eb 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -747,7 +747,115 @@ def tf_send_security_token(user, method, totp_secret, phone_number): ``` -## Example 8 from tedivms-flask +## Example 8 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / user_manager.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./user_manager.py) + +```python +# user_manager.py + + +import datetime + +~~from flask import abort, Blueprint, current_app, Flask, session +from flask_login import LoginManager +from wtforms import ValidationError + +from . import ConfigError +from . import forms +from .db_manager import DBManager +from .email_manager import EmailManager +from .password_manager import PasswordManager +from .token_manager import TokenManager +from .translation_utils import lazy_gettext as _ # map _() to lazy_gettext() +from .user_manager__settings import UserManager__Settings +from .user_manager__utils import UserManager__Utils +from .user_manager__views import UserManager__Views + + +class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views): + + def __init__(self, app, db, UserClass, **kwargs): + + self.app = app + if app: + self.init_app(app, db, UserClass, **kwargs) + + def init_app( + + +## ... source file abbreviated to get to session examples ... + + + if attrib_name[0:5] == 'USER_': + default_value = getattr(UserManager, attrib_name) + setattr(self, attrib_name, app.config.get(attrib_name, default_value)) + + if not self.USER_EMAIL_SENDER_EMAIL: + default_sender = app.config.get('DEFAULT_MAIL_SENDER', None) + default_sender = app.config.get('MAIL_DEFAULT_SENDER', default_sender) + if default_sender: + if default_sender[-1:] == '>': + start = default_sender.rfind('<') + if start >= 1: + self.USER_EMAIL_SENDER_EMAIL = default_sender[start + 1:-1] + if not self.USER_EMAIL_SENDER_NAME: + self.USER_EMAIL_SENDER_NAME = default_sender[0:start].strip(' "') + else: + self.USER_EMAIL_SENDER_EMAIL = default_sender + + if not self.USER_EMAIL_SENDER_NAME: + self.USER_EMAIL_SENDER_NAME = self.USER_APP_NAME + + if self.USER_USER_SESSION_EXPIRATION: + app.permanent_session_lifetime = datetime.timedelta(seconds=self.USER_USER_SESSION_EXPIRATION) + + @app.before_request + def advance_session_timeout(): +~~ session.permanent = True # Timeout after app.permanent_session_lifetime period +~~ session.modified = True # Advance session timeout each time a user visits a page + + self.login_manager = LoginManager(app) + self.login_manager.login_view = 'user.login' + + @self.login_manager.user_loader + def load_user_by_user_token(user_token): + user = self.db_manager.UserClass.get_user_by_token(user_token) + return user + + self.babel = app.extensions.get('babel', None) + from .translation_utils import init_translations + init_translations(self.babel) + + if not hasattr(app.jinja_env, 'install_gettext_callables'): + app.jinja_env.add_extension('jinja2.ext.i18n') + app.jinja_env.install_null_translations() + + def flask_user_context_processor(): + def call_or_get(function_or_property): + return function_or_property() if callable(function_or_property) else function_or_property + + return dict( + user_manager=current_app.user_manager, + call_or_get=call_or_get, + + +## ... source file continues with no further session examples... + +``` + + +## Example 9 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index cddfd69e1..81fdf7ae5 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -869,7 +869,480 @@ def transform_url(url, qparams=None, **kwargs): ``` -## Example 7 from tedivms-flask +## Example 7 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / user_manager__views.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./user_manager__views.py) + +```python +# user_manager__views.py + + +from datetime import datetime +try: + from urllib.parse import quote, unquote # Python 3 +except ImportError: + from urllib import quote, unquote # Python 2 + +~~from flask import current_app, flash, redirect, render_template, request, url_for +from flask_login import current_user, login_user, logout_user + +from .decorators import login_required +from . import signals +from .translation_utils import gettext as _ # map _() to gettext() + + +class UserManager__Views(object): + + + @login_required + def change_password_view(self): + + form = self.ChangePasswordFormClass(request.form) + + if request.method == 'POST': + if not form.validate(): +~~ flash(_('There was an error changing your password.'), 'error') + return redirect(url_for('user.change_password')) + + new_password = form.new_password.data + password_hash = self.hash_password(new_password) + + current_user.password = password_hash + self.db_manager.save_object(current_user) + self.db_manager.commit() + + if self.USER_ENABLE_EMAIL and self.USER_SEND_PASSWORD_CHANGED_EMAIL: + self.email_manager.send_password_changed_email(current_user) + + signals.user_changed_password.send(current_app._get_current_object(), user=current_user) + +~~ flash(_('Your password has been changed successfully.'), 'success') + + safe_next_url = self._get_safe_next_url('next', self.USER_AFTER_CHANGE_PASSWORD_ENDPOINT) + return redirect(safe_next_url) + + self.prepare_domain_translations() + return render_template(self.USER_CHANGE_PASSWORD_TEMPLATE, form=form) + + + @login_required + def change_username_view(self): + + form = self.ChangeUsernameFormClass(request.form) + + if request.method == 'POST' and form.validate(): + + new_username = form.new_username.data + current_user.username=new_username + self.db_manager.save_object(current_user) + self.db_manager.commit() + + if self.USER_ENABLE_EMAIL and self.USER_SEND_USERNAME_CHANGED_EMAIL: + self.email_manager.send_username_changed_email(current_user) + + signals.user_changed_username.send(current_app._get_current_object(), user=current_user) + +~~ flash(_("Your username has been changed to '%(username)s'.", username=new_username), 'success') + + safe_next_url = self._get_safe_next_url('next', self.USER_AFTER_CHANGE_USERNAME_ENDPOINT) + return redirect(safe_next_url) + + self.prepare_domain_translations() + return render_template(self.USER_CHANGE_USERNAME_TEMPLATE, form=form) + + + def confirm_email_view(self, token): + data_items = self.token_manager.verify_token( + token, + self.USER_CONFIRM_EMAIL_EXPIRATION) + + user = None + user_email = None + if data_items: + user, user_email = self.db_manager.get_user_and_user_email_by_id(data_items[0]) + + if not user or not user_email: +~~ flash(_('Invalid confirmation token.'), 'error') + return redirect(url_for('user.login')) + + user_email.email_confirmed_at=datetime.utcnow() + self.db_manager.save_user_and_user_email(user, user_email) + self.db_manager.commit() + + signals.user_confirmed_email.send(current_app._get_current_object(), user=user) + +~~ flash(_('Your email has been confirmed.'), 'success') + + safe_next_url = self._get_safe_next_url('next', self.USER_AFTER_CONFIRM_ENDPOINT) + if self.USER_AUTO_LOGIN_AFTER_CONFIRM: + return self._do_login_user(user, safe_next_url) # auto-login + else: + return redirect(url_for('user.login') + '?next=' + quote(safe_next_url)) # redirect to login page + + + @login_required + def edit_user_profile_view(self): + form = self.EditUserProfileFormClass(request.form, obj=current_user) + + if request.method == 'POST' and form.validate(): + form.populate_obj(current_user) + + self.db_manager.save_object(current_user) + self.db_manager.commit() + + return redirect(self._endpoint_url(self.USER_AFTER_EDIT_USER_PROFILE_ENDPOINT)) + + self.prepare_domain_translations() + return render_template(self.USER_EDIT_USER_PROFILE_TEMPLATE, form=form) + + @login_required + + +## ... source file abbreviated to get to flash examples ... + + + user_email.is_primary=True + self.db_manager.save_object(user_email) + self.db_manager.commit() + + elif action == 'confirm': + self._send_confirm_email_email(user_email.user, user_email) + else: + return self.unauthorized_view() + + return redirect(url_for('user.manage_emails')) + + + def forgot_password_view(self): + + form = self.ForgotPasswordFormClass(request.form) + + if request.method == 'POST' and form.validate(): + email = form.email.data + user, user_email = self.db_manager.get_user_and_user_email_by_email(email) + + if user and user_email: + self.email_manager.send_reset_password_email(user, user_email) + + signals.user_forgot_password.send(current_app._get_current_object(), user=user) + +~~ flash(_( + "A reset password email has been sent to '%(email)s'. Open that email and follow the instructions to reset your password.", + email=email), 'success') + + return redirect(self._endpoint_url(self.USER_AFTER_FORGOT_PASSWORD_ENDPOINT)) + + self.prepare_domain_translations() + return render_template(self.USER_FORGOT_PASSWORD_TEMPLATE, form=form) + + @login_required + def manage_emails_view(self): + + user_emails = self.db_manager.find_user_emails(user=current_user) + form = self.AddEmailFormClass() + + if request.method == "POST" and form.validate(): + new_email = form.email.data + user_email = self.db_manager.add_user_email(user=current_user, email=new_email) + self.db_manager.save_object(user_email) + self.db_manager.commit() + return redirect(url_for('user.manage_emails')) + + self.prepare_domain_translations() + return render_template(self.USER_MANAGE_EMAILS_TEMPLATE, + user_emails=user_emails, + form=form, + ) + + @login_required + def invite_user_view(self): + + invite_user_form = self.InviteUserFormClass(request.form) + + if request.method == 'POST' and invite_user_form.validate(): + email = invite_user_form.email.data + user, user_email = self.db_manager.get_user_and_user_email_by_email(email) + if user: +~~ flash("User with that email has already registered", "error") + return redirect(url_for('user.invite_user')) + + user_invitation = self.db_manager.add_user_invitation( + email=email, + invited_by_user_id=current_user.id) + self.db_manager.commit() + + try: + self.email_manager.send_invite_user_email(current_user, user_invitation) + except Exception as e: + self.db_manager.delete_object(user_invitation) + self.db_manager.commit() + raise + + signals \ + .user_sent_invitation \ + .send(current_app._get_current_object(), user_invitation=user_invitation, + form=invite_user_form) + +~~ flash(_('Invitation has been sent.'), 'success') + + safe_next_url = self._get_safe_next_url('next', self.USER_AFTER_INVITE_ENDPOINT) + return redirect(safe_next_url) + + self.prepare_domain_translations() + return render_template(self.USER_INVITE_USER_TEMPLATE, form=invite_user_form) + + + def login_view(self): + + + safe_next_url = self._get_safe_next_url('next', self.USER_AFTER_LOGIN_ENDPOINT) + safe_reg_next = self._get_safe_next_url('reg_next', self.USER_AFTER_REGISTER_ENDPOINT) + + if self.call_or_get(current_user.is_authenticated) and self.USER_AUTO_LOGIN_AT_LOGIN: + return redirect(safe_next_url) + + login_form = self.LoginFormClass(request.form) # for login.html + register_form = self.RegisterFormClass() # for login_or_register.html + if request.method != 'POST': + login_form.next.data = register_form.next.data = safe_next_url + login_form.reg_next.data = register_form.reg_next.data = safe_reg_next + + if request.method == 'POST' and login_form.validate(): + + +## ... source file abbreviated to get to flash examples ... + + + if self.USER_ENABLE_USERNAME: + user = self.db_manager.find_user_by_username(login_form.username.data) + + if not user and self.USER_ENABLE_EMAIL: + user, user_email = self.db_manager.get_user_and_user_email_by_email(login_form.username.data) + else: + user, user_email = self.db_manager.get_user_and_user_email_by_email(login_form.email.data) + + if user: + safe_next_url = self.make_safe_url(login_form.next.data) + return self._do_login_user(user, safe_next_url, login_form.remember_me.data) + + self.prepare_domain_translations() + template_filename = self.USER_LOGIN_AUTH0_TEMPLATE if self.USER_ENABLE_AUTH0 else self.USER_LOGIN_TEMPLATE + return render_template(template_filename, + form=login_form, + login_form=login_form, + register_form=register_form) + + def logout_view(self): + + signals.user_logged_out.send(current_app._get_current_object(), user=current_user) + + logout_user() + +~~ flash(_('You have signed out successfully.'), 'success') + + safe_next_url = self._get_safe_next_url('next', self.USER_AFTER_LOGOUT_ENDPOINT) + return redirect(safe_next_url) + + def register_view(self): + + safe_next_url = self._get_safe_next_url('next', self.USER_AFTER_LOGIN_ENDPOINT) + safe_reg_next_url = self._get_safe_next_url('reg_next', self.USER_AFTER_REGISTER_ENDPOINT) + + login_form = self.LoginFormClass() # for login_or_register.html + register_form = self.RegisterFormClass(request.form) # for register.html + + invite_token = request.values.get("token") + + if self.USER_REQUIRE_INVITATION and not invite_token: +~~ flash("Registration is invite only", "error") + return redirect(url_for('user.login')) + + user_invitation = None + if invite_token and self.db_manager.UserInvitationClass: + data_items = self.token_manager.verify_token(invite_token, self.USER_INVITE_EXPIRATION) + if data_items: + user_invitation_id = data_items[0] + user_invitation = self.db_manager.get_user_invitation_by_id(user_invitation_id) + + if not user_invitation: +~~ flash("Invalid invitation token", "error") + return redirect(url_for('user.login')) + + register_form.invite_token.data = invite_token + + if request.method != 'POST': + login_form.next.data = register_form.next.data = safe_next_url + login_form.reg_next.data = register_form.reg_next.data = safe_reg_next_url + if user_invitation: + register_form.email.data = user_invitation.email + + if request.method == 'POST' and register_form.validate(): + user = self.db_manager.add_user() + register_form.populate_obj(user) + user_email = self.db_manager.add_user_email(user=user, is_primary=True) + register_form.populate_obj(user_email) + + user.password = self.hash_password(user.password) + + request_email_confirmation = self.USER_ENABLE_CONFIRM_EMAIL + if user_invitation: + if user_invitation.email.lower() == register_form.email.data.lower(): + user_email.email_confirmed_at=datetime.utcnow() + request_email_confirmation = False + + + +## ... source file abbreviated to get to flash examples ... + + + + self.prepare_domain_translations() + return render_template(self.USER_RESEND_CONFIRM_EMAIL_TEMPLATE, form=form) + + + def reset_password_view(self, token): + + if self.call_or_get(current_user.is_authenticated): + logout_user() + + data_items = self.token_manager.verify_token( + token, + self.USER_RESET_PASSWORD_EXPIRATION) + + user = None + if data_items: + user_id = data_items[0] + user = self.db_manager.get_user_by_id(user_id) + + user_or_user_email_object = self.db_manager.get_primary_user_email_object(user) + user_or_user_email_object.email_confirmed_at = datetime.utcnow() + self.db_manager.save_object(user_or_user_email_object) + self.db_manager.commit() + + if not user: +~~ flash(_('Your reset password token is invalid.'), 'error') + return redirect(self._endpoint_url('user.login')) + + + form = self.ResetPasswordFormClass(request.form) + + if request.method == 'POST' and form.validate(): + password_hash = self.hash_password(form.new_password.data) + user.password=password_hash + self.db_manager.save_object(user) + self.db_manager.commit() + + if self.USER_ENABLE_EMAIL and self.USER_SEND_PASSWORD_CHANGED_EMAIL: + self.email_manager.send_password_changed_email(user) + + signals.user_reset_password.send(current_app._get_current_object(), user=user) + +~~ flash(_("Your password has been reset successfully."), 'success') + + safe_next_url = self._get_safe_next_url('next', self.USER_AFTER_RESET_PASSWORD_ENDPOINT) + if self.USER_AUTO_LOGIN_AFTER_RESET_PASSWORD: + return self._do_login_user(user, safe_next_url) # auto-login + else: + return redirect(url_for('user.login') + '?next=' + quote(safe_next_url)) # redirect to login page + + self.prepare_domain_translations() + return render_template(self.USER_RESET_PASSWORD_TEMPLATE, form=form) + + def unauthenticated_view(self): + url = request.url +~~ flash(_("You must be signed in to access '%(url)s'.", url=url), 'error') + + safe_next_url = self.make_safe_url(url) + return redirect(self._endpoint_url(self.USER_UNAUTHENTICATED_ENDPOINT)+'?next='+quote(safe_next_url)) + + + def unauthorized_view(self): + url = request.script_root + request.path +~~ flash(_("You do not have permission to access '%(url)s'.", url=url), 'error') + + return redirect(self._endpoint_url(self.USER_UNAUTHORIZED_ENDPOINT)) + + + + def _send_registered_email(self, user, user_email, request_email_confirmation): + um = current_app.user_manager + + if self.USER_ENABLE_EMAIL and self.USER_SEND_REGISTERED_EMAIL: + + self.email_manager.send_registered_email(user, user_email, request_email_confirmation) + + if request_email_confirmation: + email = user_email.email if user_email else user.email +~~ flash(_('A confirmation email has been sent to %(email)s with instructions to complete your registration.', email=email), 'success') + else: +~~ flash(_('You have registered successfully.'), 'success') + + + def _send_confirm_email_email(self, user, user_email): + + if self.USER_ENABLE_EMAIL and self.USER_ENABLE_CONFIRM_EMAIL: + self.email_manager.send_confirm_email_email(user, user_email) + + email = user_email.email if user_email else user.email +~~ flash(_('A confirmation email has been sent to %(email)s with instructions to complete your registration.', email=email), 'success') + + + def _do_login_user(self, user, safe_next_url, remember_me=False): + if not user: return self.unauthenticated() + + if not user.active: +~~ flash(_('Your account has not been enabled.'), 'error') + return redirect(url_for('user.login')) + + if self.USER_ENABLE_EMAIL \ + and self.USER_ENABLE_CONFIRM_EMAIL \ + and not current_app.user_manager.USER_ALLOW_LOGIN_WITHOUT_CONFIRMED_EMAIL \ + and not self.db_manager.user_has_confirmed_email(user): + url = url_for('user.resend_email_confirmation') +~~ flash(_('Your email address has not yet been confirmed. Check your email Inbox and Spam folders for the confirmation email or Re-send confirmation email.', url=url), 'error') + return redirect(url_for('user.login')) + + login_user(user, remember=remember_me) + + signals.user_logged_in.send(current_app._get_current_object(), user=user) + +~~ flash(_('You have signed in successfully.'), 'success') + + return redirect(safe_next_url) + + + def _get_safe_next_url(self, param_name, default_endpoint): + + if param_name in request.args: + safe_next_url = current_app.user_manager.make_safe_url(unquote(request.args[param_name])) + + else: + safe_next_url = self._endpoint_url(default_endpoint) + + return safe_next_url + + + def _endpoint_url(self, endpoint): + return url_for(endpoint) if endpoint else '/' + + + +## ... source file continues with no further flash examples... + +``` + + +## Example 8 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 642641758..f00c380f1 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -708,7 +708,156 @@ def get_post_action_redirect(config_key, declared=None): ``` -## Example 9 from Flasky +## Example 9 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / email_manager.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./email_manager.py) + +```python +# email_manager.py + + +~~from flask import render_template, url_for + +from flask_user import ConfigError + +class EmailManager(object): + + def __init__(self, app): + self.app = app + self.user_manager = app.user_manager + self.sender_name = self.user_manager.USER_EMAIL_SENDER_NAME + self.sender_email = self.user_manager.USER_EMAIL_SENDER_EMAIL + + if not self.sender_email: + raise ConfigError('Config setting USER_EMAIL_SENDER_EMAIL is missing.') + + if '@' not in self.sender_email: + raise ConfigError('Config setting USER_EMAIL_SENDER_EMAIL is not a valid email address.') + + + def send_confirm_email_email(self, user, user_email): + + if not self.user_manager.USER_ENABLE_EMAIL: return + if not self.user_manager.USER_ENABLE_CONFIRM_EMAIL: return + + email = user_email.email if user_email else user.email + + object_id = user_email.id if user_email else user.id + token = self.user_manager.generate_token(object_id) +~~ confirm_email_link = url_for('user.confirm_email', token=token, _external=True) + + self._render_and_send_email( + email, + user, + self.user_manager.USER_CONFIRM_EMAIL_TEMPLATE, + confirm_email_link=confirm_email_link, + ) + + def send_password_changed_email(self, user): + + if not self.user_manager.USER_ENABLE_EMAIL: return + if not self.user_manager.USER_SEND_PASSWORD_CHANGED_EMAIL: return + + user_or_user_email_object = self.user_manager.db_manager.get_primary_user_email_object(user) + email = user_or_user_email_object.email + + self._render_and_send_email( + email, + user, + self.user_manager.USER_PASSWORD_CHANGED_EMAIL_TEMPLATE, + ) + + def send_reset_password_email(self, user, user_email): + + if not self.user_manager.USER_ENABLE_EMAIL: return + assert self.user_manager.USER_ENABLE_FORGOT_PASSWORD + + email = user_email.email if user_email else user.email + + token = self.user_manager.generate_token(user.id) +~~ reset_password_link = url_for('user.reset_password', token=token, _external=True) + + self._render_and_send_email( + email, + user, + self.user_manager.USER_RESET_PASSWORD_EMAIL_TEMPLATE, + reset_password_link=reset_password_link, + ) + + def send_invite_user_email(self, user, user_invitation): + + if not self.user_manager.USER_ENABLE_EMAIL: return + if not self.user_manager.USER_ENABLE_INVITE_USER: return + + invited_by_user = user + + email = user_invitation.email + + user = self.user_manager.db_manager.UserClass(email=email) + + token = self.user_manager.generate_token(user_invitation.id) +~~ accept_invitation_link = url_for('user.register', token=token, _external=True) + + self._render_and_send_email( + email, + user, + self.user_manager.USER_INVITE_USER_EMAIL_TEMPLATE, + accept_invitation_link=accept_invitation_link, + invited_by_user=invited_by_user, + ) + + def send_registered_email(self, user, user_email, request_email_confirmation): + + if not self.user_manager.USER_ENABLE_EMAIL: return + if not self.user_manager.USER_SEND_REGISTERED_EMAIL: return + + email = user_email.email if user_email else user.email + + if request_email_confirmation: + token = self.user_manager.generate_token(user_email.id if user_email else user.id) +~~ confirm_email_link = url_for('user.confirm_email', token=token, _external=True) + else: + confirm_email_link = None + + self._render_and_send_email( + email, + user, + self.user_manager.USER_REGISTERED_EMAIL_TEMPLATE, + confirm_email_link=confirm_email_link, + ) + + def send_username_changed_email(self, user): + + if not self.user_manager.USER_ENABLE_EMAIL: return + if not self.user_manager.USER_SEND_USERNAME_CHANGED_EMAIL: return + + user_or_user_email_object = self.user_manager.db_manager.get_primary_user_email_object(user) + email = user_or_user_email_object.email + + self._render_and_send_email( + email, + user, + self.user_manager.USER_USERNAME_CHANGED_EMAIL_TEMPLATE, + ) + + + +## ... source file continues with no further url_for examples... + +``` + + +## Example 10 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -908,7 +1057,7 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body) ``` -## Example 10 from Datadog Flask Example App +## Example 11 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index 2d0dbc406..468d11e5e 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -134,6 +134,56 @@ def _wrap_with_default_query_class(fn, cls): def newfn(*args, **kwargs): +## ... source file continues with no further Namespace examples... + +``` + + +## Example 3 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / signals.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./signals.py) + +```python +# signals.py + + + +~~from flask.signals import Namespace + +~~_signals = Namespace() # Place Flask-User signals in our own namespace + + +user_changed_password = _signals.signal('user.user_changed_password') + +user_changed_username = _signals.signal('user.user_changed_username') + +user_confirmed_email = _signals.signal('user.user_confirmed_email') + +user_forgot_password = _signals.signal('user.forgot_password') + +user_logged_in = _signals.signal('user.user_logged_in') + +user_logged_out = _signals.signal('user.user_logged_out') + +user_registered = _signals.signal('user.user_registered') + +user_reset_password = _signals.signal('user.user_reset_password') + +user_sent_invitation = _signals.signal('user.user_sent_invitation') + + + + ## ... source file continues with no further Namespace examples... ``` diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 672d84387..575618647 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -10,7 +10,110 @@ meta: Python example code for the render_template_string function from the flask render_template_string is a function within the flask.templating module of the Flask project. -## Example 1 from Datadog Flask Example App +## Example 1 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / tests / tst_app.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/tests/tst_app.py) + +```python +# tst_app.py +import os +import datetime +~~from flask import Flask, render_template_string, request +from flask_babelex import Babel +from flask_user import login_required, roles_required, UserManager, UserMixin + +ORM_type = 'SQLAlchemy' # SQLAlchemy or MongoEngine + + +app = Flask(__name__) + +class ConfigClass(object): + SECRET_KEY = 'Test with short key' # Less than 32 bytes + + SQLALCHEMY_DATABASE_URI = 'sqlite:///tst_app.sqlite' # File-based SQL database + SQLALCHEMY_TRACK_MODIFICATIONS = False # Avoids SQLAlchemy warning + + MONGODB_SETTINGS = { + 'db': 'tst_app', + 'host': 'mongodb://localhost:27017/tst_app' + } + + MAIL_USERNAME = os.getenv('MAIL_USERNAME', 'email@example.com') + MAIL_PASSWORD = os.getenv('MAIL_PASSWORD', 'password') + MAIL_DEFAULT_SENDER = os.getenv('MAIL_DEFAULT_SENDER', '"TestApp" ') + MAIL_SERVER = os.getenv('MAIL_SERVER', 'smtp.gmail.com') + MAIL_PORT = int(os.getenv('MAIL_PORT', '465')) + + +## ... source file abbreviated to get to render_template_string examples ... + + + assert user_manager.USER_EMAIL_SENDER_EMAIL=='noreply@example.com' + + db_manager = user_manager.db_manager + db_manager.drop_all_tables() + db_manager.create_all_tables() + + token = user_manager.generate_token('abc', 123, 'xyz') + data_items = user_manager.token_manager.verify_token(token, 3600) + assert data_items is not None + assert data_items[0] == 'abc' + assert data_items[1] == 123 + assert data_items[2] == 'xyz' + + user = db_manager.add_user(username='member', email='member@example.com', + password=user_manager.hash_password('Password1'), email_confirmed_at=datetime.datetime.utcnow()) + db_manager.commit() + + user = db_manager.add_user(username='user007', email='admin@example.com', + password=user_manager.hash_password('Password1')) + db_manager.add_user_role(user, 'secret') + db_manager.add_user_role(user, 'agent') + db_manager.commit() + + @app.route('/') + def home_page(): +~~ return render_template_string(""" + {% extends "flask_user_layout.html" %} + {% block content %} +

{%trans%}Home Page{%endtrans%}

+

{%trans%}Sign in{%endtrans%}

+ {% endblock %} + {% extends "flask_user_layout.html" %} + {% block content %} +

{%trans%}Profile Page{%endtrans%}

+

{%trans%}Hello{%endtrans%} + {{ current_user.username or current_user.email }},

+

+ {%trans%}Change username{%endtrans%}

+

+ {%trans%}Change password{%endtrans%}

+

+ {%trans%}Sign out{%endtrans%}

+ {% endblock %} + {% extends "flask_user_layout.html" %} + {% block content %} +

{%trans%}Admin Page{%endtrans%}

+ {% endblock %} + + + +## ... source file continues with no further render_template_string examples... + +``` + + +## Example 2 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index ab99a560d..5420e5e80 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -904,7 +904,99 @@ from .forms import ( ``` -## Example 10 from Flasky +## Example 10 from Flask-User +[Flask-User](https://github.com/lingthio/Flask-User) +([PyPI information](https://pypi.org/project/Flask-User/) +and +[project documentation](https://flask-user.readthedocs.io/en/latest/)) +is a [Flask](/flask.html) extension that makes it easier to add +custom user account management and authentication to the projects +you are building. The extension supports persistent data storage +through both [relational databases](/databases.html) and +[MongoDB](/mongodb.html). The project is provided as open source under +the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). + +[**Flask-User / flask_user / email_manager.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./email_manager.py) + +```python +# email_manager.py + + +~~from flask import render_template, url_for + +from flask_user import ConfigError + +class EmailManager(object): + + def __init__(self, app): + self.app = app + self.user_manager = app.user_manager + self.sender_name = self.user_manager.USER_EMAIL_SENDER_NAME + self.sender_email = self.user_manager.USER_EMAIL_SENDER_EMAIL + + if not self.sender_email: + raise ConfigError('Config setting USER_EMAIL_SENDER_EMAIL is missing.') + + if '@' not in self.sender_email: + raise ConfigError('Config setting USER_EMAIL_SENDER_EMAIL is not a valid email address.') + + + def send_confirm_email_email(self, user, user_email): + + if not self.user_manager.USER_ENABLE_EMAIL: return + if not self.user_manager.USER_ENABLE_CONFIRM_EMAIL: return + + email = user_email.email if user_email else user.email + + +## ... source file abbreviated to get to render_template examples ... + + + user, + self.user_manager.USER_REGISTERED_EMAIL_TEMPLATE, + confirm_email_link=confirm_email_link, + ) + + def send_username_changed_email(self, user): + + if not self.user_manager.USER_ENABLE_EMAIL: return + if not self.user_manager.USER_SEND_USERNAME_CHANGED_EMAIL: return + + user_or_user_email_object = self.user_manager.db_manager.get_primary_user_email_object(user) + email = user_or_user_email_object.email + + self._render_and_send_email( + email, + user, + self.user_manager.USER_USERNAME_CHANGED_EMAIL_TEMPLATE, + ) + + def _render_and_send_email(self, email, user, template_filename, **kwargs): + kwargs['app_name'] = self.user_manager.USER_APP_NAME + kwargs['email'] = email + kwargs['user'] = user + kwargs['user_manager'] = self.user_manager + +~~ subject = render_template(template_filename+'_subject.txt', **kwargs) + subject = subject.replace('\n', ' ') + subject = subject.replace('\r', ' ') +~~ html_message = render_template(template_filename+'_message.html', **kwargs) +~~ text_message = render_template(template_filename+'_message.txt', **kwargs) + + self.user_manager.email_adapter.send_email_message( + email, subject, html_message, text_message, + self.sender_email, self.sender_name) + + + + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 11 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -944,7 +1036,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 11 from Datadog Flask Example App +## Example 12 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1046,7 +1138,7 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 12 from newspie +## Example 13 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1201,7 +1293,7 @@ if __name__ == '__main__': ``` -## Example 13 from tedivms-flask +## Example 14 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html index b88ee4edb..026d02148 100644 --- a/theme/templates/code-examples/flask.html +++ b/theme/templates/code-examples/flask.html @@ -1,7 +1,7 @@

Flask: -Extensions,Plug-ins and Related Libraries & +Extensions, Plug-ins and Related Libraries & Example Projects and Code

flask.app From 301f48beb707fa0c467a0acf7ca43a1e9b8b4ef9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 27 Jun 2020 10:48:09 -0400 Subject: [PATCH 142/302] fixing some incomplete django code examples --- ...-contrib-admin-helpers-actionform.markdown | 5 ++ ...o-contrib-admin-helpers-adminform.markdown | 5 ++ .../django-contrib-admin-helpers.markdown | 30 ++++++++++ ...trib-admin-options-csrf-protect-m.markdown | 5 ++ ...options-incorrectlookupparameters.markdown | 60 +++++++++++++++++++ ...ontrib-admin-options-is-popup-var.markdown | 41 +++++++++++++ ...-contrib-admin-options-modeladmin.markdown | 33 ++++++++++ content/pages/meta/00-change-log.markdown | 2 +- 8 files changed, 180 insertions(+), 1 deletion(-) diff --git a/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown b/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown index 295784080..8df99e662 100644 --- a/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown +++ b/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown @@ -57,6 +57,11 @@ class ConfirmImportForm(forms.Form): + def clean_import_file_name(self): + data = self.cleaned_data['import_file_name'] + data = os.path.basename(data) + return data + class ExportForm(forms.Form): file_format = forms.ChoiceField( diff --git a/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown b/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown index 404238124..4094a1dd5 100644 --- a/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown +++ b/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown @@ -56,6 +56,11 @@ from cms import operations ## ... source file abbreviated to get to AdminForm examples ... + saved_successfully = False + cancel_clicked = request.POST.get("_cancel", False) + raw_fields = request.GET.get("edit_fields") + fields = [field for field in raw_fields.split(",") if field in self.frontend_editable_fields] + if not fields: context = { 'opts': opts, 'message': force_text(_("Field %s not found")) % raw_fields diff --git a/content/pages/examples/django/django-contrib-admin-helpers.markdown b/content/pages/examples/django/django-contrib-admin-helpers.markdown index abdc2a87f..abb3a7476 100644 --- a/content/pages/examples/django/django-contrib-admin-helpers.markdown +++ b/content/pages/examples/django/django-contrib-admin-helpers.markdown @@ -62,6 +62,11 @@ from ..utils.loader import load_model ## ... source file abbreviated to get to helpers examples ... + if "move-to-clipboard-%d" % (f.id,) in request.POST: + clipboard = tools.get_user_clipboard(request.user) + if f.has_edit_permission(request): + tools.move_file_to_clipboard([f], clipboard) + return HttpResponseRedirect(request.get_full_path()) else: raise PermissionDenied @@ -112,6 +117,11 @@ from ..utils.loader import load_model ## ... source file abbreviated to get to helpers examples ... + self.log_deletion(request, f, force_text(f)) + f.delete() + self.message_user(request, _("Successfully deleted %(count)d files and/or folders.") % {"count": n, }) + return None + if all_perms_needed or all_protected: title = _("Cannot delete files and/or folders") else: @@ -162,6 +172,11 @@ from ..utils.loader import load_model ## ... source file abbreviated to get to helpers examples ... + conflicting_names = [folder.name for folder in self.get_queryset(request).filter(parent=destination, name__in=folders_queryset.values('name'))] + if conflicting_names: + messages.error(request, _("Folders with names %s already exist at the selected " + "destination") % ", ".join(conflicting_names)) + elif n: self._move_files_and_folders_impl(files_queryset, folders_queryset, destination) self.message_user(request, _("Successfully moved %(count)d files and/or folders to folder '%(destination)s'.") % { "count": n, @@ -212,6 +227,11 @@ from ..utils.loader import load_model ## ... source file abbreviated to get to helpers examples ... + raise PermissionDenied + form = RenameFilesForm(request.POST) + if form.is_valid(): + if files_queryset.count() + folders_queryset.count(): + n = self._rename_files_impl(files_queryset, folders_queryset, form.cleaned_data, 0) self.message_user(request, _("Successfully renamed %(count)d files.") % { "count": n, }) @@ -262,6 +282,11 @@ from ..utils.loader import load_model ## ... source file abbreviated to get to helpers examples ... + form = CopyFilesAndFoldersForm() + + try: + selected_destination_folder = int(request.POST.get('destination', 0)) + except ValueError: if current_folder: selected_destination_folder = current_folder.pk else: @@ -312,6 +337,11 @@ from ..utils.loader import load_model ## ... source file abbreviated to get to helpers examples ... + form.cleaned_data['width'] = form.cleaned_data['thumbnail_option'].width + form.cleaned_data['height'] = form.cleaned_data['thumbnail_option'].height + form.cleaned_data['crop'] = form.cleaned_data['thumbnail_option'].crop + form.cleaned_data['upscale'] = form.cleaned_data['thumbnail_option'].upscale + if files_queryset.count() + folders_queryset.count(): n = self._resize_images_impl(files_queryset, folders_queryset, form.cleaned_data) self.message_user(request, _("Successfully resized %(count)d images.") % {"count": n, }) return None diff --git a/content/pages/examples/django/django-contrib-admin-options-csrf-protect-m.markdown b/content/pages/examples/django/django-contrib-admin-options-csrf-protect-m.markdown index 04bb8a8c2..334ae0b80 100644 --- a/content/pages/examples/django/django-contrib-admin-options-csrf-protect-m.markdown +++ b/content/pages/examples/django/django-contrib-admin-options-csrf-protect-m.markdown @@ -58,6 +58,11 @@ class SearchChangeList(ChangeList): ## ... source file abbreviated to get to csrf_protect_m examples ... + result_count = paginator.count + full_result_count = ( + SearchQuerySet(self.haystack_connection).models(self.model).all().count() + ) + can_show_all = result_count <= self.list_max_show_all multi_page = result_count > self.list_per_page diff --git a/content/pages/examples/django/django-contrib-admin-options-incorrectlookupparameters.markdown b/content/pages/examples/django/django-contrib-admin-options-incorrectlookupparameters.markdown index 875707238..56d6cf44e 100644 --- a/content/pages/examples/django/django-contrib-admin-options-incorrectlookupparameters.markdown +++ b/content/pages/examples/django/django-contrib-admin-options-incorrectlookupparameters.markdown @@ -24,6 +24,11 @@ The django-jet project is open source under the ```python # utils.py +from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + try: from django.apps.registry import apps except ImportError: @@ -71,6 +76,61 @@ def get_app_list(context, order=True): request = context['request'] +## ... source file abbreviated to get to IncorrectLookupParameters examples ... + + + if hasattr(model_admin, 'get_search_fields') else model_admin.search_fields + list_select_related = model_admin.get_list_select_related(request) \ + if hasattr(model_admin, 'get_list_select_related') else model_admin.list_select_related + + actions = model_admin.get_actions(request) + if actions: + list_display = ['action_checkbox'] + list(list_display) + + ChangeList = model_admin.get_changelist(request) + + change_list_args = [ + request, model, list_display, list_display_links, list_filter, + model_admin.date_hierarchy, search_fields, list_select_related, + model_admin.list_per_page, model_admin.list_max_show_all, + model_admin.list_editable, model_admin] + + try: + sortable_by = model_admin.get_sortable_by(request) + change_list_args.append(sortable_by) + except AttributeError: + pass + + try: + cl = ChangeList(*change_list_args) + queryset = cl.get_queryset(request) +~~ except IncorrectLookupParameters: + pass + + return queryset + + +def get_possible_language_codes(): + language_code = translation.get_language() + + language_code = language_code.replace('_', '-').lower() + language_codes = [] + + split = language_code.split('-', 2) + if len(split) == 2: + language_code = '%s-%s' % (split[0].lower(), split[1].upper()) if split[0] != split[1] else split[0] + + language_codes.append(language_code) + + if len(split) == 2: + language_codes.append(split[0].lower()) + + return language_codes + + +def get_original_menu_items(context): + + ## ... source file continues with no further IncorrectLookupParameters examples... ``` diff --git a/content/pages/examples/django/django-contrib-admin-options-is-popup-var.markdown b/content/pages/examples/django/django-contrib-admin-options-is-popup-var.markdown index 95e8741ae..d19f241c2 100644 --- a/content/pages/examples/django/django-contrib-admin-options-is-popup-var.markdown +++ b/content/pages/examples/django/django-contrib-admin-options-is-popup-var.markdown @@ -107,6 +107,47 @@ def check_files_read_permissions(request, files): if not f.has_read_permission(request): +## ... source file abbreviated to get to IS_POPUP_VAR examples ... + + + params = params or {} + if popup_status(request): + params[IS_POPUP_VAR] = '1' + pick_type = popup_pick_type(request) + if pick_type: + params['_pick'] = pick_type + return params + + +def admin_url_params_encoded(request, first_separator='?', params=None): + params = urlencode( + sorted(admin_url_params(request, params=params).items()) + ) + if not params: + return '' + return '{0}{1}'.format(first_separator, params) + + +class AdminContext(dict): + def __init__(self, request): + super(AdminContext, self).__init__() + self.update(admin_url_params(request)) + + def __missing__(self, key): + if key == 'popup': +~~ return self.get(IS_POPUP_VAR, False) == '1' + elif key == 'pick': + return self.get('_pick', '') + elif key.startswith('pick_'): + return self.get('_pick', '') == key.split('pick_')[1] + + def __getattr__(self, name): + if name in ('popup', 'pick') or name.startswith('pick_'): + return self.get(name) + raise AttributeError + + + ## ... source file continues with no further IS_POPUP_VAR examples... ``` diff --git a/content/pages/examples/django/django-contrib-admin-options-modeladmin.markdown b/content/pages/examples/django/django-contrib-admin-options-modeladmin.markdown index 7d8b6b845..93bd414bf 100644 --- a/content/pages/examples/django/django-contrib-admin-options-modeladmin.markdown +++ b/content/pages/examples/django/django-contrib-admin-options-modeladmin.markdown @@ -55,6 +55,39 @@ class SearchChangeList(ChangeList): SearchQuerySet(self.haystack_connection) +## ... source file abbreviated to get to ModelAdmin examples ... + + + "cl": changelist, + "media": media, + "has_add_permission": self.has_add_permission(request), + "opts": changelist.opts, + "app_label": self.model._meta.app_label, + "action_form": action_form, + "actions_on_top": self.actions_on_top, + "actions_on_bottom": self.actions_on_bottom, + "actions_selection_counter": getattr(self, "actions_selection_counter", 0), + } + context.update(extra_context or {}) + request.current_app = self.admin_site.name + app_name, model_name = get_model_ct_tuple(self.model) + return render( + request, + self.change_list_template + or [ + "admin/%s/%s/change_list.html" % (app_name, model_name), + "admin/%s/change_list.html" % app_name, + "admin/change_list.html", + ], + context, + ) + + +~~class SearchModelAdmin(SearchModelAdminMixin, ModelAdmin): + pass + + + ## ... source file continues with no further ModelAdmin examples... ``` diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index ea439b483..067d804bf 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -16,7 +16,7 @@ on GitHub. ## 2020 ### June * Added new example code for [Django](/django.html) modules: - * [django.contrib.admin.helpers](/django-contrib-admin-helpers-examples.html), + * [django.contrib.admin.helpers](/django-contrib-admin-helpers-examples.html) [ActionForm](/django-contrib-admin-helpers-actionform-examples.html), and [AdminForm](/django-contrib-admin-helpers-adminform-examples.html) From 51d10c31c07d9283541a06c39c8dc12fa7722b66 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 27 Jun 2020 12:15:33 -0400 Subject: [PATCH 143/302] add new flask example code --- .../examples/flask/flask-app-flask.markdown | 162 ++++++++++- .../flask/flask-blueprints-blueprint.markdown | 36 ++- .../flask/flask-extensions-plug-ins.markdown | 28 +- .../flask/flask-globals-current-app.markdown | 47 ++- .../flask/flask-globals-request.markdown | 267 +++++++++++++++++- .../flask/flask-globals-session.markdown | 100 ++++++- .../flask/flask-helpers-send-file.markdown | 52 ++++ .../flask/flask-helpers-url-for.markdown | 2 +- .../flask/flask-json-jsonencoder.markdown | 2 +- .../flask/flask-json-jsonify.markdown | 90 +++++- .../flask-sessions-badsignature.markdown | 2 +- .../flask-sessions-sessioninterface.markdown | 2 +- .../flask-sessions-sessionmixin.markdown | 104 +++++++ ...ask-signals-got-request-exception.markdown | 2 +- .../flask/flask-signals-namespace.markdown | 2 +- ...templating-render-template-string.markdown | 2 +- .../flask-templating-render-template.markdown | 88 +++++- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 2 +- .../examples/flask/flask-views-view.markdown | 2 +- content/pages/meta/00-change-log.markdown | 3 + theme/templates/code-examples/flask.html | 4 +- 22 files changed, 963 insertions(+), 38 deletions(-) create mode 100644 content/pages/examples/flask/flask-helpers-send-file.markdown create mode 100644 content/pages/examples/flask/flask-sessions-sessionmixin.markdown diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 236bf9c6e..82feaa966 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -457,7 +457,118 @@ from app.models import User ``` -## Example 8 from Flask-User +## Example 8 from Flask-SocketIO +[Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) +([PyPI package information](https://pypi.org/project/Flask-SocketIO/), +[official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) +and +[project documentation](https://flask-socketio.readthedocs.io/en/latest/)) +is a code library by [Miguel Grinberg](https://blog.miguelgrinberg.com/index) +that provides Socket.IO integration for [Flask](/flask.html) applications. +This extension makes it easier to add bi-directional communications on the +web via the [WebSockets](/websockets.html) protocol. + +The Flask-SocketIO project is open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/LICENSE). + +[**Flask-SocketIO / test_socketio.py**](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/././test_socketio.py) + +```python +# test_socketio.py +import json +import unittest +import coverage + +cov = coverage.coverage(branch=True) +cov.start() + +~~from flask import Flask, session, request, json as flask_json +from flask_socketio import SocketIO, send, emit, join_room, leave_room, \ + Namespace, disconnect + +~~app = Flask(__name__) +app.config['SECRET_KEY'] = 'secret' +socketio = SocketIO(app) +disconnected = None + + +@socketio.on('connect') +def on_connect(): + if request.args.get('fail'): + return False + send('connected') + send(json.dumps(request.args.to_dict(flat=False))) + send(json.dumps({h: request.headers[h] for h in request.headers.keys() + if h not in ['Host', 'Content-Type', 'Content-Length']})) + + +@socketio.on('disconnect') +def on_disconnect(): + global disconnected + disconnected = '/' + + +@socketio.on('connect', namespace='/test') +def on_connect_test(): + send('connected-test') + + +## ... source file abbreviated to get to Flask examples ... + + + client.emit('exit', {}, namespace='/ns') + self.assertFalse(client.is_connected('/ns')) + with self.assertRaises(RuntimeError): + client.emit('hello', {}, namespace='/ns') + + def test_emit_class_based(self): + client = socketio.test_client(app, namespace='/ns') + client.get_received('/ns') + client.emit('my_custom_event', {'a': 'b'}, namespace='/ns') + received = client.get_received('/ns') + self.assertEqual(len(received), 1) + self.assertEqual(len(received[0]['args']), 1) + self.assertEqual(received[0]['name'], 'my custom response') + self.assertEqual(received[0]['args'][0]['a'], 'b') + + def test_request_event_data_class_based(self): + client = socketio.test_client(app, namespace='/ns') + client.get_received('/ns') + global request_event_data + request_event_data = None + client.emit('other_custom_event', 'foo', namespace='/ns') + expected_data = {'message': 'other_custom_event', 'args': ('foo',)} + self.assertEqual(request_event_data, expected_data) + + def test_delayed_init(self): +~~ app = Flask(__name__) + socketio = SocketIO(allow_upgrades=False, json=flask_json) + + @socketio.on('connect') + def on_connect(): + send({'connected': 'foo'}, json=True) + + socketio.init_app(app, cookie='foo') + self.assertFalse(socketio.server.eio.allow_upgrades) + self.assertEqual(socketio.server.eio.cookie, 'foo') + + client = socketio.test_client(app) + received = client.get_received() + self.assertEqual(len(received), 1) + self.assertEqual(received[0]['args'], {'connected': 'foo'}) + + +if __name__ == '__main__': + unittest.main() + + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 9 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -540,7 +651,48 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 9 from Flasky +## Example 10 from Flask-VueJs-Template +[Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) +([demo site](https://flask-vuejs-template.herokuapp.com/)) +is a minimal [Flask](/flask.html) boilerplate starter project that +combines Flask, [Vue.js](https://www.fullstackpython.com/vuejs.html), +and [Flask-RESTPlus](https://flask-restplus.readthedocs.io/en/stable/). +The project provides some sensible defaults that are easy to continue +building on, and the source code is open source under the +[MIT license](https://github.com/gtalarico/flask-vuejs-template/blob/master/LICENSE.md). + +[**Flask-VueJs-Template / app / __init__.py**](https://github.com/gtalarico/flask-vuejs-template/blob/master/app/./__init__.py) + +```python +# __init__.py +import os +~~from flask import Flask, current_app, send_file + +from .api import api_bp +from .client import client_bp + +~~app = Flask(__name__, static_folder='../dist/static') +app.register_blueprint(api_bp) + +from .config import Config +app.logger.info('>>> {}'.format(Config.FLASK_ENV)) + +@app.route('/') +def index_client(): + dist_dir = current_app.config['DIST_DIR'] + entry = os.path.join(dist_dir, 'index.html') + return send_file(entry) + + + + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 11 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -604,7 +756,7 @@ def create_app(config_name): ``` -## Example 10 from Datadog Flask Example App +## Example 12 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -665,7 +817,7 @@ def before_request(): ``` -## Example 11 from sandman2 +## Example 13 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -746,7 +898,7 @@ def get_app( ``` -## Example 12 from tedivms-flask +## Example 14 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 4c270de83..810d1c1fc 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -656,7 +656,39 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 9 from Datadog Flask Example App +## Example 9 from Flask-VueJs-Template +[Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) +([demo site](https://flask-vuejs-template.herokuapp.com/)) +is a minimal [Flask](/flask.html) boilerplate starter project that +combines Flask, [Vue.js](https://www.fullstackpython.com/vuejs.html), +and [Flask-RESTPlus](https://flask-restplus.readthedocs.io/en/stable/). +The project provides some sensible defaults that are easy to continue +building on, and the source code is open source under the +[MIT license](https://github.com/gtalarico/flask-vuejs-template/blob/master/LICENSE.md). + +[**Flask-VueJs-Template / app / client.py**](https://github.com/gtalarico/flask-vuejs-template/blob/master/app/./client.py) + +```python +# client.py + +import os +~~from flask import Blueprint, render_template + +~~client_bp = Blueprint('client_app', __name__, + url_prefix='', + static_url_path='', + static_folder='./dist/static/', + template_folder='./dist/', + ) + + + +## ... source file continues with no further Blueprint examples... + +``` + + +## Example 10 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -703,7 +735,7 @@ def bp_after_request(response): ``` -## Example 10 from tedivms-flask +## Example 11 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown index e0af09567..a73e0dd15 100644 --- a/content/pages/examples/flask/flask-extensions-plug-ins.markdown +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -99,7 +99,7 @@ get basic APIs running for existing applications and it exposes endpoint documentation using [Swagger](https://swagger.io/). Flask RESTX is provided as open source under the -[BSD 3-Clause license](https://github.com/python-restx/flask-restx/blob/master/LICENSE). +[BSD 3-Clause license](https://github.com/python-restx/flask-restx/blob/master/LICENSE). ### Flask-Security-Too @@ -118,6 +118,21 @@ The Flask-Security-Too project is provided as open source under the [MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). +### Flask-SocketIO +[Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) +([PyPI package information](https://pypi.org/project/Flask-SocketIO/), +[official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) +and +[project documentation](https://flask-socketio.readthedocs.io/en/latest/)) +is a code library by [Miguel Grinberg](https://blog.miguelgrinberg.com/index) +that provides Socket.IO integration for [Flask](/flask.html) applications. +This extension makes it easier to add bi-directional communications on the +web via the [WebSockets](/websockets.html) protocol. + +The Flask-SocketIO project is open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/LICENSE). + + ### Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) @@ -131,6 +146,17 @@ through both [relational databases](/databases.html) and the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt). +### Flask-VueJs-Template +[Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) +([demo site](https://flask-vuejs-template.herokuapp.com/)) +is a minimal [Flask](/flask.html) boilerplate starter project that +combines Flask, [Vue.js](https://www.fullstackpython.com/vuejs.html), +and [Flask-RESTPlus](https://flask-restplus.readthedocs.io/en/stable/). +The project provides some sensible defaults that are easy to continue +building on, and the source code is open source under the +[MIT license](https://github.com/gtalarico/flask-vuejs-template/blob/master/LICENSE.md). + + ### Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 5e2b5769c..b49b271f2 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -1996,7 +1996,48 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 13 from Flasky +## Example 13 from Flask-VueJs-Template +[Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) +([demo site](https://flask-vuejs-template.herokuapp.com/)) +is a minimal [Flask](/flask.html) boilerplate starter project that +combines Flask, [Vue.js](https://www.fullstackpython.com/vuejs.html), +and [Flask-RESTPlus](https://flask-restplus.readthedocs.io/en/stable/). +The project provides some sensible defaults that are easy to continue +building on, and the source code is open source under the +[MIT license](https://github.com/gtalarico/flask-vuejs-template/blob/master/LICENSE.md). + +[**Flask-VueJs-Template / app / __init__.py**](https://github.com/gtalarico/flask-vuejs-template/blob/master/app/./__init__.py) + +```python +# __init__.py +import os +~~from flask import Flask, current_app, send_file + +from .api import api_bp +from .client import client_bp + +app = Flask(__name__, static_folder='../dist/static') +app.register_blueprint(api_bp) + +from .config import Config +app.logger.info('>>> {}'.format(Config.FLASK_ENV)) + +@app.route('/') +def index_client(): +~~ dist_dir = current_app.config['DIST_DIR'] + entry = os.path.join(dist_dir, 'index.html') + return send_file(entry) + + + + + +## ... source file continues with no further current_app examples... + +``` + + +## Example 14 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -2051,7 +2092,7 @@ def run_migrations_online(): ``` -## Example 14 from sandman2 +## Example 15 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2176,7 +2217,7 @@ def register_model(cls, admin=None): ``` -## Example 15 from tedivms-flask +## Example 16 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index f7fa4402a..d7fa9d57c 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -1786,7 +1786,231 @@ class ChangePasswordForm(Form, PasswordFormMixin): ``` -## Example 11 from Flask-User +## Example 11 from Flask-SocketIO +[Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) +([PyPI package information](https://pypi.org/project/Flask-SocketIO/), +[official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) +and +[project documentation](https://flask-socketio.readthedocs.io/en/latest/)) +is a code library by [Miguel Grinberg](https://blog.miguelgrinberg.com/index) +that provides Socket.IO integration for [Flask](/flask.html) applications. +This extension makes it easier to add bi-directional communications on the +web via the [WebSockets](/websockets.html) protocol. + +The Flask-SocketIO project is open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/LICENSE). + +[**Flask-SocketIO / test_socketio.py**](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/././test_socketio.py) + +```python +# test_socketio.py +import json +import unittest +import coverage + +cov = coverage.coverage(branch=True) +cov.start() + +~~from flask import Flask, session, request, json as flask_json +from flask_socketio import SocketIO, send, emit, join_room, leave_room, \ + Namespace, disconnect + +app = Flask(__name__) +app.config['SECRET_KEY'] = 'secret' +socketio = SocketIO(app) +disconnected = None + + +@socketio.on('connect') +def on_connect(): +~~ if request.args.get('fail'): + return False + send('connected') + send(json.dumps(request.args.to_dict(flat=False))) +~~ send(json.dumps({h: request.headers[h] for h in request.headers.keys() + if h not in ['Host', 'Content-Type', 'Content-Length']})) + + +@socketio.on('disconnect') +def on_disconnect(): + global disconnected + disconnected = '/' + + +@socketio.on('connect', namespace='/test') +def on_connect_test(): + send('connected-test') + send(json.dumps(request.args.to_dict(flat=False))) +~~ send(json.dumps({h: request.headers[h] for h in request.headers.keys() + if h not in ['Host', 'Content-Type', 'Content-Length']})) + + +@socketio.on('disconnect', namespace='/test') +def on_disconnect_test(): + global disconnected + disconnected = '/test' + + +@socketio.on('message') +def on_message(message): + send(message) + if message == 'test session': + session['a'] = 'b' + if message not in "test noackargs": + return message + + +@socketio.on('json') +def on_json(data): + send(data, json=True, broadcast=True) + if not data.get('noackargs'): + return data + + +@socketio.on('message', namespace='/test') +def on_message_test(message): + send(message) + + +@socketio.on('json', namespace='/test') +def on_json_test(data): + send(data, json=True, namespace='/test') + + +@socketio.on('my custom event') +def on_custom_event(data): + emit('my custom response', data) + if not data.get('noackargs'): + return data + + +@socketio.on('other custom event') +@socketio.on('and another custom event') +def get_request_event(data): + global request_event_data +~~ request_event_data = request.event + emit('my custom response', data) + + +def get_request_event2(data): + global request_event_data +~~ request_event_data = request.event + emit('my custom response', data) + +socketio.on_event('yet another custom event', get_request_event2) + + +@socketio.on('my custom namespace event', namespace='/test') +def on_custom_event_test(data): + emit('my custom namespace response', data, namespace='/test') + + +def on_custom_event_test2(data): + emit('my custom namespace response', data, namespace='/test') + +socketio.on_event('yet another custom namespace event', on_custom_event_test2, + namespace='/test') + + +@socketio.on('my custom broadcast event') +def on_custom_event_broadcast(data): + emit('my custom response', data, broadcast=True) + + +@socketio.on('my custom broadcast namespace event', namespace='/test') +def on_custom_event_broadcast_test(data): + + +## ... source file abbreviated to get to request examples ... + + +@socketio.on("error testing", namespace='/test') +def raise_error_namespace(data): + raise AssertionError() + + +@socketio.on_error_default +def error_handler_default(value): + if isinstance(value, AssertionError): + global error_testing_default + error_testing_default = True + else: + raise value + return value + + +@socketio.on("error testing", namespace='/unused_namespace') +def raise_error_default(data): + raise AssertionError() + + +class MyNamespace(Namespace): + def on_connect(self): + send('connected-ns') + send(json.dumps(request.args.to_dict(flat=False))) + send(json.dumps( +~~ {h: request.headers[h] for h in request.headers.keys() + if h not in ['Host', 'Content-Type', 'Content-Length']})) + + def on_disconnect(self): + global disconnected + disconnected = '/ns' + + def on_message(self, message): + send(message) + if message == 'test session': + session['a'] = 'b' + if message not in "test noackargs": + return message + + def on_json(self, data): + send(data, json=True, broadcast=True) + if not data.get('noackargs'): + return data + + def on_exit(self, data): + disconnect() + + def on_my_custom_event(self, data): + emit('my custom response', data) + if not data.get('noackargs'): + return data + + def on_other_custom_event(self, data): + global request_event_data +~~ request_event_data = request.event + emit('my custom response', data) + + +socketio.on_namespace(MyNamespace('/ns')) + + +@app.route('/session') +def session_route(): + session['foo'] = 'bar' + return '' + + +class TestSocketIO(unittest.TestCase): + @classmethod + def setUpClass(cls): + pass + + @classmethod + def tearDownClass(cls): + cov.stop() + cov.report(include='flask_socketio/*', show_missing=True) + + def setUp(self): + pass + + +## ... source file continues with no further request examples... + +``` + + +## Example 12 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1850,7 +2074,42 @@ def init_translations(babel): ``` -## Example 12 from newspie +## Example 13 from Flask-VueJs-Template +[Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) +([demo site](https://flask-vuejs-template.herokuapp.com/)) +is a minimal [Flask](/flask.html) boilerplate starter project that +combines Flask, [Vue.js](https://www.fullstackpython.com/vuejs.html), +and [Flask-RESTPlus](https://flask-restplus.readthedocs.io/en/stable/). +The project provides some sensible defaults that are easy to continue +building on, and the source code is open source under the +[MIT license](https://github.com/gtalarico/flask-vuejs-template/blob/master/LICENSE.md). + +[**Flask-VueJs-Template / app / api / security.py**](https://github.com/gtalarico/flask-vuejs-template/blob/master/app/api/security.py) + +```python +# security.py +from functools import wraps +~~from flask import request +from flask_restplus import abort + + +def require_auth(func): + @wraps(func) + def wrapper(*args, **kwargs): +~~ if request.headers.get('authorization'): + return func(*args, **kwargs) + else: + return abort(401) + return wrapper + + + +## ... source file continues with no further request examples... + +``` + + +## Example 14 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -2031,7 +2290,7 @@ if __name__ == '__main__': ``` -## Example 13 from sandman2 +## Example 15 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2232,7 +2491,7 @@ class Service(MethodView): ``` -## Example 14 from tedivms-flask +## Example 16 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 46b34a7eb..d31bb9847 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -747,7 +747,103 @@ def tf_send_security_token(user, method, totp_secret, phone_number): ``` -## Example 8 from Flask-User +## Example 8 from Flask-SocketIO +[Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) +([PyPI package information](https://pypi.org/project/Flask-SocketIO/), +[official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) +and +[project documentation](https://flask-socketio.readthedocs.io/en/latest/)) +is a code library by [Miguel Grinberg](https://blog.miguelgrinberg.com/index) +that provides Socket.IO integration for [Flask](/flask.html) applications. +This extension makes it easier to add bi-directional communications on the +web via the [WebSockets](/websockets.html) protocol. + +The Flask-SocketIO project is open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/LICENSE). + +[**Flask-SocketIO / example / sessions.py**](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/./example/sessions.py) + +```python +# sessions.py +~~from flask import Flask, render_template, session, request, jsonify +from flask_login import LoginManager, UserMixin, current_user, login_user, \ + logout_user +from flask_session import Session +from flask_socketio import SocketIO, emit + +app = Flask(__name__) +app.config['SECRET_KEY'] = 'top-secret!' +app.config['SESSION_TYPE'] = 'filesystem' +login = LoginManager(app) +Session(app) +socketio = SocketIO(app, manage_session=False) + + +class User(UserMixin, object): + def __init__(self, id=None): + self.id = id + + +@login.user_loader +def load_user(id): + return User(id) + + +@app.route('/') +def index(): + return render_template('sessions.html') + + +@app.route('/session', methods=['GET', 'POST']) +def session_access(): + if request.method == 'GET': + return jsonify({ +~~ 'session': session.get('value', ''), + 'user': current_user.id + if current_user.is_authenticated else 'anonymous' + }) + data = request.get_json() + if 'session' in data: + session['value'] = data['session'] + elif 'user' in data: + if data['user']: + login_user(User(data['user'])) + else: + logout_user() + return '', 204 + + +@socketio.on('get-session') +def get_session(): + emit('refresh-session', { +~~ 'session': session.get('value', ''), + 'user': current_user.id + if current_user.is_authenticated else 'anonymous' + }) + + +@socketio.on('set-session') +def set_session(data): + if 'session' in data: + session['value'] = data['session'] + elif 'user' in data: + if data['user'] is not None: + login_user(User(data['user'])) + else: + logout_user() + + +if __name__ == '__main__': + socketio.run(app) + + + +## ... source file continues with no further session examples... + +``` + + +## Example 9 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -855,7 +951,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 9 from tedivms-flask +## Example 10 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown new file mode 100644 index 000000000..2b013e7f3 --- /dev/null +++ b/content/pages/examples/flask/flask-helpers-send-file.markdown @@ -0,0 +1,52 @@ +title: flask.helpers send_file code examples +category: page +slug: flask-helpers-send-file-examples +sortorder: 500021016 +toc: False +sidebartitle: flask.helpers send_file +meta: Python example code for the send_file function from the flask.helpers module of the Flask project. + + +send_file is a function within the flask.helpers module of the Flask project. + + +## Example 1 from Flask-VueJs-Template +[Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) +([demo site](https://flask-vuejs-template.herokuapp.com/)) +is a minimal [Flask](/flask.html) boilerplate starter project that +combines Flask, [Vue.js](https://www.fullstackpython.com/vuejs.html), +and [Flask-RESTPlus](https://flask-restplus.readthedocs.io/en/stable/). +The project provides some sensible defaults that are easy to continue +building on, and the source code is open source under the +[MIT license](https://github.com/gtalarico/flask-vuejs-template/blob/master/LICENSE.md). + +[**Flask-VueJs-Template / app / __init__.py**](https://github.com/gtalarico/flask-vuejs-template/blob/master/app/./__init__.py) + +```python +# __init__.py +import os +~~from flask import Flask, current_app, send_file + +from .api import api_bp +from .client import client_bp + +app = Flask(__name__, static_folder='../dist/static') +app.register_blueprint(api_bp) + +from .config import Config +app.logger.info('>>> {}'.format(Config.FLASK_ENV)) + +@app.route('/') +def index_client(): + dist_dir = current_app.config['DIST_DIR'] + entry = os.path.join(dist_dir, 'index.html') +~~ return send_file(entry) + + + + + +## ... source file continues with no further send_file examples... + +``` + diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index f00c380f1..877c086fb 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -1,7 +1,7 @@ title: flask.helpers url_for code examples category: page slug: flask-helpers-url-for-examples -sortorder: 500021016 +sortorder: 500021017 toc: False sidebartitle: flask.helpers url_for meta: Python example code for the url_for function from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index 206aa2c25..5c605bfe2 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -1,7 +1,7 @@ title: flask.json JSONEncoder code examples category: page slug: flask-json-jsonencoder-examples -sortorder: 500021017 +sortorder: 500021018 toc: False sidebartitle: flask.json JSONEncoder meta: Python example code for the JSONEncoder class from the flask.json module of the Flask project. diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index d4d8fd9b3..055374d29 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -1,7 +1,7 @@ title: flask.json jsonify code examples category: page slug: flask-json-jsonify-examples -sortorder: 500021018 +sortorder: 500021019 toc: False sidebartitle: flask.json jsonify meta: Python example code for the jsonify function from the flask.json module of the Flask project. @@ -581,7 +581,89 @@ def contact(): ``` -## Example 4 from Datadog Flask Example App +## Example 4 from Flask-SocketIO +[Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) +([PyPI package information](https://pypi.org/project/Flask-SocketIO/), +[official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) +and +[project documentation](https://flask-socketio.readthedocs.io/en/latest/)) +is a code library by [Miguel Grinberg](https://blog.miguelgrinberg.com/index) +that provides Socket.IO integration for [Flask](/flask.html) applications. +This extension makes it easier to add bi-directional communications on the +web via the [WebSockets](/websockets.html) protocol. + +The Flask-SocketIO project is open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/LICENSE). + +[**Flask-SocketIO / example / sessions.py**](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/./example/sessions.py) + +```python +# sessions.py +~~from flask import Flask, render_template, session, request, jsonify +from flask_login import LoginManager, UserMixin, current_user, login_user, \ + logout_user +from flask_session import Session +from flask_socketio import SocketIO, emit + +app = Flask(__name__) +app.config['SECRET_KEY'] = 'top-secret!' +app.config['SESSION_TYPE'] = 'filesystem' +login = LoginManager(app) +Session(app) +socketio = SocketIO(app, manage_session=False) + + +class User(UserMixin, object): + def __init__(self, id=None): + self.id = id + + +@login.user_loader +def load_user(id): + return User(id) + + +@app.route('/') +def index(): + return render_template('sessions.html') + + +@app.route('/session', methods=['GET', 'POST']) +def session_access(): + if request.method == 'GET': +~~ return jsonify({ + 'session': session.get('value', ''), + 'user': current_user.id + if current_user.is_authenticated else 'anonymous' + }) + data = request.get_json() + if 'session' in data: + session['value'] = data['session'] + elif 'user' in data: + if data['user']: + login_user(User(data['user'])) + else: + logout_user() + return '', 204 + + +@socketio.on('get-session') +def get_session(): + emit('refresh-session', { + 'session': session.get('value', ''), + 'user': current_user.id + if current_user.is_authenticated else 'anonymous' + }) + + + + +## ... source file continues with no further jsonify examples... + +``` + + +## Example 5 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -683,7 +765,7 @@ def stream(): ``` -## Example 5 from sandman2 +## Example 6 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -851,7 +933,7 @@ class Service(MethodView): ``` -## Example 6 from tedivms-flask +## Example 7 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 9832b0c9a..8d83c42ff 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -1,7 +1,7 @@ title: flask.sessions BadSignature code examples category: page slug: flask-sessions-badsignature-examples -sortorder: 500021019 +sortorder: 500021020 toc: False sidebartitle: flask.sessions BadSignature meta: Python example code for the BadSignature class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index e358fa4ac..9f1671b9d 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionInterface code examples category: page slug: flask-sessions-sessioninterface-examples -sortorder: 500021020 +sortorder: 500021021 toc: False sidebartitle: flask.sessions SessionInterface meta: Python example code for the SessionInterface class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown new file mode 100644 index 000000000..07c68bbe7 --- /dev/null +++ b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown @@ -0,0 +1,104 @@ +title: flask.sessions SessionMixin code examples +category: page +slug: flask-sessions-sessionmixin-examples +sortorder: 500021022 +toc: False +sidebartitle: flask.sessions SessionMixin +meta: Python example code for the SessionMixin class from the flask.sessions module of the Flask project. + + +SessionMixin is a class within the flask.sessions module of the Flask project. + + +## Example 1 from Flask-SocketIO +[Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) +([PyPI package information](https://pypi.org/project/Flask-SocketIO/), +[official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) +and +[project documentation](https://flask-socketio.readthedocs.io/en/latest/)) +is a code library by [Miguel Grinberg](https://blog.miguelgrinberg.com/index) +that provides Socket.IO integration for [Flask](/flask.html) applications. +This extension makes it easier to add bi-directional communications on the +web via the [WebSockets](/websockets.html) protocol. + +The Flask-SocketIO project is open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/LICENSE). + +[**Flask-SocketIO / flask_socketio / __init__.py**](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/./flask_socketio/__init__.py) + +```python +# __init__.py +from functools import wraps +import os +import sys + +gevent_socketio_found = True +try: + from socketio import socketio_manage +except ImportError: + gevent_socketio_found = False +if gevent_socketio_found: + print('The gevent-socketio package is incompatible with this version of ' + 'the Flask-SocketIO extension. Please uninstall it, and then ' + 'install the latest version of python-socketio in its place.') + sys.exit(1) + +import flask +from flask import _request_ctx_stack, has_request_context, json as flask_json +~~from flask.sessions import SessionMixin +import socketio +from socketio.exceptions import ConnectionRefusedError +from werkzeug.debug import DebuggedApplication +from werkzeug.serving import run_with_reloader + +from .namespace import Namespace +from .test_client import SocketIOTestClient + +__version__ = '4.3.1dev' + + +class _SocketIOMiddleware(socketio.WSGIApp): + def __init__(self, socketio_app, flask_app, socketio_path='socket.io'): + self.flask_app = flask_app + super(_SocketIOMiddleware, self).__init__(socketio_app, + flask_app.wsgi_app, + socketio_path=socketio_path) + + def __call__(self, environ, start_response): + environ = environ.copy() + environ['flask.app'] = self.flask_app + return super(_SocketIOMiddleware, self).__call__(environ, + start_response) + + +~~class _ManagedSession(dict, SessionMixin): + pass + + +class SocketIO(object): + + def __init__(self, app=None, **kwargs): + self.server = None + self.server_options = {} + self.wsgi_server = None + self.handlers = [] + self.namespace_handlers = [] + self.exception_handlers = {} + self.default_exception_handler = None + self.manage_session = True + if app is not None or 'message_queue' in kwargs: + self.init_app(app, **kwargs) + else: + self.server_options.update(kwargs) + + def init_app(self, app, **kwargs): + if app is not None: + if not hasattr(app, 'extensions'): + app.extensions = {} # pragma: no cover + app.extensions['socketio'] = self + + +## ... source file continues with no further SessionMixin examples... + +``` + diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index 4d2092929..caccac365 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -1,7 +1,7 @@ title: flask.signals got_request_exception code examples category: page slug: flask-signals-got-request-exception-examples -sortorder: 500021022 +sortorder: 500021024 toc: False sidebartitle: flask.signals got_request_exception meta: Python example code for the got_request_exception function from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index 468d11e5e..241617235 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -1,7 +1,7 @@ title: flask.signals Namespace code examples category: page slug: flask-signals-namespace-examples -sortorder: 500021021 +sortorder: 500021023 toc: False sidebartitle: flask.signals Namespace meta: Python example code for the Namespace class from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 575618647..1814271a6 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template_string code examples category: page slug: flask-templating-render-template-string-examples -sortorder: 500021024 +sortorder: 500021026 toc: False sidebartitle: flask.templating render_template_string meta: Python example code for the render_template_string function from the flask.templating module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 5420e5e80..2539a3c6b 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template code examples category: page slug: flask-templating-render-template-examples -sortorder: 500021023 +sortorder: 500021025 toc: False sidebartitle: flask.templating render_template meta: Python example code for the render_template function from the flask.templating module of the Flask project. @@ -904,7 +904,83 @@ from .forms import ( ``` -## Example 10 from Flask-User +## Example 10 from Flask-SocketIO +[Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) +([PyPI package information](https://pypi.org/project/Flask-SocketIO/), +[official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) +and +[project documentation](https://flask-socketio.readthedocs.io/en/latest/)) +is a code library by [Miguel Grinberg](https://blog.miguelgrinberg.com/index) +that provides Socket.IO integration for [Flask](/flask.html) applications. +This extension makes it easier to add bi-directional communications on the +web via the [WebSockets](/websockets.html) protocol. + +The Flask-SocketIO project is open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/LICENSE). + +[**Flask-SocketIO / example / sessions.py**](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/./example/sessions.py) + +```python +# sessions.py +~~from flask import Flask, render_template, session, request, jsonify +from flask_login import LoginManager, UserMixin, current_user, login_user, \ + logout_user +from flask_session import Session +from flask_socketio import SocketIO, emit + +app = Flask(__name__) +app.config['SECRET_KEY'] = 'top-secret!' +app.config['SESSION_TYPE'] = 'filesystem' +login = LoginManager(app) +Session(app) +socketio = SocketIO(app, manage_session=False) + + +class User(UserMixin, object): + def __init__(self, id=None): + self.id = id + + +@login.user_loader +def load_user(id): + return User(id) + + +@app.route('/') +def index(): +~~ return render_template('sessions.html') + + +@app.route('/session', methods=['GET', 'POST']) +def session_access(): + if request.method == 'GET': + return jsonify({ + 'session': session.get('value', ''), + 'user': current_user.id + if current_user.is_authenticated else 'anonymous' + }) + data = request.get_json() + if 'session' in data: + session['value'] = data['session'] + elif 'user' in data: + if data['user']: + login_user(User(data['user'])) + else: + logout_user() + return '', 204 + + +@socketio.on('get-session') +def get_session(): + emit('refresh-session', { + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 11 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -996,7 +1072,7 @@ class EmailManager(object): ``` -## Example 11 from Flasky +## Example 12 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1036,7 +1112,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 12 from Datadog Flask Example App +## Example 13 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1138,7 +1214,7 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 13 from newspie +## Example 14 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1293,7 +1369,7 @@ if __name__ == '__main__': ``` -## Example 14 from tedivms-flask +## Example 15 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 3053f90c1..9c61ecf59 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -1,7 +1,7 @@ title: flask.views http_method_funcs code examples category: page slug: flask-views-http-method-funcs-examples -sortorder: 500021027 +sortorder: 500021029 toc: False sidebartitle: flask.views http_method_funcs meta: Python example code for the http_method_funcs function from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 0b0510547..b6291f98f 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -1,7 +1,7 @@ title: flask.views MethodView code examples category: page slug: flask-views-methodview-examples -sortorder: 500021025 +sortorder: 500021027 toc: False sidebartitle: flask.views MethodView meta: Python example code for the MethodView class from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 8ef176e62..b3e022637 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -1,7 +1,7 @@ title: flask.views View code examples category: page slug: flask-views-view-examples -sortorder: 500021026 +sortorder: 500021028 toc: False sidebartitle: flask.views View meta: Python example code for the View class from the flask.views module of the Flask project. diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 067d804bf..9fc14e641 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -64,8 +64,11 @@ on GitHub. [has_app_context](/flask-ctx-has-app-context-examples.html) and [has_request_context](/flask-ctx-has-request-context-examples.html) * flask.globals [current_app](/flask-globals-current-app-examples.html) + * flask.helpers [send_file](flask-helpers-send-file-examples.html) * flask.json [JSONEncoder](/flask-json-jsonencoder-examples.html) * flask.sessions [BadSignature](/flask-sessions-badsignature-examples.html) + and + [SessionMixin](/flask-sessions-sessionmixin-examples.html) ### May * Added new example code pages for Flask modules: diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html index 026d02148..643d82f76 100644 --- a/theme/templates/code-examples/flask.html +++ b/theme/templates/code-examples/flask.html @@ -31,6 +31,7 @@

flask.globals

flask.helpers flash, make_response, + send_file, url_for

flask.json @@ -39,7 +40,8 @@

flask.json

flask.sessions BadSignature, - SessionInterface + SessionInterface, + SessionMixin

flask.signals Namespace, From 21d7bbff7948ec6d9491f9bff8687594dbb45464 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 27 Jun 2020 14:04:03 -0400 Subject: [PATCH 144/302] add additional flask examples --- .../examples/flask/flask-app-flask.markdown | 138 +++++- .../flask-example-projects-code.markdown | 12 + .../flask/flask-extensions-plug-ins.markdown | 13 + .../examples/flask/flask-globals-g.markdown | 164 ++++++- .../flask/flask-globals-request.markdown | 436 +++++++++++++++++- .../flask/flask-globals-session.markdown | 132 +++++- .../flask-helpers-make-response.markdown | 98 +++- .../flask/flask-json-jsonify.markdown | 93 +++- .../flask-templating-render-template.markdown | 95 +++- 9 files changed, 1142 insertions(+), 39 deletions(-) diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 82feaa966..994cdc627 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -356,7 +356,63 @@ def logout(): ``` -## Example 6 from flask-phone-input +## Example 6 from Flask-HTTPAuth +[Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) +([documentation](https://flask-httpauth.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/Flask-HTTPAuth/)) +is a [Flask](/flask.html) framework extension that creates +Basic and Digest HTTP authentication for routes. This project +is primarily built and maintained by +[Miguel Grinberg](https://blog.miguelgrinberg.com/). It is provided +as open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/LICENSE). + +[**Flask-HTTPAuth / tests / test_basic_get_password.py**](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/./tests/test_basic_get_password.py) + +```python +# test_basic_get_password.py +import unittest +import base64 +~~from flask import Flask +from flask_httpauth import HTTPBasicAuth + + +class HTTPAuthTestCase(unittest.TestCase): + def setUp(self): +~~ app = Flask(__name__) + app.config['SECRET_KEY'] = 'my secret' + + basic_auth = HTTPBasicAuth() + + @basic_auth.get_password + def get_basic_password(username): + if username == 'john': + return 'hello' + elif username == 'susan': + return 'bye' + else: + return None + + @app.route('/') + def index(): + return 'index' + + @app.route('/basic') + @basic_auth.login_required + def basic_auth_route(): + return 'basic_auth:' + basic_auth.username() + + self.app = app + self.basic_auth = basic_auth + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 7 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -408,7 +464,7 @@ def index(): ``` -## Example 7 from flaskSaaS +## Example 8 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -457,7 +513,7 @@ from app.models import User ``` -## Example 8 from Flask-SocketIO +## Example 9 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -568,7 +624,7 @@ if __name__ == '__main__': ``` -## Example 9 from Flask-User +## Example 10 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -651,7 +707,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 10 from Flask-VueJs-Template +## Example 11 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -692,7 +748,7 @@ def index_client(): ``` -## Example 11 from Flasky +## Example 12 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -756,7 +812,7 @@ def create_app(config_name): ``` -## Example 12 from Datadog Flask Example App +## Example 13 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -817,7 +873,71 @@ def before_request(): ``` -## Example 13 from sandman2 +## Example 14 from keras-flask-deploy-webapp +The +[keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) +project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) +with the [Keras deep learning library](https://keras.io/) to provide +an example image classifier that is easy to [deploy](/deployment.html). +The application can be quckly run in a [Docker](/docker.html) container +on your local development environment. The project is licensed under the +[GNU General Public License v3.0](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/LICENSE). + +[**keras-flask-deploy-webapp / app.py**](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/././app.py) + +```python +# app.py +import os +import sys + +~~from flask import Flask, redirect, url_for, request, render_template, Response, jsonify, redirect +from werkzeug.utils import secure_filename +from gevent.pywsgi import WSGIServer + +import tensorflow as tf +from tensorflow import keras + +from tensorflow.keras.applications.imagenet_utils import preprocess_input, decode_predictions +from tensorflow.keras.models import load_model +from tensorflow.keras.preprocessing import image + +import numpy as np +from util import base64_to_pil + + +~~app = Flask(__name__) + + +from keras.applications.mobilenet_v2 import MobileNetV2 +model = MobileNetV2(weights='imagenet') + +print('Model loaded. Check http://127.0.0.1:5000/') + + +MODEL_PATH = 'models/your_model.h5' + + + +def model_predict(img, model): + img = img.resize((224, 224)) + + x = image.img_to_array(img) + x = np.expand_dims(x, axis=0) + + x = preprocess_input(x, mode='tf') + + preds = model.predict(x) + return preds + + + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 15 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -898,7 +1018,7 @@ def get_app( ``` -## Example 14 from tedivms-flask +## Example 16 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index 26c43b5ab..cfd0f044a 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -63,6 +63,7 @@ JavaScript plugin with the library. flask-phone-input is provided as open source under the [MIT license](https://github.com/miguelgrinberg/flask-phone-input/blob/1a1c227c044474ce0fe133493d7f8b0fb8312409/LICENSE). + ### flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application @@ -84,6 +85,17 @@ while teaching developers how to use [Flask](/flask.html) in is [open sourced under the MIT license](https://github.com/miguelgrinberg/flasky/blob/master/LICENSE). +### Deploy Keras Model with Flask as Web App in 10 Minutes +The +[keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) +project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) +with the [Keras deep learning library](https://keras.io/) to provide +an example image classifier that is easy to [deploy](/deployment.html). +The application can be quckly run in a [Docker](/docker.html) container +on your local development environment. The project is licensed under the +[GNU General Public License v3.0](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/LICENSE). + + ### newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown index a73e0dd15..7a01da841 100644 --- a/content/pages/examples/flask/flask-extensions-plug-ins.markdown +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -78,6 +78,19 @@ mode. The project is provided as open source under [this license](https://github.com/flask-debugtoolbar/flask-debugtoolbar/blob/master/LICENSE). +### Flask-HTTPAuth +[Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) +([documentation](https://flask-httpauth.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/Flask-HTTPAuth/)) +is a [Flask](/flask.html) framework extension that creates +Basic and Digest HTTP authentication for routes. This project +is primarily built and maintained by +[Miguel Grinberg](https://blog.miguelgrinberg.com/). It is provided +as open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/LICENSE). + + ### Flask-Login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 855724a61..605b519a0 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -429,7 +429,163 @@ def replace_insensitive(string, target, replacement): ``` -## Example 4 from Flask-WTF +## Example 4 from Flask-HTTPAuth +[Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) +([documentation](https://flask-httpauth.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/Flask-HTTPAuth/)) +is a [Flask](/flask.html) framework extension that creates +Basic and Digest HTTP authentication for routes. This project +is primarily built and maintained by +[Miguel Grinberg](https://blog.miguelgrinberg.com/). It is provided +as open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/LICENSE). + +[**Flask-HTTPAuth / flask_httpauth.py**](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/././flask_httpauth.py) + +```python +# flask_httpauth.py + +from base64 import b64decode +from functools import wraps +from hashlib import md5 +from random import Random, SystemRandom +~~from flask import request, make_response, session, g +from werkzeug.datastructures import Authorization +from werkzeug.security import safe_str_cmp + +__version__ = '4.1.1dev' + + +class HTTPAuth(object): + def __init__(self, scheme=None, realm=None, header=None): + self.scheme = scheme + self.realm = realm or "Authentication Required" + self.header = header + self.get_password_callback = None + self.get_user_roles_callback = None + self.auth_error_callback = None + + def default_get_password(username): + return None + + def default_auth_error(status): + return "Unauthorized Access", status + + self.get_password(default_get_password) + self.error_handler(default_auth_error) + + + +## ... source file abbreviated to get to g examples ... + + + (role is not None or optional is not None): # pragma: no cover + raise ValueError( + 'role and optional are the only supported arguments') + + def login_required_internal(f): + @wraps(f) + def decorated(*args, **kwargs): + auth = self.get_auth() + + if request.method != 'OPTIONS': # pragma: no cover + password = self.get_auth_password(auth) + + status = None + user = self.authenticate(auth, password) + if user in (False, None): + status = 401 + elif not self.authorize(role, user, auth): + status = 403 + if not optional and status: + request.data + try: + return self.auth_error_callback(status) + except TypeError: + return self.auth_error_callback() + +~~ g.flask_httpauth_user = user if user is not True \ + else auth.username if auth else None + return f(*args, **kwargs) + return decorated + + if f: + return login_required_internal(f) + return login_required_internal + + def username(self): + if not request.authorization: + return "" + return request.authorization.username + + def current_user(self): + if hasattr(g, 'flask_httpauth_user'): +~~ return g.flask_httpauth_user + + +class HTTPBasicAuth(HTTPAuth): + def __init__(self, scheme=None, realm=None): + super(HTTPBasicAuth, self).__init__(scheme or 'Basic', realm) + + self.hash_password_callback = None + self.verify_password_callback = None + + def hash_password(self, f): + self.hash_password_callback = f + return f + + def verify_password(self, f): + self.verify_password_callback = f + return f + + def get_auth(self): + header = self.header or 'Authorization' + if header not in request.headers: + return None + value = request.headers[header].encode('utf-8') + try: + scheme, credentials = value.split(b' ', 1) + + +## ... source file abbreviated to get to g examples ... + + + def decorated(*args, **kwargs): + selected_auth = None + if 'Authorization' in request.headers: + try: + scheme, creds = request.headers[ + 'Authorization'].split(None, 1) + except ValueError: + pass + else: + for auth in self.additional_auth: + if auth.scheme == scheme: + selected_auth = auth + break + if selected_auth is None: + selected_auth = self.main_auth + return selected_auth.login_required(role=role)(f)( + *args, **kwargs) + return decorated + + if f: + return login_required_internal(f) + return login_required_internal + + def current_user(self): + if hasattr(g, 'flask_httpauth_user'): # pragma: no cover +~~ return g.flask_httpauth_user + + + +## ... source file continues with no further g examples... + +``` + + +## Example 5 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -630,7 +786,7 @@ class CSRFProtect(object): ``` -## Example 5 from Flask-Security-Too +## Example 6 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -750,7 +906,7 @@ def check_and_update_authn_fresh(within, grace, method=None): ``` -## Example 6 from Flask-User +## Example 7 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -847,7 +1003,7 @@ def allow_unconfirmed_email(view_function): ``` -## Example 7 from tedivms-flask +## Example 8 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index d7fa9d57c..03f17a233 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -1012,7 +1012,328 @@ if __name__ == "__main__": ``` -## Example 6 from flask-login +## Example 6 from Flask-HTTPAuth +[Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) +([documentation](https://flask-httpauth.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/Flask-HTTPAuth/)) +is a [Flask](/flask.html) framework extension that creates +Basic and Digest HTTP authentication for routes. This project +is primarily built and maintained by +[Miguel Grinberg](https://blog.miguelgrinberg.com/). It is provided +as open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/LICENSE). + +[**Flask-HTTPAuth / flask_httpauth.py**](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/././flask_httpauth.py) + +```python +# flask_httpauth.py + +from base64 import b64decode +from functools import wraps +from hashlib import md5 +from random import Random, SystemRandom +~~from flask import request, make_response, session, g +from werkzeug.datastructures import Authorization +from werkzeug.security import safe_str_cmp + +__version__ = '4.1.1dev' + + +class HTTPAuth(object): + def __init__(self, scheme=None, realm=None, header=None): + self.scheme = scheme + self.realm = realm or "Authentication Required" + self.header = header + self.get_password_callback = None + self.get_user_roles_callback = None + self.auth_error_callback = None + + def default_get_password(username): + return None + + def default_auth_error(status): + return "Unauthorized Access", status + + self.get_password(default_get_password) + self.error_handler(default_auth_error) + + + +## ... source file abbreviated to get to request examples ... + + + return f + + def get_user_roles(self, f): + self.get_user_roles_callback = f + return f + + def error_handler(self, f): + @wraps(f) + def decorated(*args, **kwargs): + res = f(*args, **kwargs) + res = make_response(res) + if res.status_code == 200: + res.status_code = 401 + if 'WWW-Authenticate' not in res.headers.keys(): + res.headers['WWW-Authenticate'] = self.authenticate_header() + return res + self.auth_error_callback = decorated + return decorated + + def authenticate_header(self): + return '{0} realm="{1}"'.format(self.scheme, self.realm) + + def get_auth(self): + auth = None + if self.header is None or self.header == 'Authorization': +~~ auth = request.authorization +~~ if auth is None and 'Authorization' in request.headers: + try: +~~ auth_type, token = request.headers['Authorization'].split( + None, 1) + auth = Authorization(auth_type, {'token': token}) + except (ValueError, KeyError): + pass +~~ elif self.header in request.headers: + auth = Authorization(self.scheme, +~~ {'token': request.headers[self.header]}) + + if auth is not None and auth.type.lower() != self.scheme.lower(): + auth = None + + return auth + + def get_auth_password(self, auth): + password = None + + if auth and auth.username: + password = self.get_password_callback(auth.username) + + return password + + def authorize(self, role, user, auth): + if role is None: + return True + if isinstance(role, (list, tuple)): + roles = role + else: + roles = [role] + if user is True: + user = auth + if self.get_user_roles_callback is None: # pragma: no cover + + +## ... source file abbreviated to get to request examples ... + + + if user_roles is None: + user_roles = {} + elif not isinstance(user_roles, (list, tuple)): + user_roles = {user_roles} + else: + user_roles = set(user_roles) + for role in roles: + if isinstance(role, (list, tuple)): + role = set(role) + if role & user_roles == role: + return True + elif role in user_roles: + return True + + def login_required(self, f=None, role=None, optional=None): + if f is not None and \ + (role is not None or optional is not None): # pragma: no cover + raise ValueError( + 'role and optional are the only supported arguments') + + def login_required_internal(f): + @wraps(f) + def decorated(*args, **kwargs): + auth = self.get_auth() + +~~ if request.method != 'OPTIONS': # pragma: no cover + password = self.get_auth_password(auth) + + status = None + user = self.authenticate(auth, password) + if user in (False, None): + status = 401 + elif not self.authorize(role, user, auth): + status = 403 + if not optional and status: +~~ request.data + try: + return self.auth_error_callback(status) + except TypeError: + return self.auth_error_callback() + + g.flask_httpauth_user = user if user is not True \ + else auth.username if auth else None + return f(*args, **kwargs) + return decorated + + if f: + return login_required_internal(f) + return login_required_internal + + def username(self): +~~ if not request.authorization: + return "" +~~ return request.authorization.username + + def current_user(self): + if hasattr(g, 'flask_httpauth_user'): + return g.flask_httpauth_user + + +class HTTPBasicAuth(HTTPAuth): + def __init__(self, scheme=None, realm=None): + super(HTTPBasicAuth, self).__init__(scheme or 'Basic', realm) + + self.hash_password_callback = None + self.verify_password_callback = None + + def hash_password(self, f): + self.hash_password_callback = f + return f + + def verify_password(self, f): + self.verify_password_callback = f + return f + + def get_auth(self): + header = self.header or 'Authorization' +~~ if header not in request.headers: + return None +~~ value = request.headers[header].encode('utf-8') + try: + scheme, credentials = value.split(b' ', 1) + username, password = b64decode(credentials).split(b':', 1) + except (ValueError, TypeError): + return None + return Authorization( + scheme, {'username': username.decode('utf-8'), + 'password': password.decode('utf-8')}) + + def authenticate(self, auth, stored_password): + if auth: + username = auth.username + client_password = auth.password + else: + username = "" + client_password = "" + if self.verify_password_callback: + return self.verify_password_callback(username, client_password) + if not auth: + return + if self.hash_password_callback: + try: + client_password = self.hash_password_callback(client_password) + except TypeError: + + +## ... source file abbreviated to get to request examples ... + + + a1 = username + ":" + self.realm + ":" + password + a1 = a1.encode('utf-8') + return md5(a1).hexdigest() + + def authenticate_header(self): + nonce = self.get_nonce() + opaque = self.get_opaque() + return '{0} realm="{1}",nonce="{2}",opaque="{3}"'.format( + self.scheme, self.realm, nonce, + opaque) + + def authenticate(self, auth, stored_password_or_ha1): + if not auth or not auth.username or not auth.realm or not auth.uri \ + or not auth.nonce or not auth.response \ + or not stored_password_or_ha1: + return False + if not(self.verify_nonce_callback(auth.nonce)) or \ + not(self.verify_opaque_callback(auth.opaque)): + return False + if self.use_ha1_pw: + ha1 = stored_password_or_ha1 + else: + a1 = auth.username + ":" + auth.realm + ":" + \ + stored_password_or_ha1 + ha1 = md5(a1.encode('utf-8')).hexdigest() +~~ a2 = request.method + ":" + auth.uri + ha2 = md5(a2.encode('utf-8')).hexdigest() + a3 = ha1 + ":" + auth.nonce + ":" + ha2 + response = md5(a3.encode('utf-8')).hexdigest() + return safe_str_cmp(response, auth.response) + + +class HTTPTokenAuth(HTTPAuth): + def __init__(self, scheme='Bearer', realm=None, header=None): + super(HTTPTokenAuth, self).__init__(scheme, realm, header) + + self.verify_token_callback = None + + def verify_token(self, f): + self.verify_token_callback = f + return f + + def authenticate(self, auth, stored_password): + if auth: + token = auth['token'] + else: + token = "" + if self.verify_token_callback: + return self.verify_token_callback(token) + + +class MultiAuth(object): + def __init__(self, main_auth, *args): + self.main_auth = main_auth + self.additional_auth = args + + def login_required(self, f=None, role=None): + if f is not None and role is not None: # pragma: no cover + raise ValueError('role is the only supported argument') + + def login_required_internal(f): + @wraps(f) + def decorated(*args, **kwargs): + selected_auth = None +~~ if 'Authorization' in request.headers: + try: +~~ scheme, creds = request.headers[ + 'Authorization'].split(None, 1) + except ValueError: + pass + else: + for auth in self.additional_auth: + if auth.scheme == scheme: + selected_auth = auth + break + if selected_auth is None: + selected_auth = self.main_auth + return selected_auth.login_required(role=role)(f)( + *args, **kwargs) + return decorated + + if f: + return login_required_internal(f) + return login_required_internal + + def current_user(self): + if hasattr(g, 'flask_httpauth_user'): # pragma: no cover + return g.flask_httpauth_user + + + +## ... source file continues with no further request examples... + +``` + + +## Example 7 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -1249,7 +1570,7 @@ def _secret_key(key=None): ``` -## Example 7 from flask-restx +## Example 8 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1357,7 +1678,7 @@ class marshal_with_field(object): ``` -## Example 8 from Flask-WTF +## Example 9 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1515,7 +1836,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 9 from flaskSaaS +## Example 10 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -1566,7 +1887,7 @@ admin.add_view(FileAdmin(path, '/static/', name='Static')) ``` -## Example 10 from Flask-Security-Too +## Example 11 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -1786,7 +2107,7 @@ class ChangePasswordForm(Form, PasswordFormMixin): ``` -## Example 11 from Flask-SocketIO +## Example 12 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -2010,7 +2331,7 @@ class TestSocketIO(unittest.TestCase): ``` -## Example 12 from Flask-User +## Example 13 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -2074,7 +2395,7 @@ def init_translations(babel): ``` -## Example 13 from Flask-VueJs-Template +## Example 14 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -2109,7 +2430,100 @@ def require_auth(func): ``` -## Example 14 from newspie +## Example 15 from keras-flask-deploy-webapp +The +[keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) +project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) +with the [Keras deep learning library](https://keras.io/) to provide +an example image classifier that is easy to [deploy](/deployment.html). +The application can be quckly run in a [Docker](/docker.html) container +on your local development environment. The project is licensed under the +[GNU General Public License v3.0](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/LICENSE). + +[**keras-flask-deploy-webapp / app.py**](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/././app.py) + +```python +# app.py +import os +import sys + +~~from flask import Flask, redirect, url_for, request, render_template, Response, jsonify, redirect +from werkzeug.utils import secure_filename +from gevent.pywsgi import WSGIServer + +import tensorflow as tf +from tensorflow import keras + +from tensorflow.keras.applications.imagenet_utils import preprocess_input, decode_predictions +from tensorflow.keras.models import load_model +from tensorflow.keras.preprocessing import image + +import numpy as np +from util import base64_to_pil + + +app = Flask(__name__) + + +from keras.applications.mobilenet_v2 import MobileNetV2 +model = MobileNetV2(weights='imagenet') + +print('Model loaded. Check http://127.0.0.1:5000/') + + +MODEL_PATH = 'models/your_model.h5' + + + +def model_predict(img, model): + img = img.resize((224, 224)) + + x = image.img_to_array(img) + x = np.expand_dims(x, axis=0) + + x = preprocess_input(x, mode='tf') + + preds = model.predict(x) + return preds + + +@app.route('/', methods=['GET']) +def index(): + return render_template('index.html') + + +@app.route('/predict', methods=['GET', 'POST']) +def predict(): +~~ if request.method == 'POST': + img = base64_to_pil(request.json) + + + preds = model_predict(img, model) + + pred_proba = "{:.3f}".format(np.amax(preds)) # Max probability + pred_class = decode_predictions(preds, top=1) # ImageNet Decode + + result = str(pred_class[0][0][1]) # Convert to string + result = result.replace('_', ' ').capitalize() + + return jsonify(result=result, probability=pred_proba) + + return None + + +if __name__ == '__main__': + + http_server = WSGIServer(('0.0.0.0', 5000), app) + http_server.serve_forever() + + + +## ... source file continues with no further request examples... + +``` + + +## Example 16 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -2290,7 +2704,7 @@ if __name__ == '__main__': ``` -## Example 15 from sandman2 +## Example 17 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2491,7 +2905,7 @@ class Service(MethodView): ``` -## Example 16 from tedivms-flask +## Example 18 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index d31bb9847..7d923b563 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -321,7 +321,125 @@ if __name__ == "__main__": ``` -## Example 4 from flask-login +## Example 4 from Flask-HTTPAuth +[Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) +([documentation](https://flask-httpauth.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/Flask-HTTPAuth/)) +is a [Flask](/flask.html) framework extension that creates +Basic and Digest HTTP authentication for routes. This project +is primarily built and maintained by +[Miguel Grinberg](https://blog.miguelgrinberg.com/). It is provided +as open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/LICENSE). + +[**Flask-HTTPAuth / flask_httpauth.py**](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/././flask_httpauth.py) + +```python +# flask_httpauth.py + +from base64 import b64decode +from functools import wraps +from hashlib import md5 +from random import Random, SystemRandom +~~from flask import request, make_response, session, g +from werkzeug.datastructures import Authorization +from werkzeug.security import safe_str_cmp + +__version__ = '4.1.1dev' + + +class HTTPAuth(object): + def __init__(self, scheme=None, realm=None, header=None): + self.scheme = scheme + self.realm = realm or "Authentication Required" + self.header = header + self.get_password_callback = None + self.get_user_roles_callback = None + self.auth_error_callback = None + + def default_get_password(username): + return None + + def default_auth_error(status): + return "Unauthorized Access", status + + self.get_password(default_get_password) + self.error_handler(default_auth_error) + + + +## ... source file abbreviated to get to session examples ... + + + + +class HTTPDigestAuth(HTTPAuth): + def __init__(self, scheme=None, realm=None, use_ha1_pw=False): + super(HTTPDigestAuth, self).__init__(scheme or 'Digest', realm) + self.use_ha1_pw = use_ha1_pw + self.random = SystemRandom() + try: + self.random.random() + except NotImplementedError: # pragma: no cover + self.random = Random() + + self.generate_nonce_callback = None + self.verify_nonce_callback = None + self.generate_opaque_callback = None + self.verify_opaque_callback = None + + def _generate_random(): + return md5(str(self.random.random()).encode('utf-8')).hexdigest() + + def default_generate_nonce(): + session["auth_nonce"] = _generate_random() + return session["auth_nonce"] + + def default_verify_nonce(nonce): +~~ session_nonce = session.get("auth_nonce") + if nonce is None or session_nonce is None: + return False + return safe_str_cmp(nonce, session_nonce) + + def default_generate_opaque(): + session["auth_opaque"] = _generate_random() + return session["auth_opaque"] + + def default_verify_opaque(opaque): +~~ session_opaque = session.get("auth_opaque") + if opaque is None or session_opaque is None: # pragma: no cover + return False + return safe_str_cmp(opaque, session_opaque) + + self.generate_nonce(default_generate_nonce) + self.generate_opaque(default_generate_opaque) + self.verify_nonce(default_verify_nonce) + self.verify_opaque(default_verify_opaque) + + def generate_nonce(self, f): + self.generate_nonce_callback = f + return f + + def verify_nonce(self, f): + self.verify_nonce_callback = f + return f + + def generate_opaque(self, f): + self.generate_opaque_callback = f + return f + + def verify_opaque(self, f): + self.verify_opaque_callback = f + return f + + +## ... source file continues with no further session examples... + +``` + + +## Example 5 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -478,7 +596,7 @@ def login_required(func): ``` -## Example 5 from Flask-WTF +## Example 6 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -589,7 +707,7 @@ def _get_config( ``` -## Example 6 from flaskSaaS +## Example 7 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -661,7 +779,7 @@ logger = wrap_logger( ``` -## Example 7 from Flask-Security-Too +## Example 8 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -747,7 +865,7 @@ def tf_send_security_token(user, method, totp_secret, phone_number): ``` -## Example 8 from Flask-SocketIO +## Example 9 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -843,7 +961,7 @@ if __name__ == '__main__': ``` -## Example 9 from Flask-User +## Example 10 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -951,7 +1069,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 10 from tedivms-flask +## Example 11 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 14c79bf24..6fe9a178f 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -113,7 +113,97 @@ def permission_name(name): ``` -## Example 2 from flask-restx +## Example 2 from Flask-HTTPAuth +[Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) +([documentation](https://flask-httpauth.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/Flask-HTTPAuth/)) +is a [Flask](/flask.html) framework extension that creates +Basic and Digest HTTP authentication for routes. This project +is primarily built and maintained by +[Miguel Grinberg](https://blog.miguelgrinberg.com/). It is provided +as open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/LICENSE). + +[**Flask-HTTPAuth / flask_httpauth.py**](https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/master/././flask_httpauth.py) + +```python +# flask_httpauth.py + +from base64 import b64decode +from functools import wraps +from hashlib import md5 +from random import Random, SystemRandom +~~from flask import request, make_response, session, g +from werkzeug.datastructures import Authorization +from werkzeug.security import safe_str_cmp + +__version__ = '4.1.1dev' + + +class HTTPAuth(object): + def __init__(self, scheme=None, realm=None, header=None): + self.scheme = scheme + self.realm = realm or "Authentication Required" + self.header = header + self.get_password_callback = None + self.get_user_roles_callback = None + self.auth_error_callback = None + + def default_get_password(username): + return None + + def default_auth_error(status): + return "Unauthorized Access", status + + self.get_password(default_get_password) + self.error_handler(default_auth_error) + + def get_password(self, f): + self.get_password_callback = f + return f + + def get_user_roles(self, f): + self.get_user_roles_callback = f + return f + + def error_handler(self, f): + @wraps(f) + def decorated(*args, **kwargs): + res = f(*args, **kwargs) +~~ res = make_response(res) + if res.status_code == 200: + res.status_code = 401 + if 'WWW-Authenticate' not in res.headers.keys(): + res.headers['WWW-Authenticate'] = self.authenticate_header() + return res + self.auth_error_callback = decorated + return decorated + + def authenticate_header(self): + return '{0} realm="{1}"'.format(self.scheme, self.realm) + + def get_auth(self): + auth = None + if self.header is None or self.header == 'Authorization': + auth = request.authorization + if auth is None and 'Authorization' in request.headers: + try: + auth_type, token = request.headers['Authorization'].split( + None, 1) + auth = Authorization(auth_type, {'token': token}) + except (ValueError, KeyError): + pass + elif self.header in request.headers: + auth = Authorization(self.scheme, + + +## ... source file continues with no further make_response examples... + +``` + + +## Example 3 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -197,7 +287,7 @@ def crossdomain( ``` -## Example 3 from Flask-Security-Too +## Example 4 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -329,7 +419,7 @@ def login(): ``` -## Example 4 from newspie +## Example 5 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -436,7 +526,7 @@ def parse_articles(response): ``` -## Example 5 from sandman2 +## Example 6 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 055374d29..5798ca857 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -765,7 +765,96 @@ def stream(): ``` -## Example 6 from sandman2 +## Example 6 from keras-flask-deploy-webapp +The +[keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) +project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) +with the [Keras deep learning library](https://keras.io/) to provide +an example image classifier that is easy to [deploy](/deployment.html). +The application can be quckly run in a [Docker](/docker.html) container +on your local development environment. The project is licensed under the +[GNU General Public License v3.0](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/LICENSE). + +[**keras-flask-deploy-webapp / app.py**](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/././app.py) + +```python +# app.py +import os +import sys + +~~from flask import Flask, redirect, url_for, request, render_template, Response, jsonify, redirect +from werkzeug.utils import secure_filename +from gevent.pywsgi import WSGIServer + +import tensorflow as tf +from tensorflow import keras + +from tensorflow.keras.applications.imagenet_utils import preprocess_input, decode_predictions +from tensorflow.keras.models import load_model +from tensorflow.keras.preprocessing import image + +import numpy as np +from util import base64_to_pil + + +app = Flask(__name__) + + +from keras.applications.mobilenet_v2 import MobileNetV2 +model = MobileNetV2(weights='imagenet') + +print('Model loaded. Check http://127.0.0.1:5000/') + + +MODEL_PATH = 'models/your_model.h5' + + +## ... source file abbreviated to get to jsonify examples ... + + + x = preprocess_input(x, mode='tf') + + preds = model.predict(x) + return preds + + +@app.route('/', methods=['GET']) +def index(): + return render_template('index.html') + + +@app.route('/predict', methods=['GET', 'POST']) +def predict(): + if request.method == 'POST': + img = base64_to_pil(request.json) + + + preds = model_predict(img, model) + + pred_proba = "{:.3f}".format(np.amax(preds)) # Max probability + pred_class = decode_predictions(preds, top=1) # ImageNet Decode + + result = str(pred_class[0][0][1]) # Convert to string + result = result.replace('_', ' ').capitalize() + +~~ return jsonify(result=result, probability=pred_proba) + + return None + + +if __name__ == '__main__': + + http_server = WSGIServer(('0.0.0.0', 5000), app) + http_server.serve_forever() + + + +## ... source file continues with no further jsonify examples... + +``` + + +## Example 7 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -933,7 +1022,7 @@ class Service(MethodView): ``` -## Example 7 from tedivms-flask +## Example 8 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 2539a3c6b..bd70afbba 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1214,7 +1214,98 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 14 from newspie +## Example 14 from keras-flask-deploy-webapp +The +[keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) +project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) +with the [Keras deep learning library](https://keras.io/) to provide +an example image classifier that is easy to [deploy](/deployment.html). +The application can be quckly run in a [Docker](/docker.html) container +on your local development environment. The project is licensed under the +[GNU General Public License v3.0](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/LICENSE). + +[**keras-flask-deploy-webapp / app.py**](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/././app.py) + +```python +# app.py +import os +import sys + +~~from flask import Flask, redirect, url_for, request, render_template, Response, jsonify, redirect +from werkzeug.utils import secure_filename +from gevent.pywsgi import WSGIServer + +import tensorflow as tf +from tensorflow import keras + +from tensorflow.keras.applications.imagenet_utils import preprocess_input, decode_predictions +from tensorflow.keras.models import load_model +from tensorflow.keras.preprocessing import image + +import numpy as np +from util import base64_to_pil + + +app = Flask(__name__) + + +from keras.applications.mobilenet_v2 import MobileNetV2 +model = MobileNetV2(weights='imagenet') + +print('Model loaded. Check http://127.0.0.1:5000/') + + +MODEL_PATH = 'models/your_model.h5' + + + +def model_predict(img, model): + img = img.resize((224, 224)) + + x = image.img_to_array(img) + x = np.expand_dims(x, axis=0) + + x = preprocess_input(x, mode='tf') + + preds = model.predict(x) + return preds + + +@app.route('/', methods=['GET']) +def index(): +~~ return render_template('index.html') + + +@app.route('/predict', methods=['GET', 'POST']) +def predict(): + if request.method == 'POST': + img = base64_to_pil(request.json) + + + preds = model_predict(img, model) + + pred_proba = "{:.3f}".format(np.amax(preds)) # Max probability + pred_class = decode_predictions(preds, top=1) # ImageNet Decode + + result = str(pred_class[0][0][1]) # Convert to string + result = result.replace('_', ' ').capitalize() + + return jsonify(result=result, probability=pred_proba) + + return None + + +if __name__ == '__main__': + + http_server = WSGIServer(('0.0.0.0', 5000), app) + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 15 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1369,7 +1460,7 @@ if __name__ == '__main__': ``` -## Example 15 from tedivms-flask +## Example 16 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own From 472fcf405fb75eabf8b7c525770f88ccf7a7633b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 27 Jun 2020 16:17:40 -0400 Subject: [PATCH 145/302] fixing some typos on flask pages --- .../pages/examples/flask/flask-cli-with-appcontext.markdown | 4 ++-- .../examples/flask/flask-ctx-after-this-request.markdown | 4 ++-- .../pages/examples/flask/flask-ctx-has-app-context.markdown | 4 ++-- .../examples/flask/flask-ctx-has-request-context.markdown | 4 ++-- .../pages/examples/flask/flask-globals-current-app.markdown | 4 ++-- content/pages/examples/flask/flask-globals-g.markdown | 4 ++-- content/pages/examples/flask/flask-globals-request.markdown | 4 ++-- content/pages/examples/flask/flask-globals-session.markdown | 4 ++-- content/pages/examples/flask/flask-helpers-flash.markdown | 4 ++-- .../pages/examples/flask/flask-helpers-make-response.markdown | 4 ++-- content/pages/examples/flask/flask-helpers-send-file.markdown | 4 ++-- content/pages/examples/flask/flask-helpers-url-for.markdown | 4 ++-- content/pages/examples/flask/flask-json-jsonify.markdown | 4 ++-- .../flask/flask-signals-got-request-exception.markdown | 4 ++-- .../flask/flask-templating-render-template-string.markdown | 4 ++-- .../examples/flask/flask-templating-render-template.markdown | 4 ++-- .../examples/flask/flask-views-http-method-funcs.markdown | 2 +- 17 files changed, 33 insertions(+), 33 deletions(-) diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index 5bc95f594..50ffa28f3 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -4,10 +4,10 @@ slug: flask-cli-with-appcontext-examples sortorder: 500021006 toc: False sidebartitle: flask.cli with_appcontext -meta: Python example code for the with_appcontext function from the flask.cli module of the Flask project. +meta: Python example code for the with_appcontext callable from the flask.cli module of the Flask project. -with_appcontext is a function within the flask.cli module of the Flask project. +with_appcontext is a callable within the flask.cli module of the Flask project. ## Example 1 from FlaskBB diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index d60ea73da..bc071e47e 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -4,10 +4,10 @@ slug: flask-ctx-after-this-request-examples sortorder: 500021007 toc: False sidebartitle: flask.ctx after_this_request -meta: Python example code for the after_this_request function from the flask.ctx module of the Flask project. +meta: Python example code for the after_this_request callable from the flask.ctx module of the Flask project. -after_this_request is a function within the flask.ctx module of the Flask project. +after_this_request is a callable within the flask.ctx module of the Flask project. ## Example 1 from Flask-Security-Too diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index f14cffe90..9c5321c3e 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -4,10 +4,10 @@ slug: flask-ctx-has-app-context-examples sortorder: 500021008 toc: False sidebartitle: flask.ctx has_app_context -meta: Python example code for the has_app_context function from the flask.ctx module of the Flask project. +meta: Python example code for the has_app_context callable from the flask.ctx module of the Flask project. -has_app_context is a function within the flask.ctx module of the Flask project. +has_app_context is a callable within the flask.ctx module of the Flask project. ## Example 1 from flask-restx diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index d54b14955..0fc833106 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -4,10 +4,10 @@ slug: flask-ctx-has-request-context-examples sortorder: 500021009 toc: False sidebartitle: flask.ctx has_request_context -meta: Python example code for the has_request_context function from the flask.ctx module of the Flask project. +meta: Python example code for the has_request_context callable from the flask.ctx module of the Flask project. -has_request_context is a function within the flask.ctx module of the Flask project. +has_request_context is a callable within the flask.ctx module of the Flask project. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index b49b271f2..6e5369d7d 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -4,10 +4,10 @@ slug: flask-globals-current-app-examples sortorder: 500021010 toc: False sidebartitle: flask.globals current_app -meta: Python example code for the current_app function from the flask.globals module of the Flask project. +meta: Python example code for the current_app callable from the flask.globals module of the Flask project. -current_app is a function within the flask.globals module of the Flask project. +current_app is a callable within the flask.globals module of the Flask project. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 605b519a0..45f967df1 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -4,10 +4,10 @@ slug: flask-globals-g-examples sortorder: 500021011 toc: False sidebartitle: flask.globals g -meta: Python example code for the g function from the flask.globals module of the Flask project. +meta: Python example code for the g callable from the flask.globals module of the Flask project. -g is a function within the flask.globals module of the Flask project. +g is a callable within the flask.globals module of the Flask project. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 03f17a233..1414388f5 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -4,10 +4,10 @@ slug: flask-globals-request-examples sortorder: 500021012 toc: False sidebartitle: flask.globals request -meta: Python example code for the request function from the flask.globals module of the Flask project. +meta: Python example code for the request callable from the flask.globals module of the Flask project. -request is a function within the flask.globals module of the Flask project. +request is a callable within the flask.globals module of the Flask project. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 7d923b563..cc28bc8d8 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -4,10 +4,10 @@ slug: flask-globals-session-examples sortorder: 500021013 toc: False sidebartitle: flask.globals session -meta: Python example code for the session function from the flask.globals module of the Flask project. +meta: Python example code for the session callable from the flask.globals module of the Flask project. -session is a function within the flask.globals module of the Flask project. +session is a callable within the flask.globals module of the Flask project. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 81fdf7ae5..f96f7cb49 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -4,10 +4,10 @@ slug: flask-helpers-flash-examples sortorder: 500021014 toc: False sidebartitle: flask.helpers flash -meta: Python example code for the flash function from the flask.helpers module of the Flask project. +meta: Python example code for the flash callable from the flask.helpers module of the Flask project. -flash is a function within the flask.helpers module of the Flask project. +flash is a callable within the flask.helpers module of the Flask project. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 6fe9a178f..cdd8819d4 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -4,10 +4,10 @@ slug: flask-helpers-make-response-examples sortorder: 500021015 toc: False sidebartitle: flask.helpers make_response -meta: Python example code for the make_response function from the flask.helpers module of the Flask project. +meta: Python example code for the make_response callable from the flask.helpers module of the Flask project. -make_response is a function within the flask.helpers module of the Flask project. +make_response is a callable within the flask.helpers module of the Flask project. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown index 2b013e7f3..3f61c1def 100644 --- a/content/pages/examples/flask/flask-helpers-send-file.markdown +++ b/content/pages/examples/flask/flask-helpers-send-file.markdown @@ -4,10 +4,10 @@ slug: flask-helpers-send-file-examples sortorder: 500021016 toc: False sidebartitle: flask.helpers send_file -meta: Python example code for the send_file function from the flask.helpers module of the Flask project. +meta: Python example code for the send_file callable from the flask.helpers module of the Flask project. -send_file is a function within the flask.helpers module of the Flask project. +send_file is a callable within the flask.helpers module of the Flask project. ## Example 1 from Flask-VueJs-Template diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 877c086fb..42d1c1503 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -4,10 +4,10 @@ slug: flask-helpers-url-for-examples sortorder: 500021017 toc: False sidebartitle: flask.helpers url_for -meta: Python example code for the url_for function from the flask.helpers module of the Flask project. +meta: Python example code for the url_for callable from the flask.helpers module of the Flask project. -url_for is a function within the flask.helpers module of the Flask project. +url_for is a callable within the flask.helpers module of the Flask project. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 5798ca857..df1f41a83 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -4,10 +4,10 @@ slug: flask-json-jsonify-examples sortorder: 500021019 toc: False sidebartitle: flask.json jsonify -meta: Python example code for the jsonify function from the flask.json module of the Flask project. +meta: Python example code for the jsonify callable from the flask.json module of the Flask project. -jsonify is a function within the flask.json module of the Flask project. +jsonify is a callable within the flask.json module of the Flask project. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index caccac365..b6985e212 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -4,10 +4,10 @@ slug: flask-signals-got-request-exception-examples sortorder: 500021024 toc: False sidebartitle: flask.signals got_request_exception -meta: Python example code for the got_request_exception function from the flask.signals module of the Flask project. +meta: Python example code for the got_request_exception callable from the flask.signals module of the Flask project. -got_request_exception is a function within the flask.signals module of the Flask project. +got_request_exception is a callable within the flask.signals module of the Flask project. ## Example 1 from flask-restx diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 1814271a6..41ceee074 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -4,10 +4,10 @@ slug: flask-templating-render-template-string-examples sortorder: 500021026 toc: False sidebartitle: flask.templating render_template_string -meta: Python example code for the render_template_string function from the flask.templating module of the Flask project. +meta: Python example code for the render_template_string callable from the flask.templating module of the Flask project. -render_template_string is a function within the flask.templating module of the Flask project. +render_template_string is a callable within the flask.templating module of the Flask project. ## Example 1 from Flask-User diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index bd70afbba..d6b704b66 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -4,10 +4,10 @@ slug: flask-templating-render-template-examples sortorder: 500021025 toc: False sidebartitle: flask.templating render_template -meta: Python example code for the render_template function from the flask.templating module of the Flask project. +meta: Python example code for the render_template callable from the flask.templating module of the Flask project. -render_template is a function within the flask.templating module of the Flask project. +render_template is a callable within the flask.templating module of the Flask project. ## Example 1 from FlaskBB diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 9c61ecf59..8e06991ad 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -4,7 +4,7 @@ slug: flask-views-http-method-funcs-examples sortorder: 500021029 toc: False sidebartitle: flask.views http_method_funcs -meta: Python example code for the http_method_funcs function from the flask.views module of the Flask project. +meta: Python example code for the http_method_funcs callable from the flask.views module of the Flask project. `http_method_funcs` is an immutable Python set within the From e4828be1fcb7775ae91856782d027533147e449e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 28 Jun 2020 14:02:36 -0400 Subject: [PATCH 146/302] adding a couple of sqlalchemy extensions as to list --- .../sqlalchemy-extensions-plug-ins.markdown | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index 8ddfbe31b..ab4bd2167 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -61,6 +61,18 @@ flask-sqlalchemy is provided as open source under the [BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). +### GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + + ### GINO [GINO](https://github.com/fantix/gino) ([project documentation](https://python-gino.readthedocs.io/en/latest/) @@ -74,6 +86,21 @@ with asynchronously-run code, for example, an application written with GINO is open sourced under the [BSD License](https://github.com/python-gino/gino/blob/master/LICENSE). +### graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + + ### marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) ([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/) From ff285a2879166b440e2008a73bab4e5e72f98ae9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 28 Jun 2020 14:07:38 -0400 Subject: [PATCH 147/302] working on sqlalchemy examples --- .../sqlalchemy-dialects-mssql.markdown | 4 +- .../sqlalchemy-dialects-mysql.markdown | 4 +- .../sqlalchemy-dialects-oracle.markdown | 4 +- ...alchemy-dialects-postgresql-array.markdown | 4 +- ...ts-postgresql-base-pgtypecompiler.markdown | 2 +- ...lchemy-dialects-postgresql-bigint.markdown | 4 +- ...qlalchemy-dialects-postgresql-bit.markdown | 4 +- ...lects-postgresql-double-precision.markdown | 61 +++++ ...ects-postgresql-excludeconstraint.markdown | 2 +- ...chemy-dialects-postgresql-integer.markdown | 6 +- ...lalchemy-dialects-postgresql-json.markdown | 6 +- ...resql-psycopg2-pgdialect-psycopg2.markdown | 2 +- ...hemy-dialects-postgresql-tsvector.markdown | 6 +- .../sqlalchemy-dialects-postgresql.markdown | 96 +++++++- .../sqlalchemy-dialects-sqlite.markdown | 4 +- .../sqlalchemy-engine-connection.markdown | 48 +++- ...emy-engine-default-defaultdialect.markdown | 2 +- .../sqlalchemy-engine-default.markdown | 6 +- .../sqlalchemy-engine-engine.markdown | 2 +- ...-engine-strategies-enginestrategy.markdown | 2 +- ...ine-strategies-mockenginestrategy.markdown | 2 +- .../sqlalchemy-engine-url-make-url.markdown | 6 +- .../sqlalchemy/sqlalchemy-engine-url.markdown | 6 +- ...lalchemy-events-schemaeventtarget.markdown | 2 +- .../sqlalchemy-exc-argumenterror.markdown | 98 ++++++++ .../sqlalchemy-exc-dataerror.markdown | 2 +- .../sqlalchemy-exc-integrityerror.markdown | 2 +- ...qlalchemy-exc-invalidrequesterror.markdown | 2 +- ...alchemy-exc-noinspectionavailable.markdown | 2 +- .../sqlalchemy-exc-operationalerror.markdown | 2 +- .../sqlalchemy-exc-programmingerror.markdown | 2 +- ...lalchemy-ext-automap-automap-base.markdown | 6 +- .../sqlalchemy-ext-compiler-compiles.markdown | 153 ++++++++++++- .../sqlalchemy-ext-compiler.markdown | 6 +- ...-ext-declarative-declarative-base.markdown | 76 +++++- ...y-ext-declarative-declarativemeta.markdown | 2 +- ...lchemy-ext-hybrid-hybrid-property.markdown | 6 +- .../sqlalchemy-ext-mutable-mutable.markdown | 2 +- .../sqlalchemy-inspection-inspect.markdown | 103 ++++++++- ...-attributes-instrumentedattribute.markdown | 2 +- .../sqlalchemy-orm-attributes.markdown | 6 +- .../sqlalchemy-orm-class-mapper.markdown | 85 ++++++- ...-orm-collections-instrumentedlist.markdown | 2 +- .../sqlalchemy-orm-column-property.markdown | 124 ++++++++++ .../sqlalchemy-orm-columnproperty.markdown | 157 ++++++++++++- .../sqlalchemy-orm-composite.markdown | 121 ++++++++++ .../sqlalchemy-orm-compositeproperty.markdown | 120 ++++++++++ .../sqlalchemy-orm-exc-noresultfound.markdown | 105 ++++++++- ...lchemy-orm-exc-unmappedclasserror.markdown | 80 ++++++- ...emy-orm-exc-unmappedinstanceerror.markdown | 91 +++++++- ...emy-orm-interfaces-mapperproperty.markdown | 2 +- ...emy-orm-interfaces-propcomparator.markdown | 2 +- .../sqlalchemy-orm-interfaces.markdown | 110 +++++++++ .../sqlalchemy/sqlalchemy-orm-mapper.markdown | 6 +- .../sqlalchemy-orm-mapperlib.markdown | 6 +- .../sqlalchemy-orm-object-mapper.markdown | 97 ++++++++ .../sqlalchemy-orm-object-session.markdown | 6 +- ...emy-orm-properties-columnproperty.markdown | 2 +- ...m-properties-relationshipproperty.markdown | 2 +- .../sqlalchemy-orm-query-query.markdown | 112 +++++++++ ...sqlalchemy-orm-query-querycontext.markdown | 79 +++++++ .../sqlalchemy-orm-relationship.markdown | 126 ++++++++++ ...lchemy-orm-session-object-session.markdown | 6 +- .../sqlalchemy-orm-session-session.markdown | 2 +- .../sqlalchemy-orm-session.markdown | 72 ++++++ .../sqlalchemy-orm-sessionmaker.markdown | 72 ++++++ .../sqlalchemy-orm-strategies.markdown | 69 ++++++ .../sqlalchemy-orm-synonymproperty.markdown | 2 +- .../sqlalchemy-orm-util-aliasedinsp.markdown | 2 +- .../sqlalchemy-pool-nullpool.markdown | 2 +- .../sqlalchemy-pool-staticpool.markdown | 2 +- ...sqlalchemy-schema-checkconstraint.markdown | 2 +- .../sqlalchemy-schema-column.markdown | 2 +- .../sqlalchemy-schema-createindex.markdown | 2 +- .../sqlalchemy-schema-ddlelement.markdown | 2 +- ...chemy-schema-foreignkeyconstraint.markdown | 2 +- ...chemy-schema-primarykeyconstraint.markdown | 2 +- .../sqlalchemy-schema-table.markdown | 2 +- .../sqlalchemy-sql-clauseelement.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-column.markdown | 6 +- ...lchemy-sql-elements-columnelement.markdown | 69 ++++++ .../sqlalchemy-sql-elements-label.markdown | 2 +- ...hemy-sql-expression-clauseelement.markdown | 2 +- ...chemy-sql-expression-columnclause.markdown | 2 +- ...hemy-sql-expression-columnelement.markdown | 2 +- ...alchemy-sql-expression-executable.markdown | 2 +- ...my-sql-expression-functionelement.markdown | 102 ++++++++- ...my-sql-expression-unaryexpression.markdown | 2 +- .../sqlalchemy-sql-expression.markdown | 106 +++++++++ ...emy-sql-functions-functionelement.markdown | 106 +++++++++ ...emy-sql-functions-genericfunction.markdown | 2 +- .../sqlalchemy-sql-functions.markdown | 149 ++++++++++++ .../sqlalchemy-sql-naming-conv.markdown | 6 +- .../sqlalchemy-sql-operators.markdown | 82 +++++++ .../sqlalchemy-sql-schema-schemaitem.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-schema.markdown | 6 +- .../sqlalchemy/sqlalchemy-sql-select.markdown | 149 ++++++++++++ .../sqlalchemy-sql-sqltypes.markdown | 216 +++++++++--------- .../sqlalchemy/sqlalchemy-sql-table.markdown | 6 +- ...sqlalchemy-sql-util-clauseadapter.markdown | 2 +- .../sqlalchemy-sql-visitors-traverse.markdown | 6 +- .../sqlalchemy/sqlalchemy-types-enum.markdown | 148 ++++++++++++ .../sqlalchemy-types-integer.markdown | 88 ++++++- .../sqlalchemy-types-nulltype.markdown | 6 +- .../sqlalchemy-types-to-instance.markdown | 106 +++++++++ .../sqlalchemy-types-userdefinedtype.markdown | 60 +++++ ...qlalchemy-util-langhelpers-symbol.markdown | 6 +- .../sqlalchemy-util-ordereddict.markdown | 2 +- .../sqlalchemy-util-orderedset.markdown | 2 +- ...qlalchemy-util-set-creation-order.markdown | 6 +- .../sqlalchemy-util-topological.markdown | 6 +- theme/templates/code-examples/sqlalchemy.html | 32 ++- 112 files changed, 3655 insertions(+), 271 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown index 2762bcb44..ade3ee160 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown @@ -4,10 +4,10 @@ slug: sqlalchemy-dialects-mssql-examples sortorder: 500031000 toc: False sidebartitle: sqlalchemy.dialects mssql -meta: Python example code for the mssql function from the sqlalchemy.dialects module of the SQLAlchemy project. +meta: Python example code for the mssql callable from the sqlalchemy.dialects module of the SQLAlchemy project. -mssql is a function within the sqlalchemy.dialects module of the SQLAlchemy project. +mssql is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. ## Example 1 from marshmallow-sqlalchemy diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown index 4d624b9d0..7fa66cd12 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown @@ -4,10 +4,10 @@ slug: sqlalchemy-dialects-mysql-examples sortorder: 500031001 toc: False sidebartitle: sqlalchemy.dialects mysql -meta: Python example code for the mysql function from the sqlalchemy.dialects module of the SQLAlchemy project. +meta: Python example code for the mysql callable from the sqlalchemy.dialects module of the SQLAlchemy project. -mysql is a function within the sqlalchemy.dialects module of the SQLAlchemy project. +mysql is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. ## Example 1 from marshmallow-sqlalchemy diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown index f66c36fa7..5fb4c5a2c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown @@ -4,10 +4,10 @@ slug: sqlalchemy-dialects-oracle-examples sortorder: 500031002 toc: False sidebartitle: sqlalchemy.dialects oracle -meta: Python example code for the oracle function from the sqlalchemy.dialects module of the SQLAlchemy project. +meta: Python example code for the oracle callable from the sqlalchemy.dialects module of the SQLAlchemy project. -oracle is a function within the sqlalchemy.dialects module of the SQLAlchemy project. +oracle is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown index dbe8b51dc..75a09a9ee 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown @@ -4,10 +4,10 @@ slug: sqlalchemy-dialects-postgresql-array-examples sortorder: 500031005 toc: False sidebartitle: sqlalchemy.dialects.postgresql ARRAY -meta: Python example code for the ARRAY class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code for the ARRAY constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -ARRAY is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +ARRAY is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown index 39a32c1b3..1e0f53adf 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.dialects.postgresql.base PGTypeCompiler code examples category: page slug: sqlalchemy-dialects-postgresql-base-pgtypecompiler-examples -sortorder: 500031012 +sortorder: 500031013 toc: False sidebartitle: sqlalchemy.dialects.postgresql.base PGTypeCompiler meta: Python example code for the PGTypeCompiler class from the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown index 728a4450c..4ec3b0168 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown @@ -4,10 +4,10 @@ slug: sqlalchemy-dialects-postgresql-bigint-examples sortorder: 500031006 toc: False sidebartitle: sqlalchemy.dialects.postgresql BIGINT -meta: Python example code for the BIGINT class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code for the BIGINT constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -BIGINT is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +BIGINT is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown index 817d1ba8b..f2dc582ee 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown @@ -4,10 +4,10 @@ slug: sqlalchemy-dialects-postgresql-bit-examples sortorder: 500031007 toc: False sidebartitle: sqlalchemy.dialects.postgresql BIT -meta: Python example code for the BIT class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code for the BIT constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -BIT is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +BIT is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown new file mode 100644 index 000000000..a3313b00a --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown @@ -0,0 +1,61 @@ +title: sqlalchemy.dialects.postgresql DOUBLE_PRECISION code examples +category: page +slug: sqlalchemy-dialects-postgresql-double-precision-examples +sortorder: 500031008 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql DOUBLE_PRECISION +meta: Python example code for the DOUBLE_PRECISION constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +DOUBLE_PRECISION is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / comparator.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./comparator.py) + +```python +# comparator.py + +from sqlalchemy import types as sqltypes +from sqlalchemy.types import UserDefinedType +~~from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION +from sqlalchemy.sql import operators +try: + from sqlalchemy.sql.functions import _FunctionGenerator +except ImportError: # SQLA < 0.9 # pragma: no cover + from sqlalchemy.sql.expression import _FunctionGenerator + + +INTERSECTS = operators.custom_op('&&') +OVERLAPS_OR_TO_LEFT = operators.custom_op('&<') +OVERLAPS_OR_TO_RIGHT = operators.custom_op('&>') +OVERLAPS_OR_BELOW = operators.custom_op('&<|') +TO_LEFT = operators.custom_op('<<') +BELOW = operators.custom_op('<<|') +TO_RIGHT = operators.custom_op('>>') +CONTAINED = operators.custom_op('@') +OVERLAPS_OR_ABOVE = operators.custom_op('|&>') +ABOVE = operators.custom_op('|>>') +CONTAINS = operators.custom_op('-') +SAME = operators.custom_op('-=') +DISTANCE_CENTROID = operators.custom_op('<->') +DISTANCE_BOX = operators.custom_op('<#>') + + +class BaseComparator(UserDefinedType.Comparator): + + +## ... source file continues with no further DOUBLE_PRECISION examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown index a74008241..6c160a001 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.dialects.postgresql ExcludeConstraint code examples category: page slug: sqlalchemy-dialects-postgresql-excludeconstraint-examples -sortorder: 500031008 +sortorder: 500031009 toc: False sidebartitle: sqlalchemy.dialects.postgresql ExcludeConstraint meta: Python example code for the ExcludeConstraint class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown index fc836281a..af1cee9a1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.dialects.postgresql INTEGER code examples category: page slug: sqlalchemy-dialects-postgresql-integer-examples -sortorder: 500031009 +sortorder: 500031010 toc: False sidebartitle: sqlalchemy.dialects.postgresql INTEGER -meta: Python example code for the INTEGER class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code for the INTEGER constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -INTEGER is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +INTEGER is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown index b631b3e6f..0d5be4fbc 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.dialects.postgresql JSON code examples category: page slug: sqlalchemy-dialects-postgresql-json-examples -sortorder: 500031010 +sortorder: 500031011 toc: False sidebartitle: sqlalchemy.dialects.postgresql JSON -meta: Python example code for the JSON class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code for the JSON constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -JSON is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +JSON is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown index e25cfdca9..91fa4f1df 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 code examples category: page slug: sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2-examples -sortorder: 500031013 +sortorder: 500031014 toc: False sidebartitle: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 meta: Python example code for the PGDialect_psycopg2 class from the sqlalchemy.dialects.postgresql.psycopg2 module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown index 6b80a34e5..956d8212a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.dialects.postgresql TSVECTOR code examples category: page slug: sqlalchemy-dialects-postgresql-tsvector-examples -sortorder: 500031011 +sortorder: 500031012 toc: False sidebartitle: sqlalchemy.dialects.postgresql TSVECTOR -meta: Python example code for the TSVECTOR class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code for the TSVECTOR constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -TSVECTOR is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +TSVECTOR is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown index 698f06f37..0c2a6cb12 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown @@ -4,13 +4,101 @@ slug: sqlalchemy-dialects-postgresql-examples sortorder: 500031003 toc: False sidebartitle: sqlalchemy.dialects postgresql -meta: Python example code for the postgresql function from the sqlalchemy.dialects module of the SQLAlchemy project. +meta: Python example code for the postgresql callable from the sqlalchemy.dialects module of the SQLAlchemy project. -postgresql is a function within the sqlalchemy.dialects module of the SQLAlchemy project. +postgresql is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. -## Example 1 from marshmallow-sqlalchemy +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / types.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./types.py) + +```python +# types.py +import warnings + +from sqlalchemy.types import UserDefinedType, Integer +from sqlalchemy.sql import func +~~from sqlalchemy.dialects import postgresql +from sqlalchemy.dialects.postgresql.base import ischema_names + +try: + from .shape import to_shape + SHAPELY = True +except ImportError: + SHAPELY = False + + +from .comparator import BaseComparator, Comparator +from .elements import WKBElement, WKTElement, RasterElement, CompositeElement +from .exc import ArgumentError + + +class _GISType(UserDefinedType): + + name = None + + from_text = None + + as_binary = None + + comparator_factory = Comparator + + + +## ... source file abbreviated to get to postgresql examples ... + + + + def __init__(self, *args, **kwargs): + kwargs['geometry_type'] = None + kwargs['srid'] = -1 + super(Raster, self).__init__(*args, **kwargs) + self.extended = None + + +class CompositeType(UserDefinedType): + + typemap = {} + + class comparator_factory(UserDefinedType.Comparator): + def __getattr__(self, key): + try: + type_ = self.type.typemap[key] + except KeyError: + raise KeyError("Type '%s' doesn't have an attribute: '%s'" + % (self.type, key)) + + return CompositeElement(self.expr, key, type_) + + +class GeometryDump(CompositeType): + +~~ typemap = {'path': postgresql.ARRAY(Integer), 'geom': Geometry} + + +ischema_names['geometry'] = Geometry +ischema_names['geography'] = Geography +ischema_names['raster'] = Raster + + + +## ... source file continues with no further postgresql examples... + +``` + + +## Example 2 from marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) ([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/)) is a code library that makes it easier to use @@ -111,7 +199,7 @@ class ModelConverter: ``` -## Example 2 from sqlalchemy-utils +## Example 3 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown index 6674d26fc..245aecbee 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown @@ -4,10 +4,10 @@ slug: sqlalchemy-dialects-sqlite-examples sortorder: 500031004 toc: False sidebartitle: sqlalchemy.dialects sqlite -meta: Python example code for the sqlite function from the sqlalchemy.dialects module of the SQLAlchemy project. +meta: Python example code for the sqlite callable from the sqlalchemy.dialects module of the SQLAlchemy project. -sqlite is a function within the sqlalchemy.dialects module of the SQLAlchemy project. +sqlite is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown index c177738b8..d132c2c97 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine Connection code examples category: page slug: sqlalchemy-engine-connection-examples -sortorder: 500031014 +sortorder: 500031015 toc: False sidebartitle: sqlalchemy.engine Connection meta: Python example code for the Connection class from the sqlalchemy.engine module of the SQLAlchemy project. @@ -225,6 +225,52 @@ _bypass_no_param = _bypass_no_param() distilled_params, +## ... source file abbreviated to get to Connection examples ... + + + + async def one(self, clause, *multiparams, **params): + async with self.acquire(reuse=True) as conn: + return await conn.one(clause, *multiparams, **params) + + async def scalar(self, clause, *multiparams, **params): + async with self.acquire(reuse=True) as conn: + return await conn.scalar(clause, *multiparams, **params) + + async def status(self, clause, *multiparams, **params): + async with self.acquire(reuse=True) as conn: + return await conn.status(clause, *multiparams, **params) + + def compile(self, clause, *multiparams, **params): + return self._dialect.compile(clause, *multiparams, **params) + + def transaction(self, *args, timeout=None, reuse=True, reusable=True, **kwargs): + return _TransactionContext( + self.acquire(timeout=timeout, reuse=reuse, reusable=reusable), + (args, kwargs), + ) + + def iterate(self, clause, *multiparams, **params): + connection = self.current_connection + if connection is None: +~~ raise ValueError("No Connection in context, please provide one") + return connection.iterate(clause, *multiparams, **params) + + def update_execution_options(self, **opt): + self._sa_engine.update_execution_options(**opt) + + async def _run_visitor(self, *args, **kwargs): + async with self.acquire(reuse=True) as conn: + await getattr(conn, "_run_visitor")(*args, **kwargs) + + def repr(self, color=False): + return self._pool.repr(color) + + def __repr__(self): + return self.repr() + + + ## ... source file continues with no further Connection examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown index c23c00a2b..3594a741d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.default DefaultDialect code examples category: page slug: sqlalchemy-engine-default-defaultdialect-examples -sortorder: 500031018 +sortorder: 500031019 toc: False sidebartitle: sqlalchemy.engine.default DefaultDialect meta: Python example code for the DefaultDialect class from the sqlalchemy.engine.default module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown index 5680a677d..c0659d936 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.engine default code examples category: page slug: sqlalchemy-engine-default-examples -sortorder: 500031016 +sortorder: 500031017 toc: False sidebartitle: sqlalchemy.engine default -meta: Python example code for the default function from the sqlalchemy.engine module of the SQLAlchemy project. +meta: Python example code for the default callable from the sqlalchemy.engine module of the SQLAlchemy project. -default is a function within the sqlalchemy.engine module of the SQLAlchemy project. +default is a callable within the sqlalchemy.engine module of the SQLAlchemy project. ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown index f8b2ff3f2..e68e077bf 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine Engine code examples category: page slug: sqlalchemy-engine-engine-examples -sortorder: 500031015 +sortorder: 500031016 toc: False sidebartitle: sqlalchemy.engine Engine meta: Python example code for the Engine class from the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown index b7f86cb16..2c473f0fe 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.strategies EngineStrategy code examples category: page slug: sqlalchemy-engine-strategies-enginestrategy-examples -sortorder: 500031019 +sortorder: 500031020 toc: False sidebartitle: sqlalchemy.engine.strategies EngineStrategy meta: Python example code for the EngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown index 6b5e671ba..190ee47a0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.strategies MockEngineStrategy code examples category: page slug: sqlalchemy-engine-strategies-mockenginestrategy-examples -sortorder: 500031020 +sortorder: 500031021 toc: False sidebartitle: sqlalchemy.engine.strategies MockEngineStrategy meta: Python example code for the MockEngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown index 191d4322a..21fc75d9a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.engine.url make_url code examples category: page slug: sqlalchemy-engine-url-make-url-examples -sortorder: 500031021 +sortorder: 500031022 toc: False sidebartitle: sqlalchemy.engine.url make_url -meta: Python example code for the make_url function from the sqlalchemy.engine.url module of the SQLAlchemy project. +meta: Python example code for the make_url callable from the sqlalchemy.engine.url module of the SQLAlchemy project. -make_url is a function within the sqlalchemy.engine.url module of the SQLAlchemy project. +make_url is a callable within the sqlalchemy.engine.url module of the SQLAlchemy project. ## Example 1 from flask-sqlalchemy diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown index be088c4df..31fff0dd7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.engine url code examples category: page slug: sqlalchemy-engine-url-examples -sortorder: 500031017 +sortorder: 500031018 toc: False sidebartitle: sqlalchemy.engine url -meta: Python example code for the url function from the sqlalchemy.engine module of the SQLAlchemy project. +meta: Python example code for the url callable from the sqlalchemy.engine module of the SQLAlchemy project. -url is a function within the sqlalchemy.engine module of the SQLAlchemy project. +url is a callable within the sqlalchemy.engine module of the SQLAlchemy project. ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown index c49de92da..0d2fbe03f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.events SchemaEventTarget code examples category: page slug: sqlalchemy-events-schemaeventtarget-examples -sortorder: 500031022 +sortorder: 500031023 toc: False sidebartitle: sqlalchemy.events SchemaEventTarget meta: Python example code for the SchemaEventTarget class from the sqlalchemy.events module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown new file mode 100644 index 000000000..d9d7e7ef5 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown @@ -0,0 +1,98 @@ +title: sqlalchemy.exc ArgumentError code examples +category: page +slug: sqlalchemy-exc-argumenterror-examples +sortorder: 500031024 +toc: False +sidebartitle: sqlalchemy.exc ArgumentError +meta: Python example code for the ArgumentError class from the sqlalchemy.exc module of the SQLAlchemy project. + + +ArgumentError is a class within the sqlalchemy.exc module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / utils.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./utils.py) + +```python +# utils.py +import re +import warnings + +~~from sqlalchemy.exc import ArgumentError +from sqlalchemy.orm import class_mapper, object_mapper +from sqlalchemy.orm.exc import UnmappedClassError, UnmappedInstanceError + + +def get_session(context): + return context.get("session") + + +def get_query(model, context): + query = getattr(model, "query", None) + if not query: + session = get_session(context) + if not session: + raise Exception( + "A query in the model Base or a session in the schema is required for querying.\n" + "Read more http://docs.graphene-python.org/projects/sqlalchemy/en/latest/tips/#querying" + ) + query = session.query(model) + return query + + +def is_mapped_class(cls): + try: + class_mapper(cls) +~~ except (ArgumentError, UnmappedClassError): + return False + else: + return True + + +def is_mapped_instance(cls): + try: + object_mapper(cls) +~~ except (ArgumentError, UnmappedInstanceError): + return False + else: + return True + + +def to_type_name(name): + return "".join(part[:1].upper() + part[1:] for part in name.split("_")) + + +_re_enum_value_name_1 = re.compile("(.)([A-Z][a-z]+)") +_re_enum_value_name_2 = re.compile("([a-z0-9])([A-Z])") + + +def to_enum_value_name(name): + return _re_enum_value_name_2.sub( + r"\1_\2", _re_enum_value_name_1.sub(r"\1_\2", name) + ).upper() + + +class EnumValue(str): + + def __new__(cls, s, value): + return super(EnumValue, cls).__new__(cls, s) + + + +## ... source file continues with no further ArgumentError examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown index ae835f0d0..e927548d9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc DataError code examples category: page slug: sqlalchemy-exc-dataerror-examples -sortorder: 500031023 +sortorder: 500031025 toc: False sidebartitle: sqlalchemy.exc DataError meta: Python example code for the DataError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown index 063ac6375..a896228cf 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc IntegrityError code examples category: page slug: sqlalchemy-exc-integrityerror-examples -sortorder: 500031024 +sortorder: 500031026 toc: False sidebartitle: sqlalchemy.exc IntegrityError meta: Python example code for the IntegrityError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown index a51dadeac..f76838c07 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc InvalidRequestError code examples category: page slug: sqlalchemy-exc-invalidrequesterror-examples -sortorder: 500031025 +sortorder: 500031027 toc: False sidebartitle: sqlalchemy.exc InvalidRequestError meta: Python example code for the InvalidRequestError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown index 86a9456a0..f1d8897b0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc NoInspectionAvailable code examples category: page slug: sqlalchemy-exc-noinspectionavailable-examples -sortorder: 500031026 +sortorder: 500031028 toc: False sidebartitle: sqlalchemy.exc NoInspectionAvailable meta: Python example code for the NoInspectionAvailable class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown index c065ffe2e..f6418654d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc OperationalError code examples category: page slug: sqlalchemy-exc-operationalerror-examples -sortorder: 500031027 +sortorder: 500031029 toc: False sidebartitle: sqlalchemy.exc OperationalError meta: Python example code for the OperationalError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown index 3348aba95..695e6f033 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc ProgrammingError code examples category: page slug: sqlalchemy-exc-programmingerror-examples -sortorder: 500031028 +sortorder: 500031030 toc: False sidebartitle: sqlalchemy.exc ProgrammingError meta: Python example code for the ProgrammingError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown index 7239b8da7..889e6534c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.ext.automap automap_base code examples category: page slug: sqlalchemy-ext-automap-automap-base-examples -sortorder: 500031030 +sortorder: 500031032 toc: False sidebartitle: sqlalchemy.ext.automap automap_base -meta: Python example code for the automap_base function from the sqlalchemy.ext.automap module of the SQLAlchemy project. +meta: Python example code for the automap_base callable from the sqlalchemy.ext.automap module of the SQLAlchemy project. -automap_base is a function within the sqlalchemy.ext.automap module of the SQLAlchemy project. +automap_base is a callable within the sqlalchemy.ext.automap module of the SQLAlchemy project. ## Example 1 from sandman2 diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown index 6456ae517..327714873 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.ext.compiler compiles code examples category: page slug: sqlalchemy-ext-compiler-compiles-examples -sortorder: 500031031 +sortorder: 500031033 toc: False sidebartitle: sqlalchemy.ext.compiler compiles -meta: Python example code for the compiles function from the sqlalchemy.ext.compiler module of the SQLAlchemy project. +meta: Python example code for the compiles callable from the sqlalchemy.ext.compiler module of the SQLAlchemy project. -compiles is a function within the sqlalchemy.ext.compiler module of the SQLAlchemy project. +compiles is a callable within the sqlalchemy.ext.compiler module of the SQLAlchemy project. ## Example 1 from alembic @@ -125,7 +125,152 @@ def _get_constraint_final_name(constraint, dialect): ``` -## Example 2 from sqlalchemy-utils +## Example 2 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / functions.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./functions.py) + +```python +# functions.py +import re + +from sqlalchemy import inspect +from sqlalchemy.sql import functions +from sqlalchemy.sql.elements import ColumnElement +~~from sqlalchemy.ext.compiler import compiles + +from . import types +from . import elements + + +class TableRowElement(ColumnElement): + def __init__(self, selectable): + self.selectable = selectable + + @property + def _from_objects(self): + return [self.selectable] + + +class ST_AsGeoJSON(functions.GenericFunction): + + name = "ST_AsGeoJSON" + + def __init__(self, *args, **kwargs): + expr = kwargs.pop('expr', None) + args = list(args) + if expr is not None: + args = [expr] + args + for idx, element in enumerate(args): + + +## ... source file abbreviated to get to compiles examples ... + + + attributes['type'] = type_ + + type_str = '{0}.{1}'.format(type_.__module__, type_.__name__) + docs.append('Return type: :class:`{0}`.'.format(type_str)) + + if len(docs) != 0: + attributes['__doc__'] = '\n\n'.join(docs) + + globals()[name] = type(name, (GenericFunction,), attributes) + + + + +_SQLITE_FUNCTIONS = { + "ST_GeomFromEWKT": "GeomFromEWKT", + "ST_GeomFromEWKB": "GeomFromEWKB", + "ST_AsBinary": "AsBinary", + "ST_AsEWKB": "AsEWKB", + "ST_AsGeoJSON": "AsGeoJSON", +} + + +def _compiles_default(cls): + def _compile_default(element, compiler, **kw): + return "{}({})".format(cls, compiler.process(element.clauses, **kw)) +~~ compiles(globals()[cls])(_compile_default) + + +def _compiles_sqlite(cls, fn): + def _compile_sqlite(element, compiler, **kw): + return "{}({})".format(fn, compiler.process(element.clauses, **kw)) +~~ compiles(globals()[cls], "sqlite")(_compile_sqlite) + + +for cls, fn in _SQLITE_FUNCTIONS.items(): + _compiles_default(cls) + _compiles_sqlite(cls, fn) + + if element.extended: + func_name = element.geom_from_extended_version + func_args = [element.data] + else: + func_name = element.geom_from + func_args = [element.data, element.srid] + args[idx] = getattr(functions.func, func_name)(*func_args) + else: + try: + insp = inspect(element) + if hasattr(insp, "selectable"): + args[idx] = TableRowElement(insp.selectable) + except Exception: + continue + + functions.GenericFunction.__init__(self, *args, **kwargs) + + __doc__ = ( + 'Return the geometry as a GeoJSON "geometry" object, or the row as a ' + 'GeoJSON feature" object (PostGIS 3 only). (Cf GeoJSON specifications RFC ' + '7946). 2D and 3D Geometries are both supported. GeoJSON only support SFS ' + '1.1 geometry types (no curve support for example). ' + 'See https://postgis.net/docs/ST_AsGeoJSON.html') + + +~~@compiles(TableRowElement) +def _compile_table_row_thing(element, compiler, **kw): + + compiled = compiler.process(list(element.selectable.columns)[0], **kw) + + schema = getattr(element.selectable, "schema", "") + name = element.selectable.name + pattern = r"(.?%s.?\.)?(.?%s.?)\." % (schema, name) + m = re.match(pattern, compiled) + if m: + return m.group(2) + + return compiled.split(".")[0] + + +class GenericFunction(functions.GenericFunction): + + _register = False + + def __init__(self, *args, **kwargs): + expr = kwargs.pop('expr', None) + args = list(args) + if expr is not None: + args = [expr] + args + for idx, elem in enumerate(args): + + +## ... source file continues with no further compiles examples... + +``` + + +## Example 3 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown index 220bcde50..e99f5879c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.ext compiler code examples category: page slug: sqlalchemy-ext-compiler-examples -sortorder: 500031029 +sortorder: 500031031 toc: False sidebartitle: sqlalchemy.ext compiler -meta: Python example code for the compiler function from the sqlalchemy.ext module of the SQLAlchemy project. +meta: Python example code for the compiler callable from the sqlalchemy.ext module of the SQLAlchemy project. -compiler is a function within the sqlalchemy.ext module of the SQLAlchemy project. +compiler is a callable within the sqlalchemy.ext module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown index b39c901de..aaeccc783 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.ext.declarative declarative_base code examples category: page slug: sqlalchemy-ext-declarative-declarative-base-examples -sortorder: 500031033 +sortorder: 500031035 toc: False sidebartitle: sqlalchemy.ext.declarative declarative_base -meta: Python example code for the declarative_base function from the sqlalchemy.ext.declarative module of the SQLAlchemy project. +meta: Python example code for the declarative_base callable from the sqlalchemy.ext.declarative module of the SQLAlchemy project. -declarative_base is a function within the sqlalchemy.ext.declarative module of the SQLAlchemy project. +declarative_base is a callable within the sqlalchemy.ext.declarative module of the SQLAlchemy project. ## Example 1 from flask-sqlalchemy @@ -134,7 +134,75 @@ def _make_table(db): ``` -## Example 2 from sandman2 +## Example 2 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / tests / models.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/tests/models.py) + +```python +# models.py +from __future__ import absolute_import + +import enum + +from sqlalchemy import (Column, Date, Enum, ForeignKey, Integer, String, Table, + func, select) +~~from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm import column_property, composite, mapper, relationship + +PetKind = Enum("cat", "dog", name="pet_kind") + + +class HairKind(enum.Enum): + LONG = 'long' + SHORT = 'short' + + +~~Base = declarative_base() + +association_table = Table( + "association", + Base.metadata, + Column("pet_id", Integer, ForeignKey("pets.id")), + Column("reporter_id", Integer, ForeignKey("reporters.id")), +) + + +class Editor(Base): + __tablename__ = "editors" + editor_id = Column(Integer(), primary_key=True) + name = Column(String(100)) + + +class Pet(Base): + __tablename__ = "pets" + id = Column(Integer(), primary_key=True) + name = Column(String(30)) + pet_kind = Column(PetKind, nullable=False) + hair_kind = Column(Enum(HairKind, name="hair_kind"), nullable=False) + reporter_id = Column(Integer(), ForeignKey("reporters.id")) + + + + +## ... source file continues with no further declarative_base examples... + +``` + + +## Example 3 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown index f95eb1d1a..eb387e8ea 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.declarative DeclarativeMeta code examples category: page slug: sqlalchemy-ext-declarative-declarativemeta-examples -sortorder: 500031032 +sortorder: 500031034 toc: False sidebartitle: sqlalchemy.ext.declarative DeclarativeMeta meta: Python example code for the DeclarativeMeta class from the sqlalchemy.ext.declarative module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown index e35598ca4..1d6db14cb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.ext.hybrid hybrid_property code examples category: page slug: sqlalchemy-ext-hybrid-hybrid-property-examples -sortorder: 500031034 +sortorder: 500031036 toc: False sidebartitle: sqlalchemy.ext.hybrid hybrid_property -meta: Python example code for the hybrid_property function from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. +meta: Python example code for the hybrid_property callable from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. -hybrid_property is a function within the sqlalchemy.ext.hybrid module of the SQLAlchemy project. +hybrid_property is a callable within the sqlalchemy.ext.hybrid module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown index c555eb5de..caed85546 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.mutable Mutable code examples category: page slug: sqlalchemy-ext-mutable-mutable-examples -sortorder: 500031035 +sortorder: 500031037 toc: False sidebartitle: sqlalchemy.ext.mutable Mutable meta: Python example code for the Mutable class from the sqlalchemy.ext.mutable module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown index b25b9d3d4..cdd5ec244 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown @@ -1,16 +1,111 @@ title: sqlalchemy.inspection inspect code examples category: page slug: sqlalchemy-inspection-inspect-examples -sortorder: 500031036 +sortorder: 500031038 toc: False sidebartitle: sqlalchemy.inspection inspect -meta: Python example code for the inspect function from the sqlalchemy.inspection module of the SQLAlchemy project. +meta: Python example code for the inspect callable from the sqlalchemy.inspection module of the SQLAlchemy project. -inspect is a function within the sqlalchemy.inspection module of the SQLAlchemy project. +inspect is a callable within the sqlalchemy.inspection module of the SQLAlchemy project. -## Example 1 from sandman2 +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / tests / test_converter.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/tests/test_converter.py) + +```python +# test_converter.py +import enum + +import pytest +from sqlalchemy import Column, func, select, types +from sqlalchemy.dialects import postgresql +from sqlalchemy.ext.declarative import declarative_base +~~from sqlalchemy.inspection import inspect +from sqlalchemy.orm import column_property, composite +from sqlalchemy_utils import ChoiceType, JSONType, ScalarListType + +import graphene +from graphene.relay import Node +from graphene.types.datetime import DateTime +from graphene.types.json import JSONString + +from ..converter import (convert_sqlalchemy_column, + convert_sqlalchemy_composite, + convert_sqlalchemy_relationship) +from ..fields import (UnsortedSQLAlchemyConnectionField, + default_connection_field_factory) +from ..registry import Registry, get_global_registry +from ..types import SQLAlchemyObjectType +from .models import Article, CompositeFullName, Pet, Reporter + + +def mock_resolver(): + pass + + +def get_field(sqlalchemy_type, **column_kwargs): + class Model(declarative_base()): + __tablename__ = 'model' + id_ = Column(types.Integer, primary_key=True) + column = Column(sqlalchemy_type, doc="Custom Help Text", **column_kwargs) + +~~ column_prop = inspect(Model).column_attrs['column'] + return convert_sqlalchemy_column(column_prop, get_global_registry(), mock_resolver) + + +def get_field_from_column(column_): + class Model(declarative_base()): + __tablename__ = 'model' + id_ = Column(types.Integer, primary_key=True) + column = column_ + +~~ column_prop = inspect(Model).column_attrs['column'] + return convert_sqlalchemy_column(column_prop, get_global_registry(), mock_resolver) + + +def test_should_unknown_sqlalchemy_field_raise_exception(): + re_err = "Don't know how to convert the SQLAlchemy field" + with pytest.raises(Exception, match=re_err): + get_field(getattr(types, 'LargeBinary', types.Binary)()) + + +def test_should_date_convert_string(): + assert get_field(types.Date()).type == graphene.String + + +def test_should_datetime_convert_datetime(): + assert get_field(types.DateTime()).type == DateTime + + +def test_should_time_convert_string(): + assert get_field(types.Time()).type == graphene.String + + +def test_should_string_convert_string(): + assert get_field(types.String()).type == graphene.String + + + +## ... source file continues with no further inspect examples... + +``` + + +## Example 2 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown index 351aa565d..c1d3664f9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.attributes InstrumentedAttribute code examples category: page slug: sqlalchemy-orm-attributes-instrumentedattribute-examples -sortorder: 500031044 +sortorder: 500031056 toc: False sidebartitle: sqlalchemy.orm.attributes InstrumentedAttribute meta: Python example code for the InstrumentedAttribute class from the sqlalchemy.orm.attributes module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown index 14beb308b..ffcfa8a23 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.orm attributes code examples category: page slug: sqlalchemy-orm-attributes-examples -sortorder: 500031039 +sortorder: 500031043 toc: False sidebartitle: sqlalchemy.orm attributes -meta: Python example code for the attributes function from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code for the attributes callable from the sqlalchemy.orm module of the SQLAlchemy project. -attributes is a function within the sqlalchemy.orm module of the SQLAlchemy project. +attributes is a callable within the sqlalchemy.orm module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown index 428d2ef43..e88bab79c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown @@ -1,16 +1,93 @@ title: sqlalchemy.orm class_mapper code examples category: page slug: sqlalchemy-orm-class-mapper-examples -sortorder: 500031040 +sortorder: 500031044 toc: False sidebartitle: sqlalchemy.orm class_mapper -meta: Python example code for the class_mapper function from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code for the class_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. -class_mapper is a function within the sqlalchemy.orm module of the SQLAlchemy project. +class_mapper is a callable within the sqlalchemy.orm module of the SQLAlchemy project. -## Example 1 from sqlalchemy-utils +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / utils.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./utils.py) + +```python +# utils.py +import re +import warnings + +from sqlalchemy.exc import ArgumentError +~~from sqlalchemy.orm import class_mapper, object_mapper +from sqlalchemy.orm.exc import UnmappedClassError, UnmappedInstanceError + + +def get_session(context): + return context.get("session") + + +def get_query(model, context): + query = getattr(model, "query", None) + if not query: + session = get_session(context) + if not session: + raise Exception( + "A query in the model Base or a session in the schema is required for querying.\n" + "Read more http://docs.graphene-python.org/projects/sqlalchemy/en/latest/tips/#querying" + ) + query = session.query(model) + return query + + +def is_mapped_class(cls): + try: +~~ class_mapper(cls) + except (ArgumentError, UnmappedClassError): + return False + else: + return True + + +def is_mapped_instance(cls): + try: + object_mapper(cls) + except (ArgumentError, UnmappedInstanceError): + return False + else: + return True + + +def to_type_name(name): + return "".join(part[:1].upper() + part[1:] for part in name.split("_")) + + +_re_enum_value_name_1 = re.compile("(.)([A-Z][a-z]+)") +_re_enum_value_name_2 = re.compile("([a-z0-9])([A-Z])") + + +def to_enum_value_name(name): + + +## ... source file continues with no further class_mapper examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown index 89c079192..fd14adf07 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.collections InstrumentedList code examples category: page slug: sqlalchemy-orm-collections-instrumentedlist-examples -sortorder: 500031045 +sortorder: 500031057 toc: False sidebartitle: sqlalchemy.orm.collections InstrumentedList meta: Python example code for the InstrumentedList class from the sqlalchemy.orm.collections module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown new file mode 100644 index 000000000..4908e9ee0 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown @@ -0,0 +1,124 @@ +title: sqlalchemy.orm column_property code examples +category: page +slug: sqlalchemy-orm-column-property-examples +sortorder: 500031045 +toc: False +sidebartitle: sqlalchemy.orm column_property +meta: Python example code for the column_property callable from the sqlalchemy.orm module of the SQLAlchemy project. + + +column_property is a callable within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / tests / models.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/tests/models.py) + +```python +# models.py +from __future__ import absolute_import + +import enum + +from sqlalchemy import (Column, Date, Enum, ForeignKey, Integer, String, Table, + func, select) +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import column_property, composite, mapper, relationship + +PetKind = Enum("cat", "dog", name="pet_kind") + + +class HairKind(enum.Enum): + LONG = 'long' + SHORT = 'short' + + +Base = declarative_base() + +association_table = Table( + "association", + Base.metadata, + Column("pet_id", Integer, ForeignKey("pets.id")), + Column("reporter_id", Integer, ForeignKey("reporters.id")), +) + + +class Editor(Base): + __tablename__ = "editors" + editor_id = Column(Integer(), primary_key=True) + name = Column(String(100)) + + + +## ... source file abbreviated to get to column_property examples ... + + + self.last_name = last_name + + def __composite_values__(self): + return self.first_name, self.last_name + + def __repr__(self): + return "{} {}".format(self.first_name, self.last_name) + + +class Reporter(Base): + __tablename__ = "reporters" + + id = Column(Integer(), primary_key=True) + first_name = Column(String(30), doc="First name") + last_name = Column(String(30), doc="Last name") + email = Column(String(), doc="Email") + favorite_pet_kind = Column(PetKind) + pets = relationship("Pet", secondary=association_table, backref="reporters", order_by="Pet.id") + articles = relationship("Article", backref="reporter") + favorite_article = relationship("Article", uselist=False) + + @hybrid_property + def hybrid_prop(self): + return self.first_name + +~~ column_prop = column_property( + select([func.cast(func.count(id), Integer)]), doc="Column property" + ) + + composite_prop = composite(CompositeFullName, first_name, last_name, doc="Composite") + + +class Article(Base): + __tablename__ = "articles" + id = Column(Integer(), primary_key=True) + headline = Column(String(100)) + pub_date = Column(Date()) + reporter_id = Column(Integer(), ForeignKey("reporters.id")) + + +class ReflectedEditor(type): + + @classmethod + def __subclasses__(cls): + return [] + + +editor_table = Table("editors", Base.metadata, autoload=True) + +mapper(ReflectedEditor, editor_table) + + +## ... source file continues with no further column_property examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown index cb571896b..6ccbb201c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm ColumnProperty code examples category: page slug: sqlalchemy-orm-columnproperty-examples -sortorder: 500031037 +sortorder: 500031039 toc: False sidebartitle: sqlalchemy.orm ColumnProperty meta: Python example code for the ColumnProperty class from the sqlalchemy.orm module of the SQLAlchemy project. @@ -10,7 +10,160 @@ meta: Python example code for the ColumnProperty class from the sqlalchemy.orm m ColumnProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. -## Example 1 from sqlalchemy-utils +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / enums.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./enums.py) + +```python +# enums.py +import six +~~from sqlalchemy.orm import ColumnProperty +from sqlalchemy.types import Enum as SQLAlchemyEnumType + +from graphene import Argument, Enum, List + +from .utils import EnumValue, to_enum_value_name, to_type_name + + +def _convert_sa_to_graphene_enum(sa_enum, fallback_name=None): + if not isinstance(sa_enum, SQLAlchemyEnumType): + raise TypeError( + "Expected sqlalchemy.types.Enum, but got: {!r}".format(sa_enum) + ) + enum_class = sa_enum.enum_class + if enum_class: + if all(to_enum_value_name(key) == key for key in enum_class.__members__): + return Enum.from_enum(enum_class) + name = enum_class.__name__ + members = [ + (to_enum_value_name(key), value.value) + for key, value in enum_class.__members__.items() + ] + else: + sql_enum_name = sa_enum.name + if sql_enum_name: + + +## ... source file abbreviated to get to ColumnProperty examples ... + + +def enum_for_sa_enum(sa_enum, registry): + if not isinstance(sa_enum, SQLAlchemyEnumType): + raise TypeError( + "Expected sqlalchemy.types.Enum, but got: {!r}".format(sa_enum) + ) + enum = registry.get_graphene_enum_for_sa_enum(sa_enum) + if not enum: + enum = _convert_sa_to_graphene_enum(sa_enum) + registry.register_enum(sa_enum, enum) + return enum + + +def enum_for_field(obj_type, field_name): + from .types import SQLAlchemyObjectType + + if not isinstance(obj_type, type) or not issubclass(obj_type, SQLAlchemyObjectType): + raise TypeError( + "Expected SQLAlchemyObjectType, but got: {!r}".format(obj_type)) + if not field_name or not isinstance(field_name, six.string_types): + raise TypeError( + "Expected a field name, but got: {!r}".format(field_name)) + registry = obj_type._meta.registry + orm_field = registry.get_orm_field_for_graphene_field(obj_type, field_name) + if orm_field is None: + raise TypeError("Cannot get {}.{}".format(obj_type._meta.name, field_name)) +~~ if not isinstance(orm_field, ColumnProperty): + raise TypeError( + "{}.{} does not map to model column".format(obj_type._meta.name, field_name) + ) + column = orm_field.columns[0] + sa_enum = column.type + if not isinstance(sa_enum, SQLAlchemyEnumType): + raise TypeError( + "{}.{} does not map to enum column".format(obj_type._meta.name, field_name) + ) + enum = registry.get_graphene_enum_for_sa_enum(sa_enum) + if not enum: + fallback_name = obj_type._meta.name + to_type_name(field_name) + enum = _convert_sa_to_graphene_enum(sa_enum, fallback_name) + registry.register_enum(sa_enum, enum) + return enum + + +def _default_sort_enum_symbol_name(column_name, sort_asc=True): + return to_enum_value_name(column_name) + ("_ASC" if sort_asc else "_DESC") + + +def sort_enum_for_object_type( + obj_type, name=None, only_fields=None, only_indexed=None, get_symbol_name=None +): + name = name or obj_type._meta.name + "SortEnum" + registry = obj_type._meta.registry + enum = registry.get_sort_enum_for_object_type(obj_type) + custom_options = dict( + only_fields=only_fields, + only_indexed=only_indexed, + get_symbol_name=get_symbol_name, + ) + if enum: + if name != enum.__name__ or custom_options != enum.custom_options: + raise ValueError( + "Sort enum for {} has already been customized".format(obj_type) + ) + else: + members = [] + default = [] + fields = obj_type._meta.fields + get_name = get_symbol_name or _default_sort_enum_symbol_name + for field_name in fields: + if only_fields and field_name not in only_fields: + continue + orm_field = registry.get_orm_field_for_graphene_field(obj_type, field_name) +~~ if not isinstance(orm_field, ColumnProperty): + continue + column = orm_field.columns[0] + if only_indexed and not (column.primary_key or column.index): + continue + asc_name = get_name(column.name, True) + asc_value = EnumValue(asc_name, column.asc()) + desc_name = get_name(column.name, False) + desc_value = EnumValue(desc_name, column.desc()) + if column.primary_key: + default.append(asc_value) + members.extend(((asc_name, asc_value), (desc_name, desc_value))) + enum = Enum(name, members) + enum.default = default # store default as attribute + enum.custom_options = custom_options + registry.register_sort_enum(obj_type, enum) + return enum + + +def sort_argument_for_object_type( + obj_type, + enum_name=None, + only_fields=None, + only_indexed=None, + get_symbol_name=None, + + +## ... source file continues with no further ColumnProperty examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown new file mode 100644 index 000000000..7628b7035 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown @@ -0,0 +1,121 @@ +title: sqlalchemy.orm composite code examples +category: page +slug: sqlalchemy-orm-composite-examples +sortorder: 500031046 +toc: False +sidebartitle: sqlalchemy.orm composite +meta: Python example code for the composite callable from the sqlalchemy.orm module of the SQLAlchemy project. + + +composite is a callable within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / tests / models.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/tests/models.py) + +```python +# models.py +from __future__ import absolute_import + +import enum + +from sqlalchemy import (Column, Date, Enum, ForeignKey, Integer, String, Table, + func, select) +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import column_property, composite, mapper, relationship + +PetKind = Enum("cat", "dog", name="pet_kind") + + +class HairKind(enum.Enum): + LONG = 'long' + SHORT = 'short' + + +Base = declarative_base() + +association_table = Table( + "association", + Base.metadata, + Column("pet_id", Integer, ForeignKey("pets.id")), + Column("reporter_id", Integer, ForeignKey("reporters.id")), +) + + +class Editor(Base): + __tablename__ = "editors" + editor_id = Column(Integer(), primary_key=True) + name = Column(String(100)) + + + +## ... source file abbreviated to get to composite examples ... + + + + def __repr__(self): + return "{} {}".format(self.first_name, self.last_name) + + +class Reporter(Base): + __tablename__ = "reporters" + + id = Column(Integer(), primary_key=True) + first_name = Column(String(30), doc="First name") + last_name = Column(String(30), doc="Last name") + email = Column(String(), doc="Email") + favorite_pet_kind = Column(PetKind) + pets = relationship("Pet", secondary=association_table, backref="reporters", order_by="Pet.id") + articles = relationship("Article", backref="reporter") + favorite_article = relationship("Article", uselist=False) + + @hybrid_property + def hybrid_prop(self): + return self.first_name + + column_prop = column_property( + select([func.cast(func.count(id), Integer)]), doc="Column property" + ) + +~~ composite_prop = composite(CompositeFullName, first_name, last_name, doc="Composite") + + +class Article(Base): + __tablename__ = "articles" + id = Column(Integer(), primary_key=True) + headline = Column(String(100)) + pub_date = Column(Date()) + reporter_id = Column(Integer(), ForeignKey("reporters.id")) + + +class ReflectedEditor(type): + + @classmethod + def __subclasses__(cls): + return [] + + +editor_table = Table("editors", Base.metadata, autoload=True) + +mapper(ReflectedEditor, editor_table) + + + +## ... source file continues with no further composite examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown new file mode 100644 index 000000000..0e43cca21 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown @@ -0,0 +1,120 @@ +title: sqlalchemy.orm CompositeProperty code examples +category: page +slug: sqlalchemy-orm-compositeproperty-examples +sortorder: 500031040 +toc: False +sidebartitle: sqlalchemy.orm CompositeProperty +meta: Python example code for the CompositeProperty class from the sqlalchemy.orm module of the SQLAlchemy project. + + +CompositeProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / types.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./types.py) + +```python +# types.py +from collections import OrderedDict + +import sqlalchemy +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import (ColumnProperty, CompositeProperty, + RelationshipProperty) +from sqlalchemy.orm.exc import NoResultFound + +from graphene import Field +from graphene.relay import Connection, Node +from graphene.types.objecttype import ObjectType, ObjectTypeOptions +from graphene.types.utils import yank_fields_from_attrs +from graphene.utils.orderedtype import OrderedType + +from .converter import (convert_sqlalchemy_column, + convert_sqlalchemy_composite, + convert_sqlalchemy_hybrid_method, + convert_sqlalchemy_relationship) +from .enums import (enum_for_field, sort_argument_for_object_type, + sort_enum_for_object_type) +from .registry import Registry, get_global_registry +from .resolvers import get_attr_resolver, get_custom_resolver +from .utils import get_query, is_mapped_class, is_mapped_instance + + +class ORMField(OrderedType): + def __init__( + self, + model_attr=None, + + +## ... source file abbreviated to get to CompositeProperty examples ... + + + if attr_name not in all_model_attrs: + raise ValueError(( + "Cannot map ORMField to a model attribute.\n" + "Field: '{}.{}'" + ).format(obj_type.__name__, orm_field_name,)) + orm_field.kwargs['model_attr'] = attr_name + + orm_fields = OrderedDict(custom_orm_fields_items) + for orm_field_name in auto_orm_field_names: + if orm_field_name in orm_fields: + continue + orm_fields[orm_field_name] = ORMField(model_attr=orm_field_name) + + fields = OrderedDict() + for orm_field_name, orm_field in orm_fields.items(): + attr_name = orm_field.kwargs.pop('model_attr') + attr = all_model_attrs[attr_name] + resolver = get_custom_resolver(obj_type, orm_field_name) or get_attr_resolver(obj_type, attr_name) + + if isinstance(attr, ColumnProperty): + field = convert_sqlalchemy_column(attr, registry, resolver, **orm_field.kwargs) + elif isinstance(attr, RelationshipProperty): + batching_ = orm_field.kwargs.pop('batching', batching) + field = convert_sqlalchemy_relationship( + attr, obj_type, connection_field_factory, batching_, orm_field_name, **orm_field.kwargs) +~~ elif isinstance(attr, CompositeProperty): + if attr_name != orm_field_name or orm_field.kwargs: + raise ValueError( + "ORMField kwargs for composite fields must be empty. " + "Field: {}.{}".format(obj_type.__name__, orm_field_name)) + field = convert_sqlalchemy_composite(attr, registry, resolver) + elif isinstance(attr, hybrid_property): + field = convert_sqlalchemy_hybrid_method(attr, resolver, **orm_field.kwargs) + else: + raise Exception('Property type is not supported') # Should never happen + + registry.register_orm_field(obj_type, orm_field_name, attr) + fields[orm_field_name] = field + + return fields + + +class SQLAlchemyObjectTypeOptions(ObjectTypeOptions): + model = None # type: sqlalchemy.Model + registry = None # type: sqlalchemy.Registry + connection = None # type: sqlalchemy.Type[sqlalchemy.Connection] + id = None # type: str + + +class SQLAlchemyObjectType(ObjectType): + + +## ... source file continues with no further CompositeProperty examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown index 0b12e850a..c25102683 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc NoResultFound code examples category: page slug: sqlalchemy-orm-exc-noresultfound-examples -sortorder: 500031046 +sortorder: 500031058 toc: False sidebartitle: sqlalchemy.orm.exc NoResultFound meta: Python example code for the NoResultFound class from the sqlalchemy.orm.exc module of the SQLAlchemy project. @@ -10,7 +10,108 @@ meta: Python example code for the NoResultFound class from the sqlalchemy.orm.ex NoResultFound is a class within the sqlalchemy.orm.exc module of the SQLAlchemy project. -## Example 1 from marshmallow-sqlalchemy +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / types.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./types.py) + +```python +# types.py +from collections import OrderedDict + +import sqlalchemy +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm import (ColumnProperty, CompositeProperty, + RelationshipProperty) +~~from sqlalchemy.orm.exc import NoResultFound + +from graphene import Field +from graphene.relay import Connection, Node +from graphene.types.objecttype import ObjectType, ObjectTypeOptions +from graphene.types.utils import yank_fields_from_attrs +from graphene.utils.orderedtype import OrderedType + +from .converter import (convert_sqlalchemy_column, + convert_sqlalchemy_composite, + convert_sqlalchemy_hybrid_method, + convert_sqlalchemy_relationship) +from .enums import (enum_for_field, sort_argument_for_object_type, + sort_enum_for_object_type) +from .registry import Registry, get_global_registry +from .resolvers import get_attr_resolver, get_custom_resolver +from .utils import get_query, is_mapped_class, is_mapped_instance + + +class ORMField(OrderedType): + def __init__( + self, + model_attr=None, + type=None, + required=None, + + +## ... source file abbreviated to get to NoResultFound examples ... + + + + super(SQLAlchemyObjectType, cls).__init_subclass_with_meta__( + _meta=_meta, interfaces=interfaces, **options + ) + + if not skip_registry: + registry.register(cls) + + @classmethod + def is_type_of(cls, root, info): + if isinstance(root, cls): + return True + if not is_mapped_instance(root): + raise Exception(('Received incompatible instance "{}".').format(root)) + return isinstance(root, cls._meta.model) + + @classmethod + def get_query(cls, info): + model = cls._meta.model + return get_query(model, info.context) + + @classmethod + def get_node(cls, info, id): + try: + return cls.get_query(info).get(id) +~~ except NoResultFound: + return None + + def resolve_id(self, info): + keys = self.__mapper__.primary_key_from_instance(self) + return tuple(keys) if len(keys) > 1 else keys[0] + + @classmethod + def enum_for_field(cls, field_name): + return enum_for_field(cls, field_name) + + sort_enum = classmethod(sort_enum_for_object_type) + + sort_argument = classmethod(sort_argument_for_object_type) + + + +## ... source file continues with no further NoResultFound examples... + +``` + + +## Example 2 from marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) ([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/)) is a code library that makes it easier to use diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown index ff5cd6d24..8855392f2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc UnmappedClassError code examples category: page slug: sqlalchemy-orm-exc-unmappedclasserror-examples -sortorder: 500031047 +sortorder: 500031059 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedClassError meta: Python example code for the UnmappedClassError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. @@ -135,3 +135,81 @@ class _EngineConnector: ``` + +## Example 2 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / utils.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./utils.py) + +```python +# utils.py +import re +import warnings + +from sqlalchemy.exc import ArgumentError +from sqlalchemy.orm import class_mapper, object_mapper +~~from sqlalchemy.orm.exc import UnmappedClassError, UnmappedInstanceError + + +def get_session(context): + return context.get("session") + + +def get_query(model, context): + query = getattr(model, "query", None) + if not query: + session = get_session(context) + if not session: + raise Exception( + "A query in the model Base or a session in the schema is required for querying.\n" + "Read more http://docs.graphene-python.org/projects/sqlalchemy/en/latest/tips/#querying" + ) + query = session.query(model) + return query + + +def is_mapped_class(cls): + try: + class_mapper(cls) +~~ except (ArgumentError, UnmappedClassError): + return False + else: + return True + + +def is_mapped_instance(cls): + try: + object_mapper(cls) + except (ArgumentError, UnmappedInstanceError): + return False + else: + return True + + +def to_type_name(name): + return "".join(part[:1].upper() + part[1:] for part in name.split("_")) + + +_re_enum_value_name_1 = re.compile("(.)([A-Z][a-z]+)") +_re_enum_value_name_2 = re.compile("([a-z0-9])([A-Z])") + + +def to_enum_value_name(name): + return _re_enum_value_name_2.sub( + + +## ... source file continues with no further UnmappedClassError examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown index 8f1d456cb..ff5f517c0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc UnmappedInstanceError code examples category: page slug: sqlalchemy-orm-exc-unmappedinstanceerror-examples -sortorder: 500031048 +sortorder: 500031060 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedInstanceError meta: Python example code for the UnmappedInstanceError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. @@ -10,7 +10,94 @@ meta: Python example code for the UnmappedInstanceError class from the sqlalchem UnmappedInstanceError is a class within the sqlalchemy.orm.exc module of the SQLAlchemy project. -## Example 1 from sqlalchemy-utils +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / utils.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./utils.py) + +```python +# utils.py +import re +import warnings + +from sqlalchemy.exc import ArgumentError +from sqlalchemy.orm import class_mapper, object_mapper +~~from sqlalchemy.orm.exc import UnmappedClassError, UnmappedInstanceError + + +def get_session(context): + return context.get("session") + + +def get_query(model, context): + query = getattr(model, "query", None) + if not query: + session = get_session(context) + if not session: + raise Exception( + "A query in the model Base or a session in the schema is required for querying.\n" + "Read more http://docs.graphene-python.org/projects/sqlalchemy/en/latest/tips/#querying" + ) + query = session.query(model) + return query + + +def is_mapped_class(cls): + try: + class_mapper(cls) + except (ArgumentError, UnmappedClassError): + return False + else: + return True + + +def is_mapped_instance(cls): + try: + object_mapper(cls) +~~ except (ArgumentError, UnmappedInstanceError): + return False + else: + return True + + +def to_type_name(name): + return "".join(part[:1].upper() + part[1:] for part in name.split("_")) + + +_re_enum_value_name_1 = re.compile("(.)([A-Z][a-z]+)") +_re_enum_value_name_2 = re.compile("([a-z0-9])([A-Z])") + + +def to_enum_value_name(name): + return _re_enum_value_name_2.sub( + r"\1_\2", _re_enum_value_name_1.sub(r"\1_\2", name) + ).upper() + + +class EnumValue(str): + + def __new__(cls, s, value): + return super(EnumValue, cls).__new__(cls, s) + + + +## ... source file continues with no further UnmappedInstanceError examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown index e2b5ddebe..25104a0df 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.interfaces MapperProperty code examples category: page slug: sqlalchemy-orm-interfaces-mapperproperty-examples -sortorder: 500031049 +sortorder: 500031061 toc: False sidebartitle: sqlalchemy.orm.interfaces MapperProperty meta: Python example code for the MapperProperty class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown index 94a056d53..dc1082e9e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.interfaces PropComparator code examples category: page slug: sqlalchemy-orm-interfaces-propcomparator-examples -sortorder: 500031050 +sortorder: 500031062 toc: False sidebartitle: sqlalchemy.orm.interfaces PropComparator meta: Python example code for the PropComparator class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown new file mode 100644 index 000000000..71949feea --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown @@ -0,0 +1,110 @@ +title: sqlalchemy.orm interfaces code examples +category: page +slug: sqlalchemy-orm-interfaces-examples +sortorder: 500031047 +toc: False +sidebartitle: sqlalchemy.orm interfaces +meta: Python example code for the interfaces callable from the sqlalchemy.orm module of the SQLAlchemy project. + + +interfaces is a callable within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / converter.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./converter.py) + +```python +# converter.py +from enum import EnumMeta + +from singledispatch import singledispatch +from sqlalchemy import types +from sqlalchemy.dialects import postgresql +~~from sqlalchemy.orm import interfaces, strategies + +from graphene import (ID, Boolean, Dynamic, Enum, Field, Float, Int, List, + String) +from graphene.types.json import JSONString + +from .batching import get_batch_resolver +from .enums import enum_for_sa_enum +from .fields import (BatchSQLAlchemyConnectionField, + default_connection_field_factory) +from .registry import get_global_registry +from .resolvers import get_attr_resolver, get_custom_resolver + +try: + from sqlalchemy_utils import ChoiceType, JSONType, ScalarListType, TSVectorType +except ImportError: + ChoiceType = JSONType = ScalarListType = TSVectorType = object + + +is_selectin_available = getattr(strategies, 'SelectInLoader', None) + + +def get_column_doc(column): + return getattr(column, "doc", None) + + +def is_column_nullable(column): + return bool(getattr(column, "nullable", True)) + + +def convert_sqlalchemy_relationship(relationship_prop, obj_type, connection_field_factory, batching, + orm_field_name, **field_kwargs): + def dynamic_type(): + direction = relationship_prop.direction + child_type = obj_type._meta.registry.get_type_for_model(relationship_prop.mapper.entity) + batching_ = batching if is_selectin_available else False + + if not child_type: + return None + +~~ if direction == interfaces.MANYTOONE or not relationship_prop.uselist: + return _convert_o2o_or_m2o_relationship(relationship_prop, obj_type, batching_, orm_field_name, + **field_kwargs) + +~~ if direction in (interfaces.ONETOMANY, interfaces.MANYTOMANY): + return _convert_o2m_or_m2m_relationship(relationship_prop, obj_type, batching_, + connection_field_factory, **field_kwargs) + + return Dynamic(dynamic_type) + + +def _convert_o2o_or_m2o_relationship(relationship_prop, obj_type, batching, orm_field_name, **field_kwargs): + child_type = obj_type._meta.registry.get_type_for_model(relationship_prop.mapper.entity) + + resolver = get_custom_resolver(obj_type, orm_field_name) + if resolver is None: + resolver = get_batch_resolver(relationship_prop) if batching else \ + get_attr_resolver(obj_type, relationship_prop.key) + + return Field(child_type, resolver=resolver, **field_kwargs) + + +def _convert_o2m_or_m2m_relationship(relationship_prop, obj_type, batching, connection_field_factory, **field_kwargs): + child_type = obj_type._meta.registry.get_type_for_model(relationship_prop.mapper.entity) + + if not child_type._meta.connection: + return Field(List(child_type), **field_kwargs) + + if connection_field_factory is None: + + +## ... source file continues with no further interfaces examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown index 06e8a331b..42923fd30 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.orm mapper code examples category: page slug: sqlalchemy-orm-mapper-examples -sortorder: 500031041 +sortorder: 500031048 toc: False sidebartitle: sqlalchemy.orm mapper -meta: Python example code for the mapper function from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code for the mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. -mapper is a function within the sqlalchemy.orm module of the SQLAlchemy project. +mapper is a callable within the sqlalchemy.orm module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown index 0d48f4a71..fcd4e8312 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.orm mapperlib code examples category: page slug: sqlalchemy-orm-mapperlib-examples -sortorder: 500031042 +sortorder: 500031049 toc: False sidebartitle: sqlalchemy.orm mapperlib -meta: Python example code for the mapperlib function from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code for the mapperlib callable from the sqlalchemy.orm module of the SQLAlchemy project. -mapperlib is a function within the sqlalchemy.orm module of the SQLAlchemy project. +mapperlib is a callable within the sqlalchemy.orm module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown new file mode 100644 index 000000000..518799ab0 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown @@ -0,0 +1,97 @@ +title: sqlalchemy.orm object_mapper code examples +category: page +slug: sqlalchemy-orm-object-mapper-examples +sortorder: 500031050 +toc: False +sidebartitle: sqlalchemy.orm object_mapper +meta: Python example code for the object_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. + + +object_mapper is a callable within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / utils.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./utils.py) + +```python +# utils.py +import re +import warnings + +from sqlalchemy.exc import ArgumentError +~~from sqlalchemy.orm import class_mapper, object_mapper +from sqlalchemy.orm.exc import UnmappedClassError, UnmappedInstanceError + + +def get_session(context): + return context.get("session") + + +def get_query(model, context): + query = getattr(model, "query", None) + if not query: + session = get_session(context) + if not session: + raise Exception( + "A query in the model Base or a session in the schema is required for querying.\n" + "Read more http://docs.graphene-python.org/projects/sqlalchemy/en/latest/tips/#querying" + ) + query = session.query(model) + return query + + +def is_mapped_class(cls): + try: + class_mapper(cls) + except (ArgumentError, UnmappedClassError): + return False + else: + return True + + +def is_mapped_instance(cls): + try: +~~ object_mapper(cls) + except (ArgumentError, UnmappedInstanceError): + return False + else: + return True + + +def to_type_name(name): + return "".join(part[:1].upper() + part[1:] for part in name.split("_")) + + +_re_enum_value_name_1 = re.compile("(.)([A-Z][a-z]+)") +_re_enum_value_name_2 = re.compile("([a-z0-9])([A-Z])") + + +def to_enum_value_name(name): + return _re_enum_value_name_2.sub( + r"\1_\2", _re_enum_value_name_1.sub(r"\1_\2", name) + ).upper() + + +class EnumValue(str): + + def __new__(cls, s, value): + return super(EnumValue, cls).__new__(cls, s) + + +## ... source file continues with no further object_mapper examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown index 93077e1bc..8b0f21d9d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.orm object_session code examples category: page slug: sqlalchemy-orm-object-session-examples -sortorder: 500031043 +sortorder: 500031051 toc: False sidebartitle: sqlalchemy.orm object_session -meta: Python example code for the object_session function from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code for the object_session callable from the sqlalchemy.orm module of the SQLAlchemy project. -object_session is a function within the sqlalchemy.orm module of the SQLAlchemy project. +object_session is a callable within the sqlalchemy.orm module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown index a4cf1e077..3f61846ed 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.properties ColumnProperty code examples category: page slug: sqlalchemy-orm-properties-columnproperty-examples -sortorder: 500031051 +sortorder: 500031063 toc: False sidebartitle: sqlalchemy.orm.properties ColumnProperty meta: Python example code for the ColumnProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown index 808657a3a..5e969ebe9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.properties RelationshipProperty code examples category: page slug: sqlalchemy-orm-properties-relationshipproperty-examples -sortorder: 500031052 +sortorder: 500031064 toc: False sidebartitle: sqlalchemy.orm.properties RelationshipProperty meta: Python example code for the RelationshipProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown new file mode 100644 index 000000000..c2603ca49 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown @@ -0,0 +1,112 @@ +title: sqlalchemy.orm.query Query code examples +category: page +slug: sqlalchemy-orm-query-query-examples +sortorder: 500031065 +toc: False +sidebartitle: sqlalchemy.orm.query Query +meta: Python example code for the Query class from the sqlalchemy.orm.query module of the SQLAlchemy project. + + +Query is a class within the sqlalchemy.orm.query module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / fields.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./fields.py) + +```python +# fields.py +import warnings +from functools import partial + +import six +from promise import Promise, is_thenable +~~from sqlalchemy.orm.query import Query + +from graphene import NonNull +from graphene.relay import Connection, ConnectionField +from graphene.relay.connection import PageInfo +from graphql_relay.connection.arrayconnection import connection_from_list_slice + +from .batching import get_batch_resolver +from .utils import get_query + + +class UnsortedSQLAlchemyConnectionField(ConnectionField): + @property + def type(self): + from .types import SQLAlchemyObjectType + + _type = super(ConnectionField, self).type + nullable_type = get_nullable_type(_type) + if issubclass(nullable_type, Connection): + return _type + assert issubclass(nullable_type, SQLAlchemyObjectType), ( + "SQLALchemyConnectionField only accepts SQLAlchemyObjectType types, not {}" + ).format(nullable_type.__name__) + assert ( + nullable_type.connection + ), "The type {} doesn't have a connection".format( + nullable_type.__name__ + ) + assert _type == nullable_type, ( + "Passing a SQLAlchemyObjectType instance is deprecated. " + "Pass the connection type instead accessible via SQLAlchemyObjectType.connection" + ) + return nullable_type.connection + + @property + def model(self): + return get_nullable_type(self.type)._meta.node._meta.model + + @classmethod + def get_query(cls, model, info, **args): + return get_query(model, info.context) + + @classmethod + def resolve_connection(cls, connection_type, model, info, args, resolved): + if resolved is None: + resolved = cls.get_query(model, info, **args) +~~ if isinstance(resolved, Query): + _len = resolved.count() + else: + _len = len(resolved) + connection = connection_from_list_slice( + resolved, + args, + slice_start=0, + list_length=_len, + list_slice_length=_len, + connection_type=connection_type, + pageinfo_type=PageInfo, + edge_type=connection_type.Edge, + ) + connection.iterable = resolved + connection.length = _len + return connection + + @classmethod + def connection_resolver(cls, resolver, connection_type, model, root, info, **args): + resolved = resolver(root, info, **args) + + on_resolve = partial(cls.resolve_connection, connection_type, model, info, args) + if is_thenable(resolved): + return Promise.resolve(resolved).then(on_resolve) + + +## ... source file continues with no further Query examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown new file mode 100644 index 000000000..784b76847 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown @@ -0,0 +1,79 @@ +title: sqlalchemy.orm.query QueryContext code examples +category: page +slug: sqlalchemy-orm-query-querycontext-examples +sortorder: 500031066 +toc: False +sidebartitle: sqlalchemy.orm.query QueryContext +meta: Python example code for the QueryContext class from the sqlalchemy.orm.query module of the SQLAlchemy project. + + +QueryContext is a class within the sqlalchemy.orm.query module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / batching.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./batching.py) + +```python +# batching.py +import sqlalchemy +from promise import dataloader, promise +from sqlalchemy.orm import Session, strategies +~~from sqlalchemy.orm.query import QueryContext + + +def get_batch_resolver(relationship_prop): + + selectin_loader = strategies.SelectInLoader(relationship_prop, (('lazy', 'selectin'),)) + + class RelationshipLoader(dataloader.DataLoader): + cache = False + + def batch_load_fn(self, parents): # pylint: disable=method-hidden + child_mapper = relationship_prop.mapper + parent_mapper = relationship_prop.parent + session = Session.object_session(parents[0]) + + for parent in parents: + assert session is Session.object_session(parent) + assert parent not in session.dirty + + states = [(sqlalchemy.inspect(parent), True) for parent in parents] + +~~ query_context = QueryContext(session.query(parent_mapper.entity)) + + selectin_loader._load_for_path( + query_context, + parent_mapper._path_registry, + states, + None, + child_mapper, + ) + + return promise.Promise.resolve([getattr(parent, relationship_prop.key) for parent in parents]) + + loader = RelationshipLoader() + + def resolve(root, info, **args): + return loader.load(root) + + return resolve + + + +## ... source file continues with no further QueryContext examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown new file mode 100644 index 000000000..bb13eac19 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown @@ -0,0 +1,126 @@ +title: sqlalchemy.orm relationship code examples +category: page +slug: sqlalchemy-orm-relationship-examples +sortorder: 500031052 +toc: False +sidebartitle: sqlalchemy.orm relationship +meta: Python example code for the relationship callable from the sqlalchemy.orm module of the SQLAlchemy project. + + +relationship is a callable within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / tests / models.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/tests/models.py) + +```python +# models.py +from __future__ import absolute_import + +import enum + +from sqlalchemy import (Column, Date, Enum, ForeignKey, Integer, String, Table, + func, select) +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import column_property, composite, mapper, relationship + +PetKind = Enum("cat", "dog", name="pet_kind") + + +class HairKind(enum.Enum): + LONG = 'long' + SHORT = 'short' + + +Base = declarative_base() + +association_table = Table( + "association", + Base.metadata, + Column("pet_id", Integer, ForeignKey("pets.id")), + Column("reporter_id", Integer, ForeignKey("reporters.id")), +) + + +class Editor(Base): + __tablename__ = "editors" + editor_id = Column(Integer(), primary_key=True) + name = Column(String(100)) + + + +## ... source file abbreviated to get to relationship examples ... + + + pet_kind = Column(PetKind, nullable=False) + hair_kind = Column(Enum(HairKind, name="hair_kind"), nullable=False) + reporter_id = Column(Integer(), ForeignKey("reporters.id")) + + +class CompositeFullName(object): + def __init__(self, first_name, last_name): + self.first_name = first_name + self.last_name = last_name + + def __composite_values__(self): + return self.first_name, self.last_name + + def __repr__(self): + return "{} {}".format(self.first_name, self.last_name) + + +class Reporter(Base): + __tablename__ = "reporters" + + id = Column(Integer(), primary_key=True) + first_name = Column(String(30), doc="First name") + last_name = Column(String(30), doc="Last name") + email = Column(String(), doc="Email") + favorite_pet_kind = Column(PetKind) +~~ pets = relationship("Pet", secondary=association_table, backref="reporters", order_by="Pet.id") +~~ articles = relationship("Article", backref="reporter") +~~ favorite_article = relationship("Article", uselist=False) + + @hybrid_property + def hybrid_prop(self): + return self.first_name + + column_prop = column_property( + select([func.cast(func.count(id), Integer)]), doc="Column property" + ) + + composite_prop = composite(CompositeFullName, first_name, last_name, doc="Composite") + + +class Article(Base): + __tablename__ = "articles" + id = Column(Integer(), primary_key=True) + headline = Column(String(100)) + pub_date = Column(Date()) + reporter_id = Column(Integer(), ForeignKey("reporters.id")) + + +class ReflectedEditor(type): + + @classmethod + def __subclasses__(cls): + + +## ... source file continues with no further relationship examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown index 66b851c6b..efb8cf6b3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.orm.session object_session code examples category: page slug: sqlalchemy-orm-session-object-session-examples -sortorder: 500031054 +sortorder: 500031068 toc: False sidebartitle: sqlalchemy.orm.session object_session -meta: Python example code for the object_session function from the sqlalchemy.orm.session module of the SQLAlchemy project. +meta: Python example code for the object_session callable from the sqlalchemy.orm.session module of the SQLAlchemy project. -object_session is a function within the sqlalchemy.orm.session module of the SQLAlchemy project. +object_session is a callable within the sqlalchemy.orm.session module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown index 4744c4d33..78c8d4dbd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.session Session code examples category: page slug: sqlalchemy-orm-session-session-examples -sortorder: 500031053 +sortorder: 500031067 toc: False sidebartitle: sqlalchemy.orm.session Session meta: Python example code for the Session class from the sqlalchemy.orm.session module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown new file mode 100644 index 000000000..6480315b0 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown @@ -0,0 +1,72 @@ +title: sqlalchemy.orm session code examples +category: page +slug: sqlalchemy-orm-session-examples +sortorder: 500031053 +toc: False +sidebartitle: sqlalchemy.orm session +meta: Python example code for the session callable from the sqlalchemy.orm module of the SQLAlchemy project. + + +session is a callable within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / tests / conftest.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/tests/conftest.py) + +```python +# conftest.py +import pytest +from sqlalchemy import create_engine +~~from sqlalchemy.orm import sessionmaker + +import graphene + +from ..converter import convert_sqlalchemy_composite +from ..registry import reset_global_registry +from .models import Base, CompositeFullName + +test_db_url = 'sqlite://' # use in-memory database for tests + + +@pytest.fixture(autouse=True) +def reset_registry(): + reset_global_registry() + + @convert_sqlalchemy_composite.register(CompositeFullName) + def convert_composite_class(composite, registry): + return graphene.Field(graphene.Int) + + +@pytest.yield_fixture(scope="function") +def session_factory(): + engine = create_engine(test_db_url) + Base.metadata.create_all(engine) + + yield sessionmaker(bind=engine) + + engine.dispose() + + +@pytest.fixture(scope="function") +~~def session(session_factory): + return session_factory() + + + +## ... source file continues with no further session examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown new file mode 100644 index 000000000..e92ab6689 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown @@ -0,0 +1,72 @@ +title: sqlalchemy.orm sessionmaker code examples +category: page +slug: sqlalchemy-orm-sessionmaker-examples +sortorder: 500031054 +toc: False +sidebartitle: sqlalchemy.orm sessionmaker +meta: Python example code for the sessionmaker callable from the sqlalchemy.orm module of the SQLAlchemy project. + + +sessionmaker is a callable within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / tests / conftest.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/tests/conftest.py) + +```python +# conftest.py +import pytest +from sqlalchemy import create_engine +~~from sqlalchemy.orm import sessionmaker + +import graphene + +from ..converter import convert_sqlalchemy_composite +from ..registry import reset_global_registry +from .models import Base, CompositeFullName + +test_db_url = 'sqlite://' # use in-memory database for tests + + +@pytest.fixture(autouse=True) +def reset_registry(): + reset_global_registry() + + @convert_sqlalchemy_composite.register(CompositeFullName) + def convert_composite_class(composite, registry): + return graphene.Field(graphene.Int) + + +@pytest.yield_fixture(scope="function") +def session_factory(): + engine = create_engine(test_db_url) + Base.metadata.create_all(engine) + +~~ yield sessionmaker(bind=engine) + + engine.dispose() + + +@pytest.fixture(scope="function") +def session(session_factory): + return session_factory() + + + +## ... source file continues with no further sessionmaker examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown new file mode 100644 index 000000000..ab26ac3b3 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown @@ -0,0 +1,69 @@ +title: sqlalchemy.orm strategies code examples +category: page +slug: sqlalchemy-orm-strategies-examples +sortorder: 500031055 +toc: False +sidebartitle: sqlalchemy.orm strategies +meta: Python example code for the strategies callable from the sqlalchemy.orm module of the SQLAlchemy project. + + +strategies is a callable within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / batching.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./batching.py) + +```python +# batching.py +import sqlalchemy +from promise import dataloader, promise +~~from sqlalchemy.orm import Session, strategies +from sqlalchemy.orm.query import QueryContext + + +def get_batch_resolver(relationship_prop): + +~~ selectin_loader = strategies.SelectInLoader(relationship_prop, (('lazy', 'selectin'),)) + + class RelationshipLoader(dataloader.DataLoader): + cache = False + + def batch_load_fn(self, parents): # pylint: disable=method-hidden + child_mapper = relationship_prop.mapper + parent_mapper = relationship_prop.parent + session = Session.object_session(parents[0]) + + for parent in parents: + assert session is Session.object_session(parent) + assert parent not in session.dirty + + states = [(sqlalchemy.inspect(parent), True) for parent in parents] + + query_context = QueryContext(session.query(parent_mapper.entity)) + + selectin_loader._load_for_path( + query_context, + parent_mapper._path_registry, + states, + None, + child_mapper, + ) + + +## ... source file continues with no further strategies examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown index dc2a0290f..60f89ca64 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm SynonymProperty code examples category: page slug: sqlalchemy-orm-synonymproperty-examples -sortorder: 500031038 +sortorder: 500031042 toc: False sidebartitle: sqlalchemy.orm SynonymProperty meta: Python example code for the SynonymProperty class from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown index 5277f775b..41e232b5e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.util AliasedInsp code examples category: page slug: sqlalchemy-orm-util-aliasedinsp-examples -sortorder: 500031055 +sortorder: 500031069 toc: False sidebartitle: sqlalchemy.orm.util AliasedInsp meta: Python example code for the AliasedInsp class from the sqlalchemy.orm.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown index 0ae099971..2c119cf56 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.pool NullPool code examples category: page slug: sqlalchemy-pool-nullpool-examples -sortorder: 500031056 +sortorder: 500031070 toc: False sidebartitle: sqlalchemy.pool NullPool meta: Python example code for the NullPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown index b9f193759..7dd729cfb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.pool StaticPool code examples category: page slug: sqlalchemy-pool-staticpool-examples -sortorder: 500031057 +sortorder: 500031071 toc: False sidebartitle: sqlalchemy.pool StaticPool meta: Python example code for the StaticPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown index 5081ff05f..41e4806ed 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CheckConstraint code examples category: page slug: sqlalchemy-schema-checkconstraint-examples -sortorder: 500031058 +sortorder: 500031072 toc: False sidebartitle: sqlalchemy.schema CheckConstraint meta: Python example code for the CheckConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown index a66e757f1..ef30079e2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Column code examples category: page slug: sqlalchemy-schema-column-examples -sortorder: 500031059 +sortorder: 500031073 toc: False sidebartitle: sqlalchemy.schema Column meta: Python example code for the Column class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown index cec4dce11..eb37bb84c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CreateIndex code examples category: page slug: sqlalchemy-schema-createindex-examples -sortorder: 500031060 +sortorder: 500031074 toc: False sidebartitle: sqlalchemy.schema CreateIndex meta: Python example code for the CreateIndex class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown index c5cca2e2a..4d5663441 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema DDLElement code examples category: page slug: sqlalchemy-schema-ddlelement-examples -sortorder: 500031061 +sortorder: 500031075 toc: False sidebartitle: sqlalchemy.schema DDLElement meta: Python example code for the DDLElement class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown index d01595dda..bc3fcfbc2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema ForeignKeyConstraint code examples category: page slug: sqlalchemy-schema-foreignkeyconstraint-examples -sortorder: 500031062 +sortorder: 500031076 toc: False sidebartitle: sqlalchemy.schema ForeignKeyConstraint meta: Python example code for the ForeignKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown index 56771d70e..55fbfb41e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema PrimaryKeyConstraint code examples category: page slug: sqlalchemy-schema-primarykeyconstraint-examples -sortorder: 500031063 +sortorder: 500031077 toc: False sidebartitle: sqlalchemy.schema PrimaryKeyConstraint meta: Python example code for the PrimaryKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown index 5b0a22dfb..8e68d3041 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Table code examples category: page slug: sqlalchemy-schema-table-examples -sortorder: 500031064 +sortorder: 500031078 toc: False sidebartitle: sqlalchemy.schema Table meta: Python example code for the Table class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown index 221a204ee..a8c9fce22 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql ClauseElement code examples category: page slug: sqlalchemy-sql-clauseelement-examples -sortorder: 500031065 +sortorder: 500031079 toc: False sidebartitle: sqlalchemy.sql ClauseElement meta: Python example code for the ClauseElement class from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown index 94282701f..ec846819b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.sql column code examples category: page slug: sqlalchemy-sql-column-examples -sortorder: 500031066 +sortorder: 500031080 toc: False sidebartitle: sqlalchemy.sql column -meta: Python example code for the column function from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code for the column callable from the sqlalchemy.sql module of the SQLAlchemy project. -column is a function within the sqlalchemy.sql module of the SQLAlchemy project. +column is a callable within the sqlalchemy.sql module of the SQLAlchemy project. ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown new file mode 100644 index 000000000..69ec8b1a9 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown @@ -0,0 +1,69 @@ +title: sqlalchemy.sql.elements ColumnElement code examples +category: page +slug: sqlalchemy-sql-elements-columnelement-examples +sortorder: 500031088 +toc: False +sidebartitle: sqlalchemy.sql.elements ColumnElement +meta: Python example code for the ColumnElement class from the sqlalchemy.sql.elements module of the SQLAlchemy project. + + +ColumnElement is a class within the sqlalchemy.sql.elements module of the SQLAlchemy project. + + +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / functions.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./functions.py) + +```python +# functions.py +import re + +from sqlalchemy import inspect +from sqlalchemy.sql import functions +~~from sqlalchemy.sql.elements import ColumnElement +from sqlalchemy.ext.compiler import compiles + +from . import types +from . import elements + + +~~class TableRowElement(ColumnElement): + def __init__(self, selectable): + self.selectable = selectable + + @property + def _from_objects(self): + return [self.selectable] + + +class ST_AsGeoJSON(functions.GenericFunction): + + name = "ST_AsGeoJSON" + + def __init__(self, *args, **kwargs): + expr = kwargs.pop('expr', None) + args = list(args) + if expr is not None: + args = [expr] + args + for idx, element in enumerate(args): + if isinstance(element, functions.Function): + continue + elif isinstance(element, elements.HasFunction): + if element.extended: + func_name = element.geom_from_extended_version + func_args = [element.data] + + +## ... source file continues with no further ColumnElement examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown index 44b6aa309..fe015c70d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.elements Label code examples category: page slug: sqlalchemy-sql-elements-label-examples -sortorder: 500031070 +sortorder: 500031089 toc: False sidebartitle: sqlalchemy.sql.elements Label meta: Python example code for the Label class from the sqlalchemy.sql.elements module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown index cfa0eed12..ccc2cd044 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ClauseElement code examples category: page slug: sqlalchemy-sql-expression-clauseelement-examples -sortorder: 500031071 +sortorder: 500031090 toc: False sidebartitle: sqlalchemy.sql.expression ClauseElement meta: Python example code for the ClauseElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown index 1f8d63349..6deb86956 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ColumnClause code examples category: page slug: sqlalchemy-sql-expression-columnclause-examples -sortorder: 500031072 +sortorder: 500031091 toc: False sidebartitle: sqlalchemy.sql.expression ColumnClause meta: Python example code for the ColumnClause class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown index 7a80a6826..081f44c34 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ColumnElement code examples category: page slug: sqlalchemy-sql-expression-columnelement-examples -sortorder: 500031073 +sortorder: 500031092 toc: False sidebartitle: sqlalchemy.sql.expression ColumnElement meta: Python example code for the ColumnElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown index d3a29174e..22645b2e0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression Executable code examples category: page slug: sqlalchemy-sql-expression-executable-examples -sortorder: 500031074 +sortorder: 500031093 toc: False sidebartitle: sqlalchemy.sql.expression Executable meta: Python example code for the Executable class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown index 42c5f6751..c2efc4be3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression FunctionElement code examples category: page slug: sqlalchemy-sql-expression-functionelement-examples -sortorder: 500031075 +sortorder: 500031094 toc: False sidebartitle: sqlalchemy.sql.expression FunctionElement meta: Python example code for the FunctionElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. @@ -10,7 +10,105 @@ meta: Python example code for the FunctionElement class from the sqlalchemy.sql. FunctionElement is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. -## Example 1 from sqlalchemy-utils +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / elements.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./elements.py) + +```python +# elements.py +import binascii +import struct + +try: + from sqlalchemy.sql import functions + from sqlalchemy.sql.functions import FunctionElement +except ImportError: # SQLA < 0.9 # pragma: no cover + from sqlalchemy.sql import expression as functions +~~ from sqlalchemy.sql.expression import FunctionElement +from sqlalchemy.types import to_instance +from sqlalchemy.ext.compiler import compiles + +from .compat import PY3, str as str_ +from .exc import ArgumentError + + +if PY3: + BinasciiError = binascii.Error +else: + BinasciiError = TypeError + + +class HasFunction(object): + pass + + +class _SpatialElement(HasFunction): + + def __init__(self, data, srid=-1, extended=False): + self.srid = srid + self.data = data + self.extended = extended + + + +## ... source file abbreviated to get to FunctionElement examples ... + + + + geom_from_extended_version = 'raster' + + def __init__(self, data): + try: + bin_data = binascii.unhexlify(data[:114]) + except BinasciiError: + bin_data = data + data = str(binascii.hexlify(data).decode(encoding='utf-8')) + byte_order = bin_data[0] + srid = bin_data[53:57] + if not PY3: + byte_order = bytearray(byte_order)[0] + srid = struct.unpack('I', srid)[0] + _SpatialElement.__init__(self, data, srid, True) + + @property + def desc(self): + return self.data + + @staticmethod + def _data_from_desc(desc): + return desc + + +~~class CompositeElement(FunctionElement): + + def __init__(self, base, field, type_): + self.name = field + self.type = to_instance(type_) + + super(CompositeElement, self).__init__(base) + + +@compiles(CompositeElement) +def _compile_pgelem(expr, compiler, **kw): + return '(%s).%s' % (compiler.process(expr.clauses, **kw), expr.name) + + + +## ... source file continues with no further FunctionElement examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown index 06d39b662..1b83f57fb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression UnaryExpression code examples category: page slug: sqlalchemy-sql-expression-unaryexpression-examples -sortorder: 500031076 +sortorder: 500031095 toc: False sidebartitle: sqlalchemy.sql.expression UnaryExpression meta: Python example code for the UnaryExpression class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown new file mode 100644 index 000000000..b77e728c5 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown @@ -0,0 +1,106 @@ +title: sqlalchemy.sql expression code examples +category: page +slug: sqlalchemy-sql-expression-examples +sortorder: 500031081 +toc: False +sidebartitle: sqlalchemy.sql expression +meta: Python example code for the expression callable from the sqlalchemy.sql module of the SQLAlchemy project. + + +expression is a callable within the sqlalchemy.sql module of the SQLAlchemy project. + + +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / __init__.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./__init__.py) + +```python +# __init__.py +from .types import ( # NOQA + Geometry, + Geography, + Raster + ) + +from .elements import ( # NOQA + WKTElement, + WKBElement, + RasterElement + ) + +from .exc import ArgumentError + +from . import functions # NOQA +from . import types # NOQA + +from sqlalchemy import Table, event +~~from sqlalchemy.sql import select, func, expression + + +def _setup_ddl_event_listeners(): + @event.listens_for(Table, "before_create") + def before_create(target, connection, **kw): + dispatch("before-create", target, connection) + + @event.listens_for(Table, "after_create") + def after_create(target, connection, **kw): + dispatch("after-create", target, connection) + + @event.listens_for(Table, "before_drop") + def before_drop(target, connection, **kw): + dispatch("before-drop", target, connection) + + @event.listens_for(Table, "after_drop") + def after_drop(target, connection, **kw): + dispatch("after-drop", target, connection) + + def dispatch(event, table, bind): + if event in ('before-create', 'before-drop'): + gis_cols = [c for c in table.c if + isinstance(c.type, Geometry) and + c.type.management is True] + + regular_cols = [x for x in table.c if x not in gis_cols] + + table.info["_saved_columns"] = table.c + +~~ column_collection = expression.ColumnCollection() + for col in regular_cols: + column_collection.add(col) + table.columns = column_collection + + if event == 'before-drop': + for c in gis_cols: + if bind.dialect.name == 'sqlite': + drop_func = 'DiscardGeometryColumn' + elif bind.dialect.name == 'postgresql': + drop_func = 'DropGeometryColumn' + else: + raise ArgumentError('dialect {} is not supported'.format(bind.dialect.name)) + args = [table.schema] if table.schema else [] + args.extend([table.name, c.name]) + + stmt = select([getattr(func, drop_func)(*args)]) + stmt = stmt.execution_options(autocommit=True) + bind.execute(stmt) + + elif event == 'after-create': + table.columns = table.info.pop('_saved_columns') + + for c in table.c: + if isinstance(c.type, Geometry) and c.type.management is True: + + +## ... source file continues with no further expression examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown new file mode 100644 index 000000000..9075958b9 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown @@ -0,0 +1,106 @@ +title: sqlalchemy.sql.functions FunctionElement code examples +category: page +slug: sqlalchemy-sql-functions-functionelement-examples +sortorder: 500031096 +toc: False +sidebartitle: sqlalchemy.sql.functions FunctionElement +meta: Python example code for the FunctionElement class from the sqlalchemy.sql.functions module of the SQLAlchemy project. + + +FunctionElement is a class within the sqlalchemy.sql.functions module of the SQLAlchemy project. + + +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / elements.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./elements.py) + +```python +# elements.py +import binascii +import struct + +try: + from sqlalchemy.sql import functions +~~ from sqlalchemy.sql.functions import FunctionElement +except ImportError: # SQLA < 0.9 # pragma: no cover + from sqlalchemy.sql import expression as functions + from sqlalchemy.sql.expression import FunctionElement +from sqlalchemy.types import to_instance +from sqlalchemy.ext.compiler import compiles + +from .compat import PY3, str as str_ +from .exc import ArgumentError + + +if PY3: + BinasciiError = binascii.Error +else: + BinasciiError = TypeError + + +class HasFunction(object): + pass + + +class _SpatialElement(HasFunction): + + def __init__(self, data, srid=-1, extended=False): + self.srid = srid + + +## ... source file abbreviated to get to FunctionElement examples ... + + + + geom_from_extended_version = 'raster' + + def __init__(self, data): + try: + bin_data = binascii.unhexlify(data[:114]) + except BinasciiError: + bin_data = data + data = str(binascii.hexlify(data).decode(encoding='utf-8')) + byte_order = bin_data[0] + srid = bin_data[53:57] + if not PY3: + byte_order = bytearray(byte_order)[0] + srid = struct.unpack('I', srid)[0] + _SpatialElement.__init__(self, data, srid, True) + + @property + def desc(self): + return self.data + + @staticmethod + def _data_from_desc(desc): + return desc + + +~~class CompositeElement(FunctionElement): + + def __init__(self, base, field, type_): + self.name = field + self.type = to_instance(type_) + + super(CompositeElement, self).__init__(base) + + +@compiles(CompositeElement) +def _compile_pgelem(expr, compiler, **kw): + return '(%s).%s' % (compiler.process(expr.clauses, **kw), expr.name) + + + +## ... source file continues with no further FunctionElement examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown index c98b60aeb..b48e9869e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.functions GenericFunction code examples category: page slug: sqlalchemy-sql-functions-genericfunction-examples -sortorder: 500031077 +sortorder: 500031097 toc: False sidebartitle: sqlalchemy.sql.functions GenericFunction meta: Python example code for the GenericFunction class from the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown new file mode 100644 index 000000000..a60194d06 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown @@ -0,0 +1,149 @@ +title: sqlalchemy.sql functions code examples +category: page +slug: sqlalchemy-sql-functions-examples +sortorder: 500031082 +toc: False +sidebartitle: sqlalchemy.sql functions +meta: Python example code for the functions callable from the sqlalchemy.sql module of the SQLAlchemy project. + + +functions is a callable within the sqlalchemy.sql module of the SQLAlchemy project. + + +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / functions.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./functions.py) + +```python +# functions.py +import re + +from sqlalchemy import inspect +~~from sqlalchemy.sql import functions +from sqlalchemy.sql.elements import ColumnElement +from sqlalchemy.ext.compiler import compiles + +from . import types +from . import elements + + +class TableRowElement(ColumnElement): + def __init__(self, selectable): + self.selectable = selectable + + @property + def _from_objects(self): + return [self.selectable] + + +class ST_AsGeoJSON(functions.GenericFunction): + + name = "ST_AsGeoJSON" + + def __init__(self, *args, **kwargs): + expr = kwargs.pop('expr', None) + args = list(args) + if expr is not None: + args = [expr] + args + for idx, element in enumerate(args): +~~ if isinstance(element, functions.Function): + continue + elif isinstance(element, elements.HasFunction): + if element.extended: + func_name = element.geom_from_extended_version + func_args = [element.data] + else: + func_name = element.geom_from + func_args = [element.data, element.srid] + args[idx] = getattr(functions.func, func_name)(*func_args) + else: + try: + insp = inspect(element) + if hasattr(insp, "selectable"): + args[idx] = TableRowElement(insp.selectable) + except Exception: + continue + +~~ functions.GenericFunction.__init__(self, *args, **kwargs) + + __doc__ = ( + 'Return the geometry as a GeoJSON "geometry" object, or the row as a ' + 'GeoJSON feature" object (PostGIS 3 only). (Cf GeoJSON specifications RFC ' + '7946). 2D and 3D Geometries are both supported. GeoJSON only support SFS ' + '1.1 geometry types (no curve support for example). ' + 'See https://postgis.net/docs/ST_AsGeoJSON.html') + + +@compiles(TableRowElement) +def _compile_table_row_thing(element, compiler, **kw): + + compiled = compiler.process(list(element.selectable.columns)[0], **kw) + + schema = getattr(element.selectable, "schema", "") + name = element.selectable.name + pattern = r"(.?%s.?\.)?(.?%s.?)\." % (schema, name) + m = re.match(pattern, compiled) + if m: + return m.group(2) + + return compiled.split(".")[0] + + +class GenericFunction(functions.GenericFunction): + + _register = False + + def __init__(self, *args, **kwargs): + expr = kwargs.pop('expr', None) + args = list(args) + if expr is not None: + args = [expr] + args + for idx, elem in enumerate(args): + if isinstance(elem, elements.HasFunction): + if elem.extended: + func_name = elem.geom_from_extended_version + func_args = [elem.data] + else: + func_name = elem.geom_from + func_args = [elem.data, elem.srid] + args[idx] = getattr(functions.func, func_name)(*func_args) +~~ functions.GenericFunction.__init__(self, *args, **kwargs) + + + + +_FUNCTIONS = [ + + ('ST_Collect', types.Geometry, + 'Return a specified ST_Geometry value from a collection of other geometries.'), + + ('ST_BdPolyFromText', types.Geometry, + 'Construct a Polygon given an arbitrary collection of closed linestrings' + 'as a MultiLineString Well-Known text representation.'), + + ('ST_BdMPolyFromText', types.Geometry, + 'Construct a MultiPolygon given an arbitrary collection of closed ' + 'linestrings as a MultiLineString text representation Well-Known text ' + 'representation.'), + + ('ST_Box2dFromGeoHash', types.Geometry, + 'Return a BOX2D from a GeoHash string.'), + + ('ST_GeogFromText', types.Geography, + 'Return a specified geography value from Well-Known Text representation ' + 'or extended (WKT).'), + + +## ... source file continues with no further functions examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown index 825a648d8..0321faeda 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.sql.naming conv code examples category: page slug: sqlalchemy-sql-naming-conv-examples -sortorder: 500031078 +sortorder: 500031098 toc: False sidebartitle: sqlalchemy.sql.naming conv -meta: Python example code for the conv function from the sqlalchemy.sql.naming module of the SQLAlchemy project. +meta: Python example code for the conv callable from the sqlalchemy.sql.naming module of the SQLAlchemy project. -conv is a function within the sqlalchemy.sql.naming module of the SQLAlchemy project. +conv is a callable within the sqlalchemy.sql.naming module of the SQLAlchemy project. ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown new file mode 100644 index 000000000..3f27229ad --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown @@ -0,0 +1,82 @@ +title: sqlalchemy.sql operators code examples +category: page +slug: sqlalchemy-sql-operators-examples +sortorder: 500031083 +toc: False +sidebartitle: sqlalchemy.sql operators +meta: Python example code for the operators callable from the sqlalchemy.sql module of the SQLAlchemy project. + + +operators is a callable within the sqlalchemy.sql module of the SQLAlchemy project. + + +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / comparator.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./comparator.py) + +```python +# comparator.py + +from sqlalchemy import types as sqltypes +from sqlalchemy.types import UserDefinedType +from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION +~~from sqlalchemy.sql import operators +try: + from sqlalchemy.sql.functions import _FunctionGenerator +except ImportError: # SQLA < 0.9 # pragma: no cover + from sqlalchemy.sql.expression import _FunctionGenerator + + +~~INTERSECTS = operators.custom_op('&&') +~~OVERLAPS_OR_TO_LEFT = operators.custom_op('&<') +~~OVERLAPS_OR_TO_RIGHT = operators.custom_op('&>') +~~OVERLAPS_OR_BELOW = operators.custom_op('&<|') +~~TO_LEFT = operators.custom_op('<<') +~~BELOW = operators.custom_op('<<|') +~~TO_RIGHT = operators.custom_op('>>') +~~CONTAINED = operators.custom_op('@') +~~OVERLAPS_OR_ABOVE = operators.custom_op('|&>') +~~ABOVE = operators.custom_op('|>>') +~~CONTAINS = operators.custom_op('-') +~~SAME = operators.custom_op('-=') +~~DISTANCE_CENTROID = operators.custom_op('<->') +~~DISTANCE_BOX = operators.custom_op('<#>') + + +class BaseComparator(UserDefinedType.Comparator): + + key = None + + def __getattr__(self, name): + + + if not name.lower().startswith('st_'): + raise AttributeError + + + func_ = _FunctionGenerator(expr=self.expr) + return getattr(func_, name) + + def intersects(self, other): + return self.operate(INTERSECTS, other, result_type=sqltypes.Boolean) + + def overlaps_or_to_left(self, other): + return self.operate(OVERLAPS_OR_TO_LEFT, other, + result_type=sqltypes.Boolean) + + def overlaps_or_to_right(self, other): + + +## ... source file continues with no further operators examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown index c929aff38..0f487fd3f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.schema SchemaItem code examples category: page slug: sqlalchemy-sql-schema-schemaitem-examples -sortorder: 500031079 +sortorder: 500031099 toc: False sidebartitle: sqlalchemy.sql.schema SchemaItem meta: Python example code for the SchemaItem class from the sqlalchemy.sql.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown index 71236dbd6..4aaf77b01 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.sql schema code examples category: page slug: sqlalchemy-sql-schema-examples -sortorder: 500031067 +sortorder: 500031084 toc: False sidebartitle: sqlalchemy.sql schema -meta: Python example code for the schema function from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code for the schema callable from the sqlalchemy.sql module of the SQLAlchemy project. -schema is a function within the sqlalchemy.sql module of the SQLAlchemy project. +schema is a callable within the sqlalchemy.sql module of the SQLAlchemy project. ## Example 1 from GINO diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown new file mode 100644 index 000000000..cebd60679 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown @@ -0,0 +1,149 @@ +title: sqlalchemy.sql select code examples +category: page +slug: sqlalchemy-sql-select-examples +sortorder: 500031085 +toc: False +sidebartitle: sqlalchemy.sql select +meta: Python example code for the select callable from the sqlalchemy.sql module of the SQLAlchemy project. + + +select is a callable within the sqlalchemy.sql module of the SQLAlchemy project. + + +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / __init__.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./__init__.py) + +```python +# __init__.py +from .types import ( # NOQA + Geometry, + Geography, + Raster + ) + +from .elements import ( # NOQA + WKTElement, + WKBElement, + RasterElement + ) + +from .exc import ArgumentError + +from . import functions # NOQA +from . import types # NOQA + +from sqlalchemy import Table, event +~~from sqlalchemy.sql import select, func, expression + + +def _setup_ddl_event_listeners(): + @event.listens_for(Table, "before_create") + def before_create(target, connection, **kw): + dispatch("before-create", target, connection) + + @event.listens_for(Table, "after_create") + def after_create(target, connection, **kw): + dispatch("after-create", target, connection) + + @event.listens_for(Table, "before_drop") + def before_drop(target, connection, **kw): + dispatch("before-drop", target, connection) + + @event.listens_for(Table, "after_drop") + def after_drop(target, connection, **kw): + dispatch("after-drop", target, connection) + + def dispatch(event, table, bind): + if event in ('before-create', 'before-drop'): + gis_cols = [c for c in table.c if + isinstance(c.type, Geometry) and + c.type.management is True] + + regular_cols = [x for x in table.c if x not in gis_cols] + + table.info["_saved_columns"] = table.c + + column_collection = expression.ColumnCollection() + for col in regular_cols: + column_collection.add(col) + table.columns = column_collection + + if event == 'before-drop': + for c in gis_cols: + if bind.dialect.name == 'sqlite': + drop_func = 'DiscardGeometryColumn' + elif bind.dialect.name == 'postgresql': + drop_func = 'DropGeometryColumn' + else: + raise ArgumentError('dialect {} is not supported'.format(bind.dialect.name)) + args = [table.schema] if table.schema else [] + args.extend([table.name, c.name]) + +~~ stmt = select([getattr(func, drop_func)(*args)]) + stmt = stmt.execution_options(autocommit=True) + bind.execute(stmt) + + elif event == 'after-create': + table.columns = table.info.pop('_saved_columns') + + for c in table.c: + if isinstance(c.type, Geometry) and c.type.management is True: + args = [table.schema] if table.schema else [] + args.extend([ + table.name, + c.name, + c.type.srid, + c.type.geometry_type, + c.type.dimension + ]) + if c.type.use_typmod is not None: + args.append(c.type.use_typmod) + +~~ stmt = select([func.AddGeometryColumn(*args)]) + stmt = stmt.execution_options(autocommit=True) + bind.execute(stmt) + + if isinstance(c.type, (Geometry, Geography)) and \ + c.type.spatial_index is True: + if bind.dialect.name == 'sqlite': +~~ stmt = select([func.CreateSpatialIndex(table.name, c.name)]) + stmt = stmt.execution_options(autocommit=True) + bind.execute(stmt) + elif bind.dialect.name == 'postgresql': + if table.schema: + bind.execute('CREATE INDEX "idx_%s_%s" ON "%s"."%s" ' + 'USING GIST ("%s")' % + (table.name, c.name, table.schema, + table.name, c.name)) + else: + bind.execute('CREATE INDEX "idx_%s_%s" ON "%s" ' + 'USING GIST ("%s")' % + (table.name, c.name, table.name, c.name)) + else: + raise ArgumentError('dialect {} is not supported'.format(bind.dialect.name)) + + if isinstance(c.type, Raster) and c.type.spatial_index is True: + if table.schema: + bind.execute('CREATE INDEX "idx_%s_%s" ON "%s"."%s" ' + 'USING GIST (ST_ConvexHull("%s"))' % + (table.name, c.name, table.schema, + table.name, c.name)) + else: + bind.execute('CREATE INDEX "idx_%s_%s" ON "%s" ' + 'USING GIST (ST_ConvexHull("%s"))' % + + +## ... source file continues with no further select examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown index f5bb8941d..d8bc667dd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.sql sqltypes code examples category: page slug: sqlalchemy-sql-sqltypes-examples -sortorder: 500031068 +sortorder: 500031086 toc: False sidebartitle: sqlalchemy.sql sqltypes -meta: Python example code for the sqltypes function from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code for the sqltypes callable from the sqlalchemy.sql module of the SQLAlchemy project. -sqltypes is a function within the sqlalchemy.sql module of the SQLAlchemy project. +sqltypes is a callable within the sqlalchemy.sql module of the SQLAlchemy project. ## Example 1 from alembic @@ -110,111 +110,7 @@ def add_column(compiler, column, **kw): ``` -## Example 2 from sandman2 -[sandman2](https://github.com/jeffknupp/sandman2) -([project documentation](https://sandman2.readthedocs.io/en/latest/) -and -[PyPI package information](https://pypi.org/project/sandman2/)) -is a code library for automatically generating -[RESTful APIs](/application-programming-interfaces.html) from -existing database schemas. This approach is handy for solving -straightforward situations where you want to put an abstraction -layer between one or more applications and your -[relational database](/databases.html) to prevent or reduce -direct database access. - -The sandman2 project is provided under the -[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). - -[**sandman2 / sandman2 / app.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./app.py) - -```python -# app.py - -from flask import Flask, current_app, jsonify -~~from sqlalchemy.sql import sqltypes - -from sandman2.exception import ( - BadRequestException, - ForbiddenException, - NotFoundException, - NotAcceptableException, - NotImplementedException, - ConflictException, - ServerErrorException, - ServiceUnavailableException, - ) -from sandman2.service import Service -from sandman2.model import db, Model, AutomapModel -from sandman2.admin import CustomAdminView -from flask_admin import Admin -from flask_httpauth import HTTPBasicAuth - -auth = HTTPBasicAuth() - -def get_app( - database_uri, - exclude_tables=None, - user_models=None, - reflect_all=True, - - -## ... source file abbreviated to get to sqltypes examples ... - - -def _reflect_all(exclude_tables=None, admin=None, read_only=False, schema=None): - AutomapModel.prepare( # pylint:disable=maybe-no-member - db.engine, reflect=True, schema=schema) - for cls in AutomapModel.classes: - if exclude_tables and cls.__table__.name in exclude_tables: - continue - if read_only: - cls.__methods__ = {'GET'} - register_model(cls, admin) - - -def register_model(cls, admin=None): - cls.__url__ = '/{}'.format(cls.__name__.lower()) - service_class = type( - cls.__name__ + 'Service', - (Service,), - { - '__model__': cls, - }) - - cols = list(cls().__table__.primary_key.columns) - - primary_key_type = 'string' - if len(cols) == 1: - col_type = cols[0].type -~~ if isinstance(col_type, sqltypes.String): - primary_key_type = 'string' -~~ elif isinstance(col_type, sqltypes.Integer): - primary_key_type = 'int' -~~ elif isinstance(col_type, sqltypes.Numeric): - primary_key_type = 'float' - - register_service(service_class, primary_key_type) - if admin is not None: - admin.add_view(CustomAdminView(cls, db.session)) - - -def _register_user_models(user_models, admin=None, schema=None): - if any([issubclass(cls, AutomapModel) for cls in user_models]): - AutomapModel.prepare( # pylint:disable=maybe-no-member - db.engine, reflect=True, schema=schema) - - for user_model in user_models: - register_model(user_model, admin) - - - -## ... source file continues with no further sqltypes examples... - -``` - - -## Example 3 from GINO +## Example 2 from GINO [GINO](https://github.com/fantix/gino) ([project documentation](https://python-gino.readthedocs.io/en/latest/) and @@ -454,3 +350,107 @@ class AsyncpgDialect(PGDialect, base.AsyncDialectMixin): ``` + +## Example 3 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / app.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./app.py) + +```python +# app.py + +from flask import Flask, current_app, jsonify +~~from sqlalchemy.sql import sqltypes + +from sandman2.exception import ( + BadRequestException, + ForbiddenException, + NotFoundException, + NotAcceptableException, + NotImplementedException, + ConflictException, + ServerErrorException, + ServiceUnavailableException, + ) +from sandman2.service import Service +from sandman2.model import db, Model, AutomapModel +from sandman2.admin import CustomAdminView +from flask_admin import Admin +from flask_httpauth import HTTPBasicAuth + +auth = HTTPBasicAuth() + +def get_app( + database_uri, + exclude_tables=None, + user_models=None, + reflect_all=True, + + +## ... source file abbreviated to get to sqltypes examples ... + + +def _reflect_all(exclude_tables=None, admin=None, read_only=False, schema=None): + AutomapModel.prepare( # pylint:disable=maybe-no-member + db.engine, reflect=True, schema=schema) + for cls in AutomapModel.classes: + if exclude_tables and cls.__table__.name in exclude_tables: + continue + if read_only: + cls.__methods__ = {'GET'} + register_model(cls, admin) + + +def register_model(cls, admin=None): + cls.__url__ = '/{}'.format(cls.__name__.lower()) + service_class = type( + cls.__name__ + 'Service', + (Service,), + { + '__model__': cls, + }) + + cols = list(cls().__table__.primary_key.columns) + + primary_key_type = 'string' + if len(cols) == 1: + col_type = cols[0].type +~~ if isinstance(col_type, sqltypes.String): + primary_key_type = 'string' +~~ elif isinstance(col_type, sqltypes.Integer): + primary_key_type = 'int' +~~ elif isinstance(col_type, sqltypes.Numeric): + primary_key_type = 'float' + + register_service(service_class, primary_key_type) + if admin is not None: + admin.add_view(CustomAdminView(cls, db.session)) + + +def _register_user_models(user_models, admin=None, schema=None): + if any([issubclass(cls, AutomapModel) for cls in user_models]): + AutomapModel.prepare( # pylint:disable=maybe-no-member + db.engine, reflect=True, schema=schema) + + for user_model in user_models: + register_model(user_model, admin) + + + +## ... source file continues with no further sqltypes examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown index c19d97cc9..1c59ab1a0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.sql table code examples category: page slug: sqlalchemy-sql-table-examples -sortorder: 500031069 +sortorder: 500031087 toc: False sidebartitle: sqlalchemy.sql table -meta: Python example code for the table function from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code for the table callable from the sqlalchemy.sql module of the SQLAlchemy project. -table is a function within the sqlalchemy.sql module of the SQLAlchemy project. +table is a callable within the sqlalchemy.sql module of the SQLAlchemy project. ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown index 5cc63d3eb..789f71dc8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.util ClauseAdapter code examples category: page slug: sqlalchemy-sql-util-clauseadapter-examples -sortorder: 500031080 +sortorder: 500031100 toc: False sidebartitle: sqlalchemy.sql.util ClauseAdapter meta: Python example code for the ClauseAdapter class from the sqlalchemy.sql.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown index 70e302798..4d9418e58 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.sql.visitors traverse code examples category: page slug: sqlalchemy-sql-visitors-traverse-examples -sortorder: 500031081 +sortorder: 500031101 toc: False sidebartitle: sqlalchemy.sql.visitors traverse -meta: Python example code for the traverse function from the sqlalchemy.sql.visitors module of the SQLAlchemy project. +meta: Python example code for the traverse callable from the sqlalchemy.sql.visitors module of the SQLAlchemy project. -traverse is a function within the sqlalchemy.sql.visitors module of the SQLAlchemy project. +traverse is a callable within the sqlalchemy.sql.visitors module of the SQLAlchemy project. ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown new file mode 100644 index 000000000..471997ce6 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown @@ -0,0 +1,148 @@ +title: sqlalchemy.types Enum code examples +category: page +slug: sqlalchemy-types-enum-examples +sortorder: 500031102 +toc: False +sidebartitle: sqlalchemy.types Enum +meta: Python example code for the Enum class from the sqlalchemy.types module of the SQLAlchemy project. + + +Enum is a class within the sqlalchemy.types module of the SQLAlchemy project. + + +## Example 1 from graphene-sqlalchemy +[graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) +([project documentation](https://docs.graphene-python.org/projects/sqlalchemy/en/latest/) +and +[PyPI package information](https://pypi.org/project/graphene-sqlalchemy/)) +is a [SQLAlchemy](/sqlalchemy.html) integration for +[Graphene](https://graphene-python.org/), which makes it easier to build +GraphQL-based [APIs](/application-programming-interfaces.html) into Python +[web applications](/web-development.html). The package allows you to +subclass SQLAlchemy classes and build queries around them with custom +code to match the backend queries with the GraphQL-based request queries. +The project is provided as open source under the +[MIT license](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/LICENSE.md). + +[**graphene-sqlalchemy / graphene_sqlalchemy / enums.py**](https://github.com/graphql-python/graphene-sqlalchemy/blob/master/graphene_sqlalchemy/./enums.py) + +```python +# enums.py +import six +from sqlalchemy.orm import ColumnProperty +~~from sqlalchemy.types import Enum as SQLAlchemyEnumType + +from graphene import Argument, Enum, List + +from .utils import EnumValue, to_enum_value_name, to_type_name + + +def _convert_sa_to_graphene_enum(sa_enum, fallback_name=None): + if not isinstance(sa_enum, SQLAlchemyEnumType): + raise TypeError( + "Expected sqlalchemy.types.Enum, but got: {!r}".format(sa_enum) + ) + enum_class = sa_enum.enum_class + if enum_class: + if all(to_enum_value_name(key) == key for key in enum_class.__members__): +~~ return Enum.from_enum(enum_class) + name = enum_class.__name__ + members = [ + (to_enum_value_name(key), value.value) + for key, value in enum_class.__members__.items() + ] + else: + sql_enum_name = sa_enum.name + if sql_enum_name: + name = to_type_name(sql_enum_name) + elif fallback_name: + name = fallback_name + else: + raise TypeError("No type name specified for {!r}".format(sa_enum)) + members = [(to_enum_value_name(key), key) for key in sa_enum.enums] +~~ return Enum(name, members) + + +def enum_for_sa_enum(sa_enum, registry): + if not isinstance(sa_enum, SQLAlchemyEnumType): + raise TypeError( + "Expected sqlalchemy.types.Enum, but got: {!r}".format(sa_enum) + ) + enum = registry.get_graphene_enum_for_sa_enum(sa_enum) + if not enum: + enum = _convert_sa_to_graphene_enum(sa_enum) + registry.register_enum(sa_enum, enum) + return enum + + +def enum_for_field(obj_type, field_name): + from .types import SQLAlchemyObjectType + + if not isinstance(obj_type, type) or not issubclass(obj_type, SQLAlchemyObjectType): + raise TypeError( + "Expected SQLAlchemyObjectType, but got: {!r}".format(obj_type)) + if not field_name or not isinstance(field_name, six.string_types): + raise TypeError( + "Expected a field name, but got: {!r}".format(field_name)) + registry = obj_type._meta.registry + + +## ... source file abbreviated to get to Enum examples ... + + + if name != enum.__name__ or custom_options != enum.custom_options: + raise ValueError( + "Sort enum for {} has already been customized".format(obj_type) + ) + else: + members = [] + default = [] + fields = obj_type._meta.fields + get_name = get_symbol_name or _default_sort_enum_symbol_name + for field_name in fields: + if only_fields and field_name not in only_fields: + continue + orm_field = registry.get_orm_field_for_graphene_field(obj_type, field_name) + if not isinstance(orm_field, ColumnProperty): + continue + column = orm_field.columns[0] + if only_indexed and not (column.primary_key or column.index): + continue + asc_name = get_name(column.name, True) + asc_value = EnumValue(asc_name, column.asc()) + desc_name = get_name(column.name, False) + desc_value = EnumValue(desc_name, column.desc()) + if column.primary_key: + default.append(asc_value) + members.extend(((asc_name, asc_value), (desc_name, desc_value))) +~~ enum = Enum(name, members) + enum.default = default # store default as attribute + enum.custom_options = custom_options + registry.register_sort_enum(obj_type, enum) + return enum + + +def sort_argument_for_object_type( + obj_type, + enum_name=None, + only_fields=None, + only_indexed=None, + get_symbol_name=None, + has_default=True, +): + enum = sort_enum_for_object_type( + obj_type, + enum_name, + only_fields=only_fields, + only_indexed=only_indexed, + get_symbol_name=get_symbol_name, + ) + if not has_default: + enum.default = None + + + +## ... source file continues with no further Enum examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown index 3f359aa1a..6be1a48f0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Integer code examples category: page slug: sqlalchemy-types-integer-examples -sortorder: 500031082 +sortorder: 500031103 toc: False sidebartitle: sqlalchemy.types Integer meta: Python example code for the Integer class from the sqlalchemy.types module of the SQLAlchemy project. @@ -54,3 +54,89 @@ class SchemaObjects(object): ``` + +## Example 2 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / types.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./types.py) + +```python +# types.py +import warnings + +~~from sqlalchemy.types import UserDefinedType, Integer +from sqlalchemy.sql import func +from sqlalchemy.dialects import postgresql +from sqlalchemy.dialects.postgresql.base import ischema_names + +try: + from .shape import to_shape + SHAPELY = True +except ImportError: + SHAPELY = False + + +from .comparator import BaseComparator, Comparator +from .elements import WKBElement, WKTElement, RasterElement, CompositeElement +from .exc import ArgumentError + + +class _GISType(UserDefinedType): + + name = None + + from_text = None + + as_binary = None + + + +## ... source file abbreviated to get to Integer examples ... + + + + def __init__(self, *args, **kwargs): + kwargs['geometry_type'] = None + kwargs['srid'] = -1 + super(Raster, self).__init__(*args, **kwargs) + self.extended = None + + +class CompositeType(UserDefinedType): + + typemap = {} + + class comparator_factory(UserDefinedType.Comparator): + def __getattr__(self, key): + try: + type_ = self.type.typemap[key] + except KeyError: + raise KeyError("Type '%s' doesn't have an attribute: '%s'" + % (self.type, key)) + + return CompositeElement(self.expr, key, type_) + + +class GeometryDump(CompositeType): + +~~ typemap = {'path': postgresql.ARRAY(Integer), 'geom': Geometry} + + +ischema_names['geometry'] = Geometry +ischema_names['geography'] = Geography +ischema_names['raster'] = Raster + + + +## ... source file continues with no further Integer examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown index 588c8d556..78c3ec53c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.types NULLTYPE code examples category: page slug: sqlalchemy-types-nulltype-examples -sortorder: 500031083 +sortorder: 500031104 toc: False sidebartitle: sqlalchemy.types NULLTYPE -meta: Python example code for the NULLTYPE class from the sqlalchemy.types module of the SQLAlchemy project. +meta: Python example code for the NULLTYPE constant from the sqlalchemy.types module of the SQLAlchemy project. -NULLTYPE is a class within the sqlalchemy.types module of the SQLAlchemy project. +NULLTYPE is a constant within the sqlalchemy.types module of the SQLAlchemy project. ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown new file mode 100644 index 000000000..bfb598999 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown @@ -0,0 +1,106 @@ +title: sqlalchemy.types to_instance code examples +category: page +slug: sqlalchemy-types-to-instance-examples +sortorder: 500031106 +toc: False +sidebartitle: sqlalchemy.types to_instance +meta: Python example code for the to_instance callable from the sqlalchemy.types module of the SQLAlchemy project. + + +to_instance is a callable within the sqlalchemy.types module of the SQLAlchemy project. + + +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / elements.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./elements.py) + +```python +# elements.py +import binascii +import struct + +try: + from sqlalchemy.sql import functions + from sqlalchemy.sql.functions import FunctionElement +except ImportError: # SQLA < 0.9 # pragma: no cover + from sqlalchemy.sql import expression as functions + from sqlalchemy.sql.expression import FunctionElement +~~from sqlalchemy.types import to_instance +from sqlalchemy.ext.compiler import compiles + +from .compat import PY3, str as str_ +from .exc import ArgumentError + + +if PY3: + BinasciiError = binascii.Error +else: + BinasciiError = TypeError + + +class HasFunction(object): + pass + + +class _SpatialElement(HasFunction): + + def __init__(self, data, srid=-1, extended=False): + self.srid = srid + self.data = data + self.extended = extended + + def __str__(self): + + +## ... source file abbreviated to get to to_instance examples ... + + + try: + bin_data = binascii.unhexlify(data[:114]) + except BinasciiError: + bin_data = data + data = str(binascii.hexlify(data).decode(encoding='utf-8')) + byte_order = bin_data[0] + srid = bin_data[53:57] + if not PY3: + byte_order = bytearray(byte_order)[0] + srid = struct.unpack('I', srid)[0] + _SpatialElement.__init__(self, data, srid, True) + + @property + def desc(self): + return self.data + + @staticmethod + def _data_from_desc(desc): + return desc + + +class CompositeElement(FunctionElement): + + def __init__(self, base, field, type_): + self.name = field +~~ self.type = to_instance(type_) + + super(CompositeElement, self).__init__(base) + + +@compiles(CompositeElement) +def _compile_pgelem(expr, compiler, **kw): + return '(%s).%s' % (compiler.process(expr.clauses, **kw), expr.name) + + + +## ... source file continues with no further to_instance examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown new file mode 100644 index 000000000..6fc0eff7b --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown @@ -0,0 +1,60 @@ +title: sqlalchemy.types UserDefinedType code examples +category: page +slug: sqlalchemy-types-userdefinedtype-examples +sortorder: 500031105 +toc: False +sidebartitle: sqlalchemy.types UserDefinedType +meta: Python example code for the UserDefinedType class from the sqlalchemy.types module of the SQLAlchemy project. + + +UserDefinedType is a class within the sqlalchemy.types module of the SQLAlchemy project. + + +## Example 1 from GeoAlchemy2 +[GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) +([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/GeoAlchemy2/)) +extends [SQLAlchemy](/sqlalchemy.html) with new data types for working +with geospatial databases, particularly [PostGIS](http://postgis.net/), +which is a spatial database extender for [PostgreSQL](/postgresql.html). +The project is provided as open source under the +[MIT license](https://github.com/geoalchemy/geoalchemy2/blob/master/COPYING.rst). + +[**GeoAlchemy2 / geoalchemy2 / comparator.py**](https://github.com/geoalchemy/geoalchemy2/blob/master/geoalchemy2/./comparator.py) + +```python +# comparator.py + +from sqlalchemy import types as sqltypes +~~from sqlalchemy.types import UserDefinedType +from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION +from sqlalchemy.sql import operators +try: + from sqlalchemy.sql.functions import _FunctionGenerator +except ImportError: # SQLA < 0.9 # pragma: no cover + from sqlalchemy.sql.expression import _FunctionGenerator + + +INTERSECTS = operators.custom_op('&&') +OVERLAPS_OR_TO_LEFT = operators.custom_op('&<') +OVERLAPS_OR_TO_RIGHT = operators.custom_op('&>') +OVERLAPS_OR_BELOW = operators.custom_op('&<|') +TO_LEFT = operators.custom_op('<<') +BELOW = operators.custom_op('<<|') +TO_RIGHT = operators.custom_op('>>') +CONTAINED = operators.custom_op('@') +OVERLAPS_OR_ABOVE = operators.custom_op('|&>') +ABOVE = operators.custom_op('|>>') +CONTAINS = operators.custom_op('-') +SAME = operators.custom_op('-=') +DISTANCE_CENTROID = operators.custom_op('<->') +DISTANCE_BOX = operators.custom_op('<#>') + + + + +## ... source file continues with no further UserDefinedType examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown index 09fee035e..188e623e7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.util.langhelpers symbol code examples category: page slug: sqlalchemy-util-langhelpers-symbol-examples -sortorder: 500031088 +sortorder: 500031111 toc: False sidebartitle: sqlalchemy.util.langhelpers symbol -meta: Python example code for the symbol function from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. +meta: Python example code for the symbol callable from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. -symbol is a function within the sqlalchemy.util.langhelpers module of the SQLAlchemy project. +symbol is a callable within the sqlalchemy.util.langhelpers module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown index 4fa8828fb..f32c42442 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util OrderedDict code examples category: page slug: sqlalchemy-util-ordereddict-examples -sortorder: 500031084 +sortorder: 500031107 toc: False sidebartitle: sqlalchemy.util OrderedDict meta: Python example code for the OrderedDict class from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown index 575948d06..c8302c7be 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util OrderedSet code examples category: page slug: sqlalchemy-util-orderedset-examples -sortorder: 500031085 +sortorder: 500031108 toc: False sidebartitle: sqlalchemy.util OrderedSet meta: Python example code for the OrderedSet class from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown index 59fafe928..313868b82 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.util set_creation_order code examples category: page slug: sqlalchemy-util-set-creation-order-examples -sortorder: 500031086 +sortorder: 500031109 toc: False sidebartitle: sqlalchemy.util set_creation_order -meta: Python example code for the set_creation_order function from the sqlalchemy.util module of the SQLAlchemy project. +meta: Python example code for the set_creation_order callable from the sqlalchemy.util module of the SQLAlchemy project. -set_creation_order is a function within the sqlalchemy.util module of the SQLAlchemy project. +set_creation_order is a callable within the sqlalchemy.util module of the SQLAlchemy project. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown index 9a047c0f1..1502d5976 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown @@ -1,13 +1,13 @@ title: sqlalchemy.util topological code examples category: page slug: sqlalchemy-util-topological-examples -sortorder: 500031087 +sortorder: 500031110 toc: False sidebartitle: sqlalchemy.util topological -meta: Python example code for the topological function from the sqlalchemy.util module of the SQLAlchemy project. +meta: Python example code for the topological callable from the sqlalchemy.util module of the SQLAlchemy project. -topological is a function within the sqlalchemy.util module of the SQLAlchemy project. +topological is a callable within the sqlalchemy.util module of the SQLAlchemy project. ## Example 1 from alembic diff --git a/theme/templates/code-examples/sqlalchemy.html b/theme/templates/code-examples/sqlalchemy.html index 492b04430..6130c1836 100644 --- a/theme/templates/code-examples/sqlalchemy.html +++ b/theme/templates/code-examples/sqlalchemy.html @@ -1,7 +1,7 @@

SQLAlchemy: -Extensions,Plug-ins and Related Libraries & +Extensions, Plug-ins and Related Libraries & Example Projects and Code

sqlalchemy.dialects @@ -15,6 +15,7 @@

sqlalchemy.dialects.postgresql ARRAY, BIGINT, BIT, + DOUBLE_PRECISION, ExcludeConstraint, INTEGER, JSON, @@ -48,6 +49,7 @@

sqlalchemy.events SchemaEventTarget

sqlalchemy.exc + ArgumentError, DataError, IntegrityError, InvalidRequestError, @@ -80,13 +82,23 @@

sqlalchemy.inspection

sqlalchemy.orm ColumnProperty, + CompositeProperty, Mapper, + Session, SynonymProperty, attributes, class_mapper, + column_property, + composite, + interfaces, mapper, mapperlib, - object_session + object_mapper, + object_session, + relationship, + session, + sessionmaker, + strategies

sqlalchemy.orm.attributes InstrumentedAttribute @@ -107,6 +119,10 @@

sqlalchemy.orm.properties ColumnProperty, RelationshipProperty

+

sqlalchemy.orm.query + Query, + QueryContext +

sqlalchemy.orm.session Session, object_session @@ -129,12 +145,18 @@

sqlalchemy.schema

sqlalchemy.sql ClauseElement, + Select, column, + expression, + functions, + operators, schema, + select, sqltypes, table

sqlalchemy.sql.elements + ColumnElement, Label

sqlalchemy.sql.expression @@ -146,6 +168,7 @@

sqlalchemy.sql.expression UnaryExpression

sqlalchemy.sql.functions + FunctionElement, GenericFunction

sqlalchemy.sql.naming @@ -161,10 +184,13 @@

sqlalchemy.sql.visitors traverse

sqlalchemy.types + Enum, INTEGER, Integer, NULLTYPE, - NullType + NullType, + UserDefinedType, + to_instance

sqlalchemy.util OrderedDict, From c68426ab0ebd8d6e5c60922e5073a14d3a2d4945 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 29 Jun 2020 18:57:03 -0400 Subject: [PATCH 148/302] update flask code examples --- .../examples/flask/flask-app-flask.markdown | 46 +++++ .../flask-example-projects-code.markdown | 9 + .../flask/flask-globals-request.markdown | 193 ++++++++++++++++++ .../flask/flask-globals-session.markdown | 91 +++++++++ .../flask-templating-render-template.markdown | 93 +++++++++ .../waiting-for-events.jpg | Bin 0 -> 187657 bytes static/img/headers/flask-sentry.jpg | Bin 0 -> 25842 bytes static/img/headers/python-flask-sentry.jpg | Bin 0 -> 27212 bytes .../report-errors-flask-web-apps-sentry.html | 5 + 9 files changed, 437 insertions(+) create mode 100644 static/img/200630-python-flask-sentry/waiting-for-events.jpg create mode 100644 static/img/headers/flask-sentry.jpg create mode 100644 static/img/headers/python-flask-sentry.jpg create mode 100644 theme/templates/blog/report-errors-flask-web-apps-sentry.html diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 994cdc627..2f61817f3 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -1146,3 +1146,49 @@ def create_app(extra_config_settings={}): ``` + +## Example 17 from trape +[trape](https://github.com/jofpin/trape) is a research tool for tracking +people's activities that are logged digitally. The tool uses +[Flask](/flask.html) to create a web front end to view aggregated data +on an individual the application is set to track. The source code is +provided as open source under the MIT license, according to the +[README](https://github.com/jofpin/trape/blob/master/README.md). + +[**trape / core / user.py**](https://github.com/jofpin/trape/blob/master/./core/user.py) + +```python +# user.py +import time +from core.dependence import urllib2 +~~from flask import Flask, render_template, session, request, json, Response +from core.user_objects import * +import core.stats +from core.utils import utils +from core.db import Database +import os +import sys +import platform +from multiprocessing import Process + +trape = core.stats.trape +app = core.stats.app + +db = Database() + +class victim_server(object): + @app.route("/" + trape.victim_path) + def homeVictim(): + opener = urllib2.build_opener() + headers = victim_headers(request.user_agent) + opener.addheaders = headers + if (trape.type_lure == 'local'): + html = assignScripts(victim_inject_code(render_template("/" + trape.url_to_clone), 'payload', '/', trape.gmaps, trape.ipinfo)) + else: + html = assignScripts(victim_inject_code(opener.open(trape.url_to_clone).read(), 'payload', trape.url_to_clone, trape.gmaps, trape.ipinfo)) + + +## ... source file continues with no further Flask examples... + +``` + diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index cfd0f044a..11a327582 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -115,3 +115,12 @@ often used with Flask. The project's code is provided as open source under the [BSD 2-Clause "Simplified" license](https://github.com/tedivm/tedivms-flask/blob/master/LICENSE.txt). + +### trape +[trape](https://github.com/jofpin/trape) is a research tool for tracking +people's activities that are logged digitally. The tool uses +[Flask](/flask.html) to create a web front end to view aggregated data +on an individual the application is set to track. The source code is +provided as open source under the MIT license, according to the +[README](https://github.com/jofpin/trape/blob/master/README.md). + diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 1414388f5..be10c4cc6 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -2962,3 +2962,196 @@ def roles_accepted_api(*role_names): ``` + +## Example 19 from trape +[trape](https://github.com/jofpin/trape) is a research tool for tracking +people's activities that are logged digitally. The tool uses +[Flask](/flask.html) to create a web front end to view aggregated data +on an individual the application is set to track. The source code is +provided as open source under the MIT license, according to the +[README](https://github.com/jofpin/trape/blob/master/README.md). + +[**trape / core / user.py**](https://github.com/jofpin/trape/blob/master/./core/user.py) + +```python +# user.py +import time +from core.dependence import urllib2 +~~from flask import Flask, render_template, session, request, json, Response +from core.user_objects import * +import core.stats +from core.utils import utils +from core.db import Database +import os +import sys +import platform +from multiprocessing import Process + +trape = core.stats.trape +app = core.stats.app + +db = Database() + +class victim_server(object): + @app.route("/" + trape.victim_path) + def homeVictim(): + opener = urllib2.build_opener() + headers = victim_headers(request.user_agent) + opener.addheaders = headers + if (trape.type_lure == 'local'): + html = assignScripts(victim_inject_code(render_template("/" + trape.url_to_clone), 'payload', '/', trape.gmaps, trape.ipinfo)) + else: + html = assignScripts(victim_inject_code(opener.open(trape.url_to_clone).read(), 'payload', trape.url_to_clone, trape.gmaps, trape.ipinfo)) + return html + + @app.route("/register", methods=["POST"]) + def register(): +~~ vId = request.form['vId'] + if vId == '': + vId = utils.generateToken(5) + +~~ victimConnect = victim(vId, request.environ['REMOTE_ADDR'], request.user_agent.platform, request.user_agent.browser, request.user_agent.version, utils.portScanner(request.environ['REMOTE_ADDR']), request.form['cpu'], time.strftime("%Y-%m-%d - %H:%M:%S")) +~~ victimGeo = victim_geo(vId, request.form['city'], request.form['country_code2'], request.form['country_name'], request.form['ip'], request.form['latitude'], request.form['longitude'], request.form['isp'], request.form['country_code3'], request.form['state_prov'], '', request.form['zipcode'], request.form['organization'], str(request.user_agent), '') + +~~ vRA = request.environ['REMOTE_ADDR'] + + gHA = Process(target=getHostsAlive, args=(vRA, vId,)) + gHA.start() + + utils.Go(utils.Color['white'] + "[" + utils.Color['blueBold'] + "*" + utils.Color['white'] + "]" + " A " + utils.Color['whiteBold'] + "user" + utils.Color['white'] + " has been connected from " + utils.Color['blue'] + victimGeo.ip + utils.Color['white'] + ' with the following identifier: ' + utils.Color['green'] + vId + utils.Color['white']) + cant = int(db.sentences_victim('count_times', vId, 3, 0)) + + db.sentences_victim('insert_click', [vId, trape.url_to_clone, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) + db.sentences_victim('delete_networks', [vId], 2) + + if cant > 0: + utils.Go(utils.Color['white'] + "[" + utils.Color['blueBold'] + "*" + utils.Color['white'] + "]" + " " + "It\'s the " + str(cant + 1) + " time for " + utils.Color['green'] + str(vId) + utils.Color['white'] + "@" + utils.Color['blue'] + victimGeo.ip + utils.Color['white']) + db.sentences_victim('update_victim', [victimConnect, vId, time.time()], 2) + db.sentences_victim('update_victim_geo', [victimGeo, vId], 2) + else: + utils.Go(utils.Color['white'] + "[" + utils.Color['blueBold'] + "*" + utils.Color['white'] + "]" + " " + "It\'s the first time for " + utils.Color['green'] + str(vId) + utils.Color['white'] + "@" + utils.Color['blue'] + victimGeo.ip + utils.Color['white']) + db.sentences_victim('insert_victim', [victimConnect, vId, time.time()], 2) + db.sentences_victim('insert_victim_data', [vId], 2) + db.sentences_victim('insert_victim_battery', [vId], 2) + db.sentences_victim('insert_victim_geo', [victimGeo, vId], 2) + return json.dumps({'status' : 'OK', 'vId' : vId}) + + @app.route("/nr", methods=["POST"]) + def networkRegister(): +~~ vId = request.form['vId'] +~~ vIp = request.form['ip'] +~~ vnetwork = request.form['red'] + if vId == '': + vId = utils.generateToken(5) + + cant = int(db.sentences_victim('count_victim_network', [vId, vnetwork], 3, 0)) + + if cant > 0: + db.sentences_victim('update_network', [vId, vnetwork, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) + else: +~~ db.sentences_victim('insert_networks', [vId, vIp, request.environ['REMOTE_ADDR'], vnetwork, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) + utils.Go(utils.Color['white'] + "[" + utils.Color['greenBold'] + "+" + utils.Color['white'] + "]" + utils.Color['whiteBold'] + " " + vnetwork + utils.Color['white'] + " session detected from " + utils.Color['blue'] + vIp + utils.Color['white'] + ' ' + "with ID: " + utils.Color['green'] + vId + utils.Color['white']) + return json.dumps({'status' : 'OK', 'vId' : vId}) + + @app.route("/lr", methods=["POST"]) + def locationRegister(): +~~ vId = request.form['vId'] +~~ lat = request.form['lat'] +~~ lon = request.form['lon'] + + db.sentences_victim('location_victim', [vId, lat, lon], 2) + return json.dumps({'status' : 'OK', 'vId' : vId}) + + @app.route("/lc", methods=["POST"]) + def connectionRegister(): +~~ vId = request.form['vId'] +~~ con = request.form['con'] +~~ host = request.form['host'] + + db.sentences_victim('connection_victim', [vId, con, host], 2) + return json.dumps({'status' : 'OK', 'vId' : vId}) + + @app.route("/bs", methods=["POST"]) + def batteryStatusRegister(): +~~ vId = request.form['id'] +~~ b_data = request.form['d'] +~~ b_type = request.form['t'] + + db.sentences_victim('update_battery', [vId, b_data, b_type], 2) + return json.dumps({'status' : 'OK', 'vId' : vId}) + + @app.route("/nm", methods=["POST"]) + def navigationMode(): +~~ vId = request.form['id'] +~~ b_data = request.form['d'] +~~ b_data_2 = request.form['dn'] + + db.sentences_victim('update_navigationmode', [vId, b_data, b_data_2], 2) + return json.dumps({'status' : 'OK', 'vId' : vId}) + + @app.route("/rv") + def redirectVictim(): +~~ url = request.args.get('url') + if url[0:4] != 'http': + url = 'http://' + url + opener = urllib2.build_opener() + headers = victim_headers(request.user_agent) + opener.addheaders = headers + html = assignScripts(victim_inject_code(opener.open(url).read(), 'vscript', url, trape.gmaps, trape.ipinfo)) + return html + + @app.route("/regv", methods=["POST"]) + def registerRequest(): +~~ vrequest = victim_request(request.form['vId'], request.form['site'], request.form['fid'], request.form['name'], request.form['value'], request.form['sId']) + db.sentences_victim('insert_requests', [vrequest, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) + utils.Go(utils.Color['white'] + "[" + utils.Color['greenBold'] + "=" + utils.Color['white'] + "]" + " " + 'Receiving data from: ' + utils.Color['green'] + vrequest.id + utils.Color['white'] + ' ' + 'on' + ' ' + utils.Color['blue'] + vrequest.site + utils.Color['white'] + '\t\n' + vrequest.fid + '\t' + vrequest.name + ':\t' + vrequest.value) + return json.dumps({'status' : 'OK', 'vId' : vrequest.id}) + + @app.route("/tping", methods=["POST"]) + def receivePiregisterGPUng(): +~~ vrequest = request.form['id'] + db.sentences_victim('report_online', [vrequest], 2) + db.sentences_victim('update_lastping', [vrequest, time.strftime("%Y-%m-%d - %H:%M:%S")], 2) + return json.dumps({'status' : 'OK', 'vId' : vrequest}) + + @app.route("/cIp", methods=["POST"]) + def changeLocalIp(): +~~ vrequest = request.form['id'] +~~ vIp = request.form['ip'] + db.sentences_victim('update_localIp', [vrequest, vIp], 2) + return json.dumps({'status' : 'OK', 'vId' : vrequest}) + + @app.route("/gGpu", methods=["POST"]) + def setGpuInfo(): +~~ vId = request.form['vId'] +~~ vData = request.form['data'] + db.sentences_victim('update_gpu', [vId, vData], 2) + return json.dumps({'status' : 'OK', 'vId' : vId}) + + +def getHostsAlive(ip, vId): + hDB = Database() + try: + hDB.sentences_victim('delete_hostalive', vId, 2) + split_ip = ip.split('.') + net = split_ip[0] + '.' + split_ip[1] + '.' + split_ip[2] + '.' + if ip != '127.0.0.1': + if (platform.system()=='Windows'): + ping = 'ping -n 1 -w 5' + else: + ping = 'ping -c 1 -t 3' + for sub_net in range(1, 255): + address = net + str(sub_net) + response = os.popen(ping + ' ' + address) + for line in response.readlines(): + if ('time=' in line.lower()): + lPos = line.find('time=') + tmpLine = line[lPos+5:lPos+15] + lPos = tmpLine.find('ms') + tmpLine = tmpLine[0:lPos+2] + + +## ... source file continues with no further request examples... + +``` + diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index cc28bc8d8..a78becf98 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -1185,3 +1185,94 @@ def init_error_handlers(app): ``` + +## Example 12 from trape +[trape](https://github.com/jofpin/trape) is a research tool for tracking +people's activities that are logged digitally. The tool uses +[Flask](/flask.html) to create a web front end to view aggregated data +on an individual the application is set to track. The source code is +provided as open source under the MIT license, according to the +[README](https://github.com/jofpin/trape/blob/master/README.md). + +[**trape / core / sockets.py**](https://github.com/jofpin/trape/blob/master/./core/sockets.py) + +```python +# sockets.py +from socket import gethostname, gethostbyname +from threading import Lock +~~from flask import Flask, render_template, session, request, json +from flask_socketio import SocketIO, emit, join_room, rooms, disconnect +import core.stats +import core.user +from user_objects import attacks_hook_message +from core.utils import utils +from core.db import Database +import sys + +trape = core.stats.trape +app = core.stats.app + +db = Database() + +async_mode = None +socketio = SocketIO(app, async_mode=async_mode) +thread = None +thread_lock = Lock() + +db.sentences_victim('clean_online', None, 2) + +def background_thread(): + count = 0 + +@socketio.on("join", namespace="/trape") +def join(message): + try: + join_room(message['room']) +~~ session['receive_count'] = session.get('receive_count', 0) + 1 + except Exception as error: + pass + +@socketio.on("my_room_event", namespace="/trape") +def send_room_message(message): + try: +~~ session['receive_count'] = session.get('receive_count', 0) + 1 + hookAction = attacks_hook_message(message['data']['type']) + utils.Go(utils.Color['white'] + "[" + utils.Color['blueBold'] + "@" + utils.Color['white'] + "]" + " " + hookAction + utils.Color['blue'] + message['data']['message'] + utils.Color['white'] + ' in ' + utils.Color['green'] + message['room'] + utils.Color['white']) + emit('my_response', {'data': message['data'], 'count': session['receive_count']},room = message['room']) + except Exception as error: + pass + +@socketio.on("disconnect_request", namespace="/trape") +def disconnect_request(d): + try: +~~ session['receive_count'] = session.get('receive_count', 0) + 1 + emit('my_response', {'data': 'Disconnected!', 'count': session['receive_count']}) + utils.Go(utils.Color['white'] + "[" + utils.Color['redBold'] + "-" + utils.Color['white'] + "]" + utils.Color['red'] + " " + "A victim has closed her connection with the following id:" + " " + utils.Color['green'] + d['vId'] + utils.Color['white']) + db.sentences_victim('disconnect_victim', d['vId'], 2) + except Exception as error: + pass + +@socketio.on("error", namespace="/trape") +def socket_def_error(d): + pass + +@socketio.on_error("/trape") +def error_handler(e): + pass + +@app.route("/" + trape.home_path) +def home(): + gMaps_free_api_key = 'AIzaSyBUPHAjZl3n8Eza66ka6B78iVyPteC5MgM' + if (trape.gmaps != ''): + gMaps_free_api_key = trape.gmaps + + shorten_api = 'AIzaSyCPzcppCT27KTHnxAIQvYhtvB_l8sKGYBs' + + html = trape.injectCSS_Paths(render_template("home.html", async_mode=socketio.async_mode).replace('[OWN_API_KEY_HERE]', gMaps_free_api_key).replace('[LIBS_SRC]', trape.JSFiles[1]['src']).replace('[TRAPE_SRC]', trape.JSFiles[4]['src'])) + return html + + +## ... source file continues with no further session examples... + +``` + diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index d6b704b66..6a4478c44 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1562,3 +1562,96 @@ def init_error_handlers(app): ``` + +## Example 17 from trape +[trape](https://github.com/jofpin/trape) is a research tool for tracking +people's activities that are logged digitally. The tool uses +[Flask](/flask.html) to create a web front end to view aggregated data +on an individual the application is set to track. The source code is +provided as open source under the MIT license, according to the +[README](https://github.com/jofpin/trape/blob/master/README.md). + +[**trape / core / stats.py**](https://github.com/jofpin/trape/blob/master/./core/stats.py) + +```python +# stats.py +from core.dependence import urllib2 +import sys +import os +~~from flask import Flask, render_template, session, request, json, redirect, url_for, send_from_directory +from flask_cors import CORS +from trape import Trape +from core.db import Database + +trape = Trape(1) + +if getattr(sys, 'frozen', False): + template_folder = os.path.join(sys._MEIPASS, 'templates') + static_folder = os.path.join(sys._MEIPASS, 'static') + app = Flask(__name__, template_folder=template_folder, static_folder=static_folder) +else: + app = Flask(__name__, template_folder='../templates', static_folder='../static') + +cors = CORS(app) + +db = Database() + +trape.header() + + +@app.route("/" + trape.stats_path) +def index(): + return trape.injectCSS_Paths(render_template("/login.html").replace('[LOGIN_SRC]', trape.JSFiles[2]['src']).replace('[LIBS_SRC]', trape.JSFiles[1]['src'])) + + + +## ... source file abbreviated to get to render_template examples ... + + + server_code = '' + if trape.nGrokUrl != '': + server_code = str(trape.nGrokUrl) + else: + server_code = str(trape.localIp) + ':' + str(trape.app_port) + + codeToInject = codeToInject.replace('[HOST_ADDRESS]', server_code) + codeToInject = codeToInject.replace('[YOUR_GMAPS_API_KEY]', trape.gmaps) + return codeToInject + +@app.route("/static/js/") +def busted(JSFile): + code = '' + mPath = '' + if getattr(sys, 'frozen', False): + mPath = sys._MEIPASS + '/' + for obj in trape.JSFiles: + if str(obj['src']) == str(JSFile): + s_code = open(mPath + "static/js/" + obj['path'],"r") + code = s_code.read() + s_code.close() + break + if code != '': + return code + else: +~~ return render_template('404.html') + +@app.route("/styles/") +def style_redirect(CSSFile): + code = '' + for obj in trape.CSSFiles: + if str(obj['src']) == str(CSSFile): + code = obj['path'] + break + return redirect(code) + +@app.route("/static/files/") +def file_redirect(File): + uploads = os.path.join(os.getcwd(), './') + return send_from_directory(directory=uploads, filename=File) + + + +## ... source file continues with no further render_template examples... + +``` + diff --git a/static/img/200630-python-flask-sentry/waiting-for-events.jpg b/static/img/200630-python-flask-sentry/waiting-for-events.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95de816bcaca01eba675e15e327b5d37077153f8 GIT binary patch literal 187657 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 literal 0 HcmV?d00001 diff --git a/static/img/headers/flask-sentry.jpg b/static/img/headers/flask-sentry.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd661161d97956de4f67909d10dce7e7887ad1c8 GIT binary patch literal 25842 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�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 Ia&7cK029+EHUIzs literal 0 HcmV?d00001 diff --git a/static/img/headers/python-flask-sentry.jpg b/static/img/headers/python-flask-sentry.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ca81cd2d10f24a5c61b47d696877ad5a25f85d5 GIT binary patch literal 27212 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 literal 0 HcmV?d00001 diff --git a/theme/templates/blog/report-errors-flask-web-apps-sentry.html b/theme/templates/blog/report-errors-flask-web-apps-sentry.html new file mode 100644 index 000000000..4b3de4a37 --- /dev/null +++ b/theme/templates/blog/report-errors-flask-web-apps-sentry.html @@ -0,0 +1,5 @@ +Learning Programming +Web development +Sentry +Sentry homepage {% include "blog/external-link.html" %} +Sentry Python Quickstart docs {% include "blog/external-link.html" %} From 97cd9a5435c4856a91a39f78ce03b25076a7e82a Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 30 Jun 2020 21:12:48 -0400 Subject: [PATCH 149/302] working on flask examples --- .../examples/flask/flask-app-flask.markdown | 88 +++++++++--- .../flask-example-projects-code.markdown | 9 ++ .../flask/flask-globals-request.markdown | 128 +++++++++++++++--- .../flask/flask-helpers-flash.markdown | 96 +++++++++++-- .../flask-templating-render-template.markdown | 125 ++++++++++++++--- .../error-details.jpg | Bin 0 -> 129933 bytes .../internal-server-error.png | Bin 0 -> 68237 bytes .../zero-division-error.png | Bin 0 -> 110019 bytes 8 files changed, 385 insertions(+), 61 deletions(-) create mode 100644 static/img/200630-python-flask-sentry/error-details.jpg create mode 100644 static/img/200630-python-flask-sentry/internal-server-error.png create mode 100644 static/img/200630-python-flask-sentry/zero-division-error.png diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 2f61817f3..369d9db4a 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -10,7 +10,61 @@ meta: Python example code for the Flask class from the flask.app module of the F Flask is a class within the flask.app module of the Flask project. -## Example 1 from Flask AppBuilder +## Example 1 from Braintree Flask app +[Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) +demonstrates how to incorporate this payment provider's +[API](/application-programming-interfaces.html) into your +[Flask](/flask.html) [web application](/web-development.html). +The code is open sourced under the +[MIT license](https://github.com/braintree/braintree_flask_example/blob/master/LICENSE). + +[**Braintree Flask app / app.py**](https://github.com/braintree/braintree_flask_example/blob/master/././app.py) + +```python +# app.py +~~from flask import Flask, redirect, url_for, render_template, request, flash + +import os +from os.path import join, dirname +from dotenv import load_dotenv +import braintree +from gateway import generate_client_token, transact, find_transaction + +load_dotenv() + +~~app = Flask(__name__) +app.secret_key = os.environ.get('APP_SECRET_KEY') + +PORT = int(os.environ.get('PORT', 4567)) + +TRANSACTION_SUCCESS_STATUSES = [ + braintree.Transaction.Status.Authorized, + braintree.Transaction.Status.Authorizing, + braintree.Transaction.Status.Settled, + braintree.Transaction.Status.SettlementConfirmed, + braintree.Transaction.Status.SettlementPending, + braintree.Transaction.Status.Settling, + braintree.Transaction.Status.SubmittedForSettlement +] + +@app.route('/', methods=['GET']) +def index(): + return redirect(url_for('new_checkout')) + +@app.route('/checkouts/new', methods=['GET']) +def new_checkout(): + client_token = generate_client_token() + return render_template('checkouts/new.html', client_token=client_token) + +@app.route('/checkouts/', methods=['GET']) + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -73,7 +127,7 @@ class OAuthRegistrationRoleTestCase(unittest.TestCase): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -172,7 +226,7 @@ def configure_app(app, config): ``` -## Example 3 from flask-base +## Example 4 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -251,7 +305,7 @@ def create_app(config): ``` -## Example 4 from flask-bookshelf +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -303,7 +357,7 @@ def get_lang_code(endpoint, values): ``` -## Example 5 from flaskex +## Example 6 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -356,7 +410,7 @@ def logout(): ``` -## Example 6 from Flask-HTTPAuth +## Example 7 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -412,7 +466,7 @@ class HTTPAuthTestCase(unittest.TestCase): ``` -## Example 7 from flask-phone-input +## Example 8 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -464,7 +518,7 @@ def index(): ``` -## Example 8 from flaskSaaS +## Example 9 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -513,7 +567,7 @@ from app.models import User ``` -## Example 9 from Flask-SocketIO +## Example 10 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -624,7 +678,7 @@ if __name__ == '__main__': ``` -## Example 10 from Flask-User +## Example 11 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -707,7 +761,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 11 from Flask-VueJs-Template +## Example 12 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -748,7 +802,7 @@ def index_client(): ``` -## Example 12 from Flasky +## Example 13 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -812,7 +866,7 @@ def create_app(config_name): ``` -## Example 13 from Datadog Flask Example App +## Example 14 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -873,7 +927,7 @@ def before_request(): ``` -## Example 14 from keras-flask-deploy-webapp +## Example 15 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -937,7 +991,7 @@ def model_predict(img, model): ``` -## Example 15 from sandman2 +## Example 16 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1018,7 +1072,7 @@ def get_app( ``` -## Example 16 from tedivms-flask +## Example 17 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1147,7 +1201,7 @@ def create_app(extra_config_settings={}): ``` -## Example 17 from trape +## Example 18 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index 11a327582..d85252fbb 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -13,6 +13,15 @@ in various ways. The code within the projects can show you how to build your own applications. +### Braintree Flask example +[Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) +demonstrates how to incorporate this payment provider's +[API](/application-programming-interfaces.html) into your +[Flask](/flask.html) [web application](/web-development.html). +The code is open sourced under the +[MIT license](https://github.com/braintree/braintree_flask_example/blob/master/LICENSE). + + ### Datadog Flask example The [Datadog Flask app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index be10c4cc6..ff6c57015 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -10,7 +10,97 @@ meta: Python example code for the request callable from the flask.globals module request is a callable within the flask.globals module of the Flask project. -## Example 1 from Flask AppBuilder +## Example 1 from Braintree Flask app +[Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) +demonstrates how to incorporate this payment provider's +[API](/application-programming-interfaces.html) into your +[Flask](/flask.html) [web application](/web-development.html). +The code is open sourced under the +[MIT license](https://github.com/braintree/braintree_flask_example/blob/master/LICENSE). + +[**Braintree Flask app / app.py**](https://github.com/braintree/braintree_flask_example/blob/master/././app.py) + +```python +# app.py +~~from flask import Flask, redirect, url_for, render_template, request, flash + +import os +from os.path import join, dirname +from dotenv import load_dotenv +import braintree +from gateway import generate_client_token, transact, find_transaction + +load_dotenv() + +app = Flask(__name__) +app.secret_key = os.environ.get('APP_SECRET_KEY') + +PORT = int(os.environ.get('PORT', 4567)) + +TRANSACTION_SUCCESS_STATUSES = [ + braintree.Transaction.Status.Authorized, + braintree.Transaction.Status.Authorizing, + braintree.Transaction.Status.Settled, + braintree.Transaction.Status.SettlementConfirmed, + braintree.Transaction.Status.SettlementPending, + braintree.Transaction.Status.Settling, + braintree.Transaction.Status.SubmittedForSettlement +] + + + +## ... source file abbreviated to get to request examples ... + + + client_token = generate_client_token() + return render_template('checkouts/new.html', client_token=client_token) + +@app.route('/checkouts/', methods=['GET']) +def show_checkout(transaction_id): + transaction = find_transaction(transaction_id) + result = {} + if transaction.status in TRANSACTION_SUCCESS_STATUSES: + result = { + 'header': 'Sweet Success!', + 'icon': 'success', + 'message': 'Your test transaction has been successfully processed. See the Braintree API response and try again.' + } + else: + result = { + 'header': 'Transaction Failed', + 'icon': 'fail', + 'message': 'Your test transaction has a status of ' + transaction.status + '. See the Braintree API response and try again.' + } + + return render_template('checkouts/show.html', transaction=transaction, result=result) + +@app.route('/checkouts', methods=['POST']) +def create_checkout(): + result = transact({ +~~ 'amount': request.form['amount'], +~~ 'payment_method_nonce': request.form['payment_method_nonce'], + 'options': { + "submit_for_settlement": True + } + }) + + if result.is_success or result.transaction: + return redirect(url_for('show_checkout',transaction_id=result.transaction.id)) + else: + for x in result.errors.deep_errors: flash('Error: %s: %s' % (x.code, x.message)) + return redirect(url_for('new_checkout')) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=PORT, debug=True) + + + +## ... source file continues with no further request examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -108,7 +198,7 @@ def get_filter_args(filters): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -711,7 +801,7 @@ class DeleteReport(MethodView): ``` -## Example 3 from flask-bookshelf +## Example 4 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -770,7 +860,7 @@ def create_author(): ``` -## Example 4 from flask-debugtoolbar +## Example 5 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -917,7 +1007,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 5 from flaskex +## Example 6 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -1012,7 +1102,7 @@ if __name__ == "__main__": ``` -## Example 6 from Flask-HTTPAuth +## Example 7 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -1333,7 +1423,7 @@ class MultiAuth(object): ``` -## Example 7 from flask-login +## Example 8 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -1570,7 +1660,7 @@ def _secret_key(key=None): ``` -## Example 8 from flask-restx +## Example 9 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1678,7 +1768,7 @@ class marshal_with_field(object): ``` -## Example 9 from Flask-WTF +## Example 10 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1836,7 +1926,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 10 from flaskSaaS +## Example 11 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -1887,7 +1977,7 @@ admin.add_view(FileAdmin(path, '/static/', name='Static')) ``` -## Example 11 from Flask-Security-Too +## Example 12 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -2107,7 +2197,7 @@ class ChangePasswordForm(Form, PasswordFormMixin): ``` -## Example 12 from Flask-SocketIO +## Example 13 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -2331,7 +2421,7 @@ class TestSocketIO(unittest.TestCase): ``` -## Example 13 from Flask-User +## Example 14 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -2395,7 +2485,7 @@ def init_translations(babel): ``` -## Example 14 from Flask-VueJs-Template +## Example 15 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -2430,7 +2520,7 @@ def require_auth(func): ``` -## Example 15 from keras-flask-deploy-webapp +## Example 16 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -2523,7 +2613,7 @@ if __name__ == '__main__': ``` -## Example 16 from newspie +## Example 17 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -2704,7 +2794,7 @@ if __name__ == '__main__': ``` -## Example 17 from sandman2 +## Example 18 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2905,7 +2995,7 @@ class Service(MethodView): ``` -## Example 18 from tedivms-flask +## Example 19 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -2963,7 +3053,7 @@ def roles_accepted_api(*role_names): ``` -## Example 19 from trape +## Example 20 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index f96f7cb49..612416755 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -10,7 +10,87 @@ meta: Python example code for the flash callable from the flask.helpers module o flash is a callable within the flask.helpers module of the Flask project. -## Example 1 from Flask AppBuilder +## Example 1 from Braintree Flask app +[Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) +demonstrates how to incorporate this payment provider's +[API](/application-programming-interfaces.html) into your +[Flask](/flask.html) [web application](/web-development.html). +The code is open sourced under the +[MIT license](https://github.com/braintree/braintree_flask_example/blob/master/LICENSE). + +[**Braintree Flask app / app.py**](https://github.com/braintree/braintree_flask_example/blob/master/././app.py) + +```python +# app.py +~~from flask import Flask, redirect, url_for, render_template, request, flash + +import os +from os.path import join, dirname +from dotenv import load_dotenv +import braintree +from gateway import generate_client_token, transact, find_transaction + +load_dotenv() + +app = Flask(__name__) +app.secret_key = os.environ.get('APP_SECRET_KEY') + +PORT = int(os.environ.get('PORT', 4567)) + +TRANSACTION_SUCCESS_STATUSES = [ + braintree.Transaction.Status.Authorized, + braintree.Transaction.Status.Authorizing, + braintree.Transaction.Status.Settled, + braintree.Transaction.Status.SettlementConfirmed, + braintree.Transaction.Status.SettlementPending, + braintree.Transaction.Status.Settling, + braintree.Transaction.Status.SubmittedForSettlement +] + + + +## ... source file abbreviated to get to flash examples ... + + + 'icon': 'success', + 'message': 'Your test transaction has been successfully processed. See the Braintree API response and try again.' + } + else: + result = { + 'header': 'Transaction Failed', + 'icon': 'fail', + 'message': 'Your test transaction has a status of ' + transaction.status + '. See the Braintree API response and try again.' + } + + return render_template('checkouts/show.html', transaction=transaction, result=result) + +@app.route('/checkouts', methods=['POST']) +def create_checkout(): + result = transact({ + 'amount': request.form['amount'], + 'payment_method_nonce': request.form['payment_method_nonce'], + 'options': { + "submit_for_settlement": True + } + }) + + if result.is_success or result.transaction: + return redirect(url_for('show_checkout',transaction_id=result.transaction.id)) + else: +~~ for x in result.errors.deep_errors: flash('Error: %s: %s' % (x.code, x.message)) + return redirect(url_for('new_checkout')) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=PORT, debug=True) + + + +## ... source file continues with no further flash examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -197,7 +277,7 @@ class RegisterUserDBView(BaseRegisterUser): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -298,7 +378,7 @@ def flaskbb_registration_post_processor(user): ``` -## Example 3 from flask-bookshelf +## Example 4 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -357,7 +437,7 @@ def create_author(): ``` -## Example 4 from flask_jsondash +## Example 5 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -588,7 +668,7 @@ def clone(c_id): ``` -## Example 5 from flask-login +## Example 6 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -749,7 +829,7 @@ class LoginManager(object): ``` -## Example 6 from Flask-Security-Too +## Example 7 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -869,7 +949,7 @@ def transform_url(url, qparams=None, **kwargs): ``` -## Example 7 from Flask-User +## Example 8 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1342,7 +1422,7 @@ class UserManager__Views(object): ``` -## Example 8 from tedivms-flask +## Example 9 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 6a4478c44..ad38cf6bb 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -10,7 +10,98 @@ meta: Python example code for the render_template callable from the flask.templa render_template is a callable within the flask.templating module of the Flask project. -## Example 1 from FlaskBB +## Example 1 from Braintree Flask app +[Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) +demonstrates how to incorporate this payment provider's +[API](/application-programming-interfaces.html) into your +[Flask](/flask.html) [web application](/web-development.html). +The code is open sourced under the +[MIT license](https://github.com/braintree/braintree_flask_example/blob/master/LICENSE). + +[**Braintree Flask app / app.py**](https://github.com/braintree/braintree_flask_example/blob/master/././app.py) + +```python +# app.py +~~from flask import Flask, redirect, url_for, render_template, request, flash + +import os +from os.path import join, dirname +from dotenv import load_dotenv +import braintree +from gateway import generate_client_token, transact, find_transaction + +load_dotenv() + +app = Flask(__name__) +app.secret_key = os.environ.get('APP_SECRET_KEY') + +PORT = int(os.environ.get('PORT', 4567)) + +TRANSACTION_SUCCESS_STATUSES = [ + braintree.Transaction.Status.Authorized, + braintree.Transaction.Status.Authorizing, + braintree.Transaction.Status.Settled, + braintree.Transaction.Status.SettlementConfirmed, + braintree.Transaction.Status.SettlementPending, + braintree.Transaction.Status.Settling, + braintree.Transaction.Status.SubmittedForSettlement +] + +@app.route('/', methods=['GET']) +def index(): + return redirect(url_for('new_checkout')) + +@app.route('/checkouts/new', methods=['GET']) +def new_checkout(): + client_token = generate_client_token() +~~ return render_template('checkouts/new.html', client_token=client_token) + +@app.route('/checkouts/', methods=['GET']) +def show_checkout(transaction_id): + transaction = find_transaction(transaction_id) + result = {} + if transaction.status in TRANSACTION_SUCCESS_STATUSES: + result = { + 'header': 'Sweet Success!', + 'icon': 'success', + 'message': 'Your test transaction has been successfully processed. See the Braintree API response and try again.' + } + else: + result = { + 'header': 'Transaction Failed', + 'icon': 'fail', + 'message': 'Your test transaction has a status of ' + transaction.status + '. See the Braintree API response and try again.' + } + +~~ return render_template('checkouts/show.html', transaction=transaction, result=result) + +@app.route('/checkouts', methods=['POST']) +def create_checkout(): + result = transact({ + 'amount': request.form['amount'], + 'payment_method_nonce': request.form['payment_method_nonce'], + 'options': { + "submit_for_settlement": True + } + }) + + if result.is_success or result.transaction: + return redirect(url_for('show_checkout',transaction_id=result.transaction.id)) + else: + for x in result.errors.deep_errors: flash('Error: %s: %s' % (x.code, x.message)) + return redirect(url_for('new_checkout')) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=PORT, debug=True) + + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 2 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -89,7 +180,7 @@ def send_email(subject, recipients, text_body, html_body, sender=None): ``` -## Example 2 from flask-base +## Example 3 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -136,7 +227,7 @@ def send_email(recipient, subject, template, **kwargs): ``` -## Example 3 from flask-bookshelf +## Example 4 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -240,7 +331,7 @@ app.register_blueprint(admin, url_prefix="//admin") ``` -## Example 4 from flaskex +## Example 5 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -335,7 +426,7 @@ if __name__ == "__main__": ``` -## Example 5 from flask_jsondash +## Example 6 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -478,7 +569,7 @@ def update(c_id): ``` -## Example 6 from flask-phone-input +## Example 7 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -536,7 +627,7 @@ def show_phone(): ``` -## Example 7 from flask-restx +## Example 8 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -591,7 +682,7 @@ def ui_for(api): ``` -## Example 8 from flaskSaaS +## Example 9 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -794,7 +885,7 @@ def paySuccess(): ``` -## Example 9 from Flask-Security-Too +## Example 10 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -904,7 +995,7 @@ from .forms import ( ``` -## Example 10 from Flask-SocketIO +## Example 11 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -980,7 +1071,7 @@ def get_session(): ``` -## Example 11 from Flask-User +## Example 12 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1072,7 +1163,7 @@ class EmailManager(object): ``` -## Example 12 from Flasky +## Example 13 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1112,7 +1203,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 13 from Datadog Flask Example App +## Example 14 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1214,7 +1305,7 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 14 from keras-flask-deploy-webapp +## Example 15 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1305,7 +1396,7 @@ if __name__ == '__main__': ``` -## Example 15 from newspie +## Example 16 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1460,7 +1551,7 @@ if __name__ == '__main__': ``` -## Example 16 from tedivms-flask +## Example 17 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1563,7 +1654,7 @@ def init_error_handlers(app): ``` -## Example 17 from trape +## Example 18 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/static/img/200630-python-flask-sentry/error-details.jpg b/static/img/200630-python-flask-sentry/error-details.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39e82dcc91662f4a5cc36bb46b6597b92aea0245 GIT binary patch literal 129933 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 literal 0 HcmV?d00001 diff --git a/static/img/200630-python-flask-sentry/internal-server-error.png b/static/img/200630-python-flask-sentry/internal-server-error.png new file mode 100644 index 0000000000000000000000000000000000000000..5e4edc03f571a93ae89e73bb1e01edaabab59253 GIT binary patch literal 68237 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 z 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 WZdXsZzPLpGXsYQwD|>4F@&5zuuNGba literal 0 HcmV?d00001 diff --git a/static/img/200630-python-flask-sentry/zero-division-error.png b/static/img/200630-python-flask-sentry/zero-division-error.png new file mode 100644 index 0000000000000000000000000000000000000000..4da400b47a36ce2189ec3d2d3742f3cdb243b83c GIT binary patch literal 110019 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 ocgn>odYPkMP42!fDB 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 JtaD0e0szNAv`YX0 literal 0 HcmV?d00001 From 99ed9b22d245eb9e0e0dadeabb2c35170010c69f Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 2 Jul 2020 09:28:35 -0400 Subject: [PATCH 150/302] add new blog post --- .../02-vim.markdown | 5 +- .../19-git.markdown | 6 + content/pages/03-data/16-pandas.markdown | 3 + .../04-web-development/21-bootstrap.markdown | 3 + ...port-errors-flask-web-apps-sentry.markdown | 264 ++++++++++++++++++ .../division-success.png | Bin 0 -> 35911 bytes .../waiting-for-events.jpg | Bin 187657 -> 126303 bytes static/img/headers/django-markdown.jpg | Bin 0 -> 24168 bytes static/img/headers/django.jpg | Bin 0 -> 24466 bytes ...kdown-django-3-0-django-markdown-view.html | 4 + theme/templates/sponsor.html | 1 - 11 files changed, 284 insertions(+), 2 deletions(-) create mode 100644 content/posts/200630-report-errors-flask-web-apps-sentry.markdown create mode 100644 static/img/200630-python-flask-sentry/division-success.png create mode 100644 static/img/headers/django-markdown.jpg create mode 100644 static/img/headers/django.jpg create mode 100644 theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html diff --git a/content/pages/02-development-environments/02-vim.markdown b/content/pages/02-development-environments/02-vim.markdown index 1d2ee09b5..da89bbe3d 100644 --- a/content/pages/02-development-environments/02-vim.markdown +++ b/content/pages/02-development-environments/02-vim.markdown @@ -20,7 +20,10 @@ Vim's philosophy is that developers are more productive when they avoid taking their hands off the keyboard. Code should flow naturally from the developer's thoughts through the keyboard and onto the screen. Using a mouse or other peripheral is a detriment to the rate at which a developer's -thoughts become code. +thoughts become code. This "efficiency by keyboard" +[keeps Vim as one of the most popular text editors](https://pragmaticpineapple.com/how-did-vim-become-so-popular/) +despite having been around for decades. Few programming tools have that kind +of staying power. Vim has a logical, structured command language. When a beginner is learning the editor she may feel like it is impossible to understand all the key diff --git a/content/pages/02-development-environments/19-git.markdown b/content/pages/02-development-environments/19-git.markdown index 3233bff32..5e31639e7 100644 --- a/content/pages/02-development-environments/19-git.markdown +++ b/content/pages/02-development-environments/19-git.markdown @@ -141,6 +141,12 @@ workflow. These resources will come in handy for specific Git subjects. important when working with others on a long-lasting project where you dive through the commit history via `git log` and related commands. +* [How to squash Git commits](https://gitbetter.substack.com/p/how-to-squash-git-commits) + explains how to use the `git rebase` command in interactive mode to + consolidated the number of commits in your history. This technique is + useful when a group of commits are related and it's easier to understand + them as a single commit rather than a collection of smaller commits. + * [Oh shit, Git!](http://ohshitgit.com/) is a profanity-filled description of tips to get you out of binds you may find yourself in when you get too tricky with Git commands. diff --git a/content/pages/03-data/16-pandas.markdown b/content/pages/03-data/16-pandas.markdown index 8a523ba64..1ac1e2b5b 100644 --- a/content/pages/03-data/16-pandas.markdown +++ b/content/pages/03-data/16-pandas.markdown @@ -126,3 +126,6 @@ is a data structures and analysis library. * [How to download fundamentals data with Python](http://theautomatic.net/2020/05/05/how-to-download-fundamentals-data-with-python/) shows how to obtain and use financial data, such as balance sheets, stock prices, and various ratios to perform your own analysis on. + +* [How to convert JSON to Excel with Python and pandas](https://www.marsja.se/how-to-convert-json-to-excel-python-pandas/) + provides instructions for creating a spreadsheet out of JSON file. diff --git a/content/pages/04-web-development/21-bootstrap.markdown b/content/pages/04-web-development/21-bootstrap.markdown index 8ca1c917f..97c4db1fa 100644 --- a/content/pages/04-web-development/21-bootstrap.markdown +++ b/content/pages/04-web-development/21-bootstrap.markdown @@ -47,6 +47,9 @@ specific situation. is an awesome tutorial that goes through many of the main Bootstrap elements such as icons, navigation bars and "jumbotron"-style webpages. +* [Bootstrap 5 tutorial](https://www.youtube.com/watch?v=c9B4TPnak1A) covers + the alpha version of the fifth major revision for Bootstrap. + * [Bootstrap 4: What's New?](https://medium.com/wdstack/bootstrap-4-whats-new-visual-guide-c84dd81d8387) shows a slew of comparisons for how user interface elements have changed design over the past several Bootstrap major version iterations. diff --git a/content/posts/200630-report-errors-flask-web-apps-sentry.markdown b/content/posts/200630-report-errors-flask-web-apps-sentry.markdown new file mode 100644 index 000000000..5f78f398a --- /dev/null +++ b/content/posts/200630-report-errors-flask-web-apps-sentry.markdown @@ -0,0 +1,264 @@ +title: How to Report Errors in Flask Web Apps with Sentry +slug: report-errors-flask-web-apps-sentry +meta: Learn how to use Sentry and the Flask integration to easily report errors in your Python-based web applications. +category: post +date: 2020-06-30 +modified: 2020-07-02 +newsletters: False +headerimage: /img/headers/flask-sentry.jpg +headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. + + +[Flask](/flask.html) web applications are highly customizable by developers +thanks to the [framework](/web-frameworks.html)'s extension-based +architecture, but that flexibility can sometimes lead to more errors +when you run the application due to rough edges between the libraries. + +Reporting errors is crucial to running a well-functioning Flask web +application, so this tutorial will guide you through adding a free, basic +[Sentry](https://sentry.io) configuration to a fresh Flask project. + + +## Tutorial Requirements +Ensure you have Python 3 installed, because Python 2 reached its +end-of-life at the beginning of 2020 and is no longer supported. +Preferrably, you should have +[Python 3.7 or greater installed](https://www.python.org/downloads/) +in your [development environment](/development-environments.html). +This tutorial will also use: + +* [Flask](/flask.html) web framework, + [version 1.1.2](https://github.com/pallets/flask/releases/tag/1.1.2) +* a hosted Sentry instance on [sentry.io](https://sentry.io), which we'll + need an account to access +* the [Sentry Python helper library](https://pypi.org/project/sentry-sdk/) to + send exception data to our Sentry instance, with the + [Flask integration](https://docs.sentry.io/platforms/python/flask/) + +All code in this blog post is available open source under the MIT license +on GitHub under the +[report-errors-flask-web-apps-sentry directory of the blog-code-examples](https://github.com/fullstackpython/blog-code-examples/tree/master/report-errors-flask-web-apps-sentry) +repository. Use the source code as you desire for your own projects. + + +## Development environment set up +Change into the directory where you keep your Python +[virtual environments](/virtual-environments-virtualenvs-venvs.html). +Create a new virtualenv for this project using the following +command. + +Install the Flask and Sentry-SDK code libraries into a new Python +virtual environment using the following commands: + +```bash +python -m venv sentryflask +source sentryflask/bin/activate + +pip install flask>=1.1.2 sentry-sdk[flask]==0.15.1 +``` + +Note that we installed the Flask integration as part of the Sentry +SDK, which is why the dependency is `sentry-sdk[flask]` rather than +just `sentry-sdk`. + +Now that we have all of our dependencies installed we can code up a +little application to show how the error reporting works. + + +## Creating the application +We have everything we need to start building our application. Create +a new directory for your project. I've called mine +[report-errors-flask-web-apps-sentry](https://github.com/fullstackpython/blog-code-examples/tree/master/report-errors-flask-web-apps-sentry) +in the examples repository but you can use a shorter name if you +prefer. Open a new file named `app.py` and write the following code in it. + +```python +# app.py +from flask import Flask, escape, request + + +app = Flask(__name__) + + +@app.route('/divide//by//') +def hello(numerator, denominator): + answer = numerator / denominator + return f'{numerator} can be divided by {denominator} {answer} times.' + +``` + +The above code is a short Flask application that allows input via the URL for +two integer values: a numerator and a denominator. + +Save the file and run it using the `flask run` command: + +```bash +env FLASK_APP=app.py flask run +``` + +If you see the following output on the command line that means the development +server is working properly: + +```bash + * Serving Flask app "app.py" + * Environment: production + WARNING: This is a development server. Do not use it in a production deployment. + Use a production WSGI server instead. + * Debug mode: off + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` + +Test it by going to http://localhost:5000/divide/50/by/10/ and you will +get the following output in your web browser: + +Successful division of 50 by 10. + +With our base application working, we can now add error reporting for +the situations that do not work as expected. + + +## Adding Sentry to our app +It's time to add Sentry with the Flask integration into the mix, so that we +can easily see when the route errors out due to bad input. + +Sentry can either be [self-hosted](https://github.com/getsentry/onpremise) or +used as a cloud service through [Sentry.io](https://sentry.io). In this +tutorial we will use the cloud hosted version because it's faster than +setting up your own server as well as free for smaller projects. + +Go to [Sentry.io's homepage](https://sentry.io). + +Sentry.io homepage where you can sign up for a free account. + +Sign into your account or sign up for a new free account. You will be at +the main account dashboard after logging in or completing the Sentry sign +up process. + +There are no errors logged on our account dashboard yet, which is as +expected because we have not yet connected our account to our Python +application. + +Blank Sentry account dashboard. + +You'll want to create a new Sentry Project just for this application so +click "Projects" in the left sidebar to go to the Projects page. + +Button to create a new Sentry project. + +On the Projects page, click the "Create Project" button in the top right +corner of the page. + +Create a new Sentry project. + +You can either choose "Flask" or select "Python". I usually just choose +"Python" if I do not yet know what framework I'll be using to build my +application. Next, give your new Project a name and then press the "Create +Project" button. Our new project is ready to integrate with our Python code. + +We need the unique identifier for our account and project to authorize our +Python code to send errors to this Sentry instance. The easiest way to get +what we need is to go to the +[Python+Flask documentation page](https://docs.sentry.io/platforms/python/flask/) +and read how to configure the SDK. + +The Sentry docs show you exactly what you need to export to connect to your account. + +Copy the string parameter for the `init` method and set it +[as an environment variable](https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html) +rather than having it exposed in your project's code. + +```bash +export SENTRY_DSN='https://yourkeygoeshere.ingest.sentry.io/project-number' +``` + +**Make sure to replace "yourkeygoeshere" with your own unique identifier +and "project-number" with the ID that matches the project you just +created.** + +Check that the `SENTRY_DSN` is set properly in your shell using the `echo` +command: + +```bash +echo $SENTRY_DSN +``` + + +Update `app.py` with the following highlighted lines of code. + +```python +# app.py +~~import os +~~import sentry_sdk +from flask import Flask, escape, request +~~from sentry_sdk.integrations.flask import FlaskIntegration + + +~~sentry_sdk.init( +~~ dsn=os.getenv('SENTRY_DSN'), integrations=[FlaskIntegration()] +~~) + + +app = Flask(__name__) + + +@app.route('/divide//by//') +def hello(numerator, denominator): + answer = numerator / denominator + return f'{numerator} can be divided by {denominator} {answer} times.' +``` + +The above new lines of code initialize the Sentry client and allow it to +properly send any errors that occur over to the right Sentry service. + + +## Testing the Sentry Integration +The Sentry dashboard shows that the service is still waiting for events. + +Sentry dashboard, without any error data shown. + +Let's make an error happen to see if we've properly connected the Flask integration +with our application. + +Try to divide by zero, by going to http://localhost:5000/divide/50/by/0/ in +your web browser. You should get an "Internal Server Error". + +Flask HTTP status code 500 for internal server error. + +Back over in the Sentry dashboard, the error appears in the list. + +Sentry dashboard showing the exact ZeroDivisionError. + +We can drill into the error by clicking on it and get a ton more information, +not just about our application but also about the client that visited the +site. This is handy if you have an issue in a specific browser or other +type of client when building an [API](/application-programming-interfaces.html). + +ZeroDivisionError error details in the Sentry user interface. + +With that in place, you can now build out the rest of your Flask application +knowing that all of the exceptions will be tracked in Sentry. + + +## What's next? +We just finished building a Flask app to show how quickly the hosted +version of Sentry can be added to applications so you do not lose +track of your error messages. + +Next, you can try one of these tutorials to add other useful features to your +new application: + +* [Responding to SMS Text Messages with Python & Flask](/blog/respond-sms-text-messages-python-flask.html) +* [Develop and Run Flask Apps within Docker Containers](/blog/develop-flask-web-apps-docker-containers-macos.html) +* [Add Okta Authentication to an Existing Flask App](/blog/okta-user-auth-existing-flask-web-app.html) + +You can also determine what to code next in your Python project by reading +the [Full Stack Python table of contents page](/table-of-contents.html). + +Questions? Contact me via Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). I am also on GitHub with +the username [mattmakai](https://github.com/mattmakai). + +If you see an issue or error in this tutorial, please +[fork the source repository on GitHub](https://github.com/mattmakai/fullstackpython/blob/master/content/posts/200630-report-errors-flask-web-apps-sentry.markdown) +and submit a pull request with the fix. diff --git a/static/img/200630-python-flask-sentry/division-success.png b/static/img/200630-python-flask-sentry/division-success.png new file mode 100644 index 0000000000000000000000000000000000000000..8967c56ee4c208d5cf65bc0b43aa22b690c78970 GIT binary patch literal 35911 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 diff --git a/static/img/headers/django-markdown.jpg b/static/img/headers/django-markdown.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a690ccf934b8acdc13c990a736607e387fa6afb GIT binary patch literal 24168 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 literal 0 HcmV?d00001 diff --git a/static/img/headers/django.jpg b/static/img/headers/django.jpg new file mode 100644 index 0000000000000000000000000000000000000000..440a1faddfa5d32c6171facc96e41af597a0c41e GIT binary patch literal 24466 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 literal 0 HcmV?d00001 diff --git a/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html b/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html new file mode 100644 index 000000000..80bb0c4a2 --- /dev/null +++ b/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html @@ -0,0 +1,4 @@ +Learning Programming +Web development +Django +Markdown diff --git a/theme/templates/sponsor.html b/theme/templates/sponsor.html index 6997c5df5..7c3ac9dd2 100644 --- a/theme/templates/sponsor.html +++ b/theme/templates/sponsor.html @@ -1,6 +1,5 @@ {% if page.sortorder[0:2] == "01" or page.sortorder[0:2] == "02" or page.sortorder[0:2] == "03" or page.sortorder[0:2] == "04" or page.sortorder[0:2] == "05" or page.sortorder[0:2] == "06" or page.sortorder[0:2] == "50" %} {% include "sponsor/sentry.html" %} -{% include "sponsor/carbon.html" %} {% endif %} {% if false %} {% if page.sortorder[0:2] == "01" or page.sortorder[0:2] == "02" %} From f26e53fb6ade99e568d1a92344d95bc23b96246d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 2 Jul 2020 09:50:56 -0400 Subject: [PATCH 151/302] update changelog --- content/pages/meta/00-change-log.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 9fc14e641..e07575ecf 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2020 +### July +* New blog post on + [How to report errors in Flask web apps with Sentry](/blog/report-errors-flask-web-apps-sentry.html) + ### June * Added new example code for [Django](/django.html) modules: * [django.contrib.admin.helpers](/django-contrib-admin-helpers-examples.html) From cf81748d1248582c68370346991cd593b7ab587a Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 2 Jul 2020 11:54:10 -0400 Subject: [PATCH 152/302] add new flask example code --- .../examples/flask/flask-app-flask.markdown | 73 ++++- .../flask-example-projects-code.markdown | 16 + .../flask/flask-globals-request.markdown | 111 ++++++- .../flask-templating-render-template.markdown | 292 +++++++++++++++++- 4 files changed, 486 insertions(+), 6 deletions(-) diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 369d9db4a..49112b6a1 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -1072,7 +1072,76 @@ def get_app( ``` -## Example 17 from tedivms-flask +## Example 17 from Science Flask +[Science Flask](https://github.com/danielhomola/science_flask) +is a [Flask](/flask.html)-powered web application for online +scientific research tools. The project was built as a template +for any scientist or groups of scientists to use when working +together without having to really understand how the application +is built. The application includes an academic registration +process (only valid academic email addresses can be used), an +admin panel, logging, and analysis forms. + +[@danielhomola](https://github.com/danielhomola) is the +primary creator of Science Flask and the project is open +source under the +[GNU General Public License](https://github.com/danielhomola/science_flask/blob/master/LICENSE). + +[**Science Flask / frontend / __init__.py**](https://github.com/danielhomola/science_flask/blob/master/./frontend/__init__.py) + +```python +# __init__.py +import os +~~from flask import Flask, url_for, redirect, request, abort +from flask_mail import Mail +from flask_sqlalchemy import SQLAlchemy +from flask_login import LoginManager +from flask_security import Security, SQLAlchemyUserDatastore, signals, \ + current_user +import flask_admin +from flask_admin.contrib import sqla +from flask_admin import helpers as admin_helpers +from flask_wtf.csrf import CSRFProtect +from celery import Celery + + +appdir = os.path.abspath(os.path.dirname(__file__)) +ROOTDIR = os.path.abspath(os.path.join(appdir, os.pardir)) +user_data_folder = os.path.join(ROOTDIR, 'userData') + +~~app = Flask(__name__, instance_path=user_data_folder) + +app.config.from_pyfile('config.py') + +db = SQLAlchemy(app) + +mail = Mail(app) + +csrf = CSRFProtect(app) + +def create_celery_app(): + celery = Celery(__name__, broker=app.config['CELERY_BROKER_URL']) + celery.conf.update(app.config) + TaskBase = celery.Task + + class ContextTask(TaskBase): + abstract = True + + def __call__(self, *args, **kwargs): + with app.app_context(): + return TaskBase.__call__(self, *args, **kwargs) + + celery.Task = ContextTask + celery.app = app + return celery + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 18 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1201,7 +1270,7 @@ def create_app(extra_config_settings={}): ``` -## Example 18 from trape +## Example 19 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index d85252fbb..63370fc44 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -112,6 +112,22 @@ aggregator created with [Flask](/flask.html) and the the [MIT license](https://github.com/skamieniarz/newspie/blob/master/LICENSE). +### Science Flask +[Science Flask](https://github.com/danielhomola/science_flask) +is a [Flask](/flask.html)-powered web application for online +scientific research tools. The project was built as a template +for any scientist or groups of scientists to use when working +together without having to really understand how the application +is built. The application includes an academic registration +process (only valid academic email addresses can be used), an +admin panel, logging, and analysis forms. + +[@danielhomola](https://github.com/danielhomola) is the +primary creator of Science Flask and the project is open +source under the +[GNU General Public License](https://github.com/danielhomola/science_flask/blob/master/LICENSE). + + ### tedivm's flask starter app [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index ff6c57015..2bac4d1e3 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -2995,7 +2995,114 @@ class Service(MethodView): ``` -## Example 19 from tedivms-flask +## Example 19 from Science Flask +[Science Flask](https://github.com/danielhomola/science_flask) +is a [Flask](/flask.html)-powered web application for online +scientific research tools. The project was built as a template +for any scientist or groups of scientists to use when working +together without having to really understand how the application +is built. The application includes an academic registration +process (only valid academic email addresses can be used), an +admin panel, logging, and analysis forms. + +[@danielhomola](https://github.com/danielhomola) is the +primary creator of Science Flask and the project is open +source under the +[GNU General Public License](https://github.com/danielhomola/science_flask/blob/master/LICENSE). + +[**Science Flask / frontend / __init__.py**](https://github.com/danielhomola/science_flask/blob/master/./frontend/__init__.py) + +```python +# __init__.py +import os +~~from flask import Flask, url_for, redirect, request, abort +from flask_mail import Mail +from flask_sqlalchemy import SQLAlchemy +from flask_login import LoginManager +from flask_security import Security, SQLAlchemyUserDatastore, signals, \ + current_user +import flask_admin +from flask_admin.contrib import sqla +from flask_admin import helpers as admin_helpers +from flask_wtf.csrf import CSRFProtect +from celery import Celery + + +appdir = os.path.abspath(os.path.dirname(__file__)) +ROOTDIR = os.path.abspath(os.path.join(appdir, os.pardir)) +user_data_folder = os.path.join(ROOTDIR, 'userData') + +app = Flask(__name__, instance_path=user_data_folder) + +app.config.from_pyfile('config.py') + +db = SQLAlchemy(app) + +mail = Mail(app) + + + +## ... source file abbreviated to get to request examples ... + + + +class MyModelView(sqla.ModelView): + + def __init__(self, model, session, name=None, category=None, endpoint=None, + url=None, **kwargs): + for k, v in kwargs.items(): + setattr(self, k, v) + + super(MyModelView, self).__init__(model, session, name=name, + category=category, endpoint=endpoint, + url=url) + + def is_accessible(self): + if not current_user.is_active or not current_user.is_authenticated: + return False + + if current_user.has_role('superuser'): + return True + return False + + def _handle_view(self, name, **kwargs): + if not self.is_accessible(): + if current_user.is_authenticated: + abort(403) + else: +~~ return redirect(url_for('security.login', next=request.url)) + +admin = flask_admin.Admin( + app, + 'Admin panel', + base_template='admin_base.html', + template_mode='bootstrap3', +) + +from .models import Studies, Analyses +admin.add_view(MyModelView(Role, db.session)) +cols = [c for c in User.__table__.columns] +admin.add_view(MyModelView(User, db.session, column_list=cols)) +cols = [c for c in Studies.__table__.columns] +admin.add_view(MyModelView(Studies, db.session, column_list=cols)) +cols = [c for c in Analyses.__table__.columns] +admin.add_view(MyModelView(Analyses, db.session, column_list=cols)) + +@security.context_processor +def security_context_processor(): + return dict( + admin_base_template=admin.base_template, + admin_view=admin.index_view, + h=admin_helpers, + get_url=url_for + + +## ... source file continues with no further request examples... + +``` + + +## Example 20 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -3053,7 +3160,7 @@ def roles_accepted_api(*role_names): ``` -## Example 20 from trape +## Example 21 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index ad38cf6bb..f1012a501 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1551,7 +1551,295 @@ if __name__ == '__main__': ``` -## Example 17 from tedivms-flask +## Example 17 from Science Flask +[Science Flask](https://github.com/danielhomola/science_flask) +is a [Flask](/flask.html)-powered web application for online +scientific research tools. The project was built as a template +for any scientist or groups of scientists to use when working +together without having to really understand how the application +is built. The application includes an academic registration +process (only valid academic email addresses can be used), an +admin panel, logging, and analysis forms. + +[@danielhomola](https://github.com/danielhomola) is the +primary creator of Science Flask and the project is open +source under the +[GNU General Public License](https://github.com/danielhomola/science_flask/blob/master/LICENSE). + +[**Science Flask / frontend / views.py**](https://github.com/danielhomola/science_flask/blob/master/./frontend/views.py) + +```python +# views.py +import datetime +import json +import os +import shutil +~~from flask import render_template, redirect, request, g, url_for, flash, abort,\ + send_from_directory, session +from flask_login import login_required +from flask_security import current_user +from werkzeug.utils import secure_filename + +from .analysis import run_analysis, terminate_analysis +from .view_functions import save_study, get_form, save_analysis, \ + get_studies_array, get_analyses_array, \ + get_user_folder, security_check +from backend.utils.check_uploaded_files import clear_up_study +from . import app, db, models +from .forms import UploadForm, AnalysisForm + + +@app.route('/') +def index(): +~~ return render_template('index.html') + +@app.route('/about') +def about(): +~~ return render_template('about.html') + +@app.route('/help') +def help(): +~~ return render_template('help.html') + +@app.route('/tc') +def tc(): +~~ return render_template('tc.html') + + +@app.route('/upload', methods=['GET', 'POST']) +@login_required +def upload(): + + if request.method == 'POST': + form = UploadForm(data=get_form(request.values, request.files)) + try: + check = request.form['check'] + if check == 'true': + check = True + else: + check = False + except: + return json.dumps(dict(status='invalid')) + + if check: + if form.validate_on_submit(): + return json.dumps(dict(status='OK')) + else: + return json.dumps(dict(status='errors', errors=form.errors)) + + else: + try: + return save_study(form, request.files) + except: + user_folder = get_user_folder() + study_folder = secure_filename(form.study_name.data) + user_data_folder = os.path.join(user_folder, study_folder) + clear_up_study(user_data_folder) + return json.dumps(dict(status='invalid')) + + else: + form = UploadForm() + too_many_studies = 0 + if len(current_user.studies.all()) >= app.config['ACTIVE_STUDY_PER_USER']: + too_many_studies = 1 + if current_user.num_studies >= app.config['STUDY_PER_USER']: + too_many_studies = 2 +~~ return render_template('upload.html', form=form, + too_many_studies=too_many_studies) + + +@app.route('/too_large_file') +@login_required +def too_large_file(): +~~ return render_template('utils/max_file_size.html') + + +@app.route('/something_wrong/') +@login_required +def something_wrong(page): +~~ return render_template('utils/something_wrong.html', page=page) + + +@app.route('/analysis/_', methods=['GET', 'POST']) +@login_required +def analysis(user_id, study_id): + if not security_check(user_id, study_id): + abort(403) + + if len(current_user.analyses.filter_by(status=1).all()) > 0: +~~ return render_template('utils/analysis_in_progress.html') + + if request.method == 'POST': + form = AnalysisForm(data=get_form(request.values, request.files)) + try: + check = request.form['check'] + if check == 'true': + check = True + else: + check = False + except: + return json.dumps(dict(status='invalid')) + + if check: + session['study_id'] = study_id + if form.validate_on_submit(): + return json.dumps(dict(status='OK')) + else: + return json.dumps(dict(status='errors', errors=form.errors)) + + else: + try: + save_analysis(form, study_id) + task = run_analysis.apply_async(args=[current_user.id], countdown=1) + session['task_id'] = task.id + return json.dumps(dict(status='OK')) + except: + return json.dumps(dict(status='invalid')) + + else: + form = AnalysisForm() + too_many_analyses = 0 + if len(current_user.analyses.all()) >= app.config['ACTIVE_ANALYSIS_PER_USER']: + too_many_analyses = 1 + if current_user.num_analyses >= app.config['ANALYSIS_PER_USER']: + too_many_analyses = 2 + + study = models.Studies.query.get(study_id) + study_name = study.study_name +~~ return render_template('analysis.html', form=form, user_id=user_id, + study_id=study_id, study_name=study_name, + too_many_analyses=too_many_analyses) + + +@app.route('/profile') +@login_required +def profile(): + studies_array = get_studies_array() + analyses_array = get_analyses_array() + user_id = current_user.id + if len(studies_array) > 0: + study_id = studies_array[0]['id'] + else: + study_id = 0 + + if current_user.profile_intro == 0: + profile_intro = True + current_user.profile_intro = 1 + db.session.add(current_user) + db.session.commit() + else: + profile_intro = False + + stats = { + 'active_studies': len(current_user.studies.all()), + 'all_studies': current_user.num_studies, + 'active_analyses': len(current_user.analyses.all()), + 'all_analyses': current_user.num_analyses + } +~~ return render_template('profile.html', studies=studies_array, stats=stats, + analyses=analyses_array, profile_intro=profile_intro, + user_id=user_id, study_id=study_id) + + +@app.route('/delete_study/_/', methods=['POST']) +@login_required +def delete_study(user_id, study_id): + if not security_check(user_id, study_id): + abort(403) + + study = models.Studies.query.get(study_id) + study_name = study.study_name + for analysis in study.analyses.all(): + db.session.delete(analysis) + db.session.delete(study) + db.session.commit() + + user_folder = get_user_folder() + study_folder = secure_filename(study_name) + folder_to_delete = os.path.join(user_folder, study_folder) + if os.path.exists(folder_to_delete): + shutil.rmtree(folder_to_delete) + return redirect(url_for('profile')) + + + +## ... source file abbreviated to get to render_template examples ... + + + + +@app.route('/vis/__') +@login_required +def vis(user_id, analysis_id, data_file): + if not security_check(user_id, analysis_id, True): + abort(403) + + if data_file not in ['dataset1_2', 'dataset1', 'dataset2']: + abort(403) + + analysis = models.Analyses.query.get(analysis_id) + analysis_name = analysis.analysis_name + study = models.Studies.query.get(analysis.study_id) + study_name = study.study_name + username = app.config['USER_PREFIX'] + str(current_user.id) + analysis_folder = os.path.join(username, secure_filename(study_name), + secure_filename(analysis_name)) + autocorr = bool(study.autocorr) + dataset_names = [study.dataset1_type] + if autocorr: + dataset_names += study.dataset1_type + else: + dataset_names += [study.dataset2_type] + +~~ return render_template('vis.html', analysis_folder=analysis_folder, + analysis_name=analysis_name, autocorr=autocorr, + user_id=user_id, analysis_id=analysis_id, + data_file=data_file, + dataset_names=dataset_names) + + +@app.errorhandler(403) +def forbidden_error(error): + app.logger.error('403 - Forbidden request: %s', request.path) +~~ return render_template('utils/403.html'), 403 + + +@app.errorhandler(404) +def not_found_error(error): + if "/get_file/" not in request.path: + app.logger.error('404 - Page not found: %s', request.path) +~~ return render_template('utils/404.html'), 404 + + +@app.errorhandler(500) +def internal_error(error): + db.session.rollback() + app.logger.error('500 - Internal server error: %s', request.path) +~~ return render_template('utils/500.html'), 500 + + +@app.errorhandler(500) +def all_exception_error(exception): + db.session.rollback() + app.logger.error('All other exception error: %s', request.path) +~~ return render_template('utils/500.html'), 500 + + + +@app.route('/robots.txt') +@app.route('/sitemap.xml') +@app.route('/favicon.ico') +def static_from_root(): + return send_from_directory(app.static_folder, request.path[1:]) + + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 18 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1654,7 +1942,7 @@ def init_error_handlers(app): ``` -## Example 18 from trape +## Example 19 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data From 30c19701436b99cc368a2dff276059b7af67441e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 3 Jul 2020 10:06:10 -0400 Subject: [PATCH 153/302] adding new sqlalchemy code examples --- .../19-git.markdown | 5 + .../sqlalchemy-dialects-mysql.markdown | 93 ++++ ...alchemy-dialects-postgresql-array.markdown | 157 ++++++- .../sqlalchemy-dialects-postgresql.markdown | 97 ++++- .../sqlalchemy-dialects-sqlite.markdown | 93 +++- .../sqlalchemy-engine-create-engine.markdown | 85 ++++ ...emy-engine-default-defaultdialect.markdown | 2 +- .../sqlalchemy-engine-default.markdown | 2 +- ...-engine-strategies-enginestrategy.markdown | 2 +- ...ine-strategies-mockenginestrategy.markdown | 2 +- .../sqlalchemy-engine-url-make-url.markdown | 2 +- .../sqlalchemy/sqlalchemy-engine-url.markdown | 2 +- ...lalchemy-events-schemaeventtarget.markdown | 2 +- .../sqlalchemy-exc-argumenterror.markdown | 2 +- .../sqlalchemy-exc-dataerror.markdown | 2 +- .../sqlalchemy-exc-integrityerror.markdown | 2 +- ...qlalchemy-exc-invalidrequesterror.markdown | 2 +- ...alchemy-exc-noinspectionavailable.markdown | 2 +- .../sqlalchemy-exc-operationalerror.markdown | 2 +- .../sqlalchemy-exc-programmingerror.markdown | 2 +- ...lalchemy-ext-automap-automap-base.markdown | 2 +- .../sqlalchemy-ext-compiler-compiles.markdown | 2 +- .../sqlalchemy-ext-compiler.markdown | 2 +- ...-ext-declarative-declarative-base.markdown | 61 ++- ...y-ext-declarative-declarativemeta.markdown | 2 +- ...lchemy-ext-hybrid-hybrid-property.markdown | 2 +- .../sqlalchemy-ext-mutable-mutable.markdown | 2 +- .../sqlalchemy-extensions-plug-ins.markdown | 27 ++ .../sqlalchemy-inspection-inspect.markdown | 2 +- ...-attributes-instrumentedattribute.markdown | 2 +- .../sqlalchemy-orm-attributes.markdown | 2 +- .../sqlalchemy-orm-backref.markdown | 79 ++++ .../sqlalchemy-orm-class-mapper.markdown | 2 +- ...-orm-collections-instrumentedlist.markdown | 2 +- .../sqlalchemy-orm-column-property.markdown | 2 +- .../sqlalchemy-orm-columnproperty.markdown | 2 +- .../sqlalchemy-orm-composite.markdown | 2 +- .../sqlalchemy-orm-compositeproperty.markdown | 2 +- .../sqlalchemy-orm-exc-noresultfound.markdown | 2 +- ...lchemy-orm-exc-unmappedclasserror.markdown | 2 +- ...emy-orm-exc-unmappedinstanceerror.markdown | 2 +- ...emy-orm-interfaces-mapperproperty.markdown | 2 +- ...emy-orm-interfaces-propcomparator.markdown | 2 +- .../sqlalchemy-orm-interfaces.markdown | 2 +- .../sqlalchemy/sqlalchemy-orm-mapper.markdown | 2 +- .../sqlalchemy-orm-mapperlib.markdown | 2 +- .../sqlalchemy-orm-object-mapper.markdown | 2 +- .../sqlalchemy-orm-object-session.markdown | 2 +- ...emy-orm-properties-columnproperty.markdown | 2 +- ...m-properties-relationshipproperty.markdown | 2 +- .../sqlalchemy-orm-query-query.markdown | 2 +- ...sqlalchemy-orm-query-querycontext.markdown | 2 +- .../sqlalchemy-orm-relationship.markdown | 70 ++- ...lchemy-orm-session-object-session.markdown | 2 +- .../sqlalchemy-orm-session-session.markdown | 2 +- .../sqlalchemy-orm-session.markdown | 74 +++- .../sqlalchemy-orm-sessionmaker.markdown | 74 +++- .../sqlalchemy-orm-strategies.markdown | 2 +- .../sqlalchemy-orm-synonymproperty.markdown | 2 +- .../sqlalchemy-orm-util-aliasedinsp.markdown | 2 +- .../sqlalchemy-pool-nullpool.markdown | 2 +- .../sqlalchemy-pool-staticpool.markdown | 2 +- ...sqlalchemy-schema-checkconstraint.markdown | 2 +- .../sqlalchemy-schema-column.markdown | 2 +- .../sqlalchemy-schema-createindex.markdown | 2 +- .../sqlalchemy-schema-ddlelement.markdown | 2 +- .../sqlalchemy-schema-foreignkey.markdown | 397 +++++------------- ...chemy-schema-foreignkeyconstraint.markdown | 2 +- ...chemy-schema-primarykeyconstraint.markdown | 2 +- .../sqlalchemy-schema-table.markdown | 2 +- .../sqlalchemy-sql-clauseelement.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-column.markdown | 2 +- ...lchemy-sql-elements-columnelement.markdown | 2 +- .../sqlalchemy-sql-elements-label.markdown | 2 +- ...hemy-sql-expression-clauseelement.markdown | 2 +- ...chemy-sql-expression-columnclause.markdown | 2 +- ...hemy-sql-expression-columnelement.markdown | 2 +- ...alchemy-sql-expression-executable.markdown | 2 +- ...my-sql-expression-functionelement.markdown | 2 +- ...my-sql-expression-unaryexpression.markdown | 2 +- .../sqlalchemy-sql-expression.markdown | 2 +- ...emy-sql-functions-functionelement.markdown | 2 +- ...emy-sql-functions-genericfunction.markdown | 2 +- .../sqlalchemy-sql-functions.markdown | 2 +- .../sqlalchemy-sql-naming-conv.markdown | 2 +- .../sqlalchemy-sql-operators.markdown | 2 +- .../sqlalchemy-sql-schema-schemaitem.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-schema.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-select.markdown | 2 +- .../sqlalchemy-sql-sqltypes-nulltype.markdown | 129 ++++++ .../sqlalchemy-sql-sqltypes.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-table.markdown | 2 +- ...sqlalchemy-sql-util-clauseadapter.markdown | 2 +- .../sqlalchemy-sql-visitors-traverse.markdown | 2 +- .../sqlalchemy-types-boolean.markdown | 130 ++++++ .../sqlalchemy/sqlalchemy-types-enum.markdown | 2 +- .../sqlalchemy-types-integer.markdown | 2 +- .../sqlalchemy-types-nulltype.markdown | 2 +- .../sqlalchemy-types-string.markdown | 130 ++++++ .../sqlalchemy-types-to-instance.markdown | 2 +- .../sqlalchemy-types-userdefinedtype.markdown | 2 +- ...qlalchemy-util-langhelpers-symbol.markdown | 2 +- .../sqlalchemy-util-ordereddict.markdown | 219 +++++++++- .../sqlalchemy-util-orderedset.markdown | 2 +- ...qlalchemy-util-set-creation-order.markdown | 2 +- .../sqlalchemy-util-topological.markdown | 2 +- theme/templates/code-examples/sqlalchemy.html | 10 + 107 files changed, 1714 insertions(+), 394 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown diff --git a/content/pages/02-development-environments/19-git.markdown b/content/pages/02-development-environments/19-git.markdown index 5e31639e7..adf03293e 100644 --- a/content/pages/02-development-environments/19-git.markdown +++ b/content/pages/02-development-environments/19-git.markdown @@ -169,6 +169,11 @@ workflow. These resources will come in handy for specific Git subjects. the Git history, and good practices for using Git based on the knowledge of how it works internally. +* [Chasing a bad commit](https://vishaltelangre.com/chasing-a-bad-commit/) + examines the `git bisect` command and how it can be used in either + interactive mode or on its own with `git bisect run` to find the + problematic code commit that needs to be fixed. + * [How Microsoft uses Git](https://docs.microsoft.com/en-us/azure/devops/learn/devops-at-microsoft/use-git-microsoft) gives a high-level overview of their repository structure and hosting at the extremely large scale organization. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown index 7fa66cd12..d20f51c51 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown @@ -116,3 +116,96 @@ class ModelConverter: ``` + +## Example 2 from sqlalchemy-datatables +[sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) +([PyPI package information](https://pypi.org/project/sqlalchemy-datatables/)) +is a helper library that makes it easier to use [SQLAlchemy](/sqlalchemy.html) +with the jQuery [JavaScript](/javascript.html) +[DataTables](https://datatables.net/) plugin. This library is designed to +be [web framework](/web-frameworks.html) agnostic and provides code examples +for both [Flask](/flask.html) and [Pyramid](/pyramid.html). + +The project is built and maintained by +[Michel Nemnom (Pegase745)](https://github.com/Pegase745) and is open +sourced under the +[MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). + +[**sqlalchemy-datatables / datatables / datatables.py**](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/./datatables/datatables.py) + +```python +# datatables.py +from __future__ import absolute_import + +import math + +from sqlalchemy import Text, func, or_ +~~from sqlalchemy.dialects import mysql, postgresql, sqlite + +from datatables.clean_regex import clean_regex +from datatables.search_methods import SEARCH_METHODS + + +class DataTables: + + def __init__(self, request, query, columns, allow_regex_searches=False): + self.params = dict(request) + if 'sEcho' in self.params: + raise ValueError( + 'Legacy datatables not supported, upgrade to >=1.10') + self.query = query + self.columns = columns + self.results = None + self.allow_regex_searches = allow_regex_searches + + self.cardinality_filtered = 0 + + self.cardinality = 0 + + self.yadcf_params = [] + self.filter_expressions = [] + self.error = None + + +## ... source file abbreviated to get to mysql examples ... + + + direction = self.params.get('order[{:d}][dir]'.format(i)) + sort_expr = column.sqla_expr + if direction == 'asc': + sort_expr = sort_expr.asc() + elif direction == 'desc': + sort_expr = sort_expr.desc() + else: + raise ValueError( + 'Invalid order direction: {}'.format(direction)) + if column.nulls_order: + if column.nulls_order == 'nullsfirst': + sort_expr = sort_expr.nullsfirst() + elif column.nulls_order == 'nullslast': + sort_expr = sort_expr.nullslast() + else: + raise ValueError( + 'Invalid order direction: {}'.format(direction)) + + sort_expressions.append(sort_expr) + i += 1 + self.sort_expressions = sort_expressions + + def _get_regex_operator(self): + if isinstance(self.query.session.bind.dialect, postgresql.dialect): + return '-' +~~ elif isinstance(self.query.session.bind.dialect, mysql.dialect): + return 'REGEXP' + elif isinstance(self.query.session.bind.dialect, sqlite.dialect): + return 'REGEXP' + else: + raise NotImplementedError( + 'Regex searches are not implemented for this dialect') + + + +## ... source file continues with no further mysql examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown index 75a09a9ee..f3065cacf 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown @@ -10,7 +10,162 @@ meta: Python example code for the ARRAY constant from the sqlalchemy.dialects.po ARRAY is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -## Example 1 from sqlalchemy-utils +## Example 1 from sqlacodegen +[sqlacodegen](https://github.com/agronholm/sqlacodegen) +([PyPI package information](https://pypi.org/project/sqlacodegen/)) +is a tool for +reading from an existing [relational database](/databases.html) to +generate code to create [SQLAlchemy](/sqlalchemy.html) models based +on that database. The project is primarily written and maintained +by [Alex Grönholm (agronholm)](https://github.com/agronholm) and it +is open sourced under the +[MIT license](https://github.com/agronholm/sqlacodegen/blob/master/LICENSE). + +[**sqlacodegen / sqlacodegen / codegen.py**](https://github.com/agronholm/sqlacodegen/blob/master/sqlacodegen/./codegen.py) + +```python +# codegen.py +from __future__ import unicode_literals, division, print_function, absolute_import + +import inspect +import re +import sys +from collections import defaultdict +from importlib import import_module +from inspect import ArgSpec +from keyword import iskeyword + +import sqlalchemy +import sqlalchemy.exc +from sqlalchemy import ( + Enum, ForeignKeyConstraint, PrimaryKeyConstraint, CheckConstraint, UniqueConstraint, Table, + Column, Float) +from sqlalchemy.schema import ForeignKey +from sqlalchemy.sql.sqltypes import NullType +from sqlalchemy.types import Boolean, String +from sqlalchemy.util import OrderedDict + +try: + from sqlalchemy import ARRAY +except ImportError: +~~ from sqlalchemy.dialects.postgresql import ARRAY + +try: + from sqlalchemy import Computed +except ImportError: + Computed = None + +try: + import geoalchemy2 # noqa: F401 +except ImportError: + pass + +_re_boolean_check_constraint = re.compile(r"(?:(?:.*?)\.)?(.*?) IN \(0, 1\)") +_re_column_name = re.compile(r'(?:(["`]?)(?:.*)\1\.)?(["`]?)(.*)\2') +_re_enum_check_constraint = re.compile(r"(?:(?:.*?)\.)?(.*?) IN \((.+)\)") +_re_enum_item = re.compile(r"'(.*?)(? 1: + collector.add_literal_import('sqlalchemy', 'ForeignKeyConstraint') + else: + collector.add_literal_import('sqlalchemy', 'ForeignKey') + elif isinstance(constraint, UniqueConstraint): + if len(constraint.columns) > 1: + collector.add_literal_import('sqlalchemy', 'UniqueConstraint') + elif not isinstance(constraint, PrimaryKeyConstraint): + collector.add_import(constraint) + + for index in self.table.indexes: + if len(index.columns) > 1: + collector.add_import(index) + + @staticmethod + def _convert_to_valid_identifier(name): + assert name, 'Identifier cannot be empty' + if name[0].isdigit() or iskeyword(name): + name = '_' + name + elif name == 'metadata': + + +## ... source file continues with no further ARRAY examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown index 0c2a6cb12..5c9f6b414 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown @@ -199,7 +199,102 @@ class ModelConverter: ``` -## Example 3 from sqlalchemy-utils +## Example 3 from sqlalchemy-datatables +[sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) +([PyPI package information](https://pypi.org/project/sqlalchemy-datatables/)) +is a helper library that makes it easier to use [SQLAlchemy](/sqlalchemy.html) +with the jQuery [JavaScript](/javascript.html) +[DataTables](https://datatables.net/) plugin. This library is designed to +be [web framework](/web-frameworks.html) agnostic and provides code examples +for both [Flask](/flask.html) and [Pyramid](/pyramid.html). + +The project is built and maintained by +[Michel Nemnom (Pegase745)](https://github.com/Pegase745) and is open +sourced under the +[MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). + +[**sqlalchemy-datatables / datatables / datatables.py**](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/./datatables/datatables.py) + +```python +# datatables.py +from __future__ import absolute_import + +import math + +from sqlalchemy import Text, func, or_ +~~from sqlalchemy.dialects import mysql, postgresql, sqlite + +from datatables.clean_regex import clean_regex +from datatables.search_methods import SEARCH_METHODS + + +class DataTables: + + def __init__(self, request, query, columns, allow_regex_searches=False): + self.params = dict(request) + if 'sEcho' in self.params: + raise ValueError( + 'Legacy datatables not supported, upgrade to >=1.10') + self.query = query + self.columns = columns + self.results = None + self.allow_regex_searches = allow_regex_searches + + self.cardinality_filtered = 0 + + self.cardinality = 0 + + self.yadcf_params = [] + self.filter_expressions = [] + self.error = None + + +## ... source file abbreviated to get to postgresql examples ... + + + column_nr = int(self.params.get('order[{:d}][column]'.format(i))) + column = self.columns[column_nr] + direction = self.params.get('order[{:d}][dir]'.format(i)) + sort_expr = column.sqla_expr + if direction == 'asc': + sort_expr = sort_expr.asc() + elif direction == 'desc': + sort_expr = sort_expr.desc() + else: + raise ValueError( + 'Invalid order direction: {}'.format(direction)) + if column.nulls_order: + if column.nulls_order == 'nullsfirst': + sort_expr = sort_expr.nullsfirst() + elif column.nulls_order == 'nullslast': + sort_expr = sort_expr.nullslast() + else: + raise ValueError( + 'Invalid order direction: {}'.format(direction)) + + sort_expressions.append(sort_expr) + i += 1 + self.sort_expressions = sort_expressions + + def _get_regex_operator(self): +~~ if isinstance(self.query.session.bind.dialect, postgresql.dialect): + return '-' + elif isinstance(self.query.session.bind.dialect, mysql.dialect): + return 'REGEXP' + elif isinstance(self.query.session.bind.dialect, sqlite.dialect): + return 'REGEXP' + else: + raise NotImplementedError( + 'Regex searches are not implemented for this dialect') + + + +## ... source file continues with no further postgresql examples... + +``` + + +## Example 4 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown index 245aecbee..09c0c76a0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown @@ -10,7 +10,98 @@ meta: Python example code for the sqlite callable from the sqlalchemy.dialects m sqlite is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. -## Example 1 from sqlalchemy-utils +## Example 1 from sqlalchemy-datatables +[sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) +([PyPI package information](https://pypi.org/project/sqlalchemy-datatables/)) +is a helper library that makes it easier to use [SQLAlchemy](/sqlalchemy.html) +with the jQuery [JavaScript](/javascript.html) +[DataTables](https://datatables.net/) plugin. This library is designed to +be [web framework](/web-frameworks.html) agnostic and provides code examples +for both [Flask](/flask.html) and [Pyramid](/pyramid.html). + +The project is built and maintained by +[Michel Nemnom (Pegase745)](https://github.com/Pegase745) and is open +sourced under the +[MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). + +[**sqlalchemy-datatables / datatables / datatables.py**](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/./datatables/datatables.py) + +```python +# datatables.py +from __future__ import absolute_import + +import math + +from sqlalchemy import Text, func, or_ +~~from sqlalchemy.dialects import mysql, postgresql, sqlite + +from datatables.clean_regex import clean_regex +from datatables.search_methods import SEARCH_METHODS + + +class DataTables: + + def __init__(self, request, query, columns, allow_regex_searches=False): + self.params = dict(request) + if 'sEcho' in self.params: + raise ValueError( + 'Legacy datatables not supported, upgrade to >=1.10') + self.query = query + self.columns = columns + self.results = None + self.allow_regex_searches = allow_regex_searches + + self.cardinality_filtered = 0 + + self.cardinality = 0 + + self.yadcf_params = [] + self.filter_expressions = [] + self.error = None + + +## ... source file abbreviated to get to sqlite examples ... + + + if direction == 'asc': + sort_expr = sort_expr.asc() + elif direction == 'desc': + sort_expr = sort_expr.desc() + else: + raise ValueError( + 'Invalid order direction: {}'.format(direction)) + if column.nulls_order: + if column.nulls_order == 'nullsfirst': + sort_expr = sort_expr.nullsfirst() + elif column.nulls_order == 'nullslast': + sort_expr = sort_expr.nullslast() + else: + raise ValueError( + 'Invalid order direction: {}'.format(direction)) + + sort_expressions.append(sort_expr) + i += 1 + self.sort_expressions = sort_expressions + + def _get_regex_operator(self): + if isinstance(self.query.session.bind.dialect, postgresql.dialect): + return '-' + elif isinstance(self.query.session.bind.dialect, mysql.dialect): + return 'REGEXP' +~~ elif isinstance(self.query.session.bind.dialect, sqlite.dialect): + return 'REGEXP' + else: + raise NotImplementedError( + 'Regex searches are not implemented for this dialect') + + + +## ... source file continues with no further sqlite examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown new file mode 100644 index 000000000..ce4f57730 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown @@ -0,0 +1,85 @@ +title: sqlalchemy.engine create_engine code examples +category: page +slug: sqlalchemy-engine-create-engine-examples +sortorder: 500031017 +toc: False +sidebartitle: sqlalchemy.engine create_engine +meta: Python example code for the create_engine callable from the sqlalchemy.engine module of the SQLAlchemy project. + + +create_engine is a callable within the sqlalchemy.engine module of the SQLAlchemy project. + + +## Example 1 from sqlacodegen +[sqlacodegen](https://github.com/agronholm/sqlacodegen) +([PyPI package information](https://pypi.org/project/sqlacodegen/)) +is a tool for +reading from an existing [relational database](/databases.html) to +generate code to create [SQLAlchemy](/sqlalchemy.html) models based +on that database. The project is primarily written and maintained +by [Alex Grönholm (agronholm)](https://github.com/agronholm) and it +is open sourced under the +[MIT license](https://github.com/agronholm/sqlacodegen/blob/master/LICENSE). + +[**sqlacodegen / sqlacodegen / main.py**](https://github.com/agronholm/sqlacodegen/blob/master/sqlacodegen/./main.py) + +```python +# main.py +from __future__ import unicode_literals, division, print_function, absolute_import + +import argparse +import io +import sys + +import pkg_resources +~~from sqlalchemy.engine import create_engine +from sqlalchemy.schema import MetaData + +from sqlacodegen.codegen import CodeGenerator + + +def main(): + parser = argparse.ArgumentParser( + description='Generates SQLAlchemy model code from an existing database.') + parser.add_argument('url', nargs='?', help='SQLAlchemy url to the database') + parser.add_argument('--version', action='store_true', help="print the version number and exit") + parser.add_argument('--schema', help='load tables from an alternate schema') + parser.add_argument('--tables', help='tables to process (comma-separated, default: all)') + parser.add_argument('--noviews', action='store_true', help="ignore views") + parser.add_argument('--noindexes', action='store_true', help='ignore indexes') + parser.add_argument('--noconstraints', action='store_true', help='ignore constraints') + parser.add_argument('--nojoined', action='store_true', + help="don't autodetect joined table inheritance") + parser.add_argument('--noinflect', action='store_true', + help="don't try to convert tables names to singular form") + parser.add_argument('--noclasses', action='store_true', + help="don't generate classes, only tables") + parser.add_argument('--nocomments', action='store_true', help="don't render column comments") + parser.add_argument('--outfile', help='file to write output to (default: stdout)') + args = parser.parse_args() + + if args.version: + version = pkg_resources.get_distribution('sqlacodegen').parsed_version + print(version.public) + return + if not args.url: + print('You must supply a url\n', file=sys.stderr) + parser.print_help() + return + +~~ engine = create_engine(args.url) + metadata = MetaData(engine) + tables = args.tables.split(',') if args.tables else None + metadata.reflect(engine, args.schema, not args.noviews, tables) + + outfile = io.open(args.outfile, 'w', encoding='utf-8') if args.outfile else sys.stdout + generator = CodeGenerator(metadata, args.noindexes, args.noconstraints, args.nojoined, + args.noinflect, args.noclasses, nocomments=args.nocomments) + generator.render(outfile) + + + +## ... source file continues with no further create_engine examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown index 3594a741d..f1fa25ca9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.default DefaultDialect code examples category: page slug: sqlalchemy-engine-default-defaultdialect-examples -sortorder: 500031019 +sortorder: 500031020 toc: False sidebartitle: sqlalchemy.engine.default DefaultDialect meta: Python example code for the DefaultDialect class from the sqlalchemy.engine.default module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown index c0659d936..e2c2face5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine default code examples category: page slug: sqlalchemy-engine-default-examples -sortorder: 500031017 +sortorder: 500031018 toc: False sidebartitle: sqlalchemy.engine default meta: Python example code for the default callable from the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown index 2c473f0fe..dfede6a0e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.strategies EngineStrategy code examples category: page slug: sqlalchemy-engine-strategies-enginestrategy-examples -sortorder: 500031020 +sortorder: 500031021 toc: False sidebartitle: sqlalchemy.engine.strategies EngineStrategy meta: Python example code for the EngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown index 190ee47a0..c238b4a20 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.strategies MockEngineStrategy code examples category: page slug: sqlalchemy-engine-strategies-mockenginestrategy-examples -sortorder: 500031021 +sortorder: 500031022 toc: False sidebartitle: sqlalchemy.engine.strategies MockEngineStrategy meta: Python example code for the MockEngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown index 21fc75d9a..4e48560dd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine.url make_url code examples category: page slug: sqlalchemy-engine-url-make-url-examples -sortorder: 500031022 +sortorder: 500031023 toc: False sidebartitle: sqlalchemy.engine.url make_url meta: Python example code for the make_url callable from the sqlalchemy.engine.url module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown index 31fff0dd7..1829fe97e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.engine url code examples category: page slug: sqlalchemy-engine-url-examples -sortorder: 500031018 +sortorder: 500031019 toc: False sidebartitle: sqlalchemy.engine url meta: Python example code for the url callable from the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown index 0d2fbe03f..2a611c986 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.events SchemaEventTarget code examples category: page slug: sqlalchemy-events-schemaeventtarget-examples -sortorder: 500031023 +sortorder: 500031024 toc: False sidebartitle: sqlalchemy.events SchemaEventTarget meta: Python example code for the SchemaEventTarget class from the sqlalchemy.events module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown index d9d7e7ef5..0b0a64a3a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc ArgumentError code examples category: page slug: sqlalchemy-exc-argumenterror-examples -sortorder: 500031024 +sortorder: 500031025 toc: False sidebartitle: sqlalchemy.exc ArgumentError meta: Python example code for the ArgumentError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown index e927548d9..430c71e41 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc DataError code examples category: page slug: sqlalchemy-exc-dataerror-examples -sortorder: 500031025 +sortorder: 500031026 toc: False sidebartitle: sqlalchemy.exc DataError meta: Python example code for the DataError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown index a896228cf..3959b6c18 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc IntegrityError code examples category: page slug: sqlalchemy-exc-integrityerror-examples -sortorder: 500031026 +sortorder: 500031027 toc: False sidebartitle: sqlalchemy.exc IntegrityError meta: Python example code for the IntegrityError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown index f76838c07..565b5c4c9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc InvalidRequestError code examples category: page slug: sqlalchemy-exc-invalidrequesterror-examples -sortorder: 500031027 +sortorder: 500031028 toc: False sidebartitle: sqlalchemy.exc InvalidRequestError meta: Python example code for the InvalidRequestError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown index f1d8897b0..25afeb1ae 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc NoInspectionAvailable code examples category: page slug: sqlalchemy-exc-noinspectionavailable-examples -sortorder: 500031028 +sortorder: 500031029 toc: False sidebartitle: sqlalchemy.exc NoInspectionAvailable meta: Python example code for the NoInspectionAvailable class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown index f6418654d..284f0c8ca 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc OperationalError code examples category: page slug: sqlalchemy-exc-operationalerror-examples -sortorder: 500031029 +sortorder: 500031030 toc: False sidebartitle: sqlalchemy.exc OperationalError meta: Python example code for the OperationalError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown index 695e6f033..0f735d28c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.exc ProgrammingError code examples category: page slug: sqlalchemy-exc-programmingerror-examples -sortorder: 500031030 +sortorder: 500031031 toc: False sidebartitle: sqlalchemy.exc ProgrammingError meta: Python example code for the ProgrammingError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown index 889e6534c..5776e306d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.automap automap_base code examples category: page slug: sqlalchemy-ext-automap-automap-base-examples -sortorder: 500031032 +sortorder: 500031033 toc: False sidebartitle: sqlalchemy.ext.automap automap_base meta: Python example code for the automap_base callable from the sqlalchemy.ext.automap module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown index 327714873..900203b0e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.compiler compiles code examples category: page slug: sqlalchemy-ext-compiler-compiles-examples -sortorder: 500031033 +sortorder: 500031034 toc: False sidebartitle: sqlalchemy.ext.compiler compiles meta: Python example code for the compiles callable from the sqlalchemy.ext.compiler module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown index e99f5879c..9afc9628f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext compiler code examples category: page slug: sqlalchemy-ext-compiler-examples -sortorder: 500031031 +sortorder: 500031032 toc: False sidebartitle: sqlalchemy.ext compiler meta: Python example code for the compiler callable from the sqlalchemy.ext module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown index aaeccc783..febee93a0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.declarative declarative_base code examples category: page slug: sqlalchemy-ext-declarative-declarative-base-examples -sortorder: 500031035 +sortorder: 500031036 toc: False sidebartitle: sqlalchemy.ext.declarative declarative_base meta: Python example code for the declarative_base callable from the sqlalchemy.ext.declarative module of the SQLAlchemy project. @@ -202,7 +202,64 @@ class Pet(Base): ``` -## Example 3 from sandman2 +## Example 3 from sqlalchemy-datatables +[sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) +([PyPI package information](https://pypi.org/project/sqlalchemy-datatables/)) +is a helper library that makes it easier to use [SQLAlchemy](/sqlalchemy.html) +with the jQuery [JavaScript](/javascript.html) +[DataTables](https://datatables.net/) plugin. This library is designed to +be [web framework](/web-frameworks.html) agnostic and provides code examples +for both [Flask](/flask.html) and [Pyramid](/pyramid.html). + +The project is built and maintained by +[Michel Nemnom (Pegase745)](https://github.com/Pegase745) and is open +sourced under the +[MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). + +[**sqlalchemy-datatables / tests / models.py**](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/./tests/models.py) + +```python +# models.py +import datetime + +from sqlalchemy import Column, Date, DateTime, ForeignKey, Integer, String, func +~~from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm import backref, relationship + +~~Base = declarative_base() + + +class User(Base): + + __tablename__ = 'users' + + id = Column(Integer, primary_key=True) + name = Column(String, unique=True) + created_at = Column(DateTime, default=datetime.datetime.utcnow) + birthday = Column(Date) + address = relationship('Address', uselist=False, backref=backref('user')) + + def __unicode__(self): + return '%s' % self.name + + def __repr__(self): + return '<%s#%s>' % (self.__class__.__name__, self.id) + + @hybrid_property + def dummy(self): + return self.name[0:3] + + @dummy.expression + def dummy(cls): + + +## ... source file continues with no further declarative_base examples... + +``` + + +## Example 4 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown index eb387e8ea..1f4bcf67b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.declarative DeclarativeMeta code examples category: page slug: sqlalchemy-ext-declarative-declarativemeta-examples -sortorder: 500031034 +sortorder: 500031035 toc: False sidebartitle: sqlalchemy.ext.declarative DeclarativeMeta meta: Python example code for the DeclarativeMeta class from the sqlalchemy.ext.declarative module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown index 1d6db14cb..be6a39d1d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.hybrid hybrid_property code examples category: page slug: sqlalchemy-ext-hybrid-hybrid-property-examples -sortorder: 500031036 +sortorder: 500031037 toc: False sidebartitle: sqlalchemy.ext.hybrid hybrid_property meta: Python example code for the hybrid_property callable from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown index caed85546..eb9d43b9e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.mutable Mutable code examples category: page slug: sqlalchemy-ext-mutable-mutable-examples -sortorder: 500031037 +sortorder: 500031038 toc: False sidebartitle: sqlalchemy.ext.mutable Mutable meta: Python example code for the Mutable class from the sqlalchemy.ext.mutable module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index ab4bd2167..a49881abe 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -115,6 +115,33 @@ The marshmallow-sqlalchemy project is provided as open source under the [MIT license](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/LICENSE). +### sqlacodegen +[sqlacodegen](https://github.com/agronholm/sqlacodegen) +([PyPI package information](https://pypi.org/project/sqlacodegen/)) +is a tool for +reading from an existing [relational database](/databases.html) to +generate code to create [SQLAlchemy](/sqlalchemy.html) models based +on that database. The project is primarily written and maintained +by [Alex Grönholm (agronholm)](https://github.com/agronholm) and it +is open sourced under the +[MIT license](https://github.com/agronholm/sqlacodegen/blob/master/LICENSE). + + +### sqlalchemy-datatables +[sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) +([PyPI package information](https://pypi.org/project/sqlalchemy-datatables/)) +is a helper library that makes it easier to use [SQLAlchemy](/sqlalchemy.html) +with the jQuery [JavaScript](/javascript.html) +[DataTables](https://datatables.net/) plugin. This library is designed to +be [web framework](/web-frameworks.html) agnostic and provides code examples +for both [Flask](/flask.html) and [Pyramid](/pyramid.html). + +The project is built and maintained by +[Michel Nemnom (Pegase745)](https://github.com/Pegase745) and is open +sourced under the +[MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). + + ### sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown index cdd5ec244..c62046ed5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.inspection inspect code examples category: page slug: sqlalchemy-inspection-inspect-examples -sortorder: 500031038 +sortorder: 500031039 toc: False sidebartitle: sqlalchemy.inspection inspect meta: Python example code for the inspect callable from the sqlalchemy.inspection module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown index c1d3664f9..9c69a398a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.attributes InstrumentedAttribute code examples category: page slug: sqlalchemy-orm-attributes-instrumentedattribute-examples -sortorder: 500031056 +sortorder: 500031058 toc: False sidebartitle: sqlalchemy.orm.attributes InstrumentedAttribute meta: Python example code for the InstrumentedAttribute class from the sqlalchemy.orm.attributes module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown index ffcfa8a23..85a2e9bac 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm attributes code examples category: page slug: sqlalchemy-orm-attributes-examples -sortorder: 500031043 +sortorder: 500031044 toc: False sidebartitle: sqlalchemy.orm attributes meta: Python example code for the attributes callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown new file mode 100644 index 000000000..98d2a5842 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown @@ -0,0 +1,79 @@ +title: sqlalchemy.orm backref code examples +category: page +slug: sqlalchemy-orm-backref-examples +sortorder: 500031045 +toc: False +sidebartitle: sqlalchemy.orm backref +meta: Python example code for the backref callable from the sqlalchemy.orm module of the SQLAlchemy project. + + +backref is a callable within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-datatables +[sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) +([PyPI package information](https://pypi.org/project/sqlalchemy-datatables/)) +is a helper library that makes it easier to use [SQLAlchemy](/sqlalchemy.html) +with the jQuery [JavaScript](/javascript.html) +[DataTables](https://datatables.net/) plugin. This library is designed to +be [web framework](/web-frameworks.html) agnostic and provides code examples +for both [Flask](/flask.html) and [Pyramid](/pyramid.html). + +The project is built and maintained by +[Michel Nemnom (Pegase745)](https://github.com/Pegase745) and is open +sourced under the +[MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). + +[**sqlalchemy-datatables / tests / models.py**](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/./tests/models.py) + +```python +# models.py +import datetime + +from sqlalchemy import Column, Date, DateTime, ForeignKey, Integer, String, func +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import backref, relationship + +Base = declarative_base() + + +class User(Base): + + __tablename__ = 'users' + + id = Column(Integer, primary_key=True) + name = Column(String, unique=True) + created_at = Column(DateTime, default=datetime.datetime.utcnow) + birthday = Column(Date) +~~ address = relationship('Address', uselist=False, backref=backref('user')) + + def __unicode__(self): + return '%s' % self.name + + def __repr__(self): + return '<%s#%s>' % (self.__class__.__name__, self.id) + + @hybrid_property + def dummy(self): + return self.name[0:3] + + @dummy.expression + def dummy(cls): + return func.substr(cls.name, 0, 3) + + +class Address(Base): + + __tablename__ = 'addresses' + + id = Column(Integer, primary_key=True) + description = Column(String, unique=True) + user_id = Column(Integer, ForeignKey('users.id')) + + + +## ... source file continues with no further backref examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown index e88bab79c..6826897b6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm class_mapper code examples category: page slug: sqlalchemy-orm-class-mapper-examples -sortorder: 500031044 +sortorder: 500031046 toc: False sidebartitle: sqlalchemy.orm class_mapper meta: Python example code for the class_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown index fd14adf07..a2c662e21 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.collections InstrumentedList code examples category: page slug: sqlalchemy-orm-collections-instrumentedlist-examples -sortorder: 500031057 +sortorder: 500031059 toc: False sidebartitle: sqlalchemy.orm.collections InstrumentedList meta: Python example code for the InstrumentedList class from the sqlalchemy.orm.collections module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown index 4908e9ee0..0456e98f7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm column_property code examples category: page slug: sqlalchemy-orm-column-property-examples -sortorder: 500031045 +sortorder: 500031047 toc: False sidebartitle: sqlalchemy.orm column_property meta: Python example code for the column_property callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown index 6ccbb201c..14bd7d57c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm ColumnProperty code examples category: page slug: sqlalchemy-orm-columnproperty-examples -sortorder: 500031039 +sortorder: 500031040 toc: False sidebartitle: sqlalchemy.orm ColumnProperty meta: Python example code for the ColumnProperty class from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown index 7628b7035..498a041cb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm composite code examples category: page slug: sqlalchemy-orm-composite-examples -sortorder: 500031046 +sortorder: 500031048 toc: False sidebartitle: sqlalchemy.orm composite meta: Python example code for the composite callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown index 0e43cca21..0598a246c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm CompositeProperty code examples category: page slug: sqlalchemy-orm-compositeproperty-examples -sortorder: 500031040 +sortorder: 500031041 toc: False sidebartitle: sqlalchemy.orm CompositeProperty meta: Python example code for the CompositeProperty class from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown index c25102683..2d141d1a5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc NoResultFound code examples category: page slug: sqlalchemy-orm-exc-noresultfound-examples -sortorder: 500031058 +sortorder: 500031060 toc: False sidebartitle: sqlalchemy.orm.exc NoResultFound meta: Python example code for the NoResultFound class from the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown index 8855392f2..8563bbd62 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc UnmappedClassError code examples category: page slug: sqlalchemy-orm-exc-unmappedclasserror-examples -sortorder: 500031059 +sortorder: 500031061 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedClassError meta: Python example code for the UnmappedClassError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown index ff5f517c0..786d765e8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc UnmappedInstanceError code examples category: page slug: sqlalchemy-orm-exc-unmappedinstanceerror-examples -sortorder: 500031060 +sortorder: 500031062 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedInstanceError meta: Python example code for the UnmappedInstanceError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown index 25104a0df..1a033f09c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.interfaces MapperProperty code examples category: page slug: sqlalchemy-orm-interfaces-mapperproperty-examples -sortorder: 500031061 +sortorder: 500031063 toc: False sidebartitle: sqlalchemy.orm.interfaces MapperProperty meta: Python example code for the MapperProperty class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown index dc1082e9e..10097cd00 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.interfaces PropComparator code examples category: page slug: sqlalchemy-orm-interfaces-propcomparator-examples -sortorder: 500031062 +sortorder: 500031064 toc: False sidebartitle: sqlalchemy.orm.interfaces PropComparator meta: Python example code for the PropComparator class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown index 71949feea..4d1fcf4c4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm interfaces code examples category: page slug: sqlalchemy-orm-interfaces-examples -sortorder: 500031047 +sortorder: 500031049 toc: False sidebartitle: sqlalchemy.orm interfaces meta: Python example code for the interfaces callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown index 42923fd30..a09e0ed44 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm mapper code examples category: page slug: sqlalchemy-orm-mapper-examples -sortorder: 500031048 +sortorder: 500031050 toc: False sidebartitle: sqlalchemy.orm mapper meta: Python example code for the mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown index fcd4e8312..2e3f0da82 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm mapperlib code examples category: page slug: sqlalchemy-orm-mapperlib-examples -sortorder: 500031049 +sortorder: 500031051 toc: False sidebartitle: sqlalchemy.orm mapperlib meta: Python example code for the mapperlib callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown index 518799ab0..dd6e63f09 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm object_mapper code examples category: page slug: sqlalchemy-orm-object-mapper-examples -sortorder: 500031050 +sortorder: 500031052 toc: False sidebartitle: sqlalchemy.orm object_mapper meta: Python example code for the object_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown index 8b0f21d9d..7d0fcae14 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm object_session code examples category: page slug: sqlalchemy-orm-object-session-examples -sortorder: 500031051 +sortorder: 500031053 toc: False sidebartitle: sqlalchemy.orm object_session meta: Python example code for the object_session callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown index 3f61846ed..7653223ff 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.properties ColumnProperty code examples category: page slug: sqlalchemy-orm-properties-columnproperty-examples -sortorder: 500031063 +sortorder: 500031065 toc: False sidebartitle: sqlalchemy.orm.properties ColumnProperty meta: Python example code for the ColumnProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown index 5e969ebe9..fc349034d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.properties RelationshipProperty code examples category: page slug: sqlalchemy-orm-properties-relationshipproperty-examples -sortorder: 500031064 +sortorder: 500031066 toc: False sidebartitle: sqlalchemy.orm.properties RelationshipProperty meta: Python example code for the RelationshipProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown index c2603ca49..d193fc8eb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.query Query code examples category: page slug: sqlalchemy-orm-query-query-examples -sortorder: 500031065 +sortorder: 500031067 toc: False sidebartitle: sqlalchemy.orm.query Query meta: Python example code for the Query class from the sqlalchemy.orm.query module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown index 784b76847..c704e735d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.query QueryContext code examples category: page slug: sqlalchemy-orm-query-querycontext-examples -sortorder: 500031066 +sortorder: 500031068 toc: False sidebartitle: sqlalchemy.orm.query QueryContext meta: Python example code for the QueryContext class from the sqlalchemy.orm.query module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown index bb13eac19..30a97fc9f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm relationship code examples category: page slug: sqlalchemy-orm-relationship-examples -sortorder: 500031052 +sortorder: 500031054 toc: False sidebartitle: sqlalchemy.orm relationship meta: Python example code for the relationship callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -124,3 +124,71 @@ class ReflectedEditor(type): ``` + +## Example 2 from sqlalchemy-datatables +[sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) +([PyPI package information](https://pypi.org/project/sqlalchemy-datatables/)) +is a helper library that makes it easier to use [SQLAlchemy](/sqlalchemy.html) +with the jQuery [JavaScript](/javascript.html) +[DataTables](https://datatables.net/) plugin. This library is designed to +be [web framework](/web-frameworks.html) agnostic and provides code examples +for both [Flask](/flask.html) and [Pyramid](/pyramid.html). + +The project is built and maintained by +[Michel Nemnom (Pegase745)](https://github.com/Pegase745) and is open +sourced under the +[MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). + +[**sqlalchemy-datatables / tests / models.py**](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/./tests/models.py) + +```python +# models.py +import datetime + +from sqlalchemy import Column, Date, DateTime, ForeignKey, Integer, String, func +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.hybrid import hybrid_property +~~from sqlalchemy.orm import backref, relationship + +Base = declarative_base() + + +class User(Base): + + __tablename__ = 'users' + + id = Column(Integer, primary_key=True) + name = Column(String, unique=True) + created_at = Column(DateTime, default=datetime.datetime.utcnow) + birthday = Column(Date) +~~ address = relationship('Address', uselist=False, backref=backref('user')) + + def __unicode__(self): + return '%s' % self.name + + def __repr__(self): + return '<%s#%s>' % (self.__class__.__name__, self.id) + + @hybrid_property + def dummy(self): + return self.name[0:3] + + @dummy.expression + def dummy(cls): + return func.substr(cls.name, 0, 3) + + +class Address(Base): + + __tablename__ = 'addresses' + + id = Column(Integer, primary_key=True) + description = Column(String, unique=True) + user_id = Column(Integer, ForeignKey('users.id')) + + + +## ... source file continues with no further relationship examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown index efb8cf6b3..f6a946faa 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.session object_session code examples category: page slug: sqlalchemy-orm-session-object-session-examples -sortorder: 500031068 +sortorder: 500031070 toc: False sidebartitle: sqlalchemy.orm.session object_session meta: Python example code for the object_session callable from the sqlalchemy.orm.session module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown index 78c8d4dbd..117fcc146 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.session Session code examples category: page slug: sqlalchemy-orm-session-session-examples -sortorder: 500031067 +sortorder: 500031069 toc: False sidebartitle: sqlalchemy.orm.session Session meta: Python example code for the Session class from the sqlalchemy.orm.session module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown index 6480315b0..9cb8ebc2e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm session code examples category: page slug: sqlalchemy-orm-session-examples -sortorder: 500031053 +sortorder: 500031055 toc: False sidebartitle: sqlalchemy.orm session meta: Python example code for the session callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -66,6 +66,78 @@ def session_factory(): +## ... source file continues with no further session examples... + +``` + + +## Example 2 from sqlalchemy-datatables +[sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) +([PyPI package information](https://pypi.org/project/sqlalchemy-datatables/)) +is a helper library that makes it easier to use [SQLAlchemy](/sqlalchemy.html) +with the jQuery [JavaScript](/javascript.html) +[DataTables](https://datatables.net/) plugin. This library is designed to +be [web framework](/web-frameworks.html) agnostic and provides code examples +for both [Flask](/flask.html) and [Pyramid](/pyramid.html). + +The project is built and maintained by +[Michel Nemnom (Pegase745)](https://github.com/Pegase745) and is open +sourced under the +[MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). + +[**sqlalchemy-datatables / tests / conftest.py**](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/./tests/conftest.py) + +```python +# conftest.py +from __future__ import print_function + +import itertools +from datetime import datetime, timedelta + +import faker +import pytest +from sqlalchemy import create_engine +~~from sqlalchemy.orm import sessionmaker + +from .models import Address, Base, User + + +def populate(session): + users = [] + f = faker.Faker(seed=1) + addresses = [Address(description=d) for d in ['Street', 'Avenue', 'Road']] +~~ session.add_all(addresses) + + for i, addr in zip(range(0, 50), itertools.cycle(addresses)): + user = User( + name=f.name(), + address=addr, + birthday=datetime(1970, 1, 2) + timedelta(days=10 * i)) + users.append(user) + +~~ session.add_all(users) +~~ session.commit() + + +@pytest.fixture(scope="session") +def engine(): + print("TestCase: Using sqlite database") + return create_engine('sqlite:///', echo=False) + + +@pytest.fixture(scope="session") +~~def session(engine): + sessionmaker_ = sessionmaker(bind=engine) + session = sessionmaker_() + Base.metadata.create_all(engine) + populate(session) + + yield session + +~~ session.close() + + + ## ... source file continues with no further session examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown index e92ab6689..8af486b09 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm sessionmaker code examples category: page slug: sqlalchemy-orm-sessionmaker-examples -sortorder: 500031054 +sortorder: 500031056 toc: False sidebartitle: sqlalchemy.orm sessionmaker meta: Python example code for the sessionmaker callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -70,3 +70,75 @@ def session(session_factory): ``` + +## Example 2 from sqlalchemy-datatables +[sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) +([PyPI package information](https://pypi.org/project/sqlalchemy-datatables/)) +is a helper library that makes it easier to use [SQLAlchemy](/sqlalchemy.html) +with the jQuery [JavaScript](/javascript.html) +[DataTables](https://datatables.net/) plugin. This library is designed to +be [web framework](/web-frameworks.html) agnostic and provides code examples +for both [Flask](/flask.html) and [Pyramid](/pyramid.html). + +The project is built and maintained by +[Michel Nemnom (Pegase745)](https://github.com/Pegase745) and is open +sourced under the +[MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). + +[**sqlalchemy-datatables / tests / conftest.py**](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/./tests/conftest.py) + +```python +# conftest.py +from __future__ import print_function + +import itertools +from datetime import datetime, timedelta + +import faker +import pytest +from sqlalchemy import create_engine +~~from sqlalchemy.orm import sessionmaker + +from .models import Address, Base, User + + +def populate(session): + users = [] + f = faker.Faker(seed=1) + addresses = [Address(description=d) for d in ['Street', 'Avenue', 'Road']] + session.add_all(addresses) + + for i, addr in zip(range(0, 50), itertools.cycle(addresses)): + user = User( + name=f.name(), + address=addr, + birthday=datetime(1970, 1, 2) + timedelta(days=10 * i)) + users.append(user) + + session.add_all(users) + session.commit() + + +@pytest.fixture(scope="session") +def engine(): + print("TestCase: Using sqlite database") + return create_engine('sqlite:///', echo=False) + + +@pytest.fixture(scope="session") +def session(engine): +~~ sessionmaker_ = sessionmaker(bind=engine) + session = sessionmaker_() + Base.metadata.create_all(engine) + populate(session) + + yield session + + session.close() + + + +## ... source file continues with no further sessionmaker examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown index ab26ac3b3..72b4aeefb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm strategies code examples category: page slug: sqlalchemy-orm-strategies-examples -sortorder: 500031055 +sortorder: 500031057 toc: False sidebartitle: sqlalchemy.orm strategies meta: Python example code for the strategies callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown index 60f89ca64..2a34214df 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm SynonymProperty code examples category: page slug: sqlalchemy-orm-synonymproperty-examples -sortorder: 500031042 +sortorder: 500031043 toc: False sidebartitle: sqlalchemy.orm SynonymProperty meta: Python example code for the SynonymProperty class from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown index 41e232b5e..a9d458bc3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.util AliasedInsp code examples category: page slug: sqlalchemy-orm-util-aliasedinsp-examples -sortorder: 500031069 +sortorder: 500031071 toc: False sidebartitle: sqlalchemy.orm.util AliasedInsp meta: Python example code for the AliasedInsp class from the sqlalchemy.orm.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown index 2c119cf56..9d3fdb841 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.pool NullPool code examples category: page slug: sqlalchemy-pool-nullpool-examples -sortorder: 500031070 +sortorder: 500031072 toc: False sidebartitle: sqlalchemy.pool NullPool meta: Python example code for the NullPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown index 7dd729cfb..e5ed53326 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.pool StaticPool code examples category: page slug: sqlalchemy-pool-staticpool-examples -sortorder: 500031071 +sortorder: 500031073 toc: False sidebartitle: sqlalchemy.pool StaticPool meta: Python example code for the StaticPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown index 41e4806ed..aac58d419 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CheckConstraint code examples category: page slug: sqlalchemy-schema-checkconstraint-examples -sortorder: 500031072 +sortorder: 500031074 toc: False sidebartitle: sqlalchemy.schema CheckConstraint meta: Python example code for the CheckConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown index ef30079e2..9a1b22d1f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Column code examples category: page slug: sqlalchemy-schema-column-examples -sortorder: 500031073 +sortorder: 500031075 toc: False sidebartitle: sqlalchemy.schema Column meta: Python example code for the Column class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown index eb37bb84c..8f80f7b41 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CreateIndex code examples category: page slug: sqlalchemy-schema-createindex-examples -sortorder: 500031074 +sortorder: 500031076 toc: False sidebartitle: sqlalchemy.schema CreateIndex meta: Python example code for the CreateIndex class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown index 4d5663441..c83aa530a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema DDLElement code examples category: page slug: sqlalchemy-schema-ddlelement-examples -sortorder: 500031075 +sortorder: 500031077 toc: False sidebartitle: sqlalchemy.schema DDLElement meta: Python example code for the DDLElement class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown index 4d23b51e3..097f3e665 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema ForeignKey code examples category: page slug: sqlalchemy-schema-foreignkey-examples -sortorder: 500031005 +sortorder: 500031078 toc: False sidebartitle: sqlalchemy.schema ForeignKey meta: Python example code for the ForeignKey class from the sqlalchemy.schema module of the SQLAlchemy project. @@ -10,314 +10,119 @@ meta: Python example code for the ForeignKey class from the sqlalchemy.schema mo ForeignKey is a class within the sqlalchemy.schema module of the SQLAlchemy project. -## Example 1 from alembic -[Alembic](https://github.com/sqlalchemy/alembic) -([project documentation](https://alembic.sqlalchemy.org/) and -[PyPI page](https://pypi.org/project/alembic/)) -is a data migrations tool used with [SQLAlchemy](/sqlalchemy.html) to make -database schema changes. The Alembic project is open sourced under the -[MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). +## Example 1 from sqlacodegen +[sqlacodegen](https://github.com/agronholm/sqlacodegen) +([PyPI package information](https://pypi.org/project/sqlacodegen/)) +is a tool for +reading from an existing [relational database](/databases.html) to +generate code to create [SQLAlchemy](/sqlalchemy.html) models based +on that database. The project is primarily written and maintained +by [Alex Grönholm (agronholm)](https://github.com/agronholm) and it +is open sourced under the +[MIT license](https://github.com/agronholm/sqlacodegen/blob/master/LICENSE). -[**alembic / alembic / util / sqla_compat.py**](https://github.com/sqlalchemy/alembic/blob/master/alembic/util/sqla_compat.py) +[**sqlacodegen / sqlacodegen / codegen.py**](https://github.com/agronholm/sqlacodegen/blob/master/sqlacodegen/./codegen.py) ```python -# sqla_compat.py -import re - -from sqlalchemy import __version__ -from sqlalchemy import inspect -from sqlalchemy import schema -from sqlalchemy import sql -from sqlalchemy import types as sqltypes -from sqlalchemy.ext.compiler import compiles -from sqlalchemy.schema import CheckConstraint -from sqlalchemy.schema import Column -~~from sqlalchemy.schema import ForeignKeyConstraint -from sqlalchemy.sql.elements import quoted_name -from sqlalchemy.sql.expression import _BindParamClause -from sqlalchemy.sql.expression import _TextClause as TextClause -from sqlalchemy.sql.visitors import traverse - -from . import compat - - -def _safe_int(value): - try: - return int(value) - except: - return value - - -_vers = tuple( - [_safe_int(x) for x in re.findall(r"(\d+|[abc]\d)", __version__)] -) -sqla_110 = _vers >= (1, 1, 0) -sqla_1115 = _vers >= (1, 1, 15) -sqla_120 = _vers >= (1, 2, 0) -sqla_1216 = _vers >= (1, 2, 16) -sqla_13 = _vers >= (1, 3) -sqla_14 = _vers >= (1, 4) - - -## ... source file abbreviated to get to ForeignKey examples ... - - - connectable, tablename, schemaname - ) - - -def _exec_on_inspector(inspector, statement, **params): - if sqla_14: - with inspector._operation_context() as conn: - return conn.execute(statement, params) - else: - return inspector.bind.execute(statement, params) - - -def _server_default_is_computed(column): - if not has_computed: - return False - else: - return isinstance(column.computed, Computed) - - -def _table_for_constraint(constraint): -~~ if isinstance(constraint, ForeignKeyConstraint): - return constraint.parent - else: - return constraint.table - - -def _columns_for_constraint(constraint): -~~ if isinstance(constraint, ForeignKeyConstraint): - return [fk.parent for fk in constraint.elements] - elif isinstance(constraint, CheckConstraint): - return _find_columns(constraint.sqltext) - else: - return list(constraint.columns) - +# codegen.py +from __future__ import unicode_literals, division, print_function, absolute_import -def _fk_spec(constraint): - source_columns = [ - constraint.columns[key].name for key in constraint.column_keys - ] - - source_table = constraint.parent.name - source_schema = constraint.parent.schema - target_schema = constraint.elements[0].column.table.schema - target_table = constraint.elements[0].column.table.name - target_columns = [element.column.name for element in constraint.elements] - ondelete = constraint.ondelete - onupdate = constraint.onupdate - deferrable = constraint.deferrable - initially = constraint.initially - return ( - source_schema, - source_table, - - -## ... source file continues with no further ForeignKey examples... - - -``` - - -## Example 2 from sqlalchemy-utils -[sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) -([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) -and -[PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/)) -is a code library with various helper functions and new data types -that make it easier to use [SQLAlchemy](/sqlachemy.html) when building -projects that involve more specific storage requirements such as -[currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency). -The wide array of -[data types](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html) -includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) -and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). - -[**sqlalchemy-utils / sqlalchemy_utils / functions / foreign_keys.py**](https://github.com/kvesteri/sqlalchemy-utils/blob/master/sqlalchemy_utils/functions/foreign_keys.py) - -```python -# foreign_keys.py +import inspect +import re +import sys from collections import defaultdict -from itertools import groupby - -import sqlalchemy as sa -from sqlalchemy.exc import NoInspectionAvailable -from sqlalchemy.orm import object_session -~~from sqlalchemy.schema import ForeignKeyConstraint, MetaData, Table - -from ..query_chain import QueryChain -from .database import has_index -from .orm import get_column_key, get_mapper, get_tables - - -def get_foreign_key_values(fk, obj): - return dict( - ( - fk.constraint.columns.values()[index].key, - getattr(obj, element.column.key) - ) - for - index, element - in - enumerate(fk.constraint.elements) - ) - - -def group_foreign_keys(foreign_keys): - """ - Return a groupby iterator that groups given foreign keys by table. - - :param foreign_keys: a sequence of foreign keys +from importlib import import_module +from inspect import ArgSpec +from keyword import iskeyword + +import sqlalchemy +import sqlalchemy.exc +from sqlalchemy import ( + Enum, ForeignKeyConstraint, PrimaryKeyConstraint, CheckConstraint, UniqueConstraint, Table, + Column, Float) +~~from sqlalchemy.schema import ForeignKey +from sqlalchemy.sql.sqltypes import NullType +from sqlalchemy.types import Boolean, String +from sqlalchemy.util import OrderedDict + +try: + from sqlalchemy import ARRAY +except ImportError: + from sqlalchemy.dialects.postgresql import ARRAY + +try: + from sqlalchemy import Computed +except ImportError: + Computed = None + +try: + import geoalchemy2 # noqa: F401 +except ImportError: + pass + +_re_boolean_check_constraint = re.compile(r"(?:(?:.*?)\.)?(.*?) IN \(0, 1\)") +_re_column_name = re.compile(r'(?:(["`]?)(?:.*)\1\.)?(["`]?)(.*)\2') +_re_enum_check_constraint = re.compile(r"(?:(?:.*?)\.)?(.*?) IN \((.+)\)") +_re_enum_item = re.compile(r"'(.*?)(?sqlalchemy.dialects.postgresql.psycopg2

sqlalchemy.engine Connection, Engine, + create_engine, default, url

@@ -87,6 +88,7 @@

sqlalchemy.orm Session, SynonymProperty, attributes, + backref, class_mapper, column_property, composite, @@ -139,6 +141,7 @@

sqlalchemy.schema Column, CreateIndex, DDLElement, + ForeignKey, ForeignKeyConstraint, PrimaryKeyConstraint, Table @@ -177,6 +180,10 @@

sqlalchemy.sql.naming

sqlalchemy.sql.schema SchemaItem

+

sqlalchemy.sql.sqltypes + NULLTYPE, + NullType +

sqlalchemy.sql.util ClauseAdapter

@@ -184,11 +191,14 @@

sqlalchemy.sql.visitors traverse

sqlalchemy.types + BOOLEAN, + Boolean, Enum, INTEGER, Integer, NULLTYPE, NullType, + String, UserDefinedType, to_instance

From 6ec09186f5feebb9b4fe6967a0e12485a1449356 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 3 Jul 2020 21:17:31 -0400 Subject: [PATCH 154/302] reducing generated
 block sizes

---
 Makefile | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 1e66e6cde..a05959115 100644
--- a/Makefile
+++ b/Makefile
@@ -6,9 +6,40 @@ run:
 	sed -i '' 's/\(^.*~~.*$$\)/\1<\/span>/g' generated/updated_site/pages/*.html
 	sed -i '' 's/~~//g' generated/updated_site/pages/*.html
 	cp generated/updated_site/pages/* generated/updated_site/
+	sed -i '' 's/~~//g' generated/updated_site/blog/*.html
+
+
+prod: run
 	rm -rf generated/updated_site/pages/
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/<\/span>//g' generated/updated_site/*.html
+	sed -i '' 's/<\/span>//g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.~*=&;/-]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.~*=&;/-]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g' generated/updated_site/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
 	sed -i '' 's/\(^.*~~.*$$\)/\1<\/span>/g' generated/updated_site/blog/*.html
-	sed -i '' 's/~~//g' generated/updated_site/blog/*.html
 
 
 bookbuild:                                                                   

From 9648c2bfbef489554631910615f3a4a5af190f26 Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Fri, 3 Jul 2020 21:51:05 -0400
Subject: [PATCH 155/302] tweaking makefile to purge span tags from pre output

---
 Makefile | 50 +++++++++++++++++++++-----------------------------
 1 file changed, 21 insertions(+), 29 deletions(-)

diff --git a/Makefile b/Makefile
index a05959115..2fdd1f654 100644
--- a/Makefile
+++ b/Makefile
@@ -11,35 +11,27 @@ run:
 
 prod: run
 	rm -rf generated/updated_site/pages/
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/<\/span>//g' generated/updated_site/*.html
-	sed -i '' 's/<\/span>//g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_.~*=&;/-]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_.~*=&;/-]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g' generated/updated_site/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g' generated/updated_site/blog/*.html
-	sed -i '' 's/\(^.*~~.*$$\)/\1<\/span>/g' generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.~*=&;/-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[0-9]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /\\\()_,.&$^;:+#{}|=~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(^.*~~.*$$\)/\1<\/span>/g' generated/updated_site/blog/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/<\/span>//g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/<\/span>//g' generated/updated_site/*.html generated/updated_site/blog/*.html
 
 
 bookbuild:                                                                   

From 134c5a345be9815908b4fec126bd4eb453bdd261 Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Sat, 4 Jul 2020 06:17:14 -0400
Subject: [PATCH 156/302] tweak build process

---
 Makefile | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Makefile b/Makefile
index 2fdd1f654..a904a0af5 100644
--- a/Makefile
+++ b/Makefile
@@ -25,8 +25,10 @@ prod: run
 	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /\\\()_,.&$^;:+#{}|=~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(^.*~~.*$$\)/\1<\/span>/g' generated/updated_site/blog/*.html generated/updated_site/blog/*.html

From 8e5c335d875eb6f085a8f91e97251afa5110bd96 Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Sat, 4 Jul 2020 12:29:34 -0400
Subject: [PATCH 157/302] cleaning up further code examples page sizes

---
 Makefile                     | 3 +++
 theme/templates/sponsor.html | 1 +
 2 files changed, 4 insertions(+)

diff --git a/Makefile b/Makefile
index a904a0af5..1223ca1fd 100644
--- a/Makefile
+++ b/Makefile
@@ -21,13 +21,16 @@ prod: run
 	sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /\\\()_,.&$^;:+#{}|=~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
diff --git a/theme/templates/sponsor.html b/theme/templates/sponsor.html
index 7c3ac9dd2..6997c5df5 100644
--- a/theme/templates/sponsor.html
+++ b/theme/templates/sponsor.html
@@ -1,5 +1,6 @@
 {% if page.sortorder[0:2] == "01" or page.sortorder[0:2] == "02" or page.sortorder[0:2] == "03" or page.sortorder[0:2] == "04" or page.sortorder[0:2] == "05" or page.sortorder[0:2] == "06" or page.sortorder[0:2] == "50" %}
 {% include "sponsor/sentry.html" %}
+{% include "sponsor/carbon.html" %}
 {% endif %}
 {% if false %}
 {% if page.sortorder[0:2] == "01" or page.sortorder[0:2] == "02" %}

From 314c2ba4114241676be23f70f5c7efed13a7b807 Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Sat, 4 Jul 2020 14:07:33 -0400
Subject: [PATCH 158/302] tweak makefile regex

---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 1223ca1fd..8e6fe19af 100644
--- a/Makefile
+++ b/Makefile
@@ -29,7 +29,7 @@ prod: run
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
-	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
+	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /\\\()_,.&$^;:+#{}|=~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html

From 9e1a257eab07fe7f5fea365f6ef0208f3466ad1b Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Sat, 4 Jul 2020 16:05:44 -0400
Subject: [PATCH 159/302] update descriptions on django and flask examples
 pages to make them more helpful

---
 .../django-contrib-admin-helpers-actionform.markdown  | 10 ++++++++--
 .../django-contrib-admin-helpers-adminform.markdown   | 10 ++++++++--
 .../django/django-contrib-admin-helpers.markdown      | 11 ++++++++---
 .../django/django-extensions-plug-ins.markdown        |  9 +++++++++
 .../examples/flask/flask-app-badrequest.markdown      | 10 ++++++++--
 content/pages/examples/flask/flask-app-flask.markdown |  2 +-
 .../pages/examples/flask/flask-app-headers.markdown   |  2 +-
 .../flask/flask-blueprints-blueprint.markdown         |  2 +-
 .../examples/flask/flask-cli-flaskgroup.markdown      |  2 +-
 .../examples/flask/flask-cli-scriptinfo.markdown      |  2 +-
 .../examples/flask/flask-cli-with-appcontext.markdown |  2 +-
 .../flask/flask-ctx-after-this-request.markdown       |  2 +-
 .../examples/flask/flask-ctx-has-app-context.markdown |  2 +-
 .../flask/flask-ctx-has-request-context.markdown      |  2 +-
 .../examples/flask/flask-globals-current-app.markdown |  2 +-
 content/pages/examples/flask/flask-globals-g.markdown |  2 +-
 .../examples/flask/flask-globals-request.markdown     |  2 +-
 .../examples/flask/flask-globals-session.markdown     |  2 +-
 .../pages/examples/flask/flask-helpers-flash.markdown |  2 +-
 .../flask/flask-helpers-make-response.markdown        |  2 +-
 .../examples/flask/flask-helpers-send-file.markdown   |  2 +-
 .../examples/flask/flask-helpers-url-for.markdown     |  2 +-
 .../examples/flask/flask-json-jsonencoder.markdown    |  2 +-
 .../pages/examples/flask/flask-json-jsonify.markdown  |  2 +-
 .../flask/flask-sessions-badsignature.markdown        |  2 +-
 .../flask/flask-sessions-sessioninterface.markdown    |  2 +-
 .../flask/flask-sessions-sessionmixin.markdown        |  2 +-
 .../flask-signals-got-request-exception.markdown      |  2 +-
 .../examples/flask/flask-signals-namespace.markdown   |  2 +-
 .../flask-templating-render-template-string.markdown  |  2 +-
 .../flask/flask-templating-render-template.markdown   |  2 +-
 .../flask/flask-views-http-method-funcs.markdown      |  2 +-
 .../examples/flask/flask-views-methodview.markdown    |  2 +-
 .../pages/examples/flask/flask-views-view.markdown    |  2 +-
 34 files changed, 70 insertions(+), 38 deletions(-)

diff --git a/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown b/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown
index 8df99e662..322d1d28a 100644
--- a/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown
+++ b/content/pages/examples/django/django-contrib-admin-helpers-actionform.markdown
@@ -1,4 +1,4 @@
-title: django.contrib.admin.helpers ActionForm code examples
+title: django.contrib.admin.helpers ActionForm Example Code
 category: page
 slug: django-contrib-admin-helpers-actionform-examples
 sortorder: 500011020
@@ -7,7 +7,13 @@ sidebartitle: django.contrib.admin.helpers ActionForm
 meta: Python example code for the ActionForm class from the django.contrib.admin.helpers module of the Django project.
 
 
-ActionForm is a class within the django.contrib.admin.helpers module of the Django project.
+[ActionForm](https://github.com/django/django/blob/master/django/contrib/admin/helpers.py)
+is a class within the django.contrib.admin.helpers module of the
+[Django](/django.html) project. It is not typically used when creating
+applications but is sometimes used by libraries that want to extend the
+[actions available](https://docs.djangoproject.com/en/stable/ref/contrib/admin/actions/)
+within the
+[Django Admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/).
 
 
 ## Example 1 from django-import-export
diff --git a/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown b/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown
index 4094a1dd5..27b6fe19d 100644
--- a/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown
+++ b/content/pages/examples/django/django-contrib-admin-helpers-adminform.markdown
@@ -1,4 +1,4 @@
-title: django.contrib.admin.helpers AdminForm code examples
+title: django.contrib.admin.helpers AdminForm Example Code
 category: page
 slug: django-contrib-admin-helpers-adminform-examples
 sortorder: 500011021
@@ -7,7 +7,13 @@ sidebartitle: django.contrib.admin.helpers AdminForm
 meta: Python example code for the AdminForm class from the django.contrib.admin.helpers module of the Django project.
 
 
-AdminForm is a class within the django.contrib.admin.helpers module of the Django project.
+[AdminForm](https://github.com/django/django/blob/master/django/contrib/admin/helpers.py)
+is a class within the django.contrib.admin.helpers module of the
+[Django](/django.html) project. AdminForm is not usually used directly by
+developers but can be used by libraries that want to extend the
+[forms](https://docs.djangoproject.com/en/3.0/ref/contrib/admin/admindocs/)
+within the
+[Django Admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/).
 
 
 ## Example 1 from django-cms
diff --git a/content/pages/examples/django/django-contrib-admin-helpers.markdown b/content/pages/examples/django/django-contrib-admin-helpers.markdown
index abb3a7476..0e32e48f9 100644
--- a/content/pages/examples/django/django-contrib-admin-helpers.markdown
+++ b/content/pages/examples/django/django-contrib-admin-helpers.markdown
@@ -1,13 +1,18 @@
-title: django.contrib.admin helpers code examples
+title: django.contrib.admin helpers Example Code
 category: page
 slug: django-contrib-admin-helpers-examples
 sortorder: 500011017
 toc: False
 sidebartitle: django.contrib.admin helpers
-meta: Python example code for the helpers function from the django.contrib.admin module of the Django project.
+meta: Python example code for the helpers callable from the django.contrib.admin module of the Django project.
 
 
-helpers is a function within the django.contrib.admin module of the Django project.
+[helpers](https://github.com/django/django/blob/master/django/contrib/admin/helpers.py)
+is a module within the [Django](/django.html) project code base. It
+contains classes related to extending the functionality of the
+[Django Admin](https://docs.djangoproject.com/en/3.0/ref/contrib/admin/actions/),
+such as [ActionForm](/django-contrib-admin-helpers-actionform-examples.html)
+and [AdminForm](/django-contrib-admin-helpers-adminform-examples.html).
 
 
 ## Example 1 from django-filer
diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown
index eb7e5fbce..80b74c554 100644
--- a/content/pages/examples/django/django-extensions-plug-ins.markdown
+++ b/content/pages/examples/django/django-extensions-plug-ins.markdown
@@ -331,6 +331,15 @@ django-loginas is open source under the
 [BSD 3-Clause "New" or "Revised" License](https://github.com/skorokithakis/django-loginas/blob/master/LICENSE).
 
 
+### django-markdown-view
+[django-markdown-view](https://github.com/rgs258/django-markdown-view)
+([PyPI package information](https://pypi.org/project/django-markdown-view/))
+is a Django extension for serving [Markdown](/markdown.html) files as
+[Django templates](/django-templates.html). The project is open
+sourced under the 
+[BSD 3-Clause "New" or "Revised" license](https://github.com/rgs258/django-markdown-view/blob/master/LICENSE).
+
+
 ### django-migration-linter
 [django-migration-linter](https://github.com/3YOURMIND/django-migration-linter)
 ([PyPI package information](https://pypi.org/project/django-migration-linter/))
diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown
index 51daeeb0c..681fdde5c 100644
--- a/content/pages/examples/flask/flask-app-badrequest.markdown
+++ b/content/pages/examples/flask/flask-app-badrequest.markdown
@@ -1,4 +1,4 @@
-title: flask.app BadRequest code examples
+title: flask.app BadRequest Example Code
 category: page
 slug: flask-app-badrequest-examples
 sortorder: 500021000
@@ -7,7 +7,13 @@ sidebartitle: flask.app BadRequest
 meta: Python example code for the BadRequest class from the flask.app module of the Flask project.
 
 
-BadRequest is a class within the flask.app module of the Flask project.
+[BadRequest](https://github.com/pallets/flask/blob/master/src/flask/app.py)
+is an [Exception](https://docs.python.org/3/library/exceptions.html#Exception)
+imported into the [Flask](/flask.html) [web framework](/web-frameworks.html)
+from the [Werkzeug](https://github.com/pallets/werkzeug) project. It can occur
+at runtime when an
+[invalid POST request is sent to a URL route](https://stackoverflow.com/questions/14105452/what-is-the-cause-of-the-bad-request-error-when-submitting-form-in-flask-applica)
+that accepts POSTs.
 
 
 ## Example 1 from Flask AppBuilder
diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown
index 49112b6a1..51b544d2a 100644
--- a/content/pages/examples/flask/flask-app-flask.markdown
+++ b/content/pages/examples/flask/flask-app-flask.markdown
@@ -1,4 +1,4 @@
-title: flask.app Flask code examples
+title: flask.app Flask Example Code
 category: page
 slug: flask-app-flask-examples
 sortorder: 500021001
diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown
index 5627cb4c8..75a57099c 100644
--- a/content/pages/examples/flask/flask-app-headers.markdown
+++ b/content/pages/examples/flask/flask-app-headers.markdown
@@ -1,4 +1,4 @@
-title: flask.app Headers code examples
+title: flask.app Headers Example Code
 category: page
 slug: flask-app-headers-examples
 sortorder: 500021002
diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown
index 810d1c1fc..8184a92f1 100644
--- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown
+++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown
@@ -1,4 +1,4 @@
-title: flask.blueprints Blueprint code examples
+title: flask.blueprints Blueprint Example Code
 category: page
 slug: flask-blueprints-blueprint-examples
 sortorder: 500021003
diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown
index 500108616..d644ec613 100644
--- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown
+++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown
@@ -1,4 +1,4 @@
-title: flask.cli FlaskGroup code examples
+title: flask.cli FlaskGroup Example Code
 category: page
 slug: flask-cli-flaskgroup-examples
 sortorder: 500021004
diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown
index 5ccacdfdc..a3233a7a3 100644
--- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown
+++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown
@@ -1,4 +1,4 @@
-title: flask.cli ScriptInfo code examples
+title: flask.cli ScriptInfo Example Code
 category: page
 slug: flask-cli-scriptinfo-examples
 sortorder: 500021005
diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown
index 50ffa28f3..95b1070de 100644
--- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown
+++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown
@@ -1,4 +1,4 @@
-title: flask.cli with_appcontext code examples
+title: flask.cli with_appcontext Example Code
 category: page
 slug: flask-cli-with-appcontext-examples
 sortorder: 500021006
diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown
index bc071e47e..f07da8bdd 100644
--- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown
+++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown
@@ -1,4 +1,4 @@
-title: flask.ctx after_this_request code examples
+title: flask.ctx after_this_request Example Code
 category: page
 slug: flask-ctx-after-this-request-examples
 sortorder: 500021007
diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown
index 9c5321c3e..3740203ba 100644
--- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown
+++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown
@@ -1,4 +1,4 @@
-title: flask.ctx has_app_context code examples
+title: flask.ctx has_app_context Example Code
 category: page
 slug: flask-ctx-has-app-context-examples
 sortorder: 500021008
diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown
index 0fc833106..245536763 100644
--- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown
+++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown
@@ -1,4 +1,4 @@
-title: flask.ctx has_request_context code examples
+title: flask.ctx has_request_context Example Code
 category: page
 slug: flask-ctx-has-request-context-examples
 sortorder: 500021009
diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown
index 6e5369d7d..ee387766c 100644
--- a/content/pages/examples/flask/flask-globals-current-app.markdown
+++ b/content/pages/examples/flask/flask-globals-current-app.markdown
@@ -1,4 +1,4 @@
-title: flask.globals current_app code examples
+title: flask.globals current_app Example Code
 category: page
 slug: flask-globals-current-app-examples
 sortorder: 500021010
diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown
index 45f967df1..1bbfde3a8 100644
--- a/content/pages/examples/flask/flask-globals-g.markdown
+++ b/content/pages/examples/flask/flask-globals-g.markdown
@@ -1,4 +1,4 @@
-title: flask.globals g code examples
+title: flask.globals g Example Code
 category: page
 slug: flask-globals-g-examples
 sortorder: 500021011
diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown
index 2bac4d1e3..d478f83a1 100644
--- a/content/pages/examples/flask/flask-globals-request.markdown
+++ b/content/pages/examples/flask/flask-globals-request.markdown
@@ -1,4 +1,4 @@
-title: flask.globals request code examples
+title: flask.globals request Example Code
 category: page
 slug: flask-globals-request-examples
 sortorder: 500021012
diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown
index a78becf98..5b12f08e7 100644
--- a/content/pages/examples/flask/flask-globals-session.markdown
+++ b/content/pages/examples/flask/flask-globals-session.markdown
@@ -1,4 +1,4 @@
-title: flask.globals session code examples
+title: flask.globals session Example Code
 category: page
 slug: flask-globals-session-examples
 sortorder: 500021013
diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown
index 612416755..bb5426fae 100644
--- a/content/pages/examples/flask/flask-helpers-flash.markdown
+++ b/content/pages/examples/flask/flask-helpers-flash.markdown
@@ -1,4 +1,4 @@
-title: flask.helpers flash code examples
+title: flask.helpers flash Example Code
 category: page
 slug: flask-helpers-flash-examples
 sortorder: 500021014
diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown
index cdd8819d4..40bc82c42 100644
--- a/content/pages/examples/flask/flask-helpers-make-response.markdown
+++ b/content/pages/examples/flask/flask-helpers-make-response.markdown
@@ -1,4 +1,4 @@
-title: flask.helpers make_response code examples
+title: flask.helpers make_response Example Code
 category: page
 slug: flask-helpers-make-response-examples
 sortorder: 500021015
diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown
index 3f61c1def..4d13eefbb 100644
--- a/content/pages/examples/flask/flask-helpers-send-file.markdown
+++ b/content/pages/examples/flask/flask-helpers-send-file.markdown
@@ -1,4 +1,4 @@
-title: flask.helpers send_file code examples
+title: flask.helpers send_file Example Code
 category: page
 slug: flask-helpers-send-file-examples
 sortorder: 500021016
diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown
index 42d1c1503..45a72f7c5 100644
--- a/content/pages/examples/flask/flask-helpers-url-for.markdown
+++ b/content/pages/examples/flask/flask-helpers-url-for.markdown
@@ -1,4 +1,4 @@
-title: flask.helpers url_for code examples
+title: flask.helpers url_for Example Code
 category: page
 slug: flask-helpers-url-for-examples
 sortorder: 500021017
diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown
index 5c605bfe2..ce0608aa4 100644
--- a/content/pages/examples/flask/flask-json-jsonencoder.markdown
+++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown
@@ -1,4 +1,4 @@
-title: flask.json JSONEncoder code examples
+title: flask.json JSONEncoder Example Code
 category: page
 slug: flask-json-jsonencoder-examples
 sortorder: 500021018
diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown
index df1f41a83..79959671c 100644
--- a/content/pages/examples/flask/flask-json-jsonify.markdown
+++ b/content/pages/examples/flask/flask-json-jsonify.markdown
@@ -1,4 +1,4 @@
-title: flask.json jsonify code examples
+title: flask.json jsonify Example Code
 category: page
 slug: flask-json-jsonify-examples
 sortorder: 500021019
diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown
index 8d83c42ff..7a9090d82 100644
--- a/content/pages/examples/flask/flask-sessions-badsignature.markdown
+++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown
@@ -1,4 +1,4 @@
-title: flask.sessions BadSignature code examples
+title: flask.sessions BadSignature Example Code
 category: page
 slug: flask-sessions-badsignature-examples
 sortorder: 500021020
diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown
index 9f1671b9d..6967174a7 100644
--- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown
+++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown
@@ -1,4 +1,4 @@
-title: flask.sessions SessionInterface code examples
+title: flask.sessions SessionInterface Example Code
 category: page
 slug: flask-sessions-sessioninterface-examples
 sortorder: 500021021
diff --git a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown
index 07c68bbe7..4bbbcc955 100644
--- a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown
+++ b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown
@@ -1,4 +1,4 @@
-title: flask.sessions SessionMixin code examples
+title: flask.sessions SessionMixin Example Code
 category: page
 slug: flask-sessions-sessionmixin-examples
 sortorder: 500021022
diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown
index b6985e212..27020f08d 100644
--- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown
+++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown
@@ -1,4 +1,4 @@
-title: flask.signals got_request_exception code examples
+title: flask.signals got_request_exception Example Code
 category: page
 slug: flask-signals-got-request-exception-examples
 sortorder: 500021024
diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown
index 241617235..a7c9eccb8 100644
--- a/content/pages/examples/flask/flask-signals-namespace.markdown
+++ b/content/pages/examples/flask/flask-signals-namespace.markdown
@@ -1,4 +1,4 @@
-title: flask.signals Namespace code examples
+title: flask.signals Namespace Example Code
 category: page
 slug: flask-signals-namespace-examples
 sortorder: 500021023
diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown
index 41ceee074..5378c9263 100644
--- a/content/pages/examples/flask/flask-templating-render-template-string.markdown
+++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown
@@ -1,4 +1,4 @@
-title: flask.templating render_template_string code examples
+title: flask.templating render_template_string Example Code
 category: page
 slug: flask-templating-render-template-string-examples
 sortorder: 500021026
diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown
index f1012a501..05c50cb48 100644
--- a/content/pages/examples/flask/flask-templating-render-template.markdown
+++ b/content/pages/examples/flask/flask-templating-render-template.markdown
@@ -1,4 +1,4 @@
-title: flask.templating render_template code examples
+title: flask.templating render_template Example Code
 category: page
 slug: flask-templating-render-template-examples
 sortorder: 500021025
diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown
index 8e06991ad..e7c784b05 100644
--- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown
+++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown
@@ -1,4 +1,4 @@
-title: flask.views http_method_funcs code examples
+title: flask.views http_method_funcs Example Code
 category: page
 slug: flask-views-http-method-funcs-examples
 sortorder: 500021029
diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown
index b6291f98f..6c807bbce 100644
--- a/content/pages/examples/flask/flask-views-methodview.markdown
+++ b/content/pages/examples/flask/flask-views-methodview.markdown
@@ -1,4 +1,4 @@
-title: flask.views MethodView code examples
+title: flask.views MethodView Example Code
 category: page
 slug: flask-views-methodview-examples
 sortorder: 500021027
diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown
index b3e022637..3aeb0c801 100644
--- a/content/pages/examples/flask/flask-views-view.markdown
+++ b/content/pages/examples/flask/flask-views-view.markdown
@@ -1,4 +1,4 @@
-title: flask.views View code examples
+title: flask.views View Example Code
 category: page
 slug: flask-views-view-examples
 sortorder: 500021028

From 034a50ce695ef28979fa94d65cda1d28d96d4dea Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Sat, 4 Jul 2020 17:06:39 -0400
Subject: [PATCH 160/302] working on more helpful descriptions for flask code
 examples

---
 content/pages/examples/flask/flask-app-flask.markdown    | 7 ++++++-
 content/pages/examples/flask/flask-app-headers.markdown  | 9 ++++++++-
 .../examples/flask/flask-blueprints-blueprint.markdown   | 4 ++++
 .../pages/examples/flask/flask-cli-flaskgroup.markdown   | 6 +++++-
 .../pages/examples/flask/flask-cli-scriptinfo.markdown   | 6 +++++-
 5 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown
index 51b544d2a..f59773d3a 100644
--- a/content/pages/examples/flask/flask-app-flask.markdown
+++ b/content/pages/examples/flask/flask-app-flask.markdown
@@ -7,7 +7,12 @@ sidebartitle: flask.app Flask
 meta: Python example code for the Flask class from the flask.app module of the Flask project.
 
 
-Flask is a class within the flask.app module of the Flask project.
+[Flask](https://github.com/pallets/flask/blob/master/src/flask/app.py) is
+a class within the flask.app module of the [Flask](/flask.html) framework
+that implements the [WSGI application specification](/wsgi-servers.html).
+This class acts as a central registry for a significant amount of a Flask
+application's functionality, including URL rounting,
+[template configurations](/template-engines.html), and handling view functions.
 
 
 ## Example 1 from Braintree Flask app
diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown
index 75a57099c..dd364c3aa 100644
--- a/content/pages/examples/flask/flask-app-headers.markdown
+++ b/content/pages/examples/flask/flask-app-headers.markdown
@@ -7,7 +7,14 @@ sidebartitle: flask.app Headers
 meta: Python example code for the Headers class from the flask.app module of the Flask project.
 
 
-Headers is a class within the flask.app module of the Flask project.
+[Headers](https://github.com/pallets/flask/blob/master/src/flask/app.py)
+is class within the flask.app module of the [Flask](/flask.html)
+[web framework](/web-frameworks.html) that is imported from the
+[datastructures](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/datastructures.py)
+module of the [Werkzeug](https://palletsprojects.com/p/werkzeug/) project.
+Headers handles the
+[HTTP headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
+from requests and responses for Flask web applications.
 
 
 ## Example 1 from flask-restx
diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown
index 8184a92f1..49931e796 100644
--- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown
+++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown
@@ -9,6 +9,10 @@ meta: Python example code for the Blueprint class from the flask.blueprints modu
 
 A Blueprint in [Flask](/flask.html) is
 [a "mold" or template for creating parts of web applications](https://stackoverflow.com/questions/24420857/what-are-flask-blueprints-exactly).
+This
+[Blueprint](https://github.com/pallets/flask/blob/master/src/flask/blueprints.py)
+class within the flask.blueprints module implements that functionality
+for Flask web apps.
 
 
 ## Example 1 from Flask AppBuilder
diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown
index d644ec613..ae925e46f 100644
--- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown
+++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown
@@ -7,7 +7,11 @@ sidebartitle: flask.cli FlaskGroup
 meta: Python example code for the FlaskGroup class from the flask.cli module of the Flask project.
 
 
-FlaskGroup is a class within the flask.cli module of the Flask project.
+[FlaskGroup](https://github.com/pallets/flask/blob/master/src/flask/cli.py)
+is a class within the flask.cli module of the Flask project. FlaskGroup
+is a subclass of AppGroup that provides for loading more commands from
+a configured Flask app. Generally, only advanced use cases will need to
+use this class.
 
 
 ## Example 1 from FlaskBB
diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown
index a3233a7a3..bde9c6ee8 100644
--- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown
+++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown
@@ -7,7 +7,11 @@ sidebartitle: flask.cli ScriptInfo
 meta: Python example code for the ScriptInfo class from the flask.cli module of the Flask project.
 
 
-ScriptInfo is a class within the flask.cli module of the Flask project.
+[ScriptInfo](https://github.com/pallets/flask/blob/master/src/flask/cli.py)
+is a class within the flask.app module of the [Flask](/flask.html)
+framework. It is a helper object for Flask application and not usually
+dealt with directly by developers, instead it is created automatically
+by the [FlaskGroup](/flask-cli-flaskgroup-examples.html) object.
 
 
 ## Example 1 from FlaskBB

From 4774121faab2c4f153d488f8d83026ed57085cd3 Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Sat, 4 Jul 2020 17:11:20 -0400
Subject: [PATCH 161/302] cleaning up a few 404 links

---
 content/pages/02-development-environments/19-git.markdown    | 5 -----
 content/pages/03-data/14-neo4j.markdown                      | 5 -----
 .../sqlalchemy/sqlalchemy-extensions-plug-ins.markdown       | 2 +-
 3 files changed, 1 insertion(+), 11 deletions(-)

diff --git a/content/pages/02-development-environments/19-git.markdown b/content/pages/02-development-environments/19-git.markdown
index adf03293e..ce70f3b16 100644
--- a/content/pages/02-development-environments/19-git.markdown
+++ b/content/pages/02-development-environments/19-git.markdown
@@ -195,11 +195,6 @@ workflow. These resources will come in handy for specific Git subjects.
   through example Git commands. This is a highly recommended read after you've
   grasped the basics and are looking to go deeper with Git.
 
-* [How To Host Your Own Private Git Repositories](https://eklitzke.org/how-to-how-your-own-private-git-repositories)
-  provides the steps for handling private Git repositories on your own
-  server. This setup is great for either mirroring GitHub repositories
-  or just getting away from hosted services entirely.
-
 * [How I configure my git in a new computer](https://medium.com/@Tiagojdferreira/how-i-set-up-my-git-in-a-new-computer-85bb461b089f)
   shows how to handle a `.gitconfig` file, with 
   [an example Gist](https://gist.github.com/Tiagojdferreira/115ecac229e176e48d520c59b022e4fb) 
diff --git a/content/pages/03-data/14-neo4j.markdown b/content/pages/03-data/14-neo4j.markdown
index 13f4cf29c..d53b5711c 100644
--- a/content/pages/03-data/14-neo4j.markdown
+++ b/content/pages/03-data/14-neo4j.markdown
@@ -35,11 +35,6 @@ of the database.
   Transform and Load (ETL) tool to move your data from one database such as
   [MySQL](/mysql.html) into Neo4j.
 
-* [Migrating from MySQL to Neo4j](https://engineering.logicgate.com/migrating-from-mysql-to-neo4j-2f6cb63a73c8)
-  gives specific advice about how your data can change during a migration from
-  a relational database to a graph database which the author did not know 
-  before undertaking their own migration.
-
 
 ### Neo4j resources
 * [Building a Recommendation Engine with Neo4j and Python](https://www.youtube.com/watch?v=ILjTikVhT9k)
diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown
index a49881abe..1ab3ec1f0 100644
--- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown
+++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown
@@ -148,7 +148,7 @@ sourced under the
 and
 [PyPI package information](https://pypi.org/project/SQLAlchemy-Utils/))
 is a code library with various helper functions and new data types 
-that make it easier to use [SQLAlchemy](/sqlachemy.html) when building
+that make it easier to use [SQLAlchemy](/sqlalchemy.html) when building
 projects that involve more specific storage requirements such as
 [currency](https://sqlalchemy-utils.readthedocs.io/en/latest/data_types.html#module-sqlalchemy_utils.types.currency).
 The wide array of 

From 6e60a1e4c453bcaabcc5846b45fb4a6537829527 Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Sat, 4 Jul 2020 18:18:14 -0400
Subject: [PATCH 162/302] adding further flask code examples

---
 .../flask/flask-blueprints-blueprint.markdown | 118 +++++++++++++-
 .../flask/flask-cli-with-appcontext.markdown  |   6 +-
 .../flask/flask-extensions-plug-ins.markdown  |  11 ++
 .../flask/flask-globals-current-app.markdown  | 148 ++++++++++++++++--
 .../flask/flask-helpers-url-for.markdown      | 106 ++++++++++++-
 5 files changed, 361 insertions(+), 28 deletions(-)

diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown
index 49931e796..b2d30ec11 100644
--- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown
+++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown
@@ -323,7 +323,111 @@ def create_author():
 ```
 
 
-## Example 5 from flask-debugtoolbar
+## Example 5 from Flask-Bootstrap
+[flask-bootstrap](https://github.com/mbr/flask-bootstrap)
+([PyPI package information](https://pypi.org/project/Flask-Bootstrap/))
+makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html)
+in your [Flask](/flask.html) applications with less boilerplate
+code. The project was primarily created by
+[Marc Brinkmann @mbr](https://github.com/mbr) and the source code is
+open sourced under the
+[Apache 2.0 license](https://github.com/mbr/flask-bootstrap/blob/master/LICENSE).
+
+[**Flask-Bootstrap / flask_bootstrap / __init__.py**](https://github.com/mbr/flask-bootstrap/blob/master/flask_bootstrap/./__init__.py)
+
+```python
+# __init__.py
+
+import re
+
+~~from flask import Blueprint, current_app, url_for
+
+try:
+    from wtforms.fields import HiddenField
+except ImportError:
+
+    def is_hidden_field_filter(field):
+        raise RuntimeError('WTForms is not installed.')
+else:
+
+    def is_hidden_field_filter(field):
+        return isinstance(field, HiddenField)
+
+
+from .forms import render_form
+
+__version__ = '3.3.7.1.dev1'
+BOOTSTRAP_VERSION = re.sub(r'^(\d+\.\d+\.\d+).*', r'\1', __version__)
+JQUERY_VERSION = '1.12.4'
+HTML5SHIV_VERSION = '3.7.3'
+RESPONDJS_VERSION = '1.4.2'
+
+
+class CDN(object):
+
+
+
+## ... source file abbreviated to get to Blueprint examples ...
+
+
+        filename = '%s.min.%s' % tuple(filename.rsplit('.', 1))
+
+    cdns = current_app.extensions['bootstrap']['cdns']
+    resource_url = cdns[cdn].get_resource_url(filename)
+
+    if resource_url.startswith('//') and config['BOOTSTRAP_CDN_FORCE_SSL']:
+        resource_url = 'https:%s' % resource_url
+
+    return resource_url
+
+
+class Bootstrap(object):
+    def __init__(self, app=None):
+        if app is not None:
+            self.init_app(app)
+
+    def init_app(self, app):
+        app.config.setdefault('BOOTSTRAP_USE_MINIFIED', True)
+        app.config.setdefault('BOOTSTRAP_CDN_FORCE_SSL', False)
+
+        app.config.setdefault('BOOTSTRAP_QUERYSTRING_REVVING', True)
+        app.config.setdefault('BOOTSTRAP_SERVE_LOCAL', False)
+
+        app.config.setdefault('BOOTSTRAP_LOCAL_SUBDOMAIN', None)
+
+~~        blueprint = Blueprint(
+            'bootstrap',
+            __name__,
+            template_folder='templates',
+            static_folder='static',
+            static_url_path=app.static_url_path + '/bootstrap',
+            subdomain=app.config['BOOTSTRAP_LOCAL_SUBDOMAIN'])
+
+        blueprint.add_app_template_filter(render_form)
+
+        app.register_blueprint(blueprint)
+
+        app.jinja_env.globals['bootstrap_is_hidden_field'] =\
+            is_hidden_field_filter
+        app.jinja_env.globals['bootstrap_find_resource'] =\
+            bootstrap_find_resource
+        app.jinja_env.add_extension('jinja2.ext.do')
+
+        if not hasattr(app, 'extensions'):
+            app.extensions = {}
+
+        local = StaticCDN('bootstrap.static', rev=True)
+        static = StaticCDN()
+
+        def lwrap(cdn, primary=static):
+
+
+## ... source file continues with no further Blueprint examples...
+
+```
+
+
+## Example 6 from flask-debugtoolbar
 [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar)
 ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/)
 and
@@ -393,7 +497,7 @@ class DebugToolbarExtension(object):
 ```
 
 
-## Example 6 from flask-restx
+## Example 7 from flask-restx
 [Flask RESTX](https://github.com/python-restx/flask-restx) is an
 extension that makes it easier to build
 [RESTful APIs](/application-programming-interfaces.html) into
@@ -445,7 +549,7 @@ def swagger_static(filename):
 ```
 
 
-## Example 7 from Flask-WTF
+## Example 8 from Flask-WTF
 [Flask-WTF](https://github.com/lepture/flask-wtf)
 ([project documentation](https://flask-wtf.readthedocs.io/en/stable/)
 and
@@ -553,7 +657,7 @@ def generate_csrf(secret_key=None, token_key=None):
 ```
 
 
-## Example 8 from Flask-User
+## Example 9 from Flask-User
 [Flask-User](https://github.com/lingthio/Flask-User)
 ([PyPI information](https://pypi.org/project/Flask-User/)
 and
@@ -660,7 +764,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views)
 ```
 
 
-## Example 9 from Flask-VueJs-Template
+## Example 10 from Flask-VueJs-Template
 [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template)
 ([demo site](https://flask-vuejs-template.herokuapp.com/))
 is a minimal [Flask](/flask.html) boilerplate starter project that
@@ -692,7 +796,7 @@ import os
 ```
 
 
-## Example 10 from Datadog Flask Example App
+## Example 11 from Datadog Flask Example App
 The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask)
 contains many examples of the [Flask](/flask.html) core functions
 available to a developer using the [web framework](/web-frameworks.html).
@@ -739,7 +843,7 @@ def bp_after_request(response):
 ```
 
 
-## Example 11 from tedivms-flask
+## Example 12 from tedivms-flask
 [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a
 base of [Flask](/flask.html) code and related projects such as
 [Celery](/celery.html) which provides a template to start your own
diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown
index 95b1070de..a09c6ba00 100644
--- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown
+++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown
@@ -7,7 +7,11 @@ sidebartitle: flask.cli with_appcontext
 meta: Python example code for the with_appcontext callable from the flask.cli module of the Flask project.
 
 
-with_appcontext is a callable within the flask.cli module of the Flask project.
+[with_appcontext](https://github.com/pallets/flask/blob/master/src/flask/cli.py)
+is a [Flask](/flask.html) decorator in the flask.cli module that
+wraps a callback to guarantee it will be called with a script's
+application context. Any callbacks registered with `app.cli` are
+wrapped with this function by default.
 
 
 ## Example 1 from FlaskBB
diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown
index 7a01da841..24cf1bb35 100644
--- a/content/pages/examples/flask/flask-extensions-plug-ins.markdown
+++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown
@@ -65,6 +65,17 @@ flask-base's code is open sourced
 [under the MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md).
 
 
+### flask-bootstrap
+[flask-bootstrap](https://github.com/mbr/flask-bootstrap)
+([PyPI package information](https://pypi.org/project/Flask-Bootstrap/))
+makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html)
+in your [Flask](/flask.html) applications with less boilerplate
+code. The project was primarily created by
+[Marc Brinkmann @mbr](https://github.com/mbr) and the source code is
+open sourced under the
+[Apache 2.0 license](https://github.com/mbr/flask-bootstrap/blob/master/LICENSE).
+
+
 ### Flask Debug-toolbar
 [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar)
 ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/)
diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown
index ee387766c..510a45aa0 100644
--- a/content/pages/examples/flask/flask-globals-current-app.markdown
+++ b/content/pages/examples/flask/flask-globals-current-app.markdown
@@ -509,7 +509,131 @@ app.register_blueprint(admin, url_prefix="//admin")
 ```
 
 
-## Example 5 from flask-debugtoolbar
+## Example 5 from Flask-Bootstrap
+[flask-bootstrap](https://github.com/mbr/flask-bootstrap)
+([PyPI package information](https://pypi.org/project/Flask-Bootstrap/))
+makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html)
+in your [Flask](/flask.html) applications with less boilerplate
+code. The project was primarily created by
+[Marc Brinkmann @mbr](https://github.com/mbr) and the source code is
+open sourced under the
+[Apache 2.0 license](https://github.com/mbr/flask-bootstrap/blob/master/LICENSE).
+
+[**Flask-Bootstrap / flask_bootstrap / __init__.py**](https://github.com/mbr/flask-bootstrap/blob/master/flask_bootstrap/./__init__.py)
+
+```python
+# __init__.py
+
+import re
+
+~~from flask import Blueprint, current_app, url_for
+
+try:
+    from wtforms.fields import HiddenField
+except ImportError:
+
+    def is_hidden_field_filter(field):
+        raise RuntimeError('WTForms is not installed.')
+else:
+
+    def is_hidden_field_filter(field):
+        return isinstance(field, HiddenField)
+
+
+from .forms import render_form
+
+__version__ = '3.3.7.1.dev1'
+BOOTSTRAP_VERSION = re.sub(r'^(\d+\.\d+\.\d+).*', r'\1', __version__)
+JQUERY_VERSION = '1.12.4'
+HTML5SHIV_VERSION = '3.7.3'
+RESPONDJS_VERSION = '1.4.2'
+
+
+class CDN(object):
+
+    def get_resource_url(self, filename):
+        raise NotImplementedError
+
+
+class StaticCDN(object):
+
+    def __init__(self, static_endpoint='static', rev=False):
+        self.static_endpoint = static_endpoint
+        self.rev = rev
+
+    def get_resource_url(self, filename):
+        extra_args = {}
+
+~~        if self.rev and current_app.config['BOOTSTRAP_QUERYSTRING_REVVING']:
+            extra_args['bootstrap'] = __version__
+
+        return url_for(self.static_endpoint, filename=filename, **extra_args)
+
+
+class WebCDN(object):
+
+    def __init__(self, baseurl):
+        self.baseurl = baseurl
+
+    def get_resource_url(self, filename):
+        return self.baseurl + filename
+
+
+class ConditionalCDN(object):
+
+    def __init__(self, confvar, primary, fallback):
+        self.confvar = confvar
+        self.primary = primary
+        self.fallback = fallback
+
+    def get_resource_url(self, filename):
+~~        if current_app.config[self.confvar]:
+            return self.primary.get_resource_url(filename)
+        return self.fallback.get_resource_url(filename)
+
+
+def bootstrap_find_resource(filename, cdn, use_minified=None, local=True):
+~~    config = current_app.config
+
+    if None == use_minified:
+        use_minified = config['BOOTSTRAP_USE_MINIFIED']
+
+    if use_minified:
+        filename = '%s.min.%s' % tuple(filename.rsplit('.', 1))
+
+~~    cdns = current_app.extensions['bootstrap']['cdns']
+    resource_url = cdns[cdn].get_resource_url(filename)
+
+    if resource_url.startswith('//') and config['BOOTSTRAP_CDN_FORCE_SSL']:
+        resource_url = 'https:%s' % resource_url
+
+    return resource_url
+
+
+class Bootstrap(object):
+    def __init__(self, app=None):
+        if app is not None:
+            self.init_app(app)
+
+    def init_app(self, app):
+        app.config.setdefault('BOOTSTRAP_USE_MINIFIED', True)
+        app.config.setdefault('BOOTSTRAP_CDN_FORCE_SSL', False)
+
+        app.config.setdefault('BOOTSTRAP_QUERYSTRING_REVVING', True)
+        app.config.setdefault('BOOTSTRAP_SERVE_LOCAL', False)
+
+        app.config.setdefault('BOOTSTRAP_LOCAL_SUBDOMAIN', None)
+
+        blueprint = Blueprint(
+            'bootstrap',
+
+
+## ... source file continues with no further current_app examples...
+
+```
+
+
+## Example 6 from flask-debugtoolbar
 [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar)
 ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/)
 and
@@ -657,7 +781,7 @@ def replace_insensitive(string, target, replacement):
 ```
 
 
-## Example 6 from flask_jsondash
+## Example 7 from flask_jsondash
 [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a
 configurable web application built in Flask that creates charts and
 dashboards from arbitrary API endpoints. Everything for the web app
@@ -750,7 +874,7 @@ def local_static(chart_config, static_config):
 ```
 
 
-## Example 7 from flask-login
+## Example 8 from flask-login
 [Flask-Login](https://github.com/maxcountryman/flask-login)
 ([project documentation](https://flask-login.readthedocs.io/en/latest/)
 and [PyPI package](https://pypi.org/project/Flask-Login/))
@@ -997,7 +1121,7 @@ def _secret_key(key=None):
 ```
 
 
-## Example 8 from flask-restx
+## Example 9 from flask-restx
 [Flask RESTX](https://github.com/python-restx/flask-restx) is an
 extension that makes it easier to build
 [RESTful APIs](/application-programming-interfaces.html) into
@@ -1254,7 +1378,7 @@ def _clean_header(header):
 ```
 
 
-## Example 9 from flask-sqlalchemy
+## Example 10 from flask-sqlalchemy
 [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy)
 ([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/)
 and
@@ -1371,7 +1495,7 @@ def _make_table(db):
 ```
 
 
-## Example 10 from Flask-WTF
+## Example 11 from Flask-WTF
 [Flask-WTF](https://github.com/lepture/flask-wtf)
 ([project documentation](https://flask-wtf.readthedocs.io/en/stable/)
 and
@@ -1628,7 +1752,7 @@ def same_origin(current_uri, compare_uri):
 ```
 
 
-## Example 11 from Flask-Security-Too
+## Example 12 from Flask-Security-Too
 [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/)
 ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and
 [project documentation](https://flask-security-too.readthedocs.io/en/stable/))
@@ -1889,7 +2013,7 @@ _default_config = {
 ```
 
 
-## Example 12 from Flask-User
+## Example 13 from Flask-User
 [Flask-User](https://github.com/lingthio/Flask-User)
 ([PyPI information](https://pypi.org/project/Flask-User/)
 and
@@ -1996,7 +2120,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views)
 ```
 
 
-## Example 13 from Flask-VueJs-Template
+## Example 14 from Flask-VueJs-Template
 [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template)
 ([demo site](https://flask-vuejs-template.herokuapp.com/))
 is a minimal [Flask](/flask.html) boilerplate starter project that
@@ -2037,7 +2161,7 @@ def index_client():
 ```
 
 
-## Example 14 from Flasky
+## Example 15 from Flasky
 [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful
 example application by
 [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds
@@ -2092,7 +2216,7 @@ def run_migrations_online():
 ```
 
 
-## Example 15 from sandman2
+## Example 16 from sandman2
 [sandman2](https://github.com/jeffknupp/sandman2)
 ([project documentation](https://sandman2.readthedocs.io/en/latest/)
 and
@@ -2217,7 +2341,7 @@ def register_model(cls, admin=None):
 ```
 
 
-## Example 16 from tedivms-flask
+## Example 17 from tedivms-flask
 [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a
 base of [Flask](/flask.html) code and related projects such as
 [Celery](/celery.html) which provides a template to start your own
diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown
index 45a72f7c5..c3458fa08 100644
--- a/content/pages/examples/flask/flask-helpers-url-for.markdown
+++ b/content/pages/examples/flask/flask-helpers-url-for.markdown
@@ -225,7 +225,97 @@ class CustomSelectField(Field):
 ```
 
 
-## Example 4 from flask-debugtoolbar
+## Example 4 from Flask-Bootstrap
+[flask-bootstrap](https://github.com/mbr/flask-bootstrap)
+([PyPI package information](https://pypi.org/project/Flask-Bootstrap/))
+makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html)
+in your [Flask](/flask.html) applications with less boilerplate
+code. The project was primarily created by
+[Marc Brinkmann @mbr](https://github.com/mbr) and the source code is
+open sourced under the
+[Apache 2.0 license](https://github.com/mbr/flask-bootstrap/blob/master/LICENSE).
+
+[**Flask-Bootstrap / flask_bootstrap / __init__.py**](https://github.com/mbr/flask-bootstrap/blob/master/flask_bootstrap/./__init__.py)
+
+```python
+# __init__.py
+
+import re
+
+~~from flask import Blueprint, current_app, url_for
+
+try:
+    from wtforms.fields import HiddenField
+except ImportError:
+
+    def is_hidden_field_filter(field):
+        raise RuntimeError('WTForms is not installed.')
+else:
+
+    def is_hidden_field_filter(field):
+        return isinstance(field, HiddenField)
+
+
+from .forms import render_form
+
+__version__ = '3.3.7.1.dev1'
+BOOTSTRAP_VERSION = re.sub(r'^(\d+\.\d+\.\d+).*', r'\1', __version__)
+JQUERY_VERSION = '1.12.4'
+HTML5SHIV_VERSION = '3.7.3'
+RESPONDJS_VERSION = '1.4.2'
+
+
+class CDN(object):
+
+    def get_resource_url(self, filename):
+        raise NotImplementedError
+
+
+class StaticCDN(object):
+
+    def __init__(self, static_endpoint='static', rev=False):
+        self.static_endpoint = static_endpoint
+        self.rev = rev
+
+    def get_resource_url(self, filename):
+        extra_args = {}
+
+        if self.rev and current_app.config['BOOTSTRAP_QUERYSTRING_REVVING']:
+            extra_args['bootstrap'] = __version__
+
+~~        return url_for(self.static_endpoint, filename=filename, **extra_args)
+
+
+class WebCDN(object):
+
+    def __init__(self, baseurl):
+        self.baseurl = baseurl
+
+    def get_resource_url(self, filename):
+        return self.baseurl + filename
+
+
+class ConditionalCDN(object):
+
+    def __init__(self, confvar, primary, fallback):
+        self.confvar = confvar
+        self.primary = primary
+        self.fallback = fallback
+
+    def get_resource_url(self, filename):
+        if current_app.config[self.confvar]:
+            return self.primary.get_resource_url(filename)
+        return self.fallback.get_resource_url(filename)
+
+
+
+
+## ... source file continues with no further url_for examples...
+
+```
+
+
+## Example 5 from flask-debugtoolbar
 [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar)
 ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/)
 and
@@ -292,7 +382,7 @@ class DebugToolbar(object):
 ```
 
 
-## Example 5 from flask-login
+## Example 6 from flask-login
 [Flask-Login](https://github.com/maxcountryman/flask-login)
 ([project documentation](https://flask-login.readthedocs.io/en/latest/)
 and [PyPI package](https://pypi.org/project/Flask-Login/))
@@ -392,7 +482,7 @@ def login_user(user, remember=False, duration=None, force=False, fresh=True):
 ```
 
 
-## Example 6 from flask-restx
+## Example 7 from flask-restx
 [Flask RESTX](https://github.com/python-restx/flask-restx) is an
 extension that makes it easier to build
 [RESTful APIs](/application-programming-interfaces.html) into
@@ -447,7 +537,7 @@ def ui_for(api):
 ```
 
 
-## Example 7 from flaskSaaS
+## Example 8 from flaskSaaS
 [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate
 starter project to build a software-as-a-service (SaaS) web application
 in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The
@@ -588,7 +678,7 @@ def reset(token):
 ```
 
 
-## Example 8 from Flask-Security-Too
+## Example 9 from Flask-Security-Too
 [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/)
 ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and
 [project documentation](https://flask-security-too.readthedocs.io/en/stable/))
@@ -708,7 +798,7 @@ def get_post_action_redirect(config_key, declared=None):
 ```
 
 
-## Example 9 from Flask-User
+## Example 10 from Flask-User
 [Flask-User](https://github.com/lingthio/Flask-User)
 ([PyPI information](https://pypi.org/project/Flask-User/)
 and
@@ -857,7 +947,7 @@ class EmailManager(object):
 ```
 
 
-## Example 10 from Flasky
+## Example 11 from Flasky
 [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful
 example application by
 [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds
@@ -1057,7 +1147,7 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body)
 ```
 
 
-## Example 11 from Datadog Flask Example App
+## Example 12 from Datadog Flask Example App
 The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask)
 contains many examples of the [Flask](/flask.html) core functions
 available to a developer using the [web framework](/web-frameworks.html).

From 5a10de057525e31abed10b32ff985a4568fa73ea Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Sat, 4 Jul 2020 18:29:46 -0400
Subject: [PATCH 163/302] fix several broken links

---
 content/pages/03-data/17-scipy-numpy.markdown             | 2 +-
 content/pages/03-data/18-data-visualization.markdown      | 4 +---
 content/pages/04-web-development/39-code-metrics.markdown | 4 ----
 content/pages/04-web-development/47-bots.markdown         | 2 +-
 .../pages/04-web-development/51-api-integration.markdown  | 4 ++--
 content/pages/05-deployment/00-deployment.markdown        | 8 --------
 6 files changed, 5 insertions(+), 19 deletions(-)

diff --git a/content/pages/03-data/17-scipy-numpy.markdown b/content/pages/03-data/17-scipy-numpy.markdown
index 02e399b76..b6350d46a 100644
--- a/content/pages/03-data/17-scipy-numpy.markdown
+++ b/content/pages/03-data/17-scipy-numpy.markdown
@@ -70,7 +70,7 @@ following resources are broader walkthroughs for the SciPy ecosystem:
 * [Math to Code](https://mathtocode.com/) provides an interactive
   tutorial to learn how to implement math in NumPy.
 
-* [101 NumPy Exercises for Data Analysis](https://www.machinelearningplus.com/101-numpy-exercises-python/)
+* [101 NumPy Exercises for Data Analysis](https://www.machinelearningplus.com/python/101-numpy-exercises-python/)
 
 * [NumPy: creating and manipulating numerical data](http://www.scipy-lectures.org/intro/numpy/index.html)
 
diff --git a/content/pages/03-data/18-data-visualization.markdown b/content/pages/03-data/18-data-visualization.markdown
index 4afed46ca..af18aada8 100644
--- a/content/pages/03-data/18-data-visualization.markdown
+++ b/content/pages/03-data/18-data-visualization.markdown
@@ -36,7 +36,6 @@ easier for humans to see patterns, trends and other useful information.
 
 * [Python & OpenGL for Scientific Visualization](https://www.labri.fr/perso/nrougier/python-opengl/)
   is a free book that shows how to combine open source tools such as 
-  [Pyglet](https://pyglet.readthedocs.io/en/stable/) and 
   [PyOpenGL](http://pyopengl.sourceforge.net/) with Python 
   [data analysis](/data-analysis.html) libraries to generate interactive
   scientific data visualizations.
@@ -163,8 +162,7 @@ visualization and gave me ideas for what to build.
 * [Engineering Intelligence Through Data Visualization at Uber](https://eng.uber.com/data-viz-intel/)
   explains how Uber's data visualization team grew from 1 person to 15
   and the output they created along the way, including the open source
-  tools [react-vis](https://uber.github.io/react-vis/) and 
-  [react-map-gl](https://uber.github.io/react-map-gl/).
+  tool [react-vis](https://uber.github.io/react-vis/).
 
 * The Practitioner's Guide to System Dashboard Design series covers a
   lot of ground for what you should consider when building one form
diff --git a/content/pages/04-web-development/39-code-metrics.markdown b/content/pages/04-web-development/39-code-metrics.markdown
index ea7e34712..1ce96176f 100644
--- a/content/pages/04-web-development/39-code-metrics.markdown
+++ b/content/pages/04-web-development/39-code-metrics.markdown
@@ -151,10 +151,6 @@ diminishing returns.
   covers Pylint, PyFlakes and mypy with a short description of the 
   advantages and disadvantage for each one.
 
-* [Dynamic tracing a Pony + Python program with DTrace](https://blog.wallaroolabs.com/2017/12/dynamic-tracing-a-pony---python-program-with-dtrace/)
-  shows how to use dynamic tracing programs to analyze code
-  at runtime.
-
 * This [Stack Overflow question on Python static code analysis tools](http://stackoverflow.com/questions/1428872/pylint-pychecker-or-pyflakes)
   contains comparison discussions of PyLint, PyChecker and PyFlakes.
 
diff --git a/content/pages/04-web-development/47-bots.markdown b/content/pages/04-web-development/47-bots.markdown
index 82ba58758..46d487720 100644
--- a/content/pages/04-web-development/47-bots.markdown
+++ b/content/pages/04-web-development/47-bots.markdown
@@ -53,7 +53,7 @@ often also called "chatbots", "assistants" or "agents."
 * [Making a Reddit + Facebook Messenger Bot](https://pythontips.com/2017/04/13/making-a-reddit-facebook-messenger-bot/)
   builds a bot for two platforms and shows how to deploy it to Heroku.
 
-* [Build a Slack Bot that Mimics Your Colleagues with Python](http://hirelofty.com/blog/how-build-slack-bot-mimics-your-colleague/)
+* [Build a Slack Bot that Mimics Your Colleagues with Python](https://hirelofty.com/blog/software-development/how-build-slack-bot-mimics-your-colleague/)
   is a humorous post that uses the 
   [markovify](https://github.com/jsvine/markovify) Markov Chains library to 
   generate responses that are similar to ones other Slack users have said.
diff --git a/content/pages/04-web-development/51-api-integration.markdown b/content/pages/04-web-development/51-api-integration.markdown
index 03ef86448..09c6e8099 100644
--- a/content/pages/04-web-development/51-api-integration.markdown
+++ b/content/pages/04-web-development/51-api-integration.markdown
@@ -26,7 +26,7 @@ across many implementation areas.
   add them to applications with a bunch of useful code examples.
 
 * Some developers prefer to use 
-  [Requests](http://docs.python-requests.org/en/latest/) instead of an API's 
+  [Requests](https://requests.readthedocs.io/en/master/) instead of an API's 
   helper library. In that case check out this 
   [tutorial on using requests to access web APIs](http://engineering.hackerearth.com/2014/08/21/python-requests-module/).
 
@@ -98,7 +98,7 @@ across many implementation areas.
    requests and responses.
 
 1. Evaluate whether to use a helper library or work with 
-   [Requests](http://docs.python-requests.org/en/latest/). Helper libraries 
+   [Requests](https://requests.readthedocs.io/en/master/). Helper libraries 
    are usually easier to get started with while Requests gives you more 
    control over the HTTP calls.
 
diff --git a/content/pages/05-deployment/00-deployment.markdown b/content/pages/05-deployment/00-deployment.markdown
index b5ecc4025..a7080da8a 100644
--- a/content/pages/05-deployment/00-deployment.markdown
+++ b/content/pages/05-deployment/00-deployment.markdown
@@ -112,14 +112,6 @@ guide as they are considered advanced deployment techniques.
   defines delivery versus deployment and walks through a continuous deployment
   workflow.
 
-* [Automation for the People](https://gist.github.com/classam/9e07a36aa63624ca2dda75a1367a53c6)
-  provides an awesome overview of one developer's story for how he gradually
-  learned about deployment automation. The story follows my own journey in
-  many ways, from starting with brittle [Bash](/bourne-again-shell-bash.html) 
-  scripts, moving to Fabric and then on to [Ansible](/ansible.html) for 
-  higher-level [configuration management](/configuration-management.html)
-  and continuous deployment pipelines.
-
 * [5 ways to deploy your Python application in 2017](https://www.youtube.com/watch?v=vGphzPLemZE)
   is a talk from 
   [PyCon US 2017](https://www.youtube.com/channel/UCrJhliKNQ8g0qoE_zvL8eVg/videos)

From f638e3704fa2246ef6123a9efc48180143bd25a9 Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Sun, 5 Jul 2020 08:20:38 -0400
Subject: [PATCH 164/302] fix error with code highlighting on blog

---
 Makefile | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Makefile b/Makefile
index 8e6fe19af..930fc187a 100644
--- a/Makefile
+++ b/Makefile
@@ -3,8 +3,9 @@ run:
 	cp -R static-html/* generated/updated_site/
 	cp -R redirects/* generated/updated_site/
 	cp -R static/* generated/updated_site/
-	sed -i '' 's/\(^.*~~.*$$\)/\1<\/span>/g' generated/updated_site/pages/*.html
-	sed -i '' 's/~~//g' generated/updated_site/pages/*.html
+	sed -i '' 's/\(^.*~~.*$$\)/\1<\/span>/g' generated/updated_site/pages/*.html 
+	sed -i '' 's/\(^.*~~.*$$\)/\1<\/span>/g' generated/updated_site/blog/*.html
+	sed -i '' 's/~~//g' generated/updated_site/pages/*.html 
 	cp generated/updated_site/pages/* generated/updated_site/
 	sed -i '' 's/~~//g' generated/updated_site/blog/*.html
 
@@ -34,7 +35,6 @@ prod: run
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /\\\()_,.&$^;:+#{}|=~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html
-	sed -i '' 's/\(^.*~~.*$$\)/\1<\/span>/g' generated/updated_site/blog/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/<\/span>//g' generated/updated_site/*.html generated/updated_site/blog/*.html
 	sed -i '' 's/<\/span>//g' generated/updated_site/*.html generated/updated_site/blog/*.html
 

From 3b61df334174da9bc38fddaee5decad3b63b96e1 Mon Sep 17 00:00:00 2001
From: Matt Makai 
Date: Sun, 5 Jul 2020 12:28:27 -0400
Subject: [PATCH 165/302] super quick post on bootstrap cdn with django
 templates

---
 ...00705-bootstrap-4-django-template.markdown | 350 ++++++++++++++++++
 .../hello-world-bootstrap-style.jpg           | Bin 0 -> 36716 bytes
 static/img/headers/django-bootstrap.jpg       | Bin 0 -> 24737 bytes
 static/img/visuals/first-step.jpg             | Bin 0 -> 24193 bytes
 .../blog/bootstrap-4-django-template.html     |   5 +
 5 files changed, 355 insertions(+)
 create mode 100644 content/posts/200705-bootstrap-4-django-template.markdown
 create mode 100644 static/img/200705-bootstrap-4-django-template/hello-world-bootstrap-style.jpg
 create mode 100644 static/img/headers/django-bootstrap.jpg
 create mode 100644 static/img/visuals/first-step.jpg
 create mode 100644 theme/templates/blog/bootstrap-4-django-template.html

diff --git a/content/posts/200705-bootstrap-4-django-template.markdown b/content/posts/200705-bootstrap-4-django-template.markdown
new file mode 100644
index 000000000..b94efce43
--- /dev/null
+++ b/content/posts/200705-bootstrap-4-django-template.markdown
@@ -0,0 +1,350 @@
+title: Quickly Use Bootstrap 4 in a Django Template with a CDN
+slug: bootstrap-4-django-template
+meta: Use the Bootstrap 4 CDN to quickly add Bootstrap styling and functionality to Django web apps.
+category: post
+date: 2020-07-05
+modified: 2020-07-05
+newsletter: False
+headerimage: /img/headers/django-bootstrap.jpg
+headeralt: Logos for the implementations used in this blog post. Copyright their respective owners.
+
+
+The [Django](/django.html) [web framework](/web-frameworks.html)
+makes it easy to render HTML using the [Django template engine](/django-templates.html).
+However, the default styling on HTML pages usually need a
+[Cascading Style Sheet (CSS)](/cascading-style-sheets.html) framework such as 
+Bootstrap to make the design look decent.
+In this beginner's tutorial, we'll use the [Bootstrap](/bootstrap-css.html) 
+[Content Delivery Network (CDN)](/content-delivery-networks-cdns.html)
+to quickly add Bootstrap to a rendered HTML page.
+
+Here is what the `

` element styling will look like at the end +of this tutorial: + +Bootstrap-enhanced HTML page saying 'Hello, world!'. + + +## Tutorial Requirements +Throughout this tutorial we are going to use the following dependencies, +which we will install in just a moment. Make sure you also have Python 3, +[preferrably 3.7 or newer installed](https://www.python.org/downloads/), +in your environment: + +We will use the following dependencies to complete this +tutorial: + +* [Django](/django.html) [web framework](/web-frameworks.html), + [version 3.0.8](https://www.djangoproject.com/download/) + +All code in this blog post is available open source under the MIT license +on GitHub under the +[bootstrap-4-django-template directory of the blog-code-examples repository](https://github.com/fullstackpython/blog-code-examples). +Use the source code as you desire for your own projects. + + +## Development environment set up +Change into the directory where you keep your Python +[virtual environments](/virtual-environments-virtualenvs-venvs.html). +Create a new virtualenv for this project using the following +command. + +Start the Django project by creating a new +[virtual environment](/virtual-environments-virtualenvs-venvs.html) +using the following command. I recommend using a separate directory +such as `~/venvs/` (the tilde is a shortcut for your user's `home` +directory) so that you always know where all your virtualenvs are +located. + +```bash +python3 -m venv ~/venvs/djbootstrap4 +``` + +Activate the virtualenv with the `activate` shell script: + +```bash +source ~/venvs/djbootstrap4/bin/activate +``` + +After the above command is executed, the command prompt will +change so that the name of the virtualenv is prepended to the +original command prompt format, so if your prompt is simply +`$`, it will now look like the following: + +```bash +(djbootstrap4) $ +``` + +Remember, you have to activate your virtualenv in every new terminal +window where you want to use dependencies in the virtualenv. + +We can now install the [Django](https://pypi.org/project/Django/) +package into the activated but otherwise empty virtualenv. + +``` +pip install django==3.0.8 +``` + +Look for output similar to the following to confirm the appropriate +packages were installed correctly from PyPI. + +``` +Collecting django + Using cached https://files.pythonhosted.org/packages/ca/ab/5e004afa025a6fb640c6e983d4983e6507421ff01be224da79ab7de7a21f/Django-3.0.8-py3-none-any.whl +Collecting sqlparse>=0.2.2 (from django) + Using cached https://files.pythonhosted.org/packages/85/ee/6e821932f413a5c4b76be9c5936e313e4fc626b33f16e027866e1d60f588/sqlparse-0.3.1-py2.py3-none-any.whl +Collecting asgiref~=3.2 (from django) + Using cached https://files.pythonhosted.org/packages/d5/eb/64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6/asgiref-3.2.10-py3-none-any.whl +Collecting pytz (from django) + Using cached https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl +Installing collected packages: sqlparse, asgiref, pytz, django +Successfully installed asgiref-3.2.10 django-3.0.8 pytz-2020.1 sqlparse-0.3.1 +``` + +We can get started coding the application now that we have all of our +required dependencies installed. + + +## Building our application +Let's begin coding our application. + +We can use the [Django](/django.html) `django-admin` tool to create +the boilerplate code structure to get our project started. +Change into the directory where you develop your applications. For +example, I typically use `/Users/matt/devel/py/` for all of my +Python projects. Then run the following command to start a Django +project named `djbootstrap4`: + +``` +django-admin.py startproject djbootstrap4 +``` + +Note that in this tutorial we are using the same name for both the +virtualenv and the Django project directory, but they can be +different names if you prefer that for organizing your own projects. + +The `django-admin` command creates a directory named `djbootstrap4` +along with several subdirectories that you should be familiar with +if you have previously worked with Django. + +Change directories into the new project. + +``` +cd djbootstrap4 +``` + +Create a new Django app within `djbootstrap4`. + +``` +python manage.py startapp bootstrap4 +``` + +Django will generate a new folder named `bootstrap4` for the project. +We should update the URLs so the app is accessible before we write +our `views.py` code. + +Open `djbootstrap4/djbootstrap4/urls.py`. Add the highlighted +lines so that URL resolver will check the `bootstrap4` app +for additional routes to match with URLs that are requested of +this Django application. + +```python +# djbootstrap4/djbootstrap4/urls.py +~~from django.conf.urls import include +from django.contrib import admin +from django.urls import path + + +urlpatterns = [ +~~ path('', include('bootstrap4.urls')), + path('admin/', admin.site.urls), +] +``` + +Save `djbootstrap4/djbootstrap4/urls.py` and open +`djbootstrap4/djbootstrap4/settings.py`. +Add the `bootstrap4` app to `settings.py` by inserting +the highlighted line: + +```python +# djbootstrap4/djbootstrap4/settings.py +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +~~ 'bootstrap4', +] +``` + +Make sure you change the default `DEBUG` and `SECRET_KEY` +values in `settings.py` before you deploy any code to production. Secure +your app properly with the information from the Django +[production deployment checklist](https://docs.djangoproject.com/en/stable/howto/deployment/checklist/) +so that you do not add your project to the list of hacked applications +on the web. + +Save and close `settings.py`. + +Next change into the `djbootstrap4/bootstrap4` directory. Create +a new file named `urls.py` to contain routes for the `bootstrap4` app. + +Add all of these lines to the empty `djbootstrap4/bootstrap4/urls.py` +file. + +```python +# djbootstrap4/bootstrap4/urls.py +from django.conf.urls import url +from . import views + +urlpatterns = [ + url(r'', views.bootstrap4_index, name="index"), +] +``` + +Save `djbootstrap4/bootstrap4/urls.py`. Open +`djbootstrap4/bootstrap4/views.py` to add the +following two highlighted lines. You can keep the boilerplate comment +"# Create your views here." or delete like I usually do. + +``` +# djbootstrap4/bootstrap4/views.py +from django.shortcuts import render + + +~~def bootstrap4_index(request): +~~ return render(request, 'index.html', {}) +``` + + +Next, create a directory for your template files named `templates` under +the `djmaps/maps` app directory. + +``` +mkdir templates +``` + +Create a new file named `index.html` within +`djbootstrap4/bootstrap4/templates` that contains the +following [Django template language](/django-templates.html) markup. + +``` + + + + First step for bootstrap4 + + +

Hello, world!

+ + +``` + +We can test out this static page to make sure all of our code is +correct before we start adding the meat of the functionality to +the project. Change into the base directory of your Django project +where the `manage.py` file is located. Execute the development +server with the following command: + +```bash +python manage.py runserver +``` + +The Django development server should start up with no issues other than +an unapplied migrations warning. + +``` +Watching for file changes with StatReloader +Performing system checks... + +System check identified no issues (0 silenced). + +You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. +Run 'python manage.py migrate' to apply them. + +July 05, 2020 - 10:59:58 +Django version 3.0.8, using settings 'djbootstrap4.settings' +Starting development server at http://127.0.0.1:8000/ +Quit the server with CONTROL-C. +``` + +Open a web browser and go to "http://localhost:8000". + +Plain old HTML page saying 'Hello, world!'. + +With our base application working, we can now add Bootstrap. + + +## Integrating Bootstrap +Time to add Bootstrap into the template so we can use its styling. + +Open `djbootstrap4/bootstrap4/templates/index.html` back up and +add or modify the following highlighted lines, which are very +similar to what you will find in the +[Bootstrap introduction guide](https://getbootstrap.com/docs/4.5/getting-started/introduction/): + +``` + + + +~~ +~~ +~~ +~~ bootstrap4 + + +

Hello, world!

+ +~~ +~~ +~~ +~~ +~~ + + +``` + +The above new lines in the `` section add a couple of meta elements +that are important to Bootstrap's styling, and add the mandatory Bootstrap +stylesheet. + +We keep the same `

` header, which will automatically get the CSS +styling. Then there are 3 *optional* script elements that pull in +Bootstrap [JavaScript](/javascript.html) for more advanced features. +We are not using them in this tutorial because we just wanted to +quickly show how to use the CDN and with this in place you can see +in the +[Bootstrap content docs](https://getbootstrap.com/docs/4.5/content/reboot/) +what you want to add to the template next. + +Refresh the page at "http://localhost:8000" and you should see "Hello, world!" +change fonts. + + +Bootstrap-enhanced HTML page saying 'Hello, world!'. + +If you see that, it means everything works as expected. + + +## What now? +We just added Bootstrap via the CDN so we can use it in our Django template. +This was the absolute simplest way to add Bootstrap to a single Django +page and now there's a ton more you can do with it. + +Next, try out some of these other related [Django](/django.html) tutorials: + +* [More Bootstrap resources](/bootstrap-css.html) +* [How to Add Maps to Django Web App Projects with Mapbox](/blog/maps-django-web-applications-projects-mapbox.html) +* [Monitoring Django Projects with Rollbar](/blog/monitor-django-projects-web-apps-rollbar.html) + +Questions? Contact me via Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). I am also on GitHub with +the username [mattmakai](https://github.com/mattmakai). +If you see an issue or error in this tutorial, please +[fork the source repository on GitHub](https://github.com/mattmakai/fullstackpython/blob/master/content/posts/200705-bootstrap-4-django-template.markdown) +and submit a pull request with the fix. + diff --git a/static/img/200705-bootstrap-4-django-template/hello-world-bootstrap-style.jpg b/static/img/200705-bootstrap-4-django-template/hello-world-bootstrap-style.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7a33e97c280af4cd60a357bbd8760e8107566dbb GIT binary patch literal 36716 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 literal 0 HcmV?d00001 diff --git a/static/img/headers/django-bootstrap.jpg b/static/img/headers/django-bootstrap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac7bffe14464c17603226cbae5e111c9b212c9da GIT binary patch literal 24737 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 literal 0 HcmV?d00001 diff --git a/static/img/visuals/first-step.jpg b/static/img/visuals/first-step.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0158d131ff0de0db5911dca7ddb357b70153dbdd GIT binary patch literal 24193 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 literal 0 HcmV?d00001 diff --git a/theme/templates/blog/bootstrap-4-django-template.html b/theme/templates/blog/bootstrap-4-django-template.html new file mode 100644 index 000000000..ad1d789e0 --- /dev/null +++ b/theme/templates/blog/bootstrap-4-django-template.html @@ -0,0 +1,5 @@ + +Learning Programming +Web development +Django +Bootstrap From 4b6ffa045bd5cee1c3d45143cf2b3d06160420b5 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 5 Jul 2020 12:32:43 -0400 Subject: [PATCH 166/302] fix typo link in blog post --- content/posts/200705-bootstrap-4-django-template.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/posts/200705-bootstrap-4-django-template.markdown b/content/posts/200705-bootstrap-4-django-template.markdown index b94efce43..96e105df8 100644 --- a/content/posts/200705-bootstrap-4-django-template.markdown +++ b/content/posts/200705-bootstrap-4-django-template.markdown @@ -345,6 +345,6 @@ Questions? Contact me via Twitter or [@mattmakai](https://twitter.com/mattmakai). I am also on GitHub with the username [mattmakai](https://github.com/mattmakai). If you see an issue or error in this tutorial, please -[fork the source repository on GitHub](https://github.com/mattmakai/fullstackpython/blob/master/content/posts/200705-bootstrap-4-django-template.markdown) +[fork the source repository on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200705-bootstrap-4-django-template.markdown) and submit a pull request with the fix. From 426d9b5ee2067fed50a96f1b368d95a31c3bc2ab Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 5 Jul 2020 14:49:46 -0400 Subject: [PATCH 167/302] adding new sqlalchemy code examples --- .../sqlalchemy-dialects-mssql.markdown | 2 +- ...sqlalchemy-dialects-mysql-pymysql.markdown | 85 +++++++++ .../sqlalchemy-dialects-mysql.markdown | 2 +- .../sqlalchemy-dialects-oracle.markdown | 2 +- ...alchemy-dialects-postgresql-array.markdown | 4 +- ...ts-postgresql-base-pgtypecompiler.markdown | 4 +- ...lchemy-dialects-postgresql-bigint.markdown | 4 +- ...qlalchemy-dialects-postgresql-bit.markdown | 4 +- ...lects-postgresql-double-precision.markdown | 4 +- ...ects-postgresql-excludeconstraint.markdown | 4 +- ...chemy-dialects-postgresql-integer.markdown | 4 +- ...lalchemy-dialects-postgresql-json.markdown | 4 +- ...resql-psycopg2-pgdialect-psycopg2.markdown | 86 ++++++++- ...-dialects-postgresql-pypostgresql.markdown | 91 ++++++++++ ...hemy-dialects-postgresql-tsvector.markdown | 4 +- .../sqlalchemy-dialects-postgresql.markdown | 2 +- ...lalchemy-dialects-sqlite-pysqlite.markdown | 84 +++++++++ .../sqlalchemy-dialects-sqlite.markdown | 2 +- .../sqlalchemy-engine-connection.markdown | 4 +- .../sqlalchemy-engine-create-engine.markdown | 4 +- ...emy-engine-default-defaultdialect.markdown | 4 +- .../sqlalchemy-engine-default.markdown | 4 +- .../sqlalchemy-engine-engine.markdown | 4 +- ...ngine-interfaces-executioncontext.markdown | 67 +++++++ ...hemy-engine-result-resultmetadata.markdown | 164 ++++++++++++++++++ ...sqlalchemy-engine-result-rowproxy.markdown | 164 ++++++++++++++++++ ...-engine-strategies-enginestrategy.markdown | 4 +- ...ine-strategies-mockenginestrategy.markdown | 4 +- .../sqlalchemy-engine-url-make-url.markdown | 4 +- .../sqlalchemy/sqlalchemy-engine-url.markdown | 4 +- ...lalchemy-events-schemaeventtarget.markdown | 4 +- .../sqlalchemy-example-projects-code.markdown | 15 ++ .../sqlalchemy-exc-argumenterror.markdown | 4 +- .../sqlalchemy-exc-dataerror.markdown | 4 +- .../sqlalchemy-exc-integrityerror.markdown | 4 +- ...qlalchemy-exc-invalidrequesterror.markdown | 4 +- ...alchemy-exc-noinspectionavailable.markdown | 4 +- .../sqlalchemy-exc-operationalerror.markdown | 9 +- .../sqlalchemy-exc-programmingerror.markdown | 9 +- ...lalchemy-ext-automap-automap-base.markdown | 4 +- .../sqlalchemy-ext-compiler-compiles.markdown | 4 +- .../sqlalchemy-ext-compiler.markdown | 4 +- ...-ext-declarative-declarative-base.markdown | 4 +- ...y-ext-declarative-declarativemeta.markdown | 4 +- ...lchemy-ext-hybrid-hybrid-property.markdown | 4 +- .../sqlalchemy-ext-mutable-mutable.markdown | 4 +- .../sqlalchemy-inspection-inspect.markdown | 4 +- ...-attributes-instrumentedattribute.markdown | 4 +- .../sqlalchemy-orm-attributes.markdown | 9 +- .../sqlalchemy-orm-backref.markdown | 4 +- .../sqlalchemy-orm-class-mapper.markdown | 9 +- ...-orm-collections-instrumentedlist.markdown | 4 +- .../sqlalchemy-orm-column-property.markdown | 4 +- .../sqlalchemy-orm-columnproperty.markdown | 9 +- .../sqlalchemy-orm-composite.markdown | 4 +- .../sqlalchemy-orm-compositeproperty.markdown | 4 +- .../sqlalchemy-orm-exc-noresultfound.markdown | 4 +- ...lchemy-orm-exc-unmappedclasserror.markdown | 4 +- ...emy-orm-exc-unmappedinstanceerror.markdown | 4 +- ...emy-orm-interfaces-mapperproperty.markdown | 9 +- ...emy-orm-interfaces-propcomparator.markdown | 9 +- .../sqlalchemy-orm-interfaces.markdown | 4 +- .../sqlalchemy/sqlalchemy-orm-mapper.markdown | 4 +- .../sqlalchemy-orm-mapperlib.markdown | 4 +- .../sqlalchemy-orm-object-mapper.markdown | 4 +- .../sqlalchemy-orm-object-session.markdown | 4 +- ...emy-orm-properties-columnproperty.markdown | 4 +- ...m-properties-relationshipproperty.markdown | 4 +- .../sqlalchemy-orm-query-query.markdown | 4 +- ...sqlalchemy-orm-query-querycontext.markdown | 4 +- .../sqlalchemy-orm-relationship.markdown | 4 +- ...lchemy-orm-session-object-session.markdown | 4 +- .../sqlalchemy-orm-session-session.markdown | 4 +- .../sqlalchemy-orm-session.markdown | 4 +- .../sqlalchemy-orm-sessionmaker.markdown | 4 +- .../sqlalchemy-orm-strategies.markdown | 4 +- .../sqlalchemy-orm-synonymproperty.markdown | 4 +- .../sqlalchemy-orm-util-aliasedinsp.markdown | 4 +- .../sqlalchemy-pool-nullpool.markdown | 4 +- .../sqlalchemy-pool-staticpool.markdown | 4 +- ...sqlalchemy-schema-checkconstraint.markdown | 4 +- .../sqlalchemy-schema-column.markdown | 4 +- .../sqlalchemy-schema-createindex.markdown | 4 +- .../sqlalchemy-schema-ddlelement.markdown | 4 +- .../sqlalchemy-schema-foreignkey.markdown | 4 +- ...chemy-schema-foreignkeyconstraint.markdown | 4 +- ...chemy-schema-primarykeyconstraint.markdown | 4 +- .../sqlalchemy-schema-table.markdown | 4 +- .../sqlalchemy-sql-clauseelement.markdown | 58 ++++++- .../sqlalchemy/sqlalchemy-sql-column.markdown | 4 +- ...lchemy-sql-elements-columnelement.markdown | 4 +- .../sqlalchemy-sql-elements-label.markdown | 4 +- ...hemy-sql-expression-clauseelement.markdown | 4 +- ...chemy-sql-expression-columnclause.markdown | 4 +- ...hemy-sql-expression-columnelement.markdown | 4 +- ...alchemy-sql-expression-executable.markdown | 4 +- ...my-sql-expression-functionelement.markdown | 4 +- ...my-sql-expression-unaryexpression.markdown | 4 +- .../sqlalchemy-sql-expression.markdown | 4 +- ...emy-sql-functions-functionelement.markdown | 4 +- ...emy-sql-functions-genericfunction.markdown | 4 +- .../sqlalchemy-sql-functions.markdown | 4 +- .../sqlalchemy-sql-naming-conv.markdown | 4 +- .../sqlalchemy-sql-operators.markdown | 4 +- .../sqlalchemy-sql-schema-column.markdown | 124 +++++++++++++ .../sqlalchemy-sql-schema-schemaitem.markdown | 4 +- .../sqlalchemy/sqlalchemy-sql-schema.markdown | 4 +- .../sqlalchemy/sqlalchemy-sql-select.markdown | 4 +- .../sqlalchemy-sql-sqltypes-nulltype.markdown | 4 +- .../sqlalchemy-sql-sqltypes.markdown | 4 +- .../sqlalchemy/sqlalchemy-sql-table.markdown | 4 +- ...sqlalchemy-sql-util-clauseadapter.markdown | 4 +- .../sqlalchemy-sql-visitors-traverse.markdown | 4 +- .../sqlalchemy-types-boolean.markdown | 4 +- .../sqlalchemy/sqlalchemy-types-enum.markdown | 4 +- .../sqlalchemy-types-integer.markdown | 4 +- .../sqlalchemy-types-nulltype.markdown | 4 +- .../sqlalchemy-types-string.markdown | 4 +- .../sqlalchemy-types-to-instance.markdown | 4 +- .../sqlalchemy-types-typeengine.markdown | 70 ++++++++ .../sqlalchemy-types-userdefinedtype.markdown | 4 +- ...qlalchemy-util-langhelpers-symbol.markdown | 4 +- .../sqlalchemy-util-ordereddict.markdown | 4 +- .../sqlalchemy-util-orderedset.markdown | 4 +- ...qlalchemy-util-set-creation-order.markdown | 9 +- .../sqlalchemy-util-topological.markdown | 4 +- theme/templates/code-examples/sqlalchemy.html | 18 +- 127 files changed, 1252 insertions(+), 264 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown index ade3ee160..87b8af20e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown @@ -1,4 +1,4 @@ -title: sqlalchemy.dialects mssql code examples +title: sqlalchemy.dialects mssql Example Code category: page slug: sqlalchemy-dialects-mssql-examples sortorder: 500031000 diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown new file mode 100644 index 000000000..da6b3ef1c --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown @@ -0,0 +1,85 @@ +title: sqlalchemy.dialects.mysql pymysql Example Code +category: page +slug: sqlalchemy-dialects-mysql-pymysql-examples +sortorder: 500031005 +toc: False +sidebartitle: sqlalchemy.dialects.mysql pymysql +meta: Python example code for the pymysql callable from the sqlalchemy.dialects.mysql module of the SQLAlchemy project. + + +pymysql is a callable within the sqlalchemy.dialects.mysql module of the SQLAlchemy project. + + +## Example 1 from databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + +[**databases / databases / backends / mysql.py**](https://github.com/encode/databases/blob/master/databases/backends/mysql.py) + +```python +# mysql.py +import getpass +import logging +import typing +import uuid + +import aiomysql +~~from sqlalchemy.dialects.mysql import pymysql +from sqlalchemy.engine.interfaces import Dialect, ExecutionContext +from sqlalchemy.engine.result import ResultMetaData, RowProxy +from sqlalchemy.sql import ClauseElement +from sqlalchemy.types import TypeEngine + +from databases.core import LOG_EXTRA, DatabaseURL +from databases.interfaces import ConnectionBackend, DatabaseBackend, TransactionBackend + +logger = logging.getLogger("databases") + + +class MySQLBackend(DatabaseBackend): + def __init__( + self, database_url: typing.Union[DatabaseURL, str], **options: typing.Any + ) -> None: + self._database_url = DatabaseURL(database_url) + self._options = options +~~ self._dialect = pymysql.dialect(paramstyle="pyformat") + self._dialect.supports_native_decimal = True + self._pool = None + + def _get_connection_kwargs(self) -> dict: + url_options = self._database_url.options + + kwargs = {} + min_size = url_options.get("min_size") + max_size = url_options.get("max_size") + ssl = url_options.get("ssl") + + if min_size is not None: + kwargs["minsize"] = int(min_size) + if max_size is not None: + kwargs["maxsize"] = int(max_size) + if ssl is not None: + kwargs["ssl"] = {"true": True, "false": False}[ssl.lower()] + + for key, value in self._options.items(): + if key == "min_size": + key = "minsize" + elif key == "max_size": + key = "maxsize" + kwargs[key] = value + + +## ... source file continues with no further pymysql examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown index d20f51c51..656894081 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown @@ -1,4 +1,4 @@ -title: sqlalchemy.dialects mysql code examples +title: sqlalchemy.dialects mysql Example Code category: page slug: sqlalchemy-dialects-mysql-examples sortorder: 500031001 diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown index 5fb4c5a2c..c7f3c6f74 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown @@ -1,4 +1,4 @@ -title: sqlalchemy.dialects oracle code examples +title: sqlalchemy.dialects oracle Example Code category: page slug: sqlalchemy-dialects-oracle-examples sortorder: 500031002 diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown index f3065cacf..f1a546ff7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.dialects.postgresql ARRAY code examples +title: sqlalchemy.dialects.postgresql ARRAY Example Code category: page slug: sqlalchemy-dialects-postgresql-array-examples -sortorder: 500031005 +sortorder: 500031006 toc: False sidebartitle: sqlalchemy.dialects.postgresql ARRAY meta: Python example code for the ARRAY constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown index 1e0f53adf..f9634cf36 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.dialects.postgresql.base PGTypeCompiler code examples +title: sqlalchemy.dialects.postgresql.base PGTypeCompiler Example Code category: page slug: sqlalchemy-dialects-postgresql-base-pgtypecompiler-examples -sortorder: 500031013 +sortorder: 500031015 toc: False sidebartitle: sqlalchemy.dialects.postgresql.base PGTypeCompiler meta: Python example code for the PGTypeCompiler class from the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown index 4ec3b0168..563255959 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.dialects.postgresql BIGINT code examples +title: sqlalchemy.dialects.postgresql BIGINT Example Code category: page slug: sqlalchemy-dialects-postgresql-bigint-examples -sortorder: 500031006 +sortorder: 500031007 toc: False sidebartitle: sqlalchemy.dialects.postgresql BIGINT meta: Python example code for the BIGINT constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown index f2dc582ee..40bbd9d70 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.dialects.postgresql BIT code examples +title: sqlalchemy.dialects.postgresql BIT Example Code category: page slug: sqlalchemy-dialects-postgresql-bit-examples -sortorder: 500031007 +sortorder: 500031008 toc: False sidebartitle: sqlalchemy.dialects.postgresql BIT meta: Python example code for the BIT constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown index a3313b00a..d48b4fe7d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.dialects.postgresql DOUBLE_PRECISION code examples +title: sqlalchemy.dialects.postgresql DOUBLE_PRECISION Example Code category: page slug: sqlalchemy-dialects-postgresql-double-precision-examples -sortorder: 500031008 +sortorder: 500031009 toc: False sidebartitle: sqlalchemy.dialects.postgresql DOUBLE_PRECISION meta: Python example code for the DOUBLE_PRECISION constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown index 6c160a001..46e524771 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.dialects.postgresql ExcludeConstraint code examples +title: sqlalchemy.dialects.postgresql ExcludeConstraint Example Code category: page slug: sqlalchemy-dialects-postgresql-excludeconstraint-examples -sortorder: 500031009 +sortorder: 500031010 toc: False sidebartitle: sqlalchemy.dialects.postgresql ExcludeConstraint meta: Python example code for the ExcludeConstraint class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown index af1cee9a1..599e862d0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.dialects.postgresql INTEGER code examples +title: sqlalchemy.dialects.postgresql INTEGER Example Code category: page slug: sqlalchemy-dialects-postgresql-integer-examples -sortorder: 500031010 +sortorder: 500031011 toc: False sidebartitle: sqlalchemy.dialects.postgresql INTEGER meta: Python example code for the INTEGER constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown index 0d5be4fbc..4e61ccf3c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.dialects.postgresql JSON code examples +title: sqlalchemy.dialects.postgresql JSON Example Code category: page slug: sqlalchemy-dialects-postgresql-json-examples -sortorder: 500031011 +sortorder: 500031012 toc: False sidebartitle: sqlalchemy.dialects.postgresql JSON meta: Python example code for the JSON constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown index 91fa4f1df..0a2e98a45 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 code examples +title: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 Example Code category: page slug: sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2-examples -sortorder: 500031014 +sortorder: 500031016 toc: False sidebartitle: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 meta: Python example code for the PGDialect_psycopg2 class from the sqlalchemy.dialects.postgresql.psycopg2 module of the SQLAlchemy project. @@ -10,7 +10,87 @@ meta: Python example code for the PGDialect_psycopg2 class from the sqlalchemy.d PGDialect_psycopg2 is a class within the sqlalchemy.dialects.postgresql.psycopg2 module of the SQLAlchemy project. -## Example 1 from sqlalchemy-utils +## Example 1 from databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + +[**databases / databases / backends / aiopg.py**](https://github.com/encode/databases/blob/master/databases/backends/aiopg.py) + +```python +# aiopg.py +import getpass +import json +import logging +import typing +import uuid + +import aiopg +from aiopg.sa.engine import APGCompiler_psycopg2 +~~from sqlalchemy.dialects.postgresql.psycopg2 import PGDialect_psycopg2 +from sqlalchemy.engine.interfaces import Dialect, ExecutionContext +from sqlalchemy.engine.result import ResultMetaData, RowProxy +from sqlalchemy.sql import ClauseElement +from sqlalchemy.types import TypeEngine + +from databases.core import DatabaseURL +from databases.interfaces import ConnectionBackend, DatabaseBackend, TransactionBackend + +logger = logging.getLogger("databases") + + +class AiopgBackend(DatabaseBackend): + def __init__( + self, database_url: typing.Union[DatabaseURL, str], **options: typing.Any + ) -> None: + self._database_url = DatabaseURL(database_url) + self._options = options + self._dialect = self._get_dialect() + self._pool = None + + def _get_dialect(self) -> Dialect: +~~ dialect = PGDialect_psycopg2( + json_serializer=json.dumps, json_deserializer=lambda x: x + ) + dialect.statement_compiler = APGCompiler_psycopg2 + dialect.implicit_returning = True + dialect.supports_native_enum = True + dialect.supports_smallserial = True # 9.2+ + dialect._backslash_escapes = False + dialect.supports_sane_multi_rowcount = True # psycopg 2.0.9+ + dialect._has_native_hstore = True + dialect.supports_native_decimal = True + + return dialect + + def _get_connection_kwargs(self) -> dict: + url_options = self._database_url.options + + kwargs = {} + min_size = url_options.get("min_size") + max_size = url_options.get("max_size") + ssl = url_options.get("ssl") + + if min_size is not None: + kwargs["minsize"] = int(min_size) + if max_size is not None: + + +## ... source file continues with no further PGDialect_psycopg2 examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown new file mode 100644 index 000000000..b06dd82cd --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown @@ -0,0 +1,91 @@ +title: sqlalchemy.dialects.postgresql pypostgresql Example Code +category: page +slug: sqlalchemy-dialects-postgresql-pypostgresql-examples +sortorder: 500031014 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql pypostgresql +meta: Python example code for the pypostgresql callable from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +pypostgresql is a callable within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. + + +## Example 1 from databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + +[**databases / databases / backends / postgres.py**](https://github.com/encode/databases/blob/master/databases/backends/postgres.py) + +```python +# postgres.py +import logging +import typing +from collections.abc import Mapping + +import asyncpg +~~from sqlalchemy.dialects.postgresql import pypostgresql +from sqlalchemy.engine.interfaces import Dialect +from sqlalchemy.sql import ClauseElement +from sqlalchemy.sql.schema import Column +from sqlalchemy.types import TypeEngine + +from databases.core import LOG_EXTRA, DatabaseURL +from databases.interfaces import ConnectionBackend, DatabaseBackend, TransactionBackend + +logger = logging.getLogger("databases") + + +_result_processors = {} # type: dict + + +class PostgresBackend(DatabaseBackend): + def __init__( + self, database_url: typing.Union[DatabaseURL, str], **options: typing.Any + ) -> None: + self._database_url = DatabaseURL(database_url) + self._options = options + self._dialect = self._get_dialect() + self._pool = None + + def _get_dialect(self) -> Dialect: +~~ dialect = pypostgresql.dialect(paramstyle="pyformat") + + dialect.implicit_returning = True + dialect.supports_native_enum = True + dialect.supports_smallserial = True # 9.2+ + dialect._backslash_escapes = False + dialect.supports_sane_multi_rowcount = True # psycopg 2.0.9+ + dialect._has_native_hstore = True + dialect.supports_native_decimal = True + + return dialect + + def _get_connection_kwargs(self) -> dict: + url_options = self._database_url.options + + kwargs = {} + min_size = url_options.get("min_size") + max_size = url_options.get("max_size") + ssl = url_options.get("ssl") + + if min_size is not None: + kwargs["min_size"] = int(min_size) + if max_size is not None: + kwargs["max_size"] = int(max_size) + if ssl is not None: + + +## ... source file continues with no further pypostgresql examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown index 956d8212a..4bfa245cc 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.dialects.postgresql TSVECTOR code examples +title: sqlalchemy.dialects.postgresql TSVECTOR Example Code category: page slug: sqlalchemy-dialects-postgresql-tsvector-examples -sortorder: 500031012 +sortorder: 500031013 toc: False sidebartitle: sqlalchemy.dialects.postgresql TSVECTOR meta: Python example code for the TSVECTOR constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown index 5c9f6b414..995ca4bc7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown @@ -1,4 +1,4 @@ -title: sqlalchemy.dialects postgresql code examples +title: sqlalchemy.dialects postgresql Example Code category: page slug: sqlalchemy-dialects-postgresql-examples sortorder: 500031003 diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown new file mode 100644 index 000000000..a10c3a486 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown @@ -0,0 +1,84 @@ +title: sqlalchemy.dialects.sqlite pysqlite Example Code +category: page +slug: sqlalchemy-dialects-sqlite-pysqlite-examples +sortorder: 500031017 +toc: False +sidebartitle: sqlalchemy.dialects.sqlite pysqlite +meta: Python example code for the pysqlite callable from the sqlalchemy.dialects.sqlite module of the SQLAlchemy project. + + +pysqlite is a callable within the sqlalchemy.dialects.sqlite module of the SQLAlchemy project. + + +## Example 1 from databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + +[**databases / databases / backends / sqlite.py**](https://github.com/encode/databases/blob/master/databases/backends/sqlite.py) + +```python +# sqlite.py +import logging +import typing +import uuid + +import aiosqlite +~~from sqlalchemy.dialects.sqlite import pysqlite +from sqlalchemy.engine.interfaces import Dialect, ExecutionContext +from sqlalchemy.engine.result import ResultMetaData, RowProxy +from sqlalchemy.sql import ClauseElement +from sqlalchemy.types import TypeEngine + +from databases.core import LOG_EXTRA, DatabaseURL +from databases.interfaces import ConnectionBackend, DatabaseBackend, TransactionBackend + +logger = logging.getLogger("databases") + + +class SQLiteBackend(DatabaseBackend): + def __init__( + self, database_url: typing.Union[DatabaseURL, str], **options: typing.Any + ) -> None: + self._database_url = DatabaseURL(database_url) + self._options = options +~~ self._dialect = pysqlite.dialect(paramstyle="qmark") + self._dialect.supports_native_decimal = False + self._pool = SQLitePool(self._database_url, **self._options) + + async def connect(self) -> None: + pass + + async def disconnect(self) -> None: + pass + + def connection(self) -> "SQLiteConnection": + return SQLiteConnection(self._pool, self._dialect) + + +class SQLitePool: + def __init__(self, url: DatabaseURL, **options: typing.Any) -> None: + self._url = url + self._options = options + + async def acquire(self) -> aiosqlite.Connection: + connection = aiosqlite.connect( + database=self._url.database, isolation_level=None, **self._options + ) + await connection.__aenter__() + return connection + + +## ... source file continues with no further pysqlite examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown index 09c0c76a0..caa7fa69b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown @@ -1,4 +1,4 @@ -title: sqlalchemy.dialects sqlite code examples +title: sqlalchemy.dialects sqlite Example Code category: page slug: sqlalchemy-dialects-sqlite-examples sortorder: 500031004 diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown index d132c2c97..baec53d01 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.engine Connection code examples +title: sqlalchemy.engine Connection Example Code category: page slug: sqlalchemy-engine-connection-examples -sortorder: 500031015 +sortorder: 500031018 toc: False sidebartitle: sqlalchemy.engine Connection meta: Python example code for the Connection class from the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown index ce4f57730..eca0d1810 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.engine create_engine code examples +title: sqlalchemy.engine create_engine Example Code category: page slug: sqlalchemy-engine-create-engine-examples -sortorder: 500031017 +sortorder: 500031020 toc: False sidebartitle: sqlalchemy.engine create_engine meta: Python example code for the create_engine callable from the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown index f1fa25ca9..fdaa0f82a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.engine.default DefaultDialect code examples +title: sqlalchemy.engine.default DefaultDialect Example Code category: page slug: sqlalchemy-engine-default-defaultdialect-examples -sortorder: 500031020 +sortorder: 500031023 toc: False sidebartitle: sqlalchemy.engine.default DefaultDialect meta: Python example code for the DefaultDialect class from the sqlalchemy.engine.default module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown index e2c2face5..507d1f16b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.engine default code examples +title: sqlalchemy.engine default Example Code category: page slug: sqlalchemy-engine-default-examples -sortorder: 500031018 +sortorder: 500031021 toc: False sidebartitle: sqlalchemy.engine default meta: Python example code for the default callable from the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown index e68e077bf..5749c7fd8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.engine Engine code examples +title: sqlalchemy.engine Engine Example Code category: page slug: sqlalchemy-engine-engine-examples -sortorder: 500031016 +sortorder: 500031019 toc: False sidebartitle: sqlalchemy.engine Engine meta: Python example code for the Engine class from the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown new file mode 100644 index 000000000..42a96b79b --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown @@ -0,0 +1,67 @@ +title: sqlalchemy.engine.interfaces ExecutionContext Example Code +category: page +slug: sqlalchemy-engine-interfaces-executioncontext-examples +sortorder: 500031024 +toc: False +sidebartitle: sqlalchemy.engine.interfaces ExecutionContext +meta: Python example code for the ExecutionContext class from the sqlalchemy.engine.interfaces module of the SQLAlchemy project. + + +ExecutionContext is a class within the sqlalchemy.engine.interfaces module of the SQLAlchemy project. + + +## Example 1 from databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + +[**databases / databases / backends / sqlite.py**](https://github.com/encode/databases/blob/master/databases/backends/sqlite.py) + +```python +# sqlite.py +import logging +import typing +import uuid + +import aiosqlite +from sqlalchemy.dialects.sqlite import pysqlite +~~from sqlalchemy.engine.interfaces import Dialect, ExecutionContext +from sqlalchemy.engine.result import ResultMetaData, RowProxy +from sqlalchemy.sql import ClauseElement +from sqlalchemy.types import TypeEngine + +from databases.core import LOG_EXTRA, DatabaseURL +from databases.interfaces import ConnectionBackend, DatabaseBackend, TransactionBackend + +logger = logging.getLogger("databases") + + +class SQLiteBackend(DatabaseBackend): + def __init__( + self, database_url: typing.Union[DatabaseURL, str], **options: typing.Any + ) -> None: + self._database_url = DatabaseURL(database_url) + self._options = options + self._dialect = pysqlite.dialect(paramstyle="qmark") + self._dialect.supports_native_decimal = False + self._pool = SQLitePool(self._database_url, **self._options) + + async def connect(self) -> None: + pass + + async def disconnect(self) -> None: + + +## ... source file continues with no further ExecutionContext examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown new file mode 100644 index 000000000..6ab20bccd --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown @@ -0,0 +1,164 @@ +title: sqlalchemy.engine.result ResultMetaData Example Code +category: page +slug: sqlalchemy-engine-result-resultmetadata-examples +sortorder: 500031025 +toc: False +sidebartitle: sqlalchemy.engine.result ResultMetaData +meta: Python example code for the ResultMetaData class from the sqlalchemy.engine.result module of the SQLAlchemy project. + + +ResultMetaData is a class within the sqlalchemy.engine.result module of the SQLAlchemy project. + + +## Example 1 from databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + +[**databases / databases / backends / sqlite.py**](https://github.com/encode/databases/blob/master/databases/backends/sqlite.py) + +```python +# sqlite.py +import logging +import typing +import uuid + +import aiosqlite +from sqlalchemy.dialects.sqlite import pysqlite +from sqlalchemy.engine.interfaces import Dialect, ExecutionContext +~~from sqlalchemy.engine.result import ResultMetaData, RowProxy +from sqlalchemy.sql import ClauseElement +from sqlalchemy.types import TypeEngine + +from databases.core import LOG_EXTRA, DatabaseURL +from databases.interfaces import ConnectionBackend, DatabaseBackend, TransactionBackend + +logger = logging.getLogger("databases") + + +class SQLiteBackend(DatabaseBackend): + def __init__( + self, database_url: typing.Union[DatabaseURL, str], **options: typing.Any + ) -> None: + self._database_url = DatabaseURL(database_url) + self._options = options + self._dialect = pysqlite.dialect(paramstyle="qmark") + self._dialect.supports_native_decimal = False + self._pool = SQLitePool(self._database_url, **self._options) + + async def connect(self) -> None: + pass + + async def disconnect(self) -> None: + pass + + +## ... source file abbreviated to get to ResultMetaData examples ... + + + def __init__(self, context: ExecutionContext): + self.context = context + + +class SQLiteConnection(ConnectionBackend): + def __init__(self, pool: SQLitePool, dialect: Dialect): + self._pool = pool + self._dialect = dialect + self._connection = None + + async def acquire(self) -> None: + assert self._connection is None, "Connection is already acquired" + self._connection = await self._pool.acquire() + + async def release(self) -> None: + assert self._connection is not None, "Connection is not acquired" + await self._pool.release(self._connection) + self._connection = None + + async def fetch_all(self, query: ClauseElement) -> typing.List[typing.Mapping]: + assert self._connection is not None, "Connection is not acquired" + query, args, context = self._compile(query) + + async with self._connection.execute(query, args) as cursor: + rows = await cursor.fetchall() +~~ metadata = ResultMetaData(context, cursor.description) + return [ + RowProxy(metadata, row, metadata._processors, metadata._keymap) + for row in rows + ] + + async def fetch_one(self, query: ClauseElement) -> typing.Optional[typing.Mapping]: + assert self._connection is not None, "Connection is not acquired" + query, args, context = self._compile(query) + + async with self._connection.execute(query, args) as cursor: + row = await cursor.fetchone() + if row is None: + return None +~~ metadata = ResultMetaData(context, cursor.description) + return RowProxy(metadata, row, metadata._processors, metadata._keymap) + + async def execute(self, query: ClauseElement) -> typing.Any: + assert self._connection is not None, "Connection is not acquired" + query, args, context = self._compile(query) + cursor = await self._connection.cursor() + try: + await cursor.execute(query, args) + if cursor.lastrowid == 0: + return cursor.rowcount + return cursor.lastrowid + finally: + await cursor.close() + + async def execute_many(self, queries: typing.List[ClauseElement]) -> None: + assert self._connection is not None, "Connection is not acquired" + for single_query in queries: + await self.execute(single_query) + + async def iterate( + self, query: ClauseElement + ) -> typing.AsyncGenerator[typing.Any, None]: + assert self._connection is not None, "Connection is not acquired" + query, args, context = self._compile(query) + cursor = await self._connection.cursor() + async with self._connection.execute(query, args) as cursor: +~~ metadata = ResultMetaData(context, cursor.description) + async for row in cursor: + yield RowProxy(metadata, row, metadata._processors, metadata._keymap) + + def transaction(self) -> TransactionBackend: + return SQLiteTransaction(self) + + def _compile( + self, query: ClauseElement + ) -> typing.Tuple[str, list, CompilationContext]: + compiled = query.compile(dialect=self._dialect) + args = [] + for key, raw_val in compiled.construct_params().items(): + if key in compiled._bind_processors: + val = compiled._bind_processors[key](raw_val) + else: + val = raw_val + args.append(val) + + execution_context = self._dialect.execution_ctx_cls() + execution_context.dialect = self._dialect + execution_context.result_column_struct = ( + compiled._result_columns, + compiled._ordered_columns, + compiled._textual_ordered_columns, + + +## ... source file continues with no further ResultMetaData examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown new file mode 100644 index 000000000..f35b67cbb --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown @@ -0,0 +1,164 @@ +title: sqlalchemy.engine.result RowProxy Example Code +category: page +slug: sqlalchemy-engine-result-rowproxy-examples +sortorder: 500031026 +toc: False +sidebartitle: sqlalchemy.engine.result RowProxy +meta: Python example code for the RowProxy class from the sqlalchemy.engine.result module of the SQLAlchemy project. + + +RowProxy is a class within the sqlalchemy.engine.result module of the SQLAlchemy project. + + +## Example 1 from databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + +[**databases / databases / backends / sqlite.py**](https://github.com/encode/databases/blob/master/databases/backends/sqlite.py) + +```python +# sqlite.py +import logging +import typing +import uuid + +import aiosqlite +from sqlalchemy.dialects.sqlite import pysqlite +from sqlalchemy.engine.interfaces import Dialect, ExecutionContext +~~from sqlalchemy.engine.result import ResultMetaData, RowProxy +from sqlalchemy.sql import ClauseElement +from sqlalchemy.types import TypeEngine + +from databases.core import LOG_EXTRA, DatabaseURL +from databases.interfaces import ConnectionBackend, DatabaseBackend, TransactionBackend + +logger = logging.getLogger("databases") + + +class SQLiteBackend(DatabaseBackend): + def __init__( + self, database_url: typing.Union[DatabaseURL, str], **options: typing.Any + ) -> None: + self._database_url = DatabaseURL(database_url) + self._options = options + self._dialect = pysqlite.dialect(paramstyle="qmark") + self._dialect.supports_native_decimal = False + self._pool = SQLitePool(self._database_url, **self._options) + + async def connect(self) -> None: + pass + + async def disconnect(self) -> None: + pass + + +## ... source file abbreviated to get to RowProxy examples ... + + + + +class SQLiteConnection(ConnectionBackend): + def __init__(self, pool: SQLitePool, dialect: Dialect): + self._pool = pool + self._dialect = dialect + self._connection = None + + async def acquire(self) -> None: + assert self._connection is None, "Connection is already acquired" + self._connection = await self._pool.acquire() + + async def release(self) -> None: + assert self._connection is not None, "Connection is not acquired" + await self._pool.release(self._connection) + self._connection = None + + async def fetch_all(self, query: ClauseElement) -> typing.List[typing.Mapping]: + assert self._connection is not None, "Connection is not acquired" + query, args, context = self._compile(query) + + async with self._connection.execute(query, args) as cursor: + rows = await cursor.fetchall() + metadata = ResultMetaData(context, cursor.description) + return [ +~~ RowProxy(metadata, row, metadata._processors, metadata._keymap) + for row in rows + ] + + async def fetch_one(self, query: ClauseElement) -> typing.Optional[typing.Mapping]: + assert self._connection is not None, "Connection is not acquired" + query, args, context = self._compile(query) + + async with self._connection.execute(query, args) as cursor: + row = await cursor.fetchone() + if row is None: + return None + metadata = ResultMetaData(context, cursor.description) +~~ return RowProxy(metadata, row, metadata._processors, metadata._keymap) + + async def execute(self, query: ClauseElement) -> typing.Any: + assert self._connection is not None, "Connection is not acquired" + query, args, context = self._compile(query) + cursor = await self._connection.cursor() + try: + await cursor.execute(query, args) + if cursor.lastrowid == 0: + return cursor.rowcount + return cursor.lastrowid + finally: + await cursor.close() + + async def execute_many(self, queries: typing.List[ClauseElement]) -> None: + assert self._connection is not None, "Connection is not acquired" + for single_query in queries: + await self.execute(single_query) + + async def iterate( + self, query: ClauseElement + ) -> typing.AsyncGenerator[typing.Any, None]: + assert self._connection is not None, "Connection is not acquired" + query, args, context = self._compile(query) + cursor = await self._connection.cursor() + async with self._connection.execute(query, args) as cursor: + metadata = ResultMetaData(context, cursor.description) + async for row in cursor: +~~ yield RowProxy(metadata, row, metadata._processors, metadata._keymap) + + def transaction(self) -> TransactionBackend: + return SQLiteTransaction(self) + + def _compile( + self, query: ClauseElement + ) -> typing.Tuple[str, list, CompilationContext]: + compiled = query.compile(dialect=self._dialect) + args = [] + for key, raw_val in compiled.construct_params().items(): + if key in compiled._bind_processors: + val = compiled._bind_processors[key](raw_val) + else: + val = raw_val + args.append(val) + + execution_context = self._dialect.execution_ctx_cls() + execution_context.dialect = self._dialect + execution_context.result_column_struct = ( + compiled._result_columns, + compiled._ordered_columns, + compiled._textual_ordered_columns, + ) + + + +## ... source file continues with no further RowProxy examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown index dfede6a0e..b4ccd11c8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.engine.strategies EngineStrategy code examples +title: sqlalchemy.engine.strategies EngineStrategy Example Code category: page slug: sqlalchemy-engine-strategies-enginestrategy-examples -sortorder: 500031021 +sortorder: 500031027 toc: False sidebartitle: sqlalchemy.engine.strategies EngineStrategy meta: Python example code for the EngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown index c238b4a20..055a1b334 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.engine.strategies MockEngineStrategy code examples +title: sqlalchemy.engine.strategies MockEngineStrategy Example Code category: page slug: sqlalchemy-engine-strategies-mockenginestrategy-examples -sortorder: 500031022 +sortorder: 500031028 toc: False sidebartitle: sqlalchemy.engine.strategies MockEngineStrategy meta: Python example code for the MockEngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown index 4e48560dd..d12f54f3b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.engine.url make_url code examples +title: sqlalchemy.engine.url make_url Example Code category: page slug: sqlalchemy-engine-url-make-url-examples -sortorder: 500031023 +sortorder: 500031029 toc: False sidebartitle: sqlalchemy.engine.url make_url meta: Python example code for the make_url callable from the sqlalchemy.engine.url module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown index 1829fe97e..f30270bd3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.engine url code examples +title: sqlalchemy.engine url Example Code category: page slug: sqlalchemy-engine-url-examples -sortorder: 500031019 +sortorder: 500031022 toc: False sidebartitle: sqlalchemy.engine url meta: Python example code for the url callable from the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown index 2a611c986..9356d274d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.events SchemaEventTarget code examples +title: sqlalchemy.events SchemaEventTarget Example Code category: page slug: sqlalchemy-events-schemaeventtarget-examples -sortorder: 500031024 +sortorder: 500031030 toc: False sidebartitle: sqlalchemy.events SchemaEventTarget meta: Python example code for the SchemaEventTarget class from the sqlalchemy.events module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown index 1bb2e1259..97b212777 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown @@ -12,6 +12,21 @@ The following open source projects can serve as example code for you as you build your own applications with SQLAlchemy. +### databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + + ### sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown index 0b0a64a3a..9d59ed5ed 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.exc ArgumentError code examples +title: sqlalchemy.exc ArgumentError Example Code category: page slug: sqlalchemy-exc-argumenterror-examples -sortorder: 500031025 +sortorder: 500031031 toc: False sidebartitle: sqlalchemy.exc ArgumentError meta: Python example code for the ArgumentError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown index 430c71e41..20ac0bf3b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.exc DataError code examples +title: sqlalchemy.exc DataError Example Code category: page slug: sqlalchemy-exc-dataerror-examples -sortorder: 500031026 +sortorder: 500031032 toc: False sidebartitle: sqlalchemy.exc DataError meta: Python example code for the DataError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown index 3959b6c18..66619ea93 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.exc IntegrityError code examples +title: sqlalchemy.exc IntegrityError Example Code category: page slug: sqlalchemy-exc-integrityerror-examples -sortorder: 500031027 +sortorder: 500031033 toc: False sidebartitle: sqlalchemy.exc IntegrityError meta: Python example code for the IntegrityError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown index 565b5c4c9..3d4261bf3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.exc InvalidRequestError code examples +title: sqlalchemy.exc InvalidRequestError Example Code category: page slug: sqlalchemy-exc-invalidrequesterror-examples -sortorder: 500031028 +sortorder: 500031034 toc: False sidebartitle: sqlalchemy.exc InvalidRequestError meta: Python example code for the InvalidRequestError class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown index 25afeb1ae..1b568e864 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.exc NoInspectionAvailable code examples +title: sqlalchemy.exc NoInspectionAvailable Example Code category: page slug: sqlalchemy-exc-noinspectionavailable-examples -sortorder: 500031029 +sortorder: 500031035 toc: False sidebartitle: sqlalchemy.exc NoInspectionAvailable meta: Python example code for the NoInspectionAvailable class from the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown index 284f0c8ca..178d7dd68 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.exc OperationalError code examples +title: sqlalchemy.exc OperationalError Example Code category: page slug: sqlalchemy-exc-operationalerror-examples -sortorder: 500031030 +sortorder: 500031036 toc: False sidebartitle: sqlalchemy.exc OperationalError meta: Python example code for the OperationalError class from the sqlalchemy.exc module of the SQLAlchemy project. @@ -28,12 +28,9 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # database.py -try: - from collections.abc import Mapping, Sequence -except ImportError: # For python 2.7 support - from collections import Mapping, Sequence import itertools import os +from collections.abc import Mapping, Sequence from copy import copy import sqlalchemy as sa diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown index 0f735d28c..b4dd29d2a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.exc ProgrammingError code examples +title: sqlalchemy.exc ProgrammingError Example Code category: page slug: sqlalchemy-exc-programmingerror-examples -sortorder: 500031031 +sortorder: 500031037 toc: False sidebartitle: sqlalchemy.exc ProgrammingError meta: Python example code for the ProgrammingError class from the sqlalchemy.exc module of the SQLAlchemy project. @@ -28,12 +28,9 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # database.py -try: - from collections.abc import Mapping, Sequence -except ImportError: # For python 2.7 support - from collections import Mapping, Sequence import itertools import os +from collections.abc import Mapping, Sequence from copy import copy import sqlalchemy as sa diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown index 5776e306d..cc1f10909 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.ext.automap automap_base code examples +title: sqlalchemy.ext.automap automap_base Example Code category: page slug: sqlalchemy-ext-automap-automap-base-examples -sortorder: 500031033 +sortorder: 500031039 toc: False sidebartitle: sqlalchemy.ext.automap automap_base meta: Python example code for the automap_base callable from the sqlalchemy.ext.automap module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown index 900203b0e..e50ef4d6c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.ext.compiler compiles code examples +title: sqlalchemy.ext.compiler compiles Example Code category: page slug: sqlalchemy-ext-compiler-compiles-examples -sortorder: 500031034 +sortorder: 500031040 toc: False sidebartitle: sqlalchemy.ext.compiler compiles meta: Python example code for the compiles callable from the sqlalchemy.ext.compiler module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown index 9afc9628f..c720fd8c1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.ext compiler code examples +title: sqlalchemy.ext compiler Example Code category: page slug: sqlalchemy-ext-compiler-examples -sortorder: 500031032 +sortorder: 500031038 toc: False sidebartitle: sqlalchemy.ext compiler meta: Python example code for the compiler callable from the sqlalchemy.ext module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown index febee93a0..03167ae35 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.ext.declarative declarative_base code examples +title: sqlalchemy.ext.declarative declarative_base Example Code category: page slug: sqlalchemy-ext-declarative-declarative-base-examples -sortorder: 500031036 +sortorder: 500031042 toc: False sidebartitle: sqlalchemy.ext.declarative declarative_base meta: Python example code for the declarative_base callable from the sqlalchemy.ext.declarative module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown index 1f4bcf67b..ebf097004 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.ext.declarative DeclarativeMeta code examples +title: sqlalchemy.ext.declarative DeclarativeMeta Example Code category: page slug: sqlalchemy-ext-declarative-declarativemeta-examples -sortorder: 500031035 +sortorder: 500031041 toc: False sidebartitle: sqlalchemy.ext.declarative DeclarativeMeta meta: Python example code for the DeclarativeMeta class from the sqlalchemy.ext.declarative module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown index be6a39d1d..185f32fd4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.ext.hybrid hybrid_property code examples +title: sqlalchemy.ext.hybrid hybrid_property Example Code category: page slug: sqlalchemy-ext-hybrid-hybrid-property-examples -sortorder: 500031037 +sortorder: 500031043 toc: False sidebartitle: sqlalchemy.ext.hybrid hybrid_property meta: Python example code for the hybrid_property callable from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown index eb9d43b9e..5ec3212d4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.ext.mutable Mutable code examples +title: sqlalchemy.ext.mutable Mutable Example Code category: page slug: sqlalchemy-ext-mutable-mutable-examples -sortorder: 500031038 +sortorder: 500031044 toc: False sidebartitle: sqlalchemy.ext.mutable Mutable meta: Python example code for the Mutable class from the sqlalchemy.ext.mutable module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown index c62046ed5..3b4bbf54e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.inspection inspect code examples +title: sqlalchemy.inspection inspect Example Code category: page slug: sqlalchemy-inspection-inspect-examples -sortorder: 500031039 +sortorder: 500031045 toc: False sidebartitle: sqlalchemy.inspection inspect meta: Python example code for the inspect callable from the sqlalchemy.inspection module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown index 9c69a398a..1b02b99aa 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.attributes InstrumentedAttribute code examples +title: sqlalchemy.orm.attributes InstrumentedAttribute Example Code category: page slug: sqlalchemy-orm-attributes-instrumentedattribute-examples -sortorder: 500031058 +sortorder: 500031064 toc: False sidebartitle: sqlalchemy.orm.attributes InstrumentedAttribute meta: Python example code for the InstrumentedAttribute class from the sqlalchemy.orm.attributes module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown index 85a2e9bac..0ed35017a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm attributes code examples +title: sqlalchemy.orm attributes Example Code category: page slug: sqlalchemy-orm-attributes-examples -sortorder: 500031044 +sortorder: 500031050 toc: False sidebartitle: sqlalchemy.orm attributes meta: Python example code for the attributes callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -28,10 +28,7 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # generic.py -try: - from collections.abc import Iterable -except ImportError: # For python 2.7 support - from collections import Iterable +from collections.abc import Iterable import six import sqlalchemy as sa diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown index 98d2a5842..cb335781a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm backref code examples +title: sqlalchemy.orm backref Example Code category: page slug: sqlalchemy-orm-backref-examples -sortorder: 500031045 +sortorder: 500031051 toc: False sidebartitle: sqlalchemy.orm backref meta: Python example code for the backref callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown index 6826897b6..21a44c491 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm class_mapper code examples +title: sqlalchemy.orm class_mapper Example Code category: page slug: sqlalchemy-orm-class-mapper-examples -sortorder: 500031046 +sortorder: 500031052 toc: False sidebartitle: sqlalchemy.orm class_mapper meta: Python example code for the class_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -105,10 +105,7 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # generic.py -try: - from collections.abc import Iterable -except ImportError: # For python 2.7 support - from collections import Iterable +from collections.abc import Iterable import six import sqlalchemy as sa diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown index a2c662e21..9a68bfdf8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.collections InstrumentedList code examples +title: sqlalchemy.orm.collections InstrumentedList Example Code category: page slug: sqlalchemy-orm-collections-instrumentedlist-examples -sortorder: 500031059 +sortorder: 500031065 toc: False sidebartitle: sqlalchemy.orm.collections InstrumentedList meta: Python example code for the InstrumentedList class from the sqlalchemy.orm.collections module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown index 0456e98f7..65b76ac1c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm column_property code examples +title: sqlalchemy.orm column_property Example Code category: page slug: sqlalchemy-orm-column-property-examples -sortorder: 500031047 +sortorder: 500031053 toc: False sidebartitle: sqlalchemy.orm column_property meta: Python example code for the column_property callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown index 14bd7d57c..eea0ad2a2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm ColumnProperty code examples +title: sqlalchemy.orm ColumnProperty Example Code category: page slug: sqlalchemy-orm-columnproperty-examples -sortorder: 500031040 +sortorder: 500031046 toc: False sidebartitle: sqlalchemy.orm ColumnProperty meta: Python example code for the ColumnProperty class from the sqlalchemy.orm module of the SQLAlchemy project. @@ -181,10 +181,7 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # generic.py -try: - from collections.abc import Iterable -except ImportError: # For python 2.7 support - from collections import Iterable +from collections.abc import Iterable import six import sqlalchemy as sa diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown index 498a041cb..be59de737 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm composite code examples +title: sqlalchemy.orm composite Example Code category: page slug: sqlalchemy-orm-composite-examples -sortorder: 500031048 +sortorder: 500031054 toc: False sidebartitle: sqlalchemy.orm composite meta: Python example code for the composite callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown index 0598a246c..6080aa136 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm CompositeProperty code examples +title: sqlalchemy.orm CompositeProperty Example Code category: page slug: sqlalchemy-orm-compositeproperty-examples -sortorder: 500031041 +sortorder: 500031047 toc: False sidebartitle: sqlalchemy.orm CompositeProperty meta: Python example code for the CompositeProperty class from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown index 2d141d1a5..9bfe3c1ac 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.exc NoResultFound code examples +title: sqlalchemy.orm.exc NoResultFound Example Code category: page slug: sqlalchemy-orm-exc-noresultfound-examples -sortorder: 500031060 +sortorder: 500031066 toc: False sidebartitle: sqlalchemy.orm.exc NoResultFound meta: Python example code for the NoResultFound class from the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown index 8563bbd62..73a08a82b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.exc UnmappedClassError code examples +title: sqlalchemy.orm.exc UnmappedClassError Example Code category: page slug: sqlalchemy-orm-exc-unmappedclasserror-examples -sortorder: 500031061 +sortorder: 500031067 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedClassError meta: Python example code for the UnmappedClassError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown index 786d765e8..5791d189d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.exc UnmappedInstanceError code examples +title: sqlalchemy.orm.exc UnmappedInstanceError Example Code category: page slug: sqlalchemy-orm-exc-unmappedinstanceerror-examples -sortorder: 500031062 +sortorder: 500031068 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedInstanceError meta: Python example code for the UnmappedInstanceError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown index 1a033f09c..45986cbcf 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.interfaces MapperProperty code examples +title: sqlalchemy.orm.interfaces MapperProperty Example Code category: page slug: sqlalchemy-orm-interfaces-mapperproperty-examples -sortorder: 500031063 +sortorder: 500031069 toc: False sidebartitle: sqlalchemy.orm.interfaces MapperProperty meta: Python example code for the MapperProperty class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. @@ -28,10 +28,7 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # generic.py -try: - from collections.abc import Iterable -except ImportError: # For python 2.7 support - from collections import Iterable +from collections.abc import Iterable import six import sqlalchemy as sa diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown index 10097cd00..e1e360fbb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.interfaces PropComparator code examples +title: sqlalchemy.orm.interfaces PropComparator Example Code category: page slug: sqlalchemy-orm-interfaces-propcomparator-examples -sortorder: 500031064 +sortorder: 500031070 toc: False sidebartitle: sqlalchemy.orm.interfaces PropComparator meta: Python example code for the PropComparator class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. @@ -28,10 +28,7 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # generic.py -try: - from collections.abc import Iterable -except ImportError: # For python 2.7 support - from collections import Iterable +from collections.abc import Iterable import six import sqlalchemy as sa diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown index 4d1fcf4c4..dc504cb1b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm interfaces code examples +title: sqlalchemy.orm interfaces Example Code category: page slug: sqlalchemy-orm-interfaces-examples -sortorder: 500031049 +sortorder: 500031055 toc: False sidebartitle: sqlalchemy.orm interfaces meta: Python example code for the interfaces callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown index a09e0ed44..39796ecf0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm mapper code examples +title: sqlalchemy.orm mapper Example Code category: page slug: sqlalchemy-orm-mapper-examples -sortorder: 500031050 +sortorder: 500031056 toc: False sidebartitle: sqlalchemy.orm mapper meta: Python example code for the mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown index 2e3f0da82..dc176d7bb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm mapperlib code examples +title: sqlalchemy.orm mapperlib Example Code category: page slug: sqlalchemy-orm-mapperlib-examples -sortorder: 500031051 +sortorder: 500031057 toc: False sidebartitle: sqlalchemy.orm mapperlib meta: Python example code for the mapperlib callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown index dd6e63f09..69670aff1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm object_mapper code examples +title: sqlalchemy.orm object_mapper Example Code category: page slug: sqlalchemy-orm-object-mapper-examples -sortorder: 500031052 +sortorder: 500031058 toc: False sidebartitle: sqlalchemy.orm object_mapper meta: Python example code for the object_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown index 7d0fcae14..ae3b14a79 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm object_session code examples +title: sqlalchemy.orm object_session Example Code category: page slug: sqlalchemy-orm-object-session-examples -sortorder: 500031053 +sortorder: 500031059 toc: False sidebartitle: sqlalchemy.orm object_session meta: Python example code for the object_session callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown index 7653223ff..a8a37d0d9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.properties ColumnProperty code examples +title: sqlalchemy.orm.properties ColumnProperty Example Code category: page slug: sqlalchemy-orm-properties-columnproperty-examples -sortorder: 500031065 +sortorder: 500031071 toc: False sidebartitle: sqlalchemy.orm.properties ColumnProperty meta: Python example code for the ColumnProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown index fc349034d..befc93dc9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.properties RelationshipProperty code examples +title: sqlalchemy.orm.properties RelationshipProperty Example Code category: page slug: sqlalchemy-orm-properties-relationshipproperty-examples -sortorder: 500031066 +sortorder: 500031072 toc: False sidebartitle: sqlalchemy.orm.properties RelationshipProperty meta: Python example code for the RelationshipProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown index d193fc8eb..4672d42ca 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.query Query code examples +title: sqlalchemy.orm.query Query Example Code category: page slug: sqlalchemy-orm-query-query-examples -sortorder: 500031067 +sortorder: 500031073 toc: False sidebartitle: sqlalchemy.orm.query Query meta: Python example code for the Query class from the sqlalchemy.orm.query module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown index c704e735d..802e50bc9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.query QueryContext code examples +title: sqlalchemy.orm.query QueryContext Example Code category: page slug: sqlalchemy-orm-query-querycontext-examples -sortorder: 500031068 +sortorder: 500031074 toc: False sidebartitle: sqlalchemy.orm.query QueryContext meta: Python example code for the QueryContext class from the sqlalchemy.orm.query module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown index 30a97fc9f..84a24cffe 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm relationship code examples +title: sqlalchemy.orm relationship Example Code category: page slug: sqlalchemy-orm-relationship-examples -sortorder: 500031054 +sortorder: 500031060 toc: False sidebartitle: sqlalchemy.orm relationship meta: Python example code for the relationship callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown index f6a946faa..bae25190b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.session object_session code examples +title: sqlalchemy.orm.session object_session Example Code category: page slug: sqlalchemy-orm-session-object-session-examples -sortorder: 500031070 +sortorder: 500031076 toc: False sidebartitle: sqlalchemy.orm.session object_session meta: Python example code for the object_session callable from the sqlalchemy.orm.session module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown index 117fcc146..3860b1158 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.session Session code examples +title: sqlalchemy.orm.session Session Example Code category: page slug: sqlalchemy-orm-session-session-examples -sortorder: 500031069 +sortorder: 500031075 toc: False sidebartitle: sqlalchemy.orm.session Session meta: Python example code for the Session class from the sqlalchemy.orm.session module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown index 9cb8ebc2e..83f574c3e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm session code examples +title: sqlalchemy.orm session Example Code category: page slug: sqlalchemy-orm-session-examples -sortorder: 500031055 +sortorder: 500031061 toc: False sidebartitle: sqlalchemy.orm session meta: Python example code for the session callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown index 8af486b09..e41283502 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm sessionmaker code examples +title: sqlalchemy.orm sessionmaker Example Code category: page slug: sqlalchemy-orm-sessionmaker-examples -sortorder: 500031056 +sortorder: 500031062 toc: False sidebartitle: sqlalchemy.orm sessionmaker meta: Python example code for the sessionmaker callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown index 72b4aeefb..bda36c37a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm strategies code examples +title: sqlalchemy.orm strategies Example Code category: page slug: sqlalchemy-orm-strategies-examples -sortorder: 500031057 +sortorder: 500031063 toc: False sidebartitle: sqlalchemy.orm strategies meta: Python example code for the strategies callable from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown index 2a34214df..847147c51 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm SynonymProperty code examples +title: sqlalchemy.orm SynonymProperty Example Code category: page slug: sqlalchemy-orm-synonymproperty-examples -sortorder: 500031043 +sortorder: 500031049 toc: False sidebartitle: sqlalchemy.orm SynonymProperty meta: Python example code for the SynonymProperty class from the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown index a9d458bc3..8ede318f9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.orm.util AliasedInsp code examples +title: sqlalchemy.orm.util AliasedInsp Example Code category: page slug: sqlalchemy-orm-util-aliasedinsp-examples -sortorder: 500031071 +sortorder: 500031077 toc: False sidebartitle: sqlalchemy.orm.util AliasedInsp meta: Python example code for the AliasedInsp class from the sqlalchemy.orm.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown index 9d3fdb841..6d9e35b40 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.pool NullPool code examples +title: sqlalchemy.pool NullPool Example Code category: page slug: sqlalchemy-pool-nullpool-examples -sortorder: 500031072 +sortorder: 500031078 toc: False sidebartitle: sqlalchemy.pool NullPool meta: Python example code for the NullPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown index e5ed53326..2a8d18108 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.pool StaticPool code examples +title: sqlalchemy.pool StaticPool Example Code category: page slug: sqlalchemy-pool-staticpool-examples -sortorder: 500031073 +sortorder: 500031079 toc: False sidebartitle: sqlalchemy.pool StaticPool meta: Python example code for the StaticPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown index aac58d419..9c38e885c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.schema CheckConstraint code examples +title: sqlalchemy.schema CheckConstraint Example Code category: page slug: sqlalchemy-schema-checkconstraint-examples -sortorder: 500031074 +sortorder: 500031080 toc: False sidebartitle: sqlalchemy.schema CheckConstraint meta: Python example code for the CheckConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown index 9a1b22d1f..60240fe32 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.schema Column code examples +title: sqlalchemy.schema Column Example Code category: page slug: sqlalchemy-schema-column-examples -sortorder: 500031075 +sortorder: 500031081 toc: False sidebartitle: sqlalchemy.schema Column meta: Python example code for the Column class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown index 8f80f7b41..a637d20ee 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.schema CreateIndex code examples +title: sqlalchemy.schema CreateIndex Example Code category: page slug: sqlalchemy-schema-createindex-examples -sortorder: 500031076 +sortorder: 500031082 toc: False sidebartitle: sqlalchemy.schema CreateIndex meta: Python example code for the CreateIndex class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown index c83aa530a..3a476a733 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.schema DDLElement code examples +title: sqlalchemy.schema DDLElement Example Code category: page slug: sqlalchemy-schema-ddlelement-examples -sortorder: 500031077 +sortorder: 500031083 toc: False sidebartitle: sqlalchemy.schema DDLElement meta: Python example code for the DDLElement class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown index 097f3e665..104866203 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.schema ForeignKey code examples +title: sqlalchemy.schema ForeignKey Example Code category: page slug: sqlalchemy-schema-foreignkey-examples -sortorder: 500031078 +sortorder: 500031084 toc: False sidebartitle: sqlalchemy.schema ForeignKey meta: Python example code for the ForeignKey class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown index 41f2a7065..a7e7dd2dd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.schema ForeignKeyConstraint code examples +title: sqlalchemy.schema ForeignKeyConstraint Example Code category: page slug: sqlalchemy-schema-foreignkeyconstraint-examples -sortorder: 500031079 +sortorder: 500031085 toc: False sidebartitle: sqlalchemy.schema ForeignKeyConstraint meta: Python example code for the ForeignKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown index 234e335da..ffd40e3a1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.schema PrimaryKeyConstraint code examples +title: sqlalchemy.schema PrimaryKeyConstraint Example Code category: page slug: sqlalchemy-schema-primarykeyconstraint-examples -sortorder: 500031080 +sortorder: 500031086 toc: False sidebartitle: sqlalchemy.schema PrimaryKeyConstraint meta: Python example code for the PrimaryKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown index 076320664..70c3bc48d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.schema Table code examples +title: sqlalchemy.schema Table Example Code category: page slug: sqlalchemy-schema-table-examples -sortorder: 500031081 +sortorder: 500031087 toc: False sidebartitle: sqlalchemy.schema Table meta: Python example code for the Table class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown index b4831ccbb..6c40f1e32 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql ClauseElement code examples +title: sqlalchemy.sql ClauseElement Example Code category: page slug: sqlalchemy-sql-clauseelement-examples -sortorder: 500031082 +sortorder: 500031088 toc: False sidebartitle: sqlalchemy.sql ClauseElement meta: Python example code for the ClauseElement class from the sqlalchemy.sql module of the SQLAlchemy project. @@ -10,7 +10,59 @@ meta: Python example code for the ClauseElement class from the sqlalchemy.sql mo ClauseElement is a class within the sqlalchemy.sql module of the SQLAlchemy project. -## Example 1 from GINO +## Example 1 from databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + +[**databases / databases / interfaces.py**](https://github.com/encode/databases/blob/master/databases/./interfaces.py) + +```python +# interfaces.py +import typing + +~~from sqlalchemy.sql import ClauseElement + + +class DatabaseBackend: + async def connect(self) -> None: + raise NotImplementedError() # pragma: no cover + + async def disconnect(self) -> None: + raise NotImplementedError() # pragma: no cover + + def connection(self) -> "ConnectionBackend": + raise NotImplementedError() # pragma: no cover + + +class ConnectionBackend: + async def acquire(self) -> None: + raise NotImplementedError() # pragma: no cover + + async def release(self) -> None: + raise NotImplementedError() # pragma: no cover + + async def fetch_all(self, query: ClauseElement) -> typing.List[typing.Mapping]: + raise NotImplementedError() # pragma: no cover + + async def fetch_one(self, query: ClauseElement) -> typing.Optional[typing.Mapping]: + + +## ... source file continues with no further ClauseElement examples... + +``` + + +## Example 2 from GINO [GINO](https://github.com/fantix/gino) ([project documentation](https://python-gino.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown index 413cfd83c..cbf3db86b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql column code examples +title: sqlalchemy.sql column Example Code category: page slug: sqlalchemy-sql-column-examples -sortorder: 500031083 +sortorder: 500031089 toc: False sidebartitle: sqlalchemy.sql column meta: Python example code for the column callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown index a02453f65..d95801257 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.elements ColumnElement code examples +title: sqlalchemy.sql.elements ColumnElement Example Code category: page slug: sqlalchemy-sql-elements-columnelement-examples -sortorder: 500031091 +sortorder: 500031097 toc: False sidebartitle: sqlalchemy.sql.elements ColumnElement meta: Python example code for the ColumnElement class from the sqlalchemy.sql.elements module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown index a90cd2f8a..afc180584 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.elements Label code examples +title: sqlalchemy.sql.elements Label Example Code category: page slug: sqlalchemy-sql-elements-label-examples -sortorder: 500031092 +sortorder: 500031098 toc: False sidebartitle: sqlalchemy.sql.elements Label meta: Python example code for the Label class from the sqlalchemy.sql.elements module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown index 0328ab4f0..1e8163a97 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.expression ClauseElement code examples +title: sqlalchemy.sql.expression ClauseElement Example Code category: page slug: sqlalchemy-sql-expression-clauseelement-examples -sortorder: 500031093 +sortorder: 500031099 toc: False sidebartitle: sqlalchemy.sql.expression ClauseElement meta: Python example code for the ClauseElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown index e822a7a75..642112ab4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.expression ColumnClause code examples +title: sqlalchemy.sql.expression ColumnClause Example Code category: page slug: sqlalchemy-sql-expression-columnclause-examples -sortorder: 500031094 +sortorder: 500031100 toc: False sidebartitle: sqlalchemy.sql.expression ColumnClause meta: Python example code for the ColumnClause class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown index 7868da851..05a8f620d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.expression ColumnElement code examples +title: sqlalchemy.sql.expression ColumnElement Example Code category: page slug: sqlalchemy-sql-expression-columnelement-examples -sortorder: 500031095 +sortorder: 500031101 toc: False sidebartitle: sqlalchemy.sql.expression ColumnElement meta: Python example code for the ColumnElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown index 2b9ff8375..90a4f4134 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.expression Executable code examples +title: sqlalchemy.sql.expression Executable Example Code category: page slug: sqlalchemy-sql-expression-executable-examples -sortorder: 500031096 +sortorder: 500031102 toc: False sidebartitle: sqlalchemy.sql.expression Executable meta: Python example code for the Executable class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown index 54461f8ac..9a11488f6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.expression FunctionElement code examples +title: sqlalchemy.sql.expression FunctionElement Example Code category: page slug: sqlalchemy-sql-expression-functionelement-examples -sortorder: 500031097 +sortorder: 500031103 toc: False sidebartitle: sqlalchemy.sql.expression FunctionElement meta: Python example code for the FunctionElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown index bd5ed7915..9a25ab17b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.expression UnaryExpression code examples +title: sqlalchemy.sql.expression UnaryExpression Example Code category: page slug: sqlalchemy-sql-expression-unaryexpression-examples -sortorder: 500031098 +sortorder: 500031104 toc: False sidebartitle: sqlalchemy.sql.expression UnaryExpression meta: Python example code for the UnaryExpression class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown index 60543618f..d2be14cf7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql expression code examples +title: sqlalchemy.sql expression Example Code category: page slug: sqlalchemy-sql-expression-examples -sortorder: 500031084 +sortorder: 500031090 toc: False sidebartitle: sqlalchemy.sql expression meta: Python example code for the expression callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown index d4cb9f6ce..6dc8d50a7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.functions FunctionElement code examples +title: sqlalchemy.sql.functions FunctionElement Example Code category: page slug: sqlalchemy-sql-functions-functionelement-examples -sortorder: 500031099 +sortorder: 500031105 toc: False sidebartitle: sqlalchemy.sql.functions FunctionElement meta: Python example code for the FunctionElement class from the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown index 503290188..133d1ceb0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.functions GenericFunction code examples +title: sqlalchemy.sql.functions GenericFunction Example Code category: page slug: sqlalchemy-sql-functions-genericfunction-examples -sortorder: 500031100 +sortorder: 500031106 toc: False sidebartitle: sqlalchemy.sql.functions GenericFunction meta: Python example code for the GenericFunction class from the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown index 1da772853..e4c21051b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql functions code examples +title: sqlalchemy.sql functions Example Code category: page slug: sqlalchemy-sql-functions-examples -sortorder: 500031085 +sortorder: 500031091 toc: False sidebartitle: sqlalchemy.sql functions meta: Python example code for the functions callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown index ac6f88b07..0db6e99b8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.naming conv code examples +title: sqlalchemy.sql.naming conv Example Code category: page slug: sqlalchemy-sql-naming-conv-examples -sortorder: 500031101 +sortorder: 500031107 toc: False sidebartitle: sqlalchemy.sql.naming conv meta: Python example code for the conv callable from the sqlalchemy.sql.naming module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown index 5e5ab2e1a..b6befbaad 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql operators code examples +title: sqlalchemy.sql operators Example Code category: page slug: sqlalchemy-sql-operators-examples -sortorder: 500031086 +sortorder: 500031092 toc: False sidebartitle: sqlalchemy.sql operators meta: Python example code for the operators callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown new file mode 100644 index 000000000..3582c0c9c --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown @@ -0,0 +1,124 @@ +title: sqlalchemy.sql.schema Column Example Code +category: page +slug: sqlalchemy-sql-schema-column-examples +sortorder: 500031108 +toc: False +sidebartitle: sqlalchemy.sql.schema Column +meta: Python example code for the Column class from the sqlalchemy.sql.schema module of the SQLAlchemy project. + + +Column is a class within the sqlalchemy.sql.schema module of the SQLAlchemy project. + + +## Example 1 from databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + +[**databases / databases / backends / postgres.py**](https://github.com/encode/databases/blob/master/databases/backends/postgres.py) + +```python +# postgres.py +import logging +import typing +from collections.abc import Mapping + +import asyncpg +from sqlalchemy.dialects.postgresql import pypostgresql +from sqlalchemy.engine.interfaces import Dialect +from sqlalchemy.sql import ClauseElement +~~from sqlalchemy.sql.schema import Column +from sqlalchemy.types import TypeEngine + +from databases.core import LOG_EXTRA, DatabaseURL +from databases.interfaces import ConnectionBackend, DatabaseBackend, TransactionBackend + +logger = logging.getLogger("databases") + + +_result_processors = {} # type: dict + + +class PostgresBackend(DatabaseBackend): + def __init__( + self, database_url: typing.Union[DatabaseURL, str], **options: typing.Any + ) -> None: + self._database_url = DatabaseURL(database_url) + self._options = options + self._dialect = self._get_dialect() + self._pool = None + + def _get_dialect(self) -> Dialect: + dialect = pypostgresql.dialect(paramstyle="pyformat") + + dialect.implicit_returning = True + + +## ... source file abbreviated to get to Column examples ... + + + "_column_map_full", + ) + + def __init__( + self, + row: asyncpg.Record, + result_columns: tuple, + dialect: Dialect, + column_maps: typing.Tuple[ + typing.Mapping[typing.Any, typing.Tuple[int, TypeEngine]], + typing.Mapping[int, typing.Tuple[int, TypeEngine]], + typing.Mapping[str, typing.Tuple[int, TypeEngine]], + ], + ) -> None: + self._row = row + self._result_columns = result_columns + self._dialect = dialect + self._column_map, self._column_map_int, self._column_map_full = column_maps + + def values(self) -> typing.ValuesView: + return self._row.values() + + def __getitem__(self, key: typing.Any) -> typing.Any: + if len(self._column_map) == 0: # raw query + return self._row[key] +~~ elif isinstance(key, Column): + idx, datatype = self._column_map_full[str(key)] + elif isinstance(key, int): + idx, datatype = self._column_map_int[key] + else: + idx, datatype = self._column_map[key] + raw = self._row[idx] + try: + processor = _result_processors[datatype] + except KeyError: + processor = datatype.result_processor(self._dialect, None) + _result_processors[datatype] = processor + + if processor is not None: + return processor(raw) + return raw + + def __iter__(self) -> typing.Iterator: + return iter(self._row.keys()) + + def __len__(self) -> int: + return len(self._row) + + +class PostgresConnection(ConnectionBackend): + + +## ... source file continues with no further Column examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown index 3e4169c03..0d8f0d2e0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.schema SchemaItem code examples +title: sqlalchemy.sql.schema SchemaItem Example Code category: page slug: sqlalchemy-sql-schema-schemaitem-examples -sortorder: 500031102 +sortorder: 500031109 toc: False sidebartitle: sqlalchemy.sql.schema SchemaItem meta: Python example code for the SchemaItem class from the sqlalchemy.sql.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown index 21bcef778..e740f417d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql schema code examples +title: sqlalchemy.sql schema Example Code category: page slug: sqlalchemy-sql-schema-examples -sortorder: 500031087 +sortorder: 500031093 toc: False sidebartitle: sqlalchemy.sql schema meta: Python example code for the schema callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown index 7919cb711..190efac73 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql select code examples +title: sqlalchemy.sql select Example Code category: page slug: sqlalchemy-sql-select-examples -sortorder: 500031088 +sortorder: 500031094 toc: False sidebartitle: sqlalchemy.sql select meta: Python example code for the select callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown index 3bda4a3b8..2843c88de 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.sqltypes NullType code examples +title: sqlalchemy.sql.sqltypes NullType Example Code category: page slug: sqlalchemy-sql-sqltypes-nulltype-examples -sortorder: 500031103 +sortorder: 500031110 toc: False sidebartitle: sqlalchemy.sql.sqltypes NullType meta: Python example code for the NullType class from the sqlalchemy.sql.sqltypes module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown index 265c704dd..61a3e7b6c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql sqltypes code examples +title: sqlalchemy.sql sqltypes Example Code category: page slug: sqlalchemy-sql-sqltypes-examples -sortorder: 500031089 +sortorder: 500031095 toc: False sidebartitle: sqlalchemy.sql sqltypes meta: Python example code for the sqltypes callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown index c0342e565..f67b661d3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql table code examples +title: sqlalchemy.sql table Example Code category: page slug: sqlalchemy-sql-table-examples -sortorder: 500031090 +sortorder: 500031096 toc: False sidebartitle: sqlalchemy.sql table meta: Python example code for the table callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown index 856dad916..9776ec2f2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.util ClauseAdapter code examples +title: sqlalchemy.sql.util ClauseAdapter Example Code category: page slug: sqlalchemy-sql-util-clauseadapter-examples -sortorder: 500031104 +sortorder: 500031111 toc: False sidebartitle: sqlalchemy.sql.util ClauseAdapter meta: Python example code for the ClauseAdapter class from the sqlalchemy.sql.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown index da13c5102..8f613b746 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.sql.visitors traverse code examples +title: sqlalchemy.sql.visitors traverse Example Code category: page slug: sqlalchemy-sql-visitors-traverse-examples -sortorder: 500031105 +sortorder: 500031112 toc: False sidebartitle: sqlalchemy.sql.visitors traverse meta: Python example code for the traverse callable from the sqlalchemy.sql.visitors module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown index 04dc63bb3..9328980b8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.types Boolean code examples +title: sqlalchemy.types Boolean Example Code category: page slug: sqlalchemy-types-boolean-examples -sortorder: 500031106 +sortorder: 500031113 toc: False sidebartitle: sqlalchemy.types Boolean meta: Python example code for the Boolean class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown index b2fad0f7a..bd7cb518b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.types Enum code examples +title: sqlalchemy.types Enum Example Code category: page slug: sqlalchemy-types-enum-examples -sortorder: 500031107 +sortorder: 500031114 toc: False sidebartitle: sqlalchemy.types Enum meta: Python example code for the Enum class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown index 81e6beb3a..47bd51c10 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.types Integer code examples +title: sqlalchemy.types Integer Example Code category: page slug: sqlalchemy-types-integer-examples -sortorder: 500031108 +sortorder: 500031115 toc: False sidebartitle: sqlalchemy.types Integer meta: Python example code for the Integer class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown index f28cd89bc..0ce9275a6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.types NULLTYPE code examples +title: sqlalchemy.types NULLTYPE Example Code category: page slug: sqlalchemy-types-nulltype-examples -sortorder: 500031109 +sortorder: 500031116 toc: False sidebartitle: sqlalchemy.types NULLTYPE meta: Python example code for the NULLTYPE constant from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown index 9474cd303..de92eb952 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.types String code examples +title: sqlalchemy.types String Example Code category: page slug: sqlalchemy-types-string-examples -sortorder: 500031110 +sortorder: 500031117 toc: False sidebartitle: sqlalchemy.types String meta: Python example code for the String class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown index a0cdf48a6..9dc4e109e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.types to_instance code examples +title: sqlalchemy.types to_instance Example Code category: page slug: sqlalchemy-types-to-instance-examples -sortorder: 500031112 +sortorder: 500031120 toc: False sidebartitle: sqlalchemy.types to_instance meta: Python example code for the to_instance callable from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown new file mode 100644 index 000000000..61339384a --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown @@ -0,0 +1,70 @@ +title: sqlalchemy.types TypeEngine Example Code +category: page +slug: sqlalchemy-types-typeengine-examples +sortorder: 500031118 +toc: False +sidebartitle: sqlalchemy.types TypeEngine +meta: Python example code for the TypeEngine class from the sqlalchemy.types module of the SQLAlchemy project. + + +TypeEngine is a class within the sqlalchemy.types module of the SQLAlchemy project. + + +## Example 1 from databases +[databases](https://github.com/encode/databases) +([project homepage](https://www.encode.io/databases/) +and +[PyPI page](https://pypi.org/project/databases/) provides +[asyncio](https://docs.python.org/3/library/asyncio.html) support +with an [SQLALchemy](/sqlalchemy.html) Core interface for common +[relational databases](/databases.html) such as [MySQL](/mysql.html), +[PostgreSQL](/postgresql.html) and [SQLite](/sqlite.html). This is +handy for integrating with asynchronous I/O +[web frameworks](/web-frameworks.html) like [Sanic](/sanic.html). +The project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). + +[**databases / databases / backends / sqlite.py**](https://github.com/encode/databases/blob/master/databases/backends/sqlite.py) + +```python +# sqlite.py +import logging +import typing +import uuid + +import aiosqlite +from sqlalchemy.dialects.sqlite import pysqlite +from sqlalchemy.engine.interfaces import Dialect, ExecutionContext +from sqlalchemy.engine.result import ResultMetaData, RowProxy +from sqlalchemy.sql import ClauseElement +~~from sqlalchemy.types import TypeEngine + +from databases.core import LOG_EXTRA, DatabaseURL +from databases.interfaces import ConnectionBackend, DatabaseBackend, TransactionBackend + +logger = logging.getLogger("databases") + + +class SQLiteBackend(DatabaseBackend): + def __init__( + self, database_url: typing.Union[DatabaseURL, str], **options: typing.Any + ) -> None: + self._database_url = DatabaseURL(database_url) + self._options = options + self._dialect = pysqlite.dialect(paramstyle="qmark") + self._dialect.supports_native_decimal = False + self._pool = SQLitePool(self._database_url, **self._options) + + async def connect(self) -> None: + pass + + async def disconnect(self) -> None: + pass + + def connection(self) -> "SQLiteConnection": + + +## ... source file continues with no further TypeEngine examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown index d13a087ee..c61492c65 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.types UserDefinedType code examples +title: sqlalchemy.types UserDefinedType Example Code category: page slug: sqlalchemy-types-userdefinedtype-examples -sortorder: 500031111 +sortorder: 500031119 toc: False sidebartitle: sqlalchemy.types UserDefinedType meta: Python example code for the UserDefinedType class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown index 5030f31d0..ce622b530 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.util.langhelpers symbol code examples +title: sqlalchemy.util.langhelpers symbol Example Code category: page slug: sqlalchemy-util-langhelpers-symbol-examples -sortorder: 500031117 +sortorder: 500031125 toc: False sidebartitle: sqlalchemy.util.langhelpers symbol meta: Python example code for the symbol callable from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown index 80836f281..487221c37 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.util OrderedDict code examples +title: sqlalchemy.util OrderedDict Example Code category: page slug: sqlalchemy-util-ordereddict-examples -sortorder: 500031113 +sortorder: 500031121 toc: False sidebartitle: sqlalchemy.util OrderedDict meta: Python example code for the OrderedDict class from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown index 838ebc5ae..487bc17e4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.util OrderedSet code examples +title: sqlalchemy.util OrderedSet Example Code category: page slug: sqlalchemy-util-orderedset-examples -sortorder: 500031114 +sortorder: 500031122 toc: False sidebartitle: sqlalchemy.util OrderedSet meta: Python example code for the OrderedSet class from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown index ff55bb879..044a3a7d3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.util set_creation_order code examples +title: sqlalchemy.util set_creation_order Example Code category: page slug: sqlalchemy-util-set-creation-order-examples -sortorder: 500031115 +sortorder: 500031123 toc: False sidebartitle: sqlalchemy.util set_creation_order meta: Python example code for the set_creation_order callable from the sqlalchemy.util module of the SQLAlchemy project. @@ -28,10 +28,7 @@ and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/ag ```python # generic.py -try: - from collections.abc import Iterable -except ImportError: # For python 2.7 support - from collections import Iterable +from collections.abc import Iterable import six import sqlalchemy as sa diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown index 56eab8171..6b3160ac6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown @@ -1,7 +1,7 @@ -title: sqlalchemy.util topological code examples +title: sqlalchemy.util topological Example Code category: page slug: sqlalchemy-util-topological-examples -sortorder: 500031116 +sortorder: 500031124 toc: False sidebartitle: sqlalchemy.util topological meta: Python example code for the topological callable from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/theme/templates/code-examples/sqlalchemy.html b/theme/templates/code-examples/sqlalchemy.html index e8427b41d..40d7bcc40 100644 --- a/theme/templates/code-examples/sqlalchemy.html +++ b/theme/templates/code-examples/sqlalchemy.html @@ -11,6 +11,9 @@

sqlalchemy.dialects postgresql, sqlite

+

sqlalchemy.dialects.mysql + pymysql +

sqlalchemy.dialects.postgresql ARRAY, BIGINT, @@ -21,7 +24,8 @@

sqlalchemy.dialects.postgresql JSON, TSVECTOR, array, - json + json, + pypostgresql

sqlalchemy.dialects.postgresql.base PGTypeCompiler @@ -29,6 +33,9 @@

sqlalchemy.dialects.postgresql.base

sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2

+

sqlalchemy.dialects.sqlite + pysqlite +

sqlalchemy.engine Connection, Engine, @@ -39,6 +46,13 @@

sqlalchemy.engine

sqlalchemy.engine.default DefaultDialect

+

sqlalchemy.engine.interfaces + ExecutionContext +

+

sqlalchemy.engine.result + ResultMetaData, + RowProxy +

sqlalchemy.engine.strategies EngineStrategy, MockEngineStrategy @@ -178,6 +192,7 @@

sqlalchemy.sql.naming conv

sqlalchemy.sql.schema + Column, SchemaItem

sqlalchemy.sql.sqltypes @@ -199,6 +214,7 @@

sqlalchemy.types NULLTYPE, NullType, String, + TypeEngine, UserDefinedType, to_instance

From 1d088d772c78ceda1f65897e0fa95c3255ca30ae Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 5 Jul 2020 21:28:34 -0400 Subject: [PATCH 168/302] add new django code examples --- .../django-extensions-plug-ins.markdown | 22 + ...tils-version-get-complete-version.markdown | 51 ++ .../django/django-views-csrf.markdown | 102 ++++ ...default-exception-reporter-filter.markdown | 67 +++ ...views-decorators-csrf-csrf-exempt.markdown | 123 ++++ ...s-debug-sensitive-post-parameters.markdown | 102 ++++ ...views-decorators-http-require-get.markdown | 274 +++++++++ ...iews-decorators-http-require-post.markdown | 303 ++++++++++ ...o-views-generic-base-redirectview.markdown | 89 +++ ...eneric-base-templateresponsemixin.markdown | 238 ++++++++ ...o-views-generic-base-templateview.markdown | 174 ++++++ .../django-views-generic-base-view.markdown | 524 ++++++++++++++++ .../django-views-generic-createview.markdown | 84 +++ .../django-views-generic-deleteview.markdown | 61 ++ ...-generic-detail-singleobjectmixin.markdown | 65 ++ .../django-views-generic-detailview.markdown | 135 +++++ ...ngo-views-generic-edit-createview.markdown | 132 +++++ ...ngo-views-generic-edit-deleteview.markdown | 132 +++++ ...-views-generic-edit-deletionmixin.markdown | 120 ++++ ...ango-views-generic-edit-formmixin.markdown | 73 +++ ...jango-views-generic-edit-formview.markdown | 317 ++++++++++ .../django-views-generic-formview.markdown | 383 ++++++++++++ ...jango-views-generic-list-listview.markdown | 163 +++++ ...-generic-list-multipleobjectmixin.markdown | 73 +++ .../django-views-generic-listview.markdown | 509 ++++++++++++++++ ...django-views-generic-redirectview.markdown | 167 ++++++ ...django-views-generic-templateview.markdown | 558 ++++++++++++++++++ .../django-views-generic-updateview.markdown | 195 ++++++ .../django/django-views-generic-view.markdown | 427 ++++++++++++++ ...ango-views-i18n-javascriptcatalog.markdown | 62 ++ .../django/django-views-static-serve.markdown | 56 ++ ...o-views-static-was-modified-since.markdown | 106 ++++ content/pages/meta/00-change-log.markdown | 4 +- theme/templates/code-examples/django.html | 57 ++ 34 files changed, 5947 insertions(+), 1 deletion(-) create mode 100644 content/pages/examples/django/django-utils-version-get-complete-version.markdown create mode 100644 content/pages/examples/django/django-views-csrf.markdown create mode 100644 content/pages/examples/django/django-views-debug-get-default-exception-reporter-filter.markdown create mode 100644 content/pages/examples/django/django-views-decorators-csrf-csrf-exempt.markdown create mode 100644 content/pages/examples/django/django-views-decorators-debug-sensitive-post-parameters.markdown create mode 100644 content/pages/examples/django/django-views-decorators-http-require-get.markdown create mode 100644 content/pages/examples/django/django-views-decorators-http-require-post.markdown create mode 100644 content/pages/examples/django/django-views-generic-base-redirectview.markdown create mode 100644 content/pages/examples/django/django-views-generic-base-templateresponsemixin.markdown create mode 100644 content/pages/examples/django/django-views-generic-base-templateview.markdown create mode 100644 content/pages/examples/django/django-views-generic-base-view.markdown create mode 100644 content/pages/examples/django/django-views-generic-createview.markdown create mode 100644 content/pages/examples/django/django-views-generic-deleteview.markdown create mode 100644 content/pages/examples/django/django-views-generic-detail-singleobjectmixin.markdown create mode 100644 content/pages/examples/django/django-views-generic-detailview.markdown create mode 100644 content/pages/examples/django/django-views-generic-edit-createview.markdown create mode 100644 content/pages/examples/django/django-views-generic-edit-deleteview.markdown create mode 100644 content/pages/examples/django/django-views-generic-edit-deletionmixin.markdown create mode 100644 content/pages/examples/django/django-views-generic-edit-formmixin.markdown create mode 100644 content/pages/examples/django/django-views-generic-edit-formview.markdown create mode 100644 content/pages/examples/django/django-views-generic-formview.markdown create mode 100644 content/pages/examples/django/django-views-generic-list-listview.markdown create mode 100644 content/pages/examples/django/django-views-generic-list-multipleobjectmixin.markdown create mode 100644 content/pages/examples/django/django-views-generic-listview.markdown create mode 100644 content/pages/examples/django/django-views-generic-redirectview.markdown create mode 100644 content/pages/examples/django/django-views-generic-templateview.markdown create mode 100644 content/pages/examples/django/django-views-generic-updateview.markdown create mode 100644 content/pages/examples/django/django-views-generic-view.markdown create mode 100644 content/pages/examples/django/django-views-i18n-javascriptcatalog.markdown create mode 100644 content/pages/examples/django/django-views-static-serve.markdown create mode 100644 content/pages/examples/django/django-views-static-was-modified-since.markdown diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 80b74c554..709511183 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -545,6 +545,18 @@ and maintained by the collaborative developer community group [Jazzband](https://jazzband.co/). +### django-user-visit +[django-user-visit](https://github.com/yunojuno/django-user-visit) +([PyPI package information](https://pypi.org/project/django-user-visit/)) +is a [Django](/django.html) app and +[middleware](https://docs.djangoproject.com/en/stable/topics/http/middleware/) +for tracking daily user visits to your web application. The goal +is to record per user per day instead of for every request a user +sends to the application. The project is provided as open source +under the +[MIT license](https://github.com/yunojuno/django-user-visit/blob/master/LICENSE). + + ### django-webshell [django-webshell](https://github.com/onrik/django-webshell) is an extension for executing arbitrary code in the @@ -584,6 +596,16 @@ The code for django-wiki is provided as open source under the [GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). +### elasticsearch-django +[elasticsearch-django](https://github.com/yunojuno/elasticsearch-django) +([PyPI package information](https://pypi.org/project/elasticsearch-django/)) +is a [Django](/django.html) app for managing +[ElasticSearch](https://github.com/elastic/elasticsearch) indexes +populated by [Django ORM](/django-orm.html) models. The project is +available as open source under the +[MIT license](https://github.com/yunojuno/elasticsearch-django/blob/master/LICENSE). + + ### pytest-django [pytest-django](https://github.com/pytest-dev/pytest-django) ([project documentation](https://pytest-django.readthedocs.io/en/latest/) diff --git a/content/pages/examples/django/django-utils-version-get-complete-version.markdown b/content/pages/examples/django/django-utils-version-get-complete-version.markdown new file mode 100644 index 000000000..b11ff5577 --- /dev/null +++ b/content/pages/examples/django/django-utils-version-get-complete-version.markdown @@ -0,0 +1,51 @@ +title: django.utils.version get_complete_version Example Code +category: page +slug: django-utils-version-get-complete-version-examples +sortorder: 500011513 +toc: False +sidebartitle: django.utils.version get_complete_version +meta: Python example code for the get_complete_version callable from the django.utils.version module of the Django project. + + +get_complete_version is a callable within the django.utils.version module of the Django project. + + +## Example 1 from django-webtest +[django-webtest](https://github.com/django-webtest/django-webtest) +([PyPI package information](https://pypi.org/project/django-webtest/)) +is a [Django](/django.html) extension that makes it easier to use +[WebTest](http://docs.pylonsproject.org/projects/webtest/) with +your projects. + +The project is open sourced under the +[MIT license](https://github.com/django-webtest/django-webtest/blob/master/LICENSE.txt). + +[**django-webtest / django_webtest / backends.py**](https://github.com/django-webtest/django-webtest/blob/master/django_webtest/./backends.py) + +```python +# backends.py +from __future__ import absolute_import +~~from django.utils.version import get_complete_version +from django.contrib.auth.backends import RemoteUserBackend +from django_webtest.compat import from_wsgi_safe_string + +class WebtestUserBackend(RemoteUserBackend): + +~~ if get_complete_version() >= (1, 11): + def authenticate(self, request, django_webtest_user): + return super(WebtestUserBackend, self).authenticate( + request, django_webtest_user) + else: + def authenticate(self, django_webtest_user): + return super(WebtestUserBackend, self).authenticate( + django_webtest_user) + + def clean_username(self, username): + return from_wsgi_safe_string(username) + + + +## ... source file continues with no further get_complete_version examples... + +``` + diff --git a/content/pages/examples/django/django-views-csrf.markdown b/content/pages/examples/django/django-views-csrf.markdown new file mode 100644 index 000000000..3db00a9cf --- /dev/null +++ b/content/pages/examples/django/django-views-csrf.markdown @@ -0,0 +1,102 @@ +title: django.views csrf Example Code +category: page +slug: django-views-csrf-examples +sortorder: 500011514 +toc: False +sidebartitle: django.views csrf +meta: Python example code for the csrf callable from the django.views module of the Django project. + + +csrf is a callable within the django.views module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / tests.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./tests.py) + +```python +# tests.py +from __future__ import unicode_literals + +import json +import requests +from datetime import date, datetime + +import django +from django.core.files.base import ContentFile +from django.db import models +from django.test import RequestFactory, TestCase +from django.utils.http import base36_to_int, int_to_base36 +~~from django.views import csrf + +from . import utils + + +try: + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch # noqa + + +class MockedResponse(object): + def __init__(self, status_code, content, headers=None): + if headers is None: + headers = {} + + self.status_code = status_code + self.content = content.encode('utf8') + self.headers = headers + + def json(self): + return json.loads(self.text) + + def raise_for_status(self): + pass + + +## ... source file abbreviated to get to csrf examples ... + + + + self.assertEqual(serialized['bb'], 'c29tZSBiaW5hcnkgZGF0YQ==') + self.assertEqual(serialized['bb_empty'], '') + self.assertEqual(deserialized.bb, b'some binary data') + self.assertEqual(deserialized.bb_empty, b'') + + def test_build_absolute_uri(self): + self.assertEqual( + utils.build_absolute_uri(None, '/foo'), + 'http://example.com/foo') + self.assertEqual( + utils.build_absolute_uri(None, '/foo', protocol='ftp'), + 'ftp://example.com/foo') + self.assertEqual( + utils.build_absolute_uri(None, 'http://foo.com/bar'), + 'http://foo.com/bar') + + def test_int_to_base36(self): + n = 55798679658823689999 + b36 = 'brxk553wvxbf3' + assert int_to_base36(n) == b36 + assert base36_to_int(b36) == n + + def test_templatetag_with_csrf_failure(self): + request = self.factory.get('/tests/test_403_csrf.html') +~~ response = csrf.csrf_failure( + request, + template_name='tests/test_403_csrf.html' + ) + self.assertEqual(response.status_code, 403) + + + +## ... source file continues with no further csrf examples... + +``` + diff --git a/content/pages/examples/django/django-views-debug-get-default-exception-reporter-filter.markdown b/content/pages/examples/django/django-views-debug-get-default-exception-reporter-filter.markdown new file mode 100644 index 000000000..9fe6bd2e6 --- /dev/null +++ b/content/pages/examples/django/django-views-debug-get-default-exception-reporter-filter.markdown @@ -0,0 +1,67 @@ +title: django.views.debug get_default_exception_reporter_filter Example Code +category: page +slug: django-views-debug-get-default-exception-reporter-filter-examples +sortorder: 500011515 +toc: False +sidebartitle: django.views.debug get_default_exception_reporter_filter +meta: Python example code for the get_default_exception_reporter_filter callable from the django.views.debug module of the Django project. + + +get_default_exception_reporter_filter is a callable within the django.views.debug module of the Django project. + + +## Example 1 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / panels / settings.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/settings.py) + +```python +# settings.py +from collections import OrderedDict + +import django +from django.conf import settings +from django.utils.translation import gettext_lazy as _ + +from debug_toolbar.panels import Panel + +if django.VERSION >= (3, 1): +~~ from django.views.debug import get_default_exception_reporter_filter + +~~ get_safe_settings = get_default_exception_reporter_filter().get_safe_settings +else: + from django.views.debug import get_safe_settings + + +class SettingsPanel(Panel): + + template = "debug_toolbar/panels/settings.html" + + nav_title = _("Settings") + + def title(self): + return _("Settings from %s") % settings.SETTINGS_MODULE + + def generate_stats(self, request, response): + self.record_stats( + { + "settings": OrderedDict( + sorted(get_safe_settings().items(), key=lambda s: s[0]) + ) + } + ) + + + +## ... source file continues with no further get_default_exception_reporter_filter examples... + +``` + diff --git a/content/pages/examples/django/django-views-decorators-csrf-csrf-exempt.markdown b/content/pages/examples/django/django-views-decorators-csrf-csrf-exempt.markdown new file mode 100644 index 000000000..3a0d4c446 --- /dev/null +++ b/content/pages/examples/django/django-views-decorators-csrf-csrf-exempt.markdown @@ -0,0 +1,123 @@ +title: django.views.decorators.csrf csrf_exempt Example Code +category: page +slug: django-views-decorators-csrf-csrf-exempt-examples +sortorder: 500011516 +toc: False +sidebartitle: django.views.decorators.csrf csrf_exempt +meta: Python example code for the csrf_exempt callable from the django.views.decorators.csrf module of the Django project. + + +csrf_exempt is a callable within the django.views.decorators.csrf module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / viewsets.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./viewsets.py) + +```python +# viewsets.py +from collections import OrderedDict +from functools import update_wrapper +from inspect import getmembers + +from django.urls import NoReverseMatch +from django.utils.decorators import classonlymethod +~~from django.views.decorators.csrf import csrf_exempt + +from rest_framework import generics, mixins, views +from rest_framework.decorators import MethodMapper +from rest_framework.reverse import reverse + + +def _is_extra_action(attr): + return hasattr(attr, 'mapping') and isinstance(attr.mapping, MethodMapper) + + +class ViewSetMixin: + + @classonlymethod + def as_view(cls, actions=None, **initkwargs): + cls.name = None + cls.description = None + + cls.suffix = None + + cls.detail = None + + cls.basename = None + + if not actions: + + +## ... source file abbreviated to get to csrf_exempt examples ... + + + def view(request, *args, **kwargs): + self = cls(**initkwargs) + + if 'get' in actions and 'head' not in actions: + actions['head'] = actions['get'] + + self.action_map = actions + + for method, action in actions.items(): + handler = getattr(self, action) + setattr(self, method, handler) + + self.request = request + self.args = args + self.kwargs = kwargs + + return self.dispatch(request, *args, **kwargs) + + update_wrapper(view, cls, updated=()) + + update_wrapper(view, cls.dispatch, assigned=()) + + view.cls = cls + view.initkwargs = initkwargs + view.actions = actions +~~ return csrf_exempt(view) + + def initialize_request(self, request, *args, **kwargs): + request = super().initialize_request(request, *args, **kwargs) + method = request.method.lower() + if method == 'options': + self.action = 'metadata' + else: + self.action = self.action_map.get(method) + return request + + def reverse_action(self, url_name, *args, **kwargs): + url_name = '%s-%s' % (self.basename, url_name) + namespace = None + if self.request and self.request.resolver_match: + namespace = self.request.resolver_match.namespace + if namespace: + url_name = namespace + ':' + url_name + kwargs.setdefault('request', self.request) + + return reverse(url_name, *args, **kwargs) + + @classmethod + def get_extra_actions(cls): + return [method for _, method in getmembers(cls, _is_extra_action)] + + +## ... source file continues with no further csrf_exempt examples... + +``` + diff --git a/content/pages/examples/django/django-views-decorators-debug-sensitive-post-parameters.markdown b/content/pages/examples/django/django-views-decorators-debug-sensitive-post-parameters.markdown new file mode 100644 index 000000000..14a313c5d --- /dev/null +++ b/content/pages/examples/django/django-views-decorators-debug-sensitive-post-parameters.markdown @@ -0,0 +1,102 @@ +title: django.views.decorators.debug sensitive_post_parameters Example Code +category: page +slug: django-views-decorators-debug-sensitive-post-parameters-examples +sortorder: 500011517 +toc: False +sidebartitle: django.views.decorators.debug sensitive_post_parameters +meta: Python example code for the sensitive_post_parameters callable from the django.views.decorators.debug module of the Django project. + + +sensitive_post_parameters is a callable within the django.views.decorators.debug module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / views.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.contrib.sites.shortcuts import get_current_site +from django.http import ( + Http404, + HttpResponsePermanentRedirect, + HttpResponseRedirect, +) +from django.shortcuts import redirect +from django.urls import reverse, reverse_lazy +from django.utils.decorators import method_decorator +~~from django.views.decorators.debug import sensitive_post_parameters +from django.views.generic.base import TemplateResponseMixin, TemplateView, View +from django.views.generic.edit import FormView + +from ..exceptions import ImmediateHttpResponse +from ..utils import get_form_class, get_request_param +from . import app_settings, signals +from .adapter import get_adapter +from .forms import ( + AddEmailForm, + ChangePasswordForm, + LoginForm, + ResetPasswordForm, + ResetPasswordKeyForm, + SetPasswordForm, + SignupForm, + UserTokenForm, +) +from .models import EmailAddress, EmailConfirmation, EmailConfirmationHMAC +from .utils import ( + complete_signup, + get_login_redirect_url, + get_next_redirect_url, + logout_on_password_change, + passthrough_next_redirect_url, + perform_login, + sync_user_email_addresses, + url_str_to_user_pk, +) + + +INTERNAL_RESET_URL_KEY = "set-password" +INTERNAL_RESET_SESSION_KEY = "_password_reset_key" + + +sensitive_post_parameters_m = method_decorator( +~~ sensitive_post_parameters( + 'oldpassword', 'password', 'password1', 'password2')) + + +def _ajax_response(request, response, form=None, data=None): + adapter = get_adapter(request) + if adapter.is_ajax(request): + if (isinstance(response, HttpResponseRedirect) or isinstance( + response, HttpResponsePermanentRedirect)): + redirect_to = response['Location'] + else: + redirect_to = None + response = adapter.ajax_response( + request, + response, + form=form, + data=data, + redirect_to=redirect_to) + return response + + +class RedirectAuthenticatedUserMixin(object): + + def dispatch(self, request, *args, **kwargs): + if request.user.is_authenticated and \ + + +## ... source file continues with no further sensitive_post_parameters examples... + +``` + diff --git a/content/pages/examples/django/django-views-decorators-http-require-get.markdown b/content/pages/examples/django/django-views-decorators-http-require-get.markdown new file mode 100644 index 000000000..5c2406f20 --- /dev/null +++ b/content/pages/examples/django/django-views-decorators-http-require-get.markdown @@ -0,0 +1,274 @@ +title: django.views.decorators.http require_GET Example Code +category: page +slug: django-views-decorators-http-require-get-examples +sortorder: 500011518 +toc: False +sidebartitle: django.views.decorators.http require_GET +meta: Python example code for the require_GET callable from the django.views.decorators.http module of the Django project. + + +require_GET is a callable within the django.views.decorators.http module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / submissions / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/submissions/views.py) + +```python +# views.py +import mimetypes + +from django.contrib import messages +from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth.decorators import login_required +from django.http import Http404, HttpResponse, HttpResponseForbidden, \ + HttpResponseRedirect, JsonResponse +from django.shortcuts import render, redirect, get_object_or_404 +~~from django.views.decorators.http import require_POST, require_GET + +from conferences.models import Conference +from conferences.utilities import validate_chair_access +from submissions.forms import CreateSubmissionForm, SubmissionDetailsForm, \ + AuthorCreateForm, AuthorsReorderForm, AuthorDeleteForm, \ + UploadReviewManuscriptForm, InviteAuthorForm, UploadAttachmentForm, \ + UpdateSubmissionStatusForm +from submissions.models import Submission, Author, Attachment +from submissions.utilities import is_authorized_edit, \ + is_authorized_view_attachment + + +def _create_submission(request, form): + if request.method == 'POST': + if form.is_valid(): + submission = form.save() + + submission.created_by = request.user + submission.save() + Author.objects.create( + submission=submission, + order=1, + user=request.user + ) + + +## ... source file abbreviated to get to require_GET examples ... + + + 'submission': submission, + 'form': form, + }) + return HttpResponseForbidden() + + +@login_required +@require_POST +def delete_manuscript(request, pk): + submission = get_object_or_404(Submission, pk=pk) + if submission.review_manuscript_editable_by(request.user): + file_name = submission.get_review_manuscript_name() + if submission.review_manuscript: + submission.review_manuscript.delete() + return render( + request, + 'submissions/components/file_deleted_message.html', { + 'alert_class': 'warning', + 'file_name': file_name, + }) + else: + return HttpResponseForbidden() + + +@login_required +~~@require_GET +def download_manuscript(request, pk): + submission = get_object_or_404(Submission, pk=pk) + if submission.is_manuscript_viewable_by(request.user): + if submission.review_manuscript: + filename = submission.get_review_manuscript_name() + mtype = mimetypes.guess_type(filename)[0] + response = HttpResponse( + submission.review_manuscript.file, + content_type=mtype + ) + response['Content-Disposition'] = f'filename={filename}' + return response + raise Http404 + return HttpResponseForbidden() + + +@login_required +def submission_overview(request, pk): + submission = get_object_or_404(Submission, pk=pk) + deadline = '' + + show_finish = not submission.reached_overview + if show_finish: + submission.reached_overview = True + + +## ... source file abbreviated to get to require_GET examples ... + + + submission = get_object_or_404(Submission, pk=pk) + if submission.authors_editable_by(request.user): + form = AuthorsReorderForm(submission, request.POST) + if form.is_valid(): + form.save() + return redirect('submissions:authors', pk=pk) + return HttpResponseForbidden() + + +@login_required +@require_POST +def send_invitation(request, pk): + submission = get_object_or_404(Submission, pk=pk) + if submission.authors_editable_by(request.user): + form = InviteAuthorForm(request.POST) + if form.is_valid(): + form.save(request, submission) + messages.success(request, _('Invitation sent')) + else: + messages.warning(request, _('Errors while sending invitation')) + return redirect('submissions:authors', pk=pk) + return HttpResponseForbidden() + + +@login_required +~~@require_GET +def camera_ready(request, pk): + submission = get_object_or_404(Submission, pk=pk) + if submission.status not in [Submission.ACCEPTED, Submission.IN_PRINT, + Submission.PUBLISHED]: + raise Http404 + return render(request, 'submissions/camera_ready.html', context={ + 'submission': submission, + 'editable': True, + }) + + +@login_required +~~@require_GET +def download_attachment(request, pk, att_pk): + submission = get_object_or_404(Submission, pk=pk) + attachment = Attachment.objects.get(pk=att_pk) + if not is_authorized_view_attachment(request.user, submission): + return HttpResponseForbidden() + if attachment.file: + filename = attachment.get_file_name() + mtype = mimetypes.guess_type(filename)[0] + response = HttpResponse(attachment.file.file, content_type=mtype) + response['Content-Disposition'] = f'filename={filename}' + return response + raise Http404 + + +@login_required +@require_POST +def upload_attachment(request, pk, att_pk): + submission = get_object_or_404(Submission, pk=pk) + attachment = get_object_or_404(Attachment, pk=att_pk) + if not is_authorized_edit(request.user, submission): + return HttpResponseForbidden() + form = UploadAttachmentForm( + request.POST, request.FILES, instance=attachment) + old_file = attachment.file.file if attachment.file else None + + +## ... source file continues with no further require_GET examples... + +``` + + +## Example 2 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / views.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./views.py) + +```python +# views.py +~~from django.views.decorators.http import require_POST, require_GET +from jet.forms import AddBookmarkForm, RemoveBookmarkForm, ToggleApplicationPinForm, ModelLookupForm +from jet.models import Bookmark +from jet.utils import JsonResponse + + +@require_POST +def add_bookmark_view(request): + result = {'error': False} + form = AddBookmarkForm(request, request.POST) + + if form.is_valid(): + bookmark = form.save() + result.update({ + 'id': bookmark.pk, + 'title': bookmark.title, + 'url': bookmark.url + }) + else: + result['error'] = True + + return JsonResponse(result) + + +@require_POST + + +## ... source file abbreviated to get to require_GET examples ... + + + + if form.is_valid(): + form.save() + else: + result['error'] = True + except Bookmark.DoesNotExist: + result['error'] = True + + return JsonResponse(result) + + +@require_POST +def toggle_application_pin_view(request): + result = {'error': False} + form = ToggleApplicationPinForm(request, request.POST) + + if form.is_valid(): + pinned = form.save() + result['pinned'] = pinned + else: + result['error'] = True + + return JsonResponse(result) + + +~~@require_GET +def model_lookup_view(request): + result = {'error': False} + + form = ModelLookupForm(request, request.GET) + + if form.is_valid(): + items, total = form.lookup() + result['items'] = items + result['total'] = total + else: + result['error'] = True + + return JsonResponse(result) + + + +## ... source file continues with no further require_GET examples... + +``` + diff --git a/content/pages/examples/django/django-views-decorators-http-require-post.markdown b/content/pages/examples/django/django-views-decorators-http-require-post.markdown new file mode 100644 index 000000000..1348baa8b --- /dev/null +++ b/content/pages/examples/django/django-views-decorators-http-require-post.markdown @@ -0,0 +1,303 @@ +title: django.views.decorators.http require_POST Example Code +category: page +slug: django-views-decorators-http-require-post-examples +sortorder: 500011519 +toc: False +sidebartitle: django.views.decorators.http require_POST +meta: Python example code for the require_POST callable from the django.views.decorators.http module of the Django project. + + +require_POST is a callable within the django.views.decorators.http module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair_mail / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair_mail/views.py) + +```python +# views.py +from django.contrib import messages +from django.http import JsonResponse, HttpResponse +from django.shortcuts import render, get_object_or_404, redirect +from django.template.loader import get_template +from django.urls import reverse +from django.utils import timezone +~~from django.views.decorators.http import require_GET, require_POST + +from conferences.utilities import validate_chair_access +from chair_mail.context import USER_VARS, CONFERENCE_VARS, SUBMISSION_VARS, \ + FRAME_VARS +from chair_mail.forms import EmailFrameUpdateForm, EmailFrameTestForm, \ + MessageForm, get_preview_form_class, EditNotificationForm, \ + UpdateNotificationStateForm +from chair_mail.mailing_lists import ALL_LISTS +from chair_mail.models import EmailSettings, EmailFrame, EmailMessage, \ + GroupMessage, MSG_TYPE_USER, MSG_TYPE_SUBMISSION, get_group_message_model, \ + get_message_leaf_model, SystemNotification, DEFAULT_NOTIFICATIONS_DATA +from chair_mail.utility import get_email_frame, get_email_frame_or_404, \ + reverse_preview_url, reverse_list_objects_url, get_object_name, \ + get_object_url +from conferences.models import Conference + + +def _get_grouped_vars(msg_type): + if msg_type == MSG_TYPE_USER: + return ( + ('Conference variables', CONFERENCE_VARS), + ('User variables', USER_VARS) + ) + elif msg_type == MSG_TYPE_SUBMISSION: + return ( + ('Conference variables', CONFERENCE_VARS), + ('User variables', USER_VARS), + ('Submission variables', SUBMISSION_VARS), + ) + raise ValueError(f'unrecognized message type "{msg_type}"') + + +@require_GET +def overview(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + frame = get_email_frame(conference) + return render(request, 'chair_mail/tab_pages/overview.html', context={ + 'conference': conference, + 'frame': frame, + 'active_tab': 'overview', + }) + + +~~@require_POST +def create_frame(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + if not hasattr(conference, 'email_settings'): + EmailSettings.objects.create(conference=conference) + email_settings = conference.email_settings + frame = email_settings.frame + template_html = get_template( + 'chair_mail/email/default_frame_html.html').template + template_plain = get_template( + 'chair_mail/email/default_frame_plain.txt').template + if frame: + frame.text_html = template_html.source + frame.text_plain = template_plain.source + frame.created_at = timezone.now() + frame.updated_at = timezone.now() + frame.created_by = request.user + frame.save() + messages.success(request, 'Reset existing frame') + else: + frame = EmailFrame.objects.create( + conference=conference, + created_by=request.user, + text_plain=template_plain.source, + + +## ... source file abbreviated to get to require_POST examples ... + + + form = EmailFrameUpdateForm(instance=frame) + + return render(request, 'chair_mail/tab_pages/frame_details.html', context={ + 'conference': conference, + 'frame': frame, + 'active_tab': 'frame', + 'form': form, + 'variables': FRAME_VARS, + }) + + +@require_GET +def sent_messages(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + frame = get_email_frame(conference) + msg_list = conference.sent_group_emails.all().order_by('-sent_at') + return render(request, 'chair_mail/tab_pages/messages.html', context={ + 'conference': conference, + 'active_tab': 'messages', + 'frame': frame, + 'msg_list': msg_list, + }) + + +~~@require_POST +def send_frame_test_message(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + form = EmailFrameTestForm(request.POST) + if form.is_valid(): + form.send_message(request.user, conference) + return JsonResponse({'email': request.user.email}) + resp = JsonResponse({'email': request.user.email}) + resp.status_code = 400 + return resp + + +@require_GET +def group_message_details(request, conf_pk, msg_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + msg = get_object_or_404(GroupMessage, pk=msg_pk) + leaf_msg = get_message_leaf_model(msg) + recipients = [{ + 'name': get_object_name(leaf_msg.message_type, obj), + 'url': get_object_url(leaf_msg.message_type, conference, obj), + } for obj in leaf_msg.recipients.all()] + + if request.is_ajax(): + + +## ... source file abbreviated to get to require_POST examples ... + + + 'sent_at': msg.sent_at, + 'sent_by': msg.sent_by.pk if msg.sent_by else '', + 'user_to': msg.user_to.pk, + }) + next_url = request.GET.get('next', default='') + return render( + request, 'chair_mail/preview_pages/email_message_preview.html', + context={ + 'conference': conference, + 'msg': msg, + 'next': next_url, + }) + + +def help_compose(request): + return render(request, 'chair_mail/compose/help.html', context={ + 'variables': ( + ('User variables', USER_VARS), + ('Submission variables', SUBMISSION_VARS), + ('Conference variables', CONFERENCE_VARS), + ), + 'mailing_lists': ALL_LISTS, + }) + + +~~@require_POST +def delete_all_messages(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + num_group_messages = GroupMessage.objects.count() + num_email_messages = EmailMessage.objects.count() + GroupMessage.objects.all().delete() + EmailMessage.objects.all().delete() + messages.success( + request, f'Deleted {num_group_messages} group messages and ' + f'{num_email_messages} messages instances' + ) + return redirect('chair_mail:sent-messages', conf_pk=conf_pk) + + +@require_GET +def render_frame_preview(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + frame = get_email_frame(conference) + if frame: + body = f"

Dear {request.user.profile.get_full_name()},

" \ + f"

this is a frame preview.

" + subject = 'Frame preview' + html = frame.render_html(subject, body) + return HttpResponse(html) + return HttpResponse() + + +@require_GET +def notifications_list(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + return render(request, 'chair_mail/tab_pages/notifications.html', context={ + 'conference': conference, + 'frame': get_email_frame(conference), + 'active_tab': 'notifications', + }) + + +~~@require_POST +def reset_all_notifications(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + conference.notifications.all().delete() + for name, kwargs in DEFAULT_NOTIFICATIONS_DATA.items(): + SystemNotification.objects.create(name=name, conference=conference, + **kwargs) + return redirect('chair_mail:notifications', conf_pk) + + +~~@require_POST +def refresh_notifications(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + for name, kwargs in DEFAULT_NOTIFICATIONS_DATA.items(): + notif = SystemNotification.objects.filter( + name=name, conference=conference).first() + if not notif: + SystemNotification.objects.create( + name=name, conference=conference, **kwargs) + return redirect('chair_mail:notifications', conf_pk) + + +~~@require_POST +def reset_notification(request, conf_pk, notif_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + notification = get_object_or_404(SystemNotification, pk=notif_pk) + data = DEFAULT_NOTIFICATIONS_DATA[notification.name] + notification.subject = data['subject'] + notification.type = data['type'] + notification.body = data['body'] + notification.save() + return redirect('chair_mail:notifications', conf_pk) + + +def notification_details(request, conf_pk, notif_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + notification = get_object_or_404(SystemNotification, pk=notif_pk) + if request.method == 'POST': + notif_form = EditNotificationForm(request.POST, instance=notification) + if notif_form.is_valid(): + notif_form.save() + messages.success(request, 'Your changes were saved') + return redirect( + 'chair_mail:notification-details', conf_pk, notif_pk) + else: + notif_form = EditNotificationForm(instance=notification) + + return render( + request, 'chair_mail/tab_pages/notification_details.html', context={ + 'conference': conference, + 'notification': notification, + 'hide_tabs': True, + 'notif_form': notif_form, + 'variables': _get_grouped_vars(notification.type), + 'preview_url': reverse_preview_url(notification.type, conference), + 'preview_form': get_preview_form_class(notification.type)(), + 'list_objects_url': + reverse_list_objects_url(notification.type, conference), + }) + + +~~@require_POST +def update_notification_state(request, conf_pk, notif_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + notification = get_object_or_404(SystemNotification, pk=notif_pk) + form = UpdateNotificationStateForm(request.POST, instance=notification) + if form.is_valid(): + form.save() + return redirect('chair_mail:notifications', conf_pk) + + + +## ... source file continues with no further require_POST examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-base-redirectview.markdown b/content/pages/examples/django/django-views-generic-base-redirectview.markdown new file mode 100644 index 000000000..ff13471ea --- /dev/null +++ b/content/pages/examples/django/django-views-generic-base-redirectview.markdown @@ -0,0 +1,89 @@ +title: django.views.generic.base RedirectView Example Code +category: page +slug: django-views-generic-base-redirectview-examples +sortorder: 500011529 +toc: False +sidebartitle: django.views.generic.base RedirectView +meta: Python example code for the RedirectView class from the django.views.generic.base module of the Django project. + + +RedirectView is a class within the django.views.generic.base module of the Django project. + + +## Example 1 from django-oscar +[django-oscar](https://github.com/django-oscar/django-oscar/) +([project website](http://oscarcommerce.com/)) +is a framework for building e-commerce sites on top of +[Django](/django.html). The code for the project is available open +source under a +[custom license written by Tangent Communications PLC](https://github.com/django-oscar/django-oscar/blob/master/LICENSE). + +[**django-oscar / src / oscar / config.py**](https://github.com/django-oscar/django-oscar/blob/master/src/oscar/config.py) + +```python +# config.py + +from django.apps import apps +from django.conf import settings +from django.conf.urls import url +from django.urls import reverse_lazy +~~from django.views.generic.base import RedirectView + +from oscar.core.application import OscarConfig +from oscar.core.loading import get_class + + +class Shop(OscarConfig): + name = 'oscar' + + def ready(self): + from django.contrib.auth.forms import SetPasswordForm + + self.catalogue_app = apps.get_app_config('catalogue') + self.customer_app = apps.get_app_config('customer') + self.basket_app = apps.get_app_config('basket') + self.checkout_app = apps.get_app_config('checkout') + self.search_app = apps.get_app_config('search') + self.dashboard_app = apps.get_app_config('dashboard') + self.offer_app = apps.get_app_config('offer') + + self.password_reset_form = get_class('customer.forms', 'PasswordResetForm') + self.set_password_form = SetPasswordForm + + def get_urls(self): + from django.contrib.auth import views as auth_views + + from oscar.views.decorators import login_forbidden + + urls = [ +~~ url(r'^$', RedirectView.as_view(url=settings.OSCAR_HOMEPAGE), name='home'), + url(r'^catalogue/', self.catalogue_app.urls), + url(r'^basket/', self.basket_app.urls), + url(r'^checkout/', self.checkout_app.urls), + url(r'^accounts/', self.customer_app.urls), + url(r'^search/', self.search_app.urls), + url(r'^dashboard/', self.dashboard_app.urls), + url(r'^offers/', self.offer_app.urls), + + url(r'^password-reset/$', + login_forbidden( + auth_views.PasswordResetView.as_view( + form_class=self.password_reset_form, + success_url=reverse_lazy('password-reset-done'), + template_name='oscar/registration/password_reset_form.html' + ) + ), + name='password-reset'), + url(r'^password-reset/done/$', + login_forbidden(auth_views.PasswordResetDoneView.as_view( + template_name='oscar/registration/password_reset_done.html' + )), + name='password-reset-done'), + url(r'^password-reset/confirm/(?P[0-9A-Za-z_\-]+)/(?P.+)/$', + login_forbidden( + + +## ... source file continues with no further RedirectView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-base-templateresponsemixin.markdown b/content/pages/examples/django/django-views-generic-base-templateresponsemixin.markdown new file mode 100644 index 000000000..f7805b63f --- /dev/null +++ b/content/pages/examples/django/django-views-generic-base-templateresponsemixin.markdown @@ -0,0 +1,238 @@ +title: django.views.generic.base TemplateResponseMixin Example Code +category: page +slug: django-views-generic-base-templateresponsemixin-examples +sortorder: 500011530 +toc: False +sidebartitle: django.views.generic.base TemplateResponseMixin +meta: Python example code for the TemplateResponseMixin class from the django.views.generic.base module of the Django project. + + +TemplateResponseMixin is a class within the django.views.generic.base module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / views.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.contrib.sites.shortcuts import get_current_site +from django.http import ( + Http404, + HttpResponsePermanentRedirect, + HttpResponseRedirect, +) +from django.shortcuts import redirect +from django.urls import reverse, reverse_lazy +from django.utils.decorators import method_decorator +from django.views.decorators.debug import sensitive_post_parameters +~~from django.views.generic.base import TemplateResponseMixin, TemplateView, View +from django.views.generic.edit import FormView + +from ..exceptions import ImmediateHttpResponse +from ..utils import get_form_class, get_request_param +from . import app_settings, signals +from .adapter import get_adapter +from .forms import ( + AddEmailForm, + ChangePasswordForm, + LoginForm, + ResetPasswordForm, + ResetPasswordKeyForm, + SetPasswordForm, + SignupForm, + UserTokenForm, +) +from .models import EmailAddress, EmailConfirmation, EmailConfirmationHMAC +from .utils import ( + complete_signup, + get_login_redirect_url, + get_next_redirect_url, + logout_on_password_change, + passthrough_next_redirect_url, + perform_login, + + +## ... source file abbreviated to get to TemplateResponseMixin examples ... + + + def get_context_data(self, **kwargs): + ret = super(SignupView, self).get_context_data(**kwargs) + form = ret['form'] + email = self.request.session.get('account_verified_email') + if email: + email_keys = ['email'] + if app_settings.SIGNUP_EMAIL_ENTER_TWICE: + email_keys.append('email2') + for email_key in email_keys: + form.fields[email_key].initial = email + login_url = passthrough_next_redirect_url(self.request, + reverse("account_login"), + self.redirect_field_name) + redirect_field_name = self.redirect_field_name + redirect_field_value = get_request_param(self.request, + redirect_field_name) + ret.update({"login_url": login_url, + "redirect_field_name": redirect_field_name, + "redirect_field_value": redirect_field_value}) + return ret + + +signup = SignupView.as_view() + + +~~class ConfirmEmailView(TemplateResponseMixin, View): + + template_name = "account/email_confirm." + app_settings.TEMPLATE_EXTENSION + + def get(self, *args, **kwargs): + try: + self.object = self.get_object() + if app_settings.CONFIRM_EMAIL_ON_GET: + return self.post(*args, **kwargs) + except Http404: + self.object = None + ctx = self.get_context_data() + return self.render_to_response(ctx) + + def post(self, *args, **kwargs): + self.object = confirmation = self.get_object() + confirmation.confirm(self.request) + get_adapter(self.request).add_message( + self.request, + messages.SUCCESS, + 'account/messages/email_confirmed.txt', + {'email': confirmation.email_address.email}) + if app_settings.LOGIN_ON_EMAIL_CONFIRMATION: + resp = self.login_on_confirm(confirmation) + if resp is not None: + + +## ... source file abbreviated to get to TemplateResponseMixin examples ... + + + 'account/messages/password_changed.txt') + signals.password_reset.send(sender=self.reset_user.__class__, + request=self.request, + user=self.reset_user) + + if app_settings.LOGIN_ON_PASSWORD_RESET: + return perform_login( + self.request, self.reset_user, + email_verification=app_settings.EMAIL_VERIFICATION) + + return super(PasswordResetFromKeyView, self).form_valid(form) + + +password_reset_from_key = PasswordResetFromKeyView.as_view() + + +class PasswordResetFromKeyDoneView(TemplateView): + template_name = ( + "account/password_reset_from_key_done." + + app_settings.TEMPLATE_EXTENSION) + + +password_reset_from_key_done = PasswordResetFromKeyDoneView.as_view() + + +~~class LogoutView(TemplateResponseMixin, View): + + template_name = "account/logout." + app_settings.TEMPLATE_EXTENSION + redirect_field_name = "next" + + def get(self, *args, **kwargs): + if app_settings.LOGOUT_ON_GET: + return self.post(*args, **kwargs) + if not self.request.user.is_authenticated: + response = redirect(self.get_redirect_url()) + return _ajax_response(self.request, response) + ctx = self.get_context_data() + response = self.render_to_response(ctx) + return _ajax_response(self.request, response) + + def post(self, *args, **kwargs): + url = self.get_redirect_url() + if self.request.user.is_authenticated: + self.logout() + response = redirect(url) + return _ajax_response(self.request, response) + + def logout(self): + adapter = get_adapter(self.request) + adapter.add_message( + + +## ... source file continues with no further TemplateResponseMixin examples... + +``` + + +## Example 2 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / mixins.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/mixins.py) + +```python +# mixins.py +import logging + +~~from django.views.generic.base import TemplateResponseMixin +from wiki.conf import settings +from wiki.core.plugins import registry + +log = logging.getLogger(__name__) + + +~~class ArticleMixin(TemplateResponseMixin): + + + def dispatch(self, request, article, *args, **kwargs): + self.urlpath = kwargs.pop("urlpath", None) + self.article = article + self.children_slice = [] + if settings.SHOW_MAX_CHILDREN > 0: + try: + for child in self.article.get_children( + max_num=settings.SHOW_MAX_CHILDREN + 1, + articles__article__current_revision__deleted=False, + user_can_read=request.user, + ): + self.children_slice.append(child) + except AttributeError as e: + log.error( + "Attribute error most likely caused by wrong MPTT version. Use 0.5.3+.\n\n" + + str(e) + ) + raise + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + kwargs["urlpath"] = self.urlpath + + +## ... source file continues with no further TemplateResponseMixin examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-base-templateview.markdown b/content/pages/examples/django/django-views-generic-base-templateview.markdown new file mode 100644 index 000000000..7028e0f30 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-base-templateview.markdown @@ -0,0 +1,174 @@ +title: django.views.generic.base TemplateView Example Code +category: page +slug: django-views-generic-base-templateview-examples +sortorder: 500011531 +toc: False +sidebartitle: django.views.generic.base TemplateView +meta: Python example code for the TemplateView class from the django.views.generic.base module of the Django project. + + +TemplateView is a class within the django.views.generic.base module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / views.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.contrib.sites.shortcuts import get_current_site +from django.http import HttpResponseRedirect +from django.urls import reverse, reverse_lazy +~~from django.views.generic.base import TemplateView +from django.views.generic.edit import FormView + +from ..account import app_settings as account_settings +from ..account.adapter import get_adapter as get_account_adapter +from ..account.views import ( + AjaxCapableProcessFormViewMixin, + CloseableSignupMixin, + RedirectAuthenticatedUserMixin, +) +from ..utils import get_form_class +from . import app_settings, helpers +from .adapter import get_adapter +from .forms import DisconnectForm, SignupForm +from .models import SocialAccount, SocialLogin + + +class SignupView(RedirectAuthenticatedUserMixin, CloseableSignupMixin, + AjaxCapableProcessFormViewMixin, FormView): + form_class = SignupForm + template_name = ( + 'socialaccount/signup.' + account_settings.TEMPLATE_EXTENSION) + + def get_form_class(self): + return get_form_class(app_settings.FORMS, + + +## ... source file abbreviated to get to TemplateView examples ... + + + + def get_form_kwargs(self): + ret = super(SignupView, self).get_form_kwargs() + ret['sociallogin'] = self.sociallogin + return ret + + def form_valid(self, form): + self.request.session.pop('socialaccount_sociallogin', None) + form.save(self.request) + return helpers.complete_social_signup(self.request, + self.sociallogin) + + def get_context_data(self, **kwargs): + ret = super(SignupView, self).get_context_data(**kwargs) + ret.update(dict(site=get_current_site(self.request), + account=self.sociallogin.account)) + return ret + + def get_authenticated_redirect_url(self): + return reverse(connections) + + +signup = SignupView.as_view() + + +~~class LoginCancelledView(TemplateView): + template_name = ( + "socialaccount/login_cancelled." + account_settings.TEMPLATE_EXTENSION) + + +login_cancelled = LoginCancelledView.as_view() + + +~~class LoginErrorView(TemplateView): + template_name = ( + "socialaccount/authentication_error." + + account_settings.TEMPLATE_EXTENSION) + + +login_error = LoginErrorView.as_view() + + +class ConnectionsView(AjaxCapableProcessFormViewMixin, FormView): + template_name = ( + "socialaccount/connections." + + account_settings.TEMPLATE_EXTENSION) + form_class = DisconnectForm + success_url = reverse_lazy("socialaccount_connections") + + def get_form_class(self): + return get_form_class(app_settings.FORMS, + 'disconnect', + self.form_class) + + def get_form_kwargs(self): + kwargs = super(ConnectionsView, self).get_form_kwargs() + kwargs["request"] = self.request + return kwargs + + +## ... source file continues with no further TemplateView examples... + +``` + + +## Example 2 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / deleted_list.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/deleted_list.py) + +```python +# deleted_list.py +from django.shortcuts import redirect +~~from django.views.generic.base import TemplateView +from wiki import models + + +~~class DeletedListView(TemplateView): + + template_name = "wiki/deleted_list.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_superuser: + return redirect("wiki:root") + + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + article_list = models.Article.objects.all() + deleted_articles = [] + for article in article_list: + if article.current_revision.deleted: + deleted_articles.append(article) + kwargs["deleted_articles"] = deleted_articles + return super().get_context_data(**kwargs) + + + +## ... source file continues with no further TemplateView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-base-view.markdown b/content/pages/examples/django/django-views-generic-base-view.markdown new file mode 100644 index 000000000..f21476c33 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-base-view.markdown @@ -0,0 +1,524 @@ +title: django.views.generic.base View Example Code +category: page +slug: django-views-generic-base-view-examples +sortorder: 500011532 +toc: False +sidebartitle: django.views.generic.base View +meta: Python example code for the View class from the django.views.generic.base module of the Django project. + + +View is a class within the django.views.generic.base module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / views.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.contrib.sites.shortcuts import get_current_site +from django.http import ( + Http404, + HttpResponsePermanentRedirect, + HttpResponseRedirect, +) +from django.shortcuts import redirect +from django.urls import reverse, reverse_lazy +from django.utils.decorators import method_decorator +from django.views.decorators.debug import sensitive_post_parameters +~~from django.views.generic.base import TemplateResponseMixin, TemplateView, View +from django.views.generic.edit import FormView + +from ..exceptions import ImmediateHttpResponse +from ..utils import get_form_class, get_request_param +from . import app_settings, signals +from .adapter import get_adapter +from .forms import ( + AddEmailForm, + ChangePasswordForm, + LoginForm, + ResetPasswordForm, + ResetPasswordKeyForm, + SetPasswordForm, + SignupForm, + UserTokenForm, +) +from .models import EmailAddress, EmailConfirmation, EmailConfirmationHMAC +from .utils import ( + complete_signup, + get_login_redirect_url, + get_next_redirect_url, + logout_on_password_change, + passthrough_next_redirect_url, + perform_login, + + +## ... source file abbreviated to get to View examples ... + + + def get_context_data(self, **kwargs): + ret = super(SignupView, self).get_context_data(**kwargs) + form = ret['form'] + email = self.request.session.get('account_verified_email') + if email: + email_keys = ['email'] + if app_settings.SIGNUP_EMAIL_ENTER_TWICE: + email_keys.append('email2') + for email_key in email_keys: + form.fields[email_key].initial = email + login_url = passthrough_next_redirect_url(self.request, + reverse("account_login"), + self.redirect_field_name) + redirect_field_name = self.redirect_field_name + redirect_field_value = get_request_param(self.request, + redirect_field_name) + ret.update({"login_url": login_url, + "redirect_field_name": redirect_field_name, + "redirect_field_value": redirect_field_value}) + return ret + + +signup = SignupView.as_view() + + +~~class ConfirmEmailView(TemplateResponseMixin, View): + + template_name = "account/email_confirm." + app_settings.TEMPLATE_EXTENSION + + def get(self, *args, **kwargs): + try: + self.object = self.get_object() + if app_settings.CONFIRM_EMAIL_ON_GET: + return self.post(*args, **kwargs) + except Http404: + self.object = None + ctx = self.get_context_data() + return self.render_to_response(ctx) + + def post(self, *args, **kwargs): + self.object = confirmation = self.get_object() + confirmation.confirm(self.request) + get_adapter(self.request).add_message( + self.request, + messages.SUCCESS, + 'account/messages/email_confirmed.txt', + {'email': confirmation.email_address.email}) + if app_settings.LOGIN_ON_EMAIL_CONFIRMATION: + resp = self.login_on_confirm(confirmation) + if resp is not None: + + +## ... source file abbreviated to get to View examples ... + + + 'account/messages/password_changed.txt') + signals.password_reset.send(sender=self.reset_user.__class__, + request=self.request, + user=self.reset_user) + + if app_settings.LOGIN_ON_PASSWORD_RESET: + return perform_login( + self.request, self.reset_user, + email_verification=app_settings.EMAIL_VERIFICATION) + + return super(PasswordResetFromKeyView, self).form_valid(form) + + +password_reset_from_key = PasswordResetFromKeyView.as_view() + + +class PasswordResetFromKeyDoneView(TemplateView): + template_name = ( + "account/password_reset_from_key_done." + + app_settings.TEMPLATE_EXTENSION) + + +password_reset_from_key_done = PasswordResetFromKeyDoneView.as_view() + + +~~class LogoutView(TemplateResponseMixin, View): + + template_name = "account/logout." + app_settings.TEMPLATE_EXTENSION + redirect_field_name = "next" + + def get(self, *args, **kwargs): + if app_settings.LOGOUT_ON_GET: + return self.post(*args, **kwargs) + if not self.request.user.is_authenticated: + response = redirect(self.get_redirect_url()) + return _ajax_response(self.request, response) + ctx = self.get_context_data() + response = self.render_to_response(ctx) + return _ajax_response(self.request, response) + + def post(self, *args, **kwargs): + url = self.get_redirect_url() + if self.request.user.is_authenticated: + self.logout() + response = redirect(url) + return _ajax_response(self.request, response) + + def logout(self): + adapter = get_adapter(self.request) + adapter.add_message( + + +## ... source file continues with no further View examples... + +``` + + +## Example 2 from django-downloadview +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + +[**django-downloadview / django_downloadview / views / base.py**](https://github.com/benoitbryon/django-downloadview/blob/master/django_downloadview/views/base.py) + +```python +# base.py +import calendar + +from django.http import Http404, HttpResponseNotModified +~~from django.views.generic.base import View +from django.views.static import was_modified_since + +from django_downloadview import exceptions +from django_downloadview.response import DownloadResponse + + +class DownloadMixin(object): + + response_class = DownloadResponse + + attachment = True + + basename = None + + mimetype = None + + encoding = None + + def get_file(self): + raise NotImplementedError() + + def get_basename(self): + return self.basename + + + +## ... source file abbreviated to get to View examples ... + + + + def download_response(self, *response_args, **response_kwargs): + response_kwargs.setdefault("file_instance", self.file_instance) + response_kwargs.setdefault("attachment", self.attachment) + response_kwargs.setdefault("basename", self.get_basename()) + response_kwargs.setdefault("file_mimetype", self.get_mimetype()) + response_kwargs.setdefault("file_encoding", self.get_encoding()) + response = self.response_class(*response_args, **response_kwargs) + return response + + def file_not_found_response(self): + raise Http404() + + def render_to_response(self, *response_args, **response_kwargs): + try: + self.file_instance = self.get_file() + except exceptions.FileNotFound: + return self.file_not_found_response() + since = self.request.META.get("HTTP_IF_MODIFIED_SINCE", None) + if since is not None: + if not self.was_modified_since(self.file_instance, since): + return self.not_modified_response(**response_kwargs) + return self.download_response(*response_args, **response_kwargs) + + +~~class BaseDownloadView(DownloadMixin, View): + + def get(self, request, *args, **kwargs): + return self.render_to_response() + + + +## ... source file continues with no further View examples... + +``` + + +## Example 3 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / views.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./views.py) + +```python +# views.py +import re +import six +from collections import Counter + +try: + from django.urls import reverse_lazy +except ImportError: + from django.core.urlresolvers import reverse_lazy + +import django +from django.db import DatabaseError +from django.db.models import Count +from django.forms.models import model_to_dict +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect, Http404 +from django.shortcuts import get_object_or_404, render +from django.views.decorators.http import require_POST +from django.utils.decorators import method_decorator +from django.views.generic import ListView +~~from django.views.generic.base import View +from django.views.generic.edit import CreateView, DeleteView +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.core.exceptions import ImproperlyConfigured +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.views import LoginView + +from explorer import app_settings +from explorer.connections import connections +from explorer.exporters import get_exporter_class +from explorer.forms import QueryForm +from explorer.models import Query, QueryLog, MSG_FAILED_BLACKLIST +from explorer.tasks import execute_query +from explorer.utils import ( + url_get_rows, + url_get_query_id, + url_get_log_id, + url_get_params, + safe_login_prompt, + fmt_sql, + allowed_query_pks, + url_get_show, + url_get_fullscreen +) + + + +## ... source file abbreviated to get to View examples ... + + + + +class SafeLoginView(LoginView): + template_name = 'admin/login.html' + + +def _export(request, query, download=True): + format = request.GET.get('format', 'csv') + exporter_class = get_exporter_class(format) + query.params = url_get_params(request) + delim = request.GET.get('delim') + exporter = exporter_class(query) + try: + output = exporter.get_output(delim=delim) + except DatabaseError as e: + msg = "Error executing query %s: %s" % (query.title, e) + return HttpResponse(msg, status=500) + response = HttpResponse(output, content_type=exporter.content_type) + if download: + response['Content-Disposition'] = 'attachment; filename="%s"' % ( + exporter.get_filename() + ) + return response + + +~~class DownloadQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def get(self, request, query_id, *args, **kwargs): + query = get_object_or_404(Query, pk=query_id) + return _export(request, query) + + +~~class DownloadFromSqlView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def post(self, request, *args, **kwargs): + sql = request.POST.get('sql') + connection = request.POST.get('connection') + query = Query(sql=sql, connection=connection, title='') + ql = query.log(request.user) + query.title = 'Playground - %s' % ql.id + return _export(request, query) + + +~~class StreamQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def get(self, request, query_id, *args, **kwargs): + query = get_object_or_404(Query, pk=query_id) + return _export(request, query, download=False) + + +~~class EmailCsvQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def post(self, request, query_id, *args, **kwargs): + if request.is_ajax(): + email = request.POST.get('email', None) + if email: + execute_query.delay(query_id, email) + return JsonResponse({'message': 'message was sent successfully'}) + return JsonResponse({}, status=403) + + +~~class SchemaView(PermissionRequiredMixin, View): + permission_required = 'change_permission' + + @method_decorator(xframe_options_sameorigin) + def dispatch(self, *args, **kwargs): + return super(SchemaView, self).dispatch(*args, **kwargs) + + def get(self, request, *args, **kwargs): + connection = kwargs.get('connection') + if connection not in connections: + raise Http404 + schema = schema_info(connection) + if schema: + return render(None, 'explorer/schema.html', + {'schema': schema_info(connection)}) + else: + return render(None, 'explorer/schema_building.html') + + +@require_POST +def format_sql(request): + sql = request.POST.get('sql', '') + formatted = fmt_sql(sql) + return JsonResponse({"formatted": formatted}) + + + +## ... source file abbreviated to get to View examples ... + + + + context_object_name = "recent_logs" + model = QueryLog + paginate_by = 20 + + +class CreateQueryView(PermissionRequiredMixin, ExplorerContextMixin, CreateView): + + permission_required = 'change_permission' + + def form_valid(self, form): + form.instance.created_by_user = self.request.user + return super(CreateQueryView, self).form_valid(form) + + form_class = QueryForm + template_name = 'explorer/query.html' + + +class DeleteQueryView(PermissionRequiredMixin, ExplorerContextMixin, DeleteView): + + permission_required = 'change_permission' + model = Query + success_url = reverse_lazy("explorer_index") + + +~~class PlayQueryView(PermissionRequiredMixin, ExplorerContextMixin, View): + + permission_required = 'change_permission' + + def get(self, request): + if url_get_query_id(request): + query = get_object_or_404(Query, pk=url_get_query_id(request)) + return self.render_with_sql(request, query, run_query=False) + + if url_get_log_id(request): + log = get_object_or_404(QueryLog, pk=url_get_log_id(request)) + query = Query(sql=log.sql, title="Playground", connection=log.connection) + return self.render_with_sql(request, query) + + return self.render() + + def post(self, request): + sql = request.POST.get('sql') + show = url_get_show(request) + query = Query(sql=sql, title="Playground", connection=request.POST.get('connection')) + passes_blacklist, failing_words = query.passes_blacklist() + error = MSG_FAILED_BLACKLIST % ', '.join(failing_words) if not passes_blacklist else None + run_query = not bool(error) if show else False + return self.render_with_sql(request, query, run_query=run_query, error=error) + + def render(self): + return self.render_template('explorer/play.html', {'title': 'Playground', 'form': QueryForm()}) + + def render_with_sql(self, request, query, run_query=True, error=None): + rows = url_get_rows(request) + fullscreen = url_get_fullscreen(request) + template = 'fullscreen' if fullscreen else 'play' + form = QueryForm(request.POST if len(request.POST) else None, instance=query) + return self.render_template('explorer/%s.html' % template, query_viewmodel(request.user, + query, + title="Playground", + run_query=run_query, + error=error, + rows=rows, + form=form)) + + +~~class QueryView(PermissionRequiredMixin, ExplorerContextMixin, View): + + permission_required = 'view_permission' + + def get(self, request, query_id): + query, form = QueryView.get_instance_and_form(request, query_id) + query.save() # updates the modified date + show = url_get_show(request) + rows = url_get_rows(request) + vm = query_viewmodel(request.user, query, form=form, run_query=show, rows=rows) + fullscreen = url_get_fullscreen(request) + template = 'fullscreen' if fullscreen else 'query' + return self.render_template('explorer/%s.html' % template, vm) + + def post(self, request, query_id): + if not app_settings.EXPLORER_PERMISSION_CHANGE(request.user): + return HttpResponseRedirect( + reverse_lazy('query_detail', kwargs={'query_id': query_id}) + ) + show = url_get_show(request) + query, form = QueryView.get_instance_and_form(request, query_id) + success = form.is_valid() and form.save() + vm = query_viewmodel(request.user, + query, + form=form, + + +## ... source file continues with no further View examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-createview.markdown b/content/pages/examples/django/django-views-generic-createview.markdown new file mode 100644 index 000000000..5f01cf427 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-createview.markdown @@ -0,0 +1,84 @@ +title: django.views.generic CreateView Example Code +category: page +slug: django-views-generic-createview-examples +sortorder: 500011520 +toc: False +sidebartitle: django.views.generic CreateView +meta: Python example code for the CreateView class from the django.views.generic module of the Django project. + + +CreateView is a class within the django.views.generic module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / accounts.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/accounts.py) + +```python +# accounts.py +from django.conf import settings as django_settings +from django.contrib import messages +from django.contrib.auth import get_user_model +from django.contrib.auth import login as auth_login +from django.contrib.auth import logout as auth_logout +from django.contrib.auth.forms import AuthenticationForm +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.shortcuts import render +from django.urls import reverse +from django.utils.translation import gettext as _ +~~from django.views.generic import CreateView +from django.views.generic import FormView +from django.views.generic import UpdateView +from django.views.generic import View +from wiki import forms +from wiki.conf import settings + +User = get_user_model() + + +~~class Signup(CreateView): + model = User + form_class = forms.UserCreationForm + template_name = "wiki/accounts/signup.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_anonymous and not request.user.is_superuser: + return redirect("wiki:root") + if not settings.ACCOUNT_HANDLING: + return redirect(settings.SIGNUP_URL) + if not request.user.is_superuser and not settings.ACCOUNT_SIGNUP_ALLOWED: + c = {"error_msg": _("Account signup is only allowed for administrators.")} + return render(request, "wiki/error.html", context=c) + + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["honeypot_class"] = context["form"].honeypot_class + context["honeypot_jsfunction"] = context["form"].honeypot_jsfunction + return context + + def get_success_url(self, *args): + messages.success( + self.request, _("You are now signed up... and now you can sign in!") + + +## ... source file continues with no further CreateView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-deleteview.markdown b/content/pages/examples/django/django-views-generic-deleteview.markdown new file mode 100644 index 000000000..5a7b82314 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-deleteview.markdown @@ -0,0 +1,61 @@ +title: django.views.generic DeleteView Example Code +category: page +slug: django-views-generic-deleteview-examples +sortorder: 500011521 +toc: False +sidebartitle: django.views.generic DeleteView +meta: Python example code for the DeleteView class from the django.views.generic module of the Django project. + + +DeleteView is a class within the django.views.generic module of the Django project. + + +## Example 1 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / views / token.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/views/token.py) + +```python +# token.py +from django.contrib.auth.mixins import LoginRequiredMixin +from django.urls import reverse_lazy +~~from django.views.generic import DeleteView, ListView + +from ..models import get_access_token_model + + +class AuthorizedTokensListView(LoginRequiredMixin, ListView): + context_object_name = "authorized_tokens" + template_name = "oauth2_provider/authorized-tokens.html" + model = get_access_token_model() + + def get_queryset(self): + return super().get_queryset().select_related("application").filter( + user=self.request.user + ) + + +~~class AuthorizedTokenDeleteView(LoginRequiredMixin, DeleteView): + template_name = "oauth2_provider/authorized-token-delete.html" + success_url = reverse_lazy("oauth2_provider:authorized-token-list") + model = get_access_token_model() + + def get_queryset(self): + return super().get_queryset().filter(user=self.request.user) + + + +## ... source file continues with no further DeleteView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-detail-singleobjectmixin.markdown b/content/pages/examples/django/django-views-generic-detail-singleobjectmixin.markdown new file mode 100644 index 000000000..eb253dfb1 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-detail-singleobjectmixin.markdown @@ -0,0 +1,65 @@ +title: django.views.generic.detail SingleObjectMixin Example Code +category: page +slug: django-views-generic-detail-singleobjectmixin-examples +sortorder: 500011533 +toc: False +sidebartitle: django.views.generic.detail SingleObjectMixin +meta: Python example code for the SingleObjectMixin class from the django.views.generic.detail module of the Django project. + + +SingleObjectMixin is a class within the django.views.generic.detail module of the Django project. + + +## Example 1 from django-downloadview +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + +[**django-downloadview / django_downloadview / views / object.py**](https://github.com/benoitbryon/django-downloadview/blob/master/django_downloadview/views/object.py) + +```python +# object.py +~~from django.views.generic.detail import SingleObjectMixin + +from django_downloadview.exceptions import FileNotFound +from django_downloadview.views.base import BaseDownloadView + + +~~class ObjectDownloadView(SingleObjectMixin, BaseDownloadView): + + file_field = "file" + + basename_field = None + + encoding_field = None + + mime_type_field = None + + charset_field = None + + modification_time_field = None + + size_field = None + + def get_file(self): + file_instance = getattr(self.object, self.file_field) + if not file_instance: + raise FileNotFound( + f'Field="{self.file_field}" on object="{self.object}" is empty' + ) + for field in ("encoding", "mime_type", "charset", "modification_time", "size"): + model_field = getattr(self, "%s_field" % field, False) + if model_field: + + +## ... source file continues with no further SingleObjectMixin examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-detailview.markdown b/content/pages/examples/django/django-views-generic-detailview.markdown new file mode 100644 index 000000000..74f44aca4 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-detailview.markdown @@ -0,0 +1,135 @@ +title: django.views.generic DetailView Example Code +category: page +slug: django-views-generic-detailview-examples +sortorder: 500011522 +toc: False +sidebartitle: django.views.generic DetailView +meta: Python example code for the DetailView class from the django.views.generic module of the Django project. + + +DetailView is a class within the django.views.generic module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / article.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/article.py) + +```python +# article.py +import difflib +import logging +from urllib.parse import urljoin + +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.db import transaction +from django.db.models import Q +from django.http import Http404 +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.shortcuts import render +from django.urls import reverse +from django.utils.decorators import method_decorator +from django.utils.translation import gettext as _ +from django.utils.translation import ngettext +from django.views.decorators.clickjacking import xframe_options_sameorigin +~~from django.views.generic import DetailView +from django.views.generic import FormView +from django.views.generic import ListView +from django.views.generic import RedirectView +from django.views.generic import TemplateView +from django.views.generic import View +from wiki import editors +from wiki import forms +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.exceptions import NoRootURL +from wiki.core.paginator import WikiPaginator +from wiki.core.plugins import registry as plugin_registry +from wiki.core.utils import object_to_json_response +from wiki.decorators import get_article +from wiki.views.mixins import ArticleMixin + +log = logging.getLogger(__name__) + + +class ArticleView(ArticleMixin, TemplateView): + + template_name = "wiki/view.html" + + +## ... source file abbreviated to get to DetailView examples ... + + + def post(self, request, *args, **kwargs): + edit_form = forms.EditForm( + request, self.article.current_revision, request.POST, preview=True + ) + if edit_form.is_valid(): + self.title = edit_form.cleaned_data["title"] + self.content = edit_form.cleaned_data["content"] + self.preview = True + return super().get(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + if self.revision and not self.title: + self.title = self.revision.title + if self.revision and not self.content: + self.content = self.revision.content + return super().get(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + kwargs["title"] = self.title + kwargs["revision"] = self.revision + kwargs["content"] = self.content + kwargs["preview"] = self.preview + return ArticleMixin.get_context_data(self, **kwargs) + + +~~class DiffView(DetailView): + model = models.ArticleRevision + pk_url_kwarg = "revision_id" + + def render_to_response(self, context, **response_kwargs): + revision = self.get_object() + other_revision = revision.previous_revision + + baseText = other_revision.content if other_revision is not None else "" + newText = revision.content + + differ = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK) + diff = differ.compare( + baseText.splitlines(keepends=True), newText.splitlines(keepends=True) + ) + other_changes = [] + + if not other_revision or other_revision.title != revision.title: + other_changes.append((_("New title"), revision.title)) + + return object_to_json_response( + {"diff": list(diff), "other_changes": other_changes} + ) + + + + +## ... source file continues with no further DetailView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-edit-createview.markdown b/content/pages/examples/django/django-views-generic-edit-createview.markdown new file mode 100644 index 000000000..252c6f8a6 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-edit-createview.markdown @@ -0,0 +1,132 @@ +title: django.views.generic.edit CreateView Example Code +category: page +slug: django-views-generic-edit-createview-examples +sortorder: 500011534 +toc: False +sidebartitle: django.views.generic.edit CreateView +meta: Python example code for the CreateView class from the django.views.generic.edit module of the Django project. + + +CreateView is a class within the django.views.generic.edit module of the Django project. + + +## Example 1 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / views.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./views.py) + +```python +# views.py +import re +import six +from collections import Counter + +try: + from django.urls import reverse_lazy +except ImportError: + from django.core.urlresolvers import reverse_lazy + +import django +from django.db import DatabaseError +from django.db.models import Count +from django.forms.models import model_to_dict +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect, Http404 +from django.shortcuts import get_object_or_404, render +from django.views.decorators.http import require_POST +from django.utils.decorators import method_decorator +from django.views.generic import ListView +from django.views.generic.base import View +~~from django.views.generic.edit import CreateView, DeleteView +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.core.exceptions import ImproperlyConfigured +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.views import LoginView + +from explorer import app_settings +from explorer.connections import connections +from explorer.exporters import get_exporter_class +from explorer.forms import QueryForm +from explorer.models import Query, QueryLog, MSG_FAILED_BLACKLIST +from explorer.tasks import execute_query +from explorer.utils import ( + url_get_rows, + url_get_query_id, + url_get_log_id, + url_get_params, + safe_login_prompt, + fmt_sql, + allowed_query_pks, + url_get_show, + url_get_fullscreen +) + +from explorer.schema import schema_info + + +## ... source file abbreviated to get to CreateView examples ... + + + 'created_at': q.created_at, + 'is_header': False, + 'run_count': q.run_count, + 'created_by_user': six.text_type(q.created_by_user) if q.created_by_user else None}) + dict_list.append(model_dict) + return dict_list + + model = Query + + +class ListQueryLogView(PermissionRequiredMixin, ExplorerContextMixin, ListView): + + permission_required = 'view_permission' + + def get_queryset(self): + kwargs = {'sql__isnull': False} + if url_get_query_id(self.request): + kwargs['query_id'] = url_get_query_id(self.request) + return QueryLog.objects.filter(**kwargs).all() + + context_object_name = "recent_logs" + model = QueryLog + paginate_by = 20 + + +~~class CreateQueryView(PermissionRequiredMixin, ExplorerContextMixin, CreateView): + + permission_required = 'change_permission' + + def form_valid(self, form): + form.instance.created_by_user = self.request.user + return super(CreateQueryView, self).form_valid(form) + + form_class = QueryForm + template_name = 'explorer/query.html' + + +class DeleteQueryView(PermissionRequiredMixin, ExplorerContextMixin, DeleteView): + + permission_required = 'change_permission' + model = Query + success_url = reverse_lazy("explorer_index") + + +class PlayQueryView(PermissionRequiredMixin, ExplorerContextMixin, View): + + permission_required = 'change_permission' + + def get(self, request): + if url_get_query_id(request): + + +## ... source file continues with no further CreateView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-edit-deleteview.markdown b/content/pages/examples/django/django-views-generic-edit-deleteview.markdown new file mode 100644 index 000000000..56ab75129 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-edit-deleteview.markdown @@ -0,0 +1,132 @@ +title: django.views.generic.edit DeleteView Example Code +category: page +slug: django-views-generic-edit-deleteview-examples +sortorder: 500011535 +toc: False +sidebartitle: django.views.generic.edit DeleteView +meta: Python example code for the DeleteView class from the django.views.generic.edit module of the Django project. + + +DeleteView is a class within the django.views.generic.edit module of the Django project. + + +## Example 1 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / views.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./views.py) + +```python +# views.py +import re +import six +from collections import Counter + +try: + from django.urls import reverse_lazy +except ImportError: + from django.core.urlresolvers import reverse_lazy + +import django +from django.db import DatabaseError +from django.db.models import Count +from django.forms.models import model_to_dict +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect, Http404 +from django.shortcuts import get_object_or_404, render +from django.views.decorators.http import require_POST +from django.utils.decorators import method_decorator +from django.views.generic import ListView +from django.views.generic.base import View +~~from django.views.generic.edit import CreateView, DeleteView +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.core.exceptions import ImproperlyConfigured +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.views import LoginView + +from explorer import app_settings +from explorer.connections import connections +from explorer.exporters import get_exporter_class +from explorer.forms import QueryForm +from explorer.models import Query, QueryLog, MSG_FAILED_BLACKLIST +from explorer.tasks import execute_query +from explorer.utils import ( + url_get_rows, + url_get_query_id, + url_get_log_id, + url_get_params, + safe_login_prompt, + fmt_sql, + allowed_query_pks, + url_get_show, + url_get_fullscreen +) + +from explorer.schema import schema_info + + +## ... source file abbreviated to get to DeleteView examples ... + + + permission_required = 'view_permission' + + def get_queryset(self): + kwargs = {'sql__isnull': False} + if url_get_query_id(self.request): + kwargs['query_id'] = url_get_query_id(self.request) + return QueryLog.objects.filter(**kwargs).all() + + context_object_name = "recent_logs" + model = QueryLog + paginate_by = 20 + + +class CreateQueryView(PermissionRequiredMixin, ExplorerContextMixin, CreateView): + + permission_required = 'change_permission' + + def form_valid(self, form): + form.instance.created_by_user = self.request.user + return super(CreateQueryView, self).form_valid(form) + + form_class = QueryForm + template_name = 'explorer/query.html' + + +~~class DeleteQueryView(PermissionRequiredMixin, ExplorerContextMixin, DeleteView): + + permission_required = 'change_permission' + model = Query + success_url = reverse_lazy("explorer_index") + + +class PlayQueryView(PermissionRequiredMixin, ExplorerContextMixin, View): + + permission_required = 'change_permission' + + def get(self, request): + if url_get_query_id(request): + query = get_object_or_404(Query, pk=url_get_query_id(request)) + return self.render_with_sql(request, query, run_query=False) + + if url_get_log_id(request): + log = get_object_or_404(QueryLog, pk=url_get_log_id(request)) + query = Query(sql=log.sql, title="Playground", connection=log.connection) + return self.render_with_sql(request, query) + + return self.render() + + def post(self, request): + sql = request.POST.get('sql') + + +## ... source file continues with no further DeleteView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-edit-deletionmixin.markdown b/content/pages/examples/django/django-views-generic-edit-deletionmixin.markdown new file mode 100644 index 000000000..c2aa6872a --- /dev/null +++ b/content/pages/examples/django/django-views-generic-edit-deletionmixin.markdown @@ -0,0 +1,120 @@ +title: django.views.generic.edit DeletionMixin Example Code +category: page +slug: django-views-generic-edit-deletionmixin-examples +sortorder: 500011536 +toc: False +sidebartitle: django.views.generic.edit DeletionMixin +meta: Python example code for the DeletionMixin class from the django.views.generic.edit module of the Django project. + + +DeletionMixin is a class within the django.views.generic.edit module of the Django project. + + +## Example 1 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / views.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/./views.py) + +```python +# views.py +import math + +from django.contrib import messages +from django.urls import reverse +from django.forms import Form +from django.http import HttpResponseForbidden +from django.http import Http404 +from django.utils.functional import cached_property +~~from django.views.generic.edit import DeletionMixin +from django.views.generic import ListView +from django.views.generic import TemplateView +from django.views.generic.edit import FormView +from mongoengine.fields import EmbeddedDocumentField, ListField + +from mongonaut.forms import MongoModelForm +from mongonaut.mixins import MongonautFormViewMixin +from mongonaut.mixins import MongonautViewMixin +from mongonaut.utils import is_valid_object_id + + +class IndexView(MongonautViewMixin, ListView): + + template_name = "mongonaut/index.html" + queryset = [] + permission = 'has_view_permission' + + def get_queryset(self): + return self.get_mongoadmins() + + +class DocumentListView(MongonautViewMixin, FormView): + form_class = Form + success_url = '/' + + +## ... source file abbreviated to get to DeletionMixin examples ... + + + def get_context_data(self, **kwargs): + context = super(DocumentAddFormView, self).get_context_data(**kwargs) + self.set_mongoadmin() + context = self.set_permissions_in_context(context) + self.document_type = getattr(self.models, self.document_name) + + context['app_label'] = self.app_label + context['document_name'] = self.document_name + context['form_action'] = reverse('document_detail_add_form', args=[self.kwargs.get('app_label'), + self.kwargs.get('document_name')]) + + return context + + def get_form(self): + self.set_mongonaut_base() + self.document_type = getattr(self.models, self.document_name) + self.form = Form() + + if self.request.method == 'POST': + self.form = self.process_post_form('Your new document has been added and saved.') + else: + self.form = MongoModelForm(model=self.document_type).get_form() + return self.form + + +~~class DocumentDeleteView(DeletionMixin, MongonautViewMixin, TemplateView): + + success_url = "/" + template_name = "mongonaut/document_delete.html" + + def get_success_url(self): + self.set_mongonaut_base() + messages.add_message(self.request, messages.INFO, 'Your document has been deleted.') + return reverse('document_list', kwargs={'app_label': self.app_label, 'document_name': self.document_name}) + + def get_object(self): + self.set_mongoadmin() + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + self.document = self.document_type.objects.get(pk=self.ident) + return self.document + + + +## ... source file continues with no further DeletionMixin examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-edit-formmixin.markdown b/content/pages/examples/django/django-views-generic-edit-formmixin.markdown new file mode 100644 index 000000000..8206cab3e --- /dev/null +++ b/content/pages/examples/django/django-views-generic-edit-formmixin.markdown @@ -0,0 +1,73 @@ +title: django.views.generic.edit FormMixin Example Code +category: page +slug: django-views-generic-edit-formmixin-examples +sortorder: 500011537 +toc: False +sidebartitle: django.views.generic.edit FormMixin +meta: Python example code for the FormMixin class from the django.views.generic.edit module of the Django project. + + +FormMixin is a class within the django.views.generic.edit module of the Django project. + + +## Example 1 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / generic_views.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./generic_views.py) + +```python +# generic_views.py +from django.conf import settings +from django.core.paginator import Paginator +from django.views.generic import FormView +~~from django.views.generic.edit import FormMixin +from django.views.generic.list import MultipleObjectMixin + +from .forms import FacetedSearchForm, ModelSearchForm +from .query import SearchQuerySet + +RESULTS_PER_PAGE = getattr(settings, "HAYSTACK_SEARCH_RESULTS_PER_PAGE", 20) + + +~~class SearchMixin(MultipleObjectMixin, FormMixin): + + template_name = "search/search.html" + load_all = True + form_class = ModelSearchForm + context_object_name = None + paginate_by = RESULTS_PER_PAGE + paginate_orphans = 0 + paginator_class = Paginator + page_kwarg = "page" + form_name = "form" + search_field = "q" + object_list = None + + def get_queryset(self): + if self.queryset is None: + self.queryset = SearchQuerySet() + return self.queryset + + def get_form_kwargs(self): + kwargs = {"initial": self.get_initial()} + if self.request.method == "GET": + kwargs.update({"data": self.request.GET}) + kwargs.update( + {"searchqueryset": self.get_queryset(), "load_all": self.load_all} + + +## ... source file continues with no further FormMixin examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-edit-formview.markdown b/content/pages/examples/django/django-views-generic-edit-formview.markdown new file mode 100644 index 000000000..f1ab5dcf0 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-edit-formview.markdown @@ -0,0 +1,317 @@ +title: django.views.generic.edit FormView Example Code +category: page +slug: django-views-generic-edit-formview-examples +sortorder: 500011538 +toc: False +sidebartitle: django.views.generic.edit FormView +meta: Python example code for the FormView class from the django.views.generic.edit module of the Django project. + + +FormView is a class within the django.views.generic.edit module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / views.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.contrib.sites.shortcuts import get_current_site +from django.http import HttpResponseRedirect +from django.urls import reverse, reverse_lazy +from django.views.generic.base import TemplateView +~~from django.views.generic.edit import FormView + +from ..account import app_settings as account_settings +from ..account.adapter import get_adapter as get_account_adapter +from ..account.views import ( + AjaxCapableProcessFormViewMixin, + CloseableSignupMixin, + RedirectAuthenticatedUserMixin, +) +from ..utils import get_form_class +from . import app_settings, helpers +from .adapter import get_adapter +from .forms import DisconnectForm, SignupForm +from .models import SocialAccount, SocialLogin + + +class SignupView(RedirectAuthenticatedUserMixin, CloseableSignupMixin, +~~ AjaxCapableProcessFormViewMixin, FormView): + form_class = SignupForm + template_name = ( + 'socialaccount/signup.' + account_settings.TEMPLATE_EXTENSION) + + def get_form_class(self): + return get_form_class(app_settings.FORMS, + 'signup', + self.form_class) + + def dispatch(self, request, *args, **kwargs): + self.sociallogin = None + data = request.session.get('socialaccount_sociallogin') + if data: + self.sociallogin = SocialLogin.deserialize(data) + if not self.sociallogin: + return HttpResponseRedirect(reverse('account_login')) + return super(SignupView, self).dispatch(request, *args, **kwargs) + + def is_open(self): + return get_adapter(self.request).is_open_for_signup( + self.request, + self.sociallogin) + + def get_form_kwargs(self): + + +## ... source file abbreviated to get to FormView examples ... + + + + def get_authenticated_redirect_url(self): + return reverse(connections) + + +signup = SignupView.as_view() + + +class LoginCancelledView(TemplateView): + template_name = ( + "socialaccount/login_cancelled." + account_settings.TEMPLATE_EXTENSION) + + +login_cancelled = LoginCancelledView.as_view() + + +class LoginErrorView(TemplateView): + template_name = ( + "socialaccount/authentication_error." + + account_settings.TEMPLATE_EXTENSION) + + +login_error = LoginErrorView.as_view() + + +~~class ConnectionsView(AjaxCapableProcessFormViewMixin, FormView): + template_name = ( + "socialaccount/connections." + + account_settings.TEMPLATE_EXTENSION) + form_class = DisconnectForm + success_url = reverse_lazy("socialaccount_connections") + + def get_form_class(self): + return get_form_class(app_settings.FORMS, + 'disconnect', + self.form_class) + + def get_form_kwargs(self): + kwargs = super(ConnectionsView, self).get_form_kwargs() + kwargs["request"] = self.request + return kwargs + + def form_valid(self, form): + get_account_adapter().add_message(self.request, + messages.INFO, + 'socialaccount/messages/' + 'account_disconnected.txt') + form.save() + return super(ConnectionsView, self).form_valid(form) + + + +## ... source file continues with no further FormView examples... + +``` + + +## Example 2 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / mixins.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./mixins.py) + +```python +# mixins.py +from django.http import HttpResponse +from django.utils.timezone import now +~~from django.views.generic.edit import FormView + +from .formats import base_formats +from .forms import ExportForm +from .resources import modelresource_factory +from .signals import post_export + + +class ExportViewMixin: + formats = base_formats.DEFAULT_FORMATS + form_class = ExportForm + resource_class = None + + def get_export_formats(self): + return [f for f in self.formats if f().can_export()] + + def get_resource_class(self): + if not self.resource_class: + return modelresource_factory(self.model) + return self.resource_class + + def get_export_resource_class(self): + return self.get_resource_class() + + def get_resource_kwargs(self, request, *args, **kwargs): + + +## ... source file abbreviated to get to FormView examples ... + + + + def get_export_data(self, file_format, queryset, *args, **kwargs): + resource_class = self.get_export_resource_class() + data = resource_class(**self.get_export_resource_kwargs(self.request))\ + .export(queryset, *args, **kwargs) + export_data = file_format.export_data(data) + return export_data + + def get_export_filename(self, file_format): + date_str = now().strftime('%Y-%m-%d') + filename = "%s-%s.%s" % (self.model.__name__, + date_str, + file_format.get_extension()) + return filename + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + return context + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs['formats'] = self.get_export_formats() + return kwargs + + +~~class ExportViewFormMixin(ExportViewMixin, FormView): + def form_valid(self, form): + formats = self.get_export_formats() + file_format = formats[ + int(form.cleaned_data['file_format']) + ]() + if hasattr(self, 'get_filterset'): + queryset = self.get_filterset(self.get_filterset_class()).qs + else: + queryset = self.get_queryset() + export_data = self.get_export_data(file_format, queryset) + content_type = file_format.get_content_type() + try: + response = HttpResponse(export_data, content_type=content_type) + except TypeError: + response = HttpResponse(export_data, mimetype=content_type) + response['Content-Disposition'] = 'attachment; filename="%s"' % ( + self.get_export_filename(file_format), + ) + + post_export.send(sender=None, model=self.model) + return response + + + +## ... source file continues with no further FormView examples... + +``` + + +## Example 3 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / views.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/./views.py) + +```python +# views.py +import math + +from django.contrib import messages +from django.urls import reverse +from django.forms import Form +from django.http import HttpResponseForbidden +from django.http import Http404 +from django.utils.functional import cached_property +from django.views.generic.edit import DeletionMixin +from django.views.generic import ListView +from django.views.generic import TemplateView +~~from django.views.generic.edit import FormView +from mongoengine.fields import EmbeddedDocumentField, ListField + +from mongonaut.forms import MongoModelForm +from mongonaut.mixins import MongonautFormViewMixin +from mongonaut.mixins import MongonautViewMixin +from mongonaut.utils import is_valid_object_id + + +class IndexView(MongonautViewMixin, ListView): + + template_name = "mongonaut/index.html" + queryset = [] + permission = 'has_view_permission' + + def get_queryset(self): + return self.get_mongoadmins() + + +~~class DocumentListView(MongonautViewMixin, FormView): + form_class = Form + success_url = '/' + template_name = "mongonaut/document_list.html" + permission = 'has_view_permission' + + documents_per_page = 25 + + + def get_qset(self, queryset, q): + if self.mongoadmin.search_fields and q: + params = {} + for field in self.mongoadmin.search_fields: + if field == 'id': + if is_valid_object_id(q): + return queryset.filter(pk=q) + continue + search_key = "{field}__icontains".format(field=field) + params[search_key] = q + + queryset = queryset.filter(**params) + return queryset + + @cached_property + def get_queryset(self): + + +## ... source file continues with no further FormView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-formview.markdown b/content/pages/examples/django/django-views-generic-formview.markdown new file mode 100644 index 000000000..8c9fe881f --- /dev/null +++ b/content/pages/examples/django/django-views-generic-formview.markdown @@ -0,0 +1,383 @@ +title: django.views.generic FormView Example Code +category: page +slug: django-views-generic-formview-examples +sortorder: 500011523 +toc: False +sidebartitle: django.views.generic FormView +meta: Python example code for the FormView class from the django.views.generic module of the Django project. + + +FormView is a class within the django.views.generic module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / views / crud.py**](https://github.com/jrief/django-angular/blob/master/djng/views/crud.py) + +```python +# crud.py +import json + +from django.core.exceptions import ValidationError +from django.core import serializers +from django.forms.models import modelform_factory +~~from django.views.generic import FormView + +from djng.views.mixins import JSONBaseMixin, JSONResponseException + + +class NgMissingParameterError(ValueError): + pass + + +~~class NgCRUDView(JSONBaseMixin, FormView): + model = None + fields = None + form_class = None + slug_field = 'slug' + serializer_name = 'python' + serialize_natural_keys = False + + allowed_methods = ['GET', 'POST', 'DELETE'] + exclude_methods = [] + + def get_allowed_methods(self): + return [method for method in self.allowed_methods if method not in self.exclude_methods] + + def dispatch(self, request, *args, **kwargs): + allowed_methods = self.get_allowed_methods() + try: + if request.method == 'GET' and 'GET' in allowed_methods: + if 'pk' in request.GET or self.slug_field in request.GET: + return self.ng_get(request, *args, **kwargs) + return self.ng_query(request, *args, **kwargs) + elif request.method == 'POST' and 'POST' in allowed_methods: + return self.ng_save(request, *args, **kwargs) + elif request.method == 'DELETE' and 'DELETE' in allowed_methods: + return self.ng_delete(request, *args, **kwargs) + + +## ... source file continues with no further FormView examples... + +``` + + +## Example 2 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / generic_views.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./generic_views.py) + +```python +# generic_views.py +from django.conf import settings +from django.core.paginator import Paginator +~~from django.views.generic import FormView +from django.views.generic.edit import FormMixin +from django.views.generic.list import MultipleObjectMixin + +from .forms import FacetedSearchForm, ModelSearchForm +from .query import SearchQuerySet + +RESULTS_PER_PAGE = getattr(settings, "HAYSTACK_SEARCH_RESULTS_PER_PAGE", 20) + + +class SearchMixin(MultipleObjectMixin, FormMixin): + + template_name = "search/search.html" + load_all = True + form_class = ModelSearchForm + context_object_name = None + paginate_by = RESULTS_PER_PAGE + paginate_orphans = 0 + paginator_class = Paginator + page_kwarg = "page" + form_name = "form" + search_field = "q" + object_list = None + + def get_queryset(self): + + +## ... source file abbreviated to get to FormView examples ... + + + return self.render_to_response(context) + + +class FacetedSearchMixin(SearchMixin): + + form_class = FacetedSearchForm + facet_fields = None + + def get_form_kwargs(self): + kwargs = super(FacetedSearchMixin, self).get_form_kwargs() + kwargs.update({"selected_facets": self.request.GET.getlist("selected_facets")}) + return kwargs + + def get_context_data(self, **kwargs): + context = super(FacetedSearchMixin, self).get_context_data(**kwargs) + context.update({"facets": self.queryset.facet_counts()}) + return context + + def get_queryset(self): + qs = super(FacetedSearchMixin, self).get_queryset() + for field in self.facet_fields: + qs = qs.facet(field) + return qs + + +~~class SearchView(SearchMixin, FormView): + + def get(self, request, *args, **kwargs): + form_class = self.get_form_class() + form = self.get_form(form_class) + + if form.is_valid(): + return self.form_valid(form) + else: + return self.form_invalid(form) + + +class FacetedSearchView(FacetedSearchMixin, SearchView): + + pass + + + +## ... source file continues with no further FormView examples... + +``` + + +## Example 3 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / views / base.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/views/base.py) + +```python +# base.py +import json +import logging +import urllib.parse + +from django.contrib.auth.mixins import LoginRequiredMixin +from django.http import HttpResponse, JsonResponse +from django.shortcuts import render +from django.urls import reverse +from django.utils import timezone +from django.utils.decorators import method_decorator +from django.views.decorators.csrf import csrf_exempt +from django.views.decorators.debug import sensitive_post_parameters +~~from django.views.generic import FormView, View + +from ..exceptions import OAuthToolkitError +from ..forms import AllowForm +from ..http import OAuth2ResponseRedirect +from ..models import get_access_token_model, get_application_model +from ..scopes import get_scopes_backend +from ..settings import oauth2_settings +from ..signals import app_authorized +from .mixins import OAuthLibMixin + + +log = logging.getLogger("oauth2_provider") + + +class BaseAuthorizationView(LoginRequiredMixin, OAuthLibMixin, View): + + def dispatch(self, request, *args, **kwargs): + self.oauth2_data = {} + return super().dispatch(request, *args, **kwargs) + + def error_response(self, error, application, **kwargs): + redirect, error_response = super().error_response(error, **kwargs) + + if redirect: + return self.redirect(error_response["url"], application) + + status = error_response["error"].status_code + return self.render_to_response(error_response, status=status) + + def redirect(self, redirect_to, application): + if application is None: + allowed_schemes = oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES + else: + allowed_schemes = application.get_allowed_schemes() + return OAuth2ResponseRedirect(redirect_to, allowed_schemes) + + +RFC3339 = "%Y-%m-%dT%H:%M:%SZ" + + +~~class AuthorizationView(BaseAuthorizationView, FormView): + template_name = "oauth2_provider/authorize.html" + form_class = AllowForm + + server_class = oauth2_settings.OAUTH2_SERVER_CLASS + validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS + oauthlib_backend_class = oauth2_settings.OAUTH2_BACKEND_CLASS + + skip_authorization_completely = False + + def get_initial(self): + scopes = self.oauth2_data.get("scope", self.oauth2_data.get("scopes", [])) + initial_data = { + "redirect_uri": self.oauth2_data.get("redirect_uri", None), + "scope": " ".join(scopes), + "client_id": self.oauth2_data.get("client_id", None), + "state": self.oauth2_data.get("state", None), + "response_type": self.oauth2_data.get("response_type", None), + "code_challenge": self.oauth2_data.get("code_challenge", None), + "code_challenge_method": self.oauth2_data.get("code_challenge_method", None), + } + return initial_data + + def form_valid(self, form): + client_id = form.cleaned_data["client_id"] + + +## ... source file continues with no further FormView examples... + +``` + + +## Example 4 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / accounts.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/accounts.py) + +```python +# accounts.py +from django.conf import settings as django_settings +from django.contrib import messages +from django.contrib.auth import get_user_model +from django.contrib.auth import login as auth_login +from django.contrib.auth import logout as auth_logout +from django.contrib.auth.forms import AuthenticationForm +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.shortcuts import render +from django.urls import reverse +from django.utils.translation import gettext as _ +from django.views.generic import CreateView +~~from django.views.generic import FormView +from django.views.generic import UpdateView +from django.views.generic import View +from wiki import forms +from wiki.conf import settings + +User = get_user_model() + + +class Signup(CreateView): + model = User + form_class = forms.UserCreationForm + template_name = "wiki/accounts/signup.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_anonymous and not request.user.is_superuser: + return redirect("wiki:root") + if not settings.ACCOUNT_HANDLING: + return redirect(settings.SIGNUP_URL) + if not request.user.is_superuser and not settings.ACCOUNT_SIGNUP_ALLOWED: + c = {"error_msg": _("Account signup is only allowed for administrators.")} + return render(request, "wiki/error.html", context=c) + + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["honeypot_class"] = context["form"].honeypot_class + context["honeypot_jsfunction"] = context["form"].honeypot_jsfunction + return context + + def get_success_url(self, *args): + messages.success( + self.request, _("You are now signed up... and now you can sign in!") + ) + return reverse("wiki:login") + + +class Logout(View): + def dispatch(self, request, *args, **kwargs): + if not settings.ACCOUNT_HANDLING: + return redirect(settings.LOGOUT_URL) + return super().dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + auth_logout(request) + messages.info(request, _("You are no longer logged in. Bye bye!")) + return redirect("wiki:root") + + +~~class Login(FormView): + + form_class = AuthenticationForm + template_name = "wiki/accounts/login.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_anonymous: + return redirect("wiki:root") + if not settings.ACCOUNT_HANDLING: + return redirect(settings.LOGIN_URL) + return super().dispatch(request, *args, **kwargs) + + def get_form_kwargs(self): + self.request.session.set_test_cookie() + kwargs = super().get_form_kwargs() + kwargs["request"] = self.request + return kwargs + + def post(self, request, *args, **kwargs): + self.referer = request.session.get("login_referer", "") + return super().post(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + self.referer = request.META.get("HTTP_REFERER", "") + request.session["login_referer"] = self.referer + + +## ... source file continues with no further FormView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-list-listview.markdown b/content/pages/examples/django/django-views-generic-list-listview.markdown new file mode 100644 index 000000000..bb0fe0f78 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-list-listview.markdown @@ -0,0 +1,163 @@ +title: django.views.generic.list ListView Example Code +category: page +slug: django-views-generic-list-listview-examples +sortorder: 500011539 +toc: False +sidebartitle: django.views.generic.list ListView +meta: Python example code for the ListView class from the django.views.generic.list module of the Django project. + + +ListView is a class within the django.views.generic.list module of the Django project. + + +## Example 1 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / views.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/./views.py) + +```python +# views.py +from itertools import count + +from django.core.exceptions import ImproperlyConfigured +~~from django.views.generic.list import ListView + +from . import tables +from .config import RequestConfig + + +class TableMixinBase: + + context_table_name = "table" + table_pagination = None + + def get_context_table_name(self, table): + return self.context_table_name + + def get_table_pagination(self, table): + paginate = self.table_pagination + if paginate is False: + return False + + paginate = {} + if getattr(self, "paginate_by", None) is not None: + paginate["per_page"] = self.paginate_by + if hasattr(self, "paginator_class"): + paginate["paginator_class"] = self.paginator_class + if getattr(self, "paginate_orphans", 0) != 0: + + +## ... source file abbreviated to get to ListView examples ... + + + ) + + def get_table_data(self): + if self.table_data is not None: + return self.table_data + elif hasattr(self, "object_list"): + return self.object_list + elif hasattr(self, "get_queryset"): + return self.get_queryset() + + klass = type(self).__name__ + raise ImproperlyConfigured( + "Table data was not specified. Define {}.table_data".format(klass) + ) + + def get_table_kwargs(self): + return {} + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + table = self.get_table(**self.get_table_kwargs()) + context[self.get_context_table_name(table)] = table + return context + + +~~class SingleTableView(SingleTableMixin, ListView): + + +class MultiTableMixin(TableMixinBase): + + tables = None + tables_data = None + + table_prefix = "table_{}-" + + context_table_name = "tables" + + def get_tables(self): + if self.tables is None: + klass = type(self).__name__ + raise ImproperlyConfigured("No tables were specified. Define {}.tables".format(klass)) + data = self.get_tables_data() + + if data is None: + return self.tables + + if len(data) != len(self.tables): + klass = type(self).__name__ + raise ImproperlyConfigured("len({}.tables_data) != len({}.tables)".format(klass, klass)) + return list(Table(data[i]) for i, Table in enumerate(self.tables)) + + +## ... source file continues with no further ListView examples... + +``` + + +## Example 2 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / views.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./views.py) + +```python +# views.py +from django.contrib.contenttypes.models import ContentType +from django.shortcuts import get_object_or_404 +~~from django.views.generic.list import ListView + +from taggit.models import Tag, TaggedItem + + +def tagged_object_list(request, slug, queryset, **kwargs): + if callable(queryset): + queryset = queryset() + kwargs["slug"] = slug + tag_list_view = type( + "TagListView", + (TagListMixin, ListView), + {"model": queryset.model, "queryset": queryset}, + ) + return tag_list_view.as_view()(request, **kwargs) + + +class TagListMixin: + tag_suffix = "_tag" + + def dispatch(self, request, *args, **kwargs): + slug = kwargs.pop("slug") + self.tag = get_object_or_404(Tag, slug=slug) + return super().dispatch(request, *args, **kwargs) + + + +## ... source file continues with no further ListView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-list-multipleobjectmixin.markdown b/content/pages/examples/django/django-views-generic-list-multipleobjectmixin.markdown new file mode 100644 index 000000000..bef2df0d1 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-list-multipleobjectmixin.markdown @@ -0,0 +1,73 @@ +title: django.views.generic.list MultipleObjectMixin Example Code +category: page +slug: django-views-generic-list-multipleobjectmixin-examples +sortorder: 500011540 +toc: False +sidebartitle: django.views.generic.list MultipleObjectMixin +meta: Python example code for the MultipleObjectMixin class from the django.views.generic.list module of the Django project. + + +MultipleObjectMixin is a class within the django.views.generic.list module of the Django project. + + +## Example 1 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / generic_views.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./generic_views.py) + +```python +# generic_views.py +from django.conf import settings +from django.core.paginator import Paginator +from django.views.generic import FormView +from django.views.generic.edit import FormMixin +~~from django.views.generic.list import MultipleObjectMixin + +from .forms import FacetedSearchForm, ModelSearchForm +from .query import SearchQuerySet + +RESULTS_PER_PAGE = getattr(settings, "HAYSTACK_SEARCH_RESULTS_PER_PAGE", 20) + + +~~class SearchMixin(MultipleObjectMixin, FormMixin): + + template_name = "search/search.html" + load_all = True + form_class = ModelSearchForm + context_object_name = None + paginate_by = RESULTS_PER_PAGE + paginate_orphans = 0 + paginator_class = Paginator + page_kwarg = "page" + form_name = "form" + search_field = "q" + object_list = None + + def get_queryset(self): + if self.queryset is None: + self.queryset = SearchQuerySet() + return self.queryset + + def get_form_kwargs(self): + kwargs = {"initial": self.get_initial()} + if self.request.method == "GET": + kwargs.update({"data": self.request.GET}) + kwargs.update( + {"searchqueryset": self.get_queryset(), "load_all": self.load_all} + + +## ... source file continues with no further MultipleObjectMixin examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-listview.markdown b/content/pages/examples/django/django-views-generic-listview.markdown new file mode 100644 index 000000000..602381d0a --- /dev/null +++ b/content/pages/examples/django/django-views-generic-listview.markdown @@ -0,0 +1,509 @@ +title: django.views.generic ListView Example Code +category: page +slug: django-views-generic-listview-examples +sortorder: 500011524 +toc: False +sidebartitle: django.views.generic ListView +meta: Python example code for the ListView class from the django.views.generic module of the Django project. + + +ListView is a class within the django.views.generic module of the Django project. + + +## Example 1 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / views.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/./views.py) + +```python +# views.py +import math + +from django.contrib import messages +from django.urls import reverse +from django.forms import Form +from django.http import HttpResponseForbidden +from django.http import Http404 +from django.utils.functional import cached_property +from django.views.generic.edit import DeletionMixin +~~from django.views.generic import ListView +from django.views.generic import TemplateView +from django.views.generic.edit import FormView +from mongoengine.fields import EmbeddedDocumentField, ListField + +from mongonaut.forms import MongoModelForm +from mongonaut.mixins import MongonautFormViewMixin +from mongonaut.mixins import MongonautViewMixin +from mongonaut.utils import is_valid_object_id + + +~~class IndexView(MongonautViewMixin, ListView): + + template_name = "mongonaut/index.html" + queryset = [] + permission = 'has_view_permission' + + def get_queryset(self): + return self.get_mongoadmins() + + +class DocumentListView(MongonautViewMixin, FormView): + form_class = Form + success_url = '/' + template_name = "mongonaut/document_list.html" + permission = 'has_view_permission' + + documents_per_page = 25 + + + def get_qset(self, queryset, q): + if self.mongoadmin.search_fields and q: + params = {} + for field in self.mongoadmin.search_fields: + if field == 'id': + if is_valid_object_id(q): + + +## ... source file continues with no further ListView examples... + +``` + + +## Example 2 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / views / token.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/views/token.py) + +```python +# token.py +from django.contrib.auth.mixins import LoginRequiredMixin +from django.urls import reverse_lazy +~~from django.views.generic import DeleteView, ListView + +from ..models import get_access_token_model + + +~~class AuthorizedTokensListView(LoginRequiredMixin, ListView): + context_object_name = "authorized_tokens" + template_name = "oauth2_provider/authorized-tokens.html" + model = get_access_token_model() + + def get_queryset(self): + return super().get_queryset().select_related("application").filter( + user=self.request.user + ) + + +class AuthorizedTokenDeleteView(LoginRequiredMixin, DeleteView): + template_name = "oauth2_provider/authorized-token-delete.html" + success_url = reverse_lazy("oauth2_provider:authorized-token-list") + model = get_access_token_model() + + def get_queryset(self): + return super().get_queryset().filter(user=self.request.user) + + + +## ... source file continues with no further ListView examples... + +``` + + +## Example 3 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / views.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./views.py) + +```python +# views.py +import re +import six +from collections import Counter + +try: + from django.urls import reverse_lazy +except ImportError: + from django.core.urlresolvers import reverse_lazy + +import django +from django.db import DatabaseError +from django.db.models import Count +from django.forms.models import model_to_dict +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect, Http404 +from django.shortcuts import get_object_or_404, render +from django.views.decorators.http import require_POST +from django.utils.decorators import method_decorator +~~from django.views.generic import ListView +from django.views.generic.base import View +from django.views.generic.edit import CreateView, DeleteView +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.core.exceptions import ImproperlyConfigured +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.views import LoginView + +from explorer import app_settings +from explorer.connections import connections +from explorer.exporters import get_exporter_class +from explorer.forms import QueryForm +from explorer.models import Query, QueryLog, MSG_FAILED_BLACKLIST +from explorer.tasks import execute_query +from explorer.utils import ( + url_get_rows, + url_get_query_id, + url_get_log_id, + url_get_params, + safe_login_prompt, + fmt_sql, + allowed_query_pks, + url_get_show, + url_get_fullscreen +) + + +## ... source file abbreviated to get to ListView examples ... + + + permission_required = 'change_permission' + + @method_decorator(xframe_options_sameorigin) + def dispatch(self, *args, **kwargs): + return super(SchemaView, self).dispatch(*args, **kwargs) + + def get(self, request, *args, **kwargs): + connection = kwargs.get('connection') + if connection not in connections: + raise Http404 + schema = schema_info(connection) + if schema: + return render(None, 'explorer/schema.html', + {'schema': schema_info(connection)}) + else: + return render(None, 'explorer/schema_building.html') + + +@require_POST +def format_sql(request): + sql = request.POST.get('sql', '') + formatted = fmt_sql(sql) + return JsonResponse({"formatted": formatted}) + + +~~class ListQueryView(PermissionRequiredMixin, ExplorerContextMixin, ListView): + + permission_required = 'view_permission_list' + + def recently_viewed(self): + qll = QueryLog.objects.filter(run_by_user=self.request.user, query_id__isnull=False).order_by( + '-run_at').select_related('query') + ret = [] + tracker = [] + for ql in qll: + if len(ret) == app_settings.EXPLORER_RECENT_QUERY_COUNT: + break + + if ql.query_id not in tracker: + ret.append(ql) + tracker.append(ql.query_id) + return ret + + def get_context_data(self, **kwargs): + context = super(ListQueryView, self).get_context_data(**kwargs) + context['object_list'] = self._build_queries_and_headers() + context['recent_queries'] = self.recently_viewed() + context['tasks_enabled'] = app_settings.ENABLE_TASKS + return context + + + +## ... source file abbreviated to get to ListView examples ... + + + for q in self.object_list: + model_dict = model_to_dict(q) + header = q.title.split(' - ')[0] + collapse_target = pattern.sub('', header) + + if headers[header] > 1 and header not in rendered_headers: + dict_list.append({'title': header, + 'is_header': True, + 'is_in_category': False, + 'collapse_target': collapse_target, + 'count': headers[header]}) + rendered_headers.append(header) + + model_dict.update({'is_in_category': headers[header] > 1, + 'collapse_target': collapse_target, + 'created_at': q.created_at, + 'is_header': False, + 'run_count': q.run_count, + 'created_by_user': six.text_type(q.created_by_user) if q.created_by_user else None}) + dict_list.append(model_dict) + return dict_list + + model = Query + + +~~class ListQueryLogView(PermissionRequiredMixin, ExplorerContextMixin, ListView): + + permission_required = 'view_permission' + + def get_queryset(self): + kwargs = {'sql__isnull': False} + if url_get_query_id(self.request): + kwargs['query_id'] = url_get_query_id(self.request) + return QueryLog.objects.filter(**kwargs).all() + + context_object_name = "recent_logs" + model = QueryLog + paginate_by = 20 + + +class CreateQueryView(PermissionRequiredMixin, ExplorerContextMixin, CreateView): + + permission_required = 'change_permission' + + def form_valid(self, form): + form.instance.created_by_user = self.request.user + return super(CreateQueryView, self).form_valid(form) + + form_class = QueryForm + template_name = 'explorer/query.html' + + +## ... source file continues with no further ListView examples... + +``` + + +## Example 4 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / article.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/article.py) + +```python +# article.py +import difflib +import logging +from urllib.parse import urljoin + +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.db import transaction +from django.db.models import Q +from django.http import Http404 +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.shortcuts import render +from django.urls import reverse +from django.utils.decorators import method_decorator +from django.utils.translation import gettext as _ +from django.utils.translation import ngettext +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.generic import DetailView +from django.views.generic import FormView +~~from django.views.generic import ListView +from django.views.generic import RedirectView +from django.views.generic import TemplateView +from django.views.generic import View +from wiki import editors +from wiki import forms +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.exceptions import NoRootURL +from wiki.core.paginator import WikiPaginator +from wiki.core.plugins import registry as plugin_registry +from wiki.core.utils import object_to_json_response +from wiki.decorators import get_article +from wiki.views.mixins import ArticleMixin + +log = logging.getLogger(__name__) + + +class ArticleView(ArticleMixin, TemplateView): + + template_name = "wiki/view.html" + + @method_decorator(get_article(can_read=True)) + + +## ... source file abbreviated to get to ListView examples ... + + + + @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + def get_context_data(self, **kwargs): + kwargs["selected_tab"] = "source" + return super().get_context_data(**kwargs) + + +~~class History(ListView, ArticleMixin): + + template_name = "wiki/history.html" + allow_empty = True + context_object_name = "revisions" + paginator_class = WikiPaginator + paginate_by = 10 + + def get_queryset(self): + return models.ArticleRevision.objects.filter(article=self.article).order_by( + "-created" + ) + + def get_context_data(self, **kwargs): + kwargs_article = ArticleMixin.get_context_data(self, **kwargs) +~~ kwargs_listview = ListView.get_context_data(self, **kwargs) + kwargs.update(kwargs_article) + kwargs.update(kwargs_listview) + kwargs["selected_tab"] = "history" + return kwargs + + @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + +~~class Dir(ListView, ArticleMixin): + + template_name = "wiki/dir.html" + allow_empty = True + context_object_name = "directory" + model = models.URLPath + paginator_class = WikiPaginator + paginate_by = 30 + + @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + self.filter_form = forms.DirFilterForm(request.GET) + if self.filter_form.is_valid(): + self.query = self.filter_form.cleaned_data["query"] + else: + self.query = None + return super().dispatch(request, article, *args, **kwargs) + + def get_queryset(self): + children = self.urlpath.get_children().can_read(self.request.user) + if self.query: + children = children.filter( + Q(article__current_revision__title__icontains=self.query) + | Q(slug__icontains=self.query) + ) + if not self.article.can_moderate(self.request.user): + children = children.active() + children = children.select_related_common().order_by( + "article__current_revision__title" + ) + return children + + def get_context_data(self, **kwargs): + kwargs_article = ArticleMixin.get_context_data(self, **kwargs) +~~ kwargs_listview = ListView.get_context_data(self, **kwargs) + kwargs.update(kwargs_article) + kwargs.update(kwargs_listview) + kwargs["filter_query"] = self.query + kwargs["filter_form"] = self.filter_form + + updated_children = kwargs[self.context_object_name] + for child in updated_children: + child.set_cached_ancestors_from_parent(self.urlpath) + kwargs[self.context_object_name] = updated_children + + return kwargs + + +~~class SearchView(ListView): + + template_name = "wiki/search.html" + paginator_class = WikiPaginator + paginate_by = 25 + context_object_name = "articles" + + def dispatch(self, request, *args, **kwargs): + self.urlpath = None + if request.user.is_anonymous and not settings.ANONYMOUS: + return redirect(settings.LOGIN_URL) + self.search_form = forms.SearchForm(request.GET) + if self.search_form.is_valid(): + self.query = self.search_form.cleaned_data["q"] + else: + self.query = None + return super().dispatch(request, *args, **kwargs) + + def get_queryset(self): + if not self.query: + return models.Article.objects.none().order_by("-current_revision__created") + articles = models.Article.objects + path = self.kwargs.get("path", None) + if path: + try: + + def get_initial(self): + return { + "revision": self.article.current_revision, + "purge": True, + } + + def get_context_data(self, **kwargs): + kwargs["purge_form"] = self.get_form() + kwargs["form"] = kwargs["purge_form"] + return super().get_context_data(**kwargs) + + +class Source(ArticleMixin, TemplateView): + template_name = "wiki/source.html" + + +## ... source file continues with no further ListView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-redirectview.markdown b/content/pages/examples/django/django-views-generic-redirectview.markdown new file mode 100644 index 000000000..360902c83 --- /dev/null +++ b/content/pages/examples/django/django-views-generic-redirectview.markdown @@ -0,0 +1,167 @@ +title: django.views.generic RedirectView Example Code +category: page +slug: django-views-generic-redirectview-examples +sortorder: 500011525 +toc: False +sidebartitle: django.views.generic RedirectView +meta: Python example code for the RedirectView class from the django.views.generic module of the Django project. + + +RedirectView is a class within the django.views.generic module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / registration / urls.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/registration/urls.py) + +```python +# urls.py +from django.urls import path +~~from django.views.generic import RedirectView + +from . import views + +urlpatterns = [ +~~ path('', RedirectView.as_view(pattern_name='register-personal'), + name='register'), + path('personal/', views.personal, name='register-personal'), + path('professional/', views.professional, name='register-professional'), + path('subscriptions/', views.subscriptions, name='register-subscriptions'), +] + + + +## ... source file continues with no further RedirectView examples... + +``` + + +## Example 2 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / article.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/article.py) + +```python +# article.py +import difflib +import logging +from urllib.parse import urljoin + +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.db import transaction +from django.db.models import Q +from django.http import Http404 +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.shortcuts import render +from django.urls import reverse +from django.utils.decorators import method_decorator +from django.utils.translation import gettext as _ +from django.utils.translation import ngettext +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.generic import DetailView +from django.views.generic import FormView +from django.views.generic import ListView +~~from django.views.generic import RedirectView +from django.views.generic import TemplateView +from django.views.generic import View +from wiki import editors +from wiki import forms +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.exceptions import NoRootURL +from wiki.core.paginator import WikiPaginator +from wiki.core.plugins import registry as plugin_registry +from wiki.core.utils import object_to_json_response +from wiki.decorators import get_article +from wiki.views.mixins import ArticleMixin + +log = logging.getLogger(__name__) + + +class ArticleView(ArticleMixin, TemplateView): + + template_name = "wiki/view.html" + + @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + + +## ... source file abbreviated to get to RedirectView examples ... + + + form = form_class(self.article, self.request) + self.forms.append(form) + return super().get(*args, **kwargs) + + def get(self, *args, **kwargs): + self.forms = [] + + new_article = models.Article.objects.get(id=self.article.id) + + for Form in self.get_form_classes(): + self.forms.append(Form(new_article, self.request)) + + return super().get(*args, **kwargs) + + def get_success_url(self): + if self.urlpath: + return redirect("wiki:settings", path=self.urlpath.path) + return redirect("wiki:settings", article_id=self.article.id) + + def get_context_data(self, **kwargs): + kwargs["selected_tab"] = "settings" + kwargs["forms"] = self.forms + return super().get_context_data(**kwargs) + + +~~class ChangeRevisionView(RedirectView): + + permanent = False + + @method_decorator(get_article(can_write=True, not_locked=True)) + def dispatch(self, request, article, *args, **kwargs): + self.article = article + self.urlpath = kwargs.pop("kwargs", False) + self.change_revision() + + return super().dispatch(request, *args, **kwargs) + + def get_redirect_url(self, **kwargs): + if self.urlpath: + return reverse("wiki:history", kwargs={"path": self.urlpath.path}) + else: + return reverse("wiki:history", kwargs={"article_id": self.article.id}) + + def change_revision(self): + revision = get_object_or_404( + models.ArticleRevision, article=self.article, id=self.kwargs["revision_id"] + ) + self.article.current_revision = revision + self.article.save() + messages.success( + + +## ... source file continues with no further RedirectView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-templateview.markdown b/content/pages/examples/django/django-views-generic-templateview.markdown new file mode 100644 index 000000000..1b7772dde --- /dev/null +++ b/content/pages/examples/django/django-views-generic-templateview.markdown @@ -0,0 +1,558 @@ +title: django.views.generic TemplateView Example Code +category: page +slug: django-views-generic-templateview-examples +sortorder: 500011526 +toc: False +sidebartitle: django.views.generic TemplateView +meta: Python example code for the TemplateView class from the django.views.generic module of the Django project. + + +TemplateView is a class within the django.views.generic module of the Django project. + + +## Example 1 from django-markdown-view +[django-markdown-view](https://github.com/rgs258/django-markdown-view) +([PyPI package information](https://pypi.org/project/django-markdown-view/)) +is a Django extension for serving [Markdown](/markdown.html) files as +[Django templates](/django-templates.html). The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/rgs258/django-markdown-view/blob/master/LICENSE). + +[**django-markdown-view / markdown_view / views.py**](https://github.com/rgs258/django-markdown-view/blob/master/markdown_view/./views.py) + +```python +# views.py +import logging + +import markdown +from django.conf import settings +from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin +from django.template import Engine, Template, Context +from django.template.loader import render_to_string +from django.utils.safestring import mark_safe +~~from django.views.generic import TemplateView +from markdown_view.constants import ( + DEFAULT_MARKDOWN_VIEW_LOADERS, + DEFAULT_MARKDOWN_VIEW_EXTENSIONS, DEFAULT_MARKDOWN_VIEW_TEMPLATE, + DEFAULT_MARKDOWN_VIEW_USE_REQUEST_CONTEXT, DEFAULT_MARKDOWN_VIEW_EXTRA_CONTEXT, +) + +logger = logging.getLogger(__name__) + + +~~class MarkdownView(TemplateView): + file_name = None + + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(*args, **kwargs) + if self.file_name: + engine = Engine(loaders=getattr( + settings, "MARKDOWN_VIEW_LOADERS", DEFAULT_MARKDOWN_VIEW_LOADERS) + ) + template = engine.get_template(self.file_name) + md = markdown.Markdown(extensions=getattr( + settings, + "MARKDOWN_VIEW_EXTENSIONS", + DEFAULT_MARKDOWN_VIEW_EXTENSIONS + )) + template = Template( + "{{% load static %}}{}".format(md.convert(template.source)) + ) + render_context_base = {} + if getattr( + settings, + "MARKDOWN_VIEW_USE_REQUEST_CONTEXT", + DEFAULT_MARKDOWN_VIEW_USE_REQUEST_CONTEXT + ): + render_context_base = context + + +## ... source file continues with no further TemplateView examples... + +``` + + +## Example 2 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / views.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/./views.py) + +```python +# views.py +import math + +from django.contrib import messages +from django.urls import reverse +from django.forms import Form +from django.http import HttpResponseForbidden +from django.http import Http404 +from django.utils.functional import cached_property +from django.views.generic.edit import DeletionMixin +from django.views.generic import ListView +~~from django.views.generic import TemplateView +from django.views.generic.edit import FormView +from mongoengine.fields import EmbeddedDocumentField, ListField + +from mongonaut.forms import MongoModelForm +from mongonaut.mixins import MongonautFormViewMixin +from mongonaut.mixins import MongonautViewMixin +from mongonaut.utils import is_valid_object_id + + +class IndexView(MongonautViewMixin, ListView): + + template_name = "mongonaut/index.html" + queryset = [] + permission = 'has_view_permission' + + def get_queryset(self): + return self.get_mongoadmins() + + +class DocumentListView(MongonautViewMixin, FormView): + form_class = Form + success_url = '/' + template_name = "mongonaut/document_list.html" + permission = 'has_view_permission' + + +## ... source file abbreviated to get to TemplateView examples ... + + + for key in [x for x in self.mongoadmin.list_fields if x != 'id' and x in self.document._fields.keys()]: + + if isinstance(self.document._fields[key], EmbeddedDocumentField): + continue + if isinstance(self.document._fields[key], ListField): + continue + context['keys'].append(key) + + if self.mongoadmin.search_fields: + context['search_field'] = True + + return context + + def post(self, request, *args, **kwargs): + form_class = self.get_form_class() + form = self.get_form(form_class) + mongo_ids = self.get_initial()['mongo_id'] + for form_mongo_id in form.data.getlist('mongo_id'): + for mongo_id in mongo_ids: + if form_mongo_id == mongo_id: + self.document.objects.get(pk=mongo_id).delete() + + return self.form_invalid(form) + + +~~class DocumentDetailView(MongonautViewMixin, TemplateView): + template_name = "mongonaut/document_detail.html" + permission = 'has_view_permission' + + def get_context_data(self, **kwargs): + context = super(DocumentDetailView, self).get_context_data(**kwargs) + self.set_mongoadmin() + context = self.set_permissions_in_context(context) + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + self.document = self.document_type.objects.get(pk=self.ident) + + context['document'] = self.document + context['app_label'] = self.app_label + context['document_name'] = self.document_name + context['keys'] = ['id', ] + context['embedded_documents'] = [] + context['list_fields'] = [] + for key in sorted([x for x in self.document._fields.keys() if x != 'id']): + if isinstance(self.document._fields[key], EmbeddedDocumentField): + context['embedded_documents'].append(key) + continue + if isinstance(self.document._fields[key], ListField): + context['list_fields'].append(key) + continue + + +## ... source file abbreviated to get to TemplateView examples ... + + + def get_context_data(self, **kwargs): + context = super(DocumentAddFormView, self).get_context_data(**kwargs) + self.set_mongoadmin() + context = self.set_permissions_in_context(context) + self.document_type = getattr(self.models, self.document_name) + + context['app_label'] = self.app_label + context['document_name'] = self.document_name + context['form_action'] = reverse('document_detail_add_form', args=[self.kwargs.get('app_label'), + self.kwargs.get('document_name')]) + + return context + + def get_form(self): + self.set_mongonaut_base() + self.document_type = getattr(self.models, self.document_name) + self.form = Form() + + if self.request.method == 'POST': + self.form = self.process_post_form('Your new document has been added and saved.') + else: + self.form = MongoModelForm(model=self.document_type).get_form() + return self.form + + +~~class DocumentDeleteView(DeletionMixin, MongonautViewMixin, TemplateView): + + success_url = "/" + template_name = "mongonaut/document_delete.html" + + def get_success_url(self): + self.set_mongonaut_base() + messages.add_message(self.request, messages.INFO, 'Your document has been deleted.') + return reverse('document_list', kwargs={'app_label': self.app_label, 'document_name': self.document_name}) + + def get_object(self): + self.set_mongoadmin() + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + self.document = self.document_type.objects.get(pk=self.ident) + return self.document + + + +## ... source file continues with no further TemplateView examples... + +``` + + +## Example 3 from django-smithy +[django-smithy](https://github.com/jamiecounsell/django-smithy) is +a [Django](/django.html) code library that allows users to send +HTTP requests from the Django admin user interface. The code for +the project is open source under the +[MIT license](https://github.com/jamiecounsell/django-smithy/blob/master/LICENSE). + +[**django-smithy / smithy / urls.py**](https://github.com/jamiecounsell/django-smithy/blob/master/smithy/./urls.py) + +```python +# urls.py +from django.conf.urls import url +~~from django.views.generic import TemplateView + +from . import views + + +app_name = 'smithy' + +urlpatterns = [ + +] + + + +## ... source file continues with no further TemplateView examples... + +``` + + +## Example 4 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / article.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/article.py) + +```python +# article.py +import difflib +import logging +from urllib.parse import urljoin + +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.db import transaction +from django.db.models import Q +from django.http import Http404 +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.shortcuts import render +from django.urls import reverse +from django.utils.decorators import method_decorator +from django.utils.translation import gettext as _ +from django.utils.translation import ngettext +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.generic import DetailView +from django.views.generic import FormView +from django.views.generic import ListView +from django.views.generic import RedirectView +~~from django.views.generic import TemplateView +from django.views.generic import View +from wiki import editors +from wiki import forms +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.exceptions import NoRootURL +from wiki.core.paginator import WikiPaginator +from wiki.core.plugins import registry as plugin_registry +from wiki.core.utils import object_to_json_response +from wiki.decorators import get_article +from wiki.views.mixins import ArticleMixin + +log = logging.getLogger(__name__) + + +~~class ArticleView(ArticleMixin, TemplateView): + + template_name = "wiki/view.html" + + @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + +## ... source file abbreviated to get to TemplateView examples ... + + + try: + root = models.URLPath.root() + except NoRootURL: + pass + else: + if root.article: + return redirect("wiki:get", path=root.path) + + root.delete() + return super().dispatch(request, *args, **kwargs) + + def form_valid(self, form): + models.URLPath.create_root( + title=form.cleaned_data["title"], + content=form.cleaned_data["content"], + request=self.request, + ) + return redirect("wiki:root") + + def get_context_data(self, **kwargs): + kwargs = super().get_context_data(**kwargs) + kwargs["editor"] = editors.getEditor() + return kwargs + + +~~class MissingRootView(TemplateView): + template_name = "wiki/root_missing.html" + + + def get_context_data(self, **kwargs): + kwargs["selected_tab"] = "view" + return ArticleMixin.get_context_data(self, **kwargs) + + +class Create(FormView, ArticleMixin): + form_class = forms.CreateForm + template_name = "wiki/create.html" + + @method_decorator(get_article(can_write=True, can_create=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + def get_form(self, form_class=None): + if form_class is None: + form_class = self.get_form_class() + kwargs = self.get_form_kwargs() + + +## ... source file abbreviated to get to TemplateView examples ... + + + self.article.add_revision(revision) + messages.success( + request, + _('The article "%s" and its children are now restored.') + % revision.title, + ) + if self.urlpath: + return redirect("wiki:get", path=self.urlpath.path) + else: + return redirect("wiki:get", article_id=article.id) + + return super().dispatch1(request, article, *args, **kwargs) + + def get_initial(self): + return { + "revision": self.article.current_revision, + "purge": True, + } + + def get_context_data(self, **kwargs): + kwargs["purge_form"] = self.get_form() + kwargs["form"] = kwargs["purge_form"] + return super().get_context_data(**kwargs) + + +~~class Source(ArticleMixin, TemplateView): + template_name = "wiki/source.html" + + @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + def get_context_data(self, **kwargs): + kwargs["selected_tab"] = "source" + return super().get_context_data(**kwargs) + + +class History(ListView, ArticleMixin): + + template_name = "wiki/history.html" + allow_empty = True + context_object_name = "revisions" + paginator_class = WikiPaginator + paginate_by = 10 + + def get_queryset(self): + return models.ArticleRevision.objects.filter(article=self.article).order_by( + "-created" + ) + + + +## ... source file abbreviated to get to TemplateView examples ... + + + | Q(current_revision__content__icontains=self.query) + ) + if not permissions.can_moderate( + models.URLPath.root().article, self.request.user + ): + articles = articles.active().can_read(self.request.user) + return articles.order_by("-current_revision__created") + + def get_context_data(self, **kwargs): + kwargs = super().get_context_data(**kwargs) + kwargs["search_form"] = self.search_form + kwargs["search_query"] = self.query + kwargs["urlpath"] = self.urlpath + return kwargs + + +class Plugin(View): + def dispatch(self, request, path=None, slug=None, **kwargs): + kwargs["path"] = path + for plugin in list(plugin_registry.get_plugins().values()): + if getattr(plugin, "slug", None) == slug: + return plugin.article_view(request, **kwargs) + raise Http404() + + +~~class Settings(ArticleMixin, TemplateView): + + permission_form_class = forms.PermissionsForm + template_name = "wiki/settings.html" + + @method_decorator(login_required) + @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + def get_form_classes(self): + settings_forms = [] + if permissions.can_change_permissions(self.article, self.request.user): + settings_forms.append(self.permission_form_class) + plugin_forms = [F for F in plugin_registry.get_settings_forms()] + plugin_forms.sort(key=lambda form: form.settings_order) + settings_forms += plugin_forms + for i in range(len(settings_forms)): + setattr(settings_forms[i], "action", "form%d" % i) + + return settings_forms + + def post(self, *args, **kwargs): + self.forms = [] + for form_class in self.get_form_classes(): + + +## ... source file abbreviated to get to TemplateView examples ... + + + self.change_revision() + + return super().dispatch(request, *args, **kwargs) + + def get_redirect_url(self, **kwargs): + if self.urlpath: + return reverse("wiki:history", kwargs={"path": self.urlpath.path}) + else: + return reverse("wiki:history", kwargs={"article_id": self.article.id}) + + def change_revision(self): + revision = get_object_or_404( + models.ArticleRevision, article=self.article, id=self.kwargs["revision_id"] + ) + self.article.current_revision = revision + self.article.save() + messages.success( + self.request, + _( + "The article %(title)s is now set to display revision #%(revision_number)d" + ) + % {"title": revision.title, "revision_number": revision.revision_number}, + ) + + +~~class Preview(ArticleMixin, TemplateView): + + template_name = "wiki/preview_inline.html" + + @method_decorator(xframe_options_sameorigin) + @method_decorator(get_article(can_read=True, deleted_contents=True)) + def dispatch(self, request, article, *args, **kwargs): + revision_id = request.GET.get("r", None) + self.title = None + self.content = None + self.preview = False + if revision_id: + try: + revision_id = int(revision_id) + except ValueError: + raise Http404() + self.revision = get_object_or_404( + models.ArticleRevision, article=article, id=revision_id + ) + else: + self.revision = None + return super().dispatch(request, article, *args, **kwargs) + + def post(self, request, *args, **kwargs): + edit_form = forms.EditForm( + + +## ... source file continues with no further TemplateView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-updateview.markdown b/content/pages/examples/django/django-views-generic-updateview.markdown new file mode 100644 index 000000000..c6611223b --- /dev/null +++ b/content/pages/examples/django/django-views-generic-updateview.markdown @@ -0,0 +1,195 @@ +title: django.views.generic UpdateView Example Code +category: page +slug: django-views-generic-updateview-examples +sortorder: 500011527 +toc: False +sidebartitle: django.views.generic UpdateView +meta: Python example code for the UpdateView class from the django.views.generic module of the Django project. + + +UpdateView is a class within the django.views.generic module of the Django project. + + +## Example 1 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / dashboard / views.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/dashboard/views.py) + +```python +# views.py +from django.contrib import messages +from django.core.exceptions import ValidationError +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +from django.forms.formsets import formset_factory +from django.http import HttpResponseRedirect +from django.views.decorators.http import require_POST, require_GET +from jet.dashboard.forms import UpdateDashboardModulesForm, AddUserDashboardModuleForm, \ + UpdateDashboardModuleCollapseForm, RemoveDashboardModuleForm, ResetDashboardForm +from jet.dashboard.models import UserDashboardModule +from jet.utils import JsonResponse, get_app_list, SuccessMessageMixin, user_is_authenticated +~~from django.views.generic import UpdateView +from django.utils.translation import ugettext_lazy as _ + + +~~class UpdateDashboardModuleView(SuccessMessageMixin, UpdateView): + model = UserDashboardModule + fields = ('title',) + template_name = 'jet.dashboard/update_module.html' + success_message = _('Widget was successfully updated') + object = None + module = None + + def has_permission(self, request): + return request.user.is_active and request.user.is_staff + + def get_success_url(self): + if self.object.app_label: + return reverse('admin:app_list', kwargs={'app_label': self.object.app_label}) + else: + return reverse('admin:index') + + def get_module(self): + object = self.object if getattr(self, 'object', None) is not None else self.get_object() + return object.load_module() + + def get_settings_form_kwargs(self): + kwargs = { + 'initial': self.module.settings + } + + +## ... source file continues with no further UpdateView examples... + +``` + + +## Example 2 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / accounts.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/accounts.py) + +```python +# accounts.py +from django.conf import settings as django_settings +from django.contrib import messages +from django.contrib.auth import get_user_model +from django.contrib.auth import login as auth_login +from django.contrib.auth import logout as auth_logout +from django.contrib.auth.forms import AuthenticationForm +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.shortcuts import render +from django.urls import reverse +from django.utils.translation import gettext as _ +from django.views.generic import CreateView +from django.views.generic import FormView +~~from django.views.generic import UpdateView +from django.views.generic import View +from wiki import forms +from wiki.conf import settings + +User = get_user_model() + + +class Signup(CreateView): + model = User + form_class = forms.UserCreationForm + template_name = "wiki/accounts/signup.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_anonymous and not request.user.is_superuser: + return redirect("wiki:root") + if not settings.ACCOUNT_HANDLING: + return redirect(settings.SIGNUP_URL) + if not request.user.is_superuser and not settings.ACCOUNT_SIGNUP_ALLOWED: + c = {"error_msg": _("Account signup is only allowed for administrators.")} + return render(request, "wiki/error.html", context=c) + + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + + +## ... source file abbreviated to get to UpdateView examples ... + + + kwargs["request"] = self.request + return kwargs + + def post(self, request, *args, **kwargs): + self.referer = request.session.get("login_referer", "") + return super().post(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + self.referer = request.META.get("HTTP_REFERER", "") + request.session["login_referer"] = self.referer + return super().get(request, *args, **kwargs) + + def form_valid(self, form, *args, **kwargs): + auth_login(self.request, form.get_user()) + messages.info(self.request, _("You are now logged in! Have fun!")) + if self.request.GET.get("next", None): + return redirect(self.request.GET["next"]) + if django_settings.LOGIN_REDIRECT_URL: + return redirect(django_settings.LOGIN_REDIRECT_URL) + else: + if not self.referer: + return redirect("wiki:root") + return redirect(self.referer) + + +~~class Update(UpdateView): + model = User + form_class = forms.UserUpdateForm + template_name = "wiki/accounts/account_settings.html" + + def get_object(self, queryset=None): + return get_object_or_404(self.model, pk=self.request.user.pk) + + def get(self, request, *args, **kwargs): + self.referer = request.META.get("HTTP_REFERER", "") + request.session["login_referer"] = self.referer + return super().get(request, *args, **kwargs) + + def post(self, request, *args, **kwargs): + self.referer = request.session.get("login_referer", "") + return super().post(request, *args, **kwargs) + + def form_valid(self, form): + pw = form.cleaned_data["password1"] + if pw != "": + self.object.set_password(pw) + self.object.save() + + messages.info(self.request, _("Account info saved!")) + + + +## ... source file continues with no further UpdateView examples... + +``` + diff --git a/content/pages/examples/django/django-views-generic-view.markdown b/content/pages/examples/django/django-views-generic-view.markdown new file mode 100644 index 000000000..31740938d --- /dev/null +++ b/content/pages/examples/django/django-views-generic-view.markdown @@ -0,0 +1,427 @@ +title: django.views.generic View Example Code +category: page +slug: django-views-generic-view-examples +sortorder: 500011528 +toc: False +sidebartitle: django.views.generic View +meta: Python example code for the View class from the django.views.generic module of the Django project. + + +View is a class within the django.views.generic module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / views / upload.py**](https://github.com/jrief/django-angular/blob/master/djng/views/upload.py) + +```python +# upload.py +from django.core.exceptions import SuspiciousMultipartForm +from django.core import signing +~~from django.views.generic import View +from django.http import JsonResponse + +from djng import app_settings +from djng.forms.fields import FileField, ImageField + + +~~class FileUploadView(View): + storage = app_settings.upload_storage + thumbnail_size = app_settings.THUMBNAIL_OPTIONS + signer = signing.Signer() + + def post(self, request, *args, **kwargs): + if request.POST.get('filetype') == 'file': + field = FileField + elif request.POST.get('filetype') == 'image': + field = ImageField + else: + raise SuspiciousMultipartForm("Missing attribute 'filetype' in form data.") + data = {} + for name, file_obj in request.FILES.items(): + data[name] = field.preview(file_obj) + return JsonResponse(data) + + + +## ... source file continues with no further View examples... + +``` + + +## Example 2 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / views.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./views.py) + +```python +# views.py +from django.core.exceptions import ImproperlyConfigured +~~from django.views.generic import View +from django.views.generic.list import ( + MultipleObjectMixin, + MultipleObjectTemplateResponseMixin +) + +from .constants import ALL_FIELDS +from .filterset import filterset_factory +from .utils import MigrationNotice, RenameAttributesBase + + +class FilterMixinRenames(RenameAttributesBase): + renamed_attributes = ( + ('filter_fields', 'filterset_fields', MigrationNotice), + ) + + +class FilterMixin(metaclass=FilterMixinRenames): + filterset_class = None + filterset_fields = ALL_FIELDS + strict = True + + def get_filterset_class(self): + if self.filterset_class: + return self.filterset_class + + +## ... source file abbreviated to get to View examples ... + + + kwargs = self.get_filterset_kwargs(filterset_class) + return filterset_class(**kwargs) + + def get_filterset_kwargs(self, filterset_class): + kwargs = { + 'data': self.request.GET or None, + 'request': self.request, + } + try: + kwargs.update({ + 'queryset': self.get_queryset(), + }) + except ImproperlyConfigured: + if filterset_class._meta.model is None: + msg = ("'%s' does not define a 'model' and the view '%s' does " + "not return a valid queryset from 'get_queryset'. You " + "must fix one of them.") + args = (filterset_class.__name__, self.__class__.__name__) + raise ImproperlyConfigured(msg % args) + return kwargs + + def get_strict(self): + return self.strict + + +~~class BaseFilterView(FilterMixin, MultipleObjectMixin, View): + + def get(self, request, *args, **kwargs): + filterset_class = self.get_filterset_class() + self.filterset = self.get_filterset(filterset_class) + + if not self.filterset.is_bound or self.filterset.is_valid() or not self.get_strict(): + self.object_list = self.filterset.qs + else: + self.object_list = self.filterset.queryset.none() + + context = self.get_context_data(filter=self.filterset, + object_list=self.object_list) + return self.render_to_response(context) + + +class FilterView(MultipleObjectTemplateResponseMixin, BaseFilterView): + template_name_suffix = '_filter' + + +def object_filter(request, model=None, queryset=None, template_name=None, + extra_context=None, context_processors=None, + filter_class=None): + class ECFilterView(FilterView): + def get_context_data(self, **kwargs): + + +## ... source file continues with no further View examples... + +``` + + +## Example 3 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / views / generic.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/views/generic.py) + +```python +# generic.py +~~from django.views.generic import View + +from ..settings import oauth2_settings +from .mixins import ( + ClientProtectedResourceMixin, OAuthLibMixin, ProtectedResourceMixin, + ReadWriteScopedResourceMixin, ScopedResourceMixin +) + + +class InitializationMixin(OAuthLibMixin): + + + server_class = oauth2_settings.OAUTH2_SERVER_CLASS + validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS + oauthlib_backend_class = oauth2_settings.OAUTH2_BACKEND_CLASS + + +~~class ProtectedResourceView(ProtectedResourceMixin, InitializationMixin, View): + pass + + +class ScopedProtectedResourceView(ScopedResourceMixin, ProtectedResourceView): + pass + + +class ReadWriteScopedResourceView(ReadWriteScopedResourceMixin, ProtectedResourceView): + pass + + +~~class ClientProtectedResourceView(ClientProtectedResourceMixin, InitializationMixin, View): + + + pass + + +class ClientProtectedScopedResourceView(ScopedResourceMixin, ClientProtectedResourceView): + + + pass + + + +## ... source file continues with no further View examples... + +``` + + +## Example 4 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / compat.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./compat.py) + +```python +# compat.py +from django.conf import settings +~~from django.views.generic import View + + +def unicode_http_header(value): + if isinstance(value, bytes): + return value.decode('iso-8859-1') + return value + + +def distinct(queryset, base): + if settings.DATABASES[queryset.db]["ENGINE"] == "django.db.backends.oracle": + return base.filter(pk__in=set(queryset.values_list('pk', flat=True))) + return queryset.distinct() + + +try: + from django.contrib.postgres import fields as postgres_fields +except ImportError: + postgres_fields = None + + +try: + import coreapi +except ImportError: + coreapi = None + +try: + import uritemplate +except ImportError: + uritemplate = None + + +try: + import coreschema +except ImportError: + coreschema = None + + +try: + import yaml +except ImportError: + yaml = None + + +try: + import requests +except ImportError: + requests = None + + +~~if 'patch' not in View.http_method_names: +~~ View.http_method_names = View.http_method_names + ['patch'] + + +try: + import markdown + + HEADERID_EXT_PATH = 'markdown.extensions.toc' + LEVEL_PARAM = 'baselevel' + + def apply_markdown(text): + extensions = [HEADERID_EXT_PATH] + extension_configs = { + HEADERID_EXT_PATH: { + LEVEL_PARAM: '2' + } + } + md = markdown.Markdown( + extensions=extensions, extension_configs=extension_configs + ) + md_filter_add_syntax_highlight(md) + return md.convert(text) +except ImportError: + apply_markdown = None + markdown = None + + + +## ... source file continues with no further View examples... + +``` + + +## Example 5 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / accounts.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/accounts.py) + +```python +# accounts.py +from django.conf import settings as django_settings +from django.contrib import messages +from django.contrib.auth import get_user_model +from django.contrib.auth import login as auth_login +from django.contrib.auth import logout as auth_logout +from django.contrib.auth.forms import AuthenticationForm +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.shortcuts import render +from django.urls import reverse +from django.utils.translation import gettext as _ +from django.views.generic import CreateView +from django.views.generic import FormView +from django.views.generic import UpdateView +~~from django.views.generic import View +from wiki import forms +from wiki.conf import settings + +User = get_user_model() + + +class Signup(CreateView): + model = User + form_class = forms.UserCreationForm + template_name = "wiki/accounts/signup.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_anonymous and not request.user.is_superuser: + return redirect("wiki:root") + if not settings.ACCOUNT_HANDLING: + return redirect(settings.SIGNUP_URL) + if not request.user.is_superuser and not settings.ACCOUNT_SIGNUP_ALLOWED: + c = {"error_msg": _("Account signup is only allowed for administrators.")} + return render(request, "wiki/error.html", context=c) + + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["honeypot_class"] = context["form"].honeypot_class + context["honeypot_jsfunction"] = context["form"].honeypot_jsfunction + return context + + def get_success_url(self, *args): + messages.success( + self.request, _("You are now signed up... and now you can sign in!") + ) + return reverse("wiki:login") + + +~~class Logout(View): + def dispatch(self, request, *args, **kwargs): + if not settings.ACCOUNT_HANDLING: + return redirect(settings.LOGOUT_URL) + return super().dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + auth_logout(request) + messages.info(request, _("You are no longer logged in. Bye bye!")) + return redirect("wiki:root") + + +class Login(FormView): + + form_class = AuthenticationForm + template_name = "wiki/accounts/login.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_anonymous: + return redirect("wiki:root") + if not settings.ACCOUNT_HANDLING: + return redirect(settings.LOGIN_URL) + return super().dispatch(request, *args, **kwargs) + + def get_form_kwargs(self): + + +## ... source file continues with no further View examples... + +``` + diff --git a/content/pages/examples/django/django-views-i18n-javascriptcatalog.markdown b/content/pages/examples/django/django-views-i18n-javascriptcatalog.markdown new file mode 100644 index 000000000..192f42952 --- /dev/null +++ b/content/pages/examples/django/django-views-i18n-javascriptcatalog.markdown @@ -0,0 +1,62 @@ +title: django.views.i18n JavaScriptCatalog Example Code +category: page +slug: django-views-i18n-javascriptcatalog-examples +sortorder: 500011541 +toc: False +sidebartitle: django.views.i18n JavaScriptCatalog +meta: Python example code for the JavaScriptCatalog class from the django.views.i18n module of the Django project. + + +JavaScriptCatalog is a class within the django.views.i18n module of the Django project. + + +## Example 1 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / urls.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./urls.py) + +```python +# urls.py +import django +from django.conf.urls import url + +try: +~~ from django.views.i18n import JavaScriptCatalog +~~ javascript_catalog = JavaScriptCatalog.as_view() +except ImportError: # Django < 2.0 + from django.views.i18n import javascript_catalog + +from jet.views import add_bookmark_view, remove_bookmark_view, toggle_application_pin_view, model_lookup_view + + +app_name = 'jet' + +urlpatterns = [ + url( + r'^add_bookmark/$', + add_bookmark_view, + name='add_bookmark' + ), + url( + r'^remove_bookmark/$', + remove_bookmark_view, + name='remove_bookmark' + ), + url( + r'^toggle_application_pin/$', + toggle_application_pin_view, + name='toggle_application_pin' + ), + + +## ... source file continues with no further JavaScriptCatalog examples... + +``` + diff --git a/content/pages/examples/django/django-views-static-serve.markdown b/content/pages/examples/django/django-views-static-serve.markdown new file mode 100644 index 000000000..2721f610f --- /dev/null +++ b/content/pages/examples/django/django-views-static-serve.markdown @@ -0,0 +1,56 @@ +title: django.views.static serve Example Code +category: page +slug: django-views-static-serve-examples +sortorder: 500011542 +toc: False +sidebartitle: django.views.static serve +meta: Python example code for the serve callable from the django.views.static module of the Django project. + + +serve is a callable within the django.views.static module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / views.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./views.py) + +```python +# views.py +from django.conf import settings as django_settings +from django.core.exceptions import ImproperlyConfigured +~~from django.views.static import serve + +from .collector import default_collector +from .conf import settings + + +def serve_static(request, path, insecure=False, **kwargs): + if not django_settings.DEBUG and not insecure: + raise ImproperlyConfigured("The staticfiles view can only be used in " + "debug mode or if the --insecure " + "option of 'runserver' is used") + + if not settings.PIPELINE_ENABLED and settings.PIPELINE_COLLECTOR_ENABLED: + default_collector.collect(request, files=[path]) + +~~ return serve(request, path, document_root=django_settings.STATIC_ROOT, + **kwargs) + + + +## ... source file continues with no further serve examples... + +``` + diff --git a/content/pages/examples/django/django-views-static-was-modified-since.markdown b/content/pages/examples/django/django-views-static-was-modified-since.markdown new file mode 100644 index 000000000..53b0c42e0 --- /dev/null +++ b/content/pages/examples/django/django-views-static-was-modified-since.markdown @@ -0,0 +1,106 @@ +title: django.views.static was_modified_since Example Code +category: page +slug: django-views-static-was-modified-since-examples +sortorder: 500011543 +toc: False +sidebartitle: django.views.static was_modified_since +meta: Python example code for the was_modified_since callable from the django.views.static module of the Django project. + + +was_modified_since is a callable within the django.views.static module of the Django project. + + +## Example 1 from django-downloadview +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + +[**django-downloadview / django_downloadview / views / base.py**](https://github.com/benoitbryon/django-downloadview/blob/master/django_downloadview/views/base.py) + +```python +# base.py +import calendar + +from django.http import Http404, HttpResponseNotModified +from django.views.generic.base import View +~~from django.views.static import was_modified_since + +from django_downloadview import exceptions +from django_downloadview.response import DownloadResponse + + +class DownloadMixin(object): + + response_class = DownloadResponse + + attachment = True + + basename = None + + mimetype = None + + encoding = None + + def get_file(self): + raise NotImplementedError() + + def get_basename(self): + return self.basename + + def get_mimetype(self): + return self.mimetype + + def get_encoding(self): + return self.encoding + +~~ def was_modified_since(self, file_instance, since): + try: + return file_instance.was_modified_since(since) + except (AttributeError, NotImplementedError): + try: + modification_time = calendar.timegm( + file_instance.modified_time.utctimetuple() + ) + size = file_instance.size + except (AttributeError, NotImplementedError) as e: + print("!=======!", e) + return True + else: +~~ return was_modified_since(since, modification_time, size) + + def not_modified_response(self, *response_args, **response_kwargs): + return HttpResponseNotModified(*response_args, **response_kwargs) + + def download_response(self, *response_args, **response_kwargs): + response_kwargs.setdefault("file_instance", self.file_instance) + response_kwargs.setdefault("attachment", self.attachment) + response_kwargs.setdefault("basename", self.get_basename()) + response_kwargs.setdefault("file_mimetype", self.get_mimetype()) + response_kwargs.setdefault("file_encoding", self.get_encoding()) + response = self.response_class(*response_args, **response_kwargs) + return response + + def file_not_found_response(self): + raise Http404() + + def render_to_response(self, *response_args, **response_kwargs): + try: + self.file_instance = self.get_file() + except exceptions.FileNotFound: + return self.file_not_found_response() + since = self.request.META.get("HTTP_IF_MODIFIED_SINCE", None) + if since is not None: + if not self.was_modified_since(self.file_instance, since): + + +## ... source file continues with no further was_modified_since examples... + +``` + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index e07575ecf..4c81a8462 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,8 +15,10 @@ on GitHub. ## 2020 ### July +* New blog post on how to + [Quickly Use Bootstrap 4 in a Django Template with a CDN](http://localhost:8002/blog/bootstrap-4-django-template.html). * New blog post on - [How to report errors in Flask web apps with Sentry](/blog/report-errors-flask-web-apps-sentry.html) + [How to report errors in Flask web apps with Sentry](/blog/report-errors-flask-web-apps-sentry.html). ### June * Added new example code for [Django](/django.html) modules: diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 6351a51ff..b5e324946 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -117,5 +117,62 @@

django.utils.translation ungettext, ungettext_lazy

+

django.utils.version + get_complete_version +

+

django.views + csrf +

+

django.views.debug + get_default_exception_reporter_filter +

+

django.views.decorators.csrf + csrf_exempt +

+

django.views.decorators.debug + sensitive_post_parameters +

+

django.views.decorators.http + require_GET, + require_POST +

+

django.views.generic + CreateView, + DeleteView, + DetailView, + FormView, + ListView, + RedirectView, + TemplateView, + UpdateView, + View +

+

django.views.generic.base + RedirectView, + TemplateResponseMixin, + TemplateView, + View +

+

django.views.generic.detail + SingleObjectMixin +

+

django.views.generic.edit + CreateView, + DeleteView, + DeletionMixin, + FormMixin, + FormView +

+

django.views.generic.list + ListView, + MultipleObjectMixin +

+

django.views.i18n + JavaScriptCatalog +

+

django.views.static + serve, + was_modified_since +

From ef4ee5a9af401809ec54e1edf817affe37bec66b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 6 Jul 2020 17:17:50 -0400 Subject: [PATCH 169/302] update descriptions on pages --- .../flask/flask-app-badrequest.markdown | 6 ++--- .../examples/flask/flask-app-flask.markdown | 2 +- .../examples/flask/flask-app-headers.markdown | 2 +- .../flask/flask-blueprints-blueprint.markdown | 2 +- .../flask/flask-cli-flaskgroup.markdown | 2 +- .../flask/flask-cli-scriptinfo.markdown | 2 +- .../flask/flask-cli-with-appcontext.markdown | 2 +- .../flask-ctx-after-this-request.markdown | 9 +++++-- .../flask/flask-ctx-has-app-context.markdown | 9 +++++-- .../flask-ctx-has-request-context.markdown | 12 +++++++-- .../flask/flask-extensions-plug-ins.markdown | 16 ++++++++++++ .../flask/flask-globals-current-app.markdown | 26 ++++++++++++------- .../examples/flask/flask-globals-g.markdown | 2 +- .../flask/flask-globals-request.markdown | 2 +- .../flask/flask-globals-session.markdown | 2 +- .../flask/flask-helpers-flash.markdown | 2 +- .../flask-helpers-make-response.markdown | 2 +- .../flask/flask-helpers-send-file.markdown | 2 +- .../flask/flask-helpers-url-for.markdown | 2 +- .../flask/flask-json-jsonencoder.markdown | 2 +- .../flask/flask-json-jsonify.markdown | 2 +- .../flask-sessions-badsignature.markdown | 2 +- .../flask-sessions-sessioninterface.markdown | 2 +- .../flask-sessions-sessionmixin.markdown | 4 +-- ...ask-signals-got-request-exception.markdown | 2 +- .../flask/flask-signals-namespace.markdown | 2 +- ...templating-render-template-string.markdown | 2 +- .../flask-templating-render-template.markdown | 2 +- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 2 +- .../examples/flask/flask-views-view.markdown | 2 +- 31 files changed, 85 insertions(+), 45 deletions(-) diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 681fdde5c..80a3a4dcf 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -4,7 +4,7 @@ slug: flask-app-badrequest-examples sortorder: 500021000 toc: False sidebartitle: flask.app BadRequest -meta: Python example code for the BadRequest class from the flask.app module of the Flask project. +meta: Example code for understanding how to use the BadRequest class from the flask.app module of the Flask project. [BadRequest](https://github.com/pallets/flask/blob/master/src/flask/app.py) @@ -38,7 +38,7 @@ import json import logging import re import traceback -from typing import Dict, Optional +from typing import Callable, Dict, List, Optional, Set import urllib.parse from apispec import APISpec, yaml_utils @@ -46,7 +46,7 @@ from apispec.exceptions import DuplicateComponentNameError from flask import Blueprint, current_app, jsonify, make_response, request, Response from flask_babel import lazy_gettext as _ import jsonschema -from marshmallow import ValidationError +from marshmallow import Schema, ValidationError from marshmallow_sqlalchemy.fields import Related, RelatedList import prison from sqlalchemy.exc import IntegrityError diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index f59773d3a..b1cacf751 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -4,7 +4,7 @@ slug: flask-app-flask-examples sortorder: 500021001 toc: False sidebartitle: flask.app Flask -meta: Python example code for the Flask class from the flask.app module of the Flask project. +meta: Example code for understanding how to use the Flask class from the flask.app module of the Flask project. [Flask](https://github.com/pallets/flask/blob/master/src/flask/app.py) is diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index dd364c3aa..ff99441e6 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -4,7 +4,7 @@ slug: flask-app-headers-examples sortorder: 500021002 toc: False sidebartitle: flask.app Headers -meta: Python example code for the Headers class from the flask.app module of the Flask project. +meta: Example code for understanding how to use the Headers class from the flask.app module of the Flask project. [Headers](https://github.com/pallets/flask/blob/master/src/flask/app.py) diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index b2d30ec11..4dcbf27f5 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -4,7 +4,7 @@ slug: flask-blueprints-blueprint-examples sortorder: 500021003 toc: False sidebartitle: flask.blueprints Blueprint -meta: Python example code for the Blueprint class from the flask.blueprints module of the Flask project. +meta: Example code for understanding how to use the Blueprint class from the flask.blueprints module of the Flask project. A Blueprint in [Flask](/flask.html) is diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index ae925e46f..2cfaf29e8 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -4,7 +4,7 @@ slug: flask-cli-flaskgroup-examples sortorder: 500021004 toc: False sidebartitle: flask.cli FlaskGroup -meta: Python example code for the FlaskGroup class from the flask.cli module of the Flask project. +meta: Example code for understanding how to use the FlaskGroup class from the flask.cli module of the Flask project. [FlaskGroup](https://github.com/pallets/flask/blob/master/src/flask/cli.py) diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index bde9c6ee8..e8ccddec4 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -4,7 +4,7 @@ slug: flask-cli-scriptinfo-examples sortorder: 500021005 toc: False sidebartitle: flask.cli ScriptInfo -meta: Python example code for the ScriptInfo class from the flask.cli module of the Flask project. +meta: Example code for understanding how to use the ScriptInfo class from the flask.cli module of the Flask project. [ScriptInfo](https://github.com/pallets/flask/blob/master/src/flask/cli.py) diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index a09c6ba00..42e665f23 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -4,7 +4,7 @@ slug: flask-cli-with-appcontext-examples sortorder: 500021006 toc: False sidebartitle: flask.cli with_appcontext -meta: Python example code for the with_appcontext callable from the flask.cli module of the Flask project. +meta: Python example code that shows how to use the with_appcontext callable from the flask.cli module of the Flask project. [with_appcontext](https://github.com/pallets/flask/blob/master/src/flask/cli.py) diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index f07da8bdd..ef84cc294 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -4,10 +4,15 @@ slug: flask-ctx-after-this-request-examples sortorder: 500021007 toc: False sidebartitle: flask.ctx after_this_request -meta: Python example code for the after_this_request callable from the flask.ctx module of the Flask project. +meta: Python example code that shows how to use the after_this_request callable from the flask.ctx module of the Flask project. -after_this_request is a callable within the flask.ctx module of the Flask project. +[after_this_request](https://github.com/pallets/flask/blob/master/src/flask/ctx.py) +is a function in the flask.ctx module of the [Flask](/flask.html) +[web framework](/web-frameworks.html). The function's name is strongly +descriptive of what it does and it particularly useful for modifying +response objects, especially when you want a function other than the +view function to modify a response. ## Example 1 from Flask-Security-Too diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index 3740203ba..1094de284 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -4,10 +4,15 @@ slug: flask-ctx-has-app-context-examples sortorder: 500021008 toc: False sidebartitle: flask.ctx has_app_context -meta: Python example code for the has_app_context callable from the flask.ctx module of the Flask project. +meta: Python example code that shows how to use the has_app_context callable from the flask.ctx module of the Flask project. -has_app_context is a callable within the flask.ctx module of the Flask project. +[has_app_context](https://github.com/pallets/flask/blob/master/src/flask/ctx.py) +is a function in the flask.ctx module that is similar to +[has_request_context](/flask-ctx-has-request-context-examples.html) +but for the +[application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/) +rather than the request. ## Example 1 from flask-restx diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index 245536763..cce3b86ed 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -4,10 +4,18 @@ slug: flask-ctx-has-request-context-examples sortorder: 500021009 toc: False sidebartitle: flask.ctx has_request_context -meta: Python example code for the has_request_context callable from the flask.ctx module of the Flask project. +meta: Python example code that shows how to use the has_request_context callable from the flask.ctx module of the Flask project. -has_request_context is a callable within the flask.ctx module of the Flask project. +[has_request_context](https://github.com/pallets/flask/blob/master/src/flask/ctx.py) +is a function within the flask.ctx module that is useful for +determining if a +[request context](https://flask.palletsprojects.com/en/1.1.x/reqcontext/) +is available or not. There is a similar +[has_app_context](/flask-ctx-has-app-context-examples.html) +function as well that works for the +[application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/). + ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown index 24cf1bb35..67c8b60c2 100644 --- a/content/pages/examples/flask/flask-extensions-plug-ins.markdown +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -114,6 +114,22 @@ open sourced under the [MIT license](https://github.com/maxcountryman/flask-login/blob/master/LICENSE). +### flask-praetorian +[flask-praetorian](https://github.com/dusktreader/flask-praetorian) +([project documentation](https://flask-praetorian.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/flask-praetorian/)) +extends the [Flask](/flask.html) framework security model with JWT tokens, +which is particularly useful when using a front end +[JavaScript](/javascript.html) framework such as [React](/react.html) +or [Angular](/angular.html). [PyJWT](https://pyjwt.readthedocs.io/en/latest/) +is used under the hood to ensure a solid JWT implementation. +This extension makes it much easier to add functionality that checks +user roles on URLs before allowing access to a resource. flask-praetorian +is open sourced under the +[MIT license](https://github.com/dusktreader/flask-praetorian/blob/master/LICENSE.rst). + + ### Flask RESTX [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 510a45aa0..84f506902 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -4,10 +4,16 @@ slug: flask-globals-current-app-examples sortorder: 500021010 toc: False sidebartitle: flask.globals current_app -meta: Python example code for the current_app callable from the flask.globals module of the Flask project. +meta: Python example code that shows how to use the current_app callable from the flask.globals module of the Flask project. -current_app is a callable within the flask.globals module of the Flask project. +[current_app](https://github.com/pallets/flask/blob/master/src/flask/globals.py) +is function in [Flask](/flask.html)'s flask.globals module and is an +instance of +[LocalProxy](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/local.py) +from the Werkzeug framework. `current_app` can be used to access data about the +running application, including the configuration. This is useful for both +developers using the framework and ones building extensions for Flask. ## Example 1 from Flask AppBuilder @@ -114,7 +120,6 @@ class MenuItem(object): ## ... source file abbreviated to get to current_app examples ... - self.add_category( category=category, icon=category_icon, label=category_label ) new_menu_item = MenuItem( @@ -134,6 +139,7 @@ class MenuItem(object): class MenuApi(BaseApi): resource_name = "menu" + openapi_spec_tag = "Menu" @expose("/", methods=["GET"]) @protect(allow_browser_login=True) @@ -1983,13 +1989,8 @@ _default_config = { ~~ current_app.after_request(csrf_cookie_handler) ~~ current_app.config["WTF_CSRF_HEADERS"].append(cv("CSRF_HEADER")) - @app.before_first_request - def _init_phone_util(): - state._phone_util = state.phone_util_cls() - - @app.before_first_request - def _init_mail_util(): - state._mail_util = state.mail_util_cls() + state._phone_util = state.phone_util_cls(app) + state._mail_util = state.mail_util_cls(app) app.extensions["security"] = state @@ -2006,6 +2007,11 @@ _default_config = { ("SECURITY_SMS_SERVICE_CONFIG", "SECURITY_TWO_FACTOR_SMS_SERVICE_CONFIG"), ("SECURITY_TOTP_SECRETS", "SECURITY_TWO_FACTOR_SECRET"), ("SECURITY_TOTP_ISSUER", "SECURITY_TWO_FACTOR_URI_SERVICE_NAME"), + ]: + if not app.config.get(newc, None): + app.config[newc] = app.config.get(oldc, None) + + for uia in cv("USER_IDENTITY_ATTRIBUTES", app=app): # pragma: no cover ## ... source file continues with no further current_app examples... diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 1bbfde3a8..8db7aaacc 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -4,7 +4,7 @@ slug: flask-globals-g-examples sortorder: 500021011 toc: False sidebartitle: flask.globals g -meta: Python example code for the g callable from the flask.globals module of the Flask project. +meta: Python example code that shows how to use the g callable from the flask.globals module of the Flask project. g is a callable within the flask.globals module of the Flask project. diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index d478f83a1..4ad1787c8 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -4,7 +4,7 @@ slug: flask-globals-request-examples sortorder: 500021012 toc: False sidebartitle: flask.globals request -meta: Python example code for the request callable from the flask.globals module of the Flask project. +meta: Python example code that shows how to use the request callable from the flask.globals module of the Flask project. request is a callable within the flask.globals module of the Flask project. diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 5b12f08e7..bcffceffb 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -4,7 +4,7 @@ slug: flask-globals-session-examples sortorder: 500021013 toc: False sidebartitle: flask.globals session -meta: Python example code for the session callable from the flask.globals module of the Flask project. +meta: Python example code that shows how to use the session callable from the flask.globals module of the Flask project. session is a callable within the flask.globals module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index bb5426fae..99cc266f3 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -4,7 +4,7 @@ slug: flask-helpers-flash-examples sortorder: 500021014 toc: False sidebartitle: flask.helpers flash -meta: Python example code for the flash callable from the flask.helpers module of the Flask project. +meta: Python example code that shows how to use the flash callable from the flask.helpers module of the Flask project. flash is a callable within the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 40bc82c42..672a9f135 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -4,7 +4,7 @@ slug: flask-helpers-make-response-examples sortorder: 500021015 toc: False sidebartitle: flask.helpers make_response -meta: Python example code for the make_response callable from the flask.helpers module of the Flask project. +meta: Python example code that shows how to use the make_response callable from the flask.helpers module of the Flask project. make_response is a callable within the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown index 4d13eefbb..51b86d5dd 100644 --- a/content/pages/examples/flask/flask-helpers-send-file.markdown +++ b/content/pages/examples/flask/flask-helpers-send-file.markdown @@ -4,7 +4,7 @@ slug: flask-helpers-send-file-examples sortorder: 500021016 toc: False sidebartitle: flask.helpers send_file -meta: Python example code for the send_file callable from the flask.helpers module of the Flask project. +meta: Python example code that shows how to use the send_file callable from the flask.helpers module of the Flask project. send_file is a callable within the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index c3458fa08..01a15826d 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -4,7 +4,7 @@ slug: flask-helpers-url-for-examples sortorder: 500021017 toc: False sidebartitle: flask.helpers url_for -meta: Python example code for the url_for callable from the flask.helpers module of the Flask project. +meta: Python example code that shows how to use the url_for callable from the flask.helpers module of the Flask project. url_for is a callable within the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index ce0608aa4..dceeec610 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -4,7 +4,7 @@ slug: flask-json-jsonencoder-examples sortorder: 500021018 toc: False sidebartitle: flask.json JSONEncoder -meta: Python example code for the JSONEncoder class from the flask.json module of the Flask project. +meta: Example code for understanding how to use the JSONEncoder class from the flask.json module of the Flask project. JSONEncoder is a class within the flask.json module of the Flask project. diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 79959671c..e1bbb2fa0 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -4,7 +4,7 @@ slug: flask-json-jsonify-examples sortorder: 500021019 toc: False sidebartitle: flask.json jsonify -meta: Python example code for the jsonify callable from the flask.json module of the Flask project. +meta: Python example code that shows how to use the jsonify callable from the flask.json module of the Flask project. jsonify is a callable within the flask.json module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 7a9090d82..a7215d25a 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -4,7 +4,7 @@ slug: flask-sessions-badsignature-examples sortorder: 500021020 toc: False sidebartitle: flask.sessions BadSignature -meta: Python example code for the BadSignature class from the flask.sessions module of the Flask project. +meta: Example code for understanding how to use the BadSignature class from the flask.sessions module of the Flask project. BadSignature is a class within the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 6967174a7..e73b27e37 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -4,7 +4,7 @@ slug: flask-sessions-sessioninterface-examples sortorder: 500021021 toc: False sidebartitle: flask.sessions SessionInterface -meta: Python example code for the SessionInterface class from the flask.sessions module of the Flask project. +meta: Example code for understanding how to use the SessionInterface class from the flask.sessions module of the Flask project. SessionInterface is a class within the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown index 4bbbcc955..7a4a4f03b 100644 --- a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown +++ b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown @@ -4,7 +4,7 @@ slug: flask-sessions-sessionmixin-examples sortorder: 500021022 toc: False sidebartitle: flask.sessions SessionMixin -meta: Python example code for the SessionMixin class from the flask.sessions module of the Flask project. +meta: Example code for understanding how to use the SessionMixin class from the flask.sessions module of the Flask project. SessionMixin is a class within the flask.sessions module of the Flask project. @@ -54,7 +54,7 @@ from werkzeug.serving import run_with_reloader from .namespace import Namespace from .test_client import SocketIOTestClient -__version__ = '4.3.1dev' +__version__ = '4.3.2dev' class _SocketIOMiddleware(socketio.WSGIApp): diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index 27020f08d..b2b2e5261 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -4,7 +4,7 @@ slug: flask-signals-got-request-exception-examples sortorder: 500021024 toc: False sidebartitle: flask.signals got_request_exception -meta: Python example code for the got_request_exception callable from the flask.signals module of the Flask project. +meta: Python example code that shows how to use the got_request_exception callable from the flask.signals module of the Flask project. got_request_exception is a callable within the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index a7c9eccb8..b91e84fae 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -4,7 +4,7 @@ slug: flask-signals-namespace-examples sortorder: 500021023 toc: False sidebartitle: flask.signals Namespace -meta: Python example code for the Namespace class from the flask.signals module of the Flask project. +meta: Example code for understanding how to use the Namespace class from the flask.signals module of the Flask project. Namespace is a class within the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 5378c9263..6d460589a 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -4,7 +4,7 @@ slug: flask-templating-render-template-string-examples sortorder: 500021026 toc: False sidebartitle: flask.templating render_template_string -meta: Python example code for the render_template_string callable from the flask.templating module of the Flask project. +meta: Python example code that shows how to use the render_template_string callable from the flask.templating module of the Flask project. render_template_string is a callable within the flask.templating module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 05c50cb48..81b301c6d 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -4,7 +4,7 @@ slug: flask-templating-render-template-examples sortorder: 500021025 toc: False sidebartitle: flask.templating render_template -meta: Python example code for the render_template callable from the flask.templating module of the Flask project. +meta: Python example code that shows how to use the render_template callable from the flask.templating module of the Flask project. render_template is a callable within the flask.templating module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index e7c784b05..bc054bdcf 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -4,7 +4,7 @@ slug: flask-views-http-method-funcs-examples sortorder: 500021029 toc: False sidebartitle: flask.views http_method_funcs -meta: Python example code for the http_method_funcs callable from the flask.views module of the Flask project. +meta: Python example code that shows how to use the http_method_funcs callable from the flask.views module of the Flask project. `http_method_funcs` is an immutable Python set within the diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 6c807bbce..f3eca5a20 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -4,7 +4,7 @@ slug: flask-views-methodview-examples sortorder: 500021027 toc: False sidebartitle: flask.views MethodView -meta: Python example code for the MethodView class from the flask.views module of the Flask project. +meta: Example code for understanding how to use the MethodView class from the flask.views module of the Flask project. MethodView is a class within the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 3aeb0c801..17713f00c 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -4,7 +4,7 @@ slug: flask-views-view-examples sortorder: 500021028 toc: False sidebartitle: flask.views View -meta: Python example code for the View class from the flask.views module of the Flask project. +meta: Example code for understanding how to use the View class from the flask.views module of the Flask project. View is a class within the flask.views module of the Flask project. From e0ce2acb0198d3641444336d3546e32fe7534ca0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 6 Jul 2020 20:00:45 -0400 Subject: [PATCH 170/302] add new flask example code --- .../flask/flask-app-badrequest.markdown | 58 ++++++ .../flask/flask-app-immutabledict.markdown | 126 ++++++++++++ .../flask/flask-blueprints-blueprint.markdown | 2 +- .../flask/flask-cli-appgroup.markdown | 112 +++++++++++ .../flask/flask-cli-dispatchingapp.markdown | 116 ++++++++++++ .../flask/flask-cli-flaskgroup.markdown | 66 ++++++- .../flask/flask-cli-pass-script-info.markdown | 105 ++++++++++ .../flask/flask-cli-scriptinfo.markdown | 87 ++++++++- .../flask/flask-cli-with-appcontext.markdown | 2 +- .../flask-ctx-after-this-request.markdown | 2 +- .../flask/flask-ctx-has-app-context.markdown | 80 +++++++- .../flask-ctx-has-request-context.markdown | 145 +++++++++++++- .../flask-example-projects-code.markdown | 28 ++- .../flask/flask-globals-current-app.markdown | 67 ++++++- .../examples/flask/flask-globals-g.markdown | 113 ++++++++++- .../flask/flask-globals-request.markdown | 103 +++++++++- .../flask/flask-globals-session.markdown | 124 +++++++++++- .../flask/flask-helpers-flash.markdown | 90 ++++++++- .../flask-helpers-get-root-path.markdown | 179 ++++++++++++++++++ .../flask-helpers-make-response.markdown | 2 +- .../flask/flask-helpers-send-file.markdown | 2 +- .../flask/flask-helpers-url-for.markdown | 2 +- .../flask/flask-json-jsonencoder.markdown | 2 +- .../flask/flask-json-jsonify.markdown | 111 ++++++++++- .../flask-sessions-badsignature.markdown | 2 +- .../flask-sessions-sessioninterface.markdown | 2 +- .../flask-sessions-sessionmixin.markdown | 2 +- ...ask-signals-got-request-exception.markdown | 2 +- .../flask/flask-signals-namespace.markdown | 2 +- ...templating-render-template-string.markdown | 2 +- .../flask-templating-render-template.markdown | 42 +++- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 2 +- .../examples/flask/flask-views-view.markdown | 2 +- theme/templates/code-examples/flask.html | 7 +- 35 files changed, 1734 insertions(+), 57 deletions(-) create mode 100644 content/pages/examples/flask/flask-app-immutabledict.markdown create mode 100644 content/pages/examples/flask/flask-cli-appgroup.markdown create mode 100644 content/pages/examples/flask/flask-cli-dispatchingapp.markdown create mode 100644 content/pages/examples/flask/flask-cli-pass-script-info.markdown create mode 100644 content/pages/examples/flask/flask-helpers-get-root-path.markdown diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 80a3a4dcf..ab24d4b57 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -236,3 +236,61 @@ def same_origin(current_uri, compare_uri): ``` + +## Example 3 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / core / errors.py**](https://github.com/indico/indico/blob/master/indico/core/errors.py) + +```python +# errors.py + + +~~from werkzeug.exceptions import BadRequest, Forbidden, HTTPException, NotFound + +from indico.util.i18n import _ +from indico.util.string import to_unicode + + +def get_error_description(exception): + try: + description = exception.description + except AttributeError: + return to_unicode(exception.message) + if isinstance(exception, Forbidden) and description == Forbidden.description: + return _(u"You are not allowed to access this page.") + elif isinstance(exception, NotFound) and description == NotFound.description: + return _(u"The page you are looking for doesn't exist.") +~~ elif isinstance(exception, BadRequest) and description == BadRequest.description: + return _(u"The request was invalid or contained invalid arguments.") + else: + return to_unicode(description) + + +class IndicoError(Exception): + + +class NoReportError(IndicoError): + + @classmethod + def wrap_exc(cls, exc): + assert isinstance(exc, HTTPException) + exc._disallow_report = True + return exc + + +class UserValueError(NoReportError): + http_status_code = 400 + + + +## ... source file continues with no further BadRequest examples... + +``` + diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown new file mode 100644 index 000000000..537acc636 --- /dev/null +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -0,0 +1,126 @@ +title: flask.app ImmutableDict Example Code +category: page +slug: flask-app-immutabledict-examples +sortorder: 500021003 +toc: False +sidebartitle: flask.app ImmutableDict +meta: Example code for understanding how to use the ImmutableDict class from the flask.app module of the Flask project. + + +ImmutableDict is a class within the flask.app module of the Flask project. + + +## Example 1 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / core / config.py**](https://github.com/indico/indico/blob/master/indico/core/config.py) + +```python +# config.py + +from __future__ import absolute_import, unicode_literals + +import ast +import codecs +import os +import re +import socket +import warnings +from datetime import timedelta + +import pytz +from celery.schedules import crontab +from flask import current_app, g +from flask.helpers import get_root_path +~~from werkzeug.datastructures import ImmutableDict +from werkzeug.urls import url_parse + +from indico.util.caching import make_hashable +from indico.util.fs import resolve_link +from indico.util.packaging import package_is_editable +from indico.util.string import crc32, snakify + + +DEFAULTS = { + 'ATTACHMENT_STORAGE': 'default', + 'AUTH_PROVIDERS': {}, + 'BASE_URL': None, + 'CACHE_BACKEND': 'files', + 'CACHE_DIR': '/opt/indico/cache', + 'CATEGORY_CLEANUP': {}, + 'CELERY_BROKER': None, + 'CELERY_CONFIG': {}, + 'CELERY_RESULT_BACKEND': None, + 'COMMUNITY_HUB_URL': 'https://hub.getindico.io', + 'CUSTOMIZATION_DEBUG': False, + 'CUSTOMIZATION_DIR': None, + 'CUSTOM_COUNTRIES': {}, + 'DB_LOG': False, + 'DEBUG': False, + + +## ... source file abbreviated to get to ImmutableDict examples ... + + + allowed |= set(INTERNAL_DEFAULTS) + for key in set(data) - allowed: + warnings.warn('Ignoring unknown config key {}'.format(key)) + return {k: v for k, v in data.iteritems() if k in allowed} + + +def load_config(only_defaults=False, override=None): + data = dict(DEFAULTS, **INTERNAL_DEFAULTS) + if not only_defaults: + path = get_config_path() + config = _sanitize_data(_parse_config(path)) + data.update(config) + env_override = os.environ.get('INDICO_CONF_OVERRIDE') + if env_override: + data.update(_sanitize_data(ast.literal_eval(env_override))) + resolved_path = resolve_link(path) if os.path.islink(path) else path + resolved_path = None if resolved_path == os.devnull else resolved_path + data['CONFIG_PATH'] = path + data['CONFIG_PATH_RESOLVED'] = resolved_path + if resolved_path is not None: + data['LOGGING_CONFIG_PATH'] = os.path.join(os.path.dirname(resolved_path), data['LOGGING_CONFIG_FILE']) + + if override: + data.update(_sanitize_data(override, allow_internal=True)) + _postprocess_config(data) +~~ return ImmutableDict(data) + + +class IndicoConfig(object): + + __slots__ = ('_config', '_exc') + + def __init__(self, config=None, exc=AttributeError): + object.__setattr__(self, '_config', config) + object.__setattr__(self, '_exc', exc) + + @property + def data(self): + try: + return self._config or current_app.config['INDICO'] + except KeyError: + raise RuntimeError('config not loaded') + + @property + def hash(self): + return crc32(repr(make_hashable(sorted(self.data.items())))) + + @property + def CONFERENCE_CSS_TEMPLATES_BASE_URL(self): + return self.BASE_URL + '/css/confTemplates' + + +## ... source file continues with no further ImmutableDict examples... + +``` + diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 4dcbf27f5..1ceec615e 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -1,7 +1,7 @@ title: flask.blueprints Blueprint Example Code category: page slug: flask-blueprints-blueprint-examples -sortorder: 500021003 +sortorder: 500021004 toc: False sidebartitle: flask.blueprints Blueprint meta: Example code for understanding how to use the Blueprint class from the flask.blueprints module of the Flask project. diff --git a/content/pages/examples/flask/flask-cli-appgroup.markdown b/content/pages/examples/flask/flask-cli-appgroup.markdown new file mode 100644 index 000000000..958d3df00 --- /dev/null +++ b/content/pages/examples/flask/flask-cli-appgroup.markdown @@ -0,0 +1,112 @@ +title: flask.cli AppGroup Example Code +category: page +slug: flask-cli-appgroup-examples +sortorder: 500021005 +toc: False +sidebartitle: flask.cli AppGroup +meta: Example code for understanding how to use the AppGroup class from the flask.cli module of the Flask project. + + +AppGroup is a class within the flask.cli module of the Flask project. + + +## Example 1 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / cli / util.py**](https://github.com/indico/indico/blob/master/indico/cli/util.py) + +```python +# util.py + +from __future__ import unicode_literals + +import traceback +from importlib import import_module + +import click +~~from flask.cli import AppGroup, FlaskGroup, ScriptInfo +from flask_pluginengine import wrap_in_plugin_context +from werkzeug.utils import cached_property + + + + +def _create_app(info): + from indico.web.flask.app import make_app + return make_app(set_path=True) + + +class IndicoFlaskGroup(FlaskGroup): + + def __init__(self, **extra): + super(IndicoFlaskGroup, self).__init__(create_app=_create_app, add_default_commands=False, + add_version_option=False, set_debug_flag=False, **extra) + self._indico_plugin_commands = None + + def _load_plugin_commands(self): + assert False + + def _wrap_in_plugin_context(self, plugin, cmd): + cmd.callback = wrap_in_plugin_context(plugin, cmd.callback) + for subcmd in getattr(cmd, 'commands', {}).viewvalues(): + self._wrap_in_plugin_context(plugin, subcmd) + + def _get_indico_plugin_commands(self, ctx): + if self._indico_plugin_commands is not None: + return self._indico_plugin_commands + try: + from indico.core import signals + from indico.util.signals import named_objects_from_signal + ctx.ensure_object(ScriptInfo).load_app() + cmds = named_objects_from_signal(signals.plugin.cli.send(), plugin_attr='_indico_plugin') + rv = {} + for name, cmd in cmds.viewitems(): + if cmd._indico_plugin: + self._wrap_in_plugin_context(cmd._indico_plugin, cmd) + rv[name] = cmd + except Exception as exc: + if 'No indico config found' not in unicode(exc): + click.echo(click.style('Loading plugin commands failed:', fg='red', bold=True)) + click.echo(click.style(traceback.format_exc(), fg='red')) + rv = {} + self._indico_plugin_commands = rv + return rv + + def get_command(self, ctx, name): +~~ rv = AppGroup.get_command(self, ctx, name) + if rv is not None: + return rv + return self._get_indico_plugin_commands(ctx).get(name) + + def list_commands(self, ctx): + rv = set(click.Group.list_commands(self, ctx)) + rv.update(self._get_indico_plugin_commands(ctx)) + return sorted(rv) + + +class LazyGroup(click.Group): + + def __init__(self, import_name, **kwargs): + self._import_name = import_name + super(LazyGroup, self).__init__(**kwargs) + + @cached_property + def _impl(self): + module, name = self._import_name.split(':', 1) + return getattr(import_module(module), name) + + def get_command(self, ctx, cmd_name): + return self._impl.get_command(ctx, cmd_name) + + + +## ... source file continues with no further AppGroup examples... + +``` + diff --git a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown new file mode 100644 index 000000000..b1d3fe037 --- /dev/null +++ b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown @@ -0,0 +1,116 @@ +title: flask.cli DispatchingApp Example Code +category: page +slug: flask-cli-dispatchingapp-examples +sortorder: 500021006 +toc: False +sidebartitle: flask.cli DispatchingApp +meta: Example code for understanding how to use the DispatchingApp class from the flask.cli module of the Flask project. + + +DispatchingApp is a class within the flask.cli module of the Flask project. + + +## Example 1 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / cli / devserver.py**](https://github.com/indico/indico/blob/master/indico/cli/devserver.py) + +```python +# devserver.py + +from __future__ import print_function, unicode_literals + +import os + +~~from flask.cli import DispatchingApp +from werkzeug.debug import DebuggedApplication +from werkzeug.exceptions import NotFound +from werkzeug.middleware.dispatcher import DispatcherMiddleware +from werkzeug.middleware.proxy_fix import ProxyFix +from werkzeug.serving import WSGIRequestHandler, run_simple +from werkzeug.urls import url_parse + + +try: + import pywatchman +except ImportError: + pywatchman = None + + +def run_cmd(info, **kwargs): + if kwargs['reloader_type'] == 'watchman': + if pywatchman is None: + print('watchman is not available - you need to `pip install pywatchman`') + return + run_watchman() + return + run_server(info, **kwargs) + + + + +## ... source file abbreviated to get to DispatchingApp examples ... + + + + import logging + werkzeug_logger = logging.getLogger('werkzeug') + werkzeug_logger.propagate = False + werkzeug_logger.setLevel(logging.INFO) + werkzeug_logger.addHandler(logging.StreamHandler()) + + app = _make_wsgi_app(info, url, evalex_whitelist, proxy) + run_simple(host, port, app, + reloader_type=reloader_type, use_reloader=(reloader_type != 'none'), + use_debugger=False, use_evalex=False, threaded=True, ssl_context=ssl_ctx, + extra_files=extra_files, request_handler=QuietWSGIRequestHandler if quiet else None) + + +def _reset_state(): + from indico.core.celery import celery + celery.flask_app = None + + +def _make_wsgi_app(info, url, evalex_whitelist, proxy): + def _load_app(): + _reset_state() + return info.load_app() + + url_data = url_parse(url) +~~ app = DispatchingApp(_load_app) + app = DebuggedIndico(app, evalex_whitelist) + app = _make_indico_dispatcher(app, url_data.path) + if proxy: + app = ProxyFix(app, x_for=1, x_proto=1, x_host=1) + QuietWSGIRequestHandler.INDICO_URL_PREFIX = url_data.path.rstrip('/') + return app + + +def _make_indico_dispatcher(wsgi_app, path): + path = path.rstrip('/') + if not path: + return wsgi_app + else: + return DispatcherMiddleware(NotFound(), { + path: wsgi_app + }) + + +class DebuggedIndico(DebuggedApplication): + def __init__(self, *args, **kwargs): + self._evalex_whitelist = None + self._request_ip = None + super(DebuggedIndico, self).__init__(*args, **kwargs) + + + +## ... source file continues with no further DispatchingApp examples... + +``` + diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 2cfaf29e8..11fc31184 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -1,7 +1,7 @@ title: flask.cli FlaskGroup Example Code category: page slug: flask-cli-flaskgroup-examples -sortorder: 500021004 +sortorder: 500021007 toc: False sidebartitle: flask.cli FlaskGroup meta: Example code for understanding how to use the FlaskGroup class from the flask.cli module of the Flask project. @@ -94,3 +94,67 @@ click_log.basic_config(logger) ``` + +## Example 2 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / cli / util.py**](https://github.com/indico/indico/blob/master/indico/cli/util.py) + +```python +# util.py + +from __future__ import unicode_literals + +import traceback +from importlib import import_module + +import click +~~from flask.cli import AppGroup, FlaskGroup, ScriptInfo +from flask_pluginengine import wrap_in_plugin_context +from werkzeug.utils import cached_property + + + + +def _create_app(info): + from indico.web.flask.app import make_app + return make_app(set_path=True) + + +~~class IndicoFlaskGroup(FlaskGroup): + + def __init__(self, **extra): + super(IndicoFlaskGroup, self).__init__(create_app=_create_app, add_default_commands=False, + add_version_option=False, set_debug_flag=False, **extra) + self._indico_plugin_commands = None + + def _load_plugin_commands(self): + assert False + + def _wrap_in_plugin_context(self, plugin, cmd): + cmd.callback = wrap_in_plugin_context(plugin, cmd.callback) + for subcmd in getattr(cmd, 'commands', {}).viewvalues(): + self._wrap_in_plugin_context(plugin, subcmd) + + def _get_indico_plugin_commands(self, ctx): + if self._indico_plugin_commands is not None: + return self._indico_plugin_commands + try: + from indico.core import signals + from indico.util.signals import named_objects_from_signal + ctx.ensure_object(ScriptInfo).load_app() + cmds = named_objects_from_signal(signals.plugin.cli.send(), plugin_attr='_indico_plugin') + rv = {} + for name, cmd in cmds.viewitems(): + + +## ... source file continues with no further FlaskGroup examples... + +``` + diff --git a/content/pages/examples/flask/flask-cli-pass-script-info.markdown b/content/pages/examples/flask/flask-cli-pass-script-info.markdown new file mode 100644 index 000000000..73f722796 --- /dev/null +++ b/content/pages/examples/flask/flask-cli-pass-script-info.markdown @@ -0,0 +1,105 @@ +title: flask.cli pass_script_info Example Code +category: page +slug: flask-cli-pass-script-info-examples +sortorder: 500021009 +toc: False +sidebartitle: flask.cli pass_script_info +meta: Python example code that shows how to use the pass_script_info callable from the flask.cli module of the Flask project. + + +pass_script_info is a callable within the flask.cli module of the Flask project. + + +## Example 1 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / cli / core.py**](https://github.com/indico/indico/blob/master/indico/cli/core.py) + +```python +# core.py + +from __future__ import unicode_literals + +import click +~~from flask.cli import AppGroup, pass_script_info + +from indico.cli.util import IndicoFlaskGroup, LazyGroup + + +click.disable_unicode_literals_warning = True +__all__ = ('cli_command', 'cli_group') + + +_cli = AppGroup() +cli_command = _cli.command +cli_group = _cli.group +del _cli + + +def _get_indico_version(ctx, param, value): + if not value or ctx.resilient_parsing: + return + import indico + message = 'Indico v{}'.format(indico.__version__) + click.echo(message, ctx.color) + ctx.exit() + + +@click.group(cls=IndicoFlaskGroup) + + +## ... source file abbreviated to get to pass_script_info examples ... + + +@click.option('--min-age', type=click.IntRange(1), default=1, metavar='N', + help='Delete files at least N days old (default: 1)') +def cleanup(temp, cache, verbose, dry_run, min_age): + from .cleanup import cleanup_cmd + if not temp and not cache: + raise click.UsageError('You need to specify what to delete') + cleanup_cmd(temp, cache, min_age=min_age, dry_run=dry_run, verbose=(verbose or dry_run)) + + +@cli.command(with_appcontext=False) +@click.option('--host', '-h', default='127.0.0.1', metavar='HOST', help='The ip/host to bind to.') +@click.option('--port', '-p', default=None, type=int, metavar='PORT', help='The port to bind to.') +@click.option('--url', '-u', default=None, metavar='URL', + help='The URL used to access indico. Defaults to `http(s)://host:port`') +@click.option('--ssl', '-s', is_flag=True, help='Use SSL.') +@click.option('--ssl-key', '-K', type=click.Path(exists=True, dir_okay=False), help='The SSL private key to use.') +@click.option('--ssl-cert', '-C', type=click.Path(exists=True, dir_okay=False), help='The SSL cert key to use.') +@click.option('--quiet', '-q', is_flag=True, help='Disable logging of requests for most static files.') +@click.option('--enable-evalex', is_flag=True, + help="Enable the werkzeug debugger's python shell in tracebacks and via /console") +@click.option('--evalex-from', multiple=True, + help='Restrict the debugger shell to the given ips (can be used multiple times)') +@click.option('--proxy', is_flag=True, help='Use the ip and protocol provided by the proxy.') +@click.option('--reloader', 'reloader_type', type=click.Choice(['auto', 'none', 'stat', 'watchdog', 'watchman']), + default='auto', help='The type of auto-reloader to use.') +~~@pass_script_info +def run(info, **kwargs): + from indico.cli.devserver import run_cmd + if bool(kwargs['ssl_key']) != bool(kwargs['ssl_cert']): + raise click.BadParameter('ssl-key and ssl-cert must be used together') + run_cmd(info, **kwargs) + + +@cli.command(short_help='Run a shell in the app context.') +@click.option('-v', '--verbose', is_flag=True, help='Show verbose information on the available objects') +@click.option('-r', '--request-context', is_flag=True, help='Run the shell inside a Flask request context') +def shell(verbose, request_context): + from .shell import shell_cmd + shell_cmd(verbose, request_context) + + + +## ... source file continues with no further pass_script_info examples... + +``` + diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index e8ccddec4..2180a5b34 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -1,7 +1,7 @@ title: flask.cli ScriptInfo Example Code category: page slug: flask-cli-scriptinfo-examples -sortorder: 500021005 +sortorder: 500021008 toc: False sidebartitle: flask.cli ScriptInfo meta: Example code for understanding how to use the ScriptInfo class from the flask.cli module of the Flask project. @@ -137,3 +137,88 @@ flaskbb.add_command(alembic_click, "db") ``` + +## Example 2 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / cli / util.py**](https://github.com/indico/indico/blob/master/indico/cli/util.py) + +```python +# util.py + +from __future__ import unicode_literals + +import traceback +from importlib import import_module + +import click +~~from flask.cli import AppGroup, FlaskGroup, ScriptInfo +from flask_pluginengine import wrap_in_plugin_context +from werkzeug.utils import cached_property + + + + +def _create_app(info): + from indico.web.flask.app import make_app + return make_app(set_path=True) + + +class IndicoFlaskGroup(FlaskGroup): + + def __init__(self, **extra): + super(IndicoFlaskGroup, self).__init__(create_app=_create_app, add_default_commands=False, + add_version_option=False, set_debug_flag=False, **extra) + self._indico_plugin_commands = None + + def _load_plugin_commands(self): + assert False + + def _wrap_in_plugin_context(self, plugin, cmd): + cmd.callback = wrap_in_plugin_context(plugin, cmd.callback) + for subcmd in getattr(cmd, 'commands', {}).viewvalues(): + self._wrap_in_plugin_context(plugin, subcmd) + + def _get_indico_plugin_commands(self, ctx): + if self._indico_plugin_commands is not None: + return self._indico_plugin_commands + try: + from indico.core import signals + from indico.util.signals import named_objects_from_signal +~~ ctx.ensure_object(ScriptInfo).load_app() + cmds = named_objects_from_signal(signals.plugin.cli.send(), plugin_attr='_indico_plugin') + rv = {} + for name, cmd in cmds.viewitems(): + if cmd._indico_plugin: + self._wrap_in_plugin_context(cmd._indico_plugin, cmd) + rv[name] = cmd + except Exception as exc: + if 'No indico config found' not in unicode(exc): + click.echo(click.style('Loading plugin commands failed:', fg='red', bold=True)) + click.echo(click.style(traceback.format_exc(), fg='red')) + rv = {} + self._indico_plugin_commands = rv + return rv + + def get_command(self, ctx, name): + rv = AppGroup.get_command(self, ctx, name) + if rv is not None: + return rv + return self._get_indico_plugin_commands(ctx).get(name) + + def list_commands(self, ctx): + rv = set(click.Group.list_commands(self, ctx)) + rv.update(self._get_indico_plugin_commands(ctx)) + return sorted(rv) + + +## ... source file continues with no further ScriptInfo examples... + +``` + diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index 42e665f23..6f10a698a 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -1,7 +1,7 @@ title: flask.cli with_appcontext Example Code category: page slug: flask-cli-with-appcontext-examples -sortorder: 500021006 +sortorder: 500021010 toc: False sidebartitle: flask.cli with_appcontext meta: Python example code that shows how to use the with_appcontext callable from the flask.cli module of the Flask project. diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index ef84cc294..53a0442f0 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -1,7 +1,7 @@ title: flask.ctx after_this_request Example Code category: page slug: flask-ctx-after-this-request-examples -sortorder: 500021007 +sortorder: 500021011 toc: False sidebartitle: flask.ctx after_this_request meta: Python example code that shows how to use the after_this_request callable from the flask.ctx module of the Flask project. diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index 1094de284..3af9ae9ed 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -1,7 +1,7 @@ title: flask.ctx has_app_context Example Code category: page slug: flask-ctx-has-app-context-examples -sortorder: 500021008 +sortorder: 500021012 toc: False sidebartitle: flask.ctx has_app_context meta: Python example code that shows how to use the has_app_context callable from the flask.ctx module of the Flask project. @@ -122,3 +122,81 @@ class marshal_with(object): ``` + +## Example 2 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / util / i18n.py**](https://github.com/indico/indico/blob/master/indico/util/i18n.py) + +```python +# i18n.py + +import ast +import re +import textwrap +import traceback +import warnings +from contextlib import contextmanager + +from babel import negotiate_locale +from babel.core import LOCALE_ALIASES, Locale +from babel.messages.pofile import read_po +from babel.support import NullTranslations, Translations +~~from flask import current_app, g, has_app_context, has_request_context, request, session +from flask_babelex import Babel, Domain, get_domain +from flask_pluginengine import current_plugin +from speaklater import is_lazy_string, make_lazy_string +from werkzeug.utils import cached_property + +from indico.util.caching import memoize_request + + +LOCALE_ALIASES = dict(LOCALE_ALIASES, en='en_GB') +RE_TR_FUNCTION = re.compile(r'''_\("([^"]*)"\)|_\('([^']*)'\)''', re.DOTALL | re.MULTILINE) + +babel = Babel() +_use_context = object() + + +def get_translation_domain(plugin_name=_use_context): + if plugin_name is None: + return get_domain() + else: + plugin = None +~~ if has_app_context(): + from indico.core.plugins import plugin_engine + plugin = plugin_engine.get_plugin(plugin_name) if plugin_name is not _use_context else current_plugin + if plugin: + return plugin.translation_domain + else: + return get_domain() + + +def gettext_unicode(*args, **kwargs): + from indico.util.string import inject_unicode_debug + func_name = kwargs.pop('func_name', 'ugettext') + plugin_name = kwargs.pop('plugin_name', None) + force_unicode = kwargs.pop('force_unicode', False) + + if not isinstance(args[0], unicode): + args = [(text.decode('utf-8') if isinstance(text, str) else text) for text in args] + using_unicode = force_unicode + else: + using_unicode = True + + translations = get_translation_domain(plugin_name).get_translations() + res = getattr(translations, func_name)(*args, **kwargs) + res = inject_unicode_debug(res) + if not using_unicode: + + +## ... source file continues with no further has_app_context examples... + +``` + diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index cce3b86ed..a0d150579 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -1,7 +1,7 @@ title: flask.ctx has_request_context Example Code category: page slug: flask-ctx-has-request-context-examples -sortorder: 500021009 +sortorder: 500021013 toc: False sidebartitle: flask.ctx has_request_context meta: Python example code that shows how to use the has_request_context callable from the flask.ctx module of the Flask project. @@ -170,6 +170,149 @@ def _get_item(model, view_arg, name): +## ... source file continues with no further has_request_context examples... + +``` + + +## Example 3 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / core / logger.py**](https://github.com/indico/indico/blob/master/indico/core/logger.py) + +```python +# logger.py + +from __future__ import unicode_literals + +import logging +import logging.config +import logging.handlers +import os +import smtplib +import warnings +from email.mime.text import MIMEText +from email.utils import formatdate +from pprint import pformat + +import yaml +~~from flask import current_app, has_request_context, request, session + +from indico.core.config import config +from indico.util.i18n import set_best_lang +from indico.web.util import get_request_info + + +try: + from raven import setup_logging + from raven.contrib.celery import register_logger_signal, register_signal + from raven.contrib.flask import Sentry + from raven.handlers.logging import SentryHandler +except ImportError: + Sentry = object # so we can subclass + has_sentry = False +else: + has_sentry = True + + +class AddRequestIDFilter(object): + def filter(self, record): +~~ record.request_id = request.id if has_request_context() else '0' * 16 + return True + + +class RequestInfoFormatter(logging.Formatter): + def format(self, record): + rv = super(RequestInfoFormatter, self).format(record) + info = get_request_info() + if info: + rv += '\n\n' + pformat(info) + return rv + + +class FormattedSubjectSMTPHandler(logging.handlers.SMTPHandler): + def getSubject(self, record): + return self.subject % record.__dict__ + + def emit(self, record): + try: + port = self.mailport + if not port: + port = smtplib.SMTP_PORT + smtp = smtplib.SMTP(self.mailhost, port, timeout=self._timeout) + msg = MIMEText(self.format(record), 'plain', 'utf-8') + msg['From'] = self.fromaddr + + +## ... source file abbreviated to get to has_request_context examples ... + + + if formatter.pop('append_request_info', False): + assert '()' not in formatter + formatter['()'] = RequestInfoFormatter + if config.DB_LOG: + data['loggers']['indico._db'] = {'level': 'DEBUG', 'propagate': False, 'handlers': ['_db']} + data['handlers']['_db'] = {'class': 'logging.handlers.SocketHandler', 'host': '127.0.0.1', 'port': 9020} + if config.CUSTOMIZATION_DEBUG and config.CUSTOMIZATION_DIR: + data['loggers'].setdefault('indico.customization', {})['level'] = 'DEBUG' + logging.config.dictConfig(data) + if config.SENTRY_DSN: + if not has_sentry: + raise Exception('`raven` must be installed to use sentry logging') + init_sentry(app) + + @classmethod + def get(cls, name=None): + if name is None: + name = 'indico' + elif name != 'indico' and not name.startswith('indico.'): + name = 'indico.' + name + return logging.getLogger(name) + + +class IndicoSentry(Sentry): + def get_user_info(self, request): +~~ if not has_request_context() or not session.user: + return None + return {'id': session.user.id, + 'email': session.user.email, + 'name': session.user.full_name} + + def before_request(self, *args, **kwargs): + super(IndicoSentry, self).before_request() +~~ if not has_request_context(): + return + self.client.extra_context({'Endpoint': str(request.url_rule.endpoint) if request.url_rule else None, + 'Request ID': request.id}) + self.client.tags_context({'locale': set_best_lang()}) + + +def init_sentry(app): + sentry = IndicoSentry(wrap_wsgi=False, register_signal=True, logging=False) + sentry.init_app(app) + handler = SentryHandler(sentry.client, level=getattr(logging, config.SENTRY_LOGGING_LEVEL)) + handler.addFilter(BlacklistFilter({'indico.flask', 'celery.redirected'})) + setup_logging(handler) + register_logger_signal(sentry.client) + register_signal(sentry.client) + + +def sentry_log_exception(): + try: + sentry = current_app.extensions['sentry'] + except KeyError: + return + sentry.captureException() + + + + ## ... source file continues with no further has_request_context examples... ``` diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index 63370fc44..b657bf175 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -28,6 +28,17 @@ contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). +### Deploy Keras Model with Flask as Web App in 10 Minutes +The +[keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) +project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) +with the [Keras deep learning library](https://keras.io/) to provide +an example image classifier that is easy to [deploy](/deployment.html). +The application can be quckly run in a [Docker](/docker.html) container +on your local development environment. The project is licensed under the +[GNU General Public License v3.0](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/LICENSE). + + ### FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based @@ -94,15 +105,14 @@ while teaching developers how to use [Flask](/flask.html) in is [open sourced under the MIT license](https://github.com/miguelgrinberg/flasky/blob/master/LICENSE). -### Deploy Keras Model with Flask as Web App in 10 Minutes -The -[keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) -project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) -with the [Keras deep learning library](https://keras.io/) to provide -an example image classifier that is easy to [deploy](/deployment.html). -The application can be quckly run in a [Docker](/docker.html) container -on your local development environment. The project is licensed under the -[GNU General Public License v3.0](https://github.com/mtobeiyf/keras-flask-deploy-webapp/blob/master/LICENSE). +### indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). ### newspie diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 84f506902..44ff8b057 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -1,7 +1,7 @@ title: flask.globals current_app Example Code category: page slug: flask-globals-current-app-examples -sortorder: 500021010 +sortorder: 500021014 toc: False sidebartitle: flask.globals current_app meta: Python example code that shows how to use the current_app callable from the flask.globals module of the Flask project. @@ -2222,7 +2222,68 @@ def run_migrations_online(): ``` -## Example 16 from sandman2 +## Example 16 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / migrations / env.py**](https://github.com/indico/indico/blob/master/indico/migrations/env.py) + +```python +# env.py + +import logging.config + +from alembic import context +~~from flask import current_app +from sqlalchemy import engine_from_config, pool + +from indico.core.db.sqlalchemy.util.models import import_all_models + + +import_all_models() + +config = context.config +logging.config.fileConfig(config.config_file_name) + +~~config.set_main_option('sqlalchemy.url', current_app.config.get('SQLALCHEMY_DATABASE_URI')) +~~target_metadata = current_app.extensions['migrate'].db.metadata + + +def _include_symbol(tablename, schema): + if schema and schema.startswith('plugin_'): + return False + return tablename != 'alembic_version' and not tablename.startswith('alembic_version_') + + +def _render_item(type_, obj, autogen_context): + if hasattr(obj, 'info') and obj.info.get('alembic_dont_render'): + return None + func = getattr(obj, 'alembic_render_' + type_, None) + if func is None: + return False + return func(autogen_context, autogen_context.opts['template_args']['toplevel_code']) + + +def run_migrations_offline(): + url = config.get_main_option('sqlalchemy.url') + context.configure(url=url, target_metadata=target_metadata, include_schemas=True, + version_table_schema='public', include_symbol=_include_symbol, render_item=_render_item, + template_args={'toplevel_code': set()}) + + with context.begin_transaction(): + + +## ... source file continues with no further current_app examples... + +``` + + +## Example 17 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2347,7 +2408,7 @@ def register_model(cls, admin=None): ``` -## Example 17 from tedivms-flask +## Example 18 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 8db7aaacc..73b183032 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -1,7 +1,7 @@ title: flask.globals g Example Code category: page slug: flask-globals-g-examples -sortorder: 500021011 +sortorder: 500021015 toc: False sidebartitle: flask.globals g meta: Python example code that shows how to use the g callable from the flask.globals module of the Flask project. @@ -1003,7 +1003,116 @@ def allow_unconfirmed_email(view_function): ``` -## Example 8 from tedivms-flask +## Example 8 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / core / config.py**](https://github.com/indico/indico/blob/master/indico/core/config.py) + +```python +# config.py + +from __future__ import absolute_import, unicode_literals + +import ast +import codecs +import os +import re +import socket +import warnings +from datetime import timedelta + +import pytz +from celery.schedules import crontab +~~from flask import current_app, g +from flask.helpers import get_root_path +from werkzeug.datastructures import ImmutableDict +from werkzeug.urls import url_parse + +from indico.util.caching import make_hashable +from indico.util.fs import resolve_link +from indico.util.packaging import package_is_editable +from indico.util.string import crc32, snakify + + +DEFAULTS = { + 'ATTACHMENT_STORAGE': 'default', + 'AUTH_PROVIDERS': {}, + 'BASE_URL': None, + 'CACHE_BACKEND': 'files', + 'CACHE_DIR': '/opt/indico/cache', + 'CATEGORY_CLEANUP': {}, + 'CELERY_BROKER': None, + 'CELERY_CONFIG': {}, + 'CELERY_RESULT_BACKEND': None, + 'COMMUNITY_HUB_URL': 'https://hub.getindico.io', + 'CUSTOMIZATION_DEBUG': False, + 'CUSTOMIZATION_DIR': None, + 'CUSTOM_COUNTRIES': {}, + + +## ... source file abbreviated to get to g examples ... + + +class IndicoConfig(object): + + __slots__ = ('_config', '_exc') + + def __init__(self, config=None, exc=AttributeError): + object.__setattr__(self, '_config', config) + object.__setattr__(self, '_exc', exc) + + @property + def data(self): + try: + return self._config or current_app.config['INDICO'] + except KeyError: + raise RuntimeError('config not loaded') + + @property + def hash(self): + return crc32(repr(make_hashable(sorted(self.data.items())))) + + @property + def CONFERENCE_CSS_TEMPLATES_BASE_URL(self): + return self.BASE_URL + '/css/confTemplates' + + @property + def IMAGES_BASE_URL(self): +~~ return 'static/images' if g.get('static_site') else url_parse('{}/images'.format(self.BASE_URL)).path + + @property + def LATEX_ENABLED(self): + return bool(self.XELATEX_PATH) + + def __getattr__(self, name): + try: + return self.data[name] + except KeyError: + raise self._exc('no such setting: ' + name) + + def __setattr__(self, key, value): + raise AttributeError('cannot change config at runtime') + + def __delattr__(self, key): + raise AttributeError('cannot change config at runtime') + + +config = IndicoConfig() + + + +## ... source file continues with no further g examples... + +``` + + +## Example 9 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 4ad1787c8..cd7d9545e 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -1,7 +1,7 @@ title: flask.globals request Example Code category: page slug: flask-globals-request-examples -sortorder: 500021012 +sortorder: 500021016 toc: False sidebartitle: flask.globals request meta: Python example code that shows how to use the request callable from the flask.globals module of the Flask project. @@ -2520,7 +2520,96 @@ def require_auth(func): ``` -## Example 16 from keras-flask-deploy-webapp +## Example 16 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / core / auth.py**](https://github.com/indico/indico/blob/master/indico/core/auth.py) + +```python +# auth.py + +from __future__ import unicode_literals + +~~from flask import current_app, request +from flask_multipass import InvalidCredentials, Multipass, NoSuchUser + +from indico.core.logger import Logger + + +try: + from flask_multipass.providers.oauth import OAuthInvalidSessionState +except ImportError: + OAuthInvalidSessionState = None + + +logger = Logger.get('auth') + + +class IndicoMultipass(Multipass): + @property + def default_local_auth_provider(self): + return next((p for p in self.auth_providers.itervalues() if not p.is_external and p.settings.get('default')), + None) + + @property + def sync_provider(self): + return next((p for p in self.identity_providers.itervalues() if p.settings.get('synced_fields')), None) + + + +## ... source file abbreviated to get to request examples ... + + + self._check_default_provider() + + def _check_default_provider(self): + sync_providers = [p for p in self.identity_providers.itervalues() if p.settings.get('synced_fields')] + if len(sync_providers) > 1: + raise ValueError('There can only be one sync provider.') + auth_providers = self.auth_providers.values() + external_providers = [p for p in auth_providers if p.is_external] + local_providers = [p for p in auth_providers if not p.is_external] + if any(p.settings.get('default') for p in external_providers): + raise ValueError('The default provider cannot be external') + if all(p.is_external for p in auth_providers): + return + default_providers = [p for p in auth_providers if p.settings.get('default')] + if len(default_providers) > 1: + raise ValueError('There can only be one default auth provider') + elif not default_providers: + if len(local_providers) == 1: + local_providers[0].settings['default'] = True + else: + raise ValueError('There is no default auth provider') + + def handle_auth_error(self, exc, redirect_to_login=False): + if isinstance(exc, (NoSuchUser, InvalidCredentials)): + logger.warning('Invalid credentials (ip=%s, provider=%s): %s', +~~ request.remote_addr, exc.provider.name if exc.provider else None, exc) + else: + fn = logger.error + if OAuthInvalidSessionState is not None and isinstance(exc, OAuthInvalidSessionState): + fn = logger.debug + fn('Authentication via %s failed: %s (%r)', exc.provider.name if exc.provider else None, exc, exc.details) + return super(IndicoMultipass, self).handle_auth_error(exc, redirect_to_login=redirect_to_login) + + +multipass = IndicoMultipass() + + + +## ... source file continues with no further request examples... + +``` + + +## Example 17 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -2613,7 +2702,7 @@ if __name__ == '__main__': ``` -## Example 17 from newspie +## Example 18 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -2794,7 +2883,7 @@ if __name__ == '__main__': ``` -## Example 18 from sandman2 +## Example 19 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2995,7 +3084,7 @@ class Service(MethodView): ``` -## Example 19 from Science Flask +## Example 20 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -3102,7 +3191,7 @@ def security_context_processor(): ``` -## Example 20 from tedivms-flask +## Example 21 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -3160,7 +3249,7 @@ def roles_accepted_api(*role_names): ``` -## Example 21 from trape +## Example 22 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index bcffceffb..202b4707e 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -1,7 +1,7 @@ title: flask.globals session Example Code category: page slug: flask-globals-session-examples -sortorder: 500021013 +sortorder: 500021017 toc: False sidebartitle: flask.globals session meta: Python example code that shows how to use the session callable from the flask.globals module of the Flask project. @@ -1069,7 +1069,125 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 11 from tedivms-flask +## Example 11 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / core / logger.py**](https://github.com/indico/indico/blob/master/indico/core/logger.py) + +```python +# logger.py + +from __future__ import unicode_literals + +import logging +import logging.config +import logging.handlers +import os +import smtplib +import warnings +from email.mime.text import MIMEText +from email.utils import formatdate +from pprint import pformat + +import yaml +~~from flask import current_app, has_request_context, request, session + +from indico.core.config import config +from indico.util.i18n import set_best_lang +from indico.web.util import get_request_info + + +try: + from raven import setup_logging + from raven.contrib.celery import register_logger_signal, register_signal + from raven.contrib.flask import Sentry + from raven.handlers.logging import SentryHandler +except ImportError: + Sentry = object # so we can subclass + has_sentry = False +else: + has_sentry = True + + +class AddRequestIDFilter(object): + def filter(self, record): + record.request_id = request.id if has_request_context() else '0' * 16 + return True + + + + +## ... source file abbreviated to get to session examples ... + + + if formatter.pop('append_request_info', False): + assert '()' not in formatter + formatter['()'] = RequestInfoFormatter + if config.DB_LOG: + data['loggers']['indico._db'] = {'level': 'DEBUG', 'propagate': False, 'handlers': ['_db']} + data['handlers']['_db'] = {'class': 'logging.handlers.SocketHandler', 'host': '127.0.0.1', 'port': 9020} + if config.CUSTOMIZATION_DEBUG and config.CUSTOMIZATION_DIR: + data['loggers'].setdefault('indico.customization', {})['level'] = 'DEBUG' + logging.config.dictConfig(data) + if config.SENTRY_DSN: + if not has_sentry: + raise Exception('`raven` must be installed to use sentry logging') + init_sentry(app) + + @classmethod + def get(cls, name=None): + if name is None: + name = 'indico' + elif name != 'indico' and not name.startswith('indico.'): + name = 'indico.' + name + return logging.getLogger(name) + + +class IndicoSentry(Sentry): + def get_user_info(self, request): +~~ if not has_request_context() or not session.user: + return None +~~ return {'id': session.user.id, +~~ 'email': session.user.email, +~~ 'name': session.user.full_name} + + def before_request(self, *args, **kwargs): + super(IndicoSentry, self).before_request() + if not has_request_context(): + return + self.client.extra_context({'Endpoint': str(request.url_rule.endpoint) if request.url_rule else None, + 'Request ID': request.id}) + self.client.tags_context({'locale': set_best_lang()}) + + +def init_sentry(app): + sentry = IndicoSentry(wrap_wsgi=False, register_signal=True, logging=False) + sentry.init_app(app) + handler = SentryHandler(sentry.client, level=getattr(logging, config.SENTRY_LOGGING_LEVEL)) + handler.addFilter(BlacklistFilter({'indico.flask', 'celery.redirected'})) + setup_logging(handler) + register_logger_signal(sentry.client) + register_signal(sentry.client) + + +def sentry_log_exception(): + try: + sentry = current_app.extensions['sentry'] + except KeyError: + + +## ... source file continues with no further session examples... + +``` + + +## Example 12 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1186,7 +1304,7 @@ def init_error_handlers(app): ``` -## Example 12 from trape +## Example 13 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 99cc266f3..299b5777f 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -1,7 +1,7 @@ title: flask.helpers flash Example Code category: page slug: flask-helpers-flash-examples -sortorder: 500021014 +sortorder: 500021018 toc: False sidebartitle: flask.helpers flash meta: Python example code that shows how to use the flash callable from the flask.helpers module of the Flask project. @@ -1422,7 +1422,93 @@ class UserManager__Views(object): ``` -## Example 9 from tedivms-flask +## Example 9 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / util / roles.py**](https://github.com/indico/indico/blob/master/indico/util/roles.py) + +```python +# roles.py + +from __future__ import unicode_literals + +import csv + +~~from flask import flash, session + +from indico.core.errors import UserValueError +from indico.modules.events.roles.forms import ImportMembersCSVForm +from indico.modules.users import User +from indico.util.i18n import _, ngettext +from indico.util.string import to_unicode, validate_email +from indico.web.flask.templating import get_template_module +from indico.web.util import jsonify_data, jsonify_template + + +class ImportRoleMembersMixin(object): + + logger = None + + def import_members_from_csv(self, f): + reader = csv.reader(f.read().splitlines()) + emails = set() + + for num_row, row in enumerate(reader, 1): + if len(row) != 1: + raise UserValueError(_('Row {}: malformed CSV data').format(num_row)) + email = to_unicode(row[0]).strip().lower() + + if email and not validate_email(email): + raise UserValueError(_('Row {row}: invalid email address: {email}').format(row=num_row, email=email)) + if email in emails: + raise UserValueError(_('Row {}: email address is not unique').format(num_row)) + emails.add(email) + + users = set(User.query.filter(-User.is_deleted, User.all_emails.in_(emails))) + users_emails = {user.email for user in users} + unknown_emails = emails - users_emails + new_members = users - self.role.members + return new_members, users, unknown_emails + + def _process(self): + form = ImportMembersCSVForm() + + if form.validate_on_submit(): + new_members, users, unknown_emails = self.import_members_from_csv(form.source_file.data) + if form.remove_existing.data: + deleted_members = self.role.members - users + for member in deleted_members: + self.logger.info('User {} removed from role {} by {}'.format(member, self.role, session.user)) + self.role.members = users + else: + self.role.members |= users + for user in new_members: + self.logger.info('User {} added to role {} by {}'.format(user, self.role, session.user)) +~~ flash(ngettext("{} member has been imported.", + "{} members have been imported.", + len(users)).format(len(users)), 'success') + if unknown_emails: +~~ flash(ngettext("There is no user with this email address: {}", + "There are no users with these email addresses: {}", + len(unknown_emails)).format(', '.join(unknown_emails)), 'warning') + tpl = get_template_module('events/roles/_roles.html') + return jsonify_data(html=tpl.render_role(self.role, collapsed=False, email_button=False)) + return jsonify_template('events/roles/import_members.html', form=form, role=self.role) + + + +## ... source file continues with no further flash examples... + +``` + + +## Example 10 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-get-root-path.markdown b/content/pages/examples/flask/flask-helpers-get-root-path.markdown new file mode 100644 index 000000000..d58e6a1fa --- /dev/null +++ b/content/pages/examples/flask/flask-helpers-get-root-path.markdown @@ -0,0 +1,179 @@ +title: flask.helpers get_root_path Example Code +category: page +slug: flask-helpers-get-root-path-examples +sortorder: 500021019 +toc: False +sidebartitle: flask.helpers get_root_path +meta: Python example code that shows how to use the get_root_path callable from the flask.helpers module of the Flask project. + + +get_root_path is a callable within the flask.helpers module of the Flask project. + + +## Example 1 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / cli / setup.py**](https://github.com/indico/indico/blob/master/indico/cli/setup.py) + +```python +# setup.py + +from __future__ import unicode_literals + +import os +import re +import shutil +import socket +import sys +from operator import attrgetter +from smtplib import SMTP + +import click +from click import wrap_text +~~from flask.helpers import get_root_path +from pkg_resources import iter_entry_points +from prompt_toolkit import prompt +from prompt_toolkit.contrib.completers import PathCompleter, WordCompleter +from prompt_toolkit.layout.lexers import SimpleLexer +from prompt_toolkit.styles import style_from_dict +from prompt_toolkit.token import Token +from pytz import all_timezones, common_timezones +from redis import RedisError, StrictRedis +from sqlalchemy import create_engine +from sqlalchemy.exc import OperationalError +from sqlalchemy.pool import NullPool +from terminaltables import AsciiTable +from werkzeug.urls import url_parse + +from indico.core.db.sqlalchemy.util.models import import_all_models +from indico.util.console import cformat +from indico.util.string import validate_email + + +click.disable_unicode_literals_warning = True + + +def _echo(msg=''): + click.echo(msg, err=True) + + +## ... source file abbreviated to get to get_root_path examples ... + + + +def _prompt_abort(): + _confirm('Continue anyway?', abort=True) + + +def _copy(src, dst, force=False): + if not force and os.path.exists(dst): + _echo(cformat('%{yellow!}{}%{reset}%{yellow} already exists; not copying %{yellow!}{}') + .format(dst, src)) + return + _echo(cformat('%{green}Copying %{green!}{}%{reset}%{green} -> %{green!}{}').format(src, dst)) + shutil.copy(src, dst) + + +def _link(src, dst): + _echo(cformat('%{cyan}Linking %{cyan!}{}%{reset}%{cyan} -> %{cyan!}{}').format(dst, src)) + if os.path.exists(dst) or os.path.islink(dst): + os.unlink(dst) + os.symlink(src, dst) + + +def _get_dirs(target_dir): + if not os.path.isdir(target_dir): + _echo(cformat('%{red}Directory not found:%{red!} {}').format(target_dir)) + sys.exit(1) +~~ return get_root_path('indico'), os.path.abspath(target_dir) + + +PROMPT_TOOLKIT_STYLE = style_from_dict({ + Token.HELP: '#aaaaaa', + Token.PROMPT: '#5f87ff', + Token.DEFAULT: '#dfafff', + Token.BRACKET: '#ffffff', + Token.COLON: '#ffffff', + Token.INPUT: '#aaffaa', +}) + + +def _prompt(message, default='', path=False, list_=None, required=True, validate=None, allow_invalid=False, + password=False, help=None): + def _get_prompt_tokens(cli): + rv = [ + (Token.PROMPT, message), + (Token.COLON, ': '), + ] + if first and help: + rv.insert(0, (Token.HELP, wrap_text(help) + '\n')) + return rv + + completer = None + + +## ... source file abbreviated to get to get_root_path examples ... + + + + if dev: + config_data += [ + b'', + b'# Development options', + b'DB_LOG = True', + b'DEBUG = True', + b'SMTP_USE_CELERY = False' + ] + + config = b'\n'.join(x for x in config_data if x is not None) + + if dev: + if not os.path.exists(self.data_root_path): + os.mkdir(self.data_root_path) + + _echo() + for path in self._missing_dirs: + _echo(cformat('%{magenta}Creating %{magenta!}{}%{reset}%{magenta}').format(path)) + os.mkdir(path) + + _echo(cformat('%{magenta}Creating %{magenta!}{}%{reset}%{magenta}').format(self.config_path)) + with open(self.config_path, 'wb') as f: + f.write(config + b'\n') + +~~ package_root = get_root_path('indico') + _copy(os.path.normpath(os.path.join(package_root, 'logging.yaml.sample')), + os.path.join(self.config_dir_path, 'logging.yaml')) + + if not dev: + _link(os.path.join(package_root, 'web', 'static'), os.path.join(self.data_root_path, 'web', 'static')) + _copy(os.path.join(package_root, 'web', 'indico.wsgi'), + os.path.join(self.data_root_path, 'web', 'indico.wsgi'), + force=True) + + if create_config_link: + _link(self.config_path, config_link_path) + + _echo() + _echo(cformat('%{green}Indico has been configured successfully!')) + if not dev and not create_config_link: + _echo(cformat('Run %{green!}export INDICO_CONFIG={}%{reset} to use your config file') + .format(self.config_path)) + + if self.old_archive_dir: + _echo(cformat('Check %{green!}https://git.io/vHP6o%{reset} for a guide on how to ' + 'import data from Indico v1.2')) + else: + _echo(cformat('You can now run %{green!}indico db prepare%{reset} to initialize your Indico database')) + + + +## ... source file continues with no further get_root_path examples... + +``` + diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 672a9f135..8fdaf6966 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -1,7 +1,7 @@ title: flask.helpers make_response Example Code category: page slug: flask-helpers-make-response-examples -sortorder: 500021015 +sortorder: 500021020 toc: False sidebartitle: flask.helpers make_response meta: Python example code that shows how to use the make_response callable from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown index 51b86d5dd..e3c57445b 100644 --- a/content/pages/examples/flask/flask-helpers-send-file.markdown +++ b/content/pages/examples/flask/flask-helpers-send-file.markdown @@ -1,7 +1,7 @@ title: flask.helpers send_file Example Code category: page slug: flask-helpers-send-file-examples -sortorder: 500021016 +sortorder: 500021021 toc: False sidebartitle: flask.helpers send_file meta: Python example code that shows how to use the send_file callable from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 01a15826d..1db0ddf96 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -1,7 +1,7 @@ title: flask.helpers url_for Example Code category: page slug: flask-helpers-url-for-examples -sortorder: 500021017 +sortorder: 500021022 toc: False sidebartitle: flask.helpers url_for meta: Python example code that shows how to use the url_for callable from the flask.helpers module of the Flask project. diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index dceeec610..22f4b9a2f 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -1,7 +1,7 @@ title: flask.json JSONEncoder Example Code category: page slug: flask-json-jsonencoder-examples -sortorder: 500021018 +sortorder: 500021023 toc: False sidebartitle: flask.json JSONEncoder meta: Example code for understanding how to use the JSONEncoder class from the flask.json module of the Flask project. diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index e1bbb2fa0..70d393c0b 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -1,7 +1,7 @@ title: flask.json jsonify Example Code category: page slug: flask-json-jsonify-examples -sortorder: 500021019 +sortorder: 500021024 toc: False sidebartitle: flask.json jsonify meta: Python example code that shows how to use the jsonify callable from the flask.json module of the Flask project. @@ -765,7 +765,110 @@ def stream(): ``` -## Example 6 from keras-flask-deploy-webapp +## Example 6 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / web / util.py**](https://github.com/indico/indico/blob/master/indico/web/util.py) + +```python +# util.py + +from __future__ import absolute_import, unicode_literals + +from datetime import datetime + +~~from flask import g, has_request_context, jsonify, render_template, request, session +from itsdangerous import Signer +from markupsafe import Markup +from werkzeug.exceptions import ImATeapot +from werkzeug.urls import url_decode, url_encode, url_parse, url_unparse + +from indico.util.i18n import _ +from indico.web.flask.templating import get_template_module + + +def inject_js(js): + if 'injected_js' not in g: + g.injected_js = [] + g.injected_js.append(Markup(js)) + + +def _pop_injected_js(): + js = None + if 'injected_js' in g: + js = g.injected_js + del g.injected_js + return js + + +def jsonify_form(form, fields=None, submit=None, back=None, back_url=None, back_button=True, disabled_until_change=True, + disabled_fields=(), form_header_kwargs=None, skip_labels=False, save_reminder=False, + footer_align_right=False, disable_if_locked=True): + if submit is None: + submit = _('Save') + if back is None: + back = _('Cancel') + if form_header_kwargs is None: + form_header_kwargs = {} + tpl = get_template_module('forms/_form.html') + html = tpl.simple_form(form, fields=fields, submit=submit, back=back, back_url=back_url, back_button=back_button, + disabled_until_change=disabled_until_change, disabled_fields=disabled_fields, + form_header_kwargs=form_header_kwargs, skip_labels=skip_labels, save_reminder=save_reminder, + footer_align_right=footer_align_right, disable_if_locked=disable_if_locked) +~~ return jsonify(html=html, js=_pop_injected_js()) + + +def jsonify_template(template, _render_func=render_template, _success=None, **context): + html = _render_func(template, **context) + jsonify_kw = {} + if _success is not None: + jsonify_kw['success'] = _success +~~ return jsonify(html=html, js=_pop_injected_js(), **jsonify_kw) + + +def jsonify_data(flash=True, **json_data): + json_data.setdefault('success', True) + if flash: + json_data['flashed_messages'] = render_template('flashed_messages.html') +~~ return jsonify(**json_data) + + +class ExpectedError(ImATeapot): + def __init__(self, message, **data): + super(ExpectedError, self).__init__(message or 'Something went wrong') + self.data = dict(data, message=message) + + +def _format_request_data(data, hide_passwords=False): + if not hasattr(data, 'iterlists'): + data = ((k, [v]) for k, v in data.iteritems()) + else: + data = data.iterlists() + rv = {} + for key, values in data: + if hide_passwords and 'password' in key: + values = [v if not v else '<{} chars hidden>'.format(len(v)) for v in values] + rv[key] = values if len(values) != 1 else values[0] + return rv + + +def get_request_info(hide_passwords=True): + if not has_request_context(): + return None + + +## ... source file continues with no further jsonify examples... + +``` + + +## Example 7 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -854,7 +957,7 @@ if __name__ == '__main__': ``` -## Example 7 from sandman2 +## Example 8 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1022,7 +1125,7 @@ class Service(MethodView): ``` -## Example 8 from tedivms-flask +## Example 9 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index a7215d25a..b4a85ddc3 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -1,7 +1,7 @@ title: flask.sessions BadSignature Example Code category: page slug: flask-sessions-badsignature-examples -sortorder: 500021020 +sortorder: 500021025 toc: False sidebartitle: flask.sessions BadSignature meta: Example code for understanding how to use the BadSignature class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index e73b27e37..9cae62575 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionInterface Example Code category: page slug: flask-sessions-sessioninterface-examples -sortorder: 500021021 +sortorder: 500021026 toc: False sidebartitle: flask.sessions SessionInterface meta: Example code for understanding how to use the SessionInterface class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown index 7a4a4f03b..69c354a97 100644 --- a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown +++ b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionMixin Example Code category: page slug: flask-sessions-sessionmixin-examples -sortorder: 500021022 +sortorder: 500021027 toc: False sidebartitle: flask.sessions SessionMixin meta: Example code for understanding how to use the SessionMixin class from the flask.sessions module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index b2b2e5261..5cdf42512 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -1,7 +1,7 @@ title: flask.signals got_request_exception Example Code category: page slug: flask-signals-got-request-exception-examples -sortorder: 500021024 +sortorder: 500021029 toc: False sidebartitle: flask.signals got_request_exception meta: Python example code that shows how to use the got_request_exception callable from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index b91e84fae..1e185442e 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -1,7 +1,7 @@ title: flask.signals Namespace Example Code category: page slug: flask-signals-namespace-examples -sortorder: 500021023 +sortorder: 500021028 toc: False sidebartitle: flask.signals Namespace meta: Example code for understanding how to use the Namespace class from the flask.signals module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 6d460589a..6006f3831 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template_string Example Code category: page slug: flask-templating-render-template-string-examples -sortorder: 500021026 +sortorder: 500021031 toc: False sidebartitle: flask.templating render_template_string meta: Python example code that shows how to use the render_template_string callable from the flask.templating module of the Flask project. diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 81b301c6d..bf2a668c6 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template Example Code category: page slug: flask-templating-render-template-examples -sortorder: 500021025 +sortorder: 500021030 toc: False sidebartitle: flask.templating render_template meta: Python example code that shows how to use the render_template callable from the flask.templating module of the Flask project. @@ -1305,7 +1305,37 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 15 from keras-flask-deploy-webapp +## Example 15 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management. +The code is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / util / mathjax.py**](https://github.com/indico/indico/blob/master/indico/util/mathjax.py) + +```python +# mathjax.py + +from __future__ import absolute_import + +~~from flask import current_app, render_template + + +class MathjaxMixin(object): + def _get_head_content(self): +~~ return render_template('mathjax_config.html') + unicode(current_app.manifest['mathjax.js']) + + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 16 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1396,7 +1426,7 @@ if __name__ == '__main__': ``` -## Example 16 from newspie +## Example 17 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1551,7 +1581,7 @@ if __name__ == '__main__': ``` -## Example 17 from Science Flask +## Example 18 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -1839,7 +1869,7 @@ def static_from_root(): ``` -## Example 18 from tedivms-flask +## Example 19 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1942,7 +1972,7 @@ def init_error_handlers(app): ``` -## Example 19 from trape +## Example 20 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index bc054bdcf..d53bed7cb 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -1,7 +1,7 @@ title: flask.views http_method_funcs Example Code category: page slug: flask-views-http-method-funcs-examples -sortorder: 500021029 +sortorder: 500021034 toc: False sidebartitle: flask.views http_method_funcs meta: Python example code that shows how to use the http_method_funcs callable from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index f3eca5a20..7be8d78df 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -1,7 +1,7 @@ title: flask.views MethodView Example Code category: page slug: flask-views-methodview-examples -sortorder: 500021027 +sortorder: 500021032 toc: False sidebartitle: flask.views MethodView meta: Example code for understanding how to use the MethodView class from the flask.views module of the Flask project. diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 17713f00c..d00a9cc54 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -1,7 +1,7 @@ title: flask.views View Example Code category: page slug: flask-views-view-examples -sortorder: 500021028 +sortorder: 500021033 toc: False sidebartitle: flask.views View meta: Example code for understanding how to use the View class from the flask.views module of the Flask project. diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html index 643d82f76..d2d99058f 100644 --- a/theme/templates/code-examples/flask.html +++ b/theme/templates/code-examples/flask.html @@ -7,14 +7,18 @@

Flask:

flask.app BadRequest, Flask, - Headers + Headers, + ImmutableDict

flask.blueprints Blueprint

flask.cli + AppGroup, + DispatchingApp, FlaskGroup, ScriptInfo, + pass_script_info, with_appcontext

flask.ctx @@ -30,6 +34,7 @@

flask.globals

flask.helpers flash, + get_root_path, make_response, send_file, url_for From 4dfabf35c229f5fd74eb50c6f729a7da88332d08 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 7 Jul 2020 12:42:36 -0400 Subject: [PATCH 171/302] add additional sqlalchemy coding examples and new descriptions for flask examples --- .../04-web-development/15-web-design.markdown | 8 + .../flask/flask-app-immutabledict.markdown | 8 +- .../flask/flask-cli-appgroup.markdown | 7 +- .../flask/flask-cli-flaskgroup.markdown | 6 +- .../sqlalchemy-dialects-mssql.markdown | 2 +- ...sqlalchemy-dialects-mysql-pymysql.markdown | 2 +- .../sqlalchemy-dialects-mysql.markdown | 2 +- .../sqlalchemy-dialects-oracle.markdown | 2 +- ...alchemy-dialects-postgresql-array.markdown | 2 +- ...alects-postgresql-base-pgcompiler.markdown | 110 +++++++++++ ...tgresql-base-pgidentifierpreparer.markdown | 102 ++++++++++ ...ts-postgresql-base-pgtypecompiler.markdown | 4 +- ...lchemy-dialects-postgresql-bigint.markdown | 2 +- ...qlalchemy-dialects-postgresql-bit.markdown | 2 +- ...lects-postgresql-double-precision.markdown | 68 ++++++- ...ects-postgresql-excludeconstraint.markdown | 2 +- ...chemy-dialects-postgresql-integer.markdown | 2 +- ...lalchemy-dialects-postgresql-json.markdown | 2 +- ...resql-psycopg2-pgdialect-psycopg2.markdown | 63 +++++- ...-dialects-postgresql-pypostgresql.markdown | 2 +- ...hemy-dialects-postgresql-tsvector.markdown | 2 +- .../sqlalchemy-dialects-postgresql.markdown | 2 +- ...lalchemy-dialects-sqlite-pysqlite.markdown | 4 +- .../sqlalchemy-dialects-sqlite.markdown | 2 +- .../sqlalchemy-engine-connection.markdown | 4 +- .../sqlalchemy-engine-create-engine.markdown | 45 ++++- ...emy-engine-default-defaultdialect.markdown | 4 +- .../sqlalchemy-engine-default.markdown | 4 +- .../sqlalchemy-engine-engine.markdown | 4 +- ...ngine-interfaces-executioncontext.markdown | 4 +- ...hemy-engine-result-resultmetadata.markdown | 4 +- ...sqlalchemy-engine-result-rowproxy.markdown | 4 +- ...-engine-strategies-enginestrategy.markdown | 4 +- ...ine-strategies-mockenginestrategy.markdown | 4 +- .../sqlalchemy-engine-url-make-url.markdown | 4 +- .../sqlalchemy/sqlalchemy-engine-url.markdown | 4 +- ...lalchemy-events-schemaeventtarget.markdown | 4 +- .../sqlalchemy-example-projects-code.markdown | 11 ++ .../sqlalchemy-exc-argumenterror.markdown | 4 +- .../sqlalchemy-exc-databaseerror.markdown | 124 ++++++++++++ .../sqlalchemy-exc-dataerror.markdown | 4 +- .../sqlalchemy-exc-integrityerror.markdown | 4 +- ...qlalchemy-exc-invalidrequesterror.markdown | 4 +- ...alchemy-exc-noinspectionavailable.markdown | 4 +- .../sqlalchemy-exc-operationalerror.markdown | 78 +++++++- .../sqlalchemy-exc-programmingerror.markdown | 4 +- ...lalchemy-ext-automap-automap-base.markdown | 4 +- .../sqlalchemy-ext-compiler-compiles.markdown | 96 ++++++++- .../sqlalchemy-ext-compiler.markdown | 186 ++++++++++++++++- ...-ext-declarative-declarative-base.markdown | 60 +++++- ...y-ext-declarative-declarativemeta.markdown | 4 +- ...lalchemy-ext-hybrid-hybrid-method.markdown | 113 +++++++++++ ...lchemy-ext-hybrid-hybrid-property.markdown | 4 +- .../sqlalchemy-ext-mutable-mutable.markdown | 4 +- .../sqlalchemy-extensions-plug-ins.markdown | 35 ++++ .../sqlalchemy-inspection-inspect.markdown | 4 +- .../sqlalchemy-orm-aliased.markdown | 99 ++++++++++ ...hemy-orm-attributes-flag-modified.markdown | 122 ++++++++++++ ...-attributes-instrumentedattribute.markdown | 75 ++++++- .../sqlalchemy-orm-attributes.markdown | 4 +- .../sqlalchemy-orm-backref.markdown | 4 +- .../sqlalchemy-orm-class-mapper.markdown | 4 +- ...-orm-collections-instrumentedlist.markdown | 4 +- .../sqlalchemy-orm-column-property.markdown | 4 +- .../sqlalchemy-orm-columnproperty.markdown | 63 +++++- .../sqlalchemy-orm-composite.markdown | 4 +- .../sqlalchemy-orm-compositeproperty.markdown | 4 +- .../sqlalchemy-orm-exc-noresultfound.markdown | 120 ++++++++++- ...lchemy-orm-exc-unmappedclasserror.markdown | 4 +- ...emy-orm-exc-unmappedinstanceerror.markdown | 4 +- ...emy-orm-interfaces-mapperproperty.markdown | 4 +- ...emy-orm-interfaces-propcomparator.markdown | 4 +- .../sqlalchemy-orm-interfaces.markdown | 4 +- .../sqlalchemy/sqlalchemy-orm-mapper.markdown | 4 +- .../sqlalchemy-orm-mapperlib.markdown | 4 +- .../sqlalchemy-orm-object-mapper.markdown | 4 +- .../sqlalchemy-orm-object-session.markdown | 4 +- ...emy-orm-properties-columnproperty.markdown | 4 +- ...m-properties-relationshipproperty.markdown | 4 +- .../sqlalchemy-orm-query-query.markdown | 4 +- ...sqlalchemy-orm-query-querycontext.markdown | 4 +- .../sqlalchemy/sqlalchemy-orm-query.markdown | 57 ++++++ .../sqlalchemy-orm-relationship.markdown | 4 +- ...lalchemy-orm-relationshipproperty.markdown | 60 ++++++ ...lchemy-orm-session-object-session.markdown | 4 +- .../sqlalchemy-orm-session-session.markdown | 4 +- .../sqlalchemy-orm-session.markdown | 4 +- .../sqlalchemy-orm-sessionmaker.markdown | 4 +- .../sqlalchemy-orm-strategies.markdown | 4 +- .../sqlalchemy-orm-synonymproperty.markdown | 4 +- .../sqlalchemy-orm-util-aliasedclass.markdown | 155 +++++++++++++++ .../sqlalchemy-orm-util-aliasedinsp.markdown | 4 +- .../sqlalchemy-pool-nullpool.markdown | 74 ++++++- .../sqlalchemy-pool-staticpool.markdown | 4 +- ...sqlalchemy-schema-checkconstraint.markdown | 4 +- .../sqlalchemy-schema-column.markdown | 4 +- .../sqlalchemy-schema-createindex.markdown | 4 +- .../sqlalchemy-schema-createtable.markdown | 121 ++++++++++++ .../sqlalchemy-schema-ddlelement.markdown | 139 ++++++++++++- .../sqlalchemy-schema-foreignkey.markdown | 4 +- ...chemy-schema-foreignkeyconstraint.markdown | 4 +- ...chemy-schema-primarykeyconstraint.markdown | 4 +- .../sqlalchemy-schema-table.markdown | 4 +- .../sqlalchemy-sql-clauseelement.markdown | 4 +- .../sqlalchemy/sqlalchemy-sql-column.markdown | 4 +- ...lchemy-sql-elements-columnelement.markdown | 4 +- .../sqlalchemy-sql-elements-label.markdown | 62 +++++- ...hemy-sql-expression-clauseelement.markdown | 4 +- ...chemy-sql-expression-columnclause.markdown | 4 +- ...hemy-sql-expression-columnelement.markdown | 4 +- ...alchemy-sql-expression-executable.markdown | 4 +- ...my-sql-expression-functionelement.markdown | 4 +- ...my-sql-expression-unaryexpression.markdown | 4 +- .../sqlalchemy-sql-expression.markdown | 4 +- .../sqlalchemy-sql-extract.markdown | 142 +++++++++++++ ...emy-sql-functions-functionelement.markdown | 4 +- ...emy-sql-functions-genericfunction.markdown | 4 +- .../sqlalchemy-sql-functions.markdown | 4 +- .../sqlalchemy-sql-naming-conv.markdown | 4 +- .../sqlalchemy-sql-operators.markdown | 187 +++++++++++++++++- .../sqlalchemy-sql-schema-column.markdown | 4 +- .../sqlalchemy-sql-schema-schemaitem.markdown | 4 +- .../sqlalchemy/sqlalchemy-sql-schema.markdown | 4 +- .../sqlalchemy/sqlalchemy-sql-select.markdown | 4 +- .../sqlalchemy-sql-sqltypes-nulltype.markdown | 4 +- .../sqlalchemy-sql-sqltypes.markdown | 4 +- .../sqlalchemy/sqlalchemy-sql-table.markdown | 4 +- ...sqlalchemy-sql-util-clauseadapter.markdown | 4 +- .../sqlalchemy-sql-visitors-traverse.markdown | 4 +- .../sqlalchemy-types-boolean.markdown | 4 +- .../sqlalchemy/sqlalchemy-types-enum.markdown | 4 +- .../sqlalchemy-types-integer.markdown | 4 +- .../sqlalchemy-types-nulltype.markdown | 4 +- .../sqlalchemy-types-string.markdown | 4 +- .../sqlalchemy-types-to-instance.markdown | 4 +- .../sqlalchemy-types-typeengine.markdown | 4 +- .../sqlalchemy-types-userdefinedtype.markdown | 4 +- ...qlalchemy-util-langhelpers-symbol.markdown | 4 +- .../sqlalchemy-util-ordereddict.markdown | 4 +- .../sqlalchemy-util-orderedset.markdown | 4 +- ...qlalchemy-util-set-creation-order.markdown | 4 +- .../sqlalchemy-util-topological.markdown | 4 +- theme/templates/code-examples/sqlalchemy.html | 15 +- 143 files changed, 2774 insertions(+), 253 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgcompiler.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgidentifierpreparer.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index 5093e4823..b485938b3 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -113,6 +113,14 @@ this short list as my absolute favorites that help developers become examples and further details for the four principles, which are contrast, consistency, Occam's Razor and space. +* [Gallery of web design history](https://www.webdesignmuseum.org/gallery) is + a collection of websites from between 1991 and 2006 that show the evolution + of what the web looked like before the modern + [CSS](/cascading-style-sheets.html) era. This is a great resource to see + how websites evolved, such as + [Microsoft in 1996](https://www.webdesignmuseum.org/gallery/microsoft-1996) + and [YouTube in 2005](https://www.webdesignmuseum.org/gallery/youtube-2005). + * [The Average Web Page (Data from Analyzing 8 Million Websites)](https://css-tricks.com/average-web-page-data-analyzing-8-million-websites/) shows the most frequently used HTML elements, metadata, text content and other statistics from a large scale analysis of the web. diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 537acc636..86f4394f4 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -7,7 +7,13 @@ sidebartitle: flask.app ImmutableDict meta: Example code for understanding how to use the ImmutableDict class from the flask.app module of the Flask project. -ImmutableDict is a class within the flask.app module of the Flask project. +[ImmutableDict](https://github.com/pallets/flask/blob/master/src/flask/app.py) +is a class within the flask.app module of the [Flask](/flask.html) +framework that is actually imported from the Werkzeug +[datastructures module](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/datastructures.py). +The ImmutableDict class wraps a +[standard Python dictionary](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) +so that values cannot be modified after initially being set. ## Example 1 from indico diff --git a/content/pages/examples/flask/flask-cli-appgroup.markdown b/content/pages/examples/flask/flask-cli-appgroup.markdown index 958d3df00..194244886 100644 --- a/content/pages/examples/flask/flask-cli-appgroup.markdown +++ b/content/pages/examples/flask/flask-cli-appgroup.markdown @@ -7,7 +7,12 @@ sidebartitle: flask.cli AppGroup meta: Example code for understanding how to use the AppGroup class from the flask.cli module of the Flask project. -AppGroup is a class within the flask.cli module of the Flask project. +[AppGroup](https://github.com/pallets/flask/blob/master/src/flask/cli.py) +is a class within the flask.cli module of the Flask project. It +works like the +[Click Group](https://click.palletsprojects.com/en/7.x/commands/) +class and automatically wraps the functions using +[with_appcontext](/flask-cli-with-appcontext-examples.html). ## Example 1 from indico diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 11fc31184..6940160bb 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -9,9 +9,9 @@ meta: Example code for understanding how to use the FlaskGroup class from the fl [FlaskGroup](https://github.com/pallets/flask/blob/master/src/flask/cli.py) is a class within the flask.cli module of the Flask project. FlaskGroup -is a subclass of AppGroup that provides for loading more commands from -a configured Flask app. Generally, only advanced use cases will need to -use this class. +is a subclass of [AppGroup](/flask-cli-appgroup-examples.html) that provides +for loading more commands from a configured Flask app. Generally, only +advanced use cases will need to use this class. ## Example 1 from FlaskBB diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown index 87b8af20e..6ff8127fe 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-mssql-examples sortorder: 500031000 toc: False sidebartitle: sqlalchemy.dialects mssql -meta: Python example code for the mssql callable from the sqlalchemy.dialects module of the SQLAlchemy project. +meta: Python example code that shows how to use the mssql callable from the sqlalchemy.dialects module of the SQLAlchemy project. mssql is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown index da6b3ef1c..6b78e54e7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-mysql-pymysql-examples sortorder: 500031005 toc: False sidebartitle: sqlalchemy.dialects.mysql pymysql -meta: Python example code for the pymysql callable from the sqlalchemy.dialects.mysql module of the SQLAlchemy project. +meta: Python example code that shows how to use the pymysql callable from the sqlalchemy.dialects.mysql module of the SQLAlchemy project. pymysql is a callable within the sqlalchemy.dialects.mysql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown index 656894081..e10050910 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-mysql-examples sortorder: 500031001 toc: False sidebartitle: sqlalchemy.dialects mysql -meta: Python example code for the mysql callable from the sqlalchemy.dialects module of the SQLAlchemy project. +meta: Python example code that shows how to use the mysql callable from the sqlalchemy.dialects module of the SQLAlchemy project. mysql is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown index c7f3c6f74..6e3dc5be1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-oracle-examples sortorder: 500031002 toc: False sidebartitle: sqlalchemy.dialects oracle -meta: Python example code for the oracle callable from the sqlalchemy.dialects module of the SQLAlchemy project. +meta: Python example code that shows how to use the oracle callable from the sqlalchemy.dialects module of the SQLAlchemy project. oracle is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown index f1a546ff7..01224ebec 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-postgresql-array-examples sortorder: 500031006 toc: False sidebartitle: sqlalchemy.dialects.postgresql ARRAY -meta: Python example code for the ARRAY constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code that shows how to use the ARRAY constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. ARRAY is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgcompiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgcompiler.markdown new file mode 100644 index 000000000..1e56dc2b5 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgcompiler.markdown @@ -0,0 +1,110 @@ +title: sqlalchemy.dialects.postgresql.base PGCompiler Example Code +category: page +slug: sqlalchemy-dialects-postgresql-base-pgcompiler-examples +sortorder: 500031015 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql.base PGCompiler +meta: Example code for understanding how to use the PGCompiler class from the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. + + +PGCompiler is a class within the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-clickhouse +[sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +for communicating with the open source [ClickHouse](https://clickhouse.tech/) +database management system. ClickHouse is column-oriented and therefore +better for some use cases and worse for others compared to a traditional +[relational database](/databases.html). + +The code for this project is open sourced under the +[MIT license](https://github.com/cloudflare/sqlalchemy-clickhouse/blob/master/LICENSE.txt) +while ClickHouse is provided as open source under the +[Apache License 2.0](https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE). + +[**sqlalchemy-clickhouse / base.py**](https://github.com/cloudflare/sqlalchemy-clickhouse/blob/master/././base.py) + +```python +# base.py + +import re + +import sqlalchemy.types as sqltypes +from sqlalchemy import exc as sa_exc +from sqlalchemy import util as sa_util +from sqlalchemy.engine import default, reflection +from sqlalchemy.sql import compiler, expression +from sqlalchemy.sql.elements import quoted_name +~~from sqlalchemy.dialects.postgresql.base import PGCompiler, PGIdentifierPreparer +from sqlalchemy.types import ( + CHAR, DATE, DATETIME, INTEGER, SMALLINT, BIGINT, DECIMAL, TIME, + TIMESTAMP, VARCHAR, BINARY, BOOLEAN, FLOAT, REAL) + +VERSION = (0, 1, 0, None) + +colspecs = {} + +class ARRAY(sqltypes.TypeEngine): + __visit_name__ = 'ARRAY' + +ischema_names = { + 'Int64': INTEGER, + 'Int32': INTEGER, + 'Int16': INTEGER, + 'Int8': INTEGER, + 'UInt64': INTEGER, + 'UInt32': INTEGER, + 'UInt16': INTEGER, + 'UInt8': INTEGER, + 'Date': DATE, + 'DateTime': DATETIME, + 'Float64': FLOAT, + 'Float32': FLOAT, + 'String': VARCHAR, + 'FixedString': VARCHAR, + 'Enum': VARCHAR, + 'Enum8': VARCHAR, + 'Enum16': VARCHAR, + 'Array': ARRAY, +} + +class ClickHouseIdentifierPreparer(PGIdentifierPreparer): + def quote_identifier(self, value): + return self._escape_identifier(value) + def quote(self, ident, force=None): + if self._requires_quotes(ident): + return '"{}"'.format(ident) + return ident + +~~class ClickHouseCompiler(PGCompiler): + def visit_count_func(self, fn, **kw): + return 'count{0}'.format(self.process(fn.clause_expr, **kw)) + + def visit_random_func(self, fn, **kw): + return 'rand()' + + def visit_now_func(self, fn, **kw): + return 'now()' + + def visit_current_date_func(self, fn, **kw): + return 'today()' + + def visit_true(self, element, **kw): + return '1' + + def visit_false(self, element, **kw): + return '0' + + def visit_cast(self, cast, **kwargs): + if self.dialect.supports_cast: + return super(ClickHouseCompiler, self).visit_cast(cast, **kwargs) + else: + return self.process(cast.clause, **kwargs) + + + +## ... source file continues with no further PGCompiler examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgidentifierpreparer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgidentifierpreparer.markdown new file mode 100644 index 000000000..9891bf628 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgidentifierpreparer.markdown @@ -0,0 +1,102 @@ +title: sqlalchemy.dialects.postgresql.base PGIdentifierPreparer Example Code +category: page +slug: sqlalchemy-dialects-postgresql-base-pgidentifierpreparer-examples +sortorder: 500031016 +toc: False +sidebartitle: sqlalchemy.dialects.postgresql.base PGIdentifierPreparer +meta: Example code for understanding how to use the PGIdentifierPreparer class from the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. + + +PGIdentifierPreparer is a class within the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. + + +## Example 1 from sqlalchemy-clickhouse +[sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +for communicating with the open source [ClickHouse](https://clickhouse.tech/) +database management system. ClickHouse is column-oriented and therefore +better for some use cases and worse for others compared to a traditional +[relational database](/databases.html). + +The code for this project is open sourced under the +[MIT license](https://github.com/cloudflare/sqlalchemy-clickhouse/blob/master/LICENSE.txt) +while ClickHouse is provided as open source under the +[Apache License 2.0](https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE). + +[**sqlalchemy-clickhouse / base.py**](https://github.com/cloudflare/sqlalchemy-clickhouse/blob/master/././base.py) + +```python +# base.py + +import re + +import sqlalchemy.types as sqltypes +from sqlalchemy import exc as sa_exc +from sqlalchemy import util as sa_util +from sqlalchemy.engine import default, reflection +from sqlalchemy.sql import compiler, expression +from sqlalchemy.sql.elements import quoted_name +~~from sqlalchemy.dialects.postgresql.base import PGCompiler, PGIdentifierPreparer +from sqlalchemy.types import ( + CHAR, DATE, DATETIME, INTEGER, SMALLINT, BIGINT, DECIMAL, TIME, + TIMESTAMP, VARCHAR, BINARY, BOOLEAN, FLOAT, REAL) + +VERSION = (0, 1, 0, None) + +colspecs = {} + +class ARRAY(sqltypes.TypeEngine): + __visit_name__ = 'ARRAY' + +ischema_names = { + 'Int64': INTEGER, + 'Int32': INTEGER, + 'Int16': INTEGER, + 'Int8': INTEGER, + 'UInt64': INTEGER, + 'UInt32': INTEGER, + 'UInt16': INTEGER, + 'UInt8': INTEGER, + 'Date': DATE, + 'DateTime': DATETIME, + 'Float64': FLOAT, + 'Float32': FLOAT, + 'String': VARCHAR, + 'FixedString': VARCHAR, + 'Enum': VARCHAR, + 'Enum8': VARCHAR, + 'Enum16': VARCHAR, + 'Array': ARRAY, +} + +~~class ClickHouseIdentifierPreparer(PGIdentifierPreparer): + def quote_identifier(self, value): + return self._escape_identifier(value) + def quote(self, ident, force=None): + if self._requires_quotes(ident): + return '"{}"'.format(ident) + return ident + +class ClickHouseCompiler(PGCompiler): + def visit_count_func(self, fn, **kw): + return 'count{0}'.format(self.process(fn.clause_expr, **kw)) + + def visit_random_func(self, fn, **kw): + return 'rand()' + + def visit_now_func(self, fn, **kw): + return 'now()' + + def visit_current_date_func(self, fn, **kw): + return 'today()' + + def visit_true(self, element, **kw): + return '1' + + def visit_false(self, element, **kw): + + +## ... source file continues with no further PGIdentifierPreparer examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown index f9634cf36..a86f52af2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.dialects.postgresql.base PGTypeCompiler Example Code category: page slug: sqlalchemy-dialects-postgresql-base-pgtypecompiler-examples -sortorder: 500031015 +sortorder: 500031017 toc: False sidebartitle: sqlalchemy.dialects.postgresql.base PGTypeCompiler -meta: Python example code for the PGTypeCompiler class from the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. +meta: Example code for understanding how to use the PGTypeCompiler class from the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. PGTypeCompiler is a class within the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown index 563255959..f6ca406f7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-postgresql-bigint-examples sortorder: 500031007 toc: False sidebartitle: sqlalchemy.dialects.postgresql BIGINT -meta: Python example code for the BIGINT constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code that shows how to use the BIGINT constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. BIGINT is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown index 40bbd9d70..c24bb7f98 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-postgresql-bit-examples sortorder: 500031008 toc: False sidebartitle: sqlalchemy.dialects.postgresql BIT -meta: Python example code for the BIT constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code that shows how to use the BIT constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. BIT is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown index d48b4fe7d..6d5a121e1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown @@ -4,13 +4,77 @@ slug: sqlalchemy-dialects-postgresql-double-precision-examples sortorder: 500031009 toc: False sidebartitle: sqlalchemy.dialects.postgresql DOUBLE_PRECISION -meta: Python example code for the DOUBLE_PRECISION constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code that shows how to use the DOUBLE_PRECISION constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. DOUBLE_PRECISION is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -## Example 1 from GeoAlchemy2 +## Example 1 from Amazon Redshift SQLAlchemy Dialect +[Amazon Redshift SQLAlchemy Dialect](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +that can communicate with the [AWS Redshift](https://aws.amazon.com/redshift/) +data store. The SQL is essentially [PostgreSQL](/postgresql.html) +and requires [psycopg2](https://www.psycopg.org/) to properly +operate. This project and its code are open sourced under the +[MIT license](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/LICENSE). + +[**Amazon Redshift SQLAlchemy Dialect / sqlalchemy_redshift / dialect.py**](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/sqlalchemy_redshift/./dialect.py) + +```python +# dialect.py +import re +from collections import defaultdict, namedtuple + +from packaging.version import Version +import pkg_resources +import sqlalchemy as sa +from sqlalchemy import inspect +from sqlalchemy.dialects.postgresql.base import ( + PGCompiler, PGDDLCompiler, PGIdentifierPreparer, PGTypeCompiler +) +from sqlalchemy.dialects.postgresql.psycopg2 import PGDialect_psycopg2 +from sqlalchemy.engine import reflection +from sqlalchemy.ext.compiler import compiles +from sqlalchemy.sql.expression import ( + BinaryExpression, BooleanClauseList, Delete +) +from sqlalchemy.types import ( + VARCHAR, NullType, SMALLINT, INTEGER, BIGINT, + DECIMAL, REAL, BOOLEAN, CHAR, DATE, TIMESTAMP) +~~from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION + +from .commands import ( + CopyCommand, UnloadFromSelect, Format, Compression, Encoding, + CreateLibraryCommand, AlterTableAppendCommand, RefreshMaterializedView +) +from .ddl import ( + CreateMaterializedView, DropMaterializedView, get_table_attributes +) + +sa_version = Version(sa.__version__) + +try: + import alembic +except ImportError: + pass +else: + from alembic.ddl import postgresql + + from alembic.ddl.base import RenameTable + compiles(RenameTable, 'redshift')(postgresql.visit_rename_table) + + if Version(alembic.__version__) >= Version('1.0.6'): + from alembic.ddl.base import ColumnComment + compiles(ColumnComment, 'redshift')(postgresql.visit_column_comment) + + +## ... source file continues with no further DOUBLE_PRECISION examples... + +``` + + +## Example 2 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) ([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown index 46e524771..b6237a3da 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-postgresql-excludeconstraint-examples sortorder: 500031010 toc: False sidebartitle: sqlalchemy.dialects.postgresql ExcludeConstraint -meta: Python example code for the ExcludeConstraint class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Example code for understanding how to use the ExcludeConstraint class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. ExcludeConstraint is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown index 599e862d0..244c0f4d8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-postgresql-integer-examples sortorder: 500031011 toc: False sidebartitle: sqlalchemy.dialects.postgresql INTEGER -meta: Python example code for the INTEGER constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code that shows how to use the INTEGER constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. INTEGER is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown index 4e61ccf3c..6baa29581 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-postgresql-json-examples sortorder: 500031012 toc: False sidebartitle: sqlalchemy.dialects.postgresql JSON -meta: Python example code for the JSON constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code that shows how to use the JSON constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. JSON is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown index 0a2e98a45..5f9f7bb86 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown @@ -1,16 +1,71 @@ title: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 Example Code category: page slug: sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2-examples -sortorder: 500031016 +sortorder: 500031018 toc: False sidebartitle: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 -meta: Python example code for the PGDialect_psycopg2 class from the sqlalchemy.dialects.postgresql.psycopg2 module of the SQLAlchemy project. +meta: Example code for understanding how to use the PGDialect_psycopg2 class from the sqlalchemy.dialects.postgresql.psycopg2 module of the SQLAlchemy project. PGDialect_psycopg2 is a class within the sqlalchemy.dialects.postgresql.psycopg2 module of the SQLAlchemy project. -## Example 1 from databases +## Example 1 from Amazon Redshift SQLAlchemy Dialect +[Amazon Redshift SQLAlchemy Dialect](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +that can communicate with the [AWS Redshift](https://aws.amazon.com/redshift/) +data store. The SQL is essentially [PostgreSQL](/postgresql.html) +and requires [psycopg2](https://www.psycopg.org/) to properly +operate. This project and its code are open sourced under the +[MIT license](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/LICENSE). + +[**Amazon Redshift SQLAlchemy Dialect / sqlalchemy_redshift / dialect.py**](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/sqlalchemy_redshift/./dialect.py) + +```python +# dialect.py +import re +from collections import defaultdict, namedtuple + +from packaging.version import Version +import pkg_resources +import sqlalchemy as sa +from sqlalchemy import inspect +from sqlalchemy.dialects.postgresql.base import ( + PGCompiler, PGDDLCompiler, PGIdentifierPreparer, PGTypeCompiler +) +~~from sqlalchemy.dialects.postgresql.psycopg2 import PGDialect_psycopg2 +from sqlalchemy.engine import reflection +from sqlalchemy.ext.compiler import compiles +from sqlalchemy.sql.expression import ( + BinaryExpression, BooleanClauseList, Delete +) +from sqlalchemy.types import ( + VARCHAR, NullType, SMALLINT, INTEGER, BIGINT, + DECIMAL, REAL, BOOLEAN, CHAR, DATE, TIMESTAMP) +from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION + +from .commands import ( + CopyCommand, UnloadFromSelect, Format, Compression, Encoding, + CreateLibraryCommand, AlterTableAppendCommand, RefreshMaterializedView +) +from .ddl import ( + CreateMaterializedView, DropMaterializedView, get_table_attributes +) + +sa_version = Version(sa.__version__) + +try: + import alembic +except ImportError: + pass + + +## ... source file continues with no further PGDialect_psycopg2 examples... + +``` + + +## Example 2 from databases [databases](https://github.com/encode/databases) ([project homepage](https://www.encode.io/databases/) and @@ -90,7 +145,7 @@ class AiopgBackend(DatabaseBackend): ``` -## Example 2 from sqlalchemy-utils +## Example 3 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown index b06dd82cd..b87369a27 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-postgresql-pypostgresql-examples sortorder: 500031014 toc: False sidebartitle: sqlalchemy.dialects.postgresql pypostgresql -meta: Python example code for the pypostgresql callable from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code that shows how to use the pypostgresql callable from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. pypostgresql is a callable within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown index 4bfa245cc..568ea8a21 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-postgresql-tsvector-examples sortorder: 500031013 toc: False sidebartitle: sqlalchemy.dialects.postgresql TSVECTOR -meta: Python example code for the TSVECTOR constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +meta: Python example code that shows how to use the TSVECTOR constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. TSVECTOR is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown index 995ca4bc7..9b2103d1d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-postgresql-examples sortorder: 500031003 toc: False sidebartitle: sqlalchemy.dialects postgresql -meta: Python example code for the postgresql callable from the sqlalchemy.dialects module of the SQLAlchemy project. +meta: Python example code that shows how to use the postgresql callable from the sqlalchemy.dialects module of the SQLAlchemy project. postgresql is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown index a10c3a486..ca6a76ac7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.dialects.sqlite pysqlite Example Code category: page slug: sqlalchemy-dialects-sqlite-pysqlite-examples -sortorder: 500031017 +sortorder: 500031019 toc: False sidebartitle: sqlalchemy.dialects.sqlite pysqlite -meta: Python example code for the pysqlite callable from the sqlalchemy.dialects.sqlite module of the SQLAlchemy project. +meta: Python example code that shows how to use the pysqlite callable from the sqlalchemy.dialects.sqlite module of the SQLAlchemy project. pysqlite is a callable within the sqlalchemy.dialects.sqlite module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown index caa7fa69b..2f385a5b7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown @@ -4,7 +4,7 @@ slug: sqlalchemy-dialects-sqlite-examples sortorder: 500031004 toc: False sidebartitle: sqlalchemy.dialects sqlite -meta: Python example code for the sqlite callable from the sqlalchemy.dialects module of the SQLAlchemy project. +meta: Python example code that shows how to use the sqlite callable from the sqlalchemy.dialects module of the SQLAlchemy project. sqlite is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown index baec53d01..de0c2247f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine Connection Example Code category: page slug: sqlalchemy-engine-connection-examples -sortorder: 500031018 +sortorder: 500031020 toc: False sidebartitle: sqlalchemy.engine Connection -meta: Python example code for the Connection class from the sqlalchemy.engine module of the SQLAlchemy project. +meta: Example code for understanding how to use the Connection class from the sqlalchemy.engine module of the SQLAlchemy project. Connection is a class within the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown index eca0d1810..e396cb4a0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine create_engine Example Code category: page slug: sqlalchemy-engine-create-engine-examples -sortorder: 500031020 +sortorder: 500031022 toc: False sidebartitle: sqlalchemy.engine create_engine -meta: Python example code for the create_engine callable from the sqlalchemy.engine module of the SQLAlchemy project. +meta: Python example code that shows how to use the create_engine callable from the sqlalchemy.engine module of the SQLAlchemy project. create_engine is a callable within the sqlalchemy.engine module of the SQLAlchemy project. @@ -79,6 +79,47 @@ def main(): +## ... source file continues with no further create_engine examples... + +``` + + +## Example 2 from sqlalchemy-clickhouse +[sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +for communicating with the open source [ClickHouse](https://clickhouse.tech/) +database management system. ClickHouse is column-oriented and therefore +better for some use cases and worse for others compared to a traditional +[relational database](/databases.html). + +The code for this project is open sourced under the +[MIT license](https://github.com/cloudflare/sqlalchemy-clickhouse/blob/master/LICENSE.txt) +while ClickHouse is provided as open source under the +[Apache License 2.0](https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE). + +[**sqlalchemy-clickhouse / example.py**](https://github.com/cloudflare/sqlalchemy-clickhouse/blob/master/././example.py) + +```python +# example.py + +import connector +cursor = connector.connect('default').cursor() +cursor.execute('SELECT * FROM test LIMIT 10') +print(cursor.fetchone()) + +from sqlalchemy.dialects import registry +registry.register("clickhouse", "base", "dialect") + +from sqlalchemy import * +~~from sqlalchemy.engine import create_engine +from sqlalchemy.schema import * + +~~engine = create_engine('clickhouse://default:@localhost:8123/default') +logs = Table('test', MetaData(bind=engine), autoload=True) +print(select([func.count('*')], from_obj=logs).scalar()) + + + ## ... source file continues with no further create_engine examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown index fdaa0f82a..9bcc448f8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine.default DefaultDialect Example Code category: page slug: sqlalchemy-engine-default-defaultdialect-examples -sortorder: 500031023 +sortorder: 500031025 toc: False sidebartitle: sqlalchemy.engine.default DefaultDialect -meta: Python example code for the DefaultDialect class from the sqlalchemy.engine.default module of the SQLAlchemy project. +meta: Example code for understanding how to use the DefaultDialect class from the sqlalchemy.engine.default module of the SQLAlchemy project. DefaultDialect is a class within the sqlalchemy.engine.default module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown index 507d1f16b..54fbae7d4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine default Example Code category: page slug: sqlalchemy-engine-default-examples -sortorder: 500031021 +sortorder: 500031023 toc: False sidebartitle: sqlalchemy.engine default -meta: Python example code for the default callable from the sqlalchemy.engine module of the SQLAlchemy project. +meta: Python example code that shows how to use the default callable from the sqlalchemy.engine module of the SQLAlchemy project. default is a callable within the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown index 5749c7fd8..d00076add 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine Engine Example Code category: page slug: sqlalchemy-engine-engine-examples -sortorder: 500031019 +sortorder: 500031021 toc: False sidebartitle: sqlalchemy.engine Engine -meta: Python example code for the Engine class from the sqlalchemy.engine module of the SQLAlchemy project. +meta: Example code for understanding how to use the Engine class from the sqlalchemy.engine module of the SQLAlchemy project. Engine is a class within the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown index 42a96b79b..a72ddfe2e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine.interfaces ExecutionContext Example Code category: page slug: sqlalchemy-engine-interfaces-executioncontext-examples -sortorder: 500031024 +sortorder: 500031026 toc: False sidebartitle: sqlalchemy.engine.interfaces ExecutionContext -meta: Python example code for the ExecutionContext class from the sqlalchemy.engine.interfaces module of the SQLAlchemy project. +meta: Example code for understanding how to use the ExecutionContext class from the sqlalchemy.engine.interfaces module of the SQLAlchemy project. ExecutionContext is a class within the sqlalchemy.engine.interfaces module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown index 6ab20bccd..b9c859170 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine.result ResultMetaData Example Code category: page slug: sqlalchemy-engine-result-resultmetadata-examples -sortorder: 500031025 +sortorder: 500031027 toc: False sidebartitle: sqlalchemy.engine.result ResultMetaData -meta: Python example code for the ResultMetaData class from the sqlalchemy.engine.result module of the SQLAlchemy project. +meta: Example code for understanding how to use the ResultMetaData class from the sqlalchemy.engine.result module of the SQLAlchemy project. ResultMetaData is a class within the sqlalchemy.engine.result module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown index f35b67cbb..e793308a3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine.result RowProxy Example Code category: page slug: sqlalchemy-engine-result-rowproxy-examples -sortorder: 500031026 +sortorder: 500031028 toc: False sidebartitle: sqlalchemy.engine.result RowProxy -meta: Python example code for the RowProxy class from the sqlalchemy.engine.result module of the SQLAlchemy project. +meta: Example code for understanding how to use the RowProxy class from the sqlalchemy.engine.result module of the SQLAlchemy project. RowProxy is a class within the sqlalchemy.engine.result module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown index b4ccd11c8..30e3bc748 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine.strategies EngineStrategy Example Code category: page slug: sqlalchemy-engine-strategies-enginestrategy-examples -sortorder: 500031027 +sortorder: 500031029 toc: False sidebartitle: sqlalchemy.engine.strategies EngineStrategy -meta: Python example code for the EngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. +meta: Example code for understanding how to use the EngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. EngineStrategy is a class within the sqlalchemy.engine.strategies module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown index 055a1b334..264cea593 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine.strategies MockEngineStrategy Example Code category: page slug: sqlalchemy-engine-strategies-mockenginestrategy-examples -sortorder: 500031028 +sortorder: 500031030 toc: False sidebartitle: sqlalchemy.engine.strategies MockEngineStrategy -meta: Python example code for the MockEngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. +meta: Example code for understanding how to use the MockEngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. MockEngineStrategy is a class within the sqlalchemy.engine.strategies module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown index d12f54f3b..04551b10e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine.url make_url Example Code category: page slug: sqlalchemy-engine-url-make-url-examples -sortorder: 500031029 +sortorder: 500031031 toc: False sidebartitle: sqlalchemy.engine.url make_url -meta: Python example code for the make_url callable from the sqlalchemy.engine.url module of the SQLAlchemy project. +meta: Python example code that shows how to use the make_url callable from the sqlalchemy.engine.url module of the SQLAlchemy project. make_url is a callable within the sqlalchemy.engine.url module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown index f30270bd3..c20f68c59 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.engine url Example Code category: page slug: sqlalchemy-engine-url-examples -sortorder: 500031022 +sortorder: 500031024 toc: False sidebartitle: sqlalchemy.engine url -meta: Python example code for the url callable from the sqlalchemy.engine module of the SQLAlchemy project. +meta: Python example code that shows how to use the url callable from the sqlalchemy.engine module of the SQLAlchemy project. url is a callable within the sqlalchemy.engine module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown index 9356d274d..75a4f2bb9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.events SchemaEventTarget Example Code category: page slug: sqlalchemy-events-schemaeventtarget-examples -sortorder: 500031030 +sortorder: 500031032 toc: False sidebartitle: sqlalchemy.events SchemaEventTarget -meta: Python example code for the SchemaEventTarget class from the sqlalchemy.events module of the SQLAlchemy project. +meta: Example code for understanding how to use the SchemaEventTarget class from the sqlalchemy.events module of the SQLAlchemy project. SchemaEventTarget is a class within the sqlalchemy.events module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown index 97b212777..1562f416b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown @@ -27,6 +27,17 @@ The project is open sourced under the [BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). +### indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management that is +powered by [SQLAlchemy](/sqlalchemy.html) on the backend. The code +for this project is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + + ### sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown index 9d59ed5ed..564720f99 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.exc ArgumentError Example Code category: page slug: sqlalchemy-exc-argumenterror-examples -sortorder: 500031031 +sortorder: 500031033 toc: False sidebartitle: sqlalchemy.exc ArgumentError -meta: Python example code for the ArgumentError class from the sqlalchemy.exc module of the SQLAlchemy project. +meta: Example code for understanding how to use the ArgumentError class from the sqlalchemy.exc module of the SQLAlchemy project. ArgumentError is a class within the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown new file mode 100644 index 000000000..034e275dc --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown @@ -0,0 +1,124 @@ +title: sqlalchemy.exc DatabaseError Example Code +category: page +slug: sqlalchemy-exc-databaseerror-examples +sortorder: 500031035 +toc: False +sidebartitle: sqlalchemy.exc DatabaseError +meta: Example code for understanding how to use the DatabaseError class from the sqlalchemy.exc module of the SQLAlchemy project. + + +DatabaseError is a class within the sqlalchemy.exc module of the SQLAlchemy project. + + +## Example 1 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management that is +powered by [SQLAlchemy](/sqlalchemy.html) on the backend. The code +for this project is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / web / rh.py**](https://github.com/indico/indico/blob/master/indico/web/rh.py) + +```python +# rh.py + +from __future__ import absolute_import, unicode_literals + +import cProfile +import inspect +import itertools +import os +import time +from functools import partial, wraps + +import jsonschema +from flask import current_app, g, redirect, request, session +~~from sqlalchemy.exc import DatabaseError +from sqlalchemy.orm.exc import NoResultFound +from werkzeug.exceptions import BadRequest, Forbidden, MethodNotAllowed, NotFound +from werkzeug.routing import BuildError +from werkzeug.wrappers import Response + +from indico.core import signals +from indico.core.config import config +from indico.core.db import db +from indico.core.db.sqlalchemy.core import handle_sqlalchemy_database_error +from indico.core.logger import Logger, sentry_set_tags +from indico.core.notifications import flush_email_queue, init_email_queue +from indico.util import fossilize +from indico.util.i18n import _ +from indico.util.locators import get_locator +from indico.util.signals import values_from_signal +from indico.web.flask.util import url_for +from indico.web.util import is_signed_url_valid + + +HTTP_VERBS = {'GET', 'PATCH', 'POST', 'PUT', 'DELETE'} +logger = Logger.get('rh') + + +class RH(object): + + +## ... source file abbreviated to get to DatabaseError examples ... + + + if request.method not in HTTP_VERBS: + raise BadRequest + + res = '' + g.rh = self + sentry_set_tags({'rh': self.__class__.__name__}) + + if self.EVENT_FEATURE is not None: + self._check_event_feature() + + logger.info('%s %s [IP=%s] [PID=%s] [UID=%r]', + request.method, request.relative_url, request.remote_addr, os.getpid(), session.get('_user_id')) + + try: + fossilize.clearCache() + init_email_queue() + self._check_csrf() + res = self._do_process() + signals.after_process.send() + + if self.commit: + db.session.commit() + flush_email_queue() + else: + db.session.rollback() +~~ except DatabaseError: + db.session.rollback() + handle_sqlalchemy_database_error() # this will re-raise an exception + except Exception: + db.session.rollback() + raise + logger.debug('Request successful') + + if res is None: + res = '' + + response = current_app.make_response(res) + if self.DENY_FRAMES: + response.headers['X-Frame-Options'] = 'DENY' + return response + + +class RHSimple(RH): + def __init__(self, func): + RH.__init__(self) + self.func = func + + def _process(self): + rv = self.func() + return rv + + +## ... source file continues with no further DatabaseError examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown index 20ac0bf3b..692819820 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.exc DataError Example Code category: page slug: sqlalchemy-exc-dataerror-examples -sortorder: 500031032 +sortorder: 500031034 toc: False sidebartitle: sqlalchemy.exc DataError -meta: Python example code for the DataError class from the sqlalchemy.exc module of the SQLAlchemy project. +meta: Example code for understanding how to use the DataError class from the sqlalchemy.exc module of the SQLAlchemy project. DataError is a class within the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown index 66619ea93..91984a2ad 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.exc IntegrityError Example Code category: page slug: sqlalchemy-exc-integrityerror-examples -sortorder: 500031033 +sortorder: 500031036 toc: False sidebartitle: sqlalchemy.exc IntegrityError -meta: Python example code for the IntegrityError class from the sqlalchemy.exc module of the SQLAlchemy project. +meta: Example code for understanding how to use the IntegrityError class from the sqlalchemy.exc module of the SQLAlchemy project. IntegrityError is a class within the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown index 3d4261bf3..5b779f838 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.exc InvalidRequestError Example Code category: page slug: sqlalchemy-exc-invalidrequesterror-examples -sortorder: 500031034 +sortorder: 500031037 toc: False sidebartitle: sqlalchemy.exc InvalidRequestError -meta: Python example code for the InvalidRequestError class from the sqlalchemy.exc module of the SQLAlchemy project. +meta: Example code for understanding how to use the InvalidRequestError class from the sqlalchemy.exc module of the SQLAlchemy project. InvalidRequestError is a class within the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown index 1b568e864..83ad32b6b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.exc NoInspectionAvailable Example Code category: page slug: sqlalchemy-exc-noinspectionavailable-examples -sortorder: 500031035 +sortorder: 500031038 toc: False sidebartitle: sqlalchemy.exc NoInspectionAvailable -meta: Python example code for the NoInspectionAvailable class from the sqlalchemy.exc module of the SQLAlchemy project. +meta: Example code for understanding how to use the NoInspectionAvailable class from the sqlalchemy.exc module of the SQLAlchemy project. NoInspectionAvailable is a class within the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown index 178d7dd68..1f008e756 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown @@ -1,16 +1,88 @@ title: sqlalchemy.exc OperationalError Example Code category: page slug: sqlalchemy-exc-operationalerror-examples -sortorder: 500031036 +sortorder: 500031039 toc: False sidebartitle: sqlalchemy.exc OperationalError -meta: Python example code for the OperationalError class from the sqlalchemy.exc module of the SQLAlchemy project. +meta: Example code for understanding how to use the OperationalError class from the sqlalchemy.exc module of the SQLAlchemy project. OperationalError is a class within the sqlalchemy.exc module of the SQLAlchemy project. -## Example 1 from sqlalchemy-utils +## Example 1 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management that is +powered by [SQLAlchemy](/sqlalchemy.html) on the backend. The code +for this project is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / web / errors.py**](https://github.com/indico/indico/blob/master/indico/web/errors.py) + +```python +# errors.py + +from __future__ import absolute_import, unicode_literals + +import traceback +from uuid import uuid4 + +from flask import g, jsonify, render_template, request, session +from itsdangerous import BadData +~~from sqlalchemy.exc import OperationalError +from werkzeug.exceptions import Forbidden, HTTPException + +from indico.core.errors import NoReportError +from indico.legacy.common.cache import GenericCache +from indico.web.util import get_request_info +from indico.web.views import WPError + + +def render_error(exc, title, message, code, standalone=False): + _save_error(exc, title, message) + if _need_json_response(): + return _jsonify_error(exc, title, message, code) + elif standalone: + return render_template('standalone_error.html', error_message=title, error_description=message), code + else: + try: + return WPError(title, message).getHTML(), code +~~ except OperationalError: + return render_error(exc, title, message, code, standalone=True) + + +def load_error_data(uuid): + return GenericCache('errors').get(uuid) + + +def _save_error(exc, title, message): + if 'saved_error_uuid' in g: + return + if not _is_error_reportable(exc): + return + g.saved_error_uuid = uuid = unicode(uuid4()) + tb = traceback.format_exc() + data = {'title': title, + 'message': message, + 'request_info': get_request_info(), + 'traceback': tb, + 'sentry_event_id': g.get('sentry_event_id')} + GenericCache('errors').set(uuid, data, 7200) + + +def _need_json_response(): + return request.is_xhr or request.is_json + + +## ... source file continues with no further OperationalError examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown index b4dd29d2a..b3e07262a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.exc ProgrammingError Example Code category: page slug: sqlalchemy-exc-programmingerror-examples -sortorder: 500031037 +sortorder: 500031040 toc: False sidebartitle: sqlalchemy.exc ProgrammingError -meta: Python example code for the ProgrammingError class from the sqlalchemy.exc module of the SQLAlchemy project. +meta: Example code for understanding how to use the ProgrammingError class from the sqlalchemy.exc module of the SQLAlchemy project. ProgrammingError is a class within the sqlalchemy.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown index cc1f10909..78c9da3ae 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.ext.automap automap_base Example Code category: page slug: sqlalchemy-ext-automap-automap-base-examples -sortorder: 500031039 +sortorder: 500031042 toc: False sidebartitle: sqlalchemy.ext.automap automap_base -meta: Python example code for the automap_base callable from the sqlalchemy.ext.automap module of the SQLAlchemy project. +meta: Python example code that shows how to use the automap_base callable from the sqlalchemy.ext.automap module of the SQLAlchemy project. automap_base is a callable within the sqlalchemy.ext.automap module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown index e50ef4d6c..61c7a8c77 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.ext.compiler compiles Example Code category: page slug: sqlalchemy-ext-compiler-compiles-examples -sortorder: 500031040 +sortorder: 500031043 toc: False sidebartitle: sqlalchemy.ext.compiler compiles -meta: Python example code for the compiles callable from the sqlalchemy.ext.compiler module of the SQLAlchemy project. +meta: Python example code that shows how to use the compiles callable from the sqlalchemy.ext.compiler module of the SQLAlchemy project. compiles is a callable within the sqlalchemy.ext.compiler module of the SQLAlchemy project. @@ -125,7 +125,95 @@ def _get_constraint_final_name(constraint, dialect): ``` -## Example 2 from GeoAlchemy2 +## Example 2 from Amazon Redshift SQLAlchemy Dialect +[Amazon Redshift SQLAlchemy Dialect](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +that can communicate with the [AWS Redshift](https://aws.amazon.com/redshift/) +data store. The SQL is essentially [PostgreSQL](/postgresql.html) +and requires [psycopg2](https://www.psycopg.org/) to properly +operate. This project and its code are open sourced under the +[MIT license](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/LICENSE). + +[**Amazon Redshift SQLAlchemy Dialect / sqlalchemy_redshift / dialect.py**](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/sqlalchemy_redshift/./dialect.py) + +```python +# dialect.py +import re +from collections import defaultdict, namedtuple + +from packaging.version import Version +import pkg_resources +import sqlalchemy as sa +from sqlalchemy import inspect +from sqlalchemy.dialects.postgresql.base import ( + PGCompiler, PGDDLCompiler, PGIdentifierPreparer, PGTypeCompiler +) +from sqlalchemy.dialects.postgresql.psycopg2 import PGDialect_psycopg2 +from sqlalchemy.engine import reflection +~~from sqlalchemy.ext.compiler import compiles +from sqlalchemy.sql.expression import ( + BinaryExpression, BooleanClauseList, Delete +) +from sqlalchemy.types import ( + VARCHAR, NullType, SMALLINT, INTEGER, BIGINT, + DECIMAL, REAL, BOOLEAN, CHAR, DATE, TIMESTAMP) +from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION + +from .commands import ( + CopyCommand, UnloadFromSelect, Format, Compression, Encoding, + CreateLibraryCommand, AlterTableAppendCommand, RefreshMaterializedView +) +from .ddl import ( + CreateMaterializedView, DropMaterializedView, get_table_attributes +) + +sa_version = Version(sa.__version__) + +try: + import alembic +except ImportError: + pass +else: + from alembic.ddl import postgresql + + from alembic.ddl.base import RenameTable +~~ compiles(RenameTable, 'redshift')(postgresql.visit_rename_table) + + if Version(alembic.__version__) >= Version('1.0.6'): + from alembic.ddl.base import ColumnComment +~~ compiles(ColumnComment, 'redshift')(postgresql.visit_column_comment) + + class RedshiftImpl(postgresql.PostgresqlImpl): + __dialect__ = 'redshift' + +__all__ = ( + 'SMALLINT', + 'INTEGER', + 'BIGINT', + 'DECIMAL', + 'REAL', + 'BOOLEAN', + 'CHAR', + 'DATE', + 'TIMESTAMP', + 'VARCHAR', + 'DOUBLE_PRECISION', + 'TIMESTAMPTZ', + + 'CopyCommand', 'UnloadFromSelect', 'RedshiftDialect', 'Compression', + 'Encoding', 'Format', 'CreateLibraryCommand', 'AlterTableAppendCommand', + 'RefreshMaterializedView', + + 'CreateMaterializedView', 'DropMaterializedView' +) + + +## ... source file continues with no further compiles examples... + +``` + + +## Example 3 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) ([project documentation](https://geoalchemy-2.readthedocs.io/en/latest/) and @@ -270,7 +358,7 @@ class GenericFunction(functions.GenericFunction): ``` -## Example 3 from sqlalchemy-utils +## Example 4 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown index c720fd8c1..4c19129ba 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown @@ -1,16 +1,196 @@ title: sqlalchemy.ext compiler Example Code category: page slug: sqlalchemy-ext-compiler-examples -sortorder: 500031038 +sortorder: 500031041 toc: False sidebartitle: sqlalchemy.ext compiler -meta: Python example code for the compiler callable from the sqlalchemy.ext module of the SQLAlchemy project. +meta: Python example code that shows how to use the compiler callable from the sqlalchemy.ext module of the SQLAlchemy project. compiler is a callable within the sqlalchemy.ext module of the SQLAlchemy project. -## Example 1 from sqlalchemy-utils +## Example 1 from Amazon Redshift SQLAlchemy Dialect +[Amazon Redshift SQLAlchemy Dialect](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +that can communicate with the [AWS Redshift](https://aws.amazon.com/redshift/) +data store. The SQL is essentially [PostgreSQL](/postgresql.html) +and requires [psycopg2](https://www.psycopg.org/) to properly +operate. This project and its code are open sourced under the +[MIT license](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/LICENSE). + +[**Amazon Redshift SQLAlchemy Dialect / sqlalchemy_redshift / commands.py**](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/sqlalchemy_redshift/./commands.py) + +```python +# commands.py +import enum +import numbers +import re +import warnings +try: + from collections.abc import Iterable +except ImportError: + from collections import Iterable + +import sqlalchemy as sa +from sqlalchemy import exc as sa_exc +~~from sqlalchemy.ext import compiler as sa_compiler +from sqlalchemy.sql import expression as sa_expression + + + +ACCESS_KEY_ID_RE = re.compile('[A-Z0-9]{20}') +SECRET_ACCESS_KEY_RE = re.compile('[A-Za-z0-9/+=]{40}') +TOKEN_RE = re.compile('[A-Za-z0-9/+=]+') +AWS_ACCOUNT_ID_RE = re.compile('[0-9]{12}') +IAM_ROLE_NAME_RE = re.compile('[A-Za-z0-9+=,.@-_]{1,64}') + + +def _process_aws_credentials(access_key_id=None, secret_access_key=None, + session_token=None, aws_account_id=None, + iam_role_name=None): + + if (access_key_id is not None and secret_access_key is not None and + aws_account_id is not None and iam_role_name is not None): + raise TypeError( + 'Either access key based credentials or role based credentials ' + 'should be specified, but not both' + ) + + credentials = None + + + +## ... source file abbreviated to get to compiler examples ... + + + if ignore_extra and fill_target: + raise ValueError( + '"ignore_extra" cannot be used with "fill_target".') + + self.source = source + self.target = target + self.ignore_extra = ignore_extra + self.fill_target = fill_target + + +@sa_compiler.compiles(AlterTableAppendCommand) +def visit_alter_table_append_command(element, compiler, **kw): + if element.ignore_extra: + fill_option = 'IGNOREEXTRA' + elif element.fill_target: + fill_option = 'FILLTARGET' + else: + fill_option = '' + + query_text = \ + 'ALTER TABLE {target} APPEND FROM {source} {fill_option}'.format( +~~ target=compiler.preparer.format_table(element.target), +~~ source=compiler.preparer.format_table(element.source), + fill_option=fill_option, + ) +~~ return compiler.process(sa.text(query_text), **kw) + + +class UnloadFromSelect(_ExecutableClause): + + def __init__(self, select, unload_location, access_key_id=None, + secret_access_key=None, session_token=None, + aws_account_id=None, iam_role_name=None, + manifest=False, delimiter=None, fixed_width=None, + encrypted=False, gzip=False, add_quotes=False, null=None, + escape=False, allow_overwrite=False, parallel=True, + header=False, region=None, max_file_size=None, + format=None): + + if delimiter is not None and len(delimiter) != 1: + raise ValueError( + '"delimiter" parameter must be a single character' + ) + + if header and fixed_width is not None: + raise ValueError( + "'header' cannot be used with 'fixed_width'" + ) + + credentials = _process_aws_credentials( + + +## ... source file abbreviated to get to compiler examples ... + + + if element.max_error is not None: + parameters.append('MAXERROR AS :error_count') + bindparams.append(sa.bindparam( + 'error_count', + value=element.max_error, + type_=sa.Integer, + )) + + if element.no_load: + parameters.append('NOLOAD') + + if element.stat_update: + parameters.append('STATUPDATE ON') + elif element.stat_update is not None: + parameters.append('STATUPDATE OFF') + + if element.region is not None: + parameters.append('REGION :region') + bindparams.append(sa.bindparam( + 'region', + value=element.region, + type_=sa.String + )) + + columns = ' (%s)' % ', '.join( +~~ compiler.preparer.format_column(column) for column in element.columns + ) if element.columns else '' + + qs = qs.format( +~~ table=compiler.preparer.format_table(element.table), + columns=columns, + format=format_, + parameters='\n'.join(parameters) + ) + +~~ return compiler.process(sa.text(qs).bindparams(*bindparams), **kw) + + +class CreateLibraryCommand(_ExecutableClause): + def __init__(self, library_name, location, access_key_id=None, + secret_access_key=None, session_token=None, + aws_account_id=None, iam_role_name=None, replace=False, + region=None): + self.library_name = library_name + self.location = location + self.credentials = _process_aws_credentials( + access_key_id=access_key_id, + secret_access_key=secret_access_key, + session_token=session_token, + aws_account_id=aws_account_id, + iam_role_name=iam_role_name, + ) + self.replace = replace + self.region = region + + +@sa_compiler.compiles(CreateLibraryCommand) +def visit_create_library_command(element, compiler, **kw): + query = """ + CREATE {or_replace} LIBRARY {name} + + +class AlterTableAppendCommand(_ExecutableClause): + def __init__(self, source, target, ignore_extra=False, fill_target=False): + + +## ... source file continues with no further compiler examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown index 03167ae35..f5a2dd30e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.ext.declarative declarative_base Example Code category: page slug: sqlalchemy-ext-declarative-declarative-base-examples -sortorder: 500031042 +sortorder: 500031045 toc: False sidebartitle: sqlalchemy.ext.declarative declarative_base -meta: Python example code for the declarative_base callable from the sqlalchemy.ext.declarative module of the SQLAlchemy project. +meta: Python example code that shows how to use the declarative_base callable from the sqlalchemy.ext.declarative module of the SQLAlchemy project. declarative_base is a callable within the sqlalchemy.ext.declarative module of the SQLAlchemy project. @@ -259,7 +259,61 @@ class User(Base): ``` -## Example 4 from sandman2 +## Example 4 from SQLAlchemy Mixins +[SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) +([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) +is a collection of +[mixins](https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful) +useful for extending [SQLAlchemy](/sqlalchemy.html) and simplifying +your [database](/databases.html)-interacting code for some common +use cases. SQLAlchemy Mixins is open sourced under the +[MIT license](https://github.com/absent1706/sqlalchemy-mixins/blob/master/LICENSE.txt). + +[**SQLAlchemy Mixins / sqlalchemy_mixins / inspection.py**](https://github.com/absent1706/sqlalchemy-mixins/blob/master/sqlalchemy_mixins/./inspection.py) + +```python +# inspection.py +from sqlalchemy import inspect +~~from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method +from sqlalchemy.orm import RelationshipProperty + +from .utils import classproperty + + +~~Base = declarative_base() + + +class InspectionMixin(Base): + __abstract__ = True + + @classproperty + def columns(cls): + return inspect(cls).columns.keys() + + @classproperty + def primary_keys_full(cls): + mapper = cls.__mapper__ + return [ + mapper.get_property_by_column(column) + for column in mapper.primary_key + ] + + @classproperty + def primary_keys(cls): + return [pk.key for pk in cls.primary_keys_full] + + @classproperty + def relations(cls): + return [c.key for c in cls.__mapper__.iterate_properties + + +## ... source file continues with no further declarative_base examples... + +``` + + +## Example 5 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown index ebf097004..11fa38036 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.ext.declarative DeclarativeMeta Example Code category: page slug: sqlalchemy-ext-declarative-declarativemeta-examples -sortorder: 500031041 +sortorder: 500031044 toc: False sidebartitle: sqlalchemy.ext.declarative DeclarativeMeta -meta: Python example code for the DeclarativeMeta class from the sqlalchemy.ext.declarative module of the SQLAlchemy project. +meta: Example code for understanding how to use the DeclarativeMeta class from the sqlalchemy.ext.declarative module of the SQLAlchemy project. DeclarativeMeta is a class within the sqlalchemy.ext.declarative module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown new file mode 100644 index 000000000..217aa5483 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown @@ -0,0 +1,113 @@ +title: sqlalchemy.ext.hybrid hybrid_method Example Code +category: page +slug: sqlalchemy-ext-hybrid-hybrid-method-examples +sortorder: 500031046 +toc: False +sidebartitle: sqlalchemy.ext.hybrid hybrid_method +meta: Python example code that shows how to use the hybrid_method callable from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. + + +hybrid_method is a callable within the sqlalchemy.ext.hybrid module of the SQLAlchemy project. + + +## Example 1 from SQLAlchemy Mixins +[SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) +([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) +is a collection of +[mixins](https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful) +useful for extending [SQLAlchemy](/sqlalchemy.html) and simplifying +your [database](/databases.html)-interacting code for some common +use cases. SQLAlchemy Mixins is open sourced under the +[MIT license](https://github.com/absent1706/sqlalchemy-mixins/blob/master/LICENSE.txt). + +[**SQLAlchemy Mixins / sqlalchemy_mixins / tests / test_smartquery.py**](https://github.com/absent1706/sqlalchemy-mixins/blob/master/sqlalchemy_mixins/tests/test_smartquery.py) + +```python +# test_smartquery.py +import unittest +import datetime + +import sqlalchemy as sa +from sqlalchemy import create_engine +from sqlalchemy import event +from sqlalchemy.ext.declarative import declarative_base +~~from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method +from sqlalchemy.orm import Session +from sqlalchemy_mixins import SmartQueryMixin, smart_query +from sqlalchemy_mixins.eagerload import JOINED, SUBQUERY + +Base = declarative_base() +engine = create_engine('sqlite:///:memory:', echo=False) + +sess = Session(engine) + + +class BaseModel(Base, SmartQueryMixin): + __abstract__ = True + pass + + +class User(BaseModel): + __tablename__ = 'user' + __repr_attrs__ = ['name'] + id = sa.Column(sa.Integer, primary_key=True) + name = sa.Column(sa.String) + + posts = sa.orm.relationship('Post') + comments = sa.orm.relationship('Comment') + + +class Post(BaseModel): + __tablename__ = 'post' + id = sa.Column(sa.Integer, primary_key=True) + body = sa.Column(sa.String) + user_id = sa.Column(sa.Integer, sa.ForeignKey('user.id')) + archived = sa.Column(sa.Boolean, default=False) + + user = sa.orm.relationship('User') + comments = sa.orm.relationship('Comment') + + @hybrid_property + def public(self): + return not self.archived + + @public.expression + def public(cls): + return -cls.archived + +~~ @hybrid_method + def is_commented_by_user(cls, user, mapper=None): + mapper = mapper or cls + return mapper.comments.any(Comment.user_id == user.id) + +~~ @hybrid_method + def is_public(cls, value, mapper=None): + mapper = mapper or cls + return mapper.public == value + + +class Comment(BaseModel): + __tablename__ = 'comment' + __repr_attrs__ = ['body'] + id = sa.Column(sa.Integer, primary_key=True) + body = sa.Column(sa.String) + user_id = sa.Column(sa.Integer, sa.ForeignKey('user.id')) + post_id = sa.Column(sa.Integer, sa.ForeignKey('post.id')) + rating = sa.Column(sa.Integer) + created_at = sa.Column(sa.DateTime) + + user = sa.orm.relationship('User') + post = sa.orm.relationship('Post') + + +class BaseTest(unittest.TestCase): + def setUp(self): + sess.rollback() + + BaseModel.set_session(None) + + +## ... source file continues with no further hybrid_method examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown index 185f32fd4..fd0dc1afc 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.ext.hybrid hybrid_property Example Code category: page slug: sqlalchemy-ext-hybrid-hybrid-property-examples -sortorder: 500031043 +sortorder: 500031047 toc: False sidebartitle: sqlalchemy.ext.hybrid hybrid_property -meta: Python example code for the hybrid_property callable from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. +meta: Python example code that shows how to use the hybrid_property callable from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. hybrid_property is a callable within the sqlalchemy.ext.hybrid module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown index 5ec3212d4..6ecfaf214 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.ext.mutable Mutable Example Code category: page slug: sqlalchemy-ext-mutable-mutable-examples -sortorder: 500031044 +sortorder: 500031048 toc: False sidebartitle: sqlalchemy.ext.mutable Mutable -meta: Python example code for the Mutable class from the sqlalchemy.ext.mutable module of the SQLAlchemy project. +meta: Example code for understanding how to use the Mutable class from the sqlalchemy.ext.mutable module of the SQLAlchemy project. Mutable is a class within the sqlalchemy.ext.mutable module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index 1ab3ec1f0..1bf27f607 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -29,6 +29,16 @@ database schema changes. The Alembic project is open sourced under the [MIT license](https://github.com/sqlalchemy/alembic/blob/master/LICENSE). +### Amazon Redshift SQLAlchemy Dialect +[Amazon Redshift SQLAlchemy Dialect](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +that can communicate with the [AWS Redshift](https://aws.amazon.com/redshift/) +data store. The SQL is essentially [PostgreSQL](/postgresql.html) +and requires [psycopg2](https://www.psycopg.org/) to properly +operate. This project and its code are open sourced under the +[MIT license](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/LICENSE). + + ### flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) @@ -127,6 +137,20 @@ is open sourced under the [MIT license](https://github.com/agronholm/sqlacodegen/blob/master/LICENSE). +### sqlalchemy-clickhouse +[sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +for communicating with the open source [ClickHouse](https://clickhouse.tech/) +database management system. ClickHouse is column-oriented and therefore +better for some use cases and worse for others compared to a traditional +[relational database](/databases.html). + +The code for this project is open sourced under the +[MIT license](https://github.com/cloudflare/sqlalchemy-clickhouse/blob/master/LICENSE.txt) +while ClickHouse is provided as open source under the +[Apache License 2.0](https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE). + + ### sqlalchemy-datatables [sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) ([PyPI package information](https://pypi.org/project/sqlalchemy-datatables/)) @@ -142,6 +166,17 @@ sourced under the [MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). +### SQLAlchemy Mixins +[SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) +([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) +is a collection of +[mixins](https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful) +useful for extending [SQLAlchemy](/sqlalchemy.html) and simplifying +your [database](/databases.html)-interacting code for some common +use cases. SQLAlchemy Mixins is open sourced under the +[MIT license](https://github.com/absent1706/sqlalchemy-mixins/blob/master/LICENSE.txt). + + ### sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown index 3b4bbf54e..75b4f84c8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.inspection inspect Example Code category: page slug: sqlalchemy-inspection-inspect-examples -sortorder: 500031045 +sortorder: 500031049 toc: False sidebartitle: sqlalchemy.inspection inspect -meta: Python example code for the inspect callable from the sqlalchemy.inspection module of the SQLAlchemy project. +meta: Python example code that shows how to use the inspect callable from the sqlalchemy.inspection module of the SQLAlchemy project. inspect is a callable within the sqlalchemy.inspection module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown new file mode 100644 index 000000000..d8349fdee --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown @@ -0,0 +1,99 @@ +title: sqlalchemy.orm aliased Example Code +category: page +slug: sqlalchemy-orm-aliased-examples +sortorder: 500031056 +toc: False +sidebartitle: sqlalchemy.orm aliased +meta: Python example code that shows how to use the aliased callable from the sqlalchemy.orm module of the SQLAlchemy project. + + +aliased is a callable within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from SQLAlchemy Mixins +[SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) +([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) +is a collection of +[mixins](https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful) +useful for extending [SQLAlchemy](/sqlalchemy.html) and simplifying +your [database](/databases.html)-interacting code for some common +use cases. SQLAlchemy Mixins is open sourced under the +[MIT license](https://github.com/absent1706/sqlalchemy-mixins/blob/master/LICENSE.txt). + +[**SQLAlchemy Mixins / sqlalchemy_mixins / smartquery.py**](https://github.com/absent1706/sqlalchemy-mixins/blob/master/sqlalchemy_mixins/./smartquery.py) + +```python +# smartquery.py +try: + from typing import List +except ImportError: # pragma: no cover + pass + +from collections import OrderedDict + +import sqlalchemy +from sqlalchemy import asc, desc, inspect +~~from sqlalchemy.orm import aliased, contains_eager +from sqlalchemy.orm.util import AliasedClass +from sqlalchemy.sql import operators, extract + +from .eagerload import _flatten_schema, _eager_expr_from_flat_schema, \ + EagerLoadMixin +from .inspection import InspectionMixin +from .utils import classproperty + +RELATION_SPLITTER = '___' +OPERATOR_SPLITTER = '__' + +DESC_PREFIX = '-' + + +def _parse_path_and_make_aliases(entity, entity_path, attrs, aliases): + relations = {} + for attr in attrs: + if RELATION_SPLITTER in attr: + relation_name, nested_attr = attr.split(RELATION_SPLITTER, 1) + if relation_name in relations: + relations[relation_name].append(nested_attr) + else: + relations[relation_name] = [nested_attr] + + for relation_name, nested_attrs in relations.items(): + path = entity_path + RELATION_SPLITTER + relation_name \ + if entity_path else relation_name + if relation_name not in entity.relations: + raise KeyError("Incorrect path `{}`: " + "{} doesnt have `{}` relationship " + .format(path, entity, relation_name)) + relationship = getattr(entity, relation_name) +~~ alias = aliased(relationship.property.mapper.class_) + aliases[path] = alias, relationship + _parse_path_and_make_aliases(alias, path, nested_attrs, aliases) + + +def smart_query(query, filters=None, sort_attrs=None, schema=None): + if not filters: + filters = {} + if not sort_attrs: + sort_attrs = [] + if not schema: + schema = {} + + root_cls = query._entity_zero().class_ # for example, User or Post + attrs = list(filters.keys()) + \ + list(map(lambda s: s.lstrip(DESC_PREFIX), sort_attrs)) + aliases = OrderedDict({}) + _parse_path_and_make_aliases(root_cls, '', attrs, aliases) + + loaded_paths = [] + for path, al in aliases.items(): + relationship_path = path.replace(RELATION_SPLITTER, '.') + query = query.outerjoin(al[0], al[1]) \ + .options(contains_eager(relationship_path, alias=al[0])) + loaded_paths.append(relationship_path) + + +## ... source file continues with no further aliased examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown new file mode 100644 index 000000000..11dfa0af4 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown @@ -0,0 +1,122 @@ +title: sqlalchemy.orm.attributes flag_modified Example Code +category: page +slug: sqlalchemy-orm-attributes-flag-modified-examples +sortorder: 500031072 +toc: False +sidebartitle: sqlalchemy.orm.attributes flag_modified +meta: Python example code that shows how to use the flag_modified callable from the sqlalchemy.orm.attributes module of the SQLAlchemy project. + + +flag_modified is a callable within the sqlalchemy.orm.attributes module of the SQLAlchemy project. + + +## Example 1 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management that is +powered by [SQLAlchemy](/sqlalchemy.html) on the backend. The code +for this project is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / core / emails.py**](https://github.com/indico/indico/blob/master/indico/core/emails.py) + +```python +# emails.py + +from __future__ import absolute_import, unicode_literals + +import cPickle +import os +import tempfile +from datetime import date + +import click +from celery.exceptions import MaxRetriesExceededError, Retry +~~from sqlalchemy.orm.attributes import flag_modified + +from indico.core.celery import celery +from indico.core.config import config +from indico.core.db import db +from indico.core.logger import Logger +from indico.util.date_time import now_utc +from indico.util.emails.backend import EmailBackend +from indico.util.emails.message import EmailMessage +from indico.util.string import truncate + + +logger = Logger.get('emails') +MAX_TRIES = 10 +DELAYS = [30, 60, 120, 300, 600, 1800, 3600, 3600, 7200] + + +@celery.task(name='send_email', bind=True, max_retries=None) +def send_email_task(task, email, log_entry=None): + attempt = task.request.retries + 1 + try: + do_send_email(email, log_entry, _from_task=True) + except Exception as exc: + delay = (DELAYS + [0])[task.request.retries] if not config.DEBUG else 1 + try: + + +## ... source file abbreviated to get to flag_modified examples ... + + + db.session.commit() + + +def do_send_email(email, log_entry=None, _from_task=False): + with EmailBackend(timeout=config.SMTP_TIMEOUT) as conn: + msg = EmailMessage(subject=email['subject'], body=email['body'], from_email=email['from'], + to=email['to'], cc=email['cc'], bcc=email['bcc'], reply_to=email['reply_to'], + attachments=email['attachments'], connection=conn) + if not msg.to: + msg.extra_headers['To'] = 'Undisclosed-recipients:;' + if email['html']: + msg.content_subtype = 'html' + msg.send() + if not _from_task: + logger.info('Sent email "%s"', truncate(email['subject'], 100)) + if log_entry: + update_email_log_state(log_entry) + + +def update_email_log_state(log_entry, failed=False): + if failed: + log_entry.data['state'] = 'failed' + else: + log_entry.data['state'] = 'sent' + log_entry.data['sent_dt'] = now_utc(False).isoformat() +~~ flag_modified(log_entry, 'data') + + +def store_failed_email(email, log_entry=None): + prefix = 'failed-email-{}-'.format(date.today().isoformat()) + fd, name = tempfile.mkstemp(prefix=prefix, dir=config.TEMP_DIR) + with os.fdopen(fd, 'wb') as f: + cPickle.dump((email, log_entry.id if log_entry else None), f) + return name + + +def resend_failed_email(path): + from indico.modules.events.logs import EventLogEntry + with open(path, 'rb') as f: + email, log_entry_id = cPickle.load(f) + log_entry = EventLogEntry.get(log_entry_id) if log_entry_id is not None else None + do_send_email(email, log_entry) + db.session.commit() + os.remove(path) + return email + + +def resend_failed_emails_cmd(paths): + for path in paths: + email = resend_failed_email(path) + + +## ... source file continues with no further flag_modified examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown index 1b02b99aa..9cdfe7d04 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown @@ -1,16 +1,85 @@ title: sqlalchemy.orm.attributes InstrumentedAttribute Example Code category: page slug: sqlalchemy-orm-attributes-instrumentedattribute-examples -sortorder: 500031064 +sortorder: 500031071 toc: False sidebartitle: sqlalchemy.orm.attributes InstrumentedAttribute -meta: Python example code for the InstrumentedAttribute class from the sqlalchemy.orm.attributes module of the SQLAlchemy project. +meta: Example code for understanding how to use the InstrumentedAttribute class from the sqlalchemy.orm.attributes module of the SQLAlchemy project. InstrumentedAttribute is a class within the sqlalchemy.orm.attributes module of the SQLAlchemy project. -## Example 1 from sqlalchemy-utils +## Example 1 from SQLAlchemy Mixins +[SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) +([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) +is a collection of +[mixins](https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful) +useful for extending [SQLAlchemy](/sqlalchemy.html) and simplifying +your [database](/databases.html)-interacting code for some common +use cases. SQLAlchemy Mixins is open sourced under the +[MIT license](https://github.com/absent1706/sqlalchemy-mixins/blob/master/LICENSE.txt). + +[**SQLAlchemy Mixins / sqlalchemy_mixins / eagerload.py**](https://github.com/absent1706/sqlalchemy-mixins/blob/master/sqlalchemy_mixins/./eagerload.py) + +```python +# eagerload.py +try: + from typing import List +except ImportError: # pragma: no cover + pass + +from sqlalchemy.orm import joinedload +from sqlalchemy.orm import subqueryload +~~from sqlalchemy.orm.attributes import InstrumentedAttribute + +from .session import SessionMixin + +JOINED = 'joined' +SUBQUERY = 'subquery' + + +def eager_expr(schema): + flat_schema = _flatten_schema(schema) + return _eager_expr_from_flat_schema(flat_schema) + + +def _flatten_schema(schema): + def _flatten(schema, parent_path, result): + for path, value in schema.items(): +~~ if isinstance(path, InstrumentedAttribute): + path = path.key + + if isinstance(value, tuple): + join_method, inner_schema = value[0], value[1] + elif isinstance(value, dict): + join_method, inner_schema = JOINED, value + else: + join_method, inner_schema = value, None + + full_path = parent_path + '.' + path if parent_path else path + result[full_path] = join_method + + if inner_schema: + _flatten(inner_schema, full_path, result) + + result = {} + _flatten(schema, '', result) + return result + + +def _eager_expr_from_flat_schema(flat_schema): + result = [] + for path, join_method in flat_schema.items(): + if join_method == JOINED: + + +## ... source file continues with no further InstrumentedAttribute examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown index 0ed35017a..19ca41d81 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm attributes Example Code category: page slug: sqlalchemy-orm-attributes-examples -sortorder: 500031050 +sortorder: 500031057 toc: False sidebartitle: sqlalchemy.orm attributes -meta: Python example code for the attributes callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the attributes callable from the sqlalchemy.orm module of the SQLAlchemy project. attributes is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown index cb335781a..cc45d0e5c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm backref Example Code category: page slug: sqlalchemy-orm-backref-examples -sortorder: 500031051 +sortorder: 500031058 toc: False sidebartitle: sqlalchemy.orm backref -meta: Python example code for the backref callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the backref callable from the sqlalchemy.orm module of the SQLAlchemy project. backref is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown index 21a44c491..db6910814 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm class_mapper Example Code category: page slug: sqlalchemy-orm-class-mapper-examples -sortorder: 500031052 +sortorder: 500031059 toc: False sidebartitle: sqlalchemy.orm class_mapper -meta: Python example code for the class_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the class_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. class_mapper is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown index 9a68bfdf8..0a09dbc6b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.collections InstrumentedList Example Code category: page slug: sqlalchemy-orm-collections-instrumentedlist-examples -sortorder: 500031065 +sortorder: 500031073 toc: False sidebartitle: sqlalchemy.orm.collections InstrumentedList -meta: Python example code for the InstrumentedList class from the sqlalchemy.orm.collections module of the SQLAlchemy project. +meta: Example code for understanding how to use the InstrumentedList class from the sqlalchemy.orm.collections module of the SQLAlchemy project. InstrumentedList is a class within the sqlalchemy.orm.collections module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown index 65b76ac1c..2bb0f42f9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm column_property Example Code category: page slug: sqlalchemy-orm-column-property-examples -sortorder: 500031053 +sortorder: 500031060 toc: False sidebartitle: sqlalchemy.orm column_property -meta: Python example code for the column_property callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the column_property callable from the sqlalchemy.orm module of the SQLAlchemy project. column_property is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown index eea0ad2a2..26e5478c8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm ColumnProperty Example Code category: page slug: sqlalchemy-orm-columnproperty-examples -sortorder: 500031046 +sortorder: 500031050 toc: False sidebartitle: sqlalchemy.orm ColumnProperty -meta: Python example code for the ColumnProperty class from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Example code for understanding how to use the ColumnProperty class from the sqlalchemy.orm module of the SQLAlchemy project. ColumnProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. @@ -163,7 +163,64 @@ def sort_argument_for_object_type( ``` -## Example 2 from sqlalchemy-utils +## Example 2 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management that is +powered by [SQLAlchemy](/sqlalchemy.html) on the backend. The code +for this project is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / core / marshmallow.py**](https://github.com/indico/indico/blob/master/indico/core/marshmallow.py) + +```python +# marshmallow.py + +from __future__ import absolute_import, unicode_literals + +from inspect import getmro + +from flask_marshmallow import Marshmallow +from flask_marshmallow.sqla import SchemaOpts +from marshmallow import fields, post_dump, post_load, pre_load +from marshmallow_enum import EnumField +from marshmallow_sqlalchemy import ModelConverter +from marshmallow_sqlalchemy import ModelSchema as MSQLAModelSchema +~~from sqlalchemy.orm import ColumnProperty +from sqlalchemy.sql.elements import Label +from webargs.flaskparser import parser as webargs_flask_parser + +from indico.core import signals +from indico.core.db.sqlalchemy import PyIntEnum, UTCDateTime +from indico.web.args import parser as indico_webargs_flask_parser + + +mm = Marshmallow() + + +def _is_column_property(prop): + return hasattr(prop, 'columns') and isinstance(prop.columns[0], Label) + + +class IndicoModelConverter(ModelConverter): + SQLA_TYPE_MAPPING = ModelConverter.SQLA_TYPE_MAPPING.copy() + SQLA_TYPE_MAPPING.update({ + UTCDateTime: fields.DateTime, + PyIntEnum: EnumField + }) + + def _get_field_kwargs_for_property(self, prop): + kwargs = super(IndicoModelConverter, self)._get_field_kwargs_for_property(prop) + + +## ... source file continues with no further ColumnProperty examples... + +``` + + +## Example 3 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown index be59de737..e3364b07f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm composite Example Code category: page slug: sqlalchemy-orm-composite-examples -sortorder: 500031054 +sortorder: 500031061 toc: False sidebartitle: sqlalchemy.orm composite -meta: Python example code for the composite callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the composite callable from the sqlalchemy.orm module of the SQLAlchemy project. composite is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown index 6080aa136..f52b468b4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm CompositeProperty Example Code category: page slug: sqlalchemy-orm-compositeproperty-examples -sortorder: 500031047 +sortorder: 500031051 toc: False sidebartitle: sqlalchemy.orm CompositeProperty -meta: Python example code for the CompositeProperty class from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Example code for understanding how to use the CompositeProperty class from the sqlalchemy.orm module of the SQLAlchemy project. CompositeProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown index 9bfe3c1ac..83693c201 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.exc NoResultFound Example Code category: page slug: sqlalchemy-orm-exc-noresultfound-examples -sortorder: 500031066 +sortorder: 500031074 toc: False sidebartitle: sqlalchemy.orm.exc NoResultFound -meta: Python example code for the NoResultFound class from the sqlalchemy.orm.exc module of the SQLAlchemy project. +meta: Example code for understanding how to use the NoResultFound class from the sqlalchemy.orm.exc module of the SQLAlchemy project. NoResultFound is a class within the sqlalchemy.orm.exc module of the SQLAlchemy project. @@ -111,7 +111,121 @@ class ORMField(OrderedType): ``` -## Example 2 from marshmallow-sqlalchemy +## Example 2 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management that is +powered by [SQLAlchemy](/sqlalchemy.html) on the backend. The code +for this project is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / web / rh.py**](https://github.com/indico/indico/blob/master/indico/web/rh.py) + +```python +# rh.py + +from __future__ import absolute_import, unicode_literals + +import cProfile +import inspect +import itertools +import os +import time +from functools import partial, wraps + +import jsonschema +from flask import current_app, g, redirect, request, session +from sqlalchemy.exc import DatabaseError +~~from sqlalchemy.orm.exc import NoResultFound +from werkzeug.exceptions import BadRequest, Forbidden, MethodNotAllowed, NotFound +from werkzeug.routing import BuildError +from werkzeug.wrappers import Response + +from indico.core import signals +from indico.core.config import config +from indico.core.db import db +from indico.core.db.sqlalchemy.core import handle_sqlalchemy_database_error +from indico.core.logger import Logger, sentry_set_tags +from indico.core.notifications import flush_email_queue, init_email_queue +from indico.util import fossilize +from indico.util.i18n import _ +from indico.util.locators import get_locator +from indico.util.signals import values_from_signal +from indico.web.flask.util import url_for +from indico.web.util import is_signed_url_valid + + +HTTP_VERBS = {'GET', 'PATCH', 'POST', 'PUT', 'DELETE'} +logger = Logger.get('rh') + + +class RH(object): + CSRF_ENABLED = True # require a csrf_token when accessing the RH with anything but GET + + +## ... source file abbreviated to get to NoResultFound examples ... + + + valid_methods = [m for m in HTTP_VERBS if hasattr(self, '_process_' + m)] + raise MethodNotAllowed(valid_methods) + return method() + + def _check_csrf(self): + token = request.headers.get('X-CSRF-Token') or request.form.get('csrf_token') + if token is None: + token = next((v for k, v in request.form.iteritems() if k.endswith('-csrf_token')), None) + if self.CSRF_ENABLED and request.method != 'GET' and token != session.csrf_token: + msg = _("It looks like there was a problem with your current session. Please use your browser's back " + "button, reload the page and try again.") + raise BadRequest(msg) + + def _check_event_feature(self): + from indico.modules.events.features.util import require_feature + event_id = request.view_args.get('confId') or request.view_args.get('event_id') + if event_id is not None: + require_feature(event_id, self.EVENT_FEATURE) + + def _do_process(self): + try: + args_result = self._process_args() + signals.rh.process_args.send(type(self), rh=self, result=args_result) + if isinstance(args_result, (current_app.response_class, Response)): + return args_result +~~ except NoResultFound: # sqlalchemy .one() not finding anything + raise NotFound(_('The specified item could not be found.')) + + rv = self.normalize_url() + if rv is not None: + return rv + + self._check_access() + signals.rh.check_access.send(type(self), rh=self) + + signal_rv = values_from_signal(signals.rh.before_process.send(type(self), rh=self), + single_value=True, as_list=True) + if signal_rv and len(signal_rv) != 1: + raise Exception('More than one signal handler returned custom RH result') + elif signal_rv: + return signal_rv[0] + + if config.PROFILE: + result = [None] + profile_path = os.path.join(config.TEMP_DIR, '{}-{}.prof'.format(type(self).__name__, time.time())) + cProfile.runctx('result[0] = self._process()', globals(), locals(), profile_path) + rv = result[0] + else: + rv = self._process() + + + +## ... source file continues with no further NoResultFound examples... + +``` + + +## Example 3 from marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) ([project documentation](https://marshmallow-sqlalchemy.readthedocs.io/en/latest/)) is a code library that makes it easier to use diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown index 73a08a82b..7e6ee5610 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.exc UnmappedClassError Example Code category: page slug: sqlalchemy-orm-exc-unmappedclasserror-examples -sortorder: 500031067 +sortorder: 500031075 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedClassError -meta: Python example code for the UnmappedClassError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. +meta: Example code for understanding how to use the UnmappedClassError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. UnmappedClassError is a class within the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown index 5791d189d..4d6ac716e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.exc UnmappedInstanceError Example Code category: page slug: sqlalchemy-orm-exc-unmappedinstanceerror-examples -sortorder: 500031068 +sortorder: 500031076 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedInstanceError -meta: Python example code for the UnmappedInstanceError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. +meta: Example code for understanding how to use the UnmappedInstanceError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. UnmappedInstanceError is a class within the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown index 45986cbcf..e9cb958c7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.interfaces MapperProperty Example Code category: page slug: sqlalchemy-orm-interfaces-mapperproperty-examples -sortorder: 500031069 +sortorder: 500031077 toc: False sidebartitle: sqlalchemy.orm.interfaces MapperProperty -meta: Python example code for the MapperProperty class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. +meta: Example code for understanding how to use the MapperProperty class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. MapperProperty is a class within the sqlalchemy.orm.interfaces module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown index e1e360fbb..c1cc40dfa 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.interfaces PropComparator Example Code category: page slug: sqlalchemy-orm-interfaces-propcomparator-examples -sortorder: 500031070 +sortorder: 500031078 toc: False sidebartitle: sqlalchemy.orm.interfaces PropComparator -meta: Python example code for the PropComparator class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. +meta: Example code for understanding how to use the PropComparator class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. PropComparator is a class within the sqlalchemy.orm.interfaces module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown index dc504cb1b..7873e2895 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm interfaces Example Code category: page slug: sqlalchemy-orm-interfaces-examples -sortorder: 500031055 +sortorder: 500031062 toc: False sidebartitle: sqlalchemy.orm interfaces -meta: Python example code for the interfaces callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the interfaces callable from the sqlalchemy.orm module of the SQLAlchemy project. interfaces is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown index 39796ecf0..9057c59aa 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm mapper Example Code category: page slug: sqlalchemy-orm-mapper-examples -sortorder: 500031056 +sortorder: 500031063 toc: False sidebartitle: sqlalchemy.orm mapper -meta: Python example code for the mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. mapper is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown index dc176d7bb..2b1359469 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm mapperlib Example Code category: page slug: sqlalchemy-orm-mapperlib-examples -sortorder: 500031057 +sortorder: 500031064 toc: False sidebartitle: sqlalchemy.orm mapperlib -meta: Python example code for the mapperlib callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the mapperlib callable from the sqlalchemy.orm module of the SQLAlchemy project. mapperlib is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown index 69670aff1..029efb31d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm object_mapper Example Code category: page slug: sqlalchemy-orm-object-mapper-examples -sortorder: 500031058 +sortorder: 500031065 toc: False sidebartitle: sqlalchemy.orm object_mapper -meta: Python example code for the object_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the object_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. object_mapper is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown index ae3b14a79..ff20dee9a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm object_session Example Code category: page slug: sqlalchemy-orm-object-session-examples -sortorder: 500031059 +sortorder: 500031066 toc: False sidebartitle: sqlalchemy.orm object_session -meta: Python example code for the object_session callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the object_session callable from the sqlalchemy.orm module of the SQLAlchemy project. object_session is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown index a8a37d0d9..69885f0a8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.properties ColumnProperty Example Code category: page slug: sqlalchemy-orm-properties-columnproperty-examples -sortorder: 500031071 +sortorder: 500031079 toc: False sidebartitle: sqlalchemy.orm.properties ColumnProperty -meta: Python example code for the ColumnProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. +meta: Example code for understanding how to use the ColumnProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. ColumnProperty is a class within the sqlalchemy.orm.properties module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown index befc93dc9..9f508bf10 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.properties RelationshipProperty Example Code category: page slug: sqlalchemy-orm-properties-relationshipproperty-examples -sortorder: 500031072 +sortorder: 500031080 toc: False sidebartitle: sqlalchemy.orm.properties RelationshipProperty -meta: Python example code for the RelationshipProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. +meta: Example code for understanding how to use the RelationshipProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. RelationshipProperty is a class within the sqlalchemy.orm.properties module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown index 4672d42ca..1e3987973 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.query Query Example Code category: page slug: sqlalchemy-orm-query-query-examples -sortorder: 500031073 +sortorder: 500031081 toc: False sidebartitle: sqlalchemy.orm.query Query -meta: Python example code for the Query class from the sqlalchemy.orm.query module of the SQLAlchemy project. +meta: Example code for understanding how to use the Query class from the sqlalchemy.orm.query module of the SQLAlchemy project. Query is a class within the sqlalchemy.orm.query module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown index 802e50bc9..ab9834b01 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.query QueryContext Example Code category: page slug: sqlalchemy-orm-query-querycontext-examples -sortorder: 500031074 +sortorder: 500031082 toc: False sidebartitle: sqlalchemy.orm.query QueryContext -meta: Python example code for the QueryContext class from the sqlalchemy.orm.query module of the SQLAlchemy project. +meta: Example code for understanding how to use the QueryContext class from the sqlalchemy.orm.query module of the SQLAlchemy project. QueryContext is a class within the sqlalchemy.orm.query module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown new file mode 100644 index 000000000..1628bd037 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown @@ -0,0 +1,57 @@ +title: sqlalchemy.orm Query Example Code +category: page +slug: sqlalchemy-orm-query-examples +sortorder: 500031052 +toc: False +sidebartitle: sqlalchemy.orm Query +meta: Example code for understanding how to use the Query class from the sqlalchemy.orm module of the SQLAlchemy project. + + +Query is a class within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from SQLAlchemy Mixins +[SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) +([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) +is a collection of +[mixins](https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful) +useful for extending [SQLAlchemy](/sqlalchemy.html) and simplifying +your [database](/databases.html)-interacting code for some common +use cases. SQLAlchemy Mixins is open sourced under the +[MIT license](https://github.com/absent1706/sqlalchemy-mixins/blob/master/LICENSE.txt). + +[**SQLAlchemy Mixins / sqlalchemy_mixins / session.py**](https://github.com/absent1706/sqlalchemy-mixins/blob/master/sqlalchemy_mixins/./session.py) + +```python +# session.py +~~from sqlalchemy.orm import Session, scoped_session, Query +from .utils import classproperty + + +class NoSessionError(RuntimeError): + pass + + +class SessionMixin: + _session = None + + @classmethod + def set_session(cls, session): + cls._session = session + + @classproperty + def session(cls): + if cls._session is not None: + return cls._session + else: + raise NoSessionError('Cant get session.' + 'Please, call SaActiveRecord.set_session()') + + @classproperty + def query(cls): + + +## ... source file continues with no further Query examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown index 84a24cffe..29a36c9fe 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm relationship Example Code category: page slug: sqlalchemy-orm-relationship-examples -sortorder: 500031060 +sortorder: 500031067 toc: False sidebartitle: sqlalchemy.orm relationship -meta: Python example code for the relationship callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the relationship callable from the sqlalchemy.orm module of the SQLAlchemy project. relationship is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown new file mode 100644 index 000000000..eb087dd30 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown @@ -0,0 +1,60 @@ +title: sqlalchemy.orm RelationshipProperty Example Code +category: page +slug: sqlalchemy-orm-relationshipproperty-examples +sortorder: 500031053 +toc: False +sidebartitle: sqlalchemy.orm RelationshipProperty +meta: Example code for understanding how to use the RelationshipProperty class from the sqlalchemy.orm module of the SQLAlchemy project. + + +RelationshipProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. + + +## Example 1 from SQLAlchemy Mixins +[SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) +([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) +is a collection of +[mixins](https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful) +useful for extending [SQLAlchemy](/sqlalchemy.html) and simplifying +your [database](/databases.html)-interacting code for some common +use cases. SQLAlchemy Mixins is open sourced under the +[MIT license](https://github.com/absent1706/sqlalchemy-mixins/blob/master/LICENSE.txt). + +[**SQLAlchemy Mixins / sqlalchemy_mixins / inspection.py**](https://github.com/absent1706/sqlalchemy-mixins/blob/master/sqlalchemy_mixins/./inspection.py) + +```python +# inspection.py +from sqlalchemy import inspect +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method +~~from sqlalchemy.orm import RelationshipProperty + +from .utils import classproperty + + +Base = declarative_base() + + +class InspectionMixin(Base): + __abstract__ = True + + @classproperty + def columns(cls): + return inspect(cls).columns.keys() + + @classproperty + def primary_keys_full(cls): + mapper = cls.__mapper__ + return [ + mapper.get_property_by_column(column) + for column in mapper.primary_key + ] + + @classproperty + def primary_keys(cls): + + +## ... source file continues with no further RelationshipProperty examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown index bae25190b..d25ec3cfa 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.session object_session Example Code category: page slug: sqlalchemy-orm-session-object-session-examples -sortorder: 500031076 +sortorder: 500031084 toc: False sidebartitle: sqlalchemy.orm.session object_session -meta: Python example code for the object_session callable from the sqlalchemy.orm.session module of the SQLAlchemy project. +meta: Python example code that shows how to use the object_session callable from the sqlalchemy.orm.session module of the SQLAlchemy project. object_session is a callable within the sqlalchemy.orm.session module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown index 3860b1158..8073560b0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.session Session Example Code category: page slug: sqlalchemy-orm-session-session-examples -sortorder: 500031075 +sortorder: 500031083 toc: False sidebartitle: sqlalchemy.orm.session Session -meta: Python example code for the Session class from the sqlalchemy.orm.session module of the SQLAlchemy project. +meta: Example code for understanding how to use the Session class from the sqlalchemy.orm.session module of the SQLAlchemy project. Session is a class within the sqlalchemy.orm.session module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown index 83f574c3e..ef0cd18f6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm session Example Code category: page slug: sqlalchemy-orm-session-examples -sortorder: 500031061 +sortorder: 500031068 toc: False sidebartitle: sqlalchemy.orm session -meta: Python example code for the session callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the session callable from the sqlalchemy.orm module of the SQLAlchemy project. session is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown index e41283502..86ab95aaa 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm sessionmaker Example Code category: page slug: sqlalchemy-orm-sessionmaker-examples -sortorder: 500031062 +sortorder: 500031069 toc: False sidebartitle: sqlalchemy.orm sessionmaker -meta: Python example code for the sessionmaker callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the sessionmaker callable from the sqlalchemy.orm module of the SQLAlchemy project. sessionmaker is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown index bda36c37a..a3656ed22 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm strategies Example Code category: page slug: sqlalchemy-orm-strategies-examples -sortorder: 500031063 +sortorder: 500031070 toc: False sidebartitle: sqlalchemy.orm strategies -meta: Python example code for the strategies callable from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Python example code that shows how to use the strategies callable from the sqlalchemy.orm module of the SQLAlchemy project. strategies is a callable within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown index 847147c51..00e76e0c9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm SynonymProperty Example Code category: page slug: sqlalchemy-orm-synonymproperty-examples -sortorder: 500031049 +sortorder: 500031055 toc: False sidebartitle: sqlalchemy.orm SynonymProperty -meta: Python example code for the SynonymProperty class from the sqlalchemy.orm module of the SQLAlchemy project. +meta: Example code for understanding how to use the SynonymProperty class from the sqlalchemy.orm module of the SQLAlchemy project. SynonymProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown new file mode 100644 index 000000000..5819716d4 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown @@ -0,0 +1,155 @@ +title: sqlalchemy.orm.util AliasedClass Example Code +category: page +slug: sqlalchemy-orm-util-aliasedclass-examples +sortorder: 500031085 +toc: False +sidebartitle: sqlalchemy.orm.util AliasedClass +meta: Example code for understanding how to use the AliasedClass class from the sqlalchemy.orm.util module of the SQLAlchemy project. + + +AliasedClass is a class within the sqlalchemy.orm.util module of the SQLAlchemy project. + + +## Example 1 from SQLAlchemy Mixins +[SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) +([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) +is a collection of +[mixins](https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful) +useful for extending [SQLAlchemy](/sqlalchemy.html) and simplifying +your [database](/databases.html)-interacting code for some common +use cases. SQLAlchemy Mixins is open sourced under the +[MIT license](https://github.com/absent1706/sqlalchemy-mixins/blob/master/LICENSE.txt). + +[**SQLAlchemy Mixins / sqlalchemy_mixins / smartquery.py**](https://github.com/absent1706/sqlalchemy-mixins/blob/master/sqlalchemy_mixins/./smartquery.py) + +```python +# smartquery.py +try: + from typing import List +except ImportError: # pragma: no cover + pass + +from collections import OrderedDict + +import sqlalchemy +from sqlalchemy import asc, desc, inspect +from sqlalchemy.orm import aliased, contains_eager +~~from sqlalchemy.orm.util import AliasedClass +from sqlalchemy.sql import operators, extract + +from .eagerload import _flatten_schema, _eager_expr_from_flat_schema, \ + EagerLoadMixin +from .inspection import InspectionMixin +from .utils import classproperty + +RELATION_SPLITTER = '___' +OPERATOR_SPLITTER = '__' + +DESC_PREFIX = '-' + + +def _parse_path_and_make_aliases(entity, entity_path, attrs, aliases): + relations = {} + for attr in attrs: + if RELATION_SPLITTER in attr: + relation_name, nested_attr = attr.split(RELATION_SPLITTER, 1) + if relation_name in relations: + relations[relation_name].append(nested_attr) + else: + relations[relation_name] = [nested_attr] + + for relation_name, nested_attrs in relations.items(): + + +## ... source file abbreviated to get to AliasedClass examples ... + + + 'month_ne': lambda c, v: extract('month', c) != v, + 'month_gt': lambda c, v: extract('month', c) > v, + 'month_ge': lambda c, v: extract('month', c) >= v, + 'month_lt': lambda c, v: extract('month', c) < v, + 'month_le': lambda c, v: extract('month', c) <= v, + + 'day': lambda c, v: extract('day', c) == v, + 'day_ne': lambda c, v: extract('day', c) != v, + 'day_gt': lambda c, v: extract('day', c) > v, + 'day_ge': lambda c, v: extract('day', c) >= v, + 'day_lt': lambda c, v: extract('day', c) < v, + 'day_le': lambda c, v: extract('day', c) <= v, + } + + @classproperty + def filterable_attributes(cls): + return cls.relations + cls.columns + \ + cls.hybrid_properties + cls.hybrid_methods + + @classproperty + def sortable_attributes(cls): + return cls.columns + cls.hybrid_properties + + @classmethod + def filter_expr(cls_or_alias, **filters): +~~ if isinstance(cls_or_alias, AliasedClass): + mapper, cls = cls_or_alias, inspect(cls_or_alias).mapper.class_ + else: + mapper = cls = cls_or_alias + + expressions = [] + valid_attributes = cls.filterable_attributes + for attr, value in filters.items(): + if attr in cls.hybrid_methods: + method = getattr(cls, attr) + expressions.append(method(value, mapper=mapper)) + else: + if OPERATOR_SPLITTER in attr: + attr_name, op_name = attr.rsplit(OPERATOR_SPLITTER, 1) + if op_name not in cls._operators: + raise KeyError('Expression `{}` has incorrect ' + 'operator `{}`'.format(attr, op_name)) + op = cls._operators[op_name] + else: + attr_name, op = attr, operators.eq + + if attr_name not in valid_attributes: + raise KeyError('Expression `{}` ' + 'has incorrect attribute `{}`' + .format(attr, attr_name)) + + column = getattr(mapper, attr_name) + expressions.append(op(column, value)) + + return expressions + + @classmethod + def order_expr(cls_or_alias, *columns): +~~ if isinstance(cls_or_alias, AliasedClass): + mapper, cls = cls_or_alias, inspect(cls_or_alias).mapper.class_ + else: + mapper = cls = cls_or_alias + + expressions = [] + for attr in columns: + fn, attr = (desc, attr[1:]) if attr.startswith(DESC_PREFIX) \ + else (asc, attr) + if attr not in cls.sortable_attributes: + raise KeyError('Cant order {} by {}'.format(cls, attr)) + + expr = fn(getattr(mapper, attr)) + expressions.append(expr) + return expressions + + @classmethod + def smart_query(cls, filters=None, sort_attrs=None, schema=None): + return smart_query(cls.query, filters, sort_attrs, schema) + + @classmethod + def where(cls, **filters): + return cls.smart_query(filters) + + @classmethod + + +## ... source file continues with no further AliasedClass examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown index 8ede318f9..2123d3858 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.orm.util AliasedInsp Example Code category: page slug: sqlalchemy-orm-util-aliasedinsp-examples -sortorder: 500031077 +sortorder: 500031086 toc: False sidebartitle: sqlalchemy.orm.util AliasedInsp -meta: Python example code for the AliasedInsp class from the sqlalchemy.orm.util module of the SQLAlchemy project. +meta: Example code for understanding how to use the AliasedInsp class from the sqlalchemy.orm.util module of the SQLAlchemy project. AliasedInsp is a class within the sqlalchemy.orm.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown index 6d9e35b40..00f63bc8f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.pool NullPool Example Code category: page slug: sqlalchemy-pool-nullpool-examples -sortorder: 500031078 +sortorder: 500031087 toc: False sidebartitle: sqlalchemy.pool NullPool -meta: Python example code for the NullPool class from the sqlalchemy.pool module of the SQLAlchemy project. +meta: Example code for understanding how to use the NullPool class from the sqlalchemy.pool module of the SQLAlchemy project. NullPool is a class within the sqlalchemy.pool module of the SQLAlchemy project. @@ -124,3 +124,73 @@ def _make_table(db): ``` + +## Example 2 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management that is +powered by [SQLAlchemy](/sqlalchemy.html) on the backend. The code +for this project is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / cli / setup.py**](https://github.com/indico/indico/blob/master/indico/cli/setup.py) + +```python +# setup.py + +from __future__ import unicode_literals + +import os +import re +import shutil +import socket +import sys +from operator import attrgetter +from smtplib import SMTP + +import click +from click import wrap_text +from flask.helpers import get_root_path +from pkg_resources import iter_entry_points +from prompt_toolkit import prompt +from prompt_toolkit.contrib.completers import PathCompleter, WordCompleter +from prompt_toolkit.layout.lexers import SimpleLexer +from prompt_toolkit.styles import style_from_dict +from prompt_toolkit.token import Token +from pytz import all_timezones, common_timezones +from redis import RedisError, StrictRedis +from sqlalchemy import create_engine +from sqlalchemy.exc import OperationalError +~~from sqlalchemy.pool import NullPool +from terminaltables import AsciiTable +from werkzeug.urls import url_parse + +from indico.core.db.sqlalchemy.util.models import import_all_models +from indico.util.console import cformat +from indico.util.string import validate_email + + +click.disable_unicode_literals_warning = True + + +def _echo(msg=''): + click.echo(msg, err=True) + + +def _warn(msg): + msg = wrap_text(msg) + click.echo(click.style(msg, fg='yellow'), err=True) + + +def _error(msg): + msg = wrap_text(msg) + click.echo(click.style(msg, fg='red', bold=True), err=True) + + + +## ... source file continues with no further NullPool examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown index 2a8d18108..a427fbcc7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.pool StaticPool Example Code category: page slug: sqlalchemy-pool-staticpool-examples -sortorder: 500031079 +sortorder: 500031088 toc: False sidebartitle: sqlalchemy.pool StaticPool -meta: Python example code for the StaticPool class from the sqlalchemy.pool module of the SQLAlchemy project. +meta: Example code for understanding how to use the StaticPool class from the sqlalchemy.pool module of the SQLAlchemy project. StaticPool is a class within the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown index 9c38e885c..2f4f885a9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.schema CheckConstraint Example Code category: page slug: sqlalchemy-schema-checkconstraint-examples -sortorder: 500031080 +sortorder: 500031089 toc: False sidebartitle: sqlalchemy.schema CheckConstraint -meta: Python example code for the CheckConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. +meta: Example code for understanding how to use the CheckConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. CheckConstraint is a class within the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown index 60240fe32..4bface7d5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.schema Column Example Code category: page slug: sqlalchemy-schema-column-examples -sortorder: 500031081 +sortorder: 500031090 toc: False sidebartitle: sqlalchemy.schema Column -meta: Python example code for the Column class from the sqlalchemy.schema module of the SQLAlchemy project. +meta: Example code for understanding how to use the Column class from the sqlalchemy.schema module of the SQLAlchemy project. Column is a class within the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown index a637d20ee..5029af79a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.schema CreateIndex Example Code category: page slug: sqlalchemy-schema-createindex-examples -sortorder: 500031082 +sortorder: 500031091 toc: False sidebartitle: sqlalchemy.schema CreateIndex -meta: Python example code for the CreateIndex class from the sqlalchemy.schema module of the SQLAlchemy project. +meta: Example code for understanding how to use the CreateIndex class from the sqlalchemy.schema module of the SQLAlchemy project. CreateIndex is a class within the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown new file mode 100644 index 000000000..458586fff --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown @@ -0,0 +1,121 @@ +title: sqlalchemy.schema CreateTable Example Code +category: page +slug: sqlalchemy-schema-createtable-examples +sortorder: 500031092 +toc: False +sidebartitle: sqlalchemy.schema CreateTable +meta: Example code for understanding how to use the CreateTable class from the sqlalchemy.schema module of the SQLAlchemy project. + + +CreateTable is a class within the sqlalchemy.schema module of the SQLAlchemy project. + + +## Example 1 from Amazon Redshift SQLAlchemy Dialect +[Amazon Redshift SQLAlchemy Dialect](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +that can communicate with the [AWS Redshift](https://aws.amazon.com/redshift/) +data store. The SQL is essentially [PostgreSQL](/postgresql.html) +and requires [psycopg2](https://www.psycopg.org/) to properly +operate. This project and its code are open sourced under the +[MIT license](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/LICENSE). + +[**Amazon Redshift SQLAlchemy Dialect / sqlalchemy_redshift / dialect.py**](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/sqlalchemy_redshift/./dialect.py) + +```python +# dialect.py +import re +from collections import defaultdict, namedtuple + +from packaging.version import Version +import pkg_resources +import sqlalchemy as sa +from sqlalchemy import inspect +from sqlalchemy.dialects.postgresql.base import ( + PGCompiler, PGDDLCompiler, PGIdentifierPreparer, PGTypeCompiler +) +from sqlalchemy.dialects.postgresql.psycopg2 import PGDialect_psycopg2 +from sqlalchemy.engine import reflection +from sqlalchemy.ext.compiler import compiles +from sqlalchemy.sql.expression import ( + BinaryExpression, BooleanClauseList, Delete +) +from sqlalchemy.types import ( + VARCHAR, NullType, SMALLINT, INTEGER, BIGINT, + DECIMAL, REAL, BOOLEAN, CHAR, DATE, TIMESTAMP) +from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION + +from .commands import ( + CopyCommand, UnloadFromSelect, Format, Compression, Encoding, + CreateLibraryCommand, AlterTableAppendCommand, RefreshMaterializedView +) +from .ddl import ( + CreateMaterializedView, DropMaterializedView, get_table_attributes +) + +sa_version = Version(sa.__version__) + +try: + import alembic +except ImportError: + pass + + +## ... source file abbreviated to get to CreateTable examples ... + + + \s* \) \s* # Arbitrary whitespace and literal ')' + Redshift defines a TIMTESTAMPTZ column type as an alias + of TIMESTAMP WITH TIME ZONE. + https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html + + Adding an explicit type to the RedshiftDialect allows us follow the + SqlAlchemy conventions for "vendor-specific types." + + https://docs.sqlalchemy.org/en/13/core/type_basics.html#vendor-specific-types + Structured tuple of table/view name and schema name. + Construct a new RelationKey with an explicit schema name. + Return *key* with one level of double quotes removed. + + Redshift stores some identifiers without quotes in internal tables, + even though the name must be quoted elsewhere. + In particular, this happens for tables named as a keyword. + Handles Redshift-specific ``CREATE TABLE`` syntax. + + Users can specify the `diststyle`, `distkey`, `sortkey` and `encode` + properties per table and per column. + + Table level properties can be set using the dialect specific syntax. For + example, to specify a distribution key and style you apply the following: + + >>> import sqlalchemy as sa +~~ >>> from sqlalchemy.schema import CreateTable + >>> engine = sa.create_engine('redshift+psycopg2://example') + >>> metadata = sa.MetaData() + >>> user = sa.Table( + ... 'user', + ... metadata, + ... sa.Column('id', sa.Integer, primary_key=True), + ... sa.Column('name', sa.String), + ... redshift_diststyle='KEY', + ... redshift_distkey='id', + ... redshift_interleaved_sortkey=['id', 'name'], + ... ) + >>> print(CreateTable(user).compile(engine)) + + CREATE TABLE "user" ( + id INTEGER NOT NULL, + name VARCHAR, + PRIMARY KEY (id) + ) DISTSTYLE KEY DISTKEY (id) INTERLEAVED SORTKEY (id, name) + + + + A single sort key can be applied without a wrapping list: + + >>> customer = sa.Table( + + +## ... source file continues with no further CreateTable examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown index 3a476a733..9ccfd1ea5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.schema DDLElement Example Code category: page slug: sqlalchemy-schema-ddlelement-examples -sortorder: 500031083 +sortorder: 500031093 toc: False sidebartitle: sqlalchemy.schema DDLElement -meta: Python example code for the DDLElement class from the sqlalchemy.schema module of the SQLAlchemy project. +meta: Example code for understanding how to use the DDLElement class from the sqlalchemy.schema module of the SQLAlchemy project. DDLElement is a class within the sqlalchemy.schema module of the SQLAlchemy project. @@ -72,7 +72,140 @@ class AlterColumn(AlterTable): ``` -## Example 2 from sqlalchemy-utils +## Example 2 from Amazon Redshift SQLAlchemy Dialect +[Amazon Redshift SQLAlchemy Dialect](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) +is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) +that can communicate with the [AWS Redshift](https://aws.amazon.com/redshift/) +data store. The SQL is essentially [PostgreSQL](/postgresql.html) +and requires [psycopg2](https://www.psycopg.org/) to properly +operate. This project and its code are open sourced under the +[MIT license](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/LICENSE). + +[**Amazon Redshift SQLAlchemy Dialect / sqlalchemy_redshift / ddl.py**](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/master/sqlalchemy_redshift/./ddl.py) + +```python +# ddl.py +import sqlalchemy as sa +from sqlalchemy.ext import compiler as sa_compiler +~~from sqlalchemy.schema import DDLElement + +from .compat import string_types + + +def _check_if_key_exists(key): + return isinstance(key, sa.Column) or key + + +def get_table_attributes(preparer, + diststyle=None, + distkey=None, + sortkey=None, + interleaved_sortkey=None): + text = "" + + has_distkey = _check_if_key_exists(distkey) + if diststyle: + diststyle = diststyle.upper() + if diststyle not in ('EVEN', 'KEY', 'ALL'): + raise sa.exc.ArgumentError( + u"diststyle {0} is invalid".format(diststyle) + ) + if diststyle != 'KEY' and has_distkey: + raise sa.exc.ArgumentError( + + +## ... source file abbreviated to get to DDLElement examples ... + + + text = """\ + CREATE MATERIALIZED VIEW {name} + {backup} + {table_attributes} + AS {selectable}\ + Drop the materialized view from the database. + SEE: + docs.aws.amazon.com/redshift/latest/dg/materialized-view-drop-sql-command + + This undoes the create command, as expected: + + >>> import sqlalchemy as sa + >>> from sqlalchemy_redshift.dialect import DropMaterializedView + >>> engine = sa.create_engine('redshift+psycopg2://example') + >>> drop = DropMaterializedView( + ... 'materialized_view_of_users', + ... if_exists=True + ... ) + >>> print(drop.compile(engine)) + + DROP MATERIALIZED VIEW IF EXISTS materialized_view_of_users + + + + This can be included in any execute() statement. +~~ Build the DropMaterializedView DDLElement. + + Parameters + ---------- + name: str + name of the materialized view to drop + if_exists: bool, optional + if True, the IF EXISTS clause is added. This will make the query + successful even if the view does not exist, i.e. it lets you drop + a non-existant view. Defaults to False. + cascade: bool, optional + if True, the CASCADE clause is added. This will drop all + views/objects in the DB that depend on this materialized view. + Defaults to False. + Formats and returns the drop statement for materialized views. + + distkey = distkey.name + text += " DISTKEY ({0})".format(preparer.quote(distkey)) + + has_sortkey = _check_if_key_exists(sortkey) + has_interleaved = _check_if_key_exists(interleaved_sortkey) + if has_sortkey and has_interleaved: + raise sa.exc.ArgumentError( + "Parameters sortkey and interleaved_sortkey are " + "mutually exclusive; you may not specify both." + ) + + if has_sortkey or has_interleaved: + keys = sortkey if has_sortkey else interleaved_sortkey + if isinstance(keys, (string_types, sa.Column)): + keys = [keys] + keys = [key.name if isinstance(key, sa.Column) else key + for key in keys] + if has_interleaved: + text += " INTERLEAVED" + sortkey_string = ", ".join(preparer.quote(key) + for key in keys) + text += " SORTKEY ({0})".format(sortkey_string) + return text + + +~~class CreateMaterializedView(DDLElement): + def __init__(self, name, selectable, backup=True, diststyle=None, + distkey=None, sortkey=None, interleaved_sortkey=None): + self.name = name + self.selectable = selectable + self.backup = backup + self.diststyle = diststyle + self.distkey = distkey + self.sortkey = sortkey + self.interleaved_sortkey = interleaved_sortkey + + +@sa_compiler.compiles(CreateMaterializedView) +def compile_create_materialized_view(element, compiler, **kw): + + + +## ... source file continues with no further DDLElement examples... + +``` + + +## Example 3 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown index 104866203..7d154cacf 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.schema ForeignKey Example Code category: page slug: sqlalchemy-schema-foreignkey-examples -sortorder: 500031084 +sortorder: 500031094 toc: False sidebartitle: sqlalchemy.schema ForeignKey -meta: Python example code for the ForeignKey class from the sqlalchemy.schema module of the SQLAlchemy project. +meta: Example code for understanding how to use the ForeignKey class from the sqlalchemy.schema module of the SQLAlchemy project. ForeignKey is a class within the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown index a7e7dd2dd..491711f24 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.schema ForeignKeyConstraint Example Code category: page slug: sqlalchemy-schema-foreignkeyconstraint-examples -sortorder: 500031085 +sortorder: 500031095 toc: False sidebartitle: sqlalchemy.schema ForeignKeyConstraint -meta: Python example code for the ForeignKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. +meta: Example code for understanding how to use the ForeignKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. ForeignKeyConstraint is a class within the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown index ffd40e3a1..3108acf8b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.schema PrimaryKeyConstraint Example Code category: page slug: sqlalchemy-schema-primarykeyconstraint-examples -sortorder: 500031086 +sortorder: 500031096 toc: False sidebartitle: sqlalchemy.schema PrimaryKeyConstraint -meta: Python example code for the PrimaryKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. +meta: Example code for understanding how to use the PrimaryKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. PrimaryKeyConstraint is a class within the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown index 70c3bc48d..568c40f44 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.schema Table Example Code category: page slug: sqlalchemy-schema-table-examples -sortorder: 500031087 +sortorder: 500031097 toc: False sidebartitle: sqlalchemy.schema Table -meta: Python example code for the Table class from the sqlalchemy.schema module of the SQLAlchemy project. +meta: Example code for understanding how to use the Table class from the sqlalchemy.schema module of the SQLAlchemy project. Table is a class within the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown index 6c40f1e32..65004a42d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql ClauseElement Example Code category: page slug: sqlalchemy-sql-clauseelement-examples -sortorder: 500031088 +sortorder: 500031098 toc: False sidebartitle: sqlalchemy.sql ClauseElement -meta: Python example code for the ClauseElement class from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Example code for understanding how to use the ClauseElement class from the sqlalchemy.sql module of the SQLAlchemy project. ClauseElement is a class within the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown index cbf3db86b..9259fd646 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql column Example Code category: page slug: sqlalchemy-sql-column-examples -sortorder: 500031089 +sortorder: 500031099 toc: False sidebartitle: sqlalchemy.sql column -meta: Python example code for the column callable from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code that shows how to use the column callable from the sqlalchemy.sql module of the SQLAlchemy project. column is a callable within the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown index d95801257..539f8420f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.elements ColumnElement Example Code category: page slug: sqlalchemy-sql-elements-columnelement-examples -sortorder: 500031097 +sortorder: 500031108 toc: False sidebartitle: sqlalchemy.sql.elements ColumnElement -meta: Python example code for the ColumnElement class from the sqlalchemy.sql.elements module of the SQLAlchemy project. +meta: Example code for understanding how to use the ColumnElement class from the sqlalchemy.sql.elements module of the SQLAlchemy project. ColumnElement is a class within the sqlalchemy.sql.elements module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown index afc180584..112c524ed 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.elements Label Example Code category: page slug: sqlalchemy-sql-elements-label-examples -sortorder: 500031098 +sortorder: 500031109 toc: False sidebartitle: sqlalchemy.sql.elements Label -meta: Python example code for the Label class from the sqlalchemy.sql.elements module of the SQLAlchemy project. +meta: Example code for understanding how to use the Label class from the sqlalchemy.sql.elements module of the SQLAlchemy project. Label is a class within the sqlalchemy.sql.elements module of the SQLAlchemy project. @@ -81,3 +81,61 @@ class Loader: ``` + +## Example 2 from indico +[indico](https://github.com/indico/indico) +([project website](https://getindico.io/), +[documentation](https://docs.getindico.io/en/stable/installation/) +and [sandbox demo](https://sandbox.getindico.io/)) +is a [Flask](/flask.html)-based web app for event management that is +powered by [SQLAlchemy](/sqlalchemy.html) on the backend. The code +for this project is open sourced under the +[MIT license](https://github.com/indico/indico/blob/master/LICENSE). + +[**indico / indico / core / marshmallow.py**](https://github.com/indico/indico/blob/master/indico/core/marshmallow.py) + +```python +# marshmallow.py + +from __future__ import absolute_import, unicode_literals + +from inspect import getmro + +from flask_marshmallow import Marshmallow +from flask_marshmallow.sqla import SchemaOpts +from marshmallow import fields, post_dump, post_load, pre_load +from marshmallow_enum import EnumField +from marshmallow_sqlalchemy import ModelConverter +from marshmallow_sqlalchemy import ModelSchema as MSQLAModelSchema +from sqlalchemy.orm import ColumnProperty +~~from sqlalchemy.sql.elements import Label +from webargs.flaskparser import parser as webargs_flask_parser + +from indico.core import signals +from indico.core.db.sqlalchemy import PyIntEnum, UTCDateTime +from indico.web.args import parser as indico_webargs_flask_parser + + +mm = Marshmallow() + + +def _is_column_property(prop): + return hasattr(prop, 'columns') and isinstance(prop.columns[0], Label) + + +class IndicoModelConverter(ModelConverter): + SQLA_TYPE_MAPPING = ModelConverter.SQLA_TYPE_MAPPING.copy() + SQLA_TYPE_MAPPING.update({ + UTCDateTime: fields.DateTime, + PyIntEnum: EnumField + }) + + def _get_field_kwargs_for_property(self, prop): + kwargs = super(IndicoModelConverter, self)._get_field_kwargs_for_property(prop) + if isinstance(prop, ColumnProperty) and hasattr(prop.columns[0].type, 'marshmallow_get_field_kwargs'): + + +## ... source file continues with no further Label examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown index 1e8163a97..d63891ca3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.expression ClauseElement Example Code category: page slug: sqlalchemy-sql-expression-clauseelement-examples -sortorder: 500031099 +sortorder: 500031110 toc: False sidebartitle: sqlalchemy.sql.expression ClauseElement -meta: Python example code for the ClauseElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. +meta: Example code for understanding how to use the ClauseElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. ClauseElement is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown index 642112ab4..0a667ca2c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.expression ColumnClause Example Code category: page slug: sqlalchemy-sql-expression-columnclause-examples -sortorder: 500031100 +sortorder: 500031111 toc: False sidebartitle: sqlalchemy.sql.expression ColumnClause -meta: Python example code for the ColumnClause class from the sqlalchemy.sql.expression module of the SQLAlchemy project. +meta: Example code for understanding how to use the ColumnClause class from the sqlalchemy.sql.expression module of the SQLAlchemy project. ColumnClause is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown index 05a8f620d..e929e48c8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.expression ColumnElement Example Code category: page slug: sqlalchemy-sql-expression-columnelement-examples -sortorder: 500031101 +sortorder: 500031112 toc: False sidebartitle: sqlalchemy.sql.expression ColumnElement -meta: Python example code for the ColumnElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. +meta: Example code for understanding how to use the ColumnElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. ColumnElement is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown index 90a4f4134..3d850fa5e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.expression Executable Example Code category: page slug: sqlalchemy-sql-expression-executable-examples -sortorder: 500031102 +sortorder: 500031113 toc: False sidebartitle: sqlalchemy.sql.expression Executable -meta: Python example code for the Executable class from the sqlalchemy.sql.expression module of the SQLAlchemy project. +meta: Example code for understanding how to use the Executable class from the sqlalchemy.sql.expression module of the SQLAlchemy project. Executable is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown index 9a11488f6..6b26eb7c9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.expression FunctionElement Example Code category: page slug: sqlalchemy-sql-expression-functionelement-examples -sortorder: 500031103 +sortorder: 500031114 toc: False sidebartitle: sqlalchemy.sql.expression FunctionElement -meta: Python example code for the FunctionElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. +meta: Example code for understanding how to use the FunctionElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. FunctionElement is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown index 9a25ab17b..da4c138a5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.expression UnaryExpression Example Code category: page slug: sqlalchemy-sql-expression-unaryexpression-examples -sortorder: 500031104 +sortorder: 500031115 toc: False sidebartitle: sqlalchemy.sql.expression UnaryExpression -meta: Python example code for the UnaryExpression class from the sqlalchemy.sql.expression module of the SQLAlchemy project. +meta: Example code for understanding how to use the UnaryExpression class from the sqlalchemy.sql.expression module of the SQLAlchemy project. UnaryExpression is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown index d2be14cf7..f1903b80b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql expression Example Code category: page slug: sqlalchemy-sql-expression-examples -sortorder: 500031090 +sortorder: 500031100 toc: False sidebartitle: sqlalchemy.sql expression -meta: Python example code for the expression callable from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code that shows how to use the expression callable from the sqlalchemy.sql module of the SQLAlchemy project. expression is a callable within the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown new file mode 100644 index 000000000..86aae7818 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown @@ -0,0 +1,142 @@ +title: sqlalchemy.sql extract Example Code +category: page +slug: sqlalchemy-sql-extract-examples +sortorder: 500031101 +toc: False +sidebartitle: sqlalchemy.sql extract +meta: Python example code that shows how to use the extract callable from the sqlalchemy.sql module of the SQLAlchemy project. + + +extract is a callable within the sqlalchemy.sql module of the SQLAlchemy project. + + +## Example 1 from SQLAlchemy Mixins +[SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) +([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) +is a collection of +[mixins](https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful) +useful for extending [SQLAlchemy](/sqlalchemy.html) and simplifying +your [database](/databases.html)-interacting code for some common +use cases. SQLAlchemy Mixins is open sourced under the +[MIT license](https://github.com/absent1706/sqlalchemy-mixins/blob/master/LICENSE.txt). + +[**SQLAlchemy Mixins / sqlalchemy_mixins / smartquery.py**](https://github.com/absent1706/sqlalchemy-mixins/blob/master/sqlalchemy_mixins/./smartquery.py) + +```python +# smartquery.py +try: + from typing import List +except ImportError: # pragma: no cover + pass + +from collections import OrderedDict + +import sqlalchemy +from sqlalchemy import asc, desc, inspect +from sqlalchemy.orm import aliased, contains_eager +from sqlalchemy.orm.util import AliasedClass +~~from sqlalchemy.sql import operators, extract + +from .eagerload import _flatten_schema, _eager_expr_from_flat_schema, \ + EagerLoadMixin +from .inspection import InspectionMixin +from .utils import classproperty + +RELATION_SPLITTER = '___' +OPERATOR_SPLITTER = '__' + +DESC_PREFIX = '-' + + +def _parse_path_and_make_aliases(entity, entity_path, attrs, aliases): + relations = {} + for attr in attrs: + if RELATION_SPLITTER in attr: + relation_name, nested_attr = attr.split(RELATION_SPLITTER, 1) + if relation_name in relations: + relations[relation_name].append(nested_attr) + else: + relations[relation_name] = [nested_attr] + + for relation_name, nested_attrs in relations.items(): + path = entity_path + RELATION_SPLITTER + relation_name \ + + +## ... source file abbreviated to get to extract examples ... + + +class SmartQueryMixin(InspectionMixin, EagerLoadMixin): + __abstract__ = True + + _operators = { + 'isnull': lambda c, v: (c == None) if v else (c != None), + 'exact': operators.eq, + 'ne': operators.ne, # not equal or is not (for None) + + 'gt': operators.gt, # greater than , > + 'ge': operators.ge, # greater than or equal, >= + 'lt': operators.lt, # lower than, < + 'le': operators.le, # lower than or equal, <= + + 'in': operators.in_op, + 'notin': operators.notin_op, + 'between': lambda c, v: c.between(v[0], v[1]), + + 'like': operators.like_op, + 'ilike': operators.ilike_op, + 'startswith': operators.startswith_op, + 'istartswith': lambda c, v: c.ilike(v + '%'), + 'endswith': operators.endswith_op, + 'iendswith': lambda c, v: c.ilike('%' + v), + 'contains': lambda c, v: c.ilike('%{v}%'.format(v=v)), + +~~ 'year': lambda c, v: extract('year', c) == v, +~~ 'year_ne': lambda c, v: extract('year', c) != v, +~~ 'year_gt': lambda c, v: extract('year', c) > v, +~~ 'year_ge': lambda c, v: extract('year', c) >= v, +~~ 'year_lt': lambda c, v: extract('year', c) < v, +~~ 'year_le': lambda c, v: extract('year', c) <= v, + +~~ 'month': lambda c, v: extract('month', c) == v, +~~ 'month_ne': lambda c, v: extract('month', c) != v, +~~ 'month_gt': lambda c, v: extract('month', c) > v, +~~ 'month_ge': lambda c, v: extract('month', c) >= v, +~~ 'month_lt': lambda c, v: extract('month', c) < v, +~~ 'month_le': lambda c, v: extract('month', c) <= v, + +~~ 'day': lambda c, v: extract('day', c) == v, +~~ 'day_ne': lambda c, v: extract('day', c) != v, +~~ 'day_gt': lambda c, v: extract('day', c) > v, +~~ 'day_ge': lambda c, v: extract('day', c) >= v, +~~ 'day_lt': lambda c, v: extract('day', c) < v, +~~ 'day_le': lambda c, v: extract('day', c) <= v, + } + + @classproperty + def filterable_attributes(cls): + return cls.relations + cls.columns + \ + cls.hybrid_properties + cls.hybrid_methods + + @classproperty + def sortable_attributes(cls): + return cls.columns + cls.hybrid_properties + + @classmethod + def filter_expr(cls_or_alias, **filters): + if isinstance(cls_or_alias, AliasedClass): + mapper, cls = cls_or_alias, inspect(cls_or_alias).mapper.class_ + else: + mapper = cls = cls_or_alias + + expressions = [] + valid_attributes = cls.filterable_attributes + for attr, value in filters.items(): + if attr in cls.hybrid_methods: + method = getattr(cls, attr) + expressions.append(method(value, mapper=mapper)) + + +## ... source file continues with no further extract examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown index 6dc8d50a7..a5c761948 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.functions FunctionElement Example Code category: page slug: sqlalchemy-sql-functions-functionelement-examples -sortorder: 500031105 +sortorder: 500031116 toc: False sidebartitle: sqlalchemy.sql.functions FunctionElement -meta: Python example code for the FunctionElement class from the sqlalchemy.sql.functions module of the SQLAlchemy project. +meta: Example code for understanding how to use the FunctionElement class from the sqlalchemy.sql.functions module of the SQLAlchemy project. FunctionElement is a class within the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown index 133d1ceb0..cbbea2c6c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.functions GenericFunction Example Code category: page slug: sqlalchemy-sql-functions-genericfunction-examples -sortorder: 500031106 +sortorder: 500031117 toc: False sidebartitle: sqlalchemy.sql.functions GenericFunction -meta: Python example code for the GenericFunction class from the sqlalchemy.sql.functions module of the SQLAlchemy project. +meta: Example code for understanding how to use the GenericFunction class from the sqlalchemy.sql.functions module of the SQLAlchemy project. GenericFunction is a class within the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown index e4c21051b..8a475f5c5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql functions Example Code category: page slug: sqlalchemy-sql-functions-examples -sortorder: 500031091 +sortorder: 500031102 toc: False sidebartitle: sqlalchemy.sql functions -meta: Python example code for the functions callable from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code that shows how to use the functions callable from the sqlalchemy.sql module of the SQLAlchemy project. functions is a callable within the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown index 0db6e99b8..cb85cee69 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.naming conv Example Code category: page slug: sqlalchemy-sql-naming-conv-examples -sortorder: 500031107 +sortorder: 500031118 toc: False sidebartitle: sqlalchemy.sql.naming conv -meta: Python example code for the conv callable from the sqlalchemy.sql.naming module of the SQLAlchemy project. +meta: Python example code that shows how to use the conv callable from the sqlalchemy.sql.naming module of the SQLAlchemy project. conv is a callable within the sqlalchemy.sql.naming module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown index b6befbaad..ab6800f57 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql operators Example Code category: page slug: sqlalchemy-sql-operators-examples -sortorder: 500031092 +sortorder: 500031103 toc: False sidebartitle: sqlalchemy.sql operators -meta: Python example code for the operators callable from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code that shows how to use the operators callable from the sqlalchemy.sql module of the SQLAlchemy project. operators is a callable within the sqlalchemy.sql module of the SQLAlchemy project. @@ -80,3 +80,186 @@ class BaseComparator(UserDefinedType.Comparator): ``` + +## Example 2 from SQLAlchemy Mixins +[SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) +([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) +is a collection of +[mixins](https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful) +useful for extending [SQLAlchemy](/sqlalchemy.html) and simplifying +your [database](/databases.html)-interacting code for some common +use cases. SQLAlchemy Mixins is open sourced under the +[MIT license](https://github.com/absent1706/sqlalchemy-mixins/blob/master/LICENSE.txt). + +[**SQLAlchemy Mixins / sqlalchemy_mixins / smartquery.py**](https://github.com/absent1706/sqlalchemy-mixins/blob/master/sqlalchemy_mixins/./smartquery.py) + +```python +# smartquery.py +try: + from typing import List +except ImportError: # pragma: no cover + pass + +from collections import OrderedDict + +import sqlalchemy +from sqlalchemy import asc, desc, inspect +from sqlalchemy.orm import aliased, contains_eager +from sqlalchemy.orm.util import AliasedClass +~~from sqlalchemy.sql import operators, extract + +from .eagerload import _flatten_schema, _eager_expr_from_flat_schema, \ + EagerLoadMixin +from .inspection import InspectionMixin +from .utils import classproperty + +RELATION_SPLITTER = '___' +OPERATOR_SPLITTER = '__' + +DESC_PREFIX = '-' + + +def _parse_path_and_make_aliases(entity, entity_path, attrs, aliases): + relations = {} + for attr in attrs: + if RELATION_SPLITTER in attr: + relation_name, nested_attr = attr.split(RELATION_SPLITTER, 1) + if relation_name in relations: + relations[relation_name].append(nested_attr) + else: + relations[relation_name] = [nested_attr] + + for relation_name, nested_attrs in relations.items(): + path = entity_path + RELATION_SPLITTER + relation_name \ + + +## ... source file abbreviated to get to operators examples ... + + + attr = attr.lstrip(DESC_PREFIX) + parts = attr.rsplit(RELATION_SPLITTER, 1) + entity, attr_name = aliases[parts[0]][0], prefix + parts[1] + else: + entity, attr_name = root_cls, attr + try: + query = query.order_by(*entity.order_expr(attr_name)) + except KeyError as e: + raise KeyError("Incorrect order path `{}`: {}".format(attr, e)) + + if schema: + flat_schema = _flatten_schema(schema) + not_loaded_part = {path: v for path, v in flat_schema.items() + if path not in loaded_paths} + query = query.options(*_eager_expr_from_flat_schema( + not_loaded_part)) + + return query + + +class SmartQueryMixin(InspectionMixin, EagerLoadMixin): + __abstract__ = True + + _operators = { + 'isnull': lambda c, v: (c == None) if v else (c != None), +~~ 'exact': operators.eq, +~~ 'ne': operators.ne, # not equal or is not (for None) + +~~ 'gt': operators.gt, # greater than , > +~~ 'ge': operators.ge, # greater than or equal, >= +~~ 'lt': operators.lt, # lower than, < +~~ 'le': operators.le, # lower than or equal, <= + +~~ 'in': operators.in_op, +~~ 'notin': operators.notin_op, + 'between': lambda c, v: c.between(v[0], v[1]), + +~~ 'like': operators.like_op, +~~ 'ilike': operators.ilike_op, +~~ 'startswith': operators.startswith_op, + 'istartswith': lambda c, v: c.ilike(v + '%'), +~~ 'endswith': operators.endswith_op, + 'iendswith': lambda c, v: c.ilike('%' + v), + 'contains': lambda c, v: c.ilike('%{v}%'.format(v=v)), + + 'year': lambda c, v: extract('year', c) == v, + 'year_ne': lambda c, v: extract('year', c) != v, + 'year_gt': lambda c, v: extract('year', c) > v, + 'year_ge': lambda c, v: extract('year', c) >= v, + 'year_lt': lambda c, v: extract('year', c) < v, + 'year_le': lambda c, v: extract('year', c) <= v, + + 'month': lambda c, v: extract('month', c) == v, + 'month_ne': lambda c, v: extract('month', c) != v, + 'month_gt': lambda c, v: extract('month', c) > v, + 'month_ge': lambda c, v: extract('month', c) >= v, + 'month_lt': lambda c, v: extract('month', c) < v, + 'month_le': lambda c, v: extract('month', c) <= v, + + 'day': lambda c, v: extract('day', c) == v, + 'day_ne': lambda c, v: extract('day', c) != v, + 'day_gt': lambda c, v: extract('day', c) > v, + 'day_ge': lambda c, v: extract('day', c) >= v, + 'day_lt': lambda c, v: extract('day', c) < v, + 'day_le': lambda c, v: extract('day', c) <= v, + } + + +## ... source file abbreviated to get to operators examples ... + + + @classproperty + def sortable_attributes(cls): + return cls.columns + cls.hybrid_properties + + @classmethod + def filter_expr(cls_or_alias, **filters): + if isinstance(cls_or_alias, AliasedClass): + mapper, cls = cls_or_alias, inspect(cls_or_alias).mapper.class_ + else: + mapper = cls = cls_or_alias + + expressions = [] + valid_attributes = cls.filterable_attributes + for attr, value in filters.items(): + if attr in cls.hybrid_methods: + method = getattr(cls, attr) + expressions.append(method(value, mapper=mapper)) + else: + if OPERATOR_SPLITTER in attr: + attr_name, op_name = attr.rsplit(OPERATOR_SPLITTER, 1) + if op_name not in cls._operators: + raise KeyError('Expression `{}` has incorrect ' + 'operator `{}`'.format(attr, op_name)) + op = cls._operators[op_name] + else: +~~ attr_name, op = attr, operators.eq + + if attr_name not in valid_attributes: + raise KeyError('Expression `{}` ' + 'has incorrect attribute `{}`' + .format(attr, attr_name)) + + column = getattr(mapper, attr_name) + expressions.append(op(column, value)) + + return expressions + + @classmethod + def order_expr(cls_or_alias, *columns): + if isinstance(cls_or_alias, AliasedClass): + mapper, cls = cls_or_alias, inspect(cls_or_alias).mapper.class_ + else: + mapper = cls = cls_or_alias + + expressions = [] + for attr in columns: + fn, attr = (desc, attr[1:]) if attr.startswith(DESC_PREFIX) \ + else (asc, attr) + if attr not in cls.sortable_attributes: + raise KeyError('Cant order {} by {}'.format(cls, attr)) + + +## ... source file continues with no further operators examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown index 3582c0c9c..a94259598 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.schema Column Example Code category: page slug: sqlalchemy-sql-schema-column-examples -sortorder: 500031108 +sortorder: 500031119 toc: False sidebartitle: sqlalchemy.sql.schema Column -meta: Python example code for the Column class from the sqlalchemy.sql.schema module of the SQLAlchemy project. +meta: Example code for understanding how to use the Column class from the sqlalchemy.sql.schema module of the SQLAlchemy project. Column is a class within the sqlalchemy.sql.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown index 0d8f0d2e0..f42dc6700 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.schema SchemaItem Example Code category: page slug: sqlalchemy-sql-schema-schemaitem-examples -sortorder: 500031109 +sortorder: 500031120 toc: False sidebartitle: sqlalchemy.sql.schema SchemaItem -meta: Python example code for the SchemaItem class from the sqlalchemy.sql.schema module of the SQLAlchemy project. +meta: Example code for understanding how to use the SchemaItem class from the sqlalchemy.sql.schema module of the SQLAlchemy project. SchemaItem is a class within the sqlalchemy.sql.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown index e740f417d..07c4f349a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql schema Example Code category: page slug: sqlalchemy-sql-schema-examples -sortorder: 500031093 +sortorder: 500031104 toc: False sidebartitle: sqlalchemy.sql schema -meta: Python example code for the schema callable from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code that shows how to use the schema callable from the sqlalchemy.sql module of the SQLAlchemy project. schema is a callable within the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown index 190efac73..f9ac7847d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql select Example Code category: page slug: sqlalchemy-sql-select-examples -sortorder: 500031094 +sortorder: 500031105 toc: False sidebartitle: sqlalchemy.sql select -meta: Python example code for the select callable from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code that shows how to use the select callable from the sqlalchemy.sql module of the SQLAlchemy project. select is a callable within the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown index 2843c88de..544dfc97b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.sqltypes NullType Example Code category: page slug: sqlalchemy-sql-sqltypes-nulltype-examples -sortorder: 500031110 +sortorder: 500031121 toc: False sidebartitle: sqlalchemy.sql.sqltypes NullType -meta: Python example code for the NullType class from the sqlalchemy.sql.sqltypes module of the SQLAlchemy project. +meta: Example code for understanding how to use the NullType class from the sqlalchemy.sql.sqltypes module of the SQLAlchemy project. NullType is a class within the sqlalchemy.sql.sqltypes module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown index 61a3e7b6c..9e3d88eb2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql sqltypes Example Code category: page slug: sqlalchemy-sql-sqltypes-examples -sortorder: 500031095 +sortorder: 500031106 toc: False sidebartitle: sqlalchemy.sql sqltypes -meta: Python example code for the sqltypes callable from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code that shows how to use the sqltypes callable from the sqlalchemy.sql module of the SQLAlchemy project. sqltypes is a callable within the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown index f67b661d3..5a1aa46a1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql table Example Code category: page slug: sqlalchemy-sql-table-examples -sortorder: 500031096 +sortorder: 500031107 toc: False sidebartitle: sqlalchemy.sql table -meta: Python example code for the table callable from the sqlalchemy.sql module of the SQLAlchemy project. +meta: Python example code that shows how to use the table callable from the sqlalchemy.sql module of the SQLAlchemy project. table is a callable within the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown index 9776ec2f2..9cbd0f5cc 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.util ClauseAdapter Example Code category: page slug: sqlalchemy-sql-util-clauseadapter-examples -sortorder: 500031111 +sortorder: 500031122 toc: False sidebartitle: sqlalchemy.sql.util ClauseAdapter -meta: Python example code for the ClauseAdapter class from the sqlalchemy.sql.util module of the SQLAlchemy project. +meta: Example code for understanding how to use the ClauseAdapter class from the sqlalchemy.sql.util module of the SQLAlchemy project. ClauseAdapter is a class within the sqlalchemy.sql.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown index 8f613b746..37518cca5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.sql.visitors traverse Example Code category: page slug: sqlalchemy-sql-visitors-traverse-examples -sortorder: 500031112 +sortorder: 500031123 toc: False sidebartitle: sqlalchemy.sql.visitors traverse -meta: Python example code for the traverse callable from the sqlalchemy.sql.visitors module of the SQLAlchemy project. +meta: Python example code that shows how to use the traverse callable from the sqlalchemy.sql.visitors module of the SQLAlchemy project. traverse is a callable within the sqlalchemy.sql.visitors module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown index 9328980b8..381f9c45a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.types Boolean Example Code category: page slug: sqlalchemy-types-boolean-examples -sortorder: 500031113 +sortorder: 500031124 toc: False sidebartitle: sqlalchemy.types Boolean -meta: Python example code for the Boolean class from the sqlalchemy.types module of the SQLAlchemy project. +meta: Example code for understanding how to use the Boolean class from the sqlalchemy.types module of the SQLAlchemy project. Boolean is a class within the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown index bd7cb518b..b1330cdae 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.types Enum Example Code category: page slug: sqlalchemy-types-enum-examples -sortorder: 500031114 +sortorder: 500031125 toc: False sidebartitle: sqlalchemy.types Enum -meta: Python example code for the Enum class from the sqlalchemy.types module of the SQLAlchemy project. +meta: Example code for understanding how to use the Enum class from the sqlalchemy.types module of the SQLAlchemy project. Enum is a class within the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown index 47bd51c10..5f2fab2e5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.types Integer Example Code category: page slug: sqlalchemy-types-integer-examples -sortorder: 500031115 +sortorder: 500031126 toc: False sidebartitle: sqlalchemy.types Integer -meta: Python example code for the Integer class from the sqlalchemy.types module of the SQLAlchemy project. +meta: Example code for understanding how to use the Integer class from the sqlalchemy.types module of the SQLAlchemy project. Integer is a class within the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown index 0ce9275a6..19e93553a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.types NULLTYPE Example Code category: page slug: sqlalchemy-types-nulltype-examples -sortorder: 500031116 +sortorder: 500031127 toc: False sidebartitle: sqlalchemy.types NULLTYPE -meta: Python example code for the NULLTYPE constant from the sqlalchemy.types module of the SQLAlchemy project. +meta: Python example code that shows how to use the NULLTYPE constant from the sqlalchemy.types module of the SQLAlchemy project. NULLTYPE is a constant within the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown index de92eb952..a25f4bf25 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.types String Example Code category: page slug: sqlalchemy-types-string-examples -sortorder: 500031117 +sortorder: 500031128 toc: False sidebartitle: sqlalchemy.types String -meta: Python example code for the String class from the sqlalchemy.types module of the SQLAlchemy project. +meta: Example code for understanding how to use the String class from the sqlalchemy.types module of the SQLAlchemy project. String is a class within the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown index 9dc4e109e..7dc7adb28 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.types to_instance Example Code category: page slug: sqlalchemy-types-to-instance-examples -sortorder: 500031120 +sortorder: 500031131 toc: False sidebartitle: sqlalchemy.types to_instance -meta: Python example code for the to_instance callable from the sqlalchemy.types module of the SQLAlchemy project. +meta: Python example code that shows how to use the to_instance callable from the sqlalchemy.types module of the SQLAlchemy project. to_instance is a callable within the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown index 61339384a..fc10502c0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.types TypeEngine Example Code category: page slug: sqlalchemy-types-typeengine-examples -sortorder: 500031118 +sortorder: 500031129 toc: False sidebartitle: sqlalchemy.types TypeEngine -meta: Python example code for the TypeEngine class from the sqlalchemy.types module of the SQLAlchemy project. +meta: Example code for understanding how to use the TypeEngine class from the sqlalchemy.types module of the SQLAlchemy project. TypeEngine is a class within the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown index c61492c65..5ae70ea29 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.types UserDefinedType Example Code category: page slug: sqlalchemy-types-userdefinedtype-examples -sortorder: 500031119 +sortorder: 500031130 toc: False sidebartitle: sqlalchemy.types UserDefinedType -meta: Python example code for the UserDefinedType class from the sqlalchemy.types module of the SQLAlchemy project. +meta: Example code for understanding how to use the UserDefinedType class from the sqlalchemy.types module of the SQLAlchemy project. UserDefinedType is a class within the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown index ce622b530..24f3ce4e0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.util.langhelpers symbol Example Code category: page slug: sqlalchemy-util-langhelpers-symbol-examples -sortorder: 500031125 +sortorder: 500031136 toc: False sidebartitle: sqlalchemy.util.langhelpers symbol -meta: Python example code for the symbol callable from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. +meta: Python example code that shows how to use the symbol callable from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. symbol is a callable within the sqlalchemy.util.langhelpers module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown index 487221c37..93e4e5be6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.util OrderedDict Example Code category: page slug: sqlalchemy-util-ordereddict-examples -sortorder: 500031121 +sortorder: 500031132 toc: False sidebartitle: sqlalchemy.util OrderedDict -meta: Python example code for the OrderedDict class from the sqlalchemy.util module of the SQLAlchemy project. +meta: Example code for understanding how to use the OrderedDict class from the sqlalchemy.util module of the SQLAlchemy project. OrderedDict is a class within the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown index 487bc17e4..703918750 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.util OrderedSet Example Code category: page slug: sqlalchemy-util-orderedset-examples -sortorder: 500031122 +sortorder: 500031133 toc: False sidebartitle: sqlalchemy.util OrderedSet -meta: Python example code for the OrderedSet class from the sqlalchemy.util module of the SQLAlchemy project. +meta: Example code for understanding how to use the OrderedSet class from the sqlalchemy.util module of the SQLAlchemy project. OrderedSet is a class within the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown index 044a3a7d3..f4501ee76 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.util set_creation_order Example Code category: page slug: sqlalchemy-util-set-creation-order-examples -sortorder: 500031123 +sortorder: 500031134 toc: False sidebartitle: sqlalchemy.util set_creation_order -meta: Python example code for the set_creation_order callable from the sqlalchemy.util module of the SQLAlchemy project. +meta: Python example code that shows how to use the set_creation_order callable from the sqlalchemy.util module of the SQLAlchemy project. set_creation_order is a callable within the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown index 6b3160ac6..f2aee0996 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown @@ -1,10 +1,10 @@ title: sqlalchemy.util topological Example Code category: page slug: sqlalchemy-util-topological-examples -sortorder: 500031124 +sortorder: 500031135 toc: False sidebartitle: sqlalchemy.util topological -meta: Python example code for the topological callable from the sqlalchemy.util module of the SQLAlchemy project. +meta: Python example code that shows how to use the topological callable from the sqlalchemy.util module of the SQLAlchemy project. topological is a callable within the sqlalchemy.util module of the SQLAlchemy project. diff --git a/theme/templates/code-examples/sqlalchemy.html b/theme/templates/code-examples/sqlalchemy.html index 40d7bcc40..450fb3242 100644 --- a/theme/templates/code-examples/sqlalchemy.html +++ b/theme/templates/code-examples/sqlalchemy.html @@ -28,6 +28,8 @@

sqlalchemy.dialects.postgresql pypostgresql

sqlalchemy.dialects.postgresql.base + PGCompiler, + PGIdentifierPreparer, PGTypeCompiler

sqlalchemy.dialects.postgresql.psycopg2 @@ -66,6 +68,7 @@

sqlalchemy.events

sqlalchemy.exc ArgumentError, DataError, + DatabaseError, IntegrityError, InvalidRequestError, NoInspectionAvailable, @@ -86,7 +89,9 @@

sqlalchemy.ext.declarative declarative_base

sqlalchemy.ext.hybrid + HYBRID_METHOD, HYBRID_PROPERTY, + hybrid_method, hybrid_property

sqlalchemy.ext.mutable @@ -99,8 +104,11 @@

sqlalchemy.orm ColumnProperty, CompositeProperty, Mapper, + Query, + RelationshipProperty, Session, SynonymProperty, + aliased, attributes, backref, class_mapper, @@ -111,13 +119,15 @@

sqlalchemy.orm mapperlib, object_mapper, object_session, + query, relationship, session, sessionmaker, strategies

sqlalchemy.orm.attributes - InstrumentedAttribute + InstrumentedAttribute, + flag_modified

sqlalchemy.orm.collections InstrumentedList @@ -144,6 +154,7 @@

sqlalchemy.orm.session object_session

sqlalchemy.orm.util + AliasedClass, AliasedInsp

sqlalchemy.pool @@ -154,6 +165,7 @@

sqlalchemy.schema CheckConstraint, Column, CreateIndex, + CreateTable, DDLElement, ForeignKey, ForeignKeyConstraint, @@ -165,6 +177,7 @@

sqlalchemy.sql Select, column, expression, + extract, functions, operators, schema, From 804ff0cd0d16e69e2c74552f123b33dbed936d11 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 7 Jul 2020 18:51:13 -0400 Subject: [PATCH 172/302] new django code examples --- .../django/django-db-backends-utils.markdown | 148 + .../django/django-db-connection.markdown | 486 ++ .../django/django-db-connections.markdown | 138 + .../django/django-db-databaseerror.markdown | 95 + .../django/django-db-dataerror.markdown | 79 + .../django-db-default-db-alias.markdown | 185 + .../django/django-db-integrityerror.markdown | 97 + ...utodetector-migrationautodetector.markdown | 74 + ...ions-exceptions-irreversibleerror.markdown | 43 + ...ations-executor-migrationexecutor.markdown | 74 + ...migrations-loader-migrationloader.markdown | 129 + ...ons-loader-migrations-module-name.markdown | 130 + ...rations-operations-base-operation.markdown | 57 + .../django-db-migrations-runpython.markdown | 129 + ...-db-migrations-state-projectstate.markdown | 74 + .../django/django-db-migrations.markdown | 987 ++++ .../examples/django/django-db-models.markdown | 4688 +++++++++++++++++ .../django-db-programmingerror.markdown | 232 + .../examples/django/django-db-router.markdown | 522 ++ .../django/django-db-transaction.markdown | 707 +++ theme/templates/code-examples/django.html | 27 +- 21 files changed, 9099 insertions(+), 2 deletions(-) create mode 100644 content/pages/examples/django/django-db-backends-utils.markdown create mode 100644 content/pages/examples/django/django-db-connection.markdown create mode 100644 content/pages/examples/django/django-db-connections.markdown create mode 100644 content/pages/examples/django/django-db-databaseerror.markdown create mode 100644 content/pages/examples/django/django-db-dataerror.markdown create mode 100644 content/pages/examples/django/django-db-default-db-alias.markdown create mode 100644 content/pages/examples/django/django-db-integrityerror.markdown create mode 100644 content/pages/examples/django/django-db-migrations-autodetector-migrationautodetector.markdown create mode 100644 content/pages/examples/django/django-db-migrations-exceptions-irreversibleerror.markdown create mode 100644 content/pages/examples/django/django-db-migrations-executor-migrationexecutor.markdown create mode 100644 content/pages/examples/django/django-db-migrations-loader-migrationloader.markdown create mode 100644 content/pages/examples/django/django-db-migrations-loader-migrations-module-name.markdown create mode 100644 content/pages/examples/django/django-db-migrations-operations-base-operation.markdown create mode 100644 content/pages/examples/django/django-db-migrations-runpython.markdown create mode 100644 content/pages/examples/django/django-db-migrations-state-projectstate.markdown create mode 100644 content/pages/examples/django/django-db-migrations.markdown create mode 100644 content/pages/examples/django/django-db-models.markdown create mode 100644 content/pages/examples/django/django-db-programmingerror.markdown create mode 100644 content/pages/examples/django/django-db-router.markdown create mode 100644 content/pages/examples/django/django-db-transaction.markdown diff --git a/content/pages/examples/django/django-db-backends-utils.markdown b/content/pages/examples/django/django-db-backends-utils.markdown new file mode 100644 index 000000000..0a182a01b --- /dev/null +++ b/content/pages/examples/django/django-db-backends-utils.markdown @@ -0,0 +1,148 @@ +title: django.db.backends utils Example Code +category: page +slug: django-db-backends-utils-examples +sortorder: 500011170 +toc: False +sidebartitle: django.db.backends utils +meta: Python example code for the utils callable from the django.db.backends module of the Django project. + + +utils is a callable within the django.db.backends module of the Django project. + + +## Example 1 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / management / debug_cursor.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/management/debug_cursor.py) + +```python +# debug_cursor.py +import six +import time +import traceback +from contextlib import contextmanager + +import django +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +~~from django.db.backends import utils + + +@contextmanager +def monkey_patch_cursordebugwrapper(print_sql=None, print_sql_location=False, truncate=None, logger=six.print_, confprefix="DJANGO_EXTENSIONS"): + if not print_sql: + yield + else: + truncate = getattr(settings, '%s_PRINT_SQL_TRUNCATE' % confprefix, 1000) + + sqlparse = None + if getattr(settings, '%s_SQLPARSE_ENABLED' % confprefix, True): + try: + import sqlparse + + sqlparse_format_kwargs_defaults = dict( + reindent_aligned=True, + truncate_strings=500, + ) + sqlparse_format_kwargs = getattr(settings, '%s_SQLPARSE_FORMAT_KWARGS' % confprefix, sqlparse_format_kwargs_defaults) + except ImportError: + sqlparse = None + + pygments = None + if getattr(settings, '%s_PYGMENTS_ENABLED' % confprefix, True): + try: + import pygments.lexers + import pygments.formatters + + pygments_formatter = getattr(settings, '%s_PYGMENTS_FORMATTER' % confprefix, pygments.formatters.TerminalFormatter) + pygments_formatter_kwargs = getattr(settings, '%s_PYGMENTS_FORMATTER_KWARGS' % confprefix, {}) + except ImportError: + pass + + class PrintQueryWrapperMixin: + def execute(self, sql, params=()): + starttime = time.time() + try: +~~ return utils.CursorWrapper.execute(self, sql, params) + finally: + execution_time = time.time() - starttime + raw_sql = self.db.ops.last_executed_query(self.cursor, sql, params) + if truncate: + raw_sql = raw_sql[:truncate] + + if sqlparse: + raw_sql = sqlparse.format(raw_sql, **sqlparse_format_kwargs) + + if pygments: + raw_sql = pygments.highlight( + raw_sql, + pygments.lexers.get_lexer_by_name("sql"), + pygments_formatter(**pygments_formatter_kwargs), + ) + + logger(raw_sql) + logger("Execution time: %.6fs [Database: %s]" % (execution_time, self.db.alias)) + if print_sql_location: + logger("Location of SQL Call:") + logger(''.join(traceback.format_stack())) + +~~ _CursorDebugWrapper = utils.CursorDebugWrapper + + class PrintCursorQueryWrapper(PrintQueryWrapperMixin, _CursorDebugWrapper): + pass + + try: + from django.db import connections + _force_debug_cursor = {} + for connection_name in connections: + _force_debug_cursor[connection_name] = connections[connection_name].force_debug_cursor + except Exception: + connections = None + +~~ utils.CursorDebugWrapper = PrintCursorQueryWrapper + + postgresql_base = None + if django.VERSION >= (3, 0): + try: + from django.db.backends.postgresql import base as postgresql_base + _PostgreSQLCursorDebugWrapper = postgresql_base.CursorDebugWrapper + + class PostgreSQLPrintCursorDebugWrapper(PrintQueryWrapperMixin, _PostgreSQLCursorDebugWrapper): + pass + except (ImproperlyConfigured, TypeError): + postgresql_base = None + + if postgresql_base: + postgresql_base.CursorDebugWrapper = PostgreSQLPrintCursorDebugWrapper + + if connections: + for connection_name in connections: + connections[connection_name].force_debug_cursor = True + + yield + +~~ utils.CursorDebugWrapper = _CursorDebugWrapper + + if postgresql_base: + postgresql_base.CursorDebugWrapper = _PostgreSQLCursorDebugWrapper + + if connections: + for connection_name in connections: + connections[connection_name].force_debug_cursor = _force_debug_cursor[connection_name] + + + +## ... source file continues with no further utils examples... + +``` + diff --git a/content/pages/examples/django/django-db-connection.markdown b/content/pages/examples/django/django-db-connection.markdown new file mode 100644 index 000000000..31ec9447d --- /dev/null +++ b/content/pages/examples/django/django-db-connection.markdown @@ -0,0 +1,486 @@ +title: django.db connection Example Code +category: page +slug: django-db-connection-examples +sortorder: 500011164 +toc: False +sidebartitle: django.db connection +meta: Python example code for the connection callable from the django.db module of the Django project. + + +connection is a callable within the django.db module of the Django project. + + +## Example 1 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / shortcuts.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./shortcuts.py) + +```python +# shortcuts.py +import warnings +from collections import defaultdict +from functools import partial +from itertools import groupby + +from django.apps import apps +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +~~from django.db import connection +from django.db.models import Count, Q, QuerySet +from django.shortcuts import _get_queryset +from django.db.models.expressions import Value +from django.db.models.functions import Cast, Replace +from django.db.models import ( + AutoField, + BigIntegerField, + CharField, + ForeignKey, + IntegerField, + PositiveIntegerField, + PositiveSmallIntegerField, + SmallIntegerField, + UUIDField, +) +from guardian.core import ObjectPermissionChecker +from guardian.ctypes import get_content_type +from guardian.exceptions import MixedContentTypeError, WrongAppError, MultipleIdentityAndObjectError +from guardian.utils import get_anonymous_user, get_group_obj_perms_model, get_identity, get_user_obj_perms_model +GroupObjectPermission = get_group_obj_perms_model() +UserObjectPermission = get_user_obj_perms_model() + + +def assign_perm(perm, user_or_group, obj=None): + + +## ... source file abbreviated to get to connection examples ... + + + + values = values.values_list(field_pk, flat=True) + return queryset.filter(pk__in=values) + + +def _handle_pk_field(queryset): + pk = queryset.model._meta.pk + + if isinstance(pk, ForeignKey): + return _handle_pk_field(pk.target_field) + + if isinstance( + pk, + ( + IntegerField, + AutoField, + BigIntegerField, + PositiveIntegerField, + PositiveSmallIntegerField, + SmallIntegerField, + ), + ): + return partial(Cast, output_field=BigIntegerField()) + + if isinstance(pk, UUIDField): +~~ if connection.features.has_native_uuid_field: + return partial(Cast, output_field=UUIDField()) + return partial( + Replace, + text=Value('-'), + replacement=Value(''), + output_field=CharField(), + ) + + return None + + + +## ... source file continues with no further connection examples... + +``` + + +## Example 2 from django-push-notifications +[django-push-notifications](https://github.com/jazzband/django-push-notifications) +is a [Django](/django.html) app for storing and interacting with +push notification services such as +[Google's Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/) +and +[Apple Notifications](https://developer.apple.com/notifications/). +The django-push-notification project's source code is available +open source under the +[MIT license](https://github.com/jazzband/django-push-notifications/blob/master/LICENSE). + +[**django-push-notifications / push_notifications / fields.py**](https://github.com/jazzband/django-push-notifications/blob/master/push_notifications/./fields.py) + +```python +# fields.py +import re +import struct + +from django import forms +from django.core.validators import MaxValueValidator, MinValueValidator, RegexValidator +~~from django.db import connection, models +from django.utils.translation import ugettext_lazy as _ + + +__all__ = ["HexadecimalField", "HexIntegerField"] + +UNSIGNED_64BIT_INT_MIN_VALUE = 0 +UNSIGNED_64BIT_INT_MAX_VALUE = 2 ** 64 - 1 + + +hex_re = re.compile(r"^(([0-9A-f])|(0x[0-9A-f]))+$") +signed_integer_engines = [ + "django.db.backends.postgresql", + "django.db.backends.postgresql_psycopg2", + "django.contrib.gis.db.backends.postgis", + "django.db.backends.sqlite3" +] + + +def _using_signed_storage(): +~~ return connection.settings_dict["ENGINE"] in signed_integer_engines + + +def _signed_to_unsigned_integer(value): + return struct.unpack("Q", struct.pack("q", value))[0] + + +def _unsigned_to_signed_integer(value): + return struct.unpack("q", struct.pack("Q", value))[0] + + +def _hex_string_to_unsigned_integer(value): + return int(value, 16) + + +def _unsigned_integer_to_hex_string(value): + return hex(value).rstrip("L") + + +class HexadecimalField(forms.CharField): + def __init__(self, *args, **kwargs): + self.default_validators = [ + RegexValidator(hex_re, _("Enter a valid hexadecimal number"), "invalid") + ] + super(HexadecimalField, self).__init__(*args, **kwargs) + + def prepare_value(self, value): + if value and not isinstance(value, str) \ +~~ and connection.vendor in ("mysql", "sqlite"): + value = _unsigned_integer_to_hex_string(value) + return super(forms.CharField, self).prepare_value(value) + + +class HexIntegerField(models.BigIntegerField): + + validators = [ + MinValueValidator(UNSIGNED_64BIT_INT_MIN_VALUE), + MaxValueValidator(UNSIGNED_64BIT_INT_MAX_VALUE) + ] + + def db_type(self, connection): +~~ engine = connection.settings_dict["ENGINE"] + if "mysql" in engine: + return "bigint unsigned" + elif "sqlite" in engine: + return "UNSIGNED BIG INT" + else: + return super(HexIntegerField, self).db_type(connection=connection) + + def get_prep_value(self, value): + if value is None or value == "": + return None + if isinstance(value, str): + value = _hex_string_to_unsigned_integer(value) + if _using_signed_storage(): + value = _unsigned_to_signed_integer(value) + return value + + def from_db_value(self, value, *args): + if value is None: + return value + if _using_signed_storage(): + value = _signed_to_unsigned_integer(value) + return value + + def to_python(self, value): + + +## ... source file continues with no further connection examples... + +``` + + +## Example 3 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / views.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./views.py) + +```python +# views.py +from django.conf import settings +from django.core.exceptions import PermissionDenied +~~from django.db import connection, models, transaction +from django.http import Http404 +from django.http.response import HttpResponseBase +from django.utils.cache import cc_delim_re, patch_vary_headers +from django.utils.encoding import smart_str +from django.views.decorators.csrf import csrf_exempt +from django.views.generic import View + +from rest_framework import exceptions, status +from rest_framework.request import Request +from rest_framework.response import Response +from rest_framework.schemas import DefaultSchema +from rest_framework.settings import api_settings +from rest_framework.utils import formatting + + +def get_view_name(view): + name = getattr(view, 'name', None) + if name is not None: + return name + + name = view.__class__.__name__ + name = formatting.remove_trailing_string(name, 'View') + name = formatting.remove_trailing_string(name, 'ViewSet') + name = formatting.camelcase_to_spaces(name) + + suffix = getattr(view, 'suffix', None) + if suffix: + name += ' ' + suffix + + return name + + +def get_view_description(view, html=False): + description = getattr(view, 'description', None) + if description is None: + description = view.__class__.__doc__ or '' + + description = formatting.dedent(smart_str(description)) + if html: + return formatting.markup_description(description) + return description + + +def set_rollback(): +~~ atomic_requests = connection.settings_dict.get('ATOMIC_REQUESTS', False) +~~ if atomic_requests and connection.in_atomic_block: + transaction.set_rollback(True) + + +def exception_handler(exc, context): + if isinstance(exc, Http404): + exc = exceptions.NotFound() + elif isinstance(exc, PermissionDenied): + exc = exceptions.PermissionDenied() + + if isinstance(exc, exceptions.APIException): + headers = {} + if getattr(exc, 'auth_header', None): + headers['WWW-Authenticate'] = exc.auth_header + if getattr(exc, 'wait', None): + headers['Retry-After'] = '%d' % exc.wait + + if isinstance(exc.detail, (list, dict)): + data = exc.detail + else: + data = {'detail': exc.detail} + + set_rollback() + return Response(data, status=exc.status_code, headers=headers) + + + +## ... source file continues with no further connection examples... + +``` + + +## Example 4 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / apps.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./apps.py) + +```python +# apps.py +from django.apps import AppConfig +~~from django.db import connections as djcs +from django.core.exceptions import ImproperlyConfigured + + +class ExplorerAppConfig(AppConfig): + + name = 'explorer' + + def ready(self): + from explorer.schema import build_async_schemas + _validate_connections() + build_async_schemas() + + +def _get_default(): + from explorer.app_settings import EXPLORER_DEFAULT_CONNECTION + return EXPLORER_DEFAULT_CONNECTION + + +def _get_explorer_connections(): + from explorer.app_settings import EXPLORER_CONNECTIONS + return EXPLORER_CONNECTIONS + + +def _validate_connections(): + + if _get_default() not in _get_explorer_connections().values(): + raise ImproperlyConfigured( + 'EXPLORER_DEFAULT_CONNECTION is %s, but that alias is not present in the values of EXPLORER_CONNECTIONS' + % _get_default()) + + for name, conn_name in _get_explorer_connections().items(): + if conn_name not in djcs: + raise ImproperlyConfigured( +~~ 'EXPLORER_CONNECTIONS contains (%s, %s), but %s is not a valid Django DB connection.' + % (name, conn_name, conn_name)) + + + +## ... source file continues with no further connection examples... + +``` + + +## Example 5 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / managers.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./managers.py) + +```python +# managers.py +import uuid +from operator import attrgetter + +from django import VERSION +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +~~from django.db import connections, models, router +from django.db.models import signals +from django.db.models.fields.related import ( + ManyToManyRel, + OneToOneRel, + RelatedField, + lazy_related_operation, +) +from django.db.models.query_utils import PathInfo +from django.utils.text import capfirst +from django.utils.translation import gettext_lazy as _ + +from taggit.forms import TagField +from taggit.models import ( + CommonGenericTaggedItemBase, + GenericUUIDTaggedItemBase, + TaggedItem, +) +from taggit.utils import require_instance_manager + + +class ExtraJoinRestriction: + + contains_aggregate = False + + + +## ... source file abbreviated to get to connection examples ... + + + kwargs = extra_filters if extra_filters else {} + return self.through.tags_for(self.model, self.instance, **kwargs) + + def get_prefetch_queryset(self, instances, queryset=None): + if queryset is not None: + raise ValueError("Custom queryset can't be used for this lookup.") + + instance = instances[0] + db = self._db or router.db_for_read(type(instance), instance=instance) + + fieldname = ( + "object_id" + if issubclass(self.through, CommonGenericTaggedItemBase) + else "content_object" + ) + fk = self.through._meta.get_field(fieldname) + query = { + "%s__%s__in" + % (self.through.tag_relname(), fk.name): { + obj._get_pk_val() for obj in instances + } + } + join_table = self.through._meta.db_table + source_col = fk.column + connection = connections[db] +~~ qn = connection.ops.quote_name + qs = ( + self.get_queryset(query) + .using(db) + .extra( + select={ + "_prefetch_related_val": "{}.{}".format( + qn(join_table), qn(source_col) + ) + } + ) + ) + + if issubclass(self.through, GenericUUIDTaggedItemBase): + + def uuid_rel_obj_attr(v): + value = attrgetter("_prefetch_related_val")(v) + if value is not None and not isinstance(value, uuid.UUID): + input_form = "int" if isinstance(value, int) else "hex" + value = uuid.UUID(**{input_form: value}) + return value + + rel_obj_attr = uuid_rel_obj_attr + else: + rel_obj_attr = attrgetter("_prefetch_related_val") + + +## ... source file continues with no further connection examples... + +``` + diff --git a/content/pages/examples/django/django-db-connections.markdown b/content/pages/examples/django/django-db-connections.markdown new file mode 100644 index 000000000..5bf5bfe44 --- /dev/null +++ b/content/pages/examples/django/django-db-connections.markdown @@ -0,0 +1,138 @@ +title: django.db connections Example Code +category: page +slug: django-db-connections-examples +sortorder: 500011165 +toc: False +sidebartitle: django.db connections +meta: Python example code for the connections callable from the django.db module of the Django project. + + +connections is a callable within the django.db module of the Django project. + + +## Example 1 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / management / debug_cursor.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/management/debug_cursor.py) + +```python +# debug_cursor.py +import six +import time +import traceback +from contextlib import contextmanager + +import django +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db.backends import utils + + +@contextmanager +def monkey_patch_cursordebugwrapper(print_sql=None, print_sql_location=False, truncate=None, logger=six.print_, confprefix="DJANGO_EXTENSIONS"): + if not print_sql: + yield + else: + truncate = getattr(settings, '%s_PRINT_SQL_TRUNCATE' % confprefix, 1000) + + sqlparse = None + if getattr(settings, '%s_SQLPARSE_ENABLED' % confprefix, True): + try: + import sqlparse + + sqlparse_format_kwargs_defaults = dict( + reindent_aligned=True, + truncate_strings=500, + ) + sqlparse_format_kwargs = getattr(settings, '%s_SQLPARSE_FORMAT_KWARGS' % confprefix, sqlparse_format_kwargs_defaults) + except ImportError: + sqlparse = None + + pygments = None + if getattr(settings, '%s_PYGMENTS_ENABLED' % confprefix, True): + try: + import pygments.lexers + + +## ... source file abbreviated to get to connections examples ... + + + if truncate: + raw_sql = raw_sql[:truncate] + + if sqlparse: + raw_sql = sqlparse.format(raw_sql, **sqlparse_format_kwargs) + + if pygments: + raw_sql = pygments.highlight( + raw_sql, + pygments.lexers.get_lexer_by_name("sql"), + pygments_formatter(**pygments_formatter_kwargs), + ) + + logger(raw_sql) + logger("Execution time: %.6fs [Database: %s]" % (execution_time, self.db.alias)) + if print_sql_location: + logger("Location of SQL Call:") + logger(''.join(traceback.format_stack())) + + _CursorDebugWrapper = utils.CursorDebugWrapper + + class PrintCursorQueryWrapper(PrintQueryWrapperMixin, _CursorDebugWrapper): + pass + + try: +~~ from django.db import connections + _force_debug_cursor = {} +~~ for connection_name in connections: + _force_debug_cursor[connection_name] = connections[connection_name].force_debug_cursor + except Exception: + connections = None + + utils.CursorDebugWrapper = PrintCursorQueryWrapper + + postgresql_base = None + if django.VERSION >= (3, 0): + try: + from django.db.backends.postgresql import base as postgresql_base + _PostgreSQLCursorDebugWrapper = postgresql_base.CursorDebugWrapper + + class PostgreSQLPrintCursorDebugWrapper(PrintQueryWrapperMixin, _PostgreSQLCursorDebugWrapper): + pass + except (ImproperlyConfigured, TypeError): + postgresql_base = None + + if postgresql_base: + postgresql_base.CursorDebugWrapper = PostgreSQLPrintCursorDebugWrapper + + if connections: +~~ for connection_name in connections: + connections[connection_name].force_debug_cursor = True + + yield + + utils.CursorDebugWrapper = _CursorDebugWrapper + + if postgresql_base: + postgresql_base.CursorDebugWrapper = _PostgreSQLCursorDebugWrapper + + if connections: +~~ for connection_name in connections: + connections[connection_name].force_debug_cursor = _force_debug_cursor[connection_name] + + + +## ... source file continues with no further connections examples... + +``` + diff --git a/content/pages/examples/django/django-db-databaseerror.markdown b/content/pages/examples/django/django-db-databaseerror.markdown new file mode 100644 index 000000000..3af45c352 --- /dev/null +++ b/content/pages/examples/django/django-db-databaseerror.markdown @@ -0,0 +1,95 @@ +title: django.db DatabaseError Example Code +category: page +slug: django-db-databaseerror-examples +sortorder: 500011160 +toc: False +sidebartitle: django.db DatabaseError +meta: Python example code for the DatabaseError class from the django.db module of the Django project. + + +DatabaseError is a class within the django.db module of the Django project. + + +## Example 1 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / tasks.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./tasks.py) + +```python +# tasks.py +from datetime import date, datetime, timedelta +import random +import string + +from django.core.mail import send_mail +from django.core.cache import cache +~~from django.db import DatabaseError + +from explorer import app_settings +from explorer.exporters import get_exporter_class +from explorer.models import Query, QueryLog + +if app_settings.ENABLE_TASKS: + from celery import task + from celery.utils.log import get_task_logger + from explorer.utils import s3_upload + logger = get_task_logger(__name__) +else: + from explorer.utils import noop_decorator as task + import logging + logger = logging.getLogger(__name__) + + +@task +def execute_query(query_id, email_address): + q = Query.objects.get(pk=query_id) + send_mail('[SQL Explorer] Your query is running...', + '%s is running and should be in your inbox soon!' % q.title, + app_settings.FROM_EMAIL, + [email_address]) + + exporter = get_exporter_class('csv')(q) + random_part = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(20)) + try: + url = s3_upload('%s.csv' % random_part, exporter.get_file_output()) + subj = '[SQL Explorer] Report "%s" is ready' % q.title + msg = 'Download results:\n\r%s' % url +~~ except DatabaseError as e: + subj = '[SQL Explorer] Error running report %s' % q.title + msg = 'Error: %s\nPlease contact an administrator' % e + logger.warning('%s: %s' % (subj, e)) + send_mail(subj, msg, app_settings.FROM_EMAIL, [email_address]) + + +@task +def snapshot_query(query_id): + try: + logger.info("Starting snapshot for query %s..." % query_id) + q = Query.objects.get(pk=query_id) + exporter = get_exporter_class('csv')(q) + k = 'query-%s/snap-%s.csv' % (q.id, date.today().strftime('%Y%m%d-%H:%M:%S')) + logger.info("Uploading snapshot for query %s as %s..." % (query_id, k)) + url = s3_upload(k, exporter.get_file_output()) + logger.info("Done uploading snapshot for query %s. URL: %s" % (query_id, url)) + except Exception as e: + logger.warning("Failed to snapshot query %s (%s). Retrying..." % (query_id, e)) + snapshot_query.retry() + + +@task +def snapshot_queries(): + logger.info("Starting query snapshots...") + + +## ... source file continues with no further DatabaseError examples... + +``` + diff --git a/content/pages/examples/django/django-db-dataerror.markdown b/content/pages/examples/django/django-db-dataerror.markdown new file mode 100644 index 000000000..70270fa35 --- /dev/null +++ b/content/pages/examples/django/django-db-dataerror.markdown @@ -0,0 +1,79 @@ +title: django.db DataError Example Code +category: page +slug: django-db-dataerror-examples +sortorder: 500011159 +toc: False +sidebartitle: django.db DataError +meta: Python example code for the DataError class from the django.db module of the Django project. + + +DataError is a class within the django.db module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / validators.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./validators.py) + +```python +# validators.py +~~from django.db import DataError +from django.utils.translation import gettext_lazy as _ + +from rest_framework.exceptions import ValidationError +from rest_framework.utils.representation import smart_repr + + +def qs_exists(queryset): + try: + return queryset.exists() +~~ except (TypeError, ValueError, DataError): + return False + + +def qs_filter(queryset, **kwargs): + try: + return queryset.filter(**kwargs) +~~ except (TypeError, ValueError, DataError): + return queryset.none() + + +class UniqueValidator: + message = _('This field must be unique.') + requires_context = True + + def __init__(self, queryset, message=None, lookup='exact'): + self.queryset = queryset + self.message = message or self.message + self.lookup = lookup + + def filter_queryset(self, value, queryset, field_name): + filter_kwargs = {'%s__%s' % (field_name, self.lookup): value} + return qs_filter(queryset, **filter_kwargs) + + def exclude_current_instance(self, queryset, instance): + if instance is not None: + return queryset.exclude(pk=instance.pk) + return queryset + + def __call__(self, value, serializer_field): + field_name = serializer_field.source_attrs[-1] + instance = getattr(serializer_field.parent, 'instance', None) + + +## ... source file continues with no further DataError examples... + +``` + diff --git a/content/pages/examples/django/django-db-default-db-alias.markdown b/content/pages/examples/django/django-db-default-db-alias.markdown new file mode 100644 index 000000000..762579708 --- /dev/null +++ b/content/pages/examples/django/django-db-default-db-alias.markdown @@ -0,0 +1,185 @@ +title: django.db DEFAULT_DB_ALIAS Example Code +category: page +slug: django-db-default-db-alias-examples +sortorder: 500011158 +toc: False +sidebartitle: django.db DEFAULT_DB_ALIAS +meta: Python example code for the DEFAULT_DB_ALIAS constant from the django.db module of the Django project. + + +DEFAULT_DB_ALIAS is a constant within the django.db module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / models.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/models.py) + +```python +# models.py +from __future__ import unicode_literals + +import json +import ast + +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import FieldDoesNotExist +~~from django.db import models, DEFAULT_DB_ALIAS +from django.db.models import QuerySet, Q +from django.utils import formats, timezone +from django.utils.encoding import python_2_unicode_compatible, smart_text +from django.utils.six import iteritems, integer_types +from django.utils.translation import ugettext_lazy as _ + +from jsonfield.fields import JSONField +from dateutil import parser +from dateutil.tz import gettz + + +class LogEntryManager(models.Manager): + + def log_create(self, instance, **kwargs): + changes = kwargs.get('changes', None) + pk = self._get_pk_value(instance) + + if changes is not None: + kwargs.setdefault('content_type', ContentType.objects.get_for_model(instance)) + kwargs.setdefault('object_pk', pk) + kwargs.setdefault('object_repr', smart_text(instance)) + + if isinstance(pk, integer_types): + kwargs.setdefault('object_id', pk) + + +## ... source file continues with no further DEFAULT_DB_ALIAS examples... + +``` + + +## Example 2 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / resources.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./resources.py) + +```python +# resources.py +import functools +import logging +import tablib +import traceback +from collections import OrderedDict +from copy import deepcopy + +from diff_match_patch import diff_match_patch + +import django +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.management.color import no_style +from django.core.paginator import Paginator +~~from django.db import DEFAULT_DB_ALIAS, connections +from django.db.models.fields.related import ForeignObjectRel +from django.db.models.query import QuerySet +from django.db.transaction import ( + TransactionManagementError, + atomic, + savepoint, + savepoint_commit, + savepoint_rollback +) +from django.utils.encoding import force_str +from django.utils.safestring import mark_safe + +from . import widgets +from .fields import Field +from .instance_loaders import ModelInstanceLoader +from .results import Error, Result, RowResult +from .utils import atomic_if_using_transaction + +if django.VERSION[0] >= 3: + from django.core.exceptions import FieldDoesNotExist +else: + from django.db.models.fields import FieldDoesNotExist + + + + +## ... source file continues with no further DEFAULT_DB_ALIAS examples... + +``` + + +## Example 3 from django-migration-linter +[django-migration-linter](https://github.com/3YOURMIND/django-migration-linter) +([PyPI package information](https://pypi.org/project/django-migration-linter/)) +checks for backwards-incompatible changes in [Django ORM](/django-orm.html) +schema migrations and warns you about them. The purpose of the project is +to save time in older and larger projects by detecting field migrations +that will be a problem so you do not run into issues later, and make it +easier to enable continuous [deployment](/deployment.html) configurations +with database changes. There is a +[blog post on keeping Django database migrations backward compatible](https://medium.com/3yourmind/keeping-django-database-migrations-backward-compatible-727820260dbb) +that goes into further detail on the tool. + +The django-migration-linter project is open sourced under the +[Apache 2.0 license](https://github.com/3YOURMIND/django-migration-linter/blob/master/LICENSE). + +[**django-migration-linter / django_migration_linter / migration_linter.py**](https://github.com/3YOURMIND/django-migration-linter/blob/master/django_migration_linter/./migration_linter.py) + +```python +# migration_linter.py +from __future__ import print_function + +import hashlib +import inspect +import logging +import os +import re +from subprocess import Popen, PIPE + +from django.conf import settings +from django.core.management import call_command +~~from django.db import DEFAULT_DB_ALIAS, connections, ProgrammingError +from django.db.migrations import RunPython +from enum import Enum, unique +from six import PY2 + +from .cache import Cache +from .constants import ( + DEFAULT_CACHE_PATH, + EXPECTED_DATA_MIGRATION_ARGS, + DJANGO_APPS_WITH_MIGRATIONS, +) +from .utils import clean_bytes_to_str, get_migration_abspath, split_migration_path +from .operations import IgnoreMigration +from .sql_analyser import analyse_sql_statements + +logger = logging.getLogger(__name__) + + +@unique +class MessageType(Enum): + OK = "ok" + IGNORE = "ignore" + WARNING = "warning" + ERROR = "error" + + + +## ... source file continues with no further DEFAULT_DB_ALIAS examples... + +``` + diff --git a/content/pages/examples/django/django-db-integrityerror.markdown b/content/pages/examples/django/django-db-integrityerror.markdown new file mode 100644 index 000000000..be8d2e5a2 --- /dev/null +++ b/content/pages/examples/django/django-db-integrityerror.markdown @@ -0,0 +1,97 @@ +title: django.db IntegrityError Example Code +category: page +slug: django-db-integrityerror-examples +sortorder: 500011161 +toc: False +sidebartitle: django.db IntegrityError +meta: Python example code for the IntegrityError class from the django.db module of the Django project. + + +IntegrityError is a class within the django.db module of the Django project. + + +## Example 1 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / models.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./models.py) + +```python +# models.py +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +~~from django.db import IntegrityError, models, router, transaction +from django.utils.text import slugify +from django.utils.translation import gettext, gettext_lazy as _ + +try: + from unidecode import unidecode +except ImportError: + + def unidecode(tag): + return tag + + +class TagBase(models.Model): + name = models.CharField(verbose_name=_("name"), unique=True, max_length=100) + slug = models.SlugField(verbose_name=_("slug"), unique=True, max_length=100) + + def __str__(self): + return self.name + + def __gt__(self, other): + return self.name.lower() > other.name.lower() + + def __lt__(self, other): + return self.name.lower() < other.name.lower() + + class Meta: + abstract = True + + def save(self, *args, **kwargs): + if self._state.adding and not self.slug: + self.slug = self.slugify(self.name) + using = kwargs.get("using") or router.db_for_write( + type(self), instance=self + ) + kwargs["using"] = using + try: + with transaction.atomic(using=using): + res = super().save(*args, **kwargs) + return res +~~ except IntegrityError: + pass + slugs = set( + type(self) + ._default_manager.filter(slug__startswith=self.slug) + .values_list("slug", flat=True) + ) + i = 1 + while True: + slug = self.slugify(self.name, i) + if slug not in slugs: + self.slug = slug + return super().save(*args, **kwargs) + i += 1 + else: + return super().save(*args, **kwargs) + + def slugify(self, tag, i=None): + slug = slugify(unidecode(tag)) + if i is not None: + slug += "_%d" % i + return slug + + +class Tag(TagBase): + + +## ... source file continues with no further IntegrityError examples... + +``` + diff --git a/content/pages/examples/django/django-db-migrations-autodetector-migrationautodetector.markdown b/content/pages/examples/django/django-db-migrations-autodetector-migrationautodetector.markdown new file mode 100644 index 000000000..70f3cd1d0 --- /dev/null +++ b/content/pages/examples/django/django-db-migrations-autodetector-migrationautodetector.markdown @@ -0,0 +1,74 @@ +title: django.db.migrations.autodetector MigrationAutodetector Example Code +category: page +slug: django-db-migrations-autodetector-migrationautodetector-examples +sortorder: 500011172 +toc: False +sidebartitle: django.db.migrations.autodetector MigrationAutodetector +meta: Python example code for the MigrationAutodetector class from the django.db.migrations.autodetector module of the Django project. + + +MigrationAutodetector is a class within the django.db.migrations.autodetector module of the Django project. + + +## Example 1 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / tests / test_models.py**](https://github.com/jazzband/django-axes/blob/master/axes/tests/test_models.py) + +```python +# test_models.py +from django.apps.registry import apps +from django.db import connection +~~from django.db.migrations.autodetector import MigrationAutodetector +from django.db.migrations.executor import MigrationExecutor +from django.db.migrations.state import ProjectState + +from axes.models import AccessAttempt, AccessLog +from axes.tests.base import AxesTestCase + + +class ModelsTestCase(AxesTestCase): + def setUp(self): + self.failures_since_start = 42 + + self.access_attempt = AccessAttempt( + failures_since_start=self.failures_since_start + ) + self.access_log = AccessLog() + + def test_access_attempt_str(self): + self.assertIn("Access", str(self.access_attempt)) + + def test_access_log_str(self): + self.assertIn("Access", str(self.access_log)) + + +class MigrationsTestCase(AxesTestCase): + def test_missing_migrations(self): + executor = MigrationExecutor(connection) +~~ autodetector = MigrationAutodetector( + executor.loader.project_state(), ProjectState.from_apps(apps) + ) + + changes = autodetector.changes(graph=executor.loader.graph) + + self.assertEqual({}, changes) + + + +## ... source file continues with no further MigrationAutodetector examples... + +``` + diff --git a/content/pages/examples/django/django-db-migrations-exceptions-irreversibleerror.markdown b/content/pages/examples/django/django-db-migrations-exceptions-irreversibleerror.markdown new file mode 100644 index 000000000..ecb9a015e --- /dev/null +++ b/content/pages/examples/django/django-db-migrations-exceptions-irreversibleerror.markdown @@ -0,0 +1,43 @@ +title: django.db.migrations.exceptions IrreversibleError Example Code +category: page +slug: django-db-migrations-exceptions-irreversibleerror-examples +sortorder: 500011173 +toc: False +sidebartitle: django.db.migrations.exceptions IrreversibleError +meta: Python example code for the IrreversibleError class from the django.db.migrations.exceptions module of the Django project. + + +IrreversibleError is a class within the django.db.migrations.exceptions module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / migrations / __init__.py**](https://github.com/divio/django-cms/blob/develop/cms/migrations/__init__.py) + +```python +# __init__.py +from django.db import migrations + +try: + IrreversibleError = migrations.Migration.IrreversibleError +except AttributeError: +~~ from django.db.migrations.exceptions import IrreversibleError + + +class IrreversibleMigration(migrations.Migration): + + def unapply(self, project_state, schema_editor, collect_sql=False): +~~ raise IrreversibleError('Migration %s is not reversible' % self.name) + + + +## ... source file continues with no further IrreversibleError examples... + +``` + diff --git a/content/pages/examples/django/django-db-migrations-executor-migrationexecutor.markdown b/content/pages/examples/django/django-db-migrations-executor-migrationexecutor.markdown new file mode 100644 index 000000000..2d2937edc --- /dev/null +++ b/content/pages/examples/django/django-db-migrations-executor-migrationexecutor.markdown @@ -0,0 +1,74 @@ +title: django.db.migrations.executor MigrationExecutor Example Code +category: page +slug: django-db-migrations-executor-migrationexecutor-examples +sortorder: 500011174 +toc: False +sidebartitle: django.db.migrations.executor MigrationExecutor +meta: Python example code for the MigrationExecutor class from the django.db.migrations.executor module of the Django project. + + +MigrationExecutor is a class within the django.db.migrations.executor module of the Django project. + + +## Example 1 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / tests / test_models.py**](https://github.com/jazzband/django-axes/blob/master/axes/tests/test_models.py) + +```python +# test_models.py +from django.apps.registry import apps +from django.db import connection +from django.db.migrations.autodetector import MigrationAutodetector +~~from django.db.migrations.executor import MigrationExecutor +from django.db.migrations.state import ProjectState + +from axes.models import AccessAttempt, AccessLog +from axes.tests.base import AxesTestCase + + +class ModelsTestCase(AxesTestCase): + def setUp(self): + self.failures_since_start = 42 + + self.access_attempt = AccessAttempt( + failures_since_start=self.failures_since_start + ) + self.access_log = AccessLog() + + def test_access_attempt_str(self): + self.assertIn("Access", str(self.access_attempt)) + + def test_access_log_str(self): + self.assertIn("Access", str(self.access_log)) + + +class MigrationsTestCase(AxesTestCase): + def test_missing_migrations(self): +~~ executor = MigrationExecutor(connection) + autodetector = MigrationAutodetector( + executor.loader.project_state(), ProjectState.from_apps(apps) + ) + + changes = autodetector.changes(graph=executor.loader.graph) + + self.assertEqual({}, changes) + + + +## ... source file continues with no further MigrationExecutor examples... + +``` + diff --git a/content/pages/examples/django/django-db-migrations-loader-migrationloader.markdown b/content/pages/examples/django/django-db-migrations-loader-migrationloader.markdown new file mode 100644 index 000000000..46a09f2ee --- /dev/null +++ b/content/pages/examples/django/django-db-migrations-loader-migrationloader.markdown @@ -0,0 +1,129 @@ +title: django.db.migrations.loader MigrationLoader Example Code +category: page +slug: django-db-migrations-loader-migrationloader-examples +sortorder: 500011176 +toc: False +sidebartitle: django.db.migrations.loader MigrationLoader +meta: Python example code for the MigrationLoader class from the django.db.migrations.loader module of the Django project. + + +MigrationLoader is a class within the django.db.migrations.loader module of the Django project. + + +## Example 1 from django-migration-linter +[django-migration-linter](https://github.com/3YOURMIND/django-migration-linter) +([PyPI package information](https://pypi.org/project/django-migration-linter/)) +checks for backwards-incompatible changes in [Django ORM](/django-orm.html) +schema migrations and warns you about them. The purpose of the project is +to save time in older and larger projects by detecting field migrations +that will be a problem so you do not run into issues later, and make it +easier to enable continuous [deployment](/deployment.html) configurations +with database changes. There is a +[blog post on keeping Django database migrations backward compatible](https://medium.com/3yourmind/keeping-django-database-migrations-backward-compatible-727820260dbb) +that goes into further detail on the tool. + +The django-migration-linter project is open sourced under the +[Apache 2.0 license](https://github.com/3YOURMIND/django-migration-linter/blob/master/LICENSE). + +[**django-migration-linter / django_migration_linter / migration_linter.py**](https://github.com/3YOURMIND/django-migration-linter/blob/master/django_migration_linter/./migration_linter.py) + +```python +# migration_linter.py +from __future__ import print_function + +import hashlib +import inspect +import logging +import os +import re +from subprocess import Popen, PIPE + +from django.conf import settings +from django.core.management import call_command +from django.db import DEFAULT_DB_ALIAS, connections, ProgrammingError +from django.db.migrations import RunPython +from enum import Enum, unique +from six import PY2 + +from .cache import Cache +from .constants import ( + DEFAULT_CACHE_PATH, + EXPECTED_DATA_MIGRATION_ARGS, + DJANGO_APPS_WITH_MIGRATIONS, +) +from .utils import clean_bytes_to_str, get_migration_abspath, split_migration_path +from .operations import IgnoreMigration +from .sql_analyser import analyse_sql_statements + +logger = logging.getLogger(__name__) + + +@unique +class MessageType(Enum): + OK = "ok" + IGNORE = "ignore" + WARNING = "warning" + ERROR = "error" + + +## ... source file abbreviated to get to MigrationLoader examples ... + + + exclude_migration_tests=None, + quiet=None, + warnings_as_errors=False, + ): + self.django_path = path + self.ignore_name_contains = ignore_name_contains + self.ignore_name = ignore_name or tuple() + self.include_apps = include_apps + self.exclude_apps = exclude_apps + self.exclude_migration_tests = exclude_migration_tests or [] + self.database = database or DEFAULT_DB_ALIAS + self.cache_path = cache_path or DEFAULT_CACHE_PATH + self.no_cache = no_cache + self.only_applied_migrations = only_applied_migrations + self.only_unapplied_migrations = only_unapplied_migrations + self.quiet = quiet or [] + self.warnings_as_errors = warnings_as_errors + + self.reset_counters() + + if self.should_use_cache(): + self.old_cache = Cache(self.django_path, self.database, self.cache_path) + self.new_cache = Cache(self.django_path, self.database, self.cache_path) + self.old_cache.load() + +~~ from django.db.migrations.loader import MigrationLoader + +~~ self.migration_loader = MigrationLoader( + connection=connections[self.database], load=True + ) + + def reset_counters(self): + self.nb_valid = 0 + self.nb_ignored = 0 + self.nb_warnings = 0 + self.nb_erroneous = 0 + self.nb_total = 0 + + def should_use_cache(self): + return self.django_path and not self.no_cache + + def lint_all_migrations(self, git_commit_id=None, migrations_file_path=None): + migrations_list = self.read_migrations_list(migrations_file_path) + if git_commit_id: + migrations = self._gather_migrations_git(git_commit_id, migrations_list) + else: + migrations = self._gather_all_migrations(migrations_list) + + sorted_migrations = sorted( + migrations, key=lambda migration: (migration.app_label, migration.name) + ) + for m in sorted_migrations: + + +## ... source file continues with no further MigrationLoader examples... + +``` + diff --git a/content/pages/examples/django/django-db-migrations-loader-migrations-module-name.markdown b/content/pages/examples/django/django-db-migrations-loader-migrations-module-name.markdown new file mode 100644 index 000000000..fddea6c62 --- /dev/null +++ b/content/pages/examples/django/django-db-migrations-loader-migrations-module-name.markdown @@ -0,0 +1,130 @@ +title: django.db.migrations.loader MIGRATIONS_MODULE_NAME Example Code +category: page +slug: django-db-migrations-loader-migrations-module-name-examples +sortorder: 500011175 +toc: False +sidebartitle: django.db.migrations.loader MIGRATIONS_MODULE_NAME +meta: Python example code for the MIGRATIONS_MODULE_NAME constant from the django.db.migrations.loader module of the Django project. + + +MIGRATIONS_MODULE_NAME is a constant within the django.db.migrations.loader module of the Django project. + + +## Example 1 from django-migration-linter +[django-migration-linter](https://github.com/3YOURMIND/django-migration-linter) +([PyPI package information](https://pypi.org/project/django-migration-linter/)) +checks for backwards-incompatible changes in [Django ORM](/django-orm.html) +schema migrations and warns you about them. The purpose of the project is +to save time in older and larger projects by detecting field migrations +that will be a problem so you do not run into issues later, and make it +easier to enable continuous [deployment](/deployment.html) configurations +with database changes. There is a +[blog post on keeping Django database migrations backward compatible](https://medium.com/3yourmind/keeping-django-database-migrations-backward-compatible-727820260dbb) +that goes into further detail on the tool. + +The django-migration-linter project is open sourced under the +[Apache 2.0 license](https://github.com/3YOURMIND/django-migration-linter/blob/master/LICENSE). + +[**django-migration-linter / django_migration_linter / migration_linter.py**](https://github.com/3YOURMIND/django-migration-linter/blob/master/django_migration_linter/./migration_linter.py) + +```python +# migration_linter.py +from __future__ import print_function + +import hashlib +import inspect +import logging +import os +import re +from subprocess import Popen, PIPE + +from django.conf import settings +from django.core.management import call_command +from django.db import DEFAULT_DB_ALIAS, connections, ProgrammingError +from django.db.migrations import RunPython +from enum import Enum, unique +from six import PY2 + +from .cache import Cache +from .constants import ( + DEFAULT_CACHE_PATH, + EXPECTED_DATA_MIGRATION_ARGS, + DJANGO_APPS_WITH_MIGRATIONS, +) +from .utils import clean_bytes_to_str, get_migration_abspath, split_migration_path +from .operations import IgnoreMigration +from .sql_analyser import analyse_sql_statements + +logger = logging.getLogger(__name__) + + +@unique +class MessageType(Enum): + OK = "ok" + IGNORE = "ignore" + WARNING = "warning" + ERROR = "error" + + +## ... source file abbreviated to get to MIGRATIONS_MODULE_NAME examples ... + + + "Calling sqlmigrate command {} {}".format(app_label, migration_name) + ) + dev_null = open(os.devnull, "w") + try: + sql_statement = call_command( + "sqlmigrate", + app_label, + migration_name, + database=self.database, + stdout=dev_null, + ) + except (ValueError, ProgrammingError): + logger.warning( + ( + "Error while executing sqlmigrate on (%s, %s). " + "Continuing execution with empty SQL." + ), + app_label, + migration_name, + ) + sql_statement = "" + return sql_statement.splitlines() + + @staticmethod + def is_migration_file(filename): +~~ from django.db.migrations.loader import MIGRATIONS_MODULE_NAME + + return ( +~~ re.search(r"/{0}/.*\.py".format(MIGRATIONS_MODULE_NAME), filename) + and "__init__" not in filename + ) + + @classmethod + def read_migrations_list(cls, migrations_file_path): + if not migrations_file_path: + return None + + migrations = [] + try: + with open(migrations_file_path, "r") as file: + for line in file: + if cls.is_migration_file(line): + app_label, name = split_migration_path(line) + migrations.append((app_label, name)) + except IOError: + logger.exception("Migrations list path not found %s", migrations_file_path) + raise Exception("Error while reading migrations list file") + + if not migrations: + logger.info( + "No valid migration paths found in the migrations file %s", + migrations_file_path, + ) + + +## ... source file continues with no further MIGRATIONS_MODULE_NAME examples... + +``` + diff --git a/content/pages/examples/django/django-db-migrations-operations-base-operation.markdown b/content/pages/examples/django/django-db-migrations-operations-base-operation.markdown new file mode 100644 index 000000000..151b91c0b --- /dev/null +++ b/content/pages/examples/django/django-db-migrations-operations-base-operation.markdown @@ -0,0 +1,57 @@ +title: django.db.migrations.operations.base Operation Example Code +category: page +slug: django-db-migrations-operations-base-operation-examples +sortorder: 500011177 +toc: False +sidebartitle: django.db.migrations.operations.base Operation +meta: Python example code for the Operation class from the django.db.migrations.operations.base module of the Django project. + + +Operation is a class within the django.db.migrations.operations.base module of the Django project. + + +## Example 1 from django-migration-linter +[django-migration-linter](https://github.com/3YOURMIND/django-migration-linter) +([PyPI package information](https://pypi.org/project/django-migration-linter/)) +checks for backwards-incompatible changes in [Django ORM](/django-orm.html) +schema migrations and warns you about them. The purpose of the project is +to save time in older and larger projects by detecting field migrations +that will be a problem so you do not run into issues later, and make it +easier to enable continuous [deployment](/deployment.html) configurations +with database changes. There is a +[blog post on keeping Django database migrations backward compatible](https://medium.com/3yourmind/keeping-django-database-migrations-backward-compatible-727820260dbb) +that goes into further detail on the tool. + +The django-migration-linter project is open sourced under the +[Apache 2.0 license](https://github.com/3YOURMIND/django-migration-linter/blob/master/LICENSE). + +[**django-migration-linter / django_migration_linter / operations.py**](https://github.com/3YOURMIND/django-migration-linter/blob/master/django_migration_linter/./operations.py) + +```python +# operations.py +~~from django.db.migrations.operations.base import Operation + + +~~class IgnoreMigration(Operation): + + reversible = True + reduces_to_sql = False + + def state_forwards(self, app_label, state): + pass + + def database_forwards(self, app_label, schema_editor, from_state, to_state): + pass + + def database_backwards(self, app_label, schema_editor, from_state, to_state): + pass + + def describe(self): + return "The Django migration linter will ignore this migration" + + + +## ... source file continues with no further Operation examples... + +``` + diff --git a/content/pages/examples/django/django-db-migrations-runpython.markdown b/content/pages/examples/django/django-db-migrations-runpython.markdown new file mode 100644 index 000000000..ed25366f5 --- /dev/null +++ b/content/pages/examples/django/django-db-migrations-runpython.markdown @@ -0,0 +1,129 @@ +title: django.db.migrations RunPython Example Code +category: page +slug: django-db-migrations-runpython-examples +sortorder: 500011171 +toc: False +sidebartitle: django.db.migrations RunPython +meta: Python example code for the RunPython class from the django.db.migrations module of the Django project. + + +RunPython is a class within the django.db.migrations module of the Django project. + + +## Example 1 from django-migration-linter +[django-migration-linter](https://github.com/3YOURMIND/django-migration-linter) +([PyPI package information](https://pypi.org/project/django-migration-linter/)) +checks for backwards-incompatible changes in [Django ORM](/django-orm.html) +schema migrations and warns you about them. The purpose of the project is +to save time in older and larger projects by detecting field migrations +that will be a problem so you do not run into issues later, and make it +easier to enable continuous [deployment](/deployment.html) configurations +with database changes. There is a +[blog post on keeping Django database migrations backward compatible](https://medium.com/3yourmind/keeping-django-database-migrations-backward-compatible-727820260dbb) +that goes into further detail on the tool. + +The django-migration-linter project is open sourced under the +[Apache 2.0 license](https://github.com/3YOURMIND/django-migration-linter/blob/master/LICENSE). + +[**django-migration-linter / django_migration_linter / migration_linter.py**](https://github.com/3YOURMIND/django-migration-linter/blob/master/django_migration_linter/./migration_linter.py) + +```python +# migration_linter.py +from __future__ import print_function + +import hashlib +import inspect +import logging +import os +import re +from subprocess import Popen, PIPE + +from django.conf import settings +from django.core.management import call_command +from django.db import DEFAULT_DB_ALIAS, connections, ProgrammingError +~~from django.db.migrations import RunPython +from enum import Enum, unique +from six import PY2 + +from .cache import Cache +from .constants import ( + DEFAULT_CACHE_PATH, + EXPECTED_DATA_MIGRATION_ARGS, + DJANGO_APPS_WITH_MIGRATIONS, +) +from .utils import clean_bytes_to_str, get_migration_abspath, split_migration_path +from .operations import IgnoreMigration +from .sql_analyser import analyse_sql_statements + +logger = logging.getLogger(__name__) + + +@unique +class MessageType(Enum): + OK = "ok" + IGNORE = "ignore" + WARNING = "warning" + ERROR = "error" + + @staticmethod + + +## ... source file abbreviated to get to RunPython examples ... + + + or (self.exclude_apps and app_label in self.exclude_apps) + or any(isinstance(o, IgnoreMigration) for o in operations) + or ( + self.ignore_name_contains + and self.ignore_name_contains in migration_name + ) + or (migration_name in self.ignore_name) + or ( + self.only_applied_migrations + and (app_label, migration_name) + not in self.migration_loader.applied_migrations + ) + or ( + self.only_unapplied_migrations + and (app_label, migration_name) + in self.migration_loader.applied_migrations + ) + ) + + def analyse_data_migration(self, migration): + errors = [] + ignored = [] + warnings = [] + + for operation in migration.operations: +~~ if isinstance(operation, RunPython): + op_errors, op_ignored, op_warnings = self.lint_runpython(operation) + if op_errors: + errors += op_errors + if op_ignored: + ignored += op_ignored + if op_warnings: + warnings += op_warnings + + return errors, ignored, warnings + + def lint_runpython(self, runpython): + function_name = runpython.code.__name__ + error = [] + ignored = [] + warning = [] + + if not runpython.reversible: + issue = { + "code": "REVERSIBLE_DATA_MIGRATION", + "msg": "'{}': RunPython data migration is not reversible".format( + function_name + ), + } + if issue["code"] in self.exclude_migration_tests: + + +## ... source file continues with no further RunPython examples... + +``` + diff --git a/content/pages/examples/django/django-db-migrations-state-projectstate.markdown b/content/pages/examples/django/django-db-migrations-state-projectstate.markdown new file mode 100644 index 000000000..6ae15a7dd --- /dev/null +++ b/content/pages/examples/django/django-db-migrations-state-projectstate.markdown @@ -0,0 +1,74 @@ +title: django.db.migrations.state ProjectState Example Code +category: page +slug: django-db-migrations-state-projectstate-examples +sortorder: 500011178 +toc: False +sidebartitle: django.db.migrations.state ProjectState +meta: Python example code for the ProjectState class from the django.db.migrations.state module of the Django project. + + +ProjectState is a class within the django.db.migrations.state module of the Django project. + + +## Example 1 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / tests / test_models.py**](https://github.com/jazzband/django-axes/blob/master/axes/tests/test_models.py) + +```python +# test_models.py +from django.apps.registry import apps +from django.db import connection +from django.db.migrations.autodetector import MigrationAutodetector +from django.db.migrations.executor import MigrationExecutor +~~from django.db.migrations.state import ProjectState + +from axes.models import AccessAttempt, AccessLog +from axes.tests.base import AxesTestCase + + +class ModelsTestCase(AxesTestCase): + def setUp(self): + self.failures_since_start = 42 + + self.access_attempt = AccessAttempt( + failures_since_start=self.failures_since_start + ) + self.access_log = AccessLog() + + def test_access_attempt_str(self): + self.assertIn("Access", str(self.access_attempt)) + + def test_access_log_str(self): + self.assertIn("Access", str(self.access_log)) + + +class MigrationsTestCase(AxesTestCase): + def test_missing_migrations(self): + executor = MigrationExecutor(connection) + autodetector = MigrationAutodetector( +~~ executor.loader.project_state(), ProjectState.from_apps(apps) + ) + + changes = autodetector.changes(graph=executor.loader.graph) + + self.assertEqual({}, changes) + + + +## ... source file continues with no further ProjectState examples... + +``` + diff --git a/content/pages/examples/django/django-db-migrations.markdown b/content/pages/examples/django/django-db-migrations.markdown new file mode 100644 index 000000000..9749b1cae --- /dev/null +++ b/content/pages/examples/django/django-db-migrations.markdown @@ -0,0 +1,987 @@ +title: django.db migrations Example Code +category: page +slug: django-db-migrations-examples +sortorder: 500011166 +toc: False +sidebartitle: django.db migrations +meta: Python example code for the migrations callable from the django.db module of the Django project. + + +migrations is a callable within the django.db module of the Django project. + + +## Example 1 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / migrations / 0004_auto_20181024_1538.py**](https://github.com/jazzband/django-axes/blob/master/axes/migrations/0004_auto_20181024_1538.py) + +```python +# 0004_auto_20181024_1538.py +~~from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [("axes", "0003_auto_20160322_0929")] + + operations = [ +~~ migrations.AlterModelOptions( + name="accessattempt", + options={ + "verbose_name": "access attempt", + "verbose_name_plural": "access attempts", + }, + ), +~~ migrations.AlterModelOptions( + name="accesslog", + options={ + "verbose_name": "access log", + "verbose_name_plural": "access logs", + }, + ), +~~ migrations.AlterField( + model_name="accessattempt", + name="attempt_time", + field=models.DateTimeField(auto_now_add=True, verbose_name="Attempt Time"), + ), +~~ migrations.AlterField( + model_name="accessattempt", + name="user_agent", + field=models.CharField( + db_index=True, max_length=255, verbose_name="User Agent" + ), + ), +~~ migrations.AlterField( + model_name="accessattempt", + name="username", + field=models.CharField( + db_index=True, max_length=255, null=True, verbose_name="Username" + ), + ), +~~ migrations.AlterField( + model_name="accesslog", + name="attempt_time", + field=models.DateTimeField(auto_now_add=True, verbose_name="Attempt Time"), + ), +~~ migrations.AlterField( + model_name="accesslog", + name="logout_time", + field=models.DateTimeField( + blank=True, null=True, verbose_name="Logout Time" + ), + ), +~~ migrations.AlterField( + model_name="accesslog", + name="user_agent", + field=models.CharField( + db_index=True, max_length=255, verbose_name="User Agent" + ), + ), +~~ migrations.AlterField( + model_name="accesslog", + name="username", + field=models.CharField( + db_index=True, max_length=255, null=True, verbose_name="Username" + ), + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / migrations / 0008_auto_20150208_2149.py**](https://github.com/divio/django-cms/blob/develop/cms/migrations/0008_auto_20150208_2149.py) + +```python +# 0008_auto_20150208_2149.py +from __future__ import unicode_literals + +~~from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('cms', '0007_auto_20141028_1559'), + ] + + operations = [ +~~ migrations.AlterField( + model_name='title', + name='redirect', + field=models.CharField(max_length=2048, null=True, verbose_name='redirect', blank=True), + preserve_default=True, + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 3 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / migrations / 0006_auto_20160623_1627.py**](https://github.com/divio/django-filer/blob/develop/filer/migrations/0006_auto_20160623_1627.py) + +```python +# 0006_auto_20160623_1627.py +from __future__ import unicode_literals + +import django.db.models.deletion +~~from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('filer', '0005_auto_20160623_1425'), + ] + + operations = [ +~~ migrations.AlterField( + model_name='image', + name='file_ptr', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='%(app_label)s_%(class)s_file', serialize=False, to='filer.File'), + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 4 from django-flexible-subscriptions +[django-flexible-subscriptions](https://github.com/studybuffalo/django-flexible-subscriptions) +([project documentation](https://django-flexible-subscriptions.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-flexible-subscriptions/)) +provides boilerplate code for adding subscription and recurrent billing +to [Django](/django.html) web applications. Various payment providers +can be added on the back end to run the transactions. + +The django-flexible-subscriptions project is open sourced under the +[GNU General Public License v3.0](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/LICENSE). + +[**django-flexible-subscriptions / subscriptions / migrations / 0006_add_slugs.py**](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/subscriptions/migrations/0006_add_slugs.py) + +```python +# 0006_add_slugs.py + +~~from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('subscriptions', '0005_update_recurrence_unit_default'), + ] + + operations = [ +~~ migrations.AddField( + model_name='plancost', + name='slug', + field=models.SlugField( + blank=True, + help_text='slug to reference these cost details', + max_length=128, + null=True, + unique=True, + ), + ), +~~ migrations.AddField( + model_name='subscriptionplan', + name='slug', + field=models.SlugField( + blank=True, + help_text='slug to reference the subscription plan', + max_length=128, + null=True, + unique=True, + ), + ), +~~ migrations.AddField( + model_name='planlist', + name='slug', + field=models.SlugField( + blank=True, + help_text='slug to reference the subscription plan list', + max_length=128, + null=True, + unique=True, + ), + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 5 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / migrations / 0001_initial.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/migrations/0001_initial.py) + +```python +# 0001_initial.py +~~from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0001_initial'), + ('auth', '0001_initial'), +~~ migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ +~~ migrations.CreateModel( + name='GroupObjectPermission', + fields=[ + ('id', models.AutoField(primary_key=True, + serialize=False, auto_created=True, verbose_name='ID')), + ('object_pk', models.CharField( + max_length=255, verbose_name='object ID')), + ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), + ('group', models.ForeignKey(to='auth.Group', on_delete=models.CASCADE)), + ('permission', models.ForeignKey(to='auth.Permission', on_delete=models.CASCADE)), + ], + options={ + }, + bases=(models.Model,), + ), +~~ migrations.CreateModel( + name='UserObjectPermission', + fields=[ + ('id', models.AutoField(primary_key=True, + serialize=False, auto_created=True, verbose_name='ID')), + ('object_pk', models.CharField( + max_length=255, verbose_name='object ID')), + ('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)), + ('permission', models.ForeignKey(to='auth.Permission', on_delete=models.CASCADE)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), + ], + options={ + }, + bases=(models.Model,), + ), +~~ migrations.AlterUniqueTogether( + name='userobjectpermission', + unique_together={('user', 'permission', 'object_pk')}, + ), +~~ migrations.AlterUniqueTogether( + name='groupobjectpermission', + unique_together={('group', 'permission', 'object_pk')}, + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 6 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / migrations / 0002_delete_userdashboardmodule.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/migrations/0002_delete_userdashboardmodule.py) + +```python +# 0002_delete_userdashboardmodule.py +from __future__ import unicode_literals + +~~from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('jet', '0001_initial'), + ] + + operations = [ +~~ migrations.DeleteModel( + name='UserDashboardModule', + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 7 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / migrations / 0001_initial.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/migrations/0001_initial.py) + +```python +# 0001_initial.py +from django.conf import settings +import django.db.models.deletion +~~from django.db import migrations, models + +import oauth2_provider.generators +import oauth2_provider.validators +from oauth2_provider.settings import oauth2_settings + + +class Migration(migrations.Migration): + dependencies = [ +~~ migrations.swappable_dependency(settings.AUTH_USER_MODEL) + ] + + operations = [ +~~ migrations.CreateModel( + name='Application', + fields=[ + ('id', models.BigAutoField(serialize=False, primary_key=True)), + ('client_id', models.CharField(default=oauth2_provider.generators.generate_client_id, unique=True, max_length=100, db_index=True)), + ('redirect_uris', models.TextField(help_text='Allowed URIs list, space separated', blank=True)), + ('client_type', models.CharField(max_length=32, choices=[('confidential', 'Confidential'), ('public', 'Public')])), + ('authorization_grant_type', models.CharField(max_length=32, choices=[('authorization-code', 'Authorization code'), ('implicit', 'Implicit'), ('password', 'Resource owner password-based'), ('client-credentials', 'Client credentials')])), + ('client_secret', models.CharField(default=oauth2_provider.generators.generate_client_secret, max_length=255, db_index=True, blank=True)), + ('name', models.CharField(max_length=255, blank=True)), + ('user', models.ForeignKey(related_name="oauth2_provider_application", blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)), + ('skip_authorization', models.BooleanField(default=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ], + options={ + 'abstract': False, + 'swappable': 'OAUTH2_PROVIDER_APPLICATION_MODEL', + }, + ), +~~ migrations.CreateModel( + name='AccessToken', + fields=[ + ('id', models.BigAutoField(serialize=False, primary_key=True)), + ('token', models.CharField(unique=True, max_length=255)), + ('expires', models.DateTimeField()), + ('scope', models.TextField(blank=True)), + ('application', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=oauth2_settings.APPLICATION_MODEL)), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='oauth2_provider_accesstoken', to=settings.AUTH_USER_MODEL)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ], + options={ + 'abstract': False, + 'swappable': 'OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL', + }, + ), +~~ migrations.CreateModel( + name='Grant', + fields=[ + ('id', models.BigAutoField(serialize=False, primary_key=True)), + ('code', models.CharField(unique=True, max_length=255)), + ('expires', models.DateTimeField()), + ('redirect_uri', models.CharField(max_length=255)), + ('scope', models.TextField(blank=True)), + ('application', models.ForeignKey(to=oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='oauth2_provider_grant', to=settings.AUTH_USER_MODEL)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ], + options={ + 'abstract': False, + 'swappable': 'OAUTH2_PROVIDER_GRANT_MODEL', + }, + ), +~~ migrations.CreateModel( + name='RefreshToken', + fields=[ + ('id', models.BigAutoField(serialize=False, primary_key=True)), + ('token', models.CharField(max_length=255)), + ('access_token', models.OneToOneField(blank=True, null=True, related_name="refresh_token", to=oauth2_settings.ACCESS_TOKEN_MODEL, on_delete=models.SET_NULL)), + ('application', models.ForeignKey(to=oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='oauth2_provider_refreshtoken', to=settings.AUTH_USER_MODEL)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('revoked', models.DateTimeField(null=True)), + ], + options={ + 'abstract': False, + 'swappable': 'OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL', + 'unique_together': set([("token", "revoked")]), + }, + ), +~~ migrations.AddField( + model_name='AccessToken', + name='source_refresh_token', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=oauth2_settings.REFRESH_TOKEN_MODEL, related_name="refreshed_access_token"), + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 8 from django-push-notifications +[django-push-notifications](https://github.com/jazzband/django-push-notifications) +is a [Django](/django.html) app for storing and interacting with +push notification services such as +[Google's Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/) +and +[Apple Notifications](https://developer.apple.com/notifications/). +The django-push-notification project's source code is available +open source under the +[MIT license](https://github.com/jazzband/django-push-notifications/blob/master/LICENSE). + +[**django-push-notifications / push_notifications / migrations / 0002_auto_20160106_0850.py**](https://github.com/jazzband/django-push-notifications/blob/master/push_notifications/migrations/0002_auto_20160106_0850.py) + +```python +# 0002_auto_20160106_0850.py +~~from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('push_notifications', '0001_initial'), + ] + + operations = [ +~~ migrations.AlterField( + model_name='apnsdevice', + name='registration_id', + field=models.CharField(max_length=200, unique=True, verbose_name='Registration ID'), + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 9 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / migrations / 0001_initial.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/migrations/0001_initial.py) + +```python +# 0001_initial.py +from __future__ import unicode_literals + +~~from django.db import models, migrations +import sitetree.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0001_initial'), + ] + + operations = [ +~~ migrations.CreateModel( + name='Tree', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(help_text='Site tree title for presentational purposes.', max_length=100, verbose_name='Title', blank=True)), + ('alias', models.CharField(help_text='Short name to address site tree from templates.
Note: change with care.', unique=True, max_length=80, verbose_name='Alias', db_index=True)), + ], + options={ + 'abstract': False, + 'verbose_name': 'Site Tree', + 'verbose_name_plural': 'Site Trees', + }, + bases=(models.Model,), + ), +~~ migrations.CreateModel( + name='TreeItem', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(help_text='Site tree item title. Can contain template variables E.g.: {{ mytitle }}.', max_length=100, verbose_name='Title')), + ('hint', models.CharField(default='', help_text='Some additional information about this item that is used as a hint.', max_length=200, verbose_name='Hint', blank=True)), + ('url', models.CharField(help_text='Exact URL or URL pattern (see "Additional settings") for this item.', max_length=200, verbose_name='URL', db_index=True)), + ('urlaspattern', models.BooleanField(default=False, help_text='Whether the given URL should be treated as a pattern.
Note: Refer to Django "URL dispatcher" documentation (e.g. "Naming URL patterns" part).', db_index=True, verbose_name='URL as Pattern')), + ('hidden', models.BooleanField(default=False, help_text='Whether to show this item in navigation.', db_index=True, verbose_name='Hidden')), + ('alias', sitetree.models.CharFieldNullable(max_length=80, blank=True, help_text='Short name to address site tree item from a template.
Reserved aliases: "trunk", "this-children", "this-siblings", "this-ancestor-children", "this-parent-siblings".', null=True, verbose_name='Alias', db_index=True)), + ('description', models.TextField(default='', help_text='Additional comments on this item.', verbose_name='Description', blank=True)), + ('inmenu', models.BooleanField(default=True, help_text='Whether to show this item in a menu.', db_index=True, verbose_name='Show in menu')), + ('inbreadcrumbs', models.BooleanField(default=True, help_text='Whether to show this item in a breadcrumb path.', db_index=True, verbose_name='Show in breadcrumb path')), + ('insitetree', models.BooleanField(default=True, help_text='Whether to show this item in a site tree.', db_index=True, verbose_name='Show in site tree')), + ('access_loggedin', models.BooleanField(default=False, help_text='Check it to grant access to this item to authenticated users only.', db_index=True, verbose_name='Logged in only')), + ('access_guest', models.BooleanField(default=False, help_text='Check it to grant access to this item to guests only.', db_index=True, verbose_name='Guests only')), + ('access_restricted', models.BooleanField(default=False, help_text='Check it to restrict user access to this item, using Django permissions system.', db_index=True, verbose_name='Restrict access to permissions')), + ('access_perm_type', models.IntegerField(default=1, help_text='Any — user should have any of chosen permissions. All — user should have all chosen permissions.', verbose_name='Permissions interpretation', choices=[(1, 'Any'), (2, 'All')])), + ('sort_order', models.IntegerField(default=0, help_text='Item position among other site tree items under the same parent.', verbose_name='Sort order', db_index=True)), + ('access_permissions', models.ManyToManyField(to='auth.Permission', verbose_name='Permissions granting access', blank=True)), + ('parent', models.ForeignKey(related_name='treeitem_parent', on_delete=models.CASCADE, blank=True, to='sitetree.TreeItem', help_text='Parent site tree item.', null=True, verbose_name='Parent')), + ('tree', models.ForeignKey(related_name='treeitem_tree', on_delete=models.CASCADE, verbose_name='Site Tree', to='sitetree.Tree', help_text='Site tree this item belongs to.')), + ], + options={ + 'abstract': False, + 'verbose_name': 'Site Tree Item', + 'verbose_name_plural': 'Site Tree Items', + }, + bases=(models.Model,), + ), +~~ migrations.AlterUniqueTogether( + name='treeitem', + unique_together=set([('tree', 'alias')]), + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 10 from django-smithy +[django-smithy](https://github.com/jamiecounsell/django-smithy) is +a [Django](/django.html) code library that allows users to send +HTTP requests from the Django admin user interface. The code for +the project is open source under the +[MIT license](https://github.com/jamiecounsell/django-smithy/blob/master/LICENSE). + +[**django-smithy / smithy / migrations / 0004_auto_20190721_2012.py**](https://github.com/jamiecounsell/django-smithy/blob/master/smithy/migrations/0004_auto_20190721_2012.py) + +```python +# 0004_auto_20190721_2012.py + +~~from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('smithy', '0003_auto_20190721_2004'), + ] + + operations = [ +~~ migrations.AlterField( + model_name='bodyparameter', + name='value', + field=models.TextField(blank=True), + ), +~~ migrations.AlterField( + model_name='cookie', + name='value', + field=models.TextField(blank=True), + ), +~~ migrations.AlterField( + model_name='header', + name='value', + field=models.TextField(blank=True), + ), +~~ migrations.AlterField( + model_name='queryparameter', + name='value', + field=models.TextField(blank=True), + ), +~~ migrations.AlterField( + model_name='variable', + name='value', + field=models.TextField(blank=True), + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 11 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / migrations / 0002_auto_20150501_1515.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/migrations/0002_auto_20150501_1515.py) + +```python +# 0002_auto_20150501_1515.py +from __future__ import unicode_literals + +~~from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('explorer', '0001_initial'), + ] + + operations = [ +~~ migrations.RemoveField( + model_name='querylog', + name='is_playground', + ), +~~ migrations.AlterField( + model_name='querylog', + name='sql', + field=models.TextField(null=True, blank=True), + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 12 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / migrations / 0002_auto_20150616_2121.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/migrations/0002_auto_20150616_2121.py) + +```python +# 0002_auto_20150616_2121.py +~~from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [("taggit", "0001_initial")] + + operations = [ +~~ migrations.AlterIndexTogether( + name="taggeditem", index_together={("content_type", "object_id")} + ) + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 13 from django-user-visit +[django-user-visit](https://github.com/yunojuno/django-user-visit) +([PyPI package information](https://pypi.org/project/django-user-visit/)) +is a [Django](/django.html) app and +[middleware](https://docs.djangoproject.com/en/stable/topics/http/middleware/) +for tracking daily user visits to your web application. The goal +is to record per user per day instead of for every request a user +sends to the application. The project is provided as open source +under the +[MIT license](https://github.com/yunojuno/django-user-visit/blob/master/LICENSE). + +[**django-user-visit / user_visit / migrations / 0002_add_created_at.py**](https://github.com/yunojuno/django-user-visit/blob/master/user_visit/migrations/0002_add_created_at.py) + +```python +# 0002_add_created_at.py +import django.utils.timezone +~~from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("user_visit", "0001_initial"), + ] + + operations = [ +~~ migrations.AlterModelOptions( + name="uservisit", options={"get_latest_by": "timestamp"}, + ), +~~ migrations.AddField( + model_name="uservisit", + name="created_at", + field=models.DateTimeField( + auto_now_add=True, + default=django.utils.timezone.now, + help_text=( + "The time at which the database record was created (!=timestamp)" + ), + ), + preserve_default=False, + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 14 from django-webshell +[django-webshell](https://github.com/onrik/django-webshell) is an extension +for executing arbitrary code in the +[Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/), +similar to how you can run code by using the `django manage.py shell` +command from the terminal. + +The django-webshell project is provided as open source under the +[MIT license](https://github.com/onrik/django-webshell/blob/master/LICENSE). + +[**django-webshell / webshell / migrations / 0001_initial.py**](https://github.com/onrik/django-webshell/blob/master/webshell/migrations/0001_initial.py) + +```python +# 0001_initial.py +from __future__ import unicode_literals + +~~from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ +~~ migrations.CreateModel( + name='Script', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=100, verbose_name='Name')), + ('source', models.TextField(verbose_name='Source')), + ], + options={ + 'verbose_name': 'Script', + 'verbose_name_plural': 'Scripts', + }, + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 15 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / migrations / 0002_urlpath_moved_to.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/migrations/0002_urlpath_moved_to.py) + +```python +# 0002_urlpath_moved_to.py +import django.db.models.deletion +import mptt.fields +~~from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("wiki", "0001_initial"), + ] + + operations = [ +~~ migrations.AddField( + model_name="urlpath", + name="moved_to", + field=mptt.fields.TreeForeignKey( + blank=True, + help_text="Article path was moved to this location", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="moved_from", + to="wiki.URLPath", + verbose_name="Moved to", + ), + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 16 from dmd-interpreter +[dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) +([running web app](http://www.dmd.nl/DOVE)) +is a Python tool to aggregate clinically relevant information related +to variants in the DMD gene and display that [data](/data.html) to a user +with a [Django](/django.html) web application. + +[**dmd-interpreter / interpreter / migrations / 0001_initial.py**](https://github.com/mitchalexbailey/dmd-interpreter/blob/master/interpreter/migrations/0001_initial.py) + +```python +# 0001_initial.py +from __future__ import unicode_literals + +~~from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ +~~ migrations.CreateModel( + name='Choice', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('choice_text', models.CharField(max_length=200)), + ('votes', models.IntegerField(default=0)), + ], + ), +~~ migrations.CreateModel( + name='Question', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('question_text', models.CharField(max_length=200)), + ('pub_date', models.DateTimeField(verbose_name=b'Date Published')), + ], + ), +~~ migrations.AddField( + model_name='choice', + name='question', + field=models.ForeignKey(to='interpreter.Question'), + ), + ] + + + +## ... source file continues with no further migrations examples... + +``` + + +## Example 17 from elasticsearch-django +[elasticsearch-django](https://github.com/yunojuno/elasticsearch-django) +([PyPI package information](https://pypi.org/project/elasticsearch-django/)) +is a [Django](/django.html) app for managing +[ElasticSearch](https://github.com/elastic/elasticsearch) indexes +populated by [Django ORM](/django-orm.html) models. The project is +available as open source under the +[MIT license](https://github.com/yunojuno/elasticsearch-django/blob/master/LICENSE). + +[**elasticsearch-django / elasticsearch_django / migrations / 0009_searchquery_query_type.py**](https://github.com/yunojuno/elasticsearch-django/blob/master/elasticsearch_django/migrations/0009_searchquery_query_type.py) + +```python +# 0009_searchquery_query_type.py + +~~from django.db import migrations, models + +from ..models import SearchQuery + + +class Migration(migrations.Migration): + + dependencies = [("elasticsearch_django", "0008_searchquery_search_terms")] + + operations = [ +~~ migrations.AddField( + model_name="searchquery", + name="query_type", + field=models.CharField( + choices=(lambda: SearchQuery.QUERY_TYPE_CHOICES)(), + default="SEARCH", + help_text="Does this query return results, or just the hit count?", + max_length=10, + ), + ) + ] + + + +## ... source file continues with no further migrations examples... + +``` + diff --git a/content/pages/examples/django/django-db-models.markdown b/content/pages/examples/django/django-db-models.markdown new file mode 100644 index 000000000..8d4b12427 --- /dev/null +++ b/content/pages/examples/django/django-db-models.markdown @@ -0,0 +1,4688 @@ +title: django.db models Example Code +category: page +slug: django-db-models-examples +sortorder: 500011167 +toc: False +sidebartitle: django.db models +meta: Python example code for the models callable from the django.db module of the Django project. + + +models is a callable within the django.db module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog_tests / models.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog_tests/models.py) + +```python +# models.py +import uuid + +from django.contrib.postgres.fields import ArrayField +~~from django.db import models +from auditlog.models import AuditlogHistoryField +from auditlog.registry import auditlog + +from multiselectfield import MultiSelectField + + +@auditlog.register() +class SimpleModel(models.Model): + +~~ text = models.TextField(blank=True) +~~ boolean = models.BooleanField(default=False) +~~ integer = models.IntegerField(blank=True, null=True) +~~ datetime = models.DateTimeField(auto_now=True) + + history = AuditlogHistoryField() + + +class AltPrimaryKeyModel(models.Model): + +~~ key = models.CharField(max_length=100, primary_key=True) + +~~ text = models.TextField(blank=True) +~~ boolean = models.BooleanField(default=False) +~~ integer = models.IntegerField(blank=True, null=True) +~~ datetime = models.DateTimeField(auto_now=True) + + history = AuditlogHistoryField(pk_indexable=False) + + +class UUIDPrimaryKeyModel(models.Model): + +~~ id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + +~~ text = models.TextField(blank=True) +~~ boolean = models.BooleanField(default=False) +~~ integer = models.IntegerField(blank=True, null=True) +~~ datetime = models.DateTimeField(auto_now=True) + + history = AuditlogHistoryField(pk_indexable=False) + + +class ProxyModel(SimpleModel): + + class Meta: + proxy = True + + +class RelatedModel(models.Model): + +~~ related = models.ForeignKey(to='self', on_delete=models.CASCADE) + + history = AuditlogHistoryField() + + +class ManyRelatedModel(models.Model): + +~~ related = models.ManyToManyField('self') + + history = AuditlogHistoryField() + + +@auditlog.register(include_fields=['label']) +class SimpleIncludeModel(models.Model): + +~~ label = models.CharField(max_length=100) +~~ text = models.TextField(blank=True) + + history = AuditlogHistoryField() + + +class SimpleExcludeModel(models.Model): + +~~ label = models.CharField(max_length=100) +~~ text = models.TextField(blank=True) + + history = AuditlogHistoryField() + + +class SimpleMappingModel(models.Model): + +~~ sku = models.CharField(max_length=100) +~~ vtxt = models.CharField(verbose_name='Version', max_length=100) +~~ not_mapped = models.CharField(max_length=100) + + history = AuditlogHistoryField() + + +class AdditionalDataIncludedModel(models.Model): + +~~ label = models.CharField(max_length=100) +~~ text = models.TextField(blank=True) +~~ related = models.ForeignKey(to=SimpleModel, on_delete=models.CASCADE) + + history = AuditlogHistoryField() + + def get_additional_data(self): + object_details = { + 'related_model_id': self.related.id, + 'related_model_text': self.related.text + } + return object_details + + +class DateTimeFieldModel(models.Model): +~~ label = models.CharField(max_length=100) +~~ timestamp = models.DateTimeField() +~~ date = models.DateField() +~~ time = models.TimeField() +~~ naive_dt = models.DateTimeField(null=True, blank=True) + + history = AuditlogHistoryField() + + +class ChoicesFieldModel(models.Model): + RED = 'r' + YELLOW = 'y' + GREEN = 'g' + + STATUS_CHOICES = ( + (RED, 'Red'), + (YELLOW, 'Yellow'), + (GREEN, 'Green'), + ) + +~~ status = models.CharField(max_length=1, choices=STATUS_CHOICES) + multiselect = MultiSelectField(max_length=3, choices=STATUS_CHOICES, max_choices=3) +~~ multiplechoice = models.CharField(max_length=255, choices=STATUS_CHOICES) + + history = AuditlogHistoryField() + + +class CharfieldTextfieldModel(models.Model): + +~~ longchar = models.CharField(max_length=255) +~~ longtextfield = models.TextField() + + history = AuditlogHistoryField() + + +class PostgresArrayFieldModel(models.Model): + RED = 'r' + YELLOW = 'y' + GREEN = 'g' + + STATUS_CHOICES = ( + (RED, 'Red'), + (YELLOW, 'Yellow'), + (GREEN, 'Green'), + ) + + arrayfield = ArrayField(models.CharField(max_length=1, choices=STATUS_CHOICES), size=3) + + history = AuditlogHistoryField() + + +class NoDeleteHistoryModel(models.Model): +~~ integer = models.IntegerField(blank=True, null=True) + + history = AuditlogHistoryField(delete_related=False) + + +auditlog.register(AltPrimaryKeyModel) +auditlog.register(UUIDPrimaryKeyModel) +auditlog.register(ProxyModel) +auditlog.register(RelatedModel) +auditlog.register(ManyRelatedModel) +auditlog.register(ManyRelatedModel.related.through) +auditlog.register(SimpleExcludeModel, exclude_fields=['text']) +auditlog.register(SimpleMappingModel, mapping_fields={'sku': 'Product No.'}) +auditlog.register(AdditionalDataIncludedModel) +auditlog.register(DateTimeFieldModel) +auditlog.register(ChoicesFieldModel) +auditlog.register(CharfieldTextfieldModel) +auditlog.register(PostgresArrayFieldModel) +auditlog.register(NoDeleteHistoryModel) + + + +## ... source file continues with no further models examples... + +``` + + +## Example 2 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair/forms.py) + +```python +# forms.py +from functools import reduce + +from django import forms +from django.contrib.auth import get_user_model +~~from django.db import models +from django.db.models import Q, F, Count, Max, Subquery, OuterRef, Value +from django.db.models.functions import Concat +from django.forms import MultipleChoiceField, ChoiceField, Form +from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ + +from django_countries import countries + +from conferences.models import Conference, ArtifactDescriptor +from gears.widgets import CustomCheckboxSelectMultiple, CustomFileInput +from review.models import Reviewer, Review, ReviewStats +from review.utilities import get_average_score +from submissions.models import Submission, Attachment +from users.models import Profile + +User = get_user_model() + + +def clean_data_to_int(iterable, empty=None): + return [int(x) if x != '' else None for x in iterable] + + +def q_or(disjuncts, default=True): + if disjuncts: + + +## ... source file abbreviated to get to models examples ... + + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert isinstance(self.instance, Conference) + countries_dict = dict(countries) + + self.fields['countries'].choices = [ + (code, countries_dict[code]) for code in + Profile.objects.filter(country__isnull=False).values_list( + 'country', flat=True).order_by('country').distinct()] + + self.fields['affiliations'].choices = [ + (aff, aff) for aff in + Profile.objects.values_list('affiliation', flat=True).order_by( + 'affiliation').distinct() if aff] + + def order_profiles(self, profiles): + order = self.cleaned_data['order'] + direction = '-' if self.cleaned_data['direction'] == 'DESC' else '' + if order == self.ORDER_BY_ID or not order: + return profiles.order_by(f'{direction}pk') + + elif order == self.ORDER_BY_NAME: + profiles = profiles.annotate( + full_name=Concat( + 'last_name', Value(' '), 'first_name', +~~ output_field=models.CharField())) + return profiles.order_by(f'{direction}full_name') + + return profiles + + def apply_term(self, profiles): + term = self.cleaned_data['term'] + for word in term.lower().split(): + profiles = profiles.filter( + Q(pk__icontains=word) | Q(first_name__icontains=word) | + Q(last_name__icontains=word) | + Q(first_name_rus__icontains=word) | + Q(last_name_rus__icontains=word) | + Q(middle_name_rus__icontains=word)) + return profiles + + def apply_countries(self, profiles): + data = self.cleaned_data['countries'] + if data: + profiles = profiles.filter(country__in=data) + return profiles + + def apply_affiliations(self, profiles): + data = self.cleaned_data['affiliations'] + if data: + + +## ... source file continues with no further models examples... + +``` + + +## Example 3 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / tests.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./tests.py) + +```python +# tests.py +from __future__ import unicode_literals + +import json +import requests +from datetime import date, datetime + +import django +from django.core.files.base import ContentFile +~~from django.db import models +from django.test import RequestFactory, TestCase +from django.utils.http import base36_to_int, int_to_base36 +from django.views import csrf + +from . import utils + + +try: + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch # noqa + + +class MockedResponse(object): + def __init__(self, status_code, content, headers=None): + if headers is None: + headers = {} + + self.status_code = status_code + self.content = content.encode('utf8') + self.headers = headers + + def json(self): + return json.loads(self.text) + + +## ... source file abbreviated to get to models examples ... + + + + def test_email_validation(self): + s = 'this.email.address.is.a.bit.too.long.but.should.still.validate@example.com' # noqa + self.assertEqual(s, utils.valid_email_or_none(s)) + + def test_serializer(self): + + class SomeValue: + pass + + some_value = SomeValue() + + class SomeField(models.Field): + def get_prep_value(self, value): + return 'somevalue' + if django.VERSION < (3, 0): + def from_db_value( + self, value, expression, connection, context + ): + return some_value + else: + def from_db_value(self, value, expression, connection): + return some_value + + class SomeModel(models.Model): +~~ dt = models.DateTimeField() +~~ t = models.TimeField() +~~ d = models.DateField() +~~ img1 = models.ImageField() +~~ img2 = models.ImageField() +~~ img3 = models.ImageField() + something = SomeField() + + def method(self): + pass + + instance = SomeModel(dt=datetime.now(), + d=date.today(), + something=some_value, + t=datetime.now().time()) + content_file = ContentFile(b'%PDF') + content_file.name = 'foo.pdf' + instance.img1 = content_file + instance.img2 = 'foo.png' + instance.method = method + instance.nonfield = 'hello' + data = utils.serialize_instance(instance) + instance2 = utils.deserialize_instance(SomeModel, data) + self.assertEqual(getattr(instance, 'method', None), method) + self.assertEqual(getattr(instance2, 'method', None), None) + self.assertEqual(instance2.something, some_value) + self.assertEqual(instance2.img1.name, 'foo.pdf') + self.assertEqual(instance2.img2.name, 'foo.png') + self.assertEqual(instance2.img3.name, '') + self.assertEqual(instance.nonfield, instance2.nonfield) + self.assertEqual(instance.d, instance2.d) + self.assertEqual(instance.dt.date(), instance2.dt.date()) + for t1, t2 in [(instance.t, instance2.t), + (instance.dt.time(), instance2.dt.time())]: + self.assertEqual(t1.hour, t2.hour) + self.assertEqual(t1.minute, t2.minute) + self.assertEqual(t1.second, t2.second) + self.assertEqual(int(t1.microsecond / 1000), + int(t2.microsecond / 1000)) + + def test_serializer_binary_field(self): + class SomeBinaryModel(models.Model): +~~ bb = models.BinaryField() +~~ bb_empty = models.BinaryField() + + instance = SomeBinaryModel(bb=b'some binary data') + + serialized = utils.serialize_instance(instance) + deserialized = utils.deserialize_instance(SomeBinaryModel, serialized) + + self.assertEqual(serialized['bb'], 'c29tZSBiaW5hcnkgZGF0YQ==') + self.assertEqual(serialized['bb_empty'], '') + self.assertEqual(deserialized.bb, b'some binary data') + self.assertEqual(deserialized.bb_empty, b'') + + def test_build_absolute_uri(self): + self.assertEqual( + utils.build_absolute_uri(None, '/foo'), + 'http://example.com/foo') + self.assertEqual( + utils.build_absolute_uri(None, '/foo', protocol='ftp'), + 'ftp://example.com/foo') + self.assertEqual( + utils.build_absolute_uri(None, 'http://foo.com/bar'), + 'http://foo.com/bar') + + def test_int_to_base36(self): + n = 55798679658823689999 + + +## ... source file continues with no further models examples... + +``` + + +## Example 4 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / models.py**](https://github.com/jazzband/django-axes/blob/master/axes/./models.py) + +```python +# models.py +~~from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class AccessBase(models.Model): +~~ user_agent = models.CharField(_("User Agent"), max_length=255, db_index=True) + +~~ ip_address = models.GenericIPAddressField(_("IP Address"), null=True, db_index=True) + +~~ username = models.CharField(_("Username"), max_length=255, null=True, db_index=True) + +~~ http_accept = models.CharField(_("HTTP Accept"), max_length=1025) + +~~ path_info = models.CharField(_("Path"), max_length=255) + +~~ attempt_time = models.DateTimeField(_("Attempt Time"), auto_now_add=True) + + class Meta: + app_label = "axes" + abstract = True + ordering = ["-attempt_time"] + + +class AccessAttempt(AccessBase): +~~ get_data = models.TextField(_("GET Data")) + +~~ post_data = models.TextField(_("POST Data")) + +~~ failures_since_start = models.PositiveIntegerField(_("Failed Logins")) + + def __str__(self): + return f"Attempted Access: {self.attempt_time}" + + class Meta: + verbose_name = _("access attempt") + verbose_name_plural = _("access attempts") + + +class AccessLog(AccessBase): +~~ logout_time = models.DateTimeField(_("Logout Time"), null=True, blank=True) + + def __str__(self): + return f"Access Log for {self.username} @ {self.attempt_time}" + + class Meta: + verbose_name = _("access log") + verbose_name_plural = _("access logs") + + + +## ... source file continues with no further models examples... + +``` + + +## Example 5 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / migrations / 0008_auto_20150208_2149.py**](https://github.com/divio/django-cms/blob/develop/cms/migrations/0008_auto_20150208_2149.py) + +```python +# 0008_auto_20150208_2149.py +from __future__ import unicode_literals + +~~from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('cms', '0007_auto_20141028_1559'), + ] + + operations = [ + migrations.AlterField( + model_name='title', + name='redirect', +~~ field=models.CharField(max_length=2048, null=True, verbose_name='redirect', blank=True), + preserve_default=True, + ), + ] + + + +## ... source file continues with no further models examples... + +``` + + +## Example 6 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / admin / __init__.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/__init__.py) + +```python +# __init__.py +import six +import operator +from functools import update_wrapper +from six.moves import reduce +from typing import Tuple, Dict, Callable # NOQA + +from django.apps import apps +from django.http import HttpResponse, HttpResponseNotFound +from django.conf import settings +~~from django.db import models +from django.db.models.query import QuerySet +from django.utils.encoding import smart_str +from django.utils.translation import gettext as _ +from django.utils.text import get_text_list +from django.contrib import admin + +from django_extensions.admin.widgets import ForeignKeySearchInput + + +class ForeignKeyAutocompleteAdminMixin: + + related_search_fields = {} # type: Dict[str, Tuple[str]] + related_string_functions = {} # type: Dict[str, Callable] + autocomplete_limit = getattr(settings, 'FOREIGNKEY_AUTOCOMPLETE_LIMIT', None) + + def get_urls(self): + from django.urls import path + + def wrap(view): + def wrapper(*args, **kwargs): + return self.admin_site.admin_view(view)(*args, **kwargs) + return update_wrapper(wrapper, view) + + return [ + + +## ... source file abbreviated to get to models examples ... + + + data = ''.join([six.u('%s|%s\n') % (to_string_function(f), f.pk) for f in queryset]) + elif object_pk: + try: + obj = queryset.get(pk=object_pk) + except Exception: # FIXME: use stricter exception checking + pass + else: + data = to_string_function(obj) + return HttpResponse(data, content_type='text/plain') + return HttpResponseNotFound() + + def get_related_filter(self, model, request): + return None + + def get_help_text(self, field_name, model_name): + searchable_fields = self.related_search_fields.get(field_name, None) + if searchable_fields: + help_kwargs = { + 'model_name': model_name, + 'field_list': get_text_list(searchable_fields, _('and')), + } + return _('Use the left field to do %(model_name)s lookups in the fields %(field_list)s.') % help_kwargs + return '' + + def formfield_for_dbfield(self, db_field, **kwargs): +~~ if isinstance(db_field, models.ForeignKey) and db_field.name in self.related_search_fields: + help_text = self.get_help_text(db_field.name, db_field.remote_field.model._meta.object_name) + if kwargs.get('help_text'): + help_text = six.u('%s %s' % (kwargs['help_text'], help_text)) + kwargs['widget'] = ForeignKeySearchInput(db_field.remote_field, self.related_search_fields[db_field.name]) + kwargs['help_text'] = help_text + return super().formfield_for_dbfield(db_field, **kwargs) + + +class ForeignKeyAutocompleteAdmin(ForeignKeyAutocompleteAdminMixin, admin.ModelAdmin): + pass + + +class ForeignKeyAutocompleteTabularInline(ForeignKeyAutocompleteAdminMixin, admin.TabularInline): + pass + + +class ForeignKeyAutocompleteStackedInline(ForeignKeyAutocompleteAdminMixin, admin.StackedInline): + pass + + + +## ... source file continues with no further models examples... + +``` + + +## Example 7 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / migrations / 0006_auto_20160623_1627.py**](https://github.com/divio/django-filer/blob/develop/filer/migrations/0006_auto_20160623_1627.py) + +```python +# 0006_auto_20160623_1627.py +from __future__ import unicode_literals + +import django.db.models.deletion +~~from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('filer', '0005_auto_20160623_1425'), + ] + + operations = [ + migrations.AlterField( + model_name='image', + name='file_ptr', +~~ field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='%(app_label)s_%(class)s_file', serialize=False, to='filer.File'), + ), + ] + + + +## ... source file continues with no further models examples... + +``` + + +## Example 8 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / filterset.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./filterset.py) + +```python +# filterset.py +import copy +from collections import OrderedDict + +from django import forms +~~from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.fields.related import ( + ManyToManyRel, + ManyToOneRel, + OneToOneRel +) + +from .conf import settings +from .constants import ALL_FIELDS +from .filters import ( + BaseInFilter, + BaseRangeFilter, + BooleanFilter, + CharFilter, + ChoiceFilter, + DateFilter, + DateTimeFilter, + DurationFilter, + Filter, + ModelChoiceFilter, + ModelMultipleChoiceFilter, + NumberFilter, + TimeFilter, + UUIDFilter + + +## ... source file abbreviated to get to models examples ... + + + if isinstance(obj, Filter) + ] + + for filter_name, f in filters: + if getattr(f, 'field_name', None) is None: + f.field_name = filter_name + + filters.sort(key=lambda x: x[1].creation_counter) + + known = set(attrs) + + def visit(name): + known.add(name) + return name + + base_filters = [ + (visit(name), f) + for base in bases if hasattr(base, 'declared_filters') + for name, f in base.declared_filters.items() if name not in known + ] + + return OrderedDict(base_filters + filters) + + +FILTER_FOR_DBFIELD_DEFAULTS = { +~~ models.AutoField: {'filter_class': NumberFilter}, +~~ models.CharField: {'filter_class': CharFilter}, +~~ models.TextField: {'filter_class': CharFilter}, +~~ models.BooleanField: {'filter_class': BooleanFilter}, +~~ models.DateField: {'filter_class': DateFilter}, +~~ models.DateTimeField: {'filter_class': DateTimeFilter}, +~~ models.TimeField: {'filter_class': TimeFilter}, +~~ models.DurationField: {'filter_class': DurationFilter}, +~~ models.DecimalField: {'filter_class': NumberFilter}, +~~ models.SmallIntegerField: {'filter_class': NumberFilter}, +~~ models.IntegerField: {'filter_class': NumberFilter}, +~~ models.PositiveIntegerField: {'filter_class': NumberFilter}, +~~ models.PositiveSmallIntegerField: {'filter_class': NumberFilter}, +~~ models.FloatField: {'filter_class': NumberFilter}, +~~ models.NullBooleanField: {'filter_class': BooleanFilter}, +~~ models.SlugField: {'filter_class': CharFilter}, +~~ models.EmailField: {'filter_class': CharFilter}, +~~ models.FilePathField: {'filter_class': CharFilter}, +~~ models.URLField: {'filter_class': CharFilter}, +~~ models.GenericIPAddressField: {'filter_class': CharFilter}, +~~ models.CommaSeparatedIntegerField: {'filter_class': CharFilter}, +~~ models.UUIDField: {'filter_class': UUIDFilter}, + +~~ models.OneToOneField: { + 'filter_class': ModelChoiceFilter, + 'extra': lambda f: { + 'queryset': remote_queryset(f), + 'to_field_name': f.remote_field.field_name, + 'null_label': settings.NULL_CHOICE_LABEL if f.null else None, + } + }, +~~ models.ForeignKey: { + 'filter_class': ModelChoiceFilter, + 'extra': lambda f: { + 'queryset': remote_queryset(f), + 'to_field_name': f.remote_field.field_name, + 'null_label': settings.NULL_CHOICE_LABEL if f.null else None, + } + }, +~~ models.ManyToManyField: { + 'filter_class': ModelMultipleChoiceFilter, + 'extra': lambda f: { + 'queryset': remote_queryset(f), + } + }, + + OneToOneRel: { + 'filter_class': ModelChoiceFilter, + 'extra': lambda f: { + 'queryset': remote_queryset(f), + 'null_label': settings.NULL_CHOICE_LABEL if f.null else None, + } + }, + ManyToOneRel: { + 'filter_class': ModelMultipleChoiceFilter, + 'extra': lambda f: { + 'queryset': remote_queryset(f), + } + }, + ManyToManyRel: { + 'filter_class': ModelMultipleChoiceFilter, + 'extra': lambda f: { + 'queryset': remote_queryset(f), + } + + +## ... source file abbreviated to get to models examples ... + + + queryset = self._meta.model._default_manager.all() + model = queryset.model + + self.is_bound = data is not None + self.data = data or {} + self.queryset = queryset + self.request = request + self.form_prefix = prefix + + self.filters = copy.deepcopy(self.base_filters) + + for filter_ in self.filters.values(): + filter_.model = model + filter_.parent = self + + def is_valid(self): + return self.is_bound and self.form.is_valid() + + @property + def errors(self): + return self.form.errors + + def filter_queryset(self, queryset): + for name, value in self.form.cleaned_data.items(): + queryset = self.filters[name].filter(queryset, value) +~~ assert isinstance(queryset, models.QuerySet), \ + "Expected '%s.%s' to return a QuerySet, but got a %s instead." \ + % (type(self).__name__, name, type(queryset).__name__) + return queryset + + @property + def qs(self): + if not hasattr(self, '_qs'): + qs = self.queryset.all() + if self.is_bound: + self.errors + qs = self.filter_queryset(qs) + self._qs = qs + return self._qs + + def get_form_class(self): + fields = OrderedDict([ + (name, filter_.field) + for name, filter_ in self.filters.items()]) + + return type(str('%sForm' % self.__class__.__name__), + (self._meta.form,), fields) + + @property + def form(self): + + +## ... source file abbreviated to get to models examples ... + + + "%s resolved field '%s' with '%s' lookup to an unrecognized field " + "type %s. Try adding an override to 'Meta.filter_overrides'. See: " + "https://django-filter.readthedocs.io/en/master/ref/filterset.html" + "#customise-filter-generation-with-filter-overrides" + ) % (cls.__name__, field_name, lookup_expr, field.__class__.__name__) + + return filter_class(**default) + + @classmethod + def filter_for_lookup(cls, field, lookup_type): + DEFAULTS = dict(cls.FILTER_DEFAULTS) + if hasattr(cls, '_meta'): + DEFAULTS.update(cls._meta.filter_overrides) + + data = try_dbfield(DEFAULTS.get, field.__class__) or {} + filter_class = data.get('filter_class') + params = data.get('extra', lambda field: {})(field) + + if not filter_class: + return None, {} + + if lookup_type == 'exact' and getattr(field, 'choices', None): + return ChoiceFilter, {'choices': field.choices} + + if lookup_type == 'isnull': +~~ data = try_dbfield(DEFAULTS.get, models.BooleanField) + + filter_class = data.get('filter_class') + params = data.get('extra', lambda field: {})(field) + return filter_class, params + + if lookup_type == 'in': + class ConcreteInFilter(BaseInFilter, filter_class): + pass + ConcreteInFilter.__name__ = cls._csv_filter_class_name( + filter_class, lookup_type + ) + + return ConcreteInFilter, params + + if lookup_type == 'range': + class ConcreteRangeFilter(BaseRangeFilter, filter_class): + pass + ConcreteRangeFilter.__name__ = cls._csv_filter_class_name( + filter_class, lookup_type + ) + + return ConcreteRangeFilter, params + + return filter_class, params + + +## ... source file continues with no further models examples... + +``` + + +## Example 9 from django-flexible-subscriptions +[django-flexible-subscriptions](https://github.com/studybuffalo/django-flexible-subscriptions) +([project documentation](https://django-flexible-subscriptions.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-flexible-subscriptions/)) +provides boilerplate code for adding subscription and recurrent billing +to [Django](/django.html) web applications. Various payment providers +can be added on the back end to run the transactions. + +The django-flexible-subscriptions project is open sourced under the +[GNU General Public License v3.0](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/LICENSE). + +[**django-flexible-subscriptions / subscriptions / models.py**](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/subscriptions/./models.py) + +```python +# models.py +from datetime import timedelta +from uuid import uuid4 + +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group +from django.core.validators import MinValueValidator +~~from django.db import models +from django.utils.translation import gettext_lazy as _ + + +ONCE = '0' +SECOND = '1' +MINUTE = '2' +HOUR = '3' +DAY = '4' +WEEK = '5' +MONTH = '6' +YEAR = '7' +RECURRENCE_UNIT_CHOICES = ( + (ONCE, 'once'), + (SECOND, 'second'), + (MINUTE, 'minute'), + (HOUR, 'hour'), + (DAY, 'day'), + (WEEK, 'week'), + (MONTH, 'month'), + (YEAR, 'year'), +) + + +class PlanTag(models.Model): +~~ tag = models.CharField( + help_text=_('the tag name'), + max_length=64, + unique=True, + ) + + class Meta: + ordering = ('tag',) + + def __str__(self): + return self.tag + + +class SubscriptionPlan(models.Model): +~~ id = models.UUIDField( + default=uuid4, + editable=False, + primary_key=True, + verbose_name='ID', + ) +~~ plan_name = models.CharField( + help_text=_('the name of the subscription plan'), + max_length=128, + ) +~~ slug = models.SlugField( + blank=True, + help_text=_('slug to reference the subscription plan'), + max_length=128, + null=True, + unique=True, + ) +~~ plan_description = models.CharField( + blank=True, + help_text=_('a description of the subscription plan'), + max_length=512, + null=True, + ) +~~ group = models.ForeignKey( + Group, + blank=True, + help_text=_('the Django auth group for this plan'), + null=True, +~~ on_delete=models.SET_NULL, + related_name='plans', + ) +~~ tags = models.ManyToManyField( + PlanTag, + blank=True, + help_text=_('any tags associated with this plan'), + related_name='plans', + ) +~~ grace_period = models.PositiveIntegerField( + default=0, + help_text=_( + 'how many days after the subscription ends before the ' + 'subscription expires' + ), + ) + + class Meta: + ordering = ('plan_name',) + permissions = ( + ('subscriptions', 'Can interact with subscription details'), + ) + + def __str__(self): + return self.plan_name + + def display_tags(self): + if self.tags.count() > 3: + return '{}, ...'.format( + ', '.join(tag.tag for tag in self.tags.all()[:3]) + ) + + return ', '.join(tag.tag for tag in self.tags.all()[:3]) + + +class PlanCost(models.Model): +~~ id = models.UUIDField( + default=uuid4, + editable=False, + primary_key=True, + verbose_name='ID', + ) +~~ plan = models.ForeignKey( + SubscriptionPlan, + help_text=_('the subscription plan for these cost details'), +~~ on_delete=models.CASCADE, + related_name='costs', + ) +~~ slug = models.SlugField( + blank=True, + help_text=_('slug to reference these cost details'), + max_length=128, + null=True, + unique=True, + ) +~~ recurrence_period = models.PositiveSmallIntegerField( + default=1, + help_text=_('how often the plan is billed (per recurrence unit)'), + validators=[MinValueValidator(1)], + ) +~~ recurrence_unit = models.CharField( + choices=RECURRENCE_UNIT_CHOICES, + default=MONTH, + max_length=1, + ) +~~ cost = models.DecimalField( + blank=True, + decimal_places=4, + help_text=_('the cost per recurrence of the plan'), + max_digits=19, + null=True, + ) + + class Meta: + ordering = ('recurrence_unit', 'recurrence_period', 'cost',) + + @property + def display_recurrent_unit_text(self): + conversion = { + ONCE: 'one-time', + SECOND: 'per second', + MINUTE: 'per minute', + HOUR: 'per hour', + DAY: 'per day', + WEEK: 'per week', + MONTH: 'per month', + YEAR: 'per year', + } + + return conversion[self.recurrence_unit] + + +## ... source file abbreviated to get to models examples ... + + + if self.recurrence_unit == SECOND: + delta = timedelta(seconds=self.recurrence_period) + elif self.recurrence_unit == MINUTE: + delta = timedelta(minutes=self.recurrence_period) + elif self.recurrence_unit == HOUR: + delta = timedelta(hours=self.recurrence_period) + elif self.recurrence_unit == DAY: + delta = timedelta(days=self.recurrence_period) + elif self.recurrence_unit == WEEK: + delta = timedelta(weeks=self.recurrence_period) + elif self.recurrence_unit == MONTH: + delta = timedelta( + days=30.4368 * self.recurrence_period + ) + elif self.recurrence_unit == YEAR: + delta = timedelta( + days=365.2425 * self.recurrence_period + ) + else: + return None + + return current + delta + + +class UserSubscription(models.Model): +~~ id = models.UUIDField( + default=uuid4, + editable=False, + primary_key=True, + verbose_name='ID', + ) +~~ user = models.ForeignKey( + get_user_model(), + help_text=_('the user this subscription applies to'), + null=True, +~~ on_delete=models.CASCADE, + related_name='subscriptions', + ) +~~ subscription = models.ForeignKey( + PlanCost, + help_text=_('the plan costs and billing frequency for this user'), + null=True, +~~ on_delete=models.CASCADE, + related_name='subscriptions' + ) +~~ date_billing_start = models.DateTimeField( + blank=True, + help_text=_('the date to start billing this subscription'), + null=True, + verbose_name='billing start date', + ) +~~ date_billing_end = models.DateTimeField( + blank=True, + help_text=_('the date to finish billing this subscription'), + null=True, + verbose_name='billing start end', + ) +~~ date_billing_last = models.DateTimeField( + blank=True, + help_text=_('the last date this plan was billed'), + null=True, + verbose_name='last billing date', + ) +~~ date_billing_next = models.DateTimeField( + blank=True, + help_text=_('the next date billing is due'), + null=True, + verbose_name='next start date', + ) +~~ active = models.BooleanField( + default=True, + help_text=_('whether this subscription is active or not'), + ) +~~ cancelled = models.BooleanField( + default=False, + help_text=_('whether this subscription is cancelled or not'), + ) + + class Meta: + ordering = ('user', 'date_billing_start',) + + +class SubscriptionTransaction(models.Model): +~~ id = models.UUIDField( + default=uuid4, + editable=False, + primary_key=True, + verbose_name='ID', + ) +~~ user = models.ForeignKey( + get_user_model(), + help_text=_('the user that this subscription was billed for'), + null=True, +~~ on_delete=models.SET_NULL, + related_name='subscription_transactions' + ) +~~ subscription = models.ForeignKey( + PlanCost, + help_text=_('the plan costs that were billed'), + null=True, +~~ on_delete=models.SET_NULL, + related_name='transactions' + ) +~~ date_transaction = models.DateTimeField( + help_text=_('the datetime the transaction was billed'), + verbose_name='transaction date', + ) +~~ amount = models.DecimalField( + blank=True, + decimal_places=4, + help_text=_('how much was billed for the user'), + max_digits=19, + null=True, + ) + + class Meta: + ordering = ('date_transaction', 'user',) + + +class PlanList(models.Model): +~~ title = models.TextField( + blank=True, + help_text=_('title to display on the subscription plan list page'), + null=True, + ) +~~ slug = models.SlugField( + blank=True, + help_text=_('slug to reference the subscription plan list'), + max_length=128, + null=True, + unique=True, + ) +~~ subtitle = models.TextField( + blank=True, + help_text=_('subtitle to display on the subscription plan list page'), + null=True, + ) +~~ header = models.TextField( + blank=True, + help_text=_('header text to display on the subscription plan list page'), + null=True, + ) +~~ footer = models.TextField( + blank=True, + help_text=_('header text to display on the subscription plan list page'), + null=True, + ) +~~ active = models.BooleanField( + default=True, + help_text=_('whether this plan list is active or not.'), + ) + + def __str__(self): + return self.title + + +class PlanListDetail(models.Model): +~~ plan = models.ForeignKey( + SubscriptionPlan, +~~ on_delete=models.CASCADE, + related_name='plan_list_details', + ) +~~ plan_list = models.ForeignKey( + PlanList, +~~ on_delete=models.CASCADE, + related_name='plan_list_details', + ) +~~ html_content = models.TextField( + blank=True, + help_text=_('HTML content to display for plan'), + null=True, + ) +~~ subscribe_button_text = models.CharField( + blank=True, + default='Subscribe', + max_length=128, + null=True, + ) +~~ order = models.PositiveIntegerField( + default=1, + help_text=_('Order to display plan in (lower numbers displayed first)'), + ) + + def __str__(self): + return 'Plan List {} - {}'.format( + self.plan_list, self.plan.plan_name + ) + + + +## ... source file continues with no further models examples... + +``` + + +## Example 10 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / backends.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./backends.py) + +```python +# backends.py +from django.contrib.auth import get_user_model +~~from django.db import models +from guardian.conf import settings +from guardian.core import ObjectPermissionChecker +from guardian.ctypes import get_content_type +from guardian.exceptions import WrongAppError + + +def check_object_support(obj): +~~ return isinstance(obj, models.Model) + + +def check_user_support(user_obj): + if not user_obj.is_authenticated: + if settings.ANONYMOUS_USER_NAME is None: + return False, user_obj + User = get_user_model() + lookup = {User.USERNAME_FIELD: settings.ANONYMOUS_USER_NAME} + user_obj = User.objects.get(**lookup) + + return True, user_obj + + +def check_support(user_obj, obj): + obj_support = check_object_support(obj) + user_support, user_obj = check_user_support(user_obj) + return obj_support and user_support, user_obj + + +class ObjectPermissionBackend: + supports_object_permissions = True + supports_anonymous_user = True + supports_inactive_user = True + + + +## ... source file continues with no further models examples... + +``` + + +## Example 11 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / signals.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./signals.py) + +```python +# signals.py +~~from django.db import models + +from haystack.exceptions import NotHandled + + +class BaseSignalProcessor(object): + + def __init__(self, connections, connection_router): + self.connections = connections + self.connection_router = connection_router + self.setup() + + def setup(self): + pass + + def teardown(self): + pass + + def handle_save(self, sender, instance, **kwargs): + using_backends = self.connection_router.for_write(instance=instance) + + for using in using_backends: + try: + index = self.connections[using].get_unified_index().get_index(sender) + index.update_object(instance, using=using) + except NotHandled: + pass + + def handle_delete(self, sender, instance, **kwargs): + using_backends = self.connection_router.for_write(instance=instance) + + for using in using_backends: + try: + index = self.connections[using].get_unified_index().get_index(sender) + index.remove_object(instance, using=using) + except NotHandled: + pass + + +class RealtimeSignalProcessor(BaseSignalProcessor): + + def setup(self): +~~ models.signals.post_save.connect(self.handle_save) +~~ models.signals.post_delete.connect(self.handle_delete) + + def teardown(self): +~~ models.signals.post_save.disconnect(self.handle_save) +~~ models.signals.post_delete.disconnect(self.handle_delete) + + + +## ... source file continues with no further models examples... + +``` + + +## Example 12 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / models.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./models.py) + +```python +# models.py +~~from django.db import models +from django.utils import timezone +from django.utils.encoding import python_2_unicode_compatible +from django.utils.translation import ugettext_lazy as _ + + +@python_2_unicode_compatible +class Bookmark(models.Model): +~~ url = models.URLField(verbose_name=_('URL')) +~~ title = models.CharField(verbose_name=_('title'), max_length=255) +~~ user = models.PositiveIntegerField(verbose_name=_('user')) +~~ date_add = models.DateTimeField(verbose_name=_('date created'), default=timezone.now) + + class Meta: + verbose_name = _('bookmark') + verbose_name_plural = _('bookmarks') + ordering = ('date_add',) + + def __str__(self): + return self.title + + +@python_2_unicode_compatible +class PinnedApplication(models.Model): +~~ app_label = models.CharField(verbose_name=_('application name'), max_length=255) +~~ user = models.PositiveIntegerField(verbose_name=_('user')) +~~ date_add = models.DateTimeField(verbose_name=_('date created'), default=timezone.now) + + class Meta: + verbose_name = _('pinned application') + verbose_name_plural = _('pinned applications') + ordering = ('date_add',) + + def __str__(self): + return self.app_label + + + + +## ... source file continues with no further models examples... + +``` + + +## Example 13 from django-jsonfield +[django-jsonfield](https://github.com/dmkoch/django-jsonfield) +([jsonfield on PyPi](https://pypi.org/project/jsonfield/)) is a +[Django](/django.html) code library that makes it easier to store validated +JSON in a [Django object-relational mapper (ORM)](/django-orm.html) database +model. + +The django-jsonfield project is open source under the +[MIT license](https://github.com/dmkoch/django-jsonfield/blob/master/LICENSE). + +[**django-jsonfield / src/jsonfield / fields.py**](https://github.com/dmkoch/django-jsonfield/blob/master/src/jsonfield/./fields.py) + +```python +# fields.py +import copy +import json +import warnings + +~~from django.db import models +from django.forms import ValidationError +from django.utils.translation import gettext_lazy as _ + +from . import forms +from .encoder import JSONEncoder +from .json import JSONString, checked_loads + +DEFAULT_DUMP_KWARGS = { + 'cls': JSONEncoder, +} + +DEFAULT_LOAD_KWARGS = {} + +INVALID_JSON_WARNING = ( + '{0!s} failed to load invalid json ({1}) from the database. The value has ' + 'been returned as a string instead.' +) + + +class JSONFieldMixin(models.Field): + form_class = forms.JSONField + + def __init__(self, *args, dump_kwargs=None, load_kwargs=None, **kwargs): + self.dump_kwargs = DEFAULT_DUMP_KWARGS if dump_kwargs is None else dump_kwargs + + +## ... source file abbreviated to get to models examples ... + + + def get_prep_value(self, value): + if self.null and value is None: + return None + return json.dumps(value, **self.dump_kwargs) + + def value_to_string(self, obj): + value = self.value_from_object(obj) + return json.dumps(value, **self.dump_kwargs) + + def formfield(self, **kwargs): + kwargs.setdefault('form_class', self.form_class) + if issubclass(kwargs['form_class'], forms.JSONField): + kwargs.setdefault('dump_kwargs', self.dump_kwargs) + kwargs.setdefault('load_kwargs', self.load_kwargs) + + return super().formfield(**kwargs) + + def get_default(self): + if self.has_default(): + if callable(self.default): + return self.default() + return copy.deepcopy(self.default) + return super().get_default() + + +~~class JSONField(JSONFieldMixin, models.TextField): + + def formfield(self, **kwargs): + field = super().formfield(**kwargs) + if isinstance(field, forms.JSONField): + field.dump_kwargs.setdefault('indent', 4) + field.dump_kwargs.setdefault('ensure_ascii', False) + return field + + +~~class JSONCharField(JSONFieldMixin, models.CharField): + + + +## ... source file continues with no further models examples... + +``` + + +## Example 14 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / models.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./models.py) + +```python +# models.py +from django.core.exceptions import ImproperlyConfigured +~~from django.db import models, transaction, router +from django.db.models.signals import post_save, pre_save +from django.utils.translation import gettext_lazy as _ + +from model_utils.fields import ( + AutoCreatedField, + AutoLastModifiedField, + StatusField, + MonitorField, + UUIDField, +) +from model_utils.managers import ( + QueryManager, + SoftDeletableManager, +) + +from django.db.models.functions import Now +now = Now() + + +class TimeStampedModel(models.Model): + created = AutoCreatedField(_('created')) + modified = AutoLastModifiedField(_('modified')) + + def save(self, *args, **kwargs): + if 'update_fields' in kwargs and 'modified' not in kwargs['update_fields']: + kwargs['update_fields'] += ['modified'] + super().save(*args, **kwargs) + + class Meta: + abstract = True + + +class TimeFramedModel(models.Model): +~~ start = models.DateTimeField(_('start'), null=True, blank=True) +~~ end = models.DateTimeField(_('end'), null=True, blank=True) + + class Meta: + abstract = True + + +class StatusModel(models.Model): + status = StatusField(_('status')) + status_changed = MonitorField(_('status changed'), monitor='status') + + class Meta: + abstract = True + + +def add_status_query_managers(sender, **kwargs): + if not issubclass(sender, StatusModel): + return + + default_manager = sender._meta.default_manager + + for value, display in getattr(sender, 'STATUS', ()): + if _field_exists(sender, value): + raise ImproperlyConfigured( + "StatusModel: Model '%s' has a field named '%s' which " + "conflicts with a status of the same name." + % (sender.__name__, value) + ) + sender.add_to_class(value, QueryManager(status=value)) + + sender._meta.default_manager_name = default_manager.name + + +def add_timeframed_query_manager(sender, **kwargs): + if not issubclass(sender, TimeFramedModel): + return + if _field_exists(sender, 'timeframed'): + raise ImproperlyConfigured( + "Model '%s' has a field named 'timeframed' " + "which conflicts with the TimeFramedModel manager." + % sender.__name__ + ) + sender.add_to_class('timeframed', QueryManager( +~~ (models.Q(start__lte=now) | models.Q(start__isnull=True)) +~~ & (models.Q(end__gte=now) | models.Q(end__isnull=True)) + )) + + +models.signals.class_prepared.connect(add_status_query_managers) +models.signals.class_prepared.connect(add_timeframed_query_manager) + + +def _field_exists(model_class, field_name): + return field_name in [f.attname for f in model_class._meta.local_fields] + + +class SoftDeletableModel(models.Model): +~~ is_removed = models.BooleanField(default=False) + + class Meta: + abstract = True + + objects = SoftDeletableManager() +~~ all_objects = models.Manager() + + def delete(self, using=None, soft=True, *args, **kwargs): + if soft: + self.is_removed = True + self.save(using=using) + else: + return super().delete(using=using, *args, **kwargs) + + +class UUIDModel(models.Model): + id = UUIDField( + primary_key=True, + version=4, + editable=False, + ) + + class Meta: + abstract = True + + +class SaveSignalHandlingModel(models.Model): + class Meta: + abstract = True + + + +## ... source file continues with no further models examples... + +``` + + +## Example 15 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / models.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./models.py) + +```python +# models.py +import logging +from datetime import timedelta +from urllib.parse import parse_qsl, urlparse + +from django.apps import apps +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +~~from django.db import models, transaction +from django.urls import reverse +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + +from .generators import generate_client_id, generate_client_secret +from .scopes import get_scopes_backend +from .settings import oauth2_settings +from .validators import RedirectURIValidator, WildcardSet + + +logger = logging.getLogger(__name__) + + +class AbstractApplication(models.Model): + CLIENT_CONFIDENTIAL = "confidential" + CLIENT_PUBLIC = "public" + CLIENT_TYPES = ( + (CLIENT_CONFIDENTIAL, _("Confidential")), + (CLIENT_PUBLIC, _("Public")), + ) + + GRANT_AUTHORIZATION_CODE = "authorization-code" + GRANT_IMPLICIT = "implicit" + GRANT_PASSWORD = "password" + GRANT_CLIENT_CREDENTIALS = "client-credentials" + GRANT_TYPES = ( + (GRANT_AUTHORIZATION_CODE, _("Authorization code")), + (GRANT_IMPLICIT, _("Implicit")), + (GRANT_PASSWORD, _("Resource owner password-based")), + (GRANT_CLIENT_CREDENTIALS, _("Client credentials")), + ) + +~~ id = models.BigAutoField(primary_key=True) +~~ client_id = models.CharField( + max_length=100, unique=True, default=generate_client_id, db_index=True + ) +~~ user = models.ForeignKey( + settings.AUTH_USER_MODEL, + related_name="%(app_label)s_%(class)s", +~~ null=True, blank=True, on_delete=models.CASCADE + ) + +~~ redirect_uris = models.TextField( + blank=True, help_text=_("Allowed URIs list, space separated"), + ) +~~ client_type = models.CharField(max_length=32, choices=CLIENT_TYPES) +~~ authorization_grant_type = models.CharField( + max_length=32, choices=GRANT_TYPES + ) +~~ client_secret = models.CharField( + max_length=255, blank=True, default=generate_client_secret, db_index=True + ) +~~ name = models.CharField(max_length=255, blank=True) +~~ skip_authorization = models.BooleanField(default=False) + +~~ created = models.DateTimeField(auto_now_add=True) +~~ updated = models.DateTimeField(auto_now=True) + + class Meta: + abstract = True + + def __str__(self): + return self.name or self.client_id + + @property + def default_redirect_uri(self): + if self.redirect_uris: + return self.redirect_uris.split().pop(0) + + assert False, ( + "If you are using implicit, authorization_code" + "or all-in-one grant_type, you must define " + "redirect_uris field in your Application model" + ) + + def redirect_uri_allowed(self, uri): + parsed_uri = urlparse(uri) + uqs_set = set(parse_qsl(parsed_uri.query)) + for allowed_uri in self.redirect_uris.split(): + parsed_allowed_uri = urlparse(allowed_uri) + + + +## ... source file abbreviated to get to models examples ... + + + + +class ApplicationManager(models.Manager): + def get_by_natural_key(self, client_id): + return self.get(client_id=client_id) + + +class Application(AbstractApplication): + objects = ApplicationManager() + + class Meta(AbstractApplication.Meta): + swappable = "OAUTH2_PROVIDER_APPLICATION_MODEL" + + def natural_key(self): + return (self.client_id,) + + +class AbstractGrant(models.Model): + CODE_CHALLENGE_PLAIN = "plain" + CODE_CHALLENGE_S256 = "S256" + CODE_CHALLENGE_METHODS = ( + (CODE_CHALLENGE_PLAIN, "plain"), + (CODE_CHALLENGE_S256, "S256") + ) + +~~ id = models.BigAutoField(primary_key=True) +~~ user = models.ForeignKey( +~~ settings.AUTH_USER_MODEL, on_delete=models.CASCADE, + related_name="%(app_label)s_%(class)s" + ) +~~ code = models.CharField(max_length=255, unique=True) # code comes from oauthlib +~~ application = models.ForeignKey( +~~ oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE + ) +~~ expires = models.DateTimeField() +~~ redirect_uri = models.CharField(max_length=255) +~~ scope = models.TextField(blank=True) + +~~ created = models.DateTimeField(auto_now_add=True) +~~ updated = models.DateTimeField(auto_now=True) + +~~ code_challenge = models.CharField(max_length=128, blank=True, default="") +~~ code_challenge_method = models.CharField( + max_length=10, blank=True, default="", choices=CODE_CHALLENGE_METHODS) + + def is_expired(self): + if not self.expires: + return True + + return timezone.now() >= self.expires + + def redirect_uri_allowed(self, uri): + return uri == self.redirect_uri + + def __str__(self): + return self.code + + class Meta: + abstract = True + + +class Grant(AbstractGrant): + class Meta(AbstractGrant.Meta): + swappable = "OAUTH2_PROVIDER_GRANT_MODEL" + + +class AbstractAccessToken(models.Model): +~~ id = models.BigAutoField(primary_key=True) +~~ user = models.ForeignKey( +~~ settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True, + related_name="%(app_label)s_%(class)s" + ) +~~ source_refresh_token = models.OneToOneField( +~~ oauth2_settings.REFRESH_TOKEN_MODEL, on_delete=models.SET_NULL, blank=True, null=True, + related_name="refreshed_access_token" + ) +~~ token = models.CharField(max_length=255, unique=True, ) +~~ application = models.ForeignKey( +~~ oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE, blank=True, null=True, + ) +~~ expires = models.DateTimeField() +~~ scope = models.TextField(blank=True) + +~~ created = models.DateTimeField(auto_now_add=True) +~~ updated = models.DateTimeField(auto_now=True) + + def is_valid(self, scopes=None): + return not self.is_expired() and self.allow_scopes(scopes) + + def is_expired(self): + if not self.expires: + return True + + return timezone.now() >= self.expires + + def allow_scopes(self, scopes): + if not scopes: + return True + + provided_scopes = set(self.scope.split()) + resource_scopes = set(scopes) + + return resource_scopes.issubset(provided_scopes) + + def revoke(self): + self.delete() + + @property + def scopes(self): + all_scopes = get_scopes_backend().get_all_scopes() + token_scopes = self.scope.split() + return {name: desc for name, desc in all_scopes.items() if name in token_scopes} + + def __str__(self): + return self.token + + class Meta: + abstract = True + + +class AccessToken(AbstractAccessToken): + class Meta(AbstractAccessToken.Meta): + swappable = "OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL" + + +class AbstractRefreshToken(models.Model): +~~ id = models.BigAutoField(primary_key=True) +~~ user = models.ForeignKey( +~~ settings.AUTH_USER_MODEL, on_delete=models.CASCADE, + related_name="%(app_label)s_%(class)s" + ) +~~ token = models.CharField(max_length=255) +~~ application = models.ForeignKey( +~~ oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE) +~~ access_token = models.OneToOneField( +~~ oauth2_settings.ACCESS_TOKEN_MODEL, on_delete=models.SET_NULL, blank=True, null=True, + related_name="refresh_token" + ) + +~~ created = models.DateTimeField(auto_now_add=True) +~~ updated = models.DateTimeField(auto_now=True) +~~ revoked = models.DateTimeField(null=True) + + def revoke(self): + access_token_model = get_access_token_model() + refresh_token_model = get_refresh_token_model() + with transaction.atomic(): + self = refresh_token_model.objects.filter( + pk=self.pk, revoked__isnull=True + ).select_for_update().first() + if not self: + return + + try: + access_token_model.objects.get(id=self.access_token_id).revoke() + except access_token_model.DoesNotExist: + pass + self.access_token = None + self.revoked = timezone.now() + self.save() + + def __str__(self): + return self.token + + class Meta: + abstract = True + + +## ... source file continues with no further models examples... + +``` + + +## Example 16 from django-push-notifications +[django-push-notifications](https://github.com/jazzband/django-push-notifications) +is a [Django](/django.html) app for storing and interacting with +push notification services such as +[Google's Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/) +and +[Apple Notifications](https://developer.apple.com/notifications/). +The django-push-notification project's source code is available +open source under the +[MIT license](https://github.com/jazzband/django-push-notifications/blob/master/LICENSE). + +[**django-push-notifications / push_notifications / models.py**](https://github.com/jazzband/django-push-notifications/blob/master/push_notifications/./models.py) + +```python +# models.py +~~from django.db import models +from django.utils.translation import ugettext_lazy as _ + +from .fields import HexIntegerField +from .settings import PUSH_NOTIFICATIONS_SETTINGS as SETTINGS + + +CLOUD_MESSAGE_TYPES = ( + ("FCM", "Firebase Cloud Message"), + ("GCM", "Google Cloud Message"), +) + +BROWSER_TYPES = ( + ("CHROME", "Chrome"), + ("FIREFOX", "Firefox"), + ("OPERA", "Opera"), +) + + +class Device(models.Model): +~~ name = models.CharField(max_length=255, verbose_name=_("Name"), blank=True, null=True) +~~ active = models.BooleanField( + verbose_name=_("Is active"), default=True, + help_text=_("Inactive devices will not be sent notifications") + ) +~~ user = models.ForeignKey( +~~ SETTINGS["USER_MODEL"], blank=True, null=True, on_delete=models.CASCADE + ) +~~ date_created = models.DateTimeField( + verbose_name=_("Creation date"), auto_now_add=True, null=True + ) +~~ application_id = models.CharField( + max_length=64, verbose_name=_("Application ID"), + help_text=_( + "Opaque application identity, should be filled in for multiple" + " key/certificate access" + ), + blank=True, null=True + ) + + class Meta: + abstract = True + + def __str__(self): + return ( + self.name or + str(self.device_id or "") or + "{} for {}".format(self.__class__.__name__, self.user or "unknown user") + ) + + +class GCMDeviceManager(models.Manager): + def get_queryset(self): + return GCMDeviceQuerySet(self.model) + + + + +## ... source file abbreviated to get to models examples ... + + + + app_ids = self.filter(active=True).order_by( + "application_id" + ).values_list("application_id", flat=True).distinct() + response = [] + for cloud_type in ("FCM", "GCM"): + for app_id in app_ids: + reg_ids = list( + self.filter( + active=True, cloud_message_type=cloud_type, application_id=app_id).values_list( + "registration_id", flat=True + ) + ) + if reg_ids: + r = gcm_send_message(reg_ids, data, cloud_type, application_id=app_id, **kwargs) + response.append(r) + + return response + + +class GCMDevice(Device): + device_id = HexIntegerField( + verbose_name=_("Device ID"), blank=True, null=True, db_index=True, + help_text=_("ANDROID_ID / TelephonyManager.getDeviceId() (always as hex)") + ) +~~ registration_id = models.TextField(verbose_name=_("Registration ID"), unique=SETTINGS["UNIQUE_REG_ID"]) +~~ cloud_message_type = models.CharField( + verbose_name=_("Cloud Message Type"), max_length=3, + choices=CLOUD_MESSAGE_TYPES, default="GCM", + help_text=_("You should choose FCM or GCM") + ) + objects = GCMDeviceManager() + + class Meta: + verbose_name = _("GCM device") + + def send_message(self, message, **kwargs): + from .gcm import send_message as gcm_send_message + + data = kwargs.pop("extra", {}) + if message is not None: + data["message"] = message + + return gcm_send_message( + self.registration_id, data, self.cloud_message_type, + application_id=self.application_id, **kwargs + ) + + +class APNSDeviceManager(models.Manager): + def get_queryset(self): + + +## ... source file abbreviated to get to models examples ... + + + +class APNSDeviceQuerySet(models.query.QuerySet): + def send_message(self, message, creds=None, **kwargs): + if self: + from .apns import apns_send_bulk_message + + app_ids = self.filter(active=True).order_by("application_id")\ + .values_list("application_id", flat=True).distinct() + res = [] + for app_id in app_ids: + reg_ids = list(self.filter(active=True, application_id=app_id).values_list( + "registration_id", flat=True) + ) + r = apns_send_bulk_message( + registration_ids=reg_ids, alert=message, application_id=app_id, + creds=creds, **kwargs + ) + if hasattr(r, "keys"): + res += [r] + elif hasattr(r, "__getitem__"): + res += r + return res + + +class APNSDevice(Device): +~~ device_id = models.UUIDField( + verbose_name=_("Device ID"), blank=True, null=True, db_index=True, + help_text="UDID / UIDevice.identifierForVendor()" + ) +~~ registration_id = models.CharField( + verbose_name=_("Registration ID"), max_length=200, unique=SETTINGS["UNIQUE_REG_ID"] + ) + + objects = APNSDeviceManager() + + class Meta: + verbose_name = _("APNS device") + + def send_message(self, message, creds=None, **kwargs): + from .apns import apns_send_message + + return apns_send_message( + registration_id=self.registration_id, + alert=message, + application_id=self.application_id, creds=creds, + **kwargs + ) + + +class WNSDeviceManager(models.Manager): + def get_queryset(self): + return WNSDeviceQuerySet(self.model) + + +class WNSDeviceQuerySet(models.query.QuerySet): + def send_message(self, message, **kwargs): + from .wns import wns_send_bulk_message + + app_ids = self.filter(active=True).order_by("application_id").values_list( + "application_id", flat=True + ).distinct() + res = [] + for app_id in app_ids: + reg_ids = self.filter(active=True, application_id=app_id).values_list( + "registration_id", flat=True + ) + r = wns_send_bulk_message(uri_list=list(reg_ids), message=message, **kwargs) + if hasattr(r, "keys"): + res += [r] + elif hasattr(r, "__getitem__"): + res += r + + return res + + +class WNSDevice(Device): +~~ device_id = models.UUIDField( + verbose_name=_("Device ID"), blank=True, null=True, db_index=True, + help_text=_("GUID()") + ) +~~ registration_id = models.TextField(verbose_name=_("Notification URI"), unique=SETTINGS["UNIQUE_REG_ID"]) + + objects = WNSDeviceManager() + + class Meta: + verbose_name = _("WNS device") + + def send_message(self, message, **kwargs): + from .wns import wns_send_message + + return wns_send_message( + uri=self.registration_id, message=message, application_id=self.application_id, + **kwargs + ) + + +class WebPushDeviceManager(models.Manager): + def get_queryset(self): + return WebPushDeviceQuerySet(self.model) + + +class WebPushDeviceQuerySet(models.query.QuerySet): + def send_message(self, message, **kwargs): + devices = self.filter(active=True).order_by("application_id").distinct() + res = [] + for device in devices: + res.append(device.send_message(message)) + + return res + + +class WebPushDevice(Device): +~~ registration_id = models.TextField(verbose_name=_("Registration ID"), unique=SETTINGS["UNIQUE_REG_ID"]) +~~ p256dh = models.CharField( + verbose_name=_("User public encryption key"), + max_length=88) +~~ auth = models.CharField( + verbose_name=_("User auth secret"), + max_length=24) +~~ browser = models.CharField( + verbose_name=_("Browser"), max_length=10, + choices=BROWSER_TYPES, default=BROWSER_TYPES[0][0], + help_text=_("Currently only support to Chrome, Firefox and Opera browsers") + ) + objects = WebPushDeviceManager() + + class Meta: + verbose_name = _("WebPush device") + + @property + def device_id(self): + return None + + def send_message(self, message, **kwargs): + from .webpush import webpush_send_message + + return webpush_send_message( + uri=self.registration_id, message=message, browser=self.browser, + auth=self.auth, p256dh=self.p256dh, application_id=self.application_id, **kwargs) + + + +## ... source file continues with no further models examples... + +``` + + +## Example 17 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / serializers.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./serializers.py) + +```python +# serializers.py +import copy +import inspect +import traceback +from collections import OrderedDict, defaultdict +from collections.abc import Mapping + +from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.core.exceptions import ValidationError as DjangoValidationError +~~from django.db import models +from django.db.models.fields import Field as DjangoModelField +from django.utils import timezone +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ + +from rest_framework.compat import postgres_fields +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.fields import get_error_detail, set_value +from rest_framework.settings import api_settings +from rest_framework.utils import html, model_meta, representation +from rest_framework.utils.field_mapping import ( + ClassLookupDict, get_field_kwargs, get_nested_relation_kwargs, + get_relation_kwargs, get_url_kwargs +) +from rest_framework.utils.serializer_helpers import ( + BindingDict, BoundField, JSONBoundField, NestedBoundField, ReturnDict, + ReturnList +) +from rest_framework.validators import ( + UniqueForDateValidator, UniqueForMonthValidator, UniqueForYearValidator, + UniqueTogetherValidator +) + +from rest_framework.fields import ( # NOQA # isort:skip + + +## ... source file abbreviated to get to models examples ... + + + + if not self.allow_empty and len(data) == 0: + message = self.error_messages['empty'] + raise ValidationError({ + api_settings.NON_FIELD_ERRORS_KEY: [message] + }, code='empty') + + ret = [] + errors = [] + + for item in data: + try: + validated = self.child.run_validation(item) + except ValidationError as exc: + errors.append(exc.detail) + else: + ret.append(validated) + errors.append({}) + + if any(errors): + raise ValidationError(errors) + + return ret + + def to_representation(self, data): +~~ iterable = data.all() if isinstance(data, models.Manager) else data + + return [ + self.child.to_representation(item) for item in iterable + ] + + def validate(self, attrs): + return attrs + + def update(self, instance, validated_data): + raise NotImplementedError( + "Serializers with many=True do not support multiple update by " + "default, only multiple create. For updates it is unclear how to " + "deal with insertions and deletions. If you need to support " + "multiple update, use a `ListSerializer` class and override " + "`.update()` so you can specify the behavior exactly." + ) + + def create(self, validated_data): + return [ + self.child.create(attrs) for attrs in validated_data + ] + + def save(self, **kwargs): + assert 'commit' not in kwargs, ( + + +## ... source file abbreviated to get to models examples ... + + + module=serializer.__class__.__module__, + class_name=serializer.__class__.__name__ + ) + ) + + assert not any( + len(field.source_attrs) > 1 and + (field.source_attrs[0] in validated_data) and + (field.source_attrs[0] in model_field_info.relations) and + isinstance(validated_data[field.source_attrs[0]], (list, dict)) + for field in serializer._writable_fields + ), ( + 'The `.{method_name}()` method does not support writable dotted-source ' + 'fields by default.\nWrite an explicit `.{method_name}()` method for ' + 'serializer `{module}.{class_name}`, or set `read_only=True` on ' + 'dotted-source serializer fields.'.format( + method_name=method_name, + module=serializer.__class__.__module__, + class_name=serializer.__class__.__name__ + ) + ) + + +class ModelSerializer(Serializer): + serializer_field_mapping = { +~~ models.AutoField: IntegerField, +~~ models.BigIntegerField: IntegerField, +~~ models.BooleanField: BooleanField, +~~ models.CharField: CharField, +~~ models.CommaSeparatedIntegerField: CharField, +~~ models.DateField: DateField, +~~ models.DateTimeField: DateTimeField, +~~ models.DecimalField: DecimalField, +~~ models.DurationField: DurationField, +~~ models.EmailField: EmailField, +~~ models.Field: ModelField, +~~ models.FileField: FileField, +~~ models.FloatField: FloatField, +~~ models.ImageField: ImageField, +~~ models.IntegerField: IntegerField, +~~ models.NullBooleanField: BooleanField, +~~ models.PositiveIntegerField: IntegerField, +~~ models.PositiveSmallIntegerField: IntegerField, +~~ models.SlugField: SlugField, +~~ models.SmallIntegerField: IntegerField, +~~ models.TextField: CharField, +~~ models.TimeField: TimeField, +~~ models.URLField: URLField, +~~ models.UUIDField: UUIDField, +~~ models.GenericIPAddressField: IPAddressField, +~~ models.FilePathField: FilePathField, + } + if postgres_fields: + serializer_field_mapping[postgres_fields.HStoreField] = HStoreField + serializer_field_mapping[postgres_fields.ArrayField] = ListField + serializer_field_mapping[postgres_fields.JSONField] = JSONField + serializer_related_field = PrimaryKeyRelatedField + serializer_related_to_field = SlugRelatedField + serializer_url_field = HyperlinkedIdentityField + serializer_choice_field = ChoiceField + + url_field_name = None + + def create(self, validated_data): + raise_errors_on_nested_writes('create', self, validated_data) + + ModelClass = self.Meta.model + + info = model_meta.get_field_info(ModelClass) + many_to_many = {} + for field_name, relation_info in info.relations.items(): + if relation_info.to_many and (field_name in validated_data): + many_to_many[field_name] = validated_data.pop(field_name) + + try: + + +## ... source file continues with no further models examples... + +``` + + +## Example 18 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / models.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./models.py) + +```python +# models.py +from django.contrib.auth.models import Permission +~~from django.db import models +from django.utils.translation import gettext_lazy as _ + +from .settings import MODEL_TREE, TREE_ITEMS_ALIASES + + +class CharFieldNullable(models.CharField): + def get_prep_value(self, value): + if value is not None: + if value.strip() == '': + return None + return self.to_python(value) + + +class TreeBase(models.Model): + +~~ title = models.CharField( + _('Title'), max_length=100, help_text=_('Site tree title for presentational purposes.'), blank=True) + +~~ alias = models.CharField( + _('Alias'), max_length=80, + help_text=_('Short name to address site tree from templates.
Note: change with care.'), + unique=True, db_index=True) + + class Meta: + abstract = True + verbose_name = _('Site Tree') + verbose_name_plural = _('Site Trees') + + def get_title(self) -> str: + return self.title or self.alias + + def __str__(self) -> str: + return self.alias + + +class TreeItemBase(models.Model): + + PERM_TYPE_ANY = 1 + PERM_TYPE_ALL = 2 + + PERM_TYPE_CHOICES = { + PERM_TYPE_ANY: _('Any'), + PERM_TYPE_ALL: _('All'), + } + +~~ title = models.CharField( + _('Title'), max_length=100, + help_text=_('Site tree item title. Can contain template variables E.g.: {{ mytitle }}.')) + +~~ hint = models.CharField( + _('Hint'), max_length=200, + help_text=_('Some additional information about this item that is used as a hint.'), blank=True, default='') + +~~ url = models.CharField( + _('URL'), max_length=200, + help_text=_('Exact URL or URL pattern (see "Additional settings") for this item.'), db_index=True) + +~~ urlaspattern = models.BooleanField( + _('URL as Pattern'), + help_text=_('Whether the given URL should be treated as a pattern.
' + 'Note: Refer to Django "URL dispatcher" documentation (e.g. "Naming URL patterns" part).'), + db_index=True, default=False) + +~~ tree = models.ForeignKey( +~~ MODEL_TREE, related_name='%(class)s_tree', on_delete=models.CASCADE, verbose_name=_('Site Tree'), + help_text=_('Site tree this item belongs to.'), db_index=True) + +~~ hidden = models.BooleanField( + _('Hidden'), help_text=_('Whether to show this item in navigation.'), db_index=True, default=False) + + alias = CharFieldNullable( + _('Alias'), max_length=80, + help_text=_( + 'Short name to address site tree item from a template.
' + 'Reserved aliases: "%s".' % '", "'.join(TREE_ITEMS_ALIASES) + ), + db_index=True, blank=True, null=True) + +~~ description = models.TextField( + _('Description'), + help_text=_('Additional comments on this item.'), blank=True, default='') + +~~ inmenu = models.BooleanField( + _('Show in menu'), + help_text=_('Whether to show this item in a menu.'), db_index=True, default=True) + +~~ inbreadcrumbs = models.BooleanField( + _('Show in breadcrumb path'), + help_text=_('Whether to show this item in a breadcrumb path.'), db_index=True, default=True) + +~~ insitetree = models.BooleanField( + _('Show in site tree'), + help_text=_('Whether to show this item in a site tree.'), db_index=True, default=True) + +~~ access_loggedin = models.BooleanField( + _('Logged in only'), + help_text=_('Check it to grant access to this item to authenticated users only.'), + db_index=True, default=False) + +~~ access_guest = models.BooleanField( + _('Guests only'), + help_text=_('Check it to grant access to this item to guests only.'), db_index=True, default=False) + +~~ access_restricted = models.BooleanField( + _('Restrict access to permissions'), + help_text=_('Check it to restrict user access to this item, using Django permissions system.'), + db_index=True, default=False) + +~~ access_permissions = models.ManyToManyField( + Permission, verbose_name=_('Permissions granting access'), blank=True) + +~~ access_perm_type = models.IntegerField( + _('Permissions interpretation'), + help_text=_('Any — user should have any of chosen permissions. ' + 'All — user should have all chosen permissions.'), + choices=PERM_TYPE_CHOICES.items(), default=PERM_TYPE_ANY) + +~~ parent = models.ForeignKey( +~~ 'self', related_name='%(class)s_parent', on_delete=models.CASCADE, verbose_name=_('Parent'), + help_text=_('Parent site tree item.'), db_index=True, null=True, blank=True) + +~~ sort_order = models.IntegerField( + _('Sort order'), + help_text=_('Item position among other site tree items under the same parent.'), db_index=True, default=0) + + def save(self, force_insert=False, force_update=False, **kwargs): + if self.parent == self: + self.parent = None + + id_ = self.id + if id_ and self.sort_order == 0: + self.sort_order = id_ + + super().save(force_insert, force_update, **kwargs) + + if self.sort_order == 0: + self.sort_order = self.id + self.save() + + class Meta: + abstract = True + verbose_name = _('Site Tree Item') + verbose_name_plural = _('Site Tree Items') + unique_together = ('tree', 'alias') + + def __str__(self) -> str: + + +## ... source file continues with no further models examples... + +``` + + +## Example 19 from django-smithy +[django-smithy](https://github.com/jamiecounsell/django-smithy) is +a [Django](/django.html) code library that allows users to send +HTTP requests from the Django admin user interface. The code for +the project is open source under the +[MIT license](https://github.com/jamiecounsell/django-smithy/blob/master/LICENSE). + +[**django-smithy / smithy / models.py**](https://github.com/jamiecounsell/django-smithy/blob/master/smithy/./models.py) + +```python +# models.py + +~~from django.db import models +from django.db.models.signals import post_save +from django.dispatch import receiver +from requests import Request as HTTPRequest, Session +from requests.cookies import create_cookie, RequestsCookieJar +from urllib.parse import parse_qs, urlparse, urlencode +from requests_toolbelt.utils import dump + +from model_utils.models import TimeStampedModel + +from smithy.helpers import render_with_context, parse_dump_result + + +class NameValueModel(TimeStampedModel): +~~ name = models.CharField(max_length = 200) +~~ value = models.TextField(blank = True) + + def __str__(self): + return self.name + + class Meta: + abstract = True + + +class Request(TimeStampedModel): + METHODS = ( + ('GET', 'GET'), + ('POST', 'POST'), + ('PUT', 'PUT'), + ('DELETE', 'DELETE'), + ('OPTIONS', 'OPTIONS'), + ('HEAD', 'HEAD'), + ) + BODY_TYPES = ( + ('', 'Other'), + ('application/x-www-form-urlencoded', 'x-www-form-urlencoded'), + ('application/json', 'JSON'), + ('text/plain', 'Text'), + ('application/javascript', 'JavaScript'), + ('application/xml', 'XML (application/xml)'), + ('text/xml', 'XML (text/xml)'), + ('text/html', 'HTML'), + ) +~~ method = models.CharField( + max_length = 7, choices = METHODS, + blank = False, null = False) +~~ name = models.CharField(max_length = 500, blank = False) +~~ url = models.CharField(max_length = 2083) +~~ body = models.TextField(blank = True) +~~ content_type = models.CharField( + default = BODY_TYPES[0][0], + blank = True, null = True, + max_length = 100, choices = BODY_TYPES) + + def __str__(self): + if self.name: + return self.name + return "{} {}".format( + self.method, + self.url, + ) + + +class RequestBlueprint(Request): +~~ follow_redirects = models.BooleanField( + default = False, blank = False, null = False) + + @property + def name_value_related(self): + return [ + self.headers, + self.query_parameters, + self.cookies + ] + + def send(self, context = None): + + context = context or {} + for variable in self.variables.all(): + context[variable.name] = variable.value + + request = HTTPRequest( + url = render_with_context(self.url, context), + method = self.method) + + session = Session() + record = RequestRecord.objects.create(blueprint = self) + + for qs in self.name_value_related: + + +## ... source file abbreviated to get to models examples ... + + + obj.save() + + if self.content_type == self.BODY_TYPES[0][0]: + data = render_with_context(self.body, context) + else: + data = {} + for param in self.body_parameters.all(): + param.add_to(data, context) + + request.data = data + prepared_request = request.prepare() + + response = session.send(prepared_request, stream = True) + + RequestRecord.objects.filter(pk = record.pk).update( + raw_request = parse_dump_result(dump._dump_request_data, prepared_request), + raw_response = parse_dump_result(dump._dump_response_data, response), + status = response.status_code, + **RequestRecord.get_clone_args(self, context) + ) + + return RequestRecord.objects.get(pk = record.pk) + + +class RequestRecord(Request): +~~ raw_request = models.TextField() +~~ raw_response = models.TextField() +~~ status = models.PositiveIntegerField(null = True) +~~ blueprint = models.ForeignKey( + 'smithy.RequestBlueprint', +~~ on_delete = models.SET_NULL, + null = True) + + @property + def is_success(self): + return self.status and self.status < 400 + + @staticmethod + def of_blueprint(blueprint): + return RequestRecord.objects.filter( + blueprint = blueprint) + + @classmethod + def get_clone_args(cls, obj, context : dict): + return dict([ + ( + render_with_context(fld.name, context), + render_with_context(getattr(obj, fld.name), context) + ) + for fld \ + in cls._meta.fields \ + if fld.name != obj._meta.pk \ + and fld in obj._meta.fields \ + and fld.name not in [ + 'request', 'id', 'created', 'updated' + ]]) + + +class Variable(NameValueModel): +~~ request = models.ForeignKey( + 'smithy.RequestBlueprint', +~~ on_delete = models.CASCADE, + related_name = 'variables') + + +class BodyParameter(NameValueModel): +~~ request = models.ForeignKey( + 'smithy.RequestBlueprint', +~~ on_delete = models.CASCADE, + related_name = 'body_parameters') + + def add_to(self, payload : dict, context: dict): + if self.name and self.value: + payload[ + render_with_context(self.name, context) + ] = render_with_context(self.value, context) + else: + pass # TODO: warn + + +class Header(NameValueModel): +~~ request = models.ForeignKey( + 'smithy.Request', +~~ on_delete = models.CASCADE, + related_name = 'headers') + + def add_to(self, request : HTTPRequest): + if self.name and self.value: + request.headers[self.name] = self.value + else: + pass # TODO: warn + + +class QueryParameter(NameValueModel): +~~ request = models.ForeignKey( + 'smithy.Request', +~~ on_delete = models.CASCADE, + related_name = 'query_parameters') + + def add_to(self, request : HTTPRequest): + existing_param_str = urlparse(request.url).query + param_dict = parse_qs(existing_param_str) + + param_dict[self.name] = self.value + + base_url = request.url.rstrip(existing_param_str) + param_str = urlencode(param_dict, doseq=True) + request.url = base_url.rstrip("?") + "?" + param_str + + +class Cookie(NameValueModel): +~~ request = models.ForeignKey( + 'smithy.Request', +~~ on_delete = models.CASCADE, + related_name = 'cookies') + + def add_to(self, request : HTTPRequest): + request.cookies = request.cookies or RequestsCookieJar() + request.cookies.set_cookie( + create_cookie(self.name, self.value) + ) + + +@receiver(post_save, sender = RequestBlueprint) +def add_content_type(sender, instance : RequestBlueprint, created, **kwargs): + if created and not instance.headers.filter(name__iexact = 'content-type').exists(): + instance.content_type and Header.objects.create( + name = 'Content-Type', + value = instance.content_type, + request = instance.request_ptr + ) + + + +## ... source file continues with no further models examples... + +``` + + +## Example 20 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / models.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./models.py) + +```python +# models.py +from __future__ import unicode_literals + +import logging +from time import time +import six + +~~from django.db import models, DatabaseError +try: + from django.urls import reverse +except ImportError: + from django.core.urlresolvers import reverse + +from django.conf import settings + +from explorer import app_settings +from explorer.utils import ( + passes_blacklist, + swap_params, + extract_params, + shared_dict_update, + get_s3_bucket, + get_params_for_url, + get_valid_connection +) + +MSG_FAILED_BLACKLIST = "Query failed the SQL blacklist: %s" + + +logger = logging.getLogger(__name__) + +@six.python_2_unicode_compatible +class Query(models.Model): +~~ title = models.CharField(max_length=255) +~~ sql = models.TextField() +~~ description = models.TextField(null=True, blank=True) +~~ created_by_user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.CASCADE) +~~ created_at = models.DateTimeField(auto_now_add=True) +~~ last_run_date = models.DateTimeField(auto_now=True) +~~ snapshot = models.BooleanField(default=False, help_text="Include in snapshot task (if enabled)") +~~ connection = models.CharField(blank=True, null=True, max_length=128, + help_text="Name of DB connection (as specified in settings) to use for this query. Will use EXPLORER_DEFAULT_CONNECTION if left blank") + + def __init__(self, *args, **kwargs): + self.params = kwargs.get('params') + kwargs.pop('params', None) + super(Query, self).__init__(*args, **kwargs) + + class Meta: + ordering = ['title'] + verbose_name_plural = 'Queries' + + def __str__(self): + return six.text_type(self.title) + + def get_run_count(self): + return self.querylog_set.count() + + def avg_duration(self): + return self.querylog_set.aggregate(models.Avg('duration'))['duration__avg'] + + def passes_blacklist(self): + return passes_blacklist(self.final_sql()) + + def final_sql(self): + + +## ... source file abbreviated to get to models examples ... + + + return ql + + @property + def shared(self): + return self.id in set(sum(app_settings.EXPLORER_GET_USER_QUERY_VIEWS().values(), [])) + + @property + def snapshots(self): + if app_settings.ENABLE_TASKS: + b = get_s3_bucket() + keys = b.list(prefix='query-%s/snap-' % self.id) + keys_s = sorted(keys, key=lambda k: k.last_modified) + return [SnapShot(k.generate_url(expires_in=0, query_auth=False), + k.last_modified) for k in keys_s] + + +class SnapShot(object): + + def __init__(self, url, last_modified): + self.url = url + self.last_modified = last_modified + + +class QueryLog(models.Model): + +~~ sql = models.TextField(null=True, blank=True) +~~ query = models.ForeignKey(Query, null=True, blank=True, on_delete=models.SET_NULL) +~~ run_by_user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.CASCADE) +~~ run_at = models.DateTimeField(auto_now_add=True) +~~ duration = models.FloatField(blank=True, null=True) # milliseconds +~~ connection = models.CharField(blank=True, null=True, max_length=128) + + @property + def is_playground(self): + return self.query_id is None + + class Meta: + ordering = ['-run_at'] + + +class QueryResult(object): + + def __init__(self, sql, connection): + + self.sql = sql + self.connection = connection + + cursor, duration = self.execute_query() + + self._description = cursor.description or [] + self._data = [list(r) for r in cursor.fetchall()] + self.duration = duration + + cursor.close() + + + +## ... source file continues with no further models examples... + +``` + + +## Example 21 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / utils.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/./utils.py) + +```python +# utils.py +import inspect +import warnings +from collections import OrderedDict +from functools import total_ordering +from itertools import chain + +from django.core.exceptions import FieldDoesNotExist +~~from django.db import models +from django.utils.html import format_html_join + + +class Sequence(list): + + def expand(self, columns): + ellipses = self.count("...") + if ellipses > 1: + raise ValueError("'...' must be used at most once in a sequence.") + elif ellipses == 0: + self.append("...") + + columns = list(columns) # take a copy and exhaust the generator + head = [] + tail = [] + target = head # start by adding things to the head + for name in self: + if name == "...": + target = tail + continue + target.append(name) + if name in columns: + columns.pop(columns.index(name)) + self[:] = chain(head, columns, tail) + + +## ... source file abbreviated to get to models examples ... + + + + return instance + + def resolve(self, context, safe=True, quiet=False): + if isinstance(context, dict) and self in context: + return context[self] + + try: + current = context + for bit in self.bits: + try: # dictionary lookup + current = current[bit] + except (TypeError, AttributeError, KeyError): + try: # attribute lookup + current = getattr(current, bit) + except (TypeError, AttributeError): + try: # list-index lookup + current = current[int(bit)] + except ( + IndexError, # list index out of range + ValueError, # invalid literal for int() + KeyError, # dict without `int(bit)` key + TypeError, # unsubscriptable object + ): + current_context = ( +~~ type(current) if isinstance(current, models.Model) else current + ) + + raise ValueError( + self.LOOKUP_ERROR_FMT.format( + key=bit, context=current_context, accessor=self + ) + ) + if callable(current): + if safe and getattr(current, "alters_data", False): + raise ValueError(self.ALTERS_DATA_ERROR_FMT.format(method=repr(current))) + if not getattr(current, "do_not_call_in_templates", False): + current = current() + if current is None: + break + return current + except Exception: + if not quiet: + raise + + @property + def bits(self): + if self == "": + return () + return self.split(self.SEPARATOR) + + +## ... source file continues with no further models examples... + +``` + + +## Example 22 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / models.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./models.py) + +```python +# models.py +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +~~from django.db import IntegrityError, models, router, transaction +from django.utils.text import slugify +from django.utils.translation import gettext, gettext_lazy as _ + +try: + from unidecode import unidecode +except ImportError: + + def unidecode(tag): + return tag + + +class TagBase(models.Model): +~~ name = models.CharField(verbose_name=_("name"), unique=True, max_length=100) +~~ slug = models.SlugField(verbose_name=_("slug"), unique=True, max_length=100) + + def __str__(self): + return self.name + + def __gt__(self, other): + return self.name.lower() > other.name.lower() + + def __lt__(self, other): + return self.name.lower() < other.name.lower() + + class Meta: + abstract = True + + def save(self, *args, **kwargs): + if self._state.adding and not self.slug: + self.slug = self.slugify(self.name) + using = kwargs.get("using") or router.db_for_write( + type(self), instance=self + ) + kwargs["using"] = using + try: + with transaction.atomic(using=using): + res = super().save(*args, **kwargs) + return res + + +## ... source file abbreviated to get to models examples ... + + + @classmethod + def tag_model(cls): + field = cls._meta.get_field("tag") + return field.remote_field.model + + @classmethod + def tag_relname(cls): + field = cls._meta.get_field("tag") + return field.remote_field.related_name + + @classmethod + def lookup_kwargs(cls, instance): + return {"content_object": instance} + + @classmethod + def tags_for(cls, model, instance=None, **extra_filters): + kwargs = extra_filters or {} + if instance is not None: + kwargs.update({"%s__content_object" % cls.tag_relname(): instance}) + return cls.tag_model().objects.filter(**kwargs) + kwargs.update({"%s__content_object__isnull" % cls.tag_relname(): False}) + return cls.tag_model().objects.filter(**kwargs).distinct() + + +class TaggedItemBase(ItemBase): +~~ tag = models.ForeignKey( +~~ Tag, related_name="%(app_label)s_%(class)s_items", on_delete=models.CASCADE + ) + + class Meta: + abstract = True + + +class CommonGenericTaggedItemBase(ItemBase): +~~ content_type = models.ForeignKey( + ContentType, +~~ on_delete=models.CASCADE, + verbose_name=_("content type"), + related_name="%(app_label)s_%(class)s_tagged_items", + ) + content_object = GenericForeignKey() + + class Meta: + abstract = True + + @classmethod + def lookup_kwargs(cls, instance): + return { + "object_id": instance.pk, + "content_type": ContentType.objects.get_for_model(instance), + } + + @classmethod + def tags_for(cls, model, instance=None, **extra_filters): + tag_relname = cls.tag_relname() + model = model._meta.concrete_model + kwargs = { + "%s__content_type__app_label" % tag_relname: model._meta.app_label, + "%s__content_type__model" % tag_relname: model._meta.model_name, + } + if instance is not None: + kwargs["%s__object_id" % tag_relname] = instance.pk + if extra_filters: + kwargs.update(extra_filters) + return cls.tag_model().objects.filter(**kwargs).distinct() + + +class GenericTaggedItemBase(CommonGenericTaggedItemBase): +~~ object_id = models.IntegerField(verbose_name=_("object ID"), db_index=True) + + class Meta: + abstract = True + + +class GenericUUIDTaggedItemBase(CommonGenericTaggedItemBase): +~~ object_id = models.UUIDField(verbose_name=_("object ID"), db_index=True) + + class Meta: + abstract = True + + +class TaggedItem(GenericTaggedItemBase, TaggedItemBase): + class Meta: + verbose_name = _("tagged item") + verbose_name_plural = _("tagged items") + app_label = "taggit" + index_together = [["content_type", "object_id"]] + unique_together = [["content_type", "object_id", "tag"]] + + + +## ... source file continues with no further models examples... + +``` + + +## Example 23 from django-user-visit +[django-user-visit](https://github.com/yunojuno/django-user-visit) +([PyPI package information](https://pypi.org/project/django-user-visit/)) +is a [Django](/django.html) app and +[middleware](https://docs.djangoproject.com/en/stable/topics/http/middleware/) +for tracking daily user visits to your web application. The goal +is to record per user per day instead of for every request a user +sends to the application. The project is provided as open source +under the +[MIT license](https://github.com/yunojuno/django-user-visit/blob/master/LICENSE). + +[**django-user-visit / user_visit / models.py**](https://github.com/yunojuno/django-user-visit/blob/master/user_visit/./models.py) + +```python +# models.py +from __future__ import annotations + +import datetime +import hashlib +import uuid +from typing import Any + +import user_agents +from django.conf import settings +~~from django.db import models +from django.http import HttpRequest +from django.utils import timezone + + +def parse_remote_addr(request: HttpRequest) -> str: + x_forwarded_for = request.headers.get("X-Forwarded-For", "") + if x_forwarded_for: + return x_forwarded_for.split(",")[0] + return request.META.get("REMOTE_ADDR", "") + + +def parse_ua_string(request: HttpRequest) -> str: + return request.headers.get("User-Agent", "") + + +class UserVisitManager(models.Manager): + + def build(self, request: HttpRequest, timestamp: datetime.datetime) -> UserVisit: + uv = UserVisit( + user=request.user, + timestamp=timestamp, + session_key=request.session.session_key, + remote_addr=parse_remote_addr(request), + ua_string=parse_ua_string(request), + ) + uv.hash = uv.md5().hexdigest() + return uv + + +class UserVisit(models.Model): + +~~ user = models.ForeignKey( +~~ settings.AUTH_USER_MODEL, related_name="user_visits", on_delete=models.CASCADE + ) +~~ timestamp = models.DateTimeField( + help_text="The time at which the first visit of the day was recorded", + default=timezone.now, + ) +~~ session_key = models.CharField(help_text="Django session identifier", max_length=40) +~~ remote_addr = models.CharField( + help_text=( + "Client IP address (from X-Forwarded-For HTTP header, " + "or REMOTE_ADDR request property)" + ), + max_length=100, + blank=True, + ) +~~ ua_string = models.TextField( + "User agent (raw)", help_text="Client User-Agent HTTP header", blank=True, + ) +~~ uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) +~~ hash = models.CharField( + max_length=32, + help_text="MD5 hash generated from request properties", + unique=True, + ) +~~ created_at = models.DateTimeField( + help_text="The time at which the database record was created (!=timestamp)", + auto_now_add=True, + ) + + objects = UserVisitManager() + + class Meta: + get_latest_by = "timestamp" + + def __str__(self) -> str: + return f"{self.user} visited the site on {self.timestamp}" + + def __repr__(self) -> str: + return f"" + + def save(self, *args: Any, **kwargs: Any) -> None: + self.hash = self.md5().hexdigest() + super().save(*args, **kwargs) + + @property + def user_agent(self) -> user_agents.parsers.UserAgent: + return user_agents.parsers.parse(self.ua_string) + + @property + + +## ... source file continues with no further models examples... + +``` + + +## Example 24 from django-webshell +[django-webshell](https://github.com/onrik/django-webshell) is an extension +for executing arbitrary code in the +[Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/), +similar to how you can run code by using the `django manage.py shell` +command from the terminal. + +The django-webshell project is provided as open source under the +[MIT license](https://github.com/onrik/django-webshell/blob/master/LICENSE). + +[**django-webshell / webshell / models.py**](https://github.com/onrik/django-webshell/blob/master/webshell/./models.py) + +```python +# models.py +~~from django.db import models +from django.utils.translation import ugettext_lazy as _ + + +class Script(models.Model): +~~ name = models.CharField(_('Name'), max_length=100) +~~ source = models.TextField(_('Source')) + + class Meta: + verbose_name = _('Script') + verbose_name_plural = _('Scripts') + + def __unicode__(self): + return self.name + + + +## ... source file continues with no further models examples... + +``` + + +## Example 25 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / migrations / 0003_mptt_upgrade.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/migrations/0003_mptt_upgrade.py) + +```python +# 0003_mptt_upgrade.py +from django.db import migrations +~~from django.db import models + + +class Migration(migrations.Migration): + + dependencies = [ + ("wiki", "0002_urlpath_moved_to"), + ] + + operations = [ + migrations.AlterField( + model_name="urlpath", + name="level", +~~ field=models.PositiveIntegerField(editable=False), + ), + migrations.AlterField( + model_name="urlpath", + name="lft", +~~ field=models.PositiveIntegerField(editable=False), + ), + migrations.AlterField( + model_name="urlpath", + name="rght", +~~ field=models.PositiveIntegerField(editable=False), + ), + ] + + + +## ... source file continues with no further models examples... + +``` + + +## Example 26 from dmd-interpreter +[dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) +([running web app](http://www.dmd.nl/DOVE)) +is a Python tool to aggregate clinically relevant information related +to variants in the DMD gene and display that [data](/data.html) to a user +with a [Django](/django.html) web application. + +[**dmd-interpreter / interpreter / models.py**](https://github.com/mitchalexbailey/dmd-interpreter/blob/master/interpreter/./models.py) + +```python +# models.py +~~from django.db import models + +class Question(models.Model): +~~ question_text = models.CharField(max_length=200) +~~ pub_date = models.DateTimeField("Date Published") + def __unicode__(self): + return self.question_text + +class Choice(models.Model): +~~ question = models.ForeignKey(Question) +~~ choice_text = models.CharField(max_length=200) +~~ votes = models.IntegerField(default=0) + def __unicode__(self): + return self.choice_text + + + +## ... source file continues with no further models examples... + +``` + + +## Example 27 from drf-action-serializer +[drf-action-serializer](https://github.com/gregschmit/drf-action-serializer) +([PyPI page](https://pypi.org/project/drf-action-serializer/)) +that makes it easier to configure specific serializers to use based on the +client's request action. For example, a list view should have one serializer +whereas the detail view would have a different serializer. + +The project is open source under the +[MIT license](https://github.com/gregschmit/drf-action-serializer/blob/master/LICENSE). + +[**drf-action-serializer / action_serializer / tests.py**](https://github.com/gregschmit/drf-action-serializer/blob/master/action_serializer/./tests.py) + +```python +# tests.py + +import os + +~~from django.db import models +from django.test import TestCase + +from .serializers import ModelActionSerializer + + +def dedent(blocktext): + return "\n".join([line[12:] for line in blocktext.splitlines()[1:-1]]) + + +class RegularFieldsModel(models.Model): + +~~ auto_field = models.AutoField(primary_key=True) +~~ boolean_field = models.BooleanField(default=False) +~~ char_field = models.CharField(max_length=100) +~~ date_field = models.DateField() +~~ decimal_field = models.DecimalField(max_digits=3, decimal_places=1) +~~ email_field = models.EmailField(max_length=100) +~~ float_field = models.FloatField() +~~ integer_field = models.IntegerField() + + +class ModelActionSerializerTestCase(TestCase): + + def test_action_fields(self): + + class TestSerializer(ModelActionSerializer): + class Meta: + model = RegularFieldsModel + fields = "char_field" + action_fields = {"list": {"fields": ("auto_field", "char_field")}} + + expected = dedent( + ) + context = {"view": type("ActionView", (object,), {"action": "list"})} + self.assertEqual(repr(TestSerializer(context=context)), expected) + + def test_action_fields_different_action(self): + + class TestSerializer(ModelActionSerializer): + class Meta: + model = RegularFieldsModel + fields = ("char_field",) + action_fields = {"list": {"fields": ("auto_field", "char_field")}} + + +## ... source file abbreviated to get to models examples ... + + + ) + context = {"view": type("ActionView", (object,), {"action": "create"})} + self.assertEqual(repr(TestSerializer(context=context)), expected) + + def test_action_extra_kwargs(self): + + class TestSerializer(ModelActionSerializer): + class Meta: + model = RegularFieldsModel + fields = "char_field" + action_fields = { + "list": { + "fields": ("auto_field", "char_field"), + "extra_kwargs": { + "auto_field": {"required": False, "read_only": False} + }, + } + } + + expected = dedent( + ) + context = {"view": type("ActionView", (object,), {"action": "list"})} + self.assertEqual(repr(TestSerializer(context=context)), expected) + + def test_action_exclude(self): +~~ auto_field = models.AutoField(primary_key=True) +~~ boolean_field = models.BooleanField(default=False) +~~ char_field = models.CharField(max_length=100) +~~ date_field = models.DateField() +~~ decimal_field = models.DecimalField(max_digits=3, decimal_places=1) +~~ email_field = models.EmailField(max_length=100) +~~ float_field = models.FloatField() +~~ integer_field = models.IntegerField() + + class TestSerializer(ModelActionSerializer): + class Meta: + model = RegularFieldsModel + fields = "char_field" + action_fields = { + "list": { + "exclude": ( + "boolean_field", + "date_field", + "float_field", + "integer_field", + ) + } + } + + expected = dedent( + ) + context = {"view": type("ActionView", (object,), {"action": "list"})} + self.assertEqual(repr(TestSerializer(context=context)), expected) + + + +## ... source file continues with no further models examples... + +``` + + +## Example 28 from elasticsearch-django +[elasticsearch-django](https://github.com/yunojuno/elasticsearch-django) +([PyPI package information](https://pypi.org/project/elasticsearch-django/)) +is a [Django](/django.html) app for managing +[ElasticSearch](https://github.com/elastic/elasticsearch) indexes +populated by [Django ORM](/django-orm.html) models. The project is +available as open source under the +[MIT license](https://github.com/yunojuno/elasticsearch-django/blob/master/LICENSE). + +[**elasticsearch-django / elasticsearch_django / models.py**](https://github.com/yunojuno/elasticsearch-django/blob/master/elasticsearch_django/./models.py) + +```python +# models.py +from __future__ import annotations + +import logging +import time +import warnings +from typing import TYPE_CHECKING, Any, List, Optional, Tuple, Union + +from django.conf import settings +from django.contrib.postgres.fields import JSONField +from django.core.cache import cache +from django.core.serializers.json import DjangoJSONEncoder +~~from django.db import models +from django.db.models.expressions import RawSQL +from django.db.models.fields import CharField +from django.db.models.query import QuerySet +from django.utils.timezone import now as tz_now +from elasticsearch_dsl import Search + +from .settings import ( + get_client, + get_model_index_properties, + get_model_indexes, + get_setting, +) + +if TYPE_CHECKING: + from django.contrib.auth.models import AbstractBaseUser + +logger = logging.getLogger(__name__) + +UPDATE_STRATEGY_FULL = "full" +UPDATE_STRATEGY_PARTIAL = "partial" +UPDATE_STRATEGY = get_setting("update_strategy", UPDATE_STRATEGY_FULL) + + +class SearchDocumentManagerMixin(models.Manager): + + +## ... source file abbreviated to get to models examples ... + + + return + + get_client().update( + index=index, + doc_type=self.search_doc_type, + body={"doc": doc}, + id=self.pk, # type: ignore + ) + + def delete_search_document(self, *, index: str) -> None: + cache.delete(self.search_document_cache_key) + get_client().delete( + index=index, doc_type=self.search_doc_type, id=self.pk # type: ignore + ) + + +class SearchQuery(models.Model): + + QUERY_TYPE_SEARCH = "SEARCH" + QUERY_TYPE_COUNT = "COUNT" + QUERY_TYPE_CHOICES = ( + (QUERY_TYPE_SEARCH, "Search results"), + (QUERY_TYPE_COUNT, "Count only"), + ) + +~~ user = models.ForeignKey( + settings.AUTH_USER_MODEL, + related_name="search_queries", + blank=True, + null=True, + help_text="The user who made the search query (nullable).", +~~ on_delete=models.SET_NULL, + ) +~~ index = models.CharField( + max_length=100, + default="_all", + help_text="The name of the ElasticSearch index(es) being queried.", + ) +~~ search_terms = models.CharField( + max_length=400, + default="", + blank=True, + help_text=( + "Free text search terms used in the query, stored for easy reference." + ), + ) + query = JSONField( + help_text="The raw ElasticSearch DSL query.", encoder=DjangoJSONEncoder + ) + query_type = CharField( + help_text="Does this query return results, or just the hit count?", + choices=QUERY_TYPE_CHOICES, + default=QUERY_TYPE_SEARCH, + max_length=10, + ) + hits = JSONField( + help_text="The list of meta info for each of the query matches returned.", + encoder=DjangoJSONEncoder, + ) +~~ total_hits = models.IntegerField( + default=0, + help_text="Total number of matches found for the query (!= the hits returned).", + ) +~~ reference = models.CharField( + max_length=100, + default="", + blank=True, + help_text="Custom reference used to identify and group related searches.", + ) +~~ executed_at = models.DateTimeField( + help_text="When the search was executed - set via execute() method." + ) +~~ duration = models.FloatField( + help_text="Time taken to execute the search itself, in seconds." + ) + + class Meta: + app_label = "elasticsearch_django" + verbose_name = "Search query" + verbose_name_plural = "Search queries" + + def __str__(self) -> str: + return f"Query (id={self.pk}) run against index '{self.index}'" + + def __repr__(self) -> str: + return ( + f"" + ) + + def save(self, *args: Any, **kwargs: Any) -> SearchQuery: + if self.search_terms is None: + self.search_terms = "" + super().save(**kwargs) + return self + + def _extract_set(self, _property: str) -> List[Union[str, int]]: + + +## ... source file continues with no further models examples... + +``` + + +## Example 29 from gadget-board +[gadget-board](https://github.com/mik4el/gadget-board) is a +[Django](/django.html), +[Django REST Framework (DRF)](/django-rest-framework-drf.html) and +[Angular](/angular.html) web application that is open source under the +[Apache2 license](https://github.com/mik4el/gadget-board/blob/master/LICENSE). + +[**gadget-board / web / authentication / models.py**](https://github.com/mik4el/gadget-board/blob/master/web/authentication/models.py) + +```python +# models.py +from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin +~~from django.db import models +from django.contrib.auth.models import BaseUserManager + + +class AccountManager(BaseUserManager): + def create_account(self, username, password, **kwargs): + if not username: + raise ValueError('Users must have a valid username') + + if not password: + raise ValueError('Users must have a valid password.') + + if not kwargs.get('email'): + raise ValueError('Users must have a valid email.') + + account = self.model( + username=username, email=self.normalize_email(kwargs.get('email')) + ) + + account.is_active = True + + account.set_password(password) + account.save() + + return account + + def create_superuser(self, username, password, **kwargs): + account = self.create_account(username, password, **kwargs) + + account.is_superuser = True + + account.save() + + return account + + +class Account(AbstractBaseUser, PermissionsMixin): +~~ username = models.CharField(max_length=40, unique=True) +~~ email = models.EmailField() # users can share email + +~~ is_gadget = models.BooleanField(default=False) +~~ is_active = models.BooleanField(default=True) + +~~ created_at = models.DateTimeField(auto_now_add=True) +~~ updated_at = models.DateTimeField(auto_now=True) + + objects = AccountManager() + + USERNAME_FIELD = 'username' + REQUIRED_FIELDS = ['email'] + + def __str__(self): + return self.username + + def get_full_name(self): + return self.username + + def get_short_name(self): + return self.username + + @property + def is_staff(self): + "Is the user a member of staff?" + return self.is_superuser + + + +## ... source file continues with no further models examples... + +``` + + +## Example 30 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/models.py) + +```python +# models.py +import json +import logging +from collections import defaultdict +from io import StringIO +from urllib.parse import urlparse + +from django.conf import settings +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core import checks +from django.core.cache import cache +from django.core.exceptions import ValidationError +from django.core.handlers.base import BaseHandler +from django.core.handlers.wsgi import WSGIRequest +~~from django.db import models, transaction +from django.db.models import Case, Q, Value, When +from django.db.models.functions import Concat, Lower, Substr +from django.http import Http404 +from django.http.request import split_domain_port +from django.template.response import TemplateResponse +from django.urls import NoReverseMatch, reverse +from django.utils import timezone +from django.utils.cache import patch_cache_control +from django.utils.functional import cached_property +from django.utils.text import capfirst, slugify +from django.utils.translation import gettext_lazy as _ +from modelcluster.models import ( + ClusterableModel, get_all_child_m2m_relations, get_all_child_relations) +from treebeard.mp_tree import MP_Node + +from wagtail.core.query import PageQuerySet, TreeQuerySet +from wagtail.core.signals import page_published, page_unpublished, post_page_move, pre_page_move +from wagtail.core.sites import get_site_for_hostname +from wagtail.core.url_routing import RouteResult +from wagtail.core.utils import WAGTAIL_APPEND_SLASH, camelcase_to_underscore, resolve_model_string +from wagtail.search import index + + +logger = logging.getLogger('wagtail.core') + +PAGE_TEMPLATE_VAR = 'page' + + +class SiteManager(models.Manager): + def get_queryset(self): + return super(SiteManager, self).get_queryset().order_by(Lower("hostname")) + + def get_by_natural_key(self, hostname, port): + return self.get(hostname=hostname, port=port) + + +class Site(models.Model): +~~ hostname = models.CharField(verbose_name=_('hostname'), max_length=255, db_index=True) +~~ port = models.IntegerField( + verbose_name=_('port'), + default=80, + help_text=_( + "Set this to something other than 80 if you need a specific port number to appear in URLs" + " (e.g. development on port 8000). Does not affect request handling (so port forwarding still works)." + ) + ) +~~ site_name = models.CharField( + verbose_name=_('site name'), + max_length=255, + blank=True, + help_text=_("Human-readable name for the site.") + ) +~~ root_page = models.ForeignKey('Page', verbose_name=_('root page'), related_name='sites_rooted_here', on_delete=models.CASCADE) +~~ is_default_site = models.BooleanField( + verbose_name=_('is default site'), + default=False, + help_text=_( + "If true, this site will handle requests for all other hostnames that do not have a site entry of their own" + ) + ) + + objects = SiteManager() + + class Meta: + unique_together = ('hostname', 'port') + verbose_name = _('site') + verbose_name_plural = _('sites') + + def natural_key(self): + return (self.hostname, self.port) + + def __str__(self): + default_suffix = " [{}]".format(_("default")) + if self.site_name: + return( + self.site_name + + (default_suffix if self.is_default_site else "") + ) + + +## ... source file abbreviated to get to models examples ... + + + + if 'template' not in dct: + cls.template = "%s/%s.html" % (cls._meta.app_label, camelcase_to_underscore(name)) + + if 'ajax_template' not in dct: + cls.ajax_template = None + + cls._clean_subpage_models = None # to be filled in on first call to cls.clean_subpage_models + cls._clean_parent_page_models = None # to be filled in on first call to cls.clean_parent_page_models + + if 'is_creatable' not in dct: + cls.is_creatable = not cls._meta.abstract + + if not cls._meta.abstract: + PAGE_MODEL_CLASSES.append(cls) + + +class AbstractPage(MP_Node): + objects = PageManager() + + class Meta: + abstract = True + + +class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase): +~~ title = models.CharField( + verbose_name=_('title'), + max_length=255, + help_text=_("The page title as you'd like it to be seen by the public") + ) +~~ draft_title = models.CharField( + max_length=255, + editable=False + ) +~~ slug = models.SlugField( + verbose_name=_('slug'), + allow_unicode=True, + max_length=255, + help_text=_("The name of the page as it will appear in URLs e.g http://domain.com/blog/[my-slug]/") + ) +~~ content_type = models.ForeignKey( + ContentType, + verbose_name=_('content type'), + related_name='pages', +~~ on_delete=models.SET(get_default_page_content_type) + ) +~~ live = models.BooleanField(verbose_name=_('live'), default=True, editable=False) +~~ has_unpublished_changes = models.BooleanField( + verbose_name=_('has unpublished changes'), + default=False, + editable=False + ) +~~ url_path = models.TextField(verbose_name=_('URL path'), blank=True, editable=False) +~~ owner = models.ForeignKey( + settings.AUTH_USER_MODEL, + verbose_name=_('owner'), + null=True, + blank=True, + editable=True, +~~ on_delete=models.SET_NULL, + related_name='owned_pages' + ) + +~~ seo_title = models.CharField( + verbose_name=_("page title"), + max_length=255, + blank=True, + help_text=_("Optional. 'Search Engine Friendly' title. This will appear at the top of the browser window.") + ) + + show_in_menus_default = False +~~ show_in_menus = models.BooleanField( + verbose_name=_('show in menus'), + default=False, + help_text=_("Whether a link to this page will appear in automatically generated menus") + ) +~~ search_description = models.TextField(verbose_name=_('search description'), blank=True) + +~~ go_live_at = models.DateTimeField( + verbose_name=_("go live date/time"), + blank=True, + null=True + ) +~~ expire_at = models.DateTimeField( + verbose_name=_("expiry date/time"), + blank=True, + null=True + ) +~~ expired = models.BooleanField(verbose_name=_('expired'), default=False, editable=False) + +~~ locked = models.BooleanField(verbose_name=_('locked'), default=False, editable=False) +~~ locked_at = models.DateTimeField(verbose_name=_('locked at'), null=True, editable=False) +~~ locked_by = models.ForeignKey( + settings.AUTH_USER_MODEL, + verbose_name=_('locked by'), + null=True, + blank=True, + editable=False, +~~ on_delete=models.SET_NULL, + related_name='locked_pages' + ) + +~~ first_published_at = models.DateTimeField( + verbose_name=_('first published at'), + blank=True, + null=True, + db_index=True + ) +~~ last_published_at = models.DateTimeField( + verbose_name=_('last published at'), + null=True, + editable=False + ) +~~ latest_revision_created_at = models.DateTimeField( + verbose_name=_('latest revision created at'), + null=True, + editable=False + ) +~~ live_revision = models.ForeignKey( + 'PageRevision', + related_name='+', + verbose_name='live revision', +~~ on_delete=models.SET_NULL, + null=True, + blank=True, + editable=False + ) + + search_fields = [ + index.SearchField('title', partial_match=True, boost=2), + index.AutocompleteField('title'), + index.FilterField('title'), + index.FilterField('id'), + index.FilterField('live'), + index.FilterField('owner'), + index.FilterField('content_type'), + index.FilterField('path'), + index.FilterField('depth'), + index.FilterField('locked'), + index.FilterField('show_in_menus'), + index.FilterField('first_published_at'), + index.FilterField('last_published_at'), + index.FilterField('latest_revision_created_at'), + + +## ... source file abbreviated to get to models examples ... + + + self.title, + self.id, + cls._meta.app_label, + cls.__name__, + self.url_path + ) + + return result + + def delete(self, *args, **kwargs): + if type(self) is Page: + return super().delete(*args, **kwargs) + else: + return Page.objects.get(id=self.id).delete(*args, **kwargs) + + @classmethod + def check(cls, **kwargs): + errors = super(Page, cls).check(**kwargs) + + + field_exceptions = [field.name + for model in [cls] + list(cls._meta.get_parent_list()) + for field in model._meta.parents.values() if field] + + for field in cls._meta.fields: +~~ if isinstance(field, models.ForeignKey) and field.name not in field_exceptions: +~~ if field.remote_field.on_delete == models.CASCADE: + errors.append( + checks.Warning( + "Field hasn't specified on_delete action", +~~ hint="Set on_delete=models.SET_NULL and make sure the field is nullable or set on_delete=models.PROTECT. Wagtail does not allow simple database CASCADE because it will corrupt its tree storage.", + obj=field, + id='wagtailcore.W001', + ) + ) + + if not isinstance(cls.objects, PageManager): + errors.append( + checks.Error( + "Manager does not inherit from PageManager", + hint="Ensure that custom Page managers inherit from wagtail.core.models.PageManager", + obj=cls, + id='wagtailcore.E002', + ) + ) + + try: + cls.clean_subpage_models() + except (ValueError, LookupError) as e: + errors.append( + checks.Error( + + +## ... source file abbreviated to get to models examples ... + + + instance=new_self, + parent_page_before=parent_before, + parent_page_after=parent_after, + url_path_before=old_url_path, + url_path_after=new_url_path, + ) + + logger.info("Page moved: \"%s\" id=%d path=%s", self.title, self.id, new_url_path) + + def copy(self, recursive=False, to=None, update_attrs=None, copy_revisions=True, keep_live=True, user=None, process_child_object=None, exclude_fields=None): + specific_self = self.specific + default_exclude_fields = ['id', 'path', 'depth', 'numchild', 'url_path', 'path', 'index_entries'] + exclude_fields = default_exclude_fields + specific_self.exclude_fields_in_copy + (exclude_fields or []) + specific_dict = {} + + for field in specific_self._meta.get_fields(): + if field.name in exclude_fields: + continue + + if field.auto_created: + continue + + if field.many_to_many: + continue + +~~ if isinstance(field, models.OneToOneField) and field.remote_field.parent_link: + continue + + specific_dict[field.name] = getattr(specific_self, field.name) + + for related_field in get_all_child_m2m_relations(specific_self): + if related_field.name in exclude_fields: + continue + + field = getattr(specific_self, related_field.name) + if field and hasattr(field, 'all'): + values = field.all() + if values: + specific_dict[related_field.name] = values + + page_copy = self.specific_class(**specific_dict) + + if not keep_live: + page_copy.live = False + page_copy.has_unpublished_changes = True + page_copy.live_revision = None + page_copy.first_published_at = None + page_copy.last_published_at = None + + if user: + + +## ... source file abbreviated to get to models examples ... + + + + obj.path = self.path + obj.depth = self.depth + obj.numchild = self.numchild + + obj.set_url_path(self.get_parent()) + + obj.draft_title = self.draft_title + obj.live = self.live + obj.has_unpublished_changes = self.has_unpublished_changes + obj.owner = self.owner + obj.locked = self.locked + obj.locked_by = self.locked_by + obj.locked_at = self.locked_at + obj.latest_revision_created_at = self.latest_revision_created_at + obj.first_published_at = self.first_published_at + + return obj + + class Meta: + verbose_name = _('page') + verbose_name_plural = _('pages') + + +class Orderable(models.Model): +~~ sort_order = models.IntegerField(null=True, blank=True, editable=False) + sort_order_field = 'sort_order' + + class Meta: + abstract = True + ordering = ['sort_order'] + + +class SubmittedRevisionsManager(models.Manager): + def get_queryset(self): + return super().get_queryset().filter(submitted_for_moderation=True) + + +class PageRevision(models.Model): +~~ page = models.ForeignKey('Page', verbose_name=_('page'), related_name='revisions', on_delete=models.CASCADE) +~~ submitted_for_moderation = models.BooleanField( + verbose_name=_('submitted for moderation'), + default=False, + db_index=True + ) +~~ created_at = models.DateTimeField(db_index=True, verbose_name=_('created at')) +~~ user = models.ForeignKey( + settings.AUTH_USER_MODEL, verbose_name=_('user'), null=True, blank=True, +~~ on_delete=models.SET_NULL + ) +~~ content_json = models.TextField(verbose_name=_('content JSON')) +~~ approved_go_live_at = models.DateTimeField( + verbose_name=_('approved go live at'), + null=True, + blank=True, + db_index=True + ) + +~~ objects = models.Manager() + submitted_revisions = SubmittedRevisionsManager() + + def save(self, *args, **kwargs): + if self.created_at is None: + self.created_at = timezone.now() + + super().save(*args, **kwargs) + if self.submitted_for_moderation: + self.page.revisions.exclude(id=self.id).update(submitted_for_moderation=False) + + def as_page_object(self): + return self.page.specific.with_content_json(self.content_json) + + def approve_moderation(self): + if self.submitted_for_moderation: + logger.info("Page moderation approved: \"%s\" id=%d revision_id=%d", self.page.title, self.page.id, self.id) + self.publish() + + def reject_moderation(self): + if self.submitted_for_moderation: + logger.info("Page moderation rejected: \"%s\" id=%d revision_id=%d", self.page.title, self.page.id, self.id) + self.submitted_for_moderation = False + self.save(update_fields=['submitted_for_moderation']) + + + +## ... source file abbreviated to get to models examples ... + + + + def __str__(self): + return '"' + str(self.page) + '" at ' + str(self.created_at) + + class Meta: + verbose_name = _('page revision') + verbose_name_plural = _('page revisions') + + +PAGE_PERMISSION_TYPES = [ + ('add', _("Add"), _("Add/edit pages you own")), + ('edit', _("Edit"), _("Edit any page")), + ('publish', _("Publish"), _("Publish any page")), + ('bulk_delete', _("Bulk delete"), _("Delete pages with children")), + ('lock', _("Lock"), _("Lock/unlock pages you've locked")), + ('unlock', _("Unlock"), _("Unlock any page")), +] + +PAGE_PERMISSION_TYPE_CHOICES = [ + (identifier, long_label) + for identifier, short_label, long_label in PAGE_PERMISSION_TYPES +] + + +class GroupPagePermission(models.Model): +~~ group = models.ForeignKey(Group, verbose_name=_('group'), related_name='page_permissions', on_delete=models.CASCADE) +~~ page = models.ForeignKey('Page', verbose_name=_('page'), related_name='group_permissions', on_delete=models.CASCADE) +~~ permission_type = models.CharField( + verbose_name=_('permission type'), + max_length=20, + choices=PAGE_PERMISSION_TYPE_CHOICES + ) + + class Meta: + unique_together = ('group', 'page', 'permission_type') + verbose_name = _('group page permission') + verbose_name_plural = _('group page permissions') + + def __str__(self): + return "Group %d ('%s') has permission '%s' on page %d ('%s')" % ( + self.group.id, self.group, + self.permission_type, + self.page.id, self.page + ) + + +class UserPagePermissionsProxy: + + def __init__(self, user): + self.user = user + + if user.is_active and not user.is_superuser: + + +## ... source file abbreviated to get to models examples ... + + + if not destination.specific_class.creatable_subpage_models(): + return False + + if 'add' not in destination_perms.permissions: + return False + + return True + + def can_view_revisions(self): + return not self.page_is_root + + +class BaseViewRestriction(models.Model): + NONE = 'none' + PASSWORD = 'password' + GROUPS = 'groups' + LOGIN = 'login' + + RESTRICTION_CHOICES = ( + (NONE, _("Public")), + (LOGIN, _("Private, accessible to logged-in users")), + (PASSWORD, _("Private, accessible with the following password")), + (GROUPS, _("Private, accessible to users in specific groups")), + ) + +~~ restriction_type = models.CharField( + max_length=20, choices=RESTRICTION_CHOICES) +~~ password = models.CharField(verbose_name=_('password'), max_length=255, blank=True) +~~ groups = models.ManyToManyField(Group, verbose_name=_('groups'), blank=True) + + def accept_request(self, request): + if self.restriction_type == BaseViewRestriction.PASSWORD: + passed_restrictions = request.session.get(self.passed_view_restrictions_session_key, []) + if self.id not in passed_restrictions: + return False + + elif self.restriction_type == BaseViewRestriction.LOGIN: + if not request.user.is_authenticated: + return False + + elif self.restriction_type == BaseViewRestriction.GROUPS: + if not request.user.is_superuser: + current_user_groups = request.user.groups.all() + + if not any(group in current_user_groups for group in self.groups.all()): + return False + + return True + + def mark_as_passed(self, request): + has_existing_session = (settings.SESSION_COOKIE_NAME in request.COOKIES) + passed_restrictions = request.session.setdefault(self.passed_view_restrictions_session_key, []) + if self.id not in passed_restrictions: + passed_restrictions.append(self.id) + request.session[self.passed_view_restrictions_session_key] = passed_restrictions + if not has_existing_session: + request.session.set_expiry(0) + + class Meta: + abstract = True + verbose_name = _('view restriction') + verbose_name_plural = _('view restrictions') + + +class PageViewRestriction(BaseViewRestriction): +~~ page = models.ForeignKey( +~~ 'Page', verbose_name=_('page'), related_name='view_restrictions', on_delete=models.CASCADE + ) + + passed_view_restrictions_session_key = 'passed_page_view_restrictions' + + class Meta: + verbose_name = _('page view restriction') + verbose_name_plural = _('page view restrictions') + + +class BaseCollectionManager(models.Manager): + def get_queryset(self): + return TreeQuerySet(self.model).order_by('path') + + +CollectionManager = BaseCollectionManager.from_queryset(TreeQuerySet) + + +class CollectionViewRestriction(BaseViewRestriction): +~~ collection = models.ForeignKey( + 'Collection', + verbose_name=_('collection'), + related_name='view_restrictions', +~~ on_delete=models.CASCADE + ) + + passed_view_restrictions_session_key = 'passed_collection_view_restrictions' + + class Meta: + verbose_name = _('collection view restriction') + verbose_name_plural = _('collection view restrictions') + + +class Collection(MP_Node): +~~ name = models.CharField(max_length=255, verbose_name=_('name')) + + objects = CollectionManager() + + def __str__(self): + return self.name + + def get_ancestors(self, inclusive=False): + return Collection.objects.ancestor_of(self, inclusive) + + def get_descendants(self, inclusive=False): + return Collection.objects.descendant_of(self, inclusive) + + def get_siblings(self, inclusive=True): + return Collection.objects.sibling_of(self, inclusive) + + def get_next_siblings(self, inclusive=False): + return self.get_siblings(inclusive).filter(path__gte=self.path).order_by('path') + + def get_prev_siblings(self, inclusive=False): + return self.get_siblings(inclusive).filter(path__lte=self.path).order_by('-path') + + def get_view_restrictions(self): + return CollectionViewRestriction.objects.filter(collection__in=self.get_ancestors(inclusive=True)) + + @staticmethod + def order_for_display(queryset): + return queryset.annotate( + display_order=Case( + When(depth=1, then=Value('')), + default='name') + ).order_by('display_order') + + class Meta: + verbose_name = _('collection') + verbose_name_plural = _('collections') + + +def get_root_collection_id(): + return Collection.get_first_root_node().id + + +class CollectionMember(models.Model): +~~ collection = models.ForeignKey( + Collection, + default=get_root_collection_id, + verbose_name=_('collection'), + related_name='+', +~~ on_delete=models.CASCADE + ) + + search_fields = [ + index.FilterField('collection'), + ] + + class Meta: + abstract = True + + +class GroupCollectionPermission(models.Model): +~~ group = models.ForeignKey( + Group, + verbose_name=_('group'), + related_name='collection_permissions', +~~ on_delete=models.CASCADE + ) +~~ collection = models.ForeignKey( + Collection, + verbose_name=_('collection'), + related_name='group_permissions', +~~ on_delete=models.CASCADE + ) +~~ permission = models.ForeignKey( + Permission, + verbose_name=_('permission'), +~~ on_delete=models.CASCADE + ) + + def __str__(self): + return "Group %d ('%s') has permission '%s' on collection %d ('%s')" % ( + self.group.id, self.group, + self.permission, + self.collection.id, self.collection + ) + + class Meta: + unique_together = ('group', 'collection', 'permission') + verbose_name = _('group collection permission') + verbose_name_plural = _('group collection permissions') + + ] + + is_creatable = False + + + +## ... source file abbreviated to get to models examples ... + + + "Invalid subpage_types setting for %s" % cls, + hint=str(e), + id='wagtailcore.E002' + ) + + +## ... source file continues with no further models examples... + +``` + diff --git a/content/pages/examples/django/django-db-programmingerror.markdown b/content/pages/examples/django/django-db-programmingerror.markdown new file mode 100644 index 000000000..6b3037811 --- /dev/null +++ b/content/pages/examples/django/django-db-programmingerror.markdown @@ -0,0 +1,232 @@ +title: django.db ProgrammingError Example Code +category: page +slug: django-db-programmingerror-examples +sortorder: 500011163 +toc: False +sidebartitle: django.db ProgrammingError +meta: Python example code for the ProgrammingError class from the django.db module of the Django project. + + +ProgrammingError is a class within the django.db module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / appresolver.py**](https://github.com/divio/django-cms/blob/develop/cms/./appresolver.py) + +```python +# appresolver.py +from collections import OrderedDict +from importlib import import_module + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +~~from django.db import OperationalError, ProgrammingError +from django.utils.translation import get_language, override +from django.urls import Resolver404, reverse + +from six import string_types + +from cms.apphook_pool import apphook_pool +from cms.models.pagemodel import Page +from cms.utils import get_current_site +from cms.utils.compat import DJANGO_1_11 +from cms.utils.compat.dj import RegexPattern, URLPattern, URLResolver +from cms.utils.i18n import get_language_list +from cms.utils.moderator import use_draft + + +APP_RESOLVERS = [] + + +def clear_app_resolvers(): + global APP_RESOLVERS + APP_RESOLVERS = [] + + +def applications_page_check(request, current_page=None, path=None): + if current_page: + + +## ... source file abbreviated to get to ProgrammingError examples ... + + + if not hasattr(mod, 'urlpatterns'): + raise ImproperlyConfigured( + "URLConf `%s` has no urlpatterns attribute" % urlconf) + yield getattr(mod, 'urlpatterns') + elif isinstance(urlconf, (list, tuple)): + yield urlconf + else: + yield [urlconf] + + +def get_patterns_for_title(path, title): + app = apphook_pool.get_apphook(title.page.application_urls) + url_patterns = [] + for pattern_list in get_app_urls(app.get_urls(title.page, title.language)): + if path and not path.endswith('/'): + path += '/' + page_id = title.page.id + url_patterns += recurse_patterns(path, pattern_list, page_id) + return url_patterns + + +def get_app_patterns(): + try: + site = get_current_site() + return _get_app_patterns(site) +~~ except (OperationalError, ProgrammingError): + return [] + + +def _get_app_patterns(site): + from cms.models import Title + + included = [] + + title_qs = Title.objects.public().filter(page__node__site=site) + + hooked_applications = OrderedDict() + + titles = (title_qs.exclude(page__application_urls=None) + .exclude(page__application_urls='') + .order_by('-page__node__path').select_related()) + for title in titles: + path = title.path + mix_id = "%s:%s:%s" % ( + path + "/", title.page.application_urls, title.language) + if mix_id in included: + continue + if not settings.APPEND_SLASH: + path += '/' + app = apphook_pool.get_apphook(title.page.application_urls) + + +## ... source file continues with no further ProgrammingError examples... + +``` + + +## Example 2 from django-migration-linter +[django-migration-linter](https://github.com/3YOURMIND/django-migration-linter) +([PyPI package information](https://pypi.org/project/django-migration-linter/)) +checks for backwards-incompatible changes in [Django ORM](/django-orm.html) +schema migrations and warns you about them. The purpose of the project is +to save time in older and larger projects by detecting field migrations +that will be a problem so you do not run into issues later, and make it +easier to enable continuous [deployment](/deployment.html) configurations +with database changes. There is a +[blog post on keeping Django database migrations backward compatible](https://medium.com/3yourmind/keeping-django-database-migrations-backward-compatible-727820260dbb) +that goes into further detail on the tool. + +The django-migration-linter project is open sourced under the +[Apache 2.0 license](https://github.com/3YOURMIND/django-migration-linter/blob/master/LICENSE). + +[**django-migration-linter / django_migration_linter / migration_linter.py**](https://github.com/3YOURMIND/django-migration-linter/blob/master/django_migration_linter/./migration_linter.py) + +```python +# migration_linter.py +from __future__ import print_function + +import hashlib +import inspect +import logging +import os +import re +from subprocess import Popen, PIPE + +from django.conf import settings +from django.core.management import call_command +~~from django.db import DEFAULT_DB_ALIAS, connections, ProgrammingError +from django.db.migrations import RunPython +from enum import Enum, unique +from six import PY2 + +from .cache import Cache +from .constants import ( + DEFAULT_CACHE_PATH, + EXPECTED_DATA_MIGRATION_ARGS, + DJANGO_APPS_WITH_MIGRATIONS, +) +from .utils import clean_bytes_to_str, get_migration_abspath, split_migration_path +from .operations import IgnoreMigration +from .sql_analyser import analyse_sql_statements + +logger = logging.getLogger(__name__) + + +@unique +class MessageType(Enum): + OK = "ok" + IGNORE = "ignore" + WARNING = "warning" + ERROR = "error" + + + +## ... source file abbreviated to get to ProgrammingError examples ... + + + def print_summary(self): + print() + print("*** Summary ***") + print("Valid migrations: {}/{}".format(self.nb_valid, self.nb_total)) + print("Erroneous migrations: {}/{}".format(self.nb_erroneous, self.nb_total)) + print("Migrations with warnings: {}/{}".format(self.nb_warnings, self.nb_total)) + print("Ignored migrations: {}/{}".format(self.nb_ignored, self.nb_total)) + + @property + def has_errors(self): + return self.nb_erroneous > 0 + + def get_sql(self, app_label, migration_name): + logger.info( + "Calling sqlmigrate command {} {}".format(app_label, migration_name) + ) + dev_null = open(os.devnull, "w") + try: + sql_statement = call_command( + "sqlmigrate", + app_label, + migration_name, + database=self.database, + stdout=dev_null, + ) +~~ except (ValueError, ProgrammingError): + logger.warning( + ( + "Error while executing sqlmigrate on (%s, %s). " + "Continuing execution with empty SQL." + ), + app_label, + migration_name, + ) + sql_statement = "" + return sql_statement.splitlines() + + @staticmethod + def is_migration_file(filename): + from django.db.migrations.loader import MIGRATIONS_MODULE_NAME + + return ( + re.search(r"/{0}/.*\.py".format(MIGRATIONS_MODULE_NAME), filename) + and "__init__" not in filename + ) + + @classmethod + def read_migrations_list(cls, migrations_file_path): + if not migrations_file_path: + return None + + +## ... source file continues with no further ProgrammingError examples... + +``` + diff --git a/content/pages/examples/django/django-db-router.markdown b/content/pages/examples/django/django-db-router.markdown new file mode 100644 index 000000000..7987041a7 --- /dev/null +++ b/content/pages/examples/django/django-db-router.markdown @@ -0,0 +1,522 @@ +title: django.db router Example Code +category: page +slug: django-db-router-examples +sortorder: 500011168 +toc: False +sidebartitle: django.db router +meta: Python example code for the router callable from the django.db module of the Django project. + + +router is a callable within the django.db module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / placeholderadmin.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/placeholderadmin.py) + +```python +# placeholderadmin.py +import uuid +import warnings + +from django.conf.urls import url +from django.contrib.admin.helpers import AdminForm +from django.contrib.admin.utils import get_deleted_objects +from django.core.exceptions import PermissionDenied +~~from django.db import router, transaction +from django.http import ( + HttpResponse, + HttpResponseBadRequest, + HttpResponseForbidden, + HttpResponseNotFound, + HttpResponseRedirect, +) +from django.shortcuts import get_list_or_404, get_object_or_404, render +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_text +from django.utils import translation +from django.utils.translation import ugettext as _ +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.decorators.http import require_POST + +from six.moves.urllib.parse import parse_qsl, urlparse + +from six import get_unbound_function, get_method_function + +from cms import operations +from cms.admin.forms import PluginAddValidationForm +from cms.constants import SLUG_REGEXP +from cms.exceptions import PluginLimitReached + + +## ... source file abbreviated to get to router examples ... + + + source_placeholder.mark_as_dirty(target_language, clear_cache=False) + + self._send_post_placeholder_operation( + request, + operation=operations.CUT_PLUGIN, + token=action_token, + plugin=updated_plugin.get_bound_plugin(), + clipboard=target_placeholder, + clipboard_language=target_language, + source_language=source_language, + source_placeholder=source_placeholder, + source_parent_id=plugin.parent_id, + source_order=new_source_order, + ) + return updated_plugin + + @xframe_options_sameorigin + def delete_plugin(self, request, plugin_id): + plugin = self._get_plugin_from_id(plugin_id) + + if not self.has_delete_plugin_permission(request, plugin): + return HttpResponseForbidden(force_text( + _("You do not have permission to delete this plugin"))) + + opts = plugin._meta +~~ using = router.db_for_write(opts.model) + if DJANGO_2_0: + get_deleted_objects_additional_kwargs = { + 'opts': opts, + 'using': using, + 'user': request.user, + } + else: + get_deleted_objects_additional_kwargs = {'request': request} + deleted_objects, __, perms_needed, protected = get_deleted_objects( + [plugin], admin_site=self.admin_site, + **get_deleted_objects_additional_kwargs + ) + + if request.POST: # The user has already confirmed the deletion. + if perms_needed: + raise PermissionDenied(_("You do not have permission to delete this plugin")) + obj_display = force_text(plugin) + placeholder = plugin.placeholder + plugin_tree_order = placeholder.get_plugin_tree_order( + language=plugin.language, + parent_id=plugin.parent_id, + ) + + operation_token = self._send_pre_placeholder_operation( + + +## ... source file abbreviated to get to router examples ... + + + "object": plugin, + "deleted_objects": deleted_objects, + "perms_lacking": perms_needed, + "protected": protected, + "opts": opts, + "app_label": opts.app_label, + } + request.current_app = self.admin_site.name + return TemplateResponse( + request, "admin/cms/page/plugin/delete_confirmation.html", context + ) + + @xframe_options_sameorigin + def clear_placeholder(self, request, placeholder_id): + placeholder = get_object_or_404(Placeholder, pk=placeholder_id) + language = request.GET.get('language') + + if placeholder.pk == request.toolbar.clipboard.pk: + placeholder.clear(language) + return HttpResponseRedirect(admin_reverse('index', current_app=self.admin_site.name)) + + if not self.has_clear_placeholder_permission(request, placeholder, language): + return HttpResponseForbidden(force_text(_("You do not have permission to clear this placeholder"))) + + opts = Placeholder._meta +~~ using = router.db_for_write(Placeholder) + plugins = placeholder.get_plugins_list(language) + + if DJANGO_2_0: + get_deleted_objects_additional_kwargs = { + 'opts': opts, + 'using': using, + 'user': request.user, + } + else: + get_deleted_objects_additional_kwargs = {'request': request} + deleted_objects, __, perms_needed, protected = get_deleted_objects( + plugins, admin_site=self.admin_site, + **get_deleted_objects_additional_kwargs + ) + + obj_display = force_text(placeholder) + + if request.POST: + if perms_needed: + return HttpResponseForbidden(force_text(_("You do not have permission to clear this placeholder"))) + + operation_token = self._send_pre_placeholder_operation( + request, + operation=operations.CLEAR_PLACEHOLDER, + + +## ... source file continues with no further router examples... + +``` + + +## Example 2 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / folderadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/folderadmin.py) + +```python +# folderadmin.py +from __future__ import absolute_import, division, unicode_literals + +import itertools +import os +import re +from collections import OrderedDict + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import messages +from django.contrib.admin import helpers +from django.contrib.admin.utils import capfirst, quote, unquote +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +~~from django.db import models, router +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils.encoding import force_text +from django.utils.html import escape +from django.utils.http import urlquote, urlunquote +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy, ungettext + +from .. import settings +from ..models import ( + File, Folder, FolderPermission, FolderRoot, ImagesWithMissingData, + UnsortedImages, tools, +) +from ..settings import FILER_IMAGE_MODEL, FILER_PAGINATE_BY +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import get_delete_permission +from ..utils.filer_easy_thumbnails import FilerActionThumbnailer +from ..utils.loader import load_model +from . import views +from .forms import CopyFilesAndFoldersForm, RenameFilesForm, ResizeImagesForm +from .patched.admin_utils import get_deleted_objects +from .permissions import PrimitivePermissionAwareModelAdmin + + +## ... source file abbreviated to get to router examples ... + + + return self.files_set_public_or_private(request, False, files_queryset, + folders_queryset) + + files_set_private.short_description = ugettext_lazy( + "Enable permissions for selected files") + + def files_set_public(self, request, files_queryset, folders_queryset): + return self.files_set_public_or_private(request, True, files_queryset, + folders_queryset) + + files_set_public.short_description = ugettext_lazy( + "Disable permissions for selected files") + + def delete_files_or_folders(self, request, files_queryset, folders_queryset): + opts = self.model._meta + app_label = opts.app_label + + if not self.has_delete_permission(request): + raise PermissionDenied + + current_folder = self._get_current_action_folder( + request, files_queryset, folders_queryset) + + all_protected = [] + +~~ using = router.db_for_write(self.model) + deletable_files, model_count_files, perms_needed_files, protected_files = get_deleted_objects(files_queryset, files_queryset.model._meta, request.user, self.admin_site, using) + deletable_folders, model_count_folder, perms_needed_folders, protected_folders = get_deleted_objects(folders_queryset, folders_queryset.model._meta, request.user, self.admin_site, using) + all_protected.extend(protected_files) + all_protected.extend(protected_folders) + + all_deletable_objects = [deletable_files, deletable_folders] + all_perms_needed = perms_needed_files.union(perms_needed_folders) + + if request.POST.get('post'): + if all_perms_needed: + raise PermissionDenied + n = files_queryset.count() + folders_queryset.count() + if n: + for f in files_queryset: + self.log_deletion(request, f, force_text(f)) + f.delete() + folder_ids = set() + for folder in folders_queryset: + folder_ids.add(folder.id) + folder_ids.update( + folder.get_descendants().values_list('id', flat=True)) + for f in File.objects.filter(folder__in=folder_ids): + self.log_deletion(request, f, force_text(f)) + f.delete() + + +## ... source file continues with no further router examples... + +``` + + +## Example 3 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / management / __init__.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/management/__init__.py) + +```python +# __init__.py +from django.contrib.auth import get_user_model +from django.db.models import signals +from django.utils.module_loading import import_string +~~from django.db import router +from guardian.conf import settings as guardian_settings + + +def get_init_anonymous_user(User): + kwargs = { + User.USERNAME_FIELD: guardian_settings.ANONYMOUS_USER_NAME + } + user = User(**kwargs) + user.set_unusable_password() + return user + + +def create_anonymous_user(sender, **kwargs): + User = get_user_model() +~~ if not router.allow_migrate_model(kwargs['using'], User): + return + try: + lookup = {User.USERNAME_FIELD: guardian_settings.ANONYMOUS_USER_NAME} + User.objects.using(kwargs['using']).get(**lookup) + except User.DoesNotExist: + retrieve_anonymous_function = import_string( + guardian_settings.GET_INIT_ANONYMOUS_USER) + user = retrieve_anonymous_function(User) + user.save(using=kwargs['using']) + +if guardian_settings.ANONYMOUS_USER_NAME is not None: + from django.apps import apps + guardian_app = apps.get_app_config('guardian') + signals.post_migrate.connect(create_anonymous_user, sender=guardian_app, + dispatch_uid="guardian.management.create_anonymous_user") + + + +## ... source file continues with no further router examples... + +``` + + +## Example 4 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / models.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./models.py) + +```python +# models.py +from django.core.exceptions import ImproperlyConfigured +~~from django.db import models, transaction, router +from django.db.models.signals import post_save, pre_save +from django.utils.translation import gettext_lazy as _ + +from model_utils.fields import ( + AutoCreatedField, + AutoLastModifiedField, + StatusField, + MonitorField, + UUIDField, +) +from model_utils.managers import ( + QueryManager, + SoftDeletableManager, +) + +from django.db.models.functions import Now +now = Now() + + +class TimeStampedModel(models.Model): + created = AutoCreatedField(_('created')) + modified = AutoLastModifiedField(_('modified')) + + def save(self, *args, **kwargs): + + +## ... source file abbreviated to get to router examples ... + + + + +class UUIDModel(models.Model): + id = UUIDField( + primary_key=True, + version=4, + editable=False, + ) + + class Meta: + abstract = True + + +class SaveSignalHandlingModel(models.Model): + class Meta: + abstract = True + + def save(self, signals_to_disable=None, *args, **kwargs): + + self.signals_to_disable = signals_to_disable or [] + + super().save(*args, **kwargs) + + def save_base(self, raw=False, force_insert=False, + force_update=False, using=None, update_fields=None): +~~ using = using or router.db_for_write(self.__class__, instance=self) + assert not (force_insert and (force_update or update_fields)) + assert update_fields is None or len(update_fields) > 0 + cls = origin = self.__class__ + + if cls._meta.proxy: + cls = cls._meta.concrete_model + meta = cls._meta + if not meta.auto_created and 'pre_save' not in self.signals_to_disable: + pre_save.send( + sender=origin, instance=self, raw=raw, using=using, + update_fields=update_fields, + ) + with transaction.atomic(using=using, savepoint=False): + if not raw: + self._save_parents(cls, using, update_fields) + updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) + + self._state.db = using + self._state.adding = False + + if not meta.auto_created and 'post_save' not in self.signals_to_disable: + post_save.send( + sender=origin, instance=self, created=(not updated), + update_fields=update_fields, raw=raw, using=using, + + +## ... source file continues with no further router examples... + +``` + + +## Example 5 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / models.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./models.py) + +```python +# models.py +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +~~from django.db import IntegrityError, models, router, transaction +from django.utils.text import slugify +from django.utils.translation import gettext, gettext_lazy as _ + +try: + from unidecode import unidecode +except ImportError: + + def unidecode(tag): + return tag + + +class TagBase(models.Model): + name = models.CharField(verbose_name=_("name"), unique=True, max_length=100) + slug = models.SlugField(verbose_name=_("slug"), unique=True, max_length=100) + + def __str__(self): + return self.name + + def __gt__(self, other): + return self.name.lower() > other.name.lower() + + def __lt__(self, other): + return self.name.lower() < other.name.lower() + + class Meta: + abstract = True + + def save(self, *args, **kwargs): + if self._state.adding and not self.slug: + self.slug = self.slugify(self.name) +~~ using = kwargs.get("using") or router.db_for_write( + type(self), instance=self + ) + kwargs["using"] = using + try: + with transaction.atomic(using=using): + res = super().save(*args, **kwargs) + return res + except IntegrityError: + pass + slugs = set( + type(self) + ._default_manager.filter(slug__startswith=self.slug) + .values_list("slug", flat=True) + ) + i = 1 + while True: + slug = self.slugify(self.name, i) + if slug not in slugs: + self.slug = slug + return super().save(*args, **kwargs) + i += 1 + else: + return super().save(*args, **kwargs) + + + +## ... source file continues with no further router examples... + +``` + diff --git a/content/pages/examples/django/django-db-transaction.markdown b/content/pages/examples/django/django-db-transaction.markdown new file mode 100644 index 000000000..163c44043 --- /dev/null +++ b/content/pages/examples/django/django-db-transaction.markdown @@ -0,0 +1,707 @@ +title: django.db transaction Example Code +category: page +slug: django-db-transaction-examples +sortorder: 500011169 +toc: False +sidebartitle: django.db transaction +meta: Python example code for the transaction callable from the django.db module of the Django project. + + +transaction is a callable within the django.db module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / models.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/models.py) + +```python +# models.py +from __future__ import unicode_literals + +import datetime + +from django.core import signing +~~from django.db import models, transaction +from django.utils import timezone +from django.utils.crypto import get_random_string +from django.utils.translation import gettext_lazy as _ + +from .. import app_settings as allauth_app_settings +from . import app_settings, signals +from .adapter import get_adapter +from .managers import EmailAddressManager, EmailConfirmationManager +from .utils import user_email + + +class EmailAddress(models.Model): + + user = models.ForeignKey(allauth_app_settings.USER_MODEL, + verbose_name=_('user'), + on_delete=models.CASCADE) + email = models.EmailField(unique=app_settings.UNIQUE_EMAIL, + max_length=app_settings.EMAIL_MAX_LENGTH, + verbose_name=_('e-mail address')) + verified = models.BooleanField(verbose_name=_('verified'), default=False) + primary = models.BooleanField(verbose_name=_('primary'), default=False) + + objects = EmailAddressManager() + + + +## ... source file abbreviated to get to transaction examples ... + + + def __str__(self): + return self.email + + def set_as_primary(self, conditional=False): + old_primary = EmailAddress.objects.get_primary(self.user) + if old_primary: + if conditional: + return False + old_primary.primary = False + old_primary.save() + self.primary = True + self.save() + user_email(self.user, self.email) + self.user.save() + return True + + def send_confirmation(self, request=None, signup=False): + if app_settings.EMAIL_CONFIRMATION_HMAC: + confirmation = EmailConfirmationHMAC(self) + else: + confirmation = EmailConfirmation.create(self) + confirmation.send(request, signup=signup) + return confirmation + + def change(self, request, new_email, confirm=True): +~~ with transaction.atomic(): + user_email(self.user, new_email) + self.user.save() + self.email = new_email + self.verified = False + self.save() + if confirm: + self.send_confirmation(request) + + +class EmailConfirmation(models.Model): + + email_address = models.ForeignKey(EmailAddress, + verbose_name=_('e-mail address'), + on_delete=models.CASCADE) + created = models.DateTimeField(verbose_name=_('created'), + default=timezone.now) + sent = models.DateTimeField(verbose_name=_('sent'), null=True) + key = models.CharField(verbose_name=_('key'), max_length=64, unique=True) + + objects = EmailConfirmationManager() + + class Meta: + verbose_name = _("email confirmation") + verbose_name_plural = _("email confirmations") + + +## ... source file continues with no further transaction examples... + +``` + + +## Example 2 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / utils.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./utils.py) + +```python +# utils.py +~~from django.db import transaction + + +class atomic_if_using_transaction: + def __init__(self, using_transactions): + self.using_transactions = using_transactions + if using_transactions: +~~ self.context_manager = transaction.atomic() + + def __enter__(self): + if self.using_transactions: + self.context_manager.__enter__() + + def __exit__(self, *args): + if self.using_transactions: + self.context_manager.__exit__(*args) + + + +## ... source file continues with no further transaction examples... + +``` + + +## Example 3 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / models.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./models.py) + +```python +# models.py +from django.core.exceptions import ImproperlyConfigured +~~from django.db import models, transaction, router +from django.db.models.signals import post_save, pre_save +from django.utils.translation import gettext_lazy as _ + +from model_utils.fields import ( + AutoCreatedField, + AutoLastModifiedField, + StatusField, + MonitorField, + UUIDField, +) +from model_utils.managers import ( + QueryManager, + SoftDeletableManager, +) + +from django.db.models.functions import Now +now = Now() + + +class TimeStampedModel(models.Model): + created = AutoCreatedField(_('created')) + modified = AutoLastModifiedField(_('modified')) + + def save(self, *args, **kwargs): + + +## ... source file abbreviated to get to transaction examples ... + + +class SaveSignalHandlingModel(models.Model): + class Meta: + abstract = True + + def save(self, signals_to_disable=None, *args, **kwargs): + + self.signals_to_disable = signals_to_disable or [] + + super().save(*args, **kwargs) + + def save_base(self, raw=False, force_insert=False, + force_update=False, using=None, update_fields=None): + using = using or router.db_for_write(self.__class__, instance=self) + assert not (force_insert and (force_update or update_fields)) + assert update_fields is None or len(update_fields) > 0 + cls = origin = self.__class__ + + if cls._meta.proxy: + cls = cls._meta.concrete_model + meta = cls._meta + if not meta.auto_created and 'pre_save' not in self.signals_to_disable: + pre_save.send( + sender=origin, instance=self, raw=raw, using=using, + update_fields=update_fields, + ) +~~ with transaction.atomic(using=using, savepoint=False): + if not raw: + self._save_parents(cls, using, update_fields) + updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) + + self._state.db = using + self._state.adding = False + + if not meta.auto_created and 'post_save' not in self.signals_to_disable: + post_save.send( + sender=origin, instance=self, created=(not updated), + update_fields=update_fields, raw=raw, using=using, + ) + + self.signals_to_disable = [] + + + +## ... source file continues with no further transaction examples... + +``` + + +## Example 4 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / models.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./models.py) + +```python +# models.py +import logging +from datetime import timedelta +from urllib.parse import parse_qsl, urlparse + +from django.apps import apps +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +~~from django.db import models, transaction +from django.urls import reverse +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + +from .generators import generate_client_id, generate_client_secret +from .scopes import get_scopes_backend +from .settings import oauth2_settings +from .validators import RedirectURIValidator, WildcardSet + + +logger = logging.getLogger(__name__) + + +class AbstractApplication(models.Model): + CLIENT_CONFIDENTIAL = "confidential" + CLIENT_PUBLIC = "public" + CLIENT_TYPES = ( + (CLIENT_CONFIDENTIAL, _("Confidential")), + (CLIENT_PUBLIC, _("Public")), + ) + + GRANT_AUTHORIZATION_CODE = "authorization-code" + GRANT_IMPLICIT = "implicit" + GRANT_PASSWORD = "password" + + +## ... source file abbreviated to get to transaction examples ... + + + class Meta(AbstractAccessToken.Meta): + swappable = "OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL" + + +class AbstractRefreshToken(models.Model): + id = models.BigAutoField(primary_key=True) + user = models.ForeignKey( + settings.AUTH_USER_MODEL, on_delete=models.CASCADE, + related_name="%(app_label)s_%(class)s" + ) + token = models.CharField(max_length=255) + application = models.ForeignKey( + oauth2_settings.APPLICATION_MODEL, on_delete=models.CASCADE) + access_token = models.OneToOneField( + oauth2_settings.ACCESS_TOKEN_MODEL, on_delete=models.SET_NULL, blank=True, null=True, + related_name="refresh_token" + ) + + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + revoked = models.DateTimeField(null=True) + + def revoke(self): + access_token_model = get_access_token_model() + refresh_token_model = get_refresh_token_model() +~~ with transaction.atomic(): + self = refresh_token_model.objects.filter( + pk=self.pk, revoked__isnull=True + ).select_for_update().first() + if not self: + return + + try: + access_token_model.objects.get(id=self.access_token_id).revoke() + except access_token_model.DoesNotExist: + pass + self.access_token = None + self.revoked = timezone.now() + self.save() + + def __str__(self): + return self.token + + class Meta: + abstract = True + unique_together = ("token", "revoked",) + + +class RefreshToken(AbstractRefreshToken): + class Meta(AbstractRefreshToken.Meta): + + +## ... source file abbreviated to get to transaction examples ... + + + +def get_access_token_model(): + return apps.get_model(oauth2_settings.ACCESS_TOKEN_MODEL) + + +def get_refresh_token_model(): + return apps.get_model(oauth2_settings.REFRESH_TOKEN_MODEL) + + +def clear_expired(): + now = timezone.now() + refresh_expire_at = None + access_token_model = get_access_token_model() + refresh_token_model = get_refresh_token_model() + grant_model = get_grant_model() + REFRESH_TOKEN_EXPIRE_SECONDS = oauth2_settings.REFRESH_TOKEN_EXPIRE_SECONDS + if REFRESH_TOKEN_EXPIRE_SECONDS: + if not isinstance(REFRESH_TOKEN_EXPIRE_SECONDS, timedelta): + try: + REFRESH_TOKEN_EXPIRE_SECONDS = timedelta(seconds=REFRESH_TOKEN_EXPIRE_SECONDS) + except TypeError: + e = "REFRESH_TOKEN_EXPIRE_SECONDS must be either a timedelta or seconds" + raise ImproperlyConfigured(e) + refresh_expire_at = now - REFRESH_TOKEN_EXPIRE_SECONDS + +~~ with transaction.atomic(): + if refresh_expire_at: + revoked = refresh_token_model.objects.filter( + revoked__lt=refresh_expire_at, + ) + expired = refresh_token_model.objects.filter( + access_token__expires__lt=refresh_expire_at, + ) + + logger.info("%s Revoked refresh tokens to be deleted", revoked.count()) + logger.info("%s Expired refresh tokens to be deleted", expired.count()) + + revoked.delete() + expired.delete() + else: + logger.info("refresh_expire_at is %s. No refresh tokens deleted.", + refresh_expire_at) + + access_tokens = access_token_model.objects.filter( + refresh_token__isnull=True, + expires__lt=now + ) + grants = grant_model.objects.filter(expires__lt=now) + + logger.info("%s Expired access tokens to be deleted", access_tokens.count()) + + +## ... source file continues with no further transaction examples... + +``` + + +## Example 5 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / views.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./views.py) + +```python +# views.py +from django.conf import settings +from django.core.exceptions import PermissionDenied +~~from django.db import connection, models, transaction +from django.http import Http404 +from django.http.response import HttpResponseBase +from django.utils.cache import cc_delim_re, patch_vary_headers +from django.utils.encoding import smart_str +from django.views.decorators.csrf import csrf_exempt +from django.views.generic import View + +from rest_framework import exceptions, status +from rest_framework.request import Request +from rest_framework.response import Response +from rest_framework.schemas import DefaultSchema +from rest_framework.settings import api_settings +from rest_framework.utils import formatting + + +def get_view_name(view): + name = getattr(view, 'name', None) + if name is not None: + return name + + name = view.__class__.__name__ + name = formatting.remove_trailing_string(name, 'View') + name = formatting.remove_trailing_string(name, 'ViewSet') + name = formatting.camelcase_to_spaces(name) + + suffix = getattr(view, 'suffix', None) + if suffix: + name += ' ' + suffix + + return name + + +def get_view_description(view, html=False): + description = getattr(view, 'description', None) + if description is None: + description = view.__class__.__doc__ or '' + + description = formatting.dedent(smart_str(description)) + if html: + return formatting.markup_description(description) + return description + + +def set_rollback(): + atomic_requests = connection.settings_dict.get('ATOMIC_REQUESTS', False) + if atomic_requests and connection.in_atomic_block: +~~ transaction.set_rollback(True) + + +def exception_handler(exc, context): + if isinstance(exc, Http404): + exc = exceptions.NotFound() + elif isinstance(exc, PermissionDenied): + exc = exceptions.PermissionDenied() + + if isinstance(exc, exceptions.APIException): + headers = {} + if getattr(exc, 'auth_header', None): + headers['WWW-Authenticate'] = exc.auth_header + if getattr(exc, 'wait', None): + headers['Retry-After'] = '%d' % exc.wait + + if isinstance(exc.detail, (list, dict)): + data = exc.detail + else: + data = {'detail': exc.detail} + + set_rollback() + return Response(data, status=exc.status_code, headers=headers) + + return None + + +## ... source file continues with no further transaction examples... + +``` + + +## Example 6 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / models.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./models.py) + +```python +# models.py +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +~~from django.db import IntegrityError, models, router, transaction +from django.utils.text import slugify +from django.utils.translation import gettext, gettext_lazy as _ + +try: + from unidecode import unidecode +except ImportError: + + def unidecode(tag): + return tag + + +class TagBase(models.Model): + name = models.CharField(verbose_name=_("name"), unique=True, max_length=100) + slug = models.SlugField(verbose_name=_("slug"), unique=True, max_length=100) + + def __str__(self): + return self.name + + def __gt__(self, other): + return self.name.lower() > other.name.lower() + + def __lt__(self, other): + return self.name.lower() < other.name.lower() + + class Meta: + abstract = True + + def save(self, *args, **kwargs): + if self._state.adding and not self.slug: + self.slug = self.slugify(self.name) + using = kwargs.get("using") or router.db_for_write( + type(self), instance=self + ) + kwargs["using"] = using + try: +~~ with transaction.atomic(using=using): + res = super().save(*args, **kwargs) + return res + except IntegrityError: + pass + slugs = set( + type(self) + ._default_manager.filter(slug__startswith=self.slug) + .values_list("slug", flat=True) + ) + i = 1 + while True: + slug = self.slugify(self.name, i) + if slug not in slugs: + self.slug = slug + return super().save(*args, **kwargs) + i += 1 + else: + return super().save(*args, **kwargs) + + def slugify(self, tag, i=None): + slug = slugify(unidecode(tag)) + if i is not None: + slug += "_%d" % i + return slug + + +## ... source file continues with no further transaction examples... + +``` + + +## Example 7 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/models.py) + +```python +# models.py +import json +import logging +from collections import defaultdict +from io import StringIO +from urllib.parse import urlparse + +from django.conf import settings +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core import checks +from django.core.cache import cache +from django.core.exceptions import ValidationError +from django.core.handlers.base import BaseHandler +from django.core.handlers.wsgi import WSGIRequest +~~from django.db import models, transaction +from django.db.models import Case, Q, Value, When +from django.db.models.functions import Concat, Lower, Substr +from django.http import Http404 +from django.http.request import split_domain_port +from django.template.response import TemplateResponse +from django.urls import NoReverseMatch, reverse +from django.utils import timezone +from django.utils.cache import patch_cache_control +from django.utils.functional import cached_property +from django.utils.text import capfirst, slugify +from django.utils.translation import gettext_lazy as _ +from modelcluster.models import ( + ClusterableModel, get_all_child_m2m_relations, get_all_child_relations) +from treebeard.mp_tree import MP_Node + +from wagtail.core.query import PageQuerySet, TreeQuerySet +from wagtail.core.signals import page_published, page_unpublished, post_page_move, pre_page_move +from wagtail.core.sites import get_site_for_hostname +from wagtail.core.url_routing import RouteResult +from wagtail.core.utils import WAGTAIL_APPEND_SLASH, camelcase_to_underscore, resolve_model_string +from wagtail.search import index + + +logger = logging.getLogger('wagtail.core') + + +## ... source file abbreviated to get to transaction examples ... + + + return self.revisions.exclude(approved_go_live_at__isnull=True).exists() + + def has_unpublished_subtree(self): + return (not self.live) and (not self.get_descendants().filter(live=True).exists()) + + def move(self, target, pos=None): + parent_before = self.get_parent() + if pos in ('first-child', 'last-child', 'sorted-child'): + parent_after = target + else: + parent_after = target.get_parent() + + old_self = Page.objects.get(id=self.id) + old_url_path = old_self.url_path + new_url_path = old_self.set_url_path(parent=parent_after) + + pre_page_move.send( + sender=self.specific_class or self.__class__, + instance=self, + parent_page_before=parent_before, + parent_page_after=parent_after, + url_path_before=old_url_path, + url_path_after=new_url_path, + ) + +~~ with transaction.atomic(): + super().move(target, pos=pos) + + new_self = Page.objects.get(id=self.id) + new_self.url_path = new_url_path + new_self.save() + + if old_url_path != new_url_path: + new_self._update_descendant_url_paths(old_url_path, new_url_path) + + post_page_move.send( + sender=self.specific_class or self.__class__, + instance=new_self, + parent_page_before=parent_before, + parent_page_after=parent_after, + url_path_before=old_url_path, + url_path_after=new_url_path, + ) + + logger.info("Page moved: \"%s\" id=%d path=%s", self.title, self.id, new_url_path) + + def copy(self, recursive=False, to=None, update_attrs=None, copy_revisions=True, keep_live=True, user=None, process_child_object=None, exclude_fields=None): + specific_self = self.specific + default_exclude_fields = ['id', 'path', 'depth', 'numchild', 'url_path', 'path', 'index_entries'] + exclude_fields = default_exclude_fields + specific_self.exclude_fields_in_copy + (exclude_fields or []) + + +## ... source file continues with no further transaction examples... + +``` + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index b5e324946..2f08d6dfe 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -46,8 +46,31 @@

django.core signing, validators

-

django.db OperationalError

-

django.db.models +

django.db + DEFAULT_DB_ALIAS, + DataError, + DatabaseError, + IntegrityError, + OperationalError, + ProgrammingError, + connection, + connections, + migrations, + router, + transaction + .backends utils +

+

django.db.migrations + RunPython, + .autodetector MigrationAutodetector, + .exceptions IrreversibleError, + .executor MigrationExecutor, + .loader MIGRATIONS_MODULE_NAME, + .loader MigrationLoader, + .operations.base Operation, + .state ProjectState +

+

django.db.models AutoField, BooleanField, CharField, From 855a77fb5482d216e02acd2a03972228ee72c1e3 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 7 Jul 2020 21:22:15 -0400 Subject: [PATCH 173/302] adding better flask descriptions --- content/pages/03-data/06-sqlalchemy.markdown | 6 +++++ .../04-web-development/03-flask.markdown | 22 +++++-------------- .../flask/flask-cli-dispatchingapp.markdown | 5 ++++- .../flask/flask-cli-flaskgroup.markdown | 8 +++---- .../flask/flask-cli-pass-script-info.markdown | 4 +++- theme/templates/code-examples/django.html | 20 +++++++++++++++++ theme/templates/css/page-article.css | 2 +- theme/templates/page.html | 6 +++++ 8 files changed, 49 insertions(+), 24 deletions(-) diff --git a/content/pages/03-data/06-sqlalchemy.markdown b/content/pages/03-data/06-sqlalchemy.markdown index b97390503..32e914cb7 100644 --- a/content/pages/03-data/06-sqlalchemy.markdown +++ b/content/pages/03-data/06-sqlalchemy.markdown @@ -221,3 +221,9 @@ implementations. [which is better and why: Django ORM or SQLALchemy](https://www.quora.com/Which-is-better-and-why-Djangos-ORM-or-SQLAlchemy) based on various developers' experiences. + +### Open source code for using SQLAlchemy +Many open source projects rely on SQLAlchemy. A great way to learn +how to properly work with this tool is to read the code that shows +how those projects use SQLAlchemy. This section alphabetically lists +these code examples by class and function in the SQLAlchemy code base. diff --git a/content/pages/04-web-development/03-flask.markdown b/content/pages/04-web-development/03-flask.markdown index 5991ada50..ddcc54b97 100644 --- a/content/pages/04-web-development/03-flask.markdown +++ b/content/pages/04-web-development/03-flask.markdown @@ -337,20 +337,8 @@ ways to structure your code. in the JavaScript world. -### Flask framework learning checklist -1. [Install Flask](http://flask.pocoo.org/docs/installation/) on - your local development machine. - -1. Work through the 18-part Flask tutorial listed first under "Flask - resources" above. - -1. Read through - [Flask Extensions Registry](http://flask.pocoo.org/extensions/) to find - out what extensions you'll need to build your project. - -1. Start coding your Flask app based on what you learned from the 18 part - Flask tutorial plus open source example applications found below. - -1. Move on to the [deployment section](/deployment.html) to get your initial - Flask project on the web. - +### Open source code for using Flask +There are many open source projects that rely on Flask to operate. +One of the best ways to learn how to use this framework is to read +how other projects use it in real-world code. This section lists +these code examples by class and method in Flask. diff --git a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown index b1d3fe037..18e556c1b 100644 --- a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown +++ b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown @@ -7,7 +7,10 @@ sidebartitle: flask.cli DispatchingApp meta: Example code for understanding how to use the DispatchingApp class from the flask.cli module of the Flask project. -DispatchingApp is a class within the flask.cli module of the Flask project. +[DispatchingApp](https://github.com/pallets/flask/blob/master/src/flask/cli.py) +is a class within the flask.cli module of the [Flask](/flask.html) project. +DispatchingApp is a special application that dispatches to a Flask app +if it is imported by name in a background thread. ## Example 1 from indico diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 6940160bb..0471d96df 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -8,10 +8,10 @@ meta: Example code for understanding how to use the FlaskGroup class from the fl [FlaskGroup](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a class within the flask.cli module of the Flask project. FlaskGroup -is a subclass of [AppGroup](/flask-cli-appgroup-examples.html) that provides -for loading more commands from a configured Flask app. Generally, only -advanced use cases will need to use this class. +is a class within the flask.cli module of the [Flask project](/flask.html). +FlaskGroup is a subclass of [AppGroup](/flask-cli-appgroup-examples.html) +that provides for loading more commands from a configured Flask app. +Generally, only advanced use cases will need to use this class. ## Example 1 from FlaskBB diff --git a/content/pages/examples/flask/flask-cli-pass-script-info.markdown b/content/pages/examples/flask/flask-cli-pass-script-info.markdown index 73f722796..5a2714c4a 100644 --- a/content/pages/examples/flask/flask-cli-pass-script-info.markdown +++ b/content/pages/examples/flask/flask-cli-pass-script-info.markdown @@ -7,7 +7,9 @@ sidebartitle: flask.cli pass_script_info meta: Python example code that shows how to use the pass_script_info callable from the flask.cli module of the Flask project. -pass_script_info is a callable within the flask.cli module of the Flask project. +[pass_script_info](https://github.com/pallets/flask/blob/master/src/flask/cli.py) +is simply a decorator around the [ScriptInfo](/flask-cli-scriptinfo-examples.html) +class within this same flask.cli module. ## Example 1 from indico diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 2f08d6dfe..c21677f40 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -89,6 +89,26 @@

django.db.models SmallIntegerField, TextField

+

django.db.models.query + BaseIterable, + EmptyQuerySet, + ModelIterable, + Prefetch, + Q, + QuerySet, + prefetch_related_objects +

+

django.db.models.query_utils + DeferredAttribute, + PathInfo, + Q +

+

django.db.models.signals + post_delete, + post_save, + pre_delete, + pre_save +

django.dispatch.dispatcher Signal

django.forms BooleanField, diff --git a/theme/templates/css/page-article.css b/theme/templates/css/page-article.css index caa29c21f..ad017a1a8 100644 --- a/theme/templates/css/page-article.css +++ b/theme/templates/css/page-article.css @@ -1 +1 @@ -{% raw %}.btn-full{width:100%;box-shadow:1px 2px 1px #222;padding-bottom:4px}p.under-btn{text-align:left;margin-top:20px}th{text-align:left;font-family:"Helvetica Neue",sans-serif}td{padding-right:20px}blockquote{border-left:4px solid #aaa;padding-left:10px;font-family:"Helvetica Neue"}.well{min-height:20px;padding:19px;margin:0 0 20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.see-also{margin-top:20px;background:#22B24C;color:#eee;font-family:"Helvetica Neue",sans-serif}.see-also a{color: #fff}.highlight{background:#ffff00}.form-control{display:block;width:100%;height:39px;padding:8px 12px;font-size:14px;color:#777;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.btn{display:inline-block;padding:8px 12px;margin-bottom:0;font-size:15px;line-height:1.4;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid transparent;border-radius:4px;color:#fff;background-color:#22b24c;border-color:#22b24c}.btn:active,.btn.active{background-image:none;outline:0;box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}img.rnd{border:1px solid #ccc;border-radius:5px}.shot{border-radius:5px}.outl{border: 1px solid #ccc}.talk{margin-bottom:22px}.sn{color:#777}{% endraw %} +{% raw %}.btn-full{width:100%;box-shadow:1px 2px 1px #222;padding-bottom:4px}p.under-btn{text-align:left;margin-top:20px}th{text-align:left;font-family:"Helvetica Neue",sans-serif}td{padding-right:20px}blockquote{border-left:4px solid #aaa;padding-left:10px;font-family:"Helvetica Neue"}.well{min-height:20px;padding:19px;margin:0 0 20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.see-also{margin-top:20px;background:#22B24C;color:#eee;font-family:"Helvetica Neue",sans-serif}.see-also a{color: #fff}.highlight{background:#ffff00}.form-control{display:block;width:100%;height:39px;padding:8px 12px;font-size:14px;color:#777;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.btn{display:inline-block;padding:8px 12px;margin-bottom:0;font-size:15px;line-height:1.4;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid transparent;border-radius:4px;color:#fff;background-color:#22b24c;border-color:#22b24c}.btn:active,.btn.active{background-image:none;outline:0;box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}img.rnd{border:1px solid #ccc;border-radius:5px}.shot{border-radius:5px}.outl{border: 1px solid #ccc}.talk{margin-bottom:22px}.sn{color:#777}h3.toc-examples{margin-top:4px}{% endraw %} diff --git a/theme/templates/page.html b/theme/templates/page.html index 0bd68a25f..13c2f904d 100644 --- a/theme/templates/page.html +++ b/theme/templates/page.html @@ -63,6 +63,12 @@

{{ page.title }}

{% include "examples-extensions-descriptions/pandas.html" %} {% endif %} {{ page.content }} + {% if page.slug == "flask" %} + {% include "code-examples/flask.html" %} + {% endif %} + {% if page.slug == "sqlalchemy" %} + {% include "code-examples/sqlalchemy.html" %} + {% endif %} {% endif %} {% if page.sortorder[0:2] == "50" %} {% else %} From 046bd1250b39e7e2c8199e3ba956a8568830a5e0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 7 Jul 2020 21:27:32 -0400 Subject: [PATCH 174/302] adding additional django examples --- ...ango-db-models-query-baseiterable.markdown | 101 ++ ...ngo-db-models-query-emptyqueryset.markdown | 195 ++++ ...ngo-db-models-query-modeliterable.markdown | 72 ++ ...ls-query-prefetch-related-objects.markdown | 110 +++ .../django-db-models-query-prefetch.markdown | 110 +++ .../django/django-db-models-query-q.markdown | 136 +++ .../django-db-models-query-queryset.markdown | 900 ++++++++++++++++++ ...els-query-utils-deferredattribute.markdown | 120 +++ ...go-db-models-query-utils-pathinfo.markdown | 162 ++++ .../django-db-models-query-utils-q.markdown | 117 +++ ...ngo-db-models-signals-post-delete.markdown | 63 ++ ...jango-db-models-signals-post-save.markdown | 149 +++ ...ango-db-models-signals-pre-delete.markdown | 63 ++ ...django-db-models-signals-pre-save.markdown | 240 +++++ 14 files changed, 2538 insertions(+) create mode 100644 content/pages/examples/django/django-db-models-query-baseiterable.markdown create mode 100644 content/pages/examples/django/django-db-models-query-emptyqueryset.markdown create mode 100644 content/pages/examples/django/django-db-models-query-modeliterable.markdown create mode 100644 content/pages/examples/django/django-db-models-query-prefetch-related-objects.markdown create mode 100644 content/pages/examples/django/django-db-models-query-prefetch.markdown create mode 100644 content/pages/examples/django/django-db-models-query-q.markdown create mode 100644 content/pages/examples/django/django-db-models-query-queryset.markdown create mode 100644 content/pages/examples/django/django-db-models-query-utils-deferredattribute.markdown create mode 100644 content/pages/examples/django/django-db-models-query-utils-pathinfo.markdown create mode 100644 content/pages/examples/django/django-db-models-query-utils-q.markdown create mode 100644 content/pages/examples/django/django-db-models-signals-post-delete.markdown create mode 100644 content/pages/examples/django/django-db-models-signals-post-save.markdown create mode 100644 content/pages/examples/django/django-db-models-signals-pre-delete.markdown create mode 100644 content/pages/examples/django/django-db-models-signals-pre-save.markdown diff --git a/content/pages/examples/django/django-db-models-query-baseiterable.markdown b/content/pages/examples/django/django-db-models-query-baseiterable.markdown new file mode 100644 index 000000000..5271e2e6e --- /dev/null +++ b/content/pages/examples/django/django-db-models-query-baseiterable.markdown @@ -0,0 +1,101 @@ +title: django.db.models.query BaseIterable Example Code +category: page +slug: django-db-models-query-baseiterable-examples +sortorder: 500011238 +toc: False +sidebartitle: django.db.models.query BaseIterable +meta: Python example code for the BaseIterable class from the django.db.models.query module of the Django project. + + +BaseIterable is a class within the django.db.models.query module of the Django project. + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / query.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/query.py) + +```python +# query.py +import posixpath +import warnings +from collections import defaultdict + +from django.apps import apps +from django.contrib.contenttypes.models import ContentType +from django.db.models import CharField, Q +from django.db.models.functions import Length, Substr +~~from django.db.models.query import BaseIterable +from treebeard.mp_tree import MP_NodeQuerySet + +from wagtail.search.queryset import SearchableQuerySetMixin + + +class TreeQuerySet(MP_NodeQuerySet): + def delete(self): + super().delete() + + delete.queryset_only = True + + def descendant_of_q(self, other, inclusive=False): + q = Q(path__startswith=other.path) & Q(depth__gte=other.depth) + + if not inclusive: + q &= -Q(pk=other.pk) + + return q + + def descendant_of(self, other, inclusive=False): + return self.filter(self.descendant_of_q(other, inclusive)) + + def not_descendant_of(self, other, inclusive=False): + return self.exclude(self.descendant_of_q(other, inclusive)) + + +## ... source file abbreviated to get to BaseIterable examples ... + + + + if missing_pks: + generic_pages = Page.objects.filter(pk__in=missing_pks).select_related('content_type').in_bulk() + warnings.warn( + "Specific versions of the following pages could not be found. " + "This is most likely because a database migration has removed " + "the relevant table or record since the page was created:\n{}".format([ + {'id': p.id, 'title': p.title, 'type': p.content_type} + for p in generic_pages.values() + ]), category=RuntimeWarning + ) + else: + generic_pages = {} + + for pk, content_type in pks_and_types: + try: + page = pages_by_type[content_type][pk] + except KeyError: + page = generic_pages[pk] + if annotation_aliases: + for annotation, value in annotations_by_pk.get(page.pk, {}).items(): + setattr(page, annotation, value) + yield page + + +~~class SpecificIterable(BaseIterable): + def __iter__(self): + return specific_iterator(self.queryset) + + +~~class DeferredSpecificIterable(BaseIterable): + def __iter__(self): + return specific_iterator(self.queryset, defer=True) + + + +## ... source file continues with no further BaseIterable examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-query-emptyqueryset.markdown b/content/pages/examples/django/django-db-models-query-emptyqueryset.markdown new file mode 100644 index 000000000..aa5c5ea3a --- /dev/null +++ b/content/pages/examples/django/django-db-models-query-emptyqueryset.markdown @@ -0,0 +1,195 @@ +title: django.db.models.query EmptyQuerySet Example Code +category: page +slug: django-db-models-query-emptyqueryset-examples +sortorder: 500011239 +toc: False +sidebartitle: django.db.models.query EmptyQuerySet +meta: Python example code for the EmptyQuerySet class from the django.db.models.query module of the Django project. + + +EmptyQuerySet is a class within the django.db.models.query module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / managers.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./managers.py) + +```python +# managers.py +from django.db import models +from django.db.models import Count +from django.db.models import Q +~~from django.db.models.query import EmptyQuerySet +from django.db.models.query import QuerySet +from mptt.managers import TreeManager + + +class ArticleQuerySet(QuerySet): + def can_read(self, user): + if user.has_perm("wiki.moderator"): + return self + if user.is_anonymous: + q = self.filter(other_read=True) + else: + q = self.filter( + Q(other_read=True) + | Q(owner=user) + | (Q(group__user=user) & Q(group_read=True)) + ).annotate(Count("id")) + return q + + def can_write(self, user): + if user.has_perm("wiki.moderator"): + return self + if user.is_anonymous: + q = self.filter(other_write=True) + else: + q = self.filter( + Q(other_write=True) + | Q(owner=user) + | (Q(group__user=user) & Q(group_write=True)) + ) + return q + + def active(self): + return self.filter(current_revision__deleted=False) + + +~~class ArticleEmptyQuerySet(EmptyQuerySet): + def can_read(self, user): + return self + + def can_write(self, user): + return self + + def active(self): + return self + + +class ArticleFkQuerySetMixin: + def can_read(self, user): + if user.has_perm("wiki.moderate"): + return self + if user.is_anonymous: + q = self.filter(article__other_read=True) + else: + q = self.filter( + Q(article__other_read=True) + | Q(article__owner=user) + | (Q(article__group__user=user) & Q(article__group_read=True)) + ).annotate(Count("id")) + return q + + + +## ... source file abbreviated to get to EmptyQuerySet examples ... + + + + def can_read(self, user): + return self.get_queryset().can_read(user) + + def can_write(self, user): + return self.get_queryset().can_write(user) + + +class ArticleFkManager(models.Manager): + def get_empty_query_set(self): + return self.get_queryset().none() + + def get_queryset(self): + return ArticleFkQuerySet(self.model, using=self._db) + + def active(self): + return self.get_queryset().active() + + def can_read(self, user): + return self.get_queryset().can_read(user) + + def can_write(self, user): + return self.get_queryset().can_write(user) + + +~~class URLPathEmptyQuerySet(EmptyQuerySet, ArticleFkEmptyQuerySetMixin): + def select_related_common(self): + return self + + def default_order(self): + return self + + +class URLPathQuerySet(QuerySet, ArticleFkQuerySetMixin): + def select_related_common(self): + return self.select_related( + "parent", "article__current_revision", "article__owner" + ) + + def default_order(self): + return self.order_by("article__current_revision__title") + + +class URLPathManager(TreeManager): + def get_empty_query_set(self): + return self.get_queryset().none() + + def get_queryset(self): + return URLPathQuerySet(self.model, using=self._db).order_by( + self.tree_id_attr, self.left_attr + Q(article__other_write=True) + | Q(article__owner=user) + | (Q(article__group__user=user) & Q(article__group_write=True)) + ).annotate(Count("id")) + return q + + def active(self): + return self.filter(article__current_revision__deleted=False) + + +class ArticleFkEmptyQuerySetMixin: + def can_read(self, user): + return self + + def can_write(self, user): + return self + + def active(self): + return self + + +class ArticleFkQuerySet(ArticleFkQuerySetMixin, QuerySet): + pass + + +~~class ArticleFkEmptyQuerySet(ArticleFkEmptyQuerySetMixin, EmptyQuerySet): + pass + + +class ArticleManager(models.Manager): + def get_empty_query_set(self): + return self.get_queryset().none() + + def get_queryset(self): + return ArticleQuerySet(self.model, using=self._db) + + def active(self): + return self.get_queryset().active() + + +## ... source file continues with no further EmptyQuerySet examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-query-modeliterable.markdown b/content/pages/examples/django/django-db-models-query-modeliterable.markdown new file mode 100644 index 000000000..7f203b449 --- /dev/null +++ b/content/pages/examples/django/django-db-models-query-modeliterable.markdown @@ -0,0 +1,72 @@ +title: django.db.models.query ModelIterable Example Code +category: page +slug: django-db-models-query-modeliterable-examples +sortorder: 500011240 +toc: False +sidebartitle: django.db.models.query ModelIterable +meta: Python example code for the ModelIterable class from the django.db.models.query module of the Django project. + + +ModelIterable is a class within the django.db.models.query module of the Django project. + + +## Example 1 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / managers.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./managers.py) + +```python +# managers.py +import django +from django.core.exceptions import ObjectDoesNotExist +from django.db import connection +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.fields.related import OneToOneField, OneToOneRel +~~from django.db.models.query import ModelIterable +from django.db.models.query import QuerySet +from django.db.models.sql.datastructures import Join + + +~~class InheritanceIterable(ModelIterable): + def __iter__(self): + queryset = self.queryset +~~ iter = ModelIterable(queryset) + if getattr(queryset, 'subclasses', False): + extras = tuple(queryset.query.extra.keys()) + subclasses = sorted(queryset.subclasses, key=len, reverse=True) + for obj in iter: + sub_obj = None + for s in subclasses: + sub_obj = queryset._get_sub_obj_recurse(obj, s) + if sub_obj: + break + if not sub_obj: + sub_obj = obj + + if getattr(queryset, '_annotated', False): + for k in queryset._annotated: + setattr(sub_obj, k, getattr(obj, k)) + + for k in extras: + setattr(sub_obj, k, getattr(obj, k)) + + yield sub_obj + else: + yield from iter + + + + +## ... source file continues with no further ModelIterable examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-query-prefetch-related-objects.markdown b/content/pages/examples/django/django-db-models-query-prefetch-related-objects.markdown new file mode 100644 index 000000000..0aaefd46f --- /dev/null +++ b/content/pages/examples/django/django-db-models-query-prefetch-related-objects.markdown @@ -0,0 +1,110 @@ +title: django.db.models.query prefetch_related_objects Example Code +category: page +slug: django-db-models-query-prefetch-related-objects-examples +sortorder: 500011244 +toc: False +sidebartitle: django.db.models.query prefetch_related_objects +meta: Python example code for the prefetch_related_objects callable from the django.db.models.query module of the Django project. + + +prefetch_related_objects is a callable within the django.db.models.query module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / cms_menus.py**](https://github.com/divio/django-cms/blob/develop/cms/./cms_menus.py) + +```python +# cms_menus.py +~~from django.db.models.query import Prefetch, prefetch_related_objects +from django.urls import reverse +from django.utils.functional import SimpleLazyObject +from django.utils.translation import override as force_language + +from cms import constants +from cms.api import get_page_draft +from cms.apphook_pool import apphook_pool +from cms.models import EmptyTitle +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import ( + get_fallback_languages, + get_public_languages, + hide_untranslated, + is_valid_site_language, +) +from cms.utils.permissions import get_view_restrictions +from cms.utils.page import get_page_queryset +from cms.utils.page_permissions import user_can_view_all_pages + +from menus.base import Menu, NavigationNode, Modifier +from menus.menu_pool import menu_pool + + +def get_visible_nodes(request, pages, site): + + +## ... source file abbreviated to get to prefetch_related_objects examples ... + + + .distinct() + ) + + if not self.renderer.draft_mode_active: + pages = pages.select_related('publisher_public__node') + pages = get_visible_nodes(request, pages, site) + + if not pages: + return [] + + try: + homepage = [page for page in pages if page.is_home][0] + except IndexError: + homepage = None + + titles = Title.objects.filter( + language__in=languages, + publisher_is_draft=self.renderer.draft_mode_active, + ) + + lookup = Prefetch( + 'title_set', + to_attr='filtered_translations', + queryset=titles, + ) +~~ prefetch_related_objects(pages, lookup) + blank_title_cache = {language: EmptyTitle(language=language) for language in languages} + + if lang not in blank_title_cache: + blank_title_cache[lang] = EmptyTitle(language=lang) + + node_id_to_page = {} + + def _page_to_node(page): + page.title_cache = blank_title_cache.copy() + + for trans in page.filtered_translations: + page.title_cache[trans.language] = trans + menu_node = get_menu_node_for_page( + self.renderer, + page, + language=lang, + fallbacks=fallbacks, + ) + return menu_node + + menu_nodes = [] + + for page in pages: + node = page.node + + +## ... source file continues with no further prefetch_related_objects examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-query-prefetch.markdown b/content/pages/examples/django/django-db-models-query-prefetch.markdown new file mode 100644 index 000000000..cc8bd2e08 --- /dev/null +++ b/content/pages/examples/django/django-db-models-query-prefetch.markdown @@ -0,0 +1,110 @@ +title: django.db.models.query Prefetch Example Code +category: page +slug: django-db-models-query-prefetch-examples +sortorder: 500011241 +toc: False +sidebartitle: django.db.models.query Prefetch +meta: Python example code for the Prefetch class from the django.db.models.query module of the Django project. + + +Prefetch is a class within the django.db.models.query module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / cms_menus.py**](https://github.com/divio/django-cms/blob/develop/cms/./cms_menus.py) + +```python +# cms_menus.py +~~from django.db.models.query import Prefetch, prefetch_related_objects +from django.urls import reverse +from django.utils.functional import SimpleLazyObject +from django.utils.translation import override as force_language + +from cms import constants +from cms.api import get_page_draft +from cms.apphook_pool import apphook_pool +from cms.models import EmptyTitle +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import ( + get_fallback_languages, + get_public_languages, + hide_untranslated, + is_valid_site_language, +) +from cms.utils.permissions import get_view_restrictions +from cms.utils.page import get_page_queryset +from cms.utils.page_permissions import user_can_view_all_pages + +from menus.base import Menu, NavigationNode, Modifier +from menus.menu_pool import menu_pool + + +def get_visible_nodes(request, pages, site): + + +## ... source file abbreviated to get to Prefetch examples ... + + + pages = ( + pages + .filter(title_set__language__in=languages) + .select_related('node') + .order_by('node__path') + .distinct() + ) + + if not self.renderer.draft_mode_active: + pages = pages.select_related('publisher_public__node') + pages = get_visible_nodes(request, pages, site) + + if not pages: + return [] + + try: + homepage = [page for page in pages if page.is_home][0] + except IndexError: + homepage = None + + titles = Title.objects.filter( + language__in=languages, + publisher_is_draft=self.renderer.draft_mode_active, + ) + +~~ lookup = Prefetch( + 'title_set', + to_attr='filtered_translations', + queryset=titles, + ) + prefetch_related_objects(pages, lookup) + blank_title_cache = {language: EmptyTitle(language=language) for language in languages} + + if lang not in blank_title_cache: + blank_title_cache[lang] = EmptyTitle(language=lang) + + node_id_to_page = {} + + def _page_to_node(page): + page.title_cache = blank_title_cache.copy() + + for trans in page.filtered_translations: + page.title_cache[trans.language] = trans + menu_node = get_menu_node_for_page( + self.renderer, + page, + language=lang, + fallbacks=fallbacks, + ) + return menu_node + + +## ... source file continues with no further Prefetch examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-query-q.markdown b/content/pages/examples/django/django-db-models-query-q.markdown new file mode 100644 index 000000000..2ba3f36e3 --- /dev/null +++ b/content/pages/examples/django/django-db-models-query-q.markdown @@ -0,0 +1,136 @@ +title: django.db.models.query Q Example Code +category: page +slug: django-db-models-query-q-examples +sortorder: 500011242 +toc: False +sidebartitle: django.db.models.query Q +meta: Python example code for the Q constant from the django.db.models.query module of the Django project. + + +Q is a constant within the django.db.models.query module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / managers.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./managers.py) + +```python +# managers.py +from django.db import models +from django.db.models import Count +from django.db.models import Q +from django.db.models.query import EmptyQuerySet +~~from django.db.models.query import QuerySet +from mptt.managers import TreeManager + + +class ArticleQuerySet(QuerySet): + def can_read(self, user): + if user.has_perm("wiki.moderator"): + return self + if user.is_anonymous: + q = self.filter(other_read=True) + else: + q = self.filter( +~~ Q(other_read=True) +~~ | Q(owner=user) +~~ | (Q(group__user=user) & Q(group_read=True)) + ).annotate(Count("id")) + return q + + def can_write(self, user): + if user.has_perm("wiki.moderator"): + return self + if user.is_anonymous: + q = self.filter(other_write=True) + else: + q = self.filter( +~~ Q(other_write=True) +~~ | Q(owner=user) +~~ | (Q(group__user=user) & Q(group_write=True)) + ) + return q + + def active(self): + return self.filter(current_revision__deleted=False) + + +class ArticleEmptyQuerySet(EmptyQuerySet): + def can_read(self, user): + return self + + def can_write(self, user): + return self + + def active(self): + return self + + +class ArticleFkQuerySetMixin: + def can_read(self, user): + if user.has_perm("wiki.moderate"): + return self + if user.is_anonymous: + q = self.filter(article__other_read=True) + else: + q = self.filter( +~~ Q(article__other_read=True) +~~ | Q(article__owner=user) +~~ | (Q(article__group__user=user) & Q(article__group_read=True)) + ).annotate(Count("id")) + return q + + def can_write(self, user): + if user.has_perm("wiki.moderate"): + return self + if user.is_anonymous: + q = self.filter(article__other_write=True) + else: + q = self.filter( +~~ Q(article__other_write=True) +~~ | Q(article__owner=user) +~~ | (Q(article__group__user=user) & Q(article__group_write=True)) + ).annotate(Count("id")) + return q + + def active(self): + return self.filter(article__current_revision__deleted=False) + + +class ArticleFkEmptyQuerySetMixin: + def can_read(self, user): + return self + + def can_write(self, user): + return self + + def active(self): + return self + + +class ArticleFkQuerySet(ArticleFkQuerySetMixin, QuerySet): + pass + + +class ArticleFkEmptyQuerySet(ArticleFkEmptyQuerySetMixin, EmptyQuerySet): + pass + + +## ... source file continues with no further Q examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-query-queryset.markdown b/content/pages/examples/django/django-db-models-query-queryset.markdown new file mode 100644 index 000000000..fcc29c3fc --- /dev/null +++ b/content/pages/examples/django/django-db-models-query-queryset.markdown @@ -0,0 +1,900 @@ +title: django.db.models.query QuerySet Example Code +category: page +slug: django-db-models-query-queryset-examples +sortorder: 500011243 +toc: False +sidebartitle: django.db.models.query QuerySet +meta: Python example code for the QuerySet class from the django.db.models.query module of the Django project. + + +QuerySet is a class within the django.db.models.query module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / publisher / query.py**](https://github.com/divio/django-cms/blob/develop/cms/publisher/query.py) + +```python +# query.py +~~from django.db.models.query import QuerySet + + +~~class PublisherQuerySet(QuerySet): + def drafts(self): + return self.filter(publisher_is_draft=True) + + def public(self): + return self.filter(publisher_is_draft=False) + + + +## ... source file continues with no further QuerySet examples... + +``` + + +## Example 2 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / admin / __init__.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/__init__.py) + +```python +# __init__.py +import six +import operator +from functools import update_wrapper +from six.moves import reduce +from typing import Tuple, Dict, Callable # NOQA + +from django.apps import apps +from django.http import HttpResponse, HttpResponseNotFound +from django.conf import settings +from django.db import models +~~from django.db.models.query import QuerySet +from django.utils.encoding import smart_str +from django.utils.translation import gettext as _ +from django.utils.text import get_text_list +from django.contrib import admin + +from django_extensions.admin.widgets import ForeignKeySearchInput + + +class ForeignKeyAutocompleteAdminMixin: + + related_search_fields = {} # type: Dict[str, Tuple[str]] + related_string_functions = {} # type: Dict[str, Callable] + autocomplete_limit = getattr(settings, 'FOREIGNKEY_AUTOCOMPLETE_LIMIT', None) + + def get_urls(self): + from django.urls import path + + def wrap(view): + def wrapper(*args, **kwargs): + return self.admin_site.admin_view(view)(*args, **kwargs) + return update_wrapper(wrapper, view) + + return [ + path('foreignkey_autocomplete/', wrap(self.foreignkey_autocomplete), + + +## ... source file abbreviated to get to QuerySet examples ... + + + object_pk = request.GET.get('object_pk', None) + + try: + to_string_function = self.related_string_functions[model_name] + except KeyError: + to_string_function = lambda x: x.__str__() + + if search_fields and app_label and model_name and (query or object_pk): + def construct_search(field_name): + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + elif field_name.startswith('@'): + return "%s__search" % field_name[1:] + else: + return "%s__icontains" % field_name + + model = apps.get_model(app_label, model_name) + + queryset = model._default_manager.all() + data = '' + if query: + for bit in query.split(): + or_queries = [models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)}) for field_name in search_fields.split(',')] +~~ other_qs = QuerySet(model) + other_qs.query.select_related = queryset.query.select_related + other_qs = other_qs.filter(reduce(operator.or_, or_queries)) + queryset = queryset & other_qs + + additional_filter = self.get_related_filter(model, request) + if additional_filter: + queryset = queryset.filter(additional_filter) + + if self.autocomplete_limit: + queryset = queryset[:self.autocomplete_limit] + + data = ''.join([six.u('%s|%s\n') % (to_string_function(f), f.pk) for f in queryset]) + elif object_pk: + try: + obj = queryset.get(pk=object_pk) + except Exception: # FIXME: use stricter exception checking + pass + else: + data = to_string_function(obj) + return HttpResponse(data, content_type='text/plain') + return HttpResponseNotFound() + + def get_related_filter(self, model, request): + return None + + +## ... source file continues with no further QuerySet examples... + +``` + + +## Example 3 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / core.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./core.py) + +```python +# core.py +from itertools import chain + +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Permission +~~from django.db.models.query import QuerySet +from django.utils.encoding import force_str + +from guardian.conf import settings as guardian_settings +from guardian.ctypes import get_content_type +from guardian.utils import get_group_obj_perms_model, get_identity, get_user_obj_perms_model + + +def _get_pks_model_and_ctype(objects): + +~~ if isinstance(objects, QuerySet): + model = objects.model + pks = [force_str(pk) for pk in objects.values_list('pk', flat=True)] + ctype = get_content_type(model) + else: + pks = [] + for idx, obj in enumerate(objects): + if not idx: + model = type(obj) + ctype = get_content_type(model) + pks.append(force_str(obj.pk)) + + return pks, model, ctype + + +class ObjectPermissionChecker: + + def __init__(self, user_or_group=None): + self.user, self.group = get_identity(user_or_group) + self._obj_perms_cache = {} + + def has_perm(self, perm, obj): + if self.user and not self.user.is_active: + return False + elif self.user and self.user.is_superuser: + + +## ... source file continues with no further QuerySet examples... + +``` + + +## Example 4 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / resources.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./resources.py) + +```python +# resources.py +import functools +import logging +import tablib +import traceback +from collections import OrderedDict +from copy import deepcopy + +from diff_match_patch import diff_match_patch + +import django +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.management.color import no_style +from django.core.paginator import Paginator +from django.db import DEFAULT_DB_ALIAS, connections +from django.db.models.fields.related import ForeignObjectRel +~~from django.db.models.query import QuerySet +from django.db.transaction import ( + TransactionManagementError, + atomic, + savepoint, + savepoint_commit, + savepoint_rollback +) +from django.utils.encoding import force_str +from django.utils.safestring import mark_safe + +from . import widgets +from .fields import Field +from .instance_loaders import ModelInstanceLoader +from .results import Error, Result, RowResult +from .utils import atomic_if_using_transaction + +if django.VERSION[0] >= 3: + from django.core.exceptions import FieldDoesNotExist +else: + from django.db.models.fields import FieldDoesNotExist + + +logger = logging.getLogger(__name__) +logger.addHandler(logging.NullHandler()) + + +## ... source file abbreviated to get to QuerySet examples ... + + + method = getattr(self, 'dehydrate_%s' % field_name, None) + if method is not None: + return method(obj) + return field.export(obj) + + def get_export_fields(self): + return self.get_fields() + + def export_resource(self, obj): + return [self.export_field(field, obj) for field in self.get_export_fields()] + + def get_export_headers(self): + headers = [ + force_str(field.column_name) for field in self.get_export_fields()] + return headers + + def get_user_visible_headers(self): + headers = [ + force_str(field.column_name) for field in self.get_user_visible_fields()] + return headers + + def get_user_visible_fields(self): + return self.get_fields() + + def iter_queryset(self, queryset): +~~ if not isinstance(queryset, QuerySet): + yield from queryset + elif queryset._prefetch_related_lookups: + if not queryset.query.order_by: + queryset = queryset.order_by('pk') + paginator = Paginator(queryset, self.get_chunk_size()) + for index in range(paginator.num_pages): + yield from paginator.get_page(index + 1) + else: + yield from queryset.iterator(chunk_size=self.get_chunk_size()) + + def export(self, queryset=None, *args, **kwargs): + + self.before_export(queryset, *args, **kwargs) + + if queryset is None: + queryset = self.get_queryset() + headers = self.get_export_headers() + data = tablib.Dataset(headers=headers) + + for obj in self.iter_queryset(queryset): + data.append(self.export_resource(obj)) + + self.after_export(queryset, data, *args, **kwargs) + + + +## ... source file continues with no further QuerySet examples... + +``` + + +## Example 5 from django-jsonfield +[django-jsonfield](https://github.com/dmkoch/django-jsonfield) +([jsonfield on PyPi](https://pypi.org/project/jsonfield/)) is a +[Django](/django.html) code library that makes it easier to store validated +JSON in a [Django object-relational mapper (ORM)](/django-orm.html) database +model. + +The django-jsonfield project is open source under the +[MIT license](https://github.com/dmkoch/django-jsonfield/blob/master/LICENSE). + +[**django-jsonfield / src/jsonfield / encoder.py**](https://github.com/dmkoch/django-jsonfield/blob/master/src/jsonfield/./encoder.py) + +```python +# encoder.py +import datetime +import decimal +import json +import uuid + +~~from django.db.models.query import QuerySet +from django.utils import timezone +from django.utils.encoding import force_str +from django.utils.functional import Promise + + +class JSONEncoder(json.JSONEncoder): + def default(self, obj): # noqa: C901 + if isinstance(obj, Promise): + return force_str(obj) + elif isinstance(obj, datetime.datetime): + representation = obj.isoformat() + if representation.endswith('+00:00'): + representation = representation[:-6] + 'Z' + return representation + elif isinstance(obj, datetime.date): + return obj.isoformat() + elif isinstance(obj, datetime.time): + if timezone and timezone.is_aware(obj): + raise ValueError("JSON can't represent timezone-aware times.") + representation = obj.isoformat() + return representation + elif isinstance(obj, datetime.timedelta): + return str(obj.total_seconds()) + elif isinstance(obj, decimal.Decimal): + return float(obj) + elif isinstance(obj, uuid.UUID): + return str(obj) +~~ elif isinstance(obj, QuerySet): + return tuple(obj) + elif isinstance(obj, bytes): + return obj.decode() + elif hasattr(obj, 'tolist'): + return obj.tolist() + elif hasattr(obj, '__getitem__'): + cls = (list if isinstance(obj, (list, tuple)) else dict) + try: + return cls(obj) + except Exception: + pass + elif hasattr(obj, '__iter__'): + return tuple(item for item in obj) + return super().default(obj) + + + +## ... source file continues with no further QuerySet examples... + +``` + + +## Example 6 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / managers.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./managers.py) + +```python +# managers.py +import django +from django.core.exceptions import ObjectDoesNotExist +from django.db import connection +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.fields.related import OneToOneField, OneToOneRel +from django.db.models.query import ModelIterable +~~from django.db.models.query import QuerySet +from django.db.models.sql.datastructures import Join + + +class InheritanceIterable(ModelIterable): + def __iter__(self): + queryset = self.queryset + iter = ModelIterable(queryset) + if getattr(queryset, 'subclasses', False): + extras = tuple(queryset.query.extra.keys()) + subclasses = sorted(queryset.subclasses, key=len, reverse=True) + for obj in iter: + sub_obj = None + for s in subclasses: + sub_obj = queryset._get_sub_obj_recurse(obj, s) + if sub_obj: + break + if not sub_obj: + sub_obj = obj + + if getattr(queryset, '_annotated', False): + for k in queryset._annotated: + setattr(sub_obj, k, getattr(obj, k)) + + for k in extras: + + +## ... source file abbreviated to get to QuerySet examples ... + + + if levels or levels is None: + parent_model = related.model + parent_link = parent_model._meta.get_ancestor_link( + self.model) + else: + parent_link = None + return LOOKUP_SEP.join(ancestry) + + def _get_sub_obj_recurse(self, obj, s): + rel, _, s = s.partition(LOOKUP_SEP) + + try: + node = getattr(obj, rel) + except ObjectDoesNotExist: + return None + if s: + child = self._get_sub_obj_recurse(node, s) + return child + else: + return node + + def get_subclass(self, *args, **kwargs): + return self.select_subclasses().get(*args, **kwargs) + + +~~class InheritanceQuerySet(InheritanceQuerySetMixin, QuerySet): + def instance_of(self, *models): + + + + where_queries = [] + for model in models: + where_queries.append('(' + ' AND '.join([ + '"{}"."{}" IS NOT NULL'.format( + model._meta.db_table, + field.attname, # Should this be something else? + ) for field in model._meta.parents.values() + ]) + ')') + + return self.select_subclasses(*models).extra(where=[' OR '.join(where_queries)]) + + +class InheritanceManagerMixin: + _queryset_class = InheritanceQuerySet + + def get_queryset(self): + return self._queryset_class(self.model) + + def select_subclasses(self, *subclasses): + return self.get_queryset().select_subclasses(*subclasses) + + +## ... source file abbreviated to get to QuerySet examples ... + + + self._q = models.Q(**kwargs) + self._order_by = None + super().__init__() + + def order_by(self, *args): + self._order_by = args + return self + + def get_queryset(self): + qs = super().get_queryset().filter(self._q) + if self._order_by is not None: + return qs.order_by(*self._order_by) + return qs + + +class QueryManager(QueryManagerMixin, models.Manager): + pass + + +class SoftDeletableQuerySetMixin: + + def delete(self): + self.update(is_removed=True) + + +~~class SoftDeletableQuerySet(SoftDeletableQuerySetMixin, QuerySet): + pass + + +class SoftDeletableManagerMixin: + _queryset_class = SoftDeletableQuerySet + + def get_queryset(self): + kwargs = {'model': self.model, 'using': self._db} + if hasattr(self, '_hints'): + kwargs['hints'] = self._hints + + return self._queryset_class(**kwargs).filter(is_removed=False) + + +class SoftDeletableManager(SoftDeletableManagerMixin, models.Manager): + pass + + +class JoinQueryset(models.QuerySet): + + def get_quoted_query(self, query): + query, params = query.sql_with_params() + + params = [ + + +## ... source file continues with no further QuerySet examples... + +``` + + +## Example 7 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / relations.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./relations.py) + +```python +# relations.py +import sys +from collections import OrderedDict +from urllib import parse + +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist +from django.db.models import Manager +~~from django.db.models.query import QuerySet +from django.urls import NoReverseMatch, Resolver404, get_script_prefix, resolve +from django.utils.encoding import smart_str, uri_to_iri +from django.utils.translation import gettext_lazy as _ + +from rest_framework.fields import ( + Field, empty, get_attribute, is_simple_callable, iter_options +) +from rest_framework.reverse import reverse +from rest_framework.settings import api_settings +from rest_framework.utils import html + + +def method_overridden(method_name, klass, instance): + method = getattr(klass, method_name) + default_method = getattr(method, '__func__', method) # Python 3 compat + return default_method is not getattr(instance, method_name).__func__ + + +class ObjectValueError(ValueError): + + +class ObjectTypeError(TypeError): + + + + +## ... source file abbreviated to get to QuerySet examples ... + + + ) + kwargs.pop('many', None) + kwargs.pop('allow_empty', None) + super().__init__(**kwargs) + + def __new__(cls, *args, **kwargs): + if kwargs.pop('many', False): + return cls.many_init(*args, **kwargs) + return super().__new__(cls, *args, **kwargs) + + @classmethod + def many_init(cls, *args, **kwargs): + list_kwargs = {'child_relation': cls(*args, **kwargs)} + for key in kwargs: + if key in MANY_RELATION_KWARGS: + list_kwargs[key] = kwargs[key] + return ManyRelatedField(**list_kwargs) + + def run_validation(self, data=empty): + if data == '': + data = None + return super().run_validation(data) + + def get_queryset(self): + queryset = self.queryset +~~ if isinstance(queryset, (QuerySet, Manager)): + queryset = queryset.all() + return queryset + + def use_pk_only_optimization(self): + return False + + def get_attribute(self, instance): + if self.use_pk_only_optimization() and self.source_attrs: + try: + attribute_instance = get_attribute(instance, self.source_attrs[:-1]) + value = attribute_instance.serializable_value(self.source_attrs[-1]) + if is_simple_callable(value): + value = value().pk + return PKOnlyObject(pk=value) + except AttributeError: + pass + + return super().get_attribute(instance) + + def get_choices(self, cutoff=None): + queryset = self.get_queryset() + if queryset is None: + return {} + + + +## ... source file continues with no further QuerySet examples... + +``` + + +## Example 8 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / managers.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./managers.py) + +```python +# managers.py +from django.db import models +from django.db.models import Count +from django.db.models import Q +from django.db.models.query import EmptyQuerySet +~~from django.db.models.query import QuerySet +from mptt.managers import TreeManager + + +~~class ArticleQuerySet(QuerySet): + def can_read(self, user): + if user.has_perm("wiki.moderator"): + return self + if user.is_anonymous: + q = self.filter(other_read=True) + else: + q = self.filter( + Q(other_read=True) + | Q(owner=user) + | (Q(group__user=user) & Q(group_read=True)) + ).annotate(Count("id")) + return q + + def can_write(self, user): + if user.has_perm("wiki.moderator"): + return self + if user.is_anonymous: + q = self.filter(other_write=True) + else: + q = self.filter( + Q(other_write=True) + | Q(owner=user) + | (Q(group__user=user) & Q(group_write=True)) + ) + + +## ... source file abbreviated to get to QuerySet examples ... + + +class ArticleFkManager(models.Manager): + def get_empty_query_set(self): + return self.get_queryset().none() + + def get_queryset(self): + return ArticleFkQuerySet(self.model, using=self._db) + + def active(self): + return self.get_queryset().active() + + def can_read(self, user): + return self.get_queryset().can_read(user) + + def can_write(self, user): + return self.get_queryset().can_write(user) + + +class URLPathEmptyQuerySet(EmptyQuerySet, ArticleFkEmptyQuerySetMixin): + def select_related_common(self): + return self + + def default_order(self): + return self + + +~~class URLPathQuerySet(QuerySet, ArticleFkQuerySetMixin): + def select_related_common(self): + return self.select_related( + "parent", "article__current_revision", "article__owner" + ) + + def default_order(self): + return self.order_by("article__current_revision__title") + + +class URLPathManager(TreeManager): + def get_empty_query_set(self): + return self.get_queryset().none() + + def get_queryset(self): + return URLPathQuerySet(self.model, using=self._db).order_by( + self.tree_id_attr, self.left_attr + ) + + def select_related_common(self): + return self.get_queryset().common_select_related() + + def active(self): + return self.get_queryset().active() + + if user.is_anonymous: + q = self.filter(article__other_write=True) + else: + q = self.filter( + Q(article__other_write=True) + | Q(article__owner=user) + | (Q(article__group__user=user) & Q(article__group_write=True)) + ).annotate(Count("id")) + return q + + def active(self): + return self.filter(article__current_revision__deleted=False) + + +class ArticleFkEmptyQuerySetMixin: + def can_read(self, user): + return self + + def can_write(self, user): + return self + + def active(self): + return self + + +~~class ArticleFkQuerySet(ArticleFkQuerySetMixin, QuerySet): + pass + + +class ArticleFkEmptyQuerySet(ArticleFkEmptyQuerySetMixin, EmptyQuerySet): + pass + + +class ArticleManager(models.Manager): + def get_empty_query_set(self): + return self.get_queryset().none() + + def get_queryset(self): + return ArticleQuerySet(self.model, using=self._db) + + def active(self): + return self.get_queryset().active() + + def can_read(self, user): + return self.get_queryset().can_read(user) + + def can_write(self, user): + return self.get_queryset().can_write(user) + + + + +## ... source file continues with no further QuerySet examples... + +``` + + +## Example 9 from elasticsearch-django +[elasticsearch-django](https://github.com/yunojuno/elasticsearch-django) +([PyPI package information](https://pypi.org/project/elasticsearch-django/)) +is a [Django](/django.html) app for managing +[ElasticSearch](https://github.com/elastic/elasticsearch) indexes +populated by [Django ORM](/django-orm.html) models. The project is +available as open source under the +[MIT license](https://github.com/yunojuno/elasticsearch-django/blob/master/LICENSE). + +[**elasticsearch-django / elasticsearch_django / models.py**](https://github.com/yunojuno/elasticsearch-django/blob/master/elasticsearch_django/./models.py) + +```python +# models.py +from __future__ import annotations + +import logging +import time +import warnings +from typing import TYPE_CHECKING, Any, List, Optional, Tuple, Union + +from django.conf import settings +from django.contrib.postgres.fields import JSONField +from django.core.cache import cache +from django.core.serializers.json import DjangoJSONEncoder +from django.db import models +from django.db.models.expressions import RawSQL +from django.db.models.fields import CharField +~~from django.db.models.query import QuerySet +from django.utils.timezone import now as tz_now +from elasticsearch_dsl import Search + +from .settings import ( + get_client, + get_model_index_properties, + get_model_indexes, + get_setting, +) + +if TYPE_CHECKING: + from django.contrib.auth.models import AbstractBaseUser + +logger = logging.getLogger(__name__) + +UPDATE_STRATEGY_FULL = "full" +UPDATE_STRATEGY_PARTIAL = "partial" +UPDATE_STRATEGY = get_setting("update_strategy", UPDATE_STRATEGY_FULL) + + +class SearchDocumentManagerMixin(models.Manager): + + def get_search_queryset(self, index: str = "_all") -> QuerySet: + raise NotImplementedError( + + +## ... source file continues with no further QuerySet examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-query-utils-deferredattribute.markdown b/content/pages/examples/django/django-db-models-query-utils-deferredattribute.markdown new file mode 100644 index 000000000..1211e4cd4 --- /dev/null +++ b/content/pages/examples/django/django-db-models-query-utils-deferredattribute.markdown @@ -0,0 +1,120 @@ +title: django.db.models.query_utils DeferredAttribute Example Code +category: page +slug: django-db-models-query-utils-deferredattribute-examples +sortorder: 500011245 +toc: False +sidebartitle: django.db.models.query_utils DeferredAttribute +meta: Python example code for the DeferredAttribute class from the django.db.models.query_utils module of the Django project. + + +DeferredAttribute is a class within the django.db.models.query_utils module of the Django project. + + +## Example 1 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / tracker.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./tracker.py) + +```python +# tracker.py +from copy import deepcopy +from functools import wraps + +import django +from django.core.exceptions import FieldError +from django.db import models +from django.db.models.fields.files import FileDescriptor +~~from django.db.models.query_utils import DeferredAttribute + + +class DescriptorMixin: + tracker_instance = None + + def __get__(self, instance, owner): + if instance is None: + return self + was_deferred = False + field_name = self._get_field_name() + if field_name in instance._deferred_fields: + instance._deferred_fields.remove(field_name) + was_deferred = True + value = super().__get__(instance, owner) + if was_deferred: + self.tracker_instance.saved_data[field_name] = deepcopy(value) + return value + + def _get_field_name(self): + return self.field_name + + +class DescriptorWrapper: + + + +## ... source file abbreviated to get to DeferredAttribute examples ... + + + if self.instance.pk and field in self.deferred_fields and field not in self.saved_data: + + if field not in self.instance.__dict__: + self.get_field_value(field) + + else: + current_value = self.get_field_value(field) + self.instance.refresh_from_db(fields=[field]) + self.saved_data[field] = deepcopy(self.get_field_value(field)) + setattr(self.instance, self.field_map[field], current_value) + + return self.saved_data.get(field) + + def changed(self): + return { + field: self.previous(field) + for field in self.fields + if self.has_changed(field) + } + + def init_deferred_fields(self): + self.instance._deferred_fields = set() + if hasattr(self.instance, '_deferred') and not self.instance._deferred: + return + +~~ class DeferredAttributeTracker(DescriptorMixin, DeferredAttribute): + tracker_instance = self + + class FileDescriptorTracker(DescriptorMixin, FileDescriptor): + tracker_instance = self + + def _get_field_name(self): + return self.field.name + + self.instance._deferred_fields = self.instance.get_deferred_fields() + for field in self.instance._deferred_fields: + field_obj = self.instance.__class__.__dict__.get(field) + if isinstance(field_obj, FileDescriptor): + field_tracker = FileDescriptorTracker(field_obj.field) + setattr(self.instance.__class__, field, field_tracker) + else: + field_tracker = DeferredAttributeTracker(field) + setattr(self.instance.__class__, field, field_tracker) + + +class FieldTracker: + + tracker_class = FieldInstanceTracker + + def __init__(self, fields=None): + + +## ... source file continues with no further DeferredAttribute examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-query-utils-pathinfo.markdown b/content/pages/examples/django/django-db-models-query-utils-pathinfo.markdown new file mode 100644 index 000000000..941641c13 --- /dev/null +++ b/content/pages/examples/django/django-db-models-query-utils-pathinfo.markdown @@ -0,0 +1,162 @@ +title: django.db.models.query_utils PathInfo Example Code +category: page +slug: django-db-models-query-utils-pathinfo-examples +sortorder: 500011246 +toc: False +sidebartitle: django.db.models.query_utils PathInfo +meta: Python example code for the PathInfo class from the django.db.models.query_utils module of the Django project. + + +PathInfo is a class within the django.db.models.query_utils module of the Django project. + + +## Example 1 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / managers.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./managers.py) + +```python +# managers.py +import uuid +from operator import attrgetter + +from django import VERSION +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.db import connections, models, router +from django.db.models import signals +from django.db.models.fields.related import ( + ManyToManyRel, + OneToOneRel, + RelatedField, + lazy_related_operation, +) +~~from django.db.models.query_utils import PathInfo +from django.utils.text import capfirst +from django.utils.translation import gettext_lazy as _ + +from taggit.forms import TagField +from taggit.models import ( + CommonGenericTaggedItemBase, + GenericUUIDTaggedItemBase, + TaggedItem, +) +from taggit.utils import require_instance_manager + + +class ExtraJoinRestriction: + + contains_aggregate = False + + def __init__(self, alias, col, content_types): + self.alias = alias + self.col = col + self.content_types = content_types + + def as_sql(self, compiler, connection): + qn = compiler.quote_name_unless_alias + if len(self.content_types) == 1: + + +## ... source file abbreviated to get to PathInfo examples ... + + + filtered_relation=filtered_relation + ) + else: + if VERSION < (2, 0): + join1infos = linkfield2.get_reverse_path_info() + join2infos = linkfield1.get_path_info() + else: + join1infos = linkfield2.get_reverse_path_info( + filtered_relation=filtered_relation + ) + join2infos = linkfield1.get_path_info( + filtered_relation=filtered_relation + ) + pathinfos.extend(join1infos) + pathinfos.extend(join2infos) + return pathinfos + + def _get_gfk_case_path_info(self, direct=False, filtered_relation=None): + pathinfos = [] + from_field = self.model._meta.pk + opts = self.through._meta + linkfield = self.through._meta.get_field(self.m2m_reverse_field_name()) + if direct: + if VERSION < (2, 0): + join1infos = [ +~~ PathInfo( + self.model._meta, + opts, + [from_field], + self.remote_field, + True, + False, + ) + ] + join2infos = linkfield.get_path_info() + else: + join1infos = [ +~~ PathInfo( + self.model._meta, + opts, + [from_field], + self.remote_field, + True, + False, + filtered_relation, + ) + ] + join2infos = linkfield.get_path_info( + filtered_relation=filtered_relation + ) + else: + if VERSION < (2, 0): + join1infos = linkfield.get_reverse_path_info() + join2infos = [ +~~ PathInfo(opts, self.model._meta, [from_field], self, True, False) + ] + else: + join1infos = linkfield.get_reverse_path_info( + filtered_relation=filtered_relation + ) + join2infos = [ +~~ PathInfo( + opts, + self.model._meta, + [from_field], + self, + True, + False, + filtered_relation, + ) + ] + pathinfos.extend(join1infos) + pathinfos.extend(join2infos) + return pathinfos + + def get_path_info(self, filtered_relation=None): + if self.use_gfk: + return self._get_gfk_case_path_info( + direct=True, filtered_relation=filtered_relation + ) + else: + return self._get_mm_case_path_info( + direct=True, filtered_relation=filtered_relation + ) + + def get_reverse_path_info(self, filtered_relation=None): + + +## ... source file continues with no further PathInfo examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-query-utils-q.markdown b/content/pages/examples/django/django-db-models-query-utils-q.markdown new file mode 100644 index 000000000..b13b3dfea --- /dev/null +++ b/content/pages/examples/django/django-db-models-query-utils-q.markdown @@ -0,0 +1,117 @@ +title: django.db.models.query_utils Q Example Code +category: page +slug: django-db-models-query-utils-q-examples +sortorder: 500011247 +toc: False +sidebartitle: django.db.models.query_utils Q +meta: Python example code for the Q constant from the django.db.models.query_utils module of the Django project. + + +Q is a constant within the django.db.models.query_utils module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / placeholder.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/placeholder.py) + +```python +# placeholder.py +import operator +import warnings +from collections import OrderedDict + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +~~from django.db.models.query_utils import Q +from django.template import TemplateSyntaxError, NodeList, Variable, Context, Template, engines +from django.template.base import VariableNode +from django.template.loader import get_template +from django.template.loader_tags import BlockNode, ExtendsNode, IncludeNode + +from six import string_types + +from sekizai.helpers import get_varname + +from cms.exceptions import DuplicatePlaceholderWarning +from cms.utils.conf import get_cms_setting + + +def _get_nodelist(tpl): + if hasattr(tpl, 'template'): + return tpl.template.nodelist + else: + return tpl.nodelist + + +def get_context(): + if engines is not None: + context = Context() + context.template = Template('') + + +## ... source file abbreviated to get to Q examples ... + + + + def copy(self, **kwargs): + return False + + def get_copy_languages(self, **kwargs): + return [] + + +class MLNGPlaceholderActions(PlaceholderNoAction): + can_copy = True + + def copy(self, target_placeholder, source_language, fieldname, model, target_language, **kwargs): + from cms.utils.copy_plugins import copy_plugins_to + trgt = model.objects.get(**{fieldname: target_placeholder}) + src = model.objects.get(master=trgt.master, language_code=source_language) + + source_placeholder = getattr(src, fieldname, None) + if not source_placeholder: + return False + return copy_plugins_to(source_placeholder.get_plugins_list(), + target_placeholder, target_language) + + def get_copy_languages(self, placeholder, model, fieldname, **kwargs): + manager = model.objects + src = manager.get(**{fieldname: placeholder}) +~~ query = Q(master=src.master) +~~ query &= Q(**{'%s__cmsplugin__isnull' % fieldname: False}) + query &= -Q(pk=src.pk) + + language_codes = manager.filter(query).values_list('language_code', flat=True).distinct() + return [(lc, dict(settings.LANGUAGES)[lc]) for lc in language_codes] + + +def restore_sekizai_context(context, changes): + varname = get_varname() + sekizai_container = context.get(varname) + for key, values in changes.items(): + sekizai_namespace = sekizai_container[key] + for value in values: + sekizai_namespace.append(value) + + +def _scan_placeholders(nodelist, node_class=None, current_block=None, ignore_blocks=None): + from cms.templatetags.cms_tags import Placeholder + + if not node_class: + node_class = Placeholder + + nodes = [] + + if ignore_blocks is None: + + +## ... source file continues with no further Q examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-signals-post-delete.markdown b/content/pages/examples/django/django-db-models-signals-post-delete.markdown new file mode 100644 index 000000000..7a5dd1965 --- /dev/null +++ b/content/pages/examples/django/django-db-models-signals-post-delete.markdown @@ -0,0 +1,63 @@ +title: django.db.models.signals post_delete Example Code +category: page +slug: django-db-models-signals-post-delete-examples +sortorder: 500011248 +toc: False +sidebartitle: django.db.models.signals post_delete +meta: Python example code for the post_delete callable from the django.db.models.signals module of the Django project. + + +post_delete is a callable within the django.db.models.signals module of the Django project. + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / signal_handlers.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/signal_handlers.py) + +```python +# signal_handlers.py +import logging + +from django.core.cache import cache +~~from django.db.models.signals import post_delete, post_save, pre_delete + +from wagtail.core.models import Page, Site + +logger = logging.getLogger('wagtail.core') + + +def post_save_site_signal_handler(instance, update_fields=None, **kwargs): + cache.delete('wagtail_site_root_paths') + + +def post_delete_site_signal_handler(instance, **kwargs): + cache.delete('wagtail_site_root_paths') + + +def pre_delete_page_unpublish(sender, instance, **kwargs): + if instance.live: + instance.unpublish(commit=False) + + +def post_delete_page_log_deletion(sender, instance, **kwargs): + logger.info("Page deleted: \"%s\" id=%d", instance.title, instance.id) + + +def register_signal_handlers(): + post_save.connect(post_save_site_signal_handler, sender=Site) +~~ post_delete.connect(post_delete_site_signal_handler, sender=Site) + + pre_delete.connect(pre_delete_page_unpublish, sender=Page) +~~ post_delete.connect(post_delete_page_log_deletion, sender=Page) + + + +## ... source file continues with no further post_delete examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-signals-post-save.markdown b/content/pages/examples/django/django-db-models-signals-post-save.markdown new file mode 100644 index 000000000..5646633c8 --- /dev/null +++ b/content/pages/examples/django/django-db-models-signals-post-save.markdown @@ -0,0 +1,149 @@ +title: django.db.models.signals post_save Example Code +category: page +slug: django-db-models-signals-post-save-examples +sortorder: 500011249 +toc: False +sidebartitle: django.db.models.signals post_save +meta: Python example code for the post_save callable from the django.db.models.signals module of the Django project. + + +post_save is a callable within the django.db.models.signals module of the Django project. + + +## Example 1 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / models.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./models.py) + +```python +# models.py +from django.core.exceptions import ImproperlyConfigured +from django.db import models, transaction, router +~~from django.db.models.signals import post_save, pre_save +from django.utils.translation import gettext_lazy as _ + +from model_utils.fields import ( + AutoCreatedField, + AutoLastModifiedField, + StatusField, + MonitorField, + UUIDField, +) +from model_utils.managers import ( + QueryManager, + SoftDeletableManager, +) + +from django.db.models.functions import Now +now = Now() + + +class TimeStampedModel(models.Model): + created = AutoCreatedField(_('created')) + modified = AutoLastModifiedField(_('modified')) + + def save(self, *args, **kwargs): + if 'update_fields' in kwargs and 'modified' not in kwargs['update_fields']: + + +## ... source file abbreviated to get to post_save examples ... + + + + def save_base(self, raw=False, force_insert=False, + force_update=False, using=None, update_fields=None): + using = using or router.db_for_write(self.__class__, instance=self) + assert not (force_insert and (force_update or update_fields)) + assert update_fields is None or len(update_fields) > 0 + cls = origin = self.__class__ + + if cls._meta.proxy: + cls = cls._meta.concrete_model + meta = cls._meta + if not meta.auto_created and 'pre_save' not in self.signals_to_disable: + pre_save.send( + sender=origin, instance=self, raw=raw, using=using, + update_fields=update_fields, + ) + with transaction.atomic(using=using, savepoint=False): + if not raw: + self._save_parents(cls, using, update_fields) + updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) + + self._state.db = using + self._state.adding = False + + if not meta.auto_created and 'post_save' not in self.signals_to_disable: +~~ post_save.send( + sender=origin, instance=self, created=(not updated), + update_fields=update_fields, raw=raw, using=using, + ) + + self.signals_to_disable = [] + + + +## ... source file continues with no further post_save examples... + +``` + + +## Example 2 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / signal_handlers.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/signal_handlers.py) + +```python +# signal_handlers.py +import logging + +from django.core.cache import cache +~~from django.db.models.signals import post_delete, post_save, pre_delete + +from wagtail.core.models import Page, Site + +logger = logging.getLogger('wagtail.core') + + +def post_save_site_signal_handler(instance, update_fields=None, **kwargs): + cache.delete('wagtail_site_root_paths') + + +def post_delete_site_signal_handler(instance, **kwargs): + cache.delete('wagtail_site_root_paths') + + +def pre_delete_page_unpublish(sender, instance, **kwargs): + if instance.live: + instance.unpublish(commit=False) + + +def post_delete_page_log_deletion(sender, instance, **kwargs): + logger.info("Page deleted: \"%s\" id=%d", instance.title, instance.id) + + +def register_signal_handlers(): +~~ post_save.connect(post_save_site_signal_handler, sender=Site) + post_delete.connect(post_delete_site_signal_handler, sender=Site) + + pre_delete.connect(pre_delete_page_unpublish, sender=Page) + post_delete.connect(post_delete_page_log_deletion, sender=Page) + + + +## ... source file continues with no further post_save examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-signals-pre-delete.markdown b/content/pages/examples/django/django-db-models-signals-pre-delete.markdown new file mode 100644 index 000000000..1585599c7 --- /dev/null +++ b/content/pages/examples/django/django-db-models-signals-pre-delete.markdown @@ -0,0 +1,63 @@ +title: django.db.models.signals pre_delete Example Code +category: page +slug: django-db-models-signals-pre-delete-examples +sortorder: 500011250 +toc: False +sidebartitle: django.db.models.signals pre_delete +meta: Python example code for the pre_delete callable from the django.db.models.signals module of the Django project. + + +pre_delete is a callable within the django.db.models.signals module of the Django project. + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / signal_handlers.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/signal_handlers.py) + +```python +# signal_handlers.py +import logging + +from django.core.cache import cache +~~from django.db.models.signals import post_delete, post_save, pre_delete + +from wagtail.core.models import Page, Site + +logger = logging.getLogger('wagtail.core') + + +def post_save_site_signal_handler(instance, update_fields=None, **kwargs): + cache.delete('wagtail_site_root_paths') + + +def post_delete_site_signal_handler(instance, **kwargs): + cache.delete('wagtail_site_root_paths') + + +def pre_delete_page_unpublish(sender, instance, **kwargs): + if instance.live: + instance.unpublish(commit=False) + + +def post_delete_page_log_deletion(sender, instance, **kwargs): + logger.info("Page deleted: \"%s\" id=%d", instance.title, instance.id) + + +def register_signal_handlers(): + post_save.connect(post_save_site_signal_handler, sender=Site) + post_delete.connect(post_delete_site_signal_handler, sender=Site) + +~~ pre_delete.connect(pre_delete_page_unpublish, sender=Page) + post_delete.connect(post_delete_page_log_deletion, sender=Page) + + + +## ... source file continues with no further pre_delete examples... + +``` + diff --git a/content/pages/examples/django/django-db-models-signals-pre-save.markdown b/content/pages/examples/django/django-db-models-signals-pre-save.markdown new file mode 100644 index 000000000..a83fdc5c0 --- /dev/null +++ b/content/pages/examples/django/django-db-models-signals-pre-save.markdown @@ -0,0 +1,240 @@ +title: django.db.models.signals pre_save Example Code +category: page +slug: django-db-models-signals-pre-save-examples +sortorder: 500011251 +toc: False +sidebartitle: django.db.models.signals pre_save +meta: Python example code for the pre_save callable from the django.db.models.signals module of the Django project. + + +pre_save is a callable within the django.db.models.signals module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / middleware.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/middleware.py) + +```python +# middleware.py +from __future__ import unicode_literals + +import threading +import time + +from django.conf import settings +~~from django.db.models.signals import pre_save +from django.utils.functional import curry +from django.apps import apps +from auditlog.models import LogEntry +from auditlog.compat import is_authenticated + +try: + from django.utils.deprecation import MiddlewareMixin +except ImportError: + MiddlewareMixin = object + + +threadlocal = threading.local() + + +class AuditlogMiddleware(MiddlewareMixin): + + def process_request(self, request): + threadlocal.auditlog = { + 'signal_duid': (self.__class__, time.time()), + 'remote_addr': request.META.get('REMOTE_ADDR'), + } + + if request.META.get('HTTP_X_FORWARDED_FOR'): + threadlocal.auditlog['remote_addr'] = request.META.get('HTTP_X_FORWARDED_FOR').split(',')[0] + + if hasattr(request, 'user') and is_authenticated(request.user): + set_actor = curry(self.set_actor, user=request.user, signal_duid=threadlocal.auditlog['signal_duid']) +~~ pre_save.connect(set_actor, sender=LogEntry, dispatch_uid=threadlocal.auditlog['signal_duid'], weak=False) + + def process_response(self, request, response): + if hasattr(threadlocal, 'auditlog'): +~~ pre_save.disconnect(sender=LogEntry, dispatch_uid=threadlocal.auditlog['signal_duid']) + + return response + + def process_exception(self, request, exception): + if hasattr(threadlocal, 'auditlog'): +~~ pre_save.disconnect(sender=LogEntry, dispatch_uid=threadlocal.auditlog['signal_duid']) + + return None + + @staticmethod + def set_actor(user, sender, instance, signal_duid, **kwargs): + if hasattr(threadlocal, 'auditlog'): + if signal_duid != threadlocal.auditlog['signal_duid']: + return + try: + app_label, model_name = settings.AUTH_USER_MODEL.split('.') + auth_user_model = apps.get_model(app_label, model_name) + except ValueError: + auth_user_model = apps.get_model('auth', 'user') + if sender == LogEntry and isinstance(user, auth_user_model) and instance.actor is None: + instance.actor = user + + instance.remote_addr = threadlocal.auditlog['remote_addr'] + + + +## ... source file continues with no further pre_save examples... + +``` + + +## Example 2 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / models.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./models.py) + +```python +# models.py +from django.core.exceptions import ImproperlyConfigured +from django.db import models, transaction, router +~~from django.db.models.signals import post_save, pre_save +from django.utils.translation import gettext_lazy as _ + +from model_utils.fields import ( + AutoCreatedField, + AutoLastModifiedField, + StatusField, + MonitorField, + UUIDField, +) +from model_utils.managers import ( + QueryManager, + SoftDeletableManager, +) + +from django.db.models.functions import Now +now = Now() + + +class TimeStampedModel(models.Model): + created = AutoCreatedField(_('created')) + modified = AutoLastModifiedField(_('modified')) + + def save(self, *args, **kwargs): + if 'update_fields' in kwargs and 'modified' not in kwargs['update_fields']: + + +## ... source file abbreviated to get to pre_save examples ... + + + class Meta: + abstract = True + + +class SaveSignalHandlingModel(models.Model): + class Meta: + abstract = True + + def save(self, signals_to_disable=None, *args, **kwargs): + + self.signals_to_disable = signals_to_disable or [] + + super().save(*args, **kwargs) + + def save_base(self, raw=False, force_insert=False, + force_update=False, using=None, update_fields=None): + using = using or router.db_for_write(self.__class__, instance=self) + assert not (force_insert and (force_update or update_fields)) + assert update_fields is None or len(update_fields) > 0 + cls = origin = self.__class__ + + if cls._meta.proxy: + cls = cls._meta.concrete_model + meta = cls._meta + if not meta.auto_created and 'pre_save' not in self.signals_to_disable: +~~ pre_save.send( + sender=origin, instance=self, raw=raw, using=using, + update_fields=update_fields, + ) + with transaction.atomic(using=using, savepoint=False): + if not raw: + self._save_parents(cls, using, update_fields) + updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) + + self._state.db = using + self._state.adding = False + + if not meta.auto_created and 'post_save' not in self.signals_to_disable: + post_save.send( + sender=origin, instance=self, created=(not updated), + update_fields=update_fields, raw=raw, using=using, + ) + + self.signals_to_disable = [] + + + +## ... source file continues with no further pre_save examples... + +``` + + +## Example 3 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / images / signal_handlers.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/signal_handlers.py) + +```python +# signal_handlers.py +from django.conf import settings +from django.db import transaction +~~from django.db.models.signals import post_delete, pre_save + +from wagtail.images import get_image_model + + +def post_delete_file_cleanup(instance, **kwargs): + transaction.on_commit(lambda: instance.file.delete(False)) + + +def post_delete_purge_rendition_cache(instance, **kwargs): + instance.purge_from_cache() + + +def pre_save_image_feature_detection(instance, **kwargs): + if getattr(settings, 'WAGTAILIMAGES_FEATURE_DETECTION_ENABLED', False): + if not instance.has_focal_point(): + instance.set_focal_point(instance.get_suggested_focal_point()) + + +def register_signal_handlers(): + Image = get_image_model() + Rendition = Image.get_rendition_model() + +~~ pre_save.connect(pre_save_image_feature_detection, sender=Image) + post_delete.connect(post_delete_file_cleanup, sender=Image) + post_delete.connect(post_delete_file_cleanup, sender=Rendition) + post_delete.connect(post_delete_purge_rendition_cache, sender=Rendition) + + + +## ... source file continues with no further pre_save examples... + +``` + From 2046d9157a7886af70b8831995ff911d3d30c221 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 8 Jul 2020 12:36:34 -0400 Subject: [PATCH 175/302] new django code examples --- .../django/django-forms-baseform.markdown | 125 +++++ .../django-forms-checkboxinput.markdown | 115 ++++ ...ango-forms-checkboxselectmultiple.markdown | 61 +++ .../django/django-forms-dateinput.markdown | 120 +++++ .../django/django-forms-field.markdown | 66 +++ .../django/django-forms-fileinput.markdown | 55 ++ .../django-forms-filepathfield.markdown | 136 +++++ .../django/django-forms-form.markdown | 313 +++++++++++ .../django/django-forms-hiddeninput.markdown | 213 ++++++++ .../django/django-forms-imagefield.markdown | 137 +++++ .../django/django-forms-media.markdown | 109 ++++ .../django-forms-mediadefiningclass.markdown | 107 ++++ .../django-forms-modelchoicefield.markdown | 121 +++++ .../django/django-forms-modelform.markdown | 202 +++++++ ...go-forms-modelmultiplechoicefield.markdown | 121 +++++ .../django-forms-multiplechoicefield.markdown | 269 ++++++++++ .../django/django-forms-select.markdown | 195 +++++++ .../django-forms-selectmultiple.markdown | 123 +++++ .../django-forms-validationerror.markdown | 502 ++++++++++++++++++ theme/templates/code-examples/django.html | 21 +- 20 files changed, 3110 insertions(+), 1 deletion(-) create mode 100644 content/pages/examples/django/django-forms-baseform.markdown create mode 100644 content/pages/examples/django/django-forms-checkboxinput.markdown create mode 100644 content/pages/examples/django/django-forms-checkboxselectmultiple.markdown create mode 100644 content/pages/examples/django/django-forms-dateinput.markdown create mode 100644 content/pages/examples/django/django-forms-field.markdown create mode 100644 content/pages/examples/django/django-forms-fileinput.markdown create mode 100644 content/pages/examples/django/django-forms-filepathfield.markdown create mode 100644 content/pages/examples/django/django-forms-form.markdown create mode 100644 content/pages/examples/django/django-forms-hiddeninput.markdown create mode 100644 content/pages/examples/django/django-forms-imagefield.markdown create mode 100644 content/pages/examples/django/django-forms-media.markdown create mode 100644 content/pages/examples/django/django-forms-mediadefiningclass.markdown create mode 100644 content/pages/examples/django/django-forms-modelchoicefield.markdown create mode 100644 content/pages/examples/django/django-forms-modelform.markdown create mode 100644 content/pages/examples/django/django-forms-modelmultiplechoicefield.markdown create mode 100644 content/pages/examples/django/django-forms-multiplechoicefield.markdown create mode 100644 content/pages/examples/django/django-forms-select.markdown create mode 100644 content/pages/examples/django/django-forms-selectmultiple.markdown create mode 100644 content/pages/examples/django/django-forms-validationerror.markdown diff --git a/content/pages/examples/django/django-forms-baseform.markdown b/content/pages/examples/django/django-forms-baseform.markdown new file mode 100644 index 000000000..c7e06434c --- /dev/null +++ b/content/pages/examples/django/django-forms-baseform.markdown @@ -0,0 +1,125 @@ +title: django.forms BaseForm Example Code +category: page +slug: django-forms-baseform-examples +sortorder: 500011255 +toc: False +sidebartitle: django.forms BaseForm +meta: Python example code for the BaseForm class from the django.forms module of the Django project. + + +BaseForm is a class within the django.forms module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / templatetags / wiki_tags.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/templatetags/wiki_tags.py) + +```python +# wiki_tags.py +import re + +from django import template +from django.apps import apps +from django.conf import settings as django_settings +from django.contrib.contenttypes.models import ContentType +from django.db.models import Model +~~from django.forms import BaseForm +from django.template.defaultfilters import striptags +from django.utils.http import urlquote +from django.utils.safestring import mark_safe +from wiki import models +from wiki.conf import settings +from wiki.core.plugins import registry as plugin_registry + +register = template.Library() + + +_cache = {} + + +@register.simple_tag(takes_context=True) +def article_for_object(context, obj): + if not isinstance(obj, Model): + raise TypeError( + "A Wiki article can only be associated to a Django Model " + "instance, not %s" % type(obj) + ) + + content_type = ContentType.objects.get_for_model(obj) + + if True or obj not in _cache: + + +## ... source file abbreviated to get to BaseForm examples ... + + +@register.inclusion_tag("wiki/includes/render.html", takes_context=True) +def wiki_render(context, article, preview_content=None): + + if preview_content: + content = article.render(preview_content=preview_content) + elif article.current_revision: + content = article.get_cached_content(user=context.get("user")) + else: + content = None + + context.update( + { + "article": article, + "content": content, + "preview": preview_content is not None, + "plugins": plugin_registry.get_plugins(), + "STATIC_URL": django_settings.STATIC_URL, + "CACHE_TIMEOUT": settings.CACHE_TIMEOUT, + } + ) + return context + + +@register.inclusion_tag("wiki/includes/form.html", takes_context=True) +def wiki_form(context, form_obj): +~~ if not isinstance(form_obj, BaseForm): + raise TypeError( + "Error including form, it's not a form, it's a %s" % type(form_obj) + ) + context.update({"form": form_obj}) + return context + + +@register.inclusion_tag("wiki/includes/messages.html", takes_context=True) +def wiki_messages(context): + + messages = context.get("messages", []) + for message in messages: + message.css_class = settings.MESSAGE_TAG_CSS_CLASS[message.level] + context.update({"messages": messages}) + return context + + +@register.filter +def get_content_snippet(content, keyword, max_words=30): + + def clean_text(content): + + content = striptags(content) + words = content.split() + + +## ... source file continues with no further BaseForm examples... + +``` + diff --git a/content/pages/examples/django/django-forms-checkboxinput.markdown b/content/pages/examples/django/django-forms-checkboxinput.markdown new file mode 100644 index 000000000..9b80d9c35 --- /dev/null +++ b/content/pages/examples/django/django-forms-checkboxinput.markdown @@ -0,0 +1,115 @@ +title: django.forms CheckboxInput Example Code +category: page +slug: django-forms-checkboxinput-examples +sortorder: 500011258 +toc: False +sidebartitle: django.forms CheckboxInput +meta: Python example code for the CheckboxInput class from the django.forms module of the Django project. + + +CheckboxInput is a class within the django.forms module of the Django project. + + +## Example 1 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / templatetags / jet_tags.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/templatetags/jet_tags.py) + +```python +# jet_tags.py +from __future__ import unicode_literals +import json +import os +from django import template +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +~~from django.forms import CheckboxInput, ModelChoiceField, Select, ModelMultipleChoiceField, SelectMultiple +from django.contrib.admin.widgets import RelatedFieldWidgetWrapper +from django.utils.formats import get_format +from django.utils.safestring import mark_safe +from django.utils.encoding import smart_text +from jet import settings, VERSION +from jet.models import Bookmark +from jet.utils import get_model_instance_label, get_model_queryset, get_possible_language_codes, \ + get_admin_site, get_menu_items + +try: + from urllib.parse import parse_qsl +except ImportError: + from urlparse import parse_qsl + + +register = template.Library() +assignment_tag = register.assignment_tag if hasattr(register, 'assignment_tag') else register.simple_tag + + +@assignment_tag +def jet_get_date_format(): + return get_format('DATE_INPUT_FORMATS')[0] + + +@assignment_tag +def jet_get_time_format(): + return get_format('TIME_INPUT_FORMATS')[0] + + +@assignment_tag +def jet_get_datetime_format(): + return get_format('DATETIME_INPUT_FORMATS')[0] + + +@assignment_tag(takes_context=True) +def jet_get_menu(context): + return get_menu_items(context) + + +@assignment_tag +def jet_get_bookmarks(user): + if user is None: + return None + return Bookmark.objects.filter(user=user.pk) + + +@register.filter +def jet_is_checkbox(field): +~~ return field.field.widget.__class__.__name__ == CheckboxInput().__class__.__name__ + + +@register.filter +def jet_select2_lookups(field): + if hasattr(field, 'field') and \ + (isinstance(field.field, ModelChoiceField) or isinstance(field.field, ModelMultipleChoiceField)): + qs = field.field.queryset + model = qs.model + + if getattr(model, 'autocomplete_search_fields', None) and getattr(field.field, 'autocomplete', True): + choices = [] + app_label = model._meta.app_label + model_name = model._meta.object_name + + attrs = { + 'class': 'ajax', + 'data-app-label': app_label, + 'data-model': model_name, + 'data-ajax--url': reverse('jet:model_lookup') + } + + initial_value = field.value() + + if hasattr(field, 'field') and isinstance(field.field, ModelMultipleChoiceField): + + +## ... source file continues with no further CheckboxInput examples... + +``` + diff --git a/content/pages/examples/django/django-forms-checkboxselectmultiple.markdown b/content/pages/examples/django/django-forms-checkboxselectmultiple.markdown new file mode 100644 index 000000000..e424a6977 --- /dev/null +++ b/content/pages/examples/django/django-forms-checkboxselectmultiple.markdown @@ -0,0 +1,61 @@ +title: django.forms CheckboxSelectMultiple Example Code +category: page +slug: django-forms-checkboxselectmultiple-examples +sortorder: 500011259 +toc: False +sidebartitle: django.forms CheckboxSelectMultiple +meta: Python example code for the CheckboxSelectMultiple class from the django.forms module of the Django project. + + +CheckboxSelectMultiple is a class within the django.forms module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / gears / widgets.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/gears/widgets.py) + +```python +# widgets.py +~~from django.forms import FileInput, CheckboxSelectMultiple, Select + + +class CustomFileInput(FileInput): + template_name = 'gears/widgets/file_input.html' + accept = '' + show_file_name = True + + +~~class CustomCheckboxSelectMultiple(CheckboxSelectMultiple): + template_name = 'gears/widgets/checkbox_multiple_select.html' + hide_label = False + hide_apply_btn = False + + class Media: + js = ('gears/js/checkbox_multiple_select.js',) + + def __init__(self, *args, **kwargs): + self.hide_label = kwargs.pop('hide_label', False) + self.hide_apply_btn = kwargs.pop('hide_apply_btn', False) + super().__init__(*args, **kwargs) + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + context['widget'].update({ + 'hide_label': self.hide_label, + 'hide_apply_btn': self.hide_apply_btn, + }) + return context + + +class DropdownSelectSubmit(Select): + template_name = 'gears/widgets/dropdown_select_submit.html' + empty_label = 'Not selected' + + +## ... source file continues with no further CheckboxSelectMultiple examples... + +``` + diff --git a/content/pages/examples/django/django-forms-dateinput.markdown b/content/pages/examples/django/django-forms-dateinput.markdown new file mode 100644 index 000000000..bedd29ab9 --- /dev/null +++ b/content/pages/examples/django/django-forms-dateinput.markdown @@ -0,0 +1,120 @@ +title: django.forms DateInput Example Code +category: page +slug: django-forms-dateinput-examples +sortorder: 500011262 +toc: False +sidebartitle: django.forms DateInput +meta: Python example code for the DateInput class from the django.forms module of the Django project. + + +DateInput is a class within the django.forms module of the Django project. + + +## Example 1 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / forms.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./forms.py) + +```python +# forms.py +from __future__ import unicode_literals + +import logging +import re +import collections +import datetime + +~~import django.forms +~~import django.forms.utils +~~import django.forms.widgets +import django.core.validators +import django.core.exceptions +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from django.utils.safestring import mark_safe + +import form_utils.forms +import requests +import dateutil.parser +import validate_email + +logger = logging.getLogger(__name__) + + +REGISTRATION_CONFIGURATION_NAME = 'registration_configuration' + +RE_NON_DECIMAL = re.compile(r'[^\d]+') +RE_NON_ALPHA = re.compile('[\W]+') +RE_POSTAL_CODE = re.compile(r'^[0-9]{5}$') +validate_postal_code = django.core.validators.RegexValidator( + RE_POSTAL_CODE, _("Enter a valid postal code consisting 5 numbers."), 'invalid') + + +CHOICES_GENDER = ( + + +## ... source file abbreviated to get to DateInput examples ... + + + 'clean_ssn': register_form_clean_ssn, + 'clean_license_id': register_form_clean_license_id, + 'api_errors': {}, + 'skip_api_error_validation': False, + 'validate_organ_tissue_selection': conf.get('validate_organ_tissue_selection', None), + }) + return cls + + +class RevokeForm(django.forms.Form): + email = django.forms.EmailField(label=_('Email')) + first_name = django.forms.CharField( + label=_('First Name'), max_length=150, min_length=1) + middle_name = django.forms.CharField( + label=_('Middle Name'), max_length=150, min_length=0, required=False) + last_name = django.forms.CharField( + label=_('Last Name'), max_length=150, min_length=1) + postal_code = django.forms.CharField( + label=_('Postal Code'), + max_length=5, min_length=5, validators=[validate_postal_code]) + gender = django.forms.ChoiceField( + label=_('Gender'), choices=CHOICES_GENDER, + widget=django.forms.RadioSelect) + birthdate = django.forms.DateField( + label=_('Birthdate'), +~~ widget=django.forms.DateInput( + attrs={'placeholder': '__/__/____', 'class': 'date',})) + agree_to_tos = django.forms.BooleanField(label='', widget=django.forms.widgets.CheckboxInput(attrs={'required': 'required', })) + + def clean_email(self): + email = self.cleaned_data['email'] + if settings.DISABLE_EMAIL_VALIDATION: + logger.warning( + 'Email validation disabled: DISABLE_EMAIL_VALIDATION is set') + return email + if not hasattr(settings, 'MAILGUN_PUBLIC_API_KEY'): + logger.warning( + 'Cannot validate email: MAILGUN_PUBLIC_API_KEY not set') + return email + r = requests.get( + 'https://api.mailgun.net/v2/address/validate', + data={'address': email, }, + auth=('api', settings.MAILGUN_PUBLIC_API_KEY)) + if r.status_code == 200: + if r.json()['is_valid']: + return email + logger.warning('Cannot validate email: {}'.format(r.text)) + raise django.forms.ValidationError(_('Enter a valid email.')) + + + + +## ... source file continues with no further DateInput examples... + +``` + diff --git a/content/pages/examples/django/django-forms-field.markdown b/content/pages/examples/django/django-forms-field.markdown new file mode 100644 index 000000000..6d38d49e3 --- /dev/null +++ b/content/pages/examples/django/django-forms-field.markdown @@ -0,0 +1,66 @@ +title: django.forms Field Example Code +category: page +slug: django-forms-field-examples +sortorder: 500011264 +toc: False +sidebartitle: django.forms Field +meta: Python example code for the Field class from the django.forms module of the Django project. + + +Field is a class within the django.forms module of the Django project. + + +## Example 1 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / forms.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./forms.py) + +```python +# forms.py +from django.db import DatabaseError +~~from django.forms import ModelForm, Field, ValidationError, BooleanField, CharField +from django.forms.widgets import CheckboxInput, Select + +from explorer.app_settings import EXPLORER_DEFAULT_CONNECTION, EXPLORER_CONNECTIONS +from explorer.models import Query, MSG_FAILED_BLACKLIST + + +~~class SqlField(Field): + + def validate(self, value): + + query = Query(sql=value) + + passes_blacklist, failing_words = query.passes_blacklist() + + error = MSG_FAILED_BLACKLIST % ', '.join(failing_words) if not passes_blacklist else None + + if error: + raise ValidationError( + error, + code="InvalidSql" + ) + + +class QueryForm(ModelForm): + + sql = SqlField() + snapshot = BooleanField(widget=CheckboxInput, required=False) + connection = CharField(widget=Select, required=False) + + def __init__(self, *args, **kwargs): + super(QueryForm, self).__init__(*args, **kwargs) + + +## ... source file continues with no further Field examples... + +``` + diff --git a/content/pages/examples/django/django-forms-fileinput.markdown b/content/pages/examples/django/django-forms-fileinput.markdown new file mode 100644 index 000000000..be0a370d1 --- /dev/null +++ b/content/pages/examples/django/django-forms-fileinput.markdown @@ -0,0 +1,55 @@ +title: django.forms FileInput Example Code +category: page +slug: django-forms-fileinput-examples +sortorder: 500011265 +toc: False +sidebartitle: django.forms FileInput +meta: Python example code for the FileInput class from the django.forms module of the Django project. + + +FileInput is a class within the django.forms module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / gears / widgets.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/gears/widgets.py) + +```python +# widgets.py +~~from django.forms import FileInput, CheckboxSelectMultiple, Select + + +~~class CustomFileInput(FileInput): + template_name = 'gears/widgets/file_input.html' + accept = '' + show_file_name = True + + +class CustomCheckboxSelectMultiple(CheckboxSelectMultiple): + template_name = 'gears/widgets/checkbox_multiple_select.html' + hide_label = False + hide_apply_btn = False + + class Media: + js = ('gears/js/checkbox_multiple_select.js',) + + def __init__(self, *args, **kwargs): + self.hide_label = kwargs.pop('hide_label', False) + self.hide_apply_btn = kwargs.pop('hide_apply_btn', False) + super().__init__(*args, **kwargs) + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + context['widget'].update({ + 'hide_label': self.hide_label, + 'hide_apply_btn': self.hide_apply_btn, + }) + + +## ... source file continues with no further FileInput examples... + +``` + diff --git a/content/pages/examples/django/django-forms-filepathfield.markdown b/content/pages/examples/django/django-forms-filepathfield.markdown new file mode 100644 index 000000000..b56800554 --- /dev/null +++ b/content/pages/examples/django/django-forms-filepathfield.markdown @@ -0,0 +1,136 @@ +title: django.forms FilePathField Example Code +category: page +slug: django-forms-filepathfield-examples +sortorder: 500011266 +toc: False +sidebartitle: django.forms FilePathField +meta: Python example code for the FilePathField class from the django.forms module of the Django project. + + +FilePathField is a class within the django.forms module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import copy +import datetime +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +~~from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings +from rest_framework.utils import html, humanize_datetime, json, representation +from rest_framework.utils.formatting import lazy_format +from rest_framework.validators import ProhibitSurrogateCharactersValidator + + +class empty: + + +## ... source file abbreviated to get to FilePathField examples ... + + + def get_value(self, dictionary): + if self.field_name not in dictionary: + if getattr(self.root, 'partial', False): + return empty + if html.is_html_input(dictionary): + return dictionary.getlist(self.field_name) + return dictionary.get(self.field_name, empty) + + def to_internal_value(self, data): + if isinstance(data, str) or not hasattr(data, '__iter__'): + self.fail('not_a_list', input_type=type(data).__name__) + if not self.allow_empty and len(data) == 0: + self.fail('empty') + + return { + super(MultipleChoiceField, self).to_internal_value(item) + for item in data + } + + def to_representation(self, value): + return { + self.choice_strings_to_values.get(str(item), item) for item in value + } + + +~~class FilePathField(ChoiceField): + default_error_messages = { + 'invalid_choice': _('"{input}" is not a valid path choice.') + } + + def __init__(self, path, match=None, recursive=False, allow_files=True, + allow_folders=False, required=None, **kwargs): + field = DjangoFilePathField( + path, match=match, recursive=recursive, allow_files=allow_files, + allow_folders=allow_folders, required=required + ) + kwargs['choices'] = field.choices + super().__init__(**kwargs) + + + +class FileField(Field): + default_error_messages = { + 'required': _('No file was submitted.'), + 'invalid': _('The submitted data was not a file. Check the encoding type on the form.'), + 'no_name': _('No filename could be determined.'), + 'empty': _('The submitted file is empty.'), + 'max_length': _('Ensure this filename has at most {max_length} characters (it has {length}).'), + } + + + +## ... source file continues with no further FilePathField examples... + +``` + diff --git a/content/pages/examples/django/django-forms-form.markdown b/content/pages/examples/django/django-forms-form.markdown new file mode 100644 index 000000000..b7b244c07 --- /dev/null +++ b/content/pages/examples/django/django-forms-form.markdown @@ -0,0 +1,313 @@ +title: django.forms Form Example Code +category: page +slug: django-forms-form-examples +sortorder: 500011267 +toc: False +sidebartitle: django.forms Form +meta: Python example code for the Form class from the django.forms module of the Django project. + + +Form is a class within the django.forms module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair/forms.py) + +```python +# forms.py +from functools import reduce + +from django import forms +from django.contrib.auth import get_user_model +from django.db import models +from django.db.models import Q, F, Count, Max, Subquery, OuterRef, Value +from django.db.models.functions import Concat +~~from django.forms import MultipleChoiceField, ChoiceField, Form +from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ + +from django_countries import countries + +from conferences.models import Conference, ArtifactDescriptor +from gears.widgets import CustomCheckboxSelectMultiple, CustomFileInput +from review.models import Reviewer, Review, ReviewStats +from review.utilities import get_average_score +from submissions.models import Submission, Attachment +from users.models import Profile + +User = get_user_model() + + +def clean_data_to_int(iterable, empty=None): + return [int(x) if x != '' else None for x in iterable] + + +def q_or(disjuncts, default=True): + if disjuncts: + return reduce(lambda acc, d: acc | d, disjuncts) + return Q(pk__isnull=(not default)) # otherwise, check whether PK is null + + + +## ... source file abbreviated to get to Form examples ... + + + available_reviewers = Reviewer.objects.exclude( + Q(pk__in=assigned_reviewers) | Q(user__in=authors_users) + ) + profiles = { + rev: rev.user.profile for rev in available_reviewers + } + reviewers = list(available_reviewers) + reviewers.sort(key=lambda r: r.reviews.count()) + self.fields['reviewer'].choices = ( + (rev.pk, + f'{profiles[rev].get_full_name()} ({rev.reviews.count()}) - ' + f'{profiles[rev].affiliation}, ' + f'{profiles[rev].get_country_display()}') + for rev in reviewers + ) + + def save(self): + reviewer = Reviewer.objects.get(pk=self.cleaned_data['reviewer']) + review = Review.objects.create( + reviewer=reviewer, stage=self.review_stage) + return review + + + + +~~class ExportSubmissionsForm(Form): + ORDER_COLUMN = '#' + ID_COLUMN = 'ID' + AUTHORS_COLUMN = 'AUTHORS' + TITLE_COLUMN = 'TITLE' + COUNTRY_COLUMN = 'COUNTRY' + STYPE_COLUMN = 'TYPE' + REVIEW_PAPER_COLUMN = 'REVIEW_MANUSCRIPT' + REVIEW_SCORE_COLUMN = 'REVIEW_SCORE' + STATUS_COLUMN = 'STATUS' + TOPICS_COLUMN = 'TOPICS' + + COLUMNS = ( + (ORDER_COLUMN, ORDER_COLUMN), + (ID_COLUMN, ID_COLUMN), + (TITLE_COLUMN, TITLE_COLUMN), + (AUTHORS_COLUMN, AUTHORS_COLUMN), + (COUNTRY_COLUMN, COUNTRY_COLUMN), + (STYPE_COLUMN, STYPE_COLUMN), + (REVIEW_PAPER_COLUMN, REVIEW_PAPER_COLUMN), + (REVIEW_SCORE_COLUMN, REVIEW_SCORE_COLUMN), + (STATUS_COLUMN, STATUS_COLUMN), + (TOPICS_COLUMN, TOPICS_COLUMN), + ) + + + +## ... source file continues with no further Form examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / wizards / views.py**](https://github.com/divio/django-cms/blob/develop/cms/wizards/views.py) + +```python +# views.py + +import os + +from django.conf import settings +from django.core.exceptions import PermissionDenied +from django.core.files.storage import FileSystemStorage +~~from django.forms import Form +from django.template.response import SimpleTemplateResponse +from django.urls import NoReverseMatch + +from formtools.wizard.views import SessionWizardView + +from cms.models import Page +from cms.utils import get_current_site +from cms.utils.i18n import get_site_language_from_request + +from .wizard_pool import wizard_pool +from .forms import ( + WizardStep1Form, + WizardStep2BaseForm, + step2_form_factory, +) + + +class WizardCreateView(SessionWizardView): + template_name = 'cms/wizards/start.html' + file_storage = FileSystemStorage( + location=os.path.join(settings.MEDIA_ROOT, 'wizard_tmp_files')) + + form_list = [ + ('0', WizardStep1Form), + + +## ... source file continues with no further Form examples... + +``` + + +## Example 3 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / views.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/./views.py) + +```python +# views.py +import math + +from django.contrib import messages +from django.urls import reverse +~~from django.forms import Form +from django.http import HttpResponseForbidden +from django.http import Http404 +from django.utils.functional import cached_property +from django.views.generic.edit import DeletionMixin +from django.views.generic import ListView +from django.views.generic import TemplateView +from django.views.generic.edit import FormView +from mongoengine.fields import EmbeddedDocumentField, ListField + +from mongonaut.forms import MongoModelForm +from mongonaut.mixins import MongonautFormViewMixin +from mongonaut.mixins import MongonautViewMixin +from mongonaut.utils import is_valid_object_id + + +class IndexView(MongonautViewMixin, ListView): + + template_name = "mongonaut/index.html" + queryset = [] + permission = 'has_view_permission' + + def get_queryset(self): + return self.get_mongoadmins() + + + +## ... source file abbreviated to get to Form examples ... + + + self.ident = self.kwargs.get('id') + self.document = self.document_type.objects.get(pk=self.ident) + + context['document'] = self.document + context['app_label'] = self.app_label + context['document_name'] = self.document_name + context['form_action'] = reverse('document_detail_edit_form', args=[self.kwargs.get('app_label'), + self.kwargs.get('document_name'), + self.kwargs.get('id')]) + + return context + + def get_form(self): #get_form(self, Form) leads to "get_form() missing 1 required positional argument: 'Form'" error." + self.set_mongoadmin() + context = self.set_permissions_in_context({}) + + if not context['has_edit_permission']: + return HttpResponseForbidden("You do not have permissions to edit this content.") + + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + try: + self.document = self.document_type.objects.get(pk=self.ident) + except self.document_type.DoesNotExist: + raise Http404 +~~ self.form = Form() + + if self.request.method == 'POST': + self.form = self.process_post_form('Your changes have been saved.') + else: + self.form = MongoModelForm(model=self.document_type, instance=self.document).get_form() + return self.form + + +class DocumentAddFormView(MongonautViewMixin, FormView, MongonautFormViewMixin): + + template_name = "mongonaut/document_add_form.html" + form_class = Form + success_url = '/' + permission = 'has_add_permission' + + def get_success_url(self): + self.set_mongonaut_base() + return reverse('document_detail', kwargs={'app_label': self.app_label, 'document_name': self.document_name, 'id': str(self.new_document.id)}) + + def get_context_data(self, **kwargs): + context = super(DocumentAddFormView, self).get_context_data(**kwargs) + self.set_mongoadmin() + context = self.set_permissions_in_context(context) + self.document_type = getattr(self.models, self.document_name) + + context['app_label'] = self.app_label + context['document_name'] = self.document_name + context['form_action'] = reverse('document_detail_add_form', args=[self.kwargs.get('app_label'), + self.kwargs.get('document_name')]) + + return context + + def get_form(self): + self.set_mongonaut_base() + self.document_type = getattr(self.models, self.document_name) +~~ self.form = Form() + + if self.request.method == 'POST': + self.form = self.process_post_form('Your new document has been added and saved.') + else: + self.form = MongoModelForm(model=self.document_type).get_form() + return self.form + + +class DocumentDeleteView(DeletionMixin, MongonautViewMixin, TemplateView): + + success_url = "/" + template_name = "mongonaut/document_delete.html" + + def get_success_url(self): + self.set_mongonaut_base() + messages.add_message(self.request, messages.INFO, 'Your document has been deleted.') + return reverse('document_list', kwargs={'app_label': self.app_label, 'document_name': self.document_name}) + + def get_object(self): + self.set_mongoadmin() + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + self.document = self.document_type.objects.get(pk=self.ident) + return self.document + + +## ... source file continues with no further Form examples... + +``` + diff --git a/content/pages/examples/django/django-forms-hiddeninput.markdown b/content/pages/examples/django/django-forms-hiddeninput.markdown new file mode 100644 index 000000000..a1a870cd7 --- /dev/null +++ b/content/pages/examples/django/django-forms-hiddeninput.markdown @@ -0,0 +1,213 @@ +title: django.forms HiddenInput Example Code +category: page +slug: django-forms-hiddeninput-examples +sortorder: 500011268 +toc: False +sidebartitle: django.forms HiddenInput +meta: Python example code for the HiddenInput class from the django.forms module of the Django project. + + +HiddenInput is a class within the django.forms module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / review / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/review/forms.py) + +```python +# forms.py +from django import forms +~~from django.forms import Form, HiddenInput, CharField, ChoiceField, ModelForm + +from conferences.models import ProceedingType, ProceedingVolume +from review.models import Review, check_review_details, ReviewDecision + + +class EditReviewForm(forms.ModelForm): + class Meta: + model = Review + fields = [ + 'technical_merit', 'relevance', 'originality', 'clarity', + 'details', 'submitted' + ] + + submitted = forms.BooleanField(required=False) + technical_merit = forms.ChoiceField(choices=Review.SCORE_CHOICES, required=False) + relevance = forms.ChoiceField(choices=Review.SCORE_CHOICES, required=False) + originality = forms.ChoiceField(choices=Review.SCORE_CHOICES, required=False) + details = forms.CharField(widget=forms.Textarea(attrs={'rows': '5'}), required=False) + + def clean(self): + cleaned_data = super().clean() + if cleaned_data['submitted']: + is_incomplete = False + for score_field in self.instance.score_fields().keys(): + if not cleaned_data[score_field]: + self.add_error(score_field, 'Must select a score') + is_incomplete = True + stype = self.instance.paper.stype + if not check_review_details(cleaned_data['details'], stype): + self.add_error( + 'details', + f'Review details must have at least ' + f'{stype.min_num_words_in_review} words' + ) + is_incomplete = True + if is_incomplete: + self.cleaned_data['submitted'] = False + raise forms.ValidationError('Review is incomplete') + return cleaned_data + + +class UpdateReviewDecisionForm(ModelForm): + class Meta: + model = ReviewDecision + fields = ['decision_type'] + + +class UpdateVolumeForm(Form): +~~ volume = CharField(widget=HiddenInput(), required=False) + + def __init__(self, *args, instance=None, **kwargs): + if not instance: + raise ValueError('Decision instance is required') + self.instance = instance + kwargs.update({ + 'initial': { + 'volume': str(instance.volume.pk) if instance.volume else '', + } + }) + super().__init__(*args, **kwargs) + self.volume = None + + def clean_volume(self): + try: + pk = int(self.cleaned_data['volume']) + volumes = ProceedingVolume.objects.filter(pk=pk) + self.volume = volumes.first() if volumes.count() else None + except ValueError: + self.volume = None + return self.cleaned_data['volume'] + + def save(self, commit=True): + self.instance.volume = self.volume + + +## ... source file continues with no further HiddenInput examples... + +``` + + +## Example 2 from django-flexible-subscriptions +[django-flexible-subscriptions](https://github.com/studybuffalo/django-flexible-subscriptions) +([project documentation](https://django-flexible-subscriptions.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-flexible-subscriptions/)) +provides boilerplate code for adding subscription and recurrent billing +to [Django](/django.html) web applications. Various payment providers +can be added on the back end to run the transactions. + +The django-flexible-subscriptions project is open sourced under the +[GNU General Public License v3.0](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/LICENSE). + +[**django-flexible-subscriptions / subscriptions / views.py**](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/subscriptions/./views.py) + +```python +# views.py +from copy import copy + +from django.contrib import messages +from django.contrib.auth import get_user_model +from django.contrib.auth.mixins import ( + LoginRequiredMixin, PermissionRequiredMixin +) +from django.contrib.messages.views import SuccessMessageMixin +~~from django.forms import HiddenInput +from django.forms.models import inlineformset_factory +from django.http import HttpResponseRedirect +from django.http.response import HttpResponseNotAllowed, HttpResponseNotFound +from django.shortcuts import get_object_or_404 +from django.template.response import TemplateResponse +from django.urls import reverse_lazy +from django.utils import timezone + +from subscriptions import models, forms, abstract + + +class DashboardView(PermissionRequiredMixin, abstract.TemplateView): + permission_required = 'subscriptions.subscriptions' + raise_exception = True + template_name = 'subscriptions/dashboard.html' + + +class TagListView(PermissionRequiredMixin, abstract.ListView): + model = models.PlanTag + permission_required = 'subscriptions.subscriptions' + raise_exception = True + context_object_name = 'tags' + template_name = 'subscriptions/tag_list.html' + + + +## ... source file abbreviated to get to HiddenInput examples ... + + + payment_transaction = self.process_payment( + payment_form=payment_form, + plan_cost_form=plan_cost_form, + ) + + if payment_transaction: + subscription = self.setup_subscription( + request.user, plan_cost_form.cleaned_data['plan_cost'] + ) + + transaction = self.record_transaction( + subscription, + self.retrieve_transaction_date(payment_transaction) + ) + + return HttpResponseRedirect( + self.get_success_url(transaction_id=transaction.id) + ) + + messages.error(request, 'Error processing payment') + + return self.render_confirmation(request, **kwargs) + + def hide_form(self, form): + for _, field in form.fields.items(): +~~ field.widget = HiddenInput() + + return form + + def process_payment(self, *args, **kwargs): # pylint: disable=unused-argument + return True + + def setup_subscription(self, request_user, plan_cost): + current_date = timezone.now() + + subscription = models.UserSubscription.objects.create( + user=request_user, + subscription=plan_cost, + date_billing_start=current_date, + date_billing_end=None, + date_billing_last=current_date, + date_billing_next=plan_cost.next_billing_datetime(current_date), + active=True, + cancelled=False, + ) + + try: + group = self.subscription_plan.group + group.user_set.add(request_user) + except AttributeError: + + +## ... source file continues with no further HiddenInput examples... + +``` + diff --git a/content/pages/examples/django/django-forms-imagefield.markdown b/content/pages/examples/django/django-forms-imagefield.markdown new file mode 100644 index 000000000..fe8f3b7aa --- /dev/null +++ b/content/pages/examples/django/django-forms-imagefield.markdown @@ -0,0 +1,137 @@ +title: django.forms ImageField Example Code +category: page +slug: django-forms-imagefield-examples +sortorder: 500011269 +toc: False +sidebartitle: django.forms ImageField +meta: Python example code for the ImageField class from the django.forms module of the Django project. + + +ImageField is a class within the django.forms module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import copy +import datetime +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +~~from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings +from rest_framework.utils import html, humanize_datetime, json, representation +from rest_framework.utils.formatting import lazy_format +from rest_framework.validators import ProhibitSurrogateCharactersValidator + + +class empty: + pass + + +## ... source file abbreviated to get to ImageField examples ... + + + if not self.allow_empty_file and not file_size: + self.fail('empty') + if self.max_length and len(file_name) > self.max_length: + self.fail('max_length', max_length=self.max_length, length=len(file_name)) + + return data + + def to_representation(self, value): + if not value: + return None + + use_url = getattr(self, 'use_url', api_settings.UPLOADED_FILES_USE_URL) + if use_url: + try: + url = value.url + except AttributeError: + return None + request = self.context.get('request', None) + if request is not None: + return request.build_absolute_uri(url) + return url + + return value.name + + +~~class ImageField(FileField): + default_error_messages = { + 'invalid_image': _( + 'Upload a valid image. The file you uploaded was either not an image or a corrupted image.' + ), + } + + def __init__(self, *args, **kwargs): + self._DjangoImageField = kwargs.pop('_DjangoImageField', DjangoImageField) + super().__init__(*args, **kwargs) + + def to_internal_value(self, data): + file_object = super().to_internal_value(data) + django_field = self._DjangoImageField() + django_field.error_messages = self.error_messages + return django_field.clean(file_object) + + + +class _UnvalidatedField(Field): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.allow_blank = True + self.allow_null = True + + + +## ... source file continues with no further ImageField examples... + +``` + diff --git a/content/pages/examples/django/django-forms-media.markdown b/content/pages/examples/django/django-forms-media.markdown new file mode 100644 index 000000000..22f4fab39 --- /dev/null +++ b/content/pages/examples/django/django-forms-media.markdown @@ -0,0 +1,109 @@ +title: django.forms Media Example Code +category: page +slug: django-forms-media-examples +sortorder: 500011270 +toc: False +sidebartitle: django.forms Media +meta: Python example code for the Media class from the django.forms module of the Django project. + + +Media is a class within the django.forms module of the Django project. + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / menu.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/menu.py) + +```python +# menu.py +~~from django.forms import Media, MediaDefiningClass +from django.forms.utils import flatatt +from django.template.loader import render_to_string +from django.utils.safestring import mark_safe +from django.utils.text import slugify + +from wagtail.core import hooks + + +class MenuItem(metaclass=MediaDefiningClass): + template = 'wagtailadmin/shared/menu_item.html' + + def __init__(self, label, url, name=None, classnames='', icon_name='', attrs=None, order=1000): + self.label = label + self.url = url + self.classnames = classnames + self.icon_name = icon_name + self.name = (name or slugify(str(label))) + self.order = order + + if attrs: + self.attr_string = flatatt(attrs) + else: + self.attr_string = "" + + + +## ... source file abbreviated to get to Media examples ... + + + def render_html(self, request): + context = self.get_context(request) + return render_to_string(self.template, context, request=request) + + +class Menu: + def __init__(self, register_hook_name, construct_hook_name=None): + self.register_hook_name = register_hook_name + self.construct_hook_name = construct_hook_name + self._registered_menu_items = None + + @property + def registered_menu_items(self): + if self._registered_menu_items is None: + self._registered_menu_items = [fn() for fn in hooks.get_hooks(self.register_hook_name)] + return self._registered_menu_items + + def menu_items_for_request(self, request): + return [item for item in self.registered_menu_items if item.is_shown(request)] + + def active_menu_items(self, request): + return [item for item in self.menu_items_for_request(request) if item.is_active(request)] + + @property + def media(self): +~~ media = Media() + for item in self.registered_menu_items: + media += item.media + return media + + def render_html(self, request): + menu_items = self.menu_items_for_request(request) + + if self.construct_hook_name: + for fn in hooks.get_hooks(self.construct_hook_name): + fn(request, menu_items) + + rendered_menu_items = [] + for item in sorted(menu_items, key=lambda i: i.order): + rendered_menu_items.append(item.render_html(request)) + return mark_safe(''.join(rendered_menu_items)) + + +class SubmenuMenuItem(MenuItem): + template = 'wagtailadmin/shared/menu_submenu_item.html' + + def __init__(self, label, menu, **kwargs): + self.menu = menu + super().__init__(label, '#', **kwargs) + + + +## ... source file continues with no further Media examples... + +``` + diff --git a/content/pages/examples/django/django-forms-mediadefiningclass.markdown b/content/pages/examples/django/django-forms-mediadefiningclass.markdown new file mode 100644 index 000000000..f27021174 --- /dev/null +++ b/content/pages/examples/django/django-forms-mediadefiningclass.markdown @@ -0,0 +1,107 @@ +title: django.forms MediaDefiningClass Example Code +category: page +slug: django-forms-mediadefiningclass-examples +sortorder: 500011271 +toc: False +sidebartitle: django.forms MediaDefiningClass +meta: Python example code for the MediaDefiningClass class from the django.forms module of the Django project. + + +MediaDefiningClass is a class within the django.forms module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / toolbar_base.py**](https://github.com/divio/django-cms/blob/develop/cms/./toolbar_base.py) + +```python +# toolbar_base.py +~~from django.forms import MediaDefiningClass + +from six import with_metaclass + +from cms.exceptions import LanguageError +from cms.utils import get_current_site, get_language_from_request +from cms.utils.i18n import get_language_object + + +~~class CMSToolbar(with_metaclass(MediaDefiningClass)): + supported_apps = None + + def __init__(self, request, toolbar, is_current_app, app_path): + self.request = request + self.toolbar = toolbar + self.is_current_app = is_current_app + self.app_path = app_path + self.current_site = get_current_site() + try: + self.current_lang = get_language_object(get_language_from_request(self.request), self.current_site.pk)['code'] + except LanguageError: + self.current_lang = None + + def populate(self): + pass + + def post_template_populate(self): + pass + + @classmethod + def check_current_app(cls, key, app_name): + if cls.supported_apps is None: + local_apps = ".".join(key.split(".")[:-2]), + else: + + +## ... source file continues with no further MediaDefiningClass examples... + +``` + + +## Example 2 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / menu.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/menu.py) + +```python +# menu.py +~~from django.forms import Media, MediaDefiningClass +from django.forms.utils import flatatt +from django.template.loader import render_to_string +from django.utils.safestring import mark_safe +from django.utils.text import slugify + +from wagtail.core import hooks + + +class MenuItem(metaclass=MediaDefiningClass): + template = 'wagtailadmin/shared/menu_item.html' + + def __init__(self, label, url, name=None, classnames='', icon_name='', attrs=None, order=1000): + self.label = label + self.url = url + self.classnames = classnames + self.icon_name = icon_name + self.name = (name or slugify(str(label))) + self.order = order + + if attrs: + self.attr_string = flatatt(attrs) + else: + self.attr_string = "" + + + +## ... source file continues with no further MediaDefiningClass examples... + +``` + diff --git a/content/pages/examples/django/django-forms-modelchoicefield.markdown b/content/pages/examples/django/django-forms-modelchoicefield.markdown new file mode 100644 index 000000000..a9900a6a7 --- /dev/null +++ b/content/pages/examples/django/django-forms-modelchoicefield.markdown @@ -0,0 +1,121 @@ +title: django.forms ModelChoiceField Example Code +category: page +slug: django-forms-modelchoicefield-examples +sortorder: 500011272 +toc: False +sidebartitle: django.forms ModelChoiceField +meta: Python example code for the ModelChoiceField class from the django.forms module of the Django project. + + +ModelChoiceField is a class within the django.forms module of the Django project. + + +## Example 1 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / templatetags / jet_tags.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/templatetags/jet_tags.py) + +```python +# jet_tags.py +from __future__ import unicode_literals +import json +import os +from django import template +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +~~from django.forms import CheckboxInput, ModelChoiceField, Select, ModelMultipleChoiceField, SelectMultiple +from django.contrib.admin.widgets import RelatedFieldWidgetWrapper +from django.utils.formats import get_format +from django.utils.safestring import mark_safe +from django.utils.encoding import smart_text +from jet import settings, VERSION +from jet.models import Bookmark +from jet.utils import get_model_instance_label, get_model_queryset, get_possible_language_codes, \ + get_admin_site, get_menu_items + +try: + from urllib.parse import parse_qsl +except ImportError: + from urlparse import parse_qsl + + +register = template.Library() +assignment_tag = register.assignment_tag if hasattr(register, 'assignment_tag') else register.simple_tag + + +@assignment_tag +def jet_get_date_format(): + return get_format('DATE_INPUT_FORMATS')[0] + + + + +## ... source file abbreviated to get to ModelChoiceField examples ... + + + app_label = model._meta.app_label + model_name = model._meta.object_name + + attrs = { + 'class': 'ajax', + 'data-app-label': app_label, + 'data-model': model_name, + 'data-ajax--url': reverse('jet:model_lookup') + } + + initial_value = field.value() + + if hasattr(field, 'field') and isinstance(field.field, ModelMultipleChoiceField): + if initial_value: + initial_objects = model.objects.filter(pk__in=initial_value) + choices.extend( + [(initial_object.pk, get_model_instance_label(initial_object)) + for initial_object in initial_objects] + ) + + if isinstance(field.field.widget, RelatedFieldWidgetWrapper): + field.field.widget.widget = SelectMultiple(attrs) + else: + field.field.widget = SelectMultiple(attrs) + field.field.choices = choices +~~ elif hasattr(field, 'field') and isinstance(field.field, ModelChoiceField): + if initial_value: + try: + initial_object = model.objects.get(pk=initial_value) + attrs['data-object-id'] = initial_value + choices.append((initial_object.pk, get_model_instance_label(initial_object))) + except model.DoesNotExist: + pass + + if isinstance(field.field.widget, RelatedFieldWidgetWrapper): + field.field.widget.widget = Select(attrs) + else: + field.field.widget = Select(attrs) + field.field.choices = choices + + return field + + +@assignment_tag(takes_context=True) +def jet_get_current_theme(context): + if 'request' in context and 'JET_THEME' in context['request'].COOKIES: + theme = context['request'].COOKIES['JET_THEME'] + if isinstance(settings.JET_THEMES, list) and len(settings.JET_THEMES) > 0: + for conf_theme in settings.JET_THEMES: + if isinstance(conf_theme, dict) and conf_theme.get('theme') == theme: + + +## ... source file continues with no further ModelChoiceField examples... + +``` + diff --git a/content/pages/examples/django/django-forms-modelform.markdown b/content/pages/examples/django/django-forms-modelform.markdown new file mode 100644 index 000000000..e48ce14a2 --- /dev/null +++ b/content/pages/examples/django/django-forms-modelform.markdown @@ -0,0 +1,202 @@ +title: django.forms ModelForm Example Code +category: page +slug: django-forms-modelform-examples +sortorder: 500011273 +toc: False +sidebartitle: django.forms ModelForm +meta: Python example code for the ModelForm class from the django.forms module of the Django project. + + +ModelForm is a class within the django.forms module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / proceedings / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/proceedings/forms.py) + +```python +# forms.py +~~from django.forms import ModelForm + +from gears.widgets import DropdownSelectSubmit +from proceedings.models import CameraReady + + +EMPTY_VOLUME_LABEL = '(no volume)' + + +~~class UpdateVolumeForm(ModelForm): + + class Meta: + model = CameraReady + fields = ['volume'] + widgets = { + 'volume': DropdownSelectSubmit( + empty_label=EMPTY_VOLUME_LABEL, + label_class='font-weight-normal dccn-text-small', + empty_label_class='text-warning-18', + nonempty_label_class='text-success-18', + ) + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['volume'].queryset = self.instance.proc_type.volumes.all() + self.fields['volume'].empty_label = EMPTY_VOLUME_LABEL + + + +## ... source file continues with no further ModelForm examples... + +``` + + +## Example 2 from django-flexible-subscriptions +[django-flexible-subscriptions](https://github.com/studybuffalo/django-flexible-subscriptions) +([project documentation](https://django-flexible-subscriptions.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-flexible-subscriptions/)) +provides boilerplate code for adding subscription and recurrent billing +to [Django](/django.html) web applications. Various payment providers +can be added on the back end to run the transactions. + +The django-flexible-subscriptions project is open sourced under the +[GNU General Public License v3.0](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/LICENSE). + +[**django-flexible-subscriptions / subscriptions / forms.py**](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/subscriptions/./forms.py) + +```python +# forms.py +from django import forms +from django.core import validators +~~from django.forms import ModelForm +from django.utils import timezone + +from subscriptions.conf import SETTINGS +from subscriptions.models import SubscriptionPlan, PlanCost + + +def assemble_cc_years(): + cc_years = [] + now = timezone.now() + + for year in range(now.year, now.year + 60): + cc_years.append((year, year)) + + return cc_years + + +~~class SubscriptionPlanForm(ModelForm): + class Meta: + model = SubscriptionPlan + fields = [ + 'plan_name', 'plan_description', 'group', 'tags', 'grace_period', + ] + + +~~class PlanCostForm(ModelForm): + class Meta: + model = PlanCost + fields = ['recurrence_period', 'recurrence_unit', 'cost'] + + +class PaymentForm(forms.Form): + CC_MONTHS = ( + ('1', '01 - January'), + ('2', '02 - February'), + ('3', '03 - March'), + ('4', '04 - April'), + ('5', '05 - May'), + ('6', '06 - June'), + ('7', '07 - July'), + ('8', '08 - August'), + ('9', '09 - September'), + ('10', '10 - October'), + ('11', '11 - November'), + ('12', '12 - December'), + ) + CC_YEARS = assemble_cc_years() + + cardholder_name = forms.CharField( + label='Cardholder name', + + +## ... source file continues with no further ModelForm examples... + +``` + + +## Example 3 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / forms.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./forms.py) + +```python +# forms.py +from django.db import DatabaseError +~~from django.forms import ModelForm, Field, ValidationError, BooleanField, CharField +from django.forms.widgets import CheckboxInput, Select + +from explorer.app_settings import EXPLORER_DEFAULT_CONNECTION, EXPLORER_CONNECTIONS +from explorer.models import Query, MSG_FAILED_BLACKLIST + + +class SqlField(Field): + + def validate(self, value): + + query = Query(sql=value) + + passes_blacklist, failing_words = query.passes_blacklist() + + error = MSG_FAILED_BLACKLIST % ', '.join(failing_words) if not passes_blacklist else None + + if error: + raise ValidationError( + error, + code="InvalidSql" + ) + + +~~class QueryForm(ModelForm): + + sql = SqlField() + snapshot = BooleanField(widget=CheckboxInput, required=False) + connection = CharField(widget=Select, required=False) + + def __init__(self, *args, **kwargs): + super(QueryForm, self).__init__(*args, **kwargs) + self.fields['connection'].widget.choices = self.connections + if not self.instance.connection: + self.initial['connection'] = EXPLORER_DEFAULT_CONNECTION + self.fields['connection'].widget.attrs['class'] = 'form-control' + + def clean(self): + if self.instance and self.data.get('created_by_user', None): + self.cleaned_data['created_by_user'] = self.instance.created_by_user + return super(QueryForm, self).clean() + + @property + def created_by_user_email(self): + return self.instance.created_by_user.email if self.instance.created_by_user else '--' + + @property + def created_at_time(self): + return self.instance.created_at.strftime('%Y-%m-%d') + + +## ... source file continues with no further ModelForm examples... + +``` + diff --git a/content/pages/examples/django/django-forms-modelmultiplechoicefield.markdown b/content/pages/examples/django/django-forms-modelmultiplechoicefield.markdown new file mode 100644 index 000000000..6680b5dfc --- /dev/null +++ b/content/pages/examples/django/django-forms-modelmultiplechoicefield.markdown @@ -0,0 +1,121 @@ +title: django.forms ModelMultipleChoiceField Example Code +category: page +slug: django-forms-modelmultiplechoicefield-examples +sortorder: 500011274 +toc: False +sidebartitle: django.forms ModelMultipleChoiceField +meta: Python example code for the ModelMultipleChoiceField class from the django.forms module of the Django project. + + +ModelMultipleChoiceField is a class within the django.forms module of the Django project. + + +## Example 1 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / templatetags / jet_tags.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/templatetags/jet_tags.py) + +```python +# jet_tags.py +from __future__ import unicode_literals +import json +import os +from django import template +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +~~from django.forms import CheckboxInput, ModelChoiceField, Select, ModelMultipleChoiceField, SelectMultiple +from django.contrib.admin.widgets import RelatedFieldWidgetWrapper +from django.utils.formats import get_format +from django.utils.safestring import mark_safe +from django.utils.encoding import smart_text +from jet import settings, VERSION +from jet.models import Bookmark +from jet.utils import get_model_instance_label, get_model_queryset, get_possible_language_codes, \ + get_admin_site, get_menu_items + +try: + from urllib.parse import parse_qsl +except ImportError: + from urlparse import parse_qsl + + +register = template.Library() +assignment_tag = register.assignment_tag if hasattr(register, 'assignment_tag') else register.simple_tag + + +@assignment_tag +def jet_get_date_format(): + return get_format('DATE_INPUT_FORMATS')[0] + + + + +## ... source file abbreviated to get to ModelMultipleChoiceField examples ... + + +def jet_is_checkbox(field): + return field.field.widget.__class__.__name__ == CheckboxInput().__class__.__name__ + + +@register.filter +def jet_select2_lookups(field): + if hasattr(field, 'field') and \ + (isinstance(field.field, ModelChoiceField) or isinstance(field.field, ModelMultipleChoiceField)): + qs = field.field.queryset + model = qs.model + + if getattr(model, 'autocomplete_search_fields', None) and getattr(field.field, 'autocomplete', True): + choices = [] + app_label = model._meta.app_label + model_name = model._meta.object_name + + attrs = { + 'class': 'ajax', + 'data-app-label': app_label, + 'data-model': model_name, + 'data-ajax--url': reverse('jet:model_lookup') + } + + initial_value = field.value() + +~~ if hasattr(field, 'field') and isinstance(field.field, ModelMultipleChoiceField): + if initial_value: + initial_objects = model.objects.filter(pk__in=initial_value) + choices.extend( + [(initial_object.pk, get_model_instance_label(initial_object)) + for initial_object in initial_objects] + ) + + if isinstance(field.field.widget, RelatedFieldWidgetWrapper): + field.field.widget.widget = SelectMultiple(attrs) + else: + field.field.widget = SelectMultiple(attrs) + field.field.choices = choices + elif hasattr(field, 'field') and isinstance(field.field, ModelChoiceField): + if initial_value: + try: + initial_object = model.objects.get(pk=initial_value) + attrs['data-object-id'] = initial_value + choices.append((initial_object.pk, get_model_instance_label(initial_object))) + except model.DoesNotExist: + pass + + if isinstance(field.field.widget, RelatedFieldWidgetWrapper): + field.field.widget.widget = Select(attrs) + else: + + +## ... source file continues with no further ModelMultipleChoiceField examples... + +``` + diff --git a/content/pages/examples/django/django-forms-multiplechoicefield.markdown b/content/pages/examples/django/django-forms-multiplechoicefield.markdown new file mode 100644 index 000000000..2faa61d74 --- /dev/null +++ b/content/pages/examples/django/django-forms-multiplechoicefield.markdown @@ -0,0 +1,269 @@ +title: django.forms MultipleChoiceField Example Code +category: page +slug: django-forms-multiplechoicefield-examples +sortorder: 500011275 +toc: False +sidebartitle: django.forms MultipleChoiceField +meta: Python example code for the MultipleChoiceField class from the django.forms module of the Django project. + + +MultipleChoiceField is a class within the django.forms module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair/forms.py) + +```python +# forms.py +from functools import reduce + +from django import forms +from django.contrib.auth import get_user_model +from django.db import models +from django.db.models import Q, F, Count, Max, Subquery, OuterRef, Value +from django.db.models.functions import Concat +~~from django.forms import MultipleChoiceField, ChoiceField, Form +from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ + +from django_countries import countries + +from conferences.models import Conference, ArtifactDescriptor +from gears.widgets import CustomCheckboxSelectMultiple, CustomFileInput +from review.models import Reviewer, Review, ReviewStats +from review.utilities import get_average_score +from submissions.models import Submission, Attachment +from users.models import Profile + +User = get_user_model() + + +def clean_data_to_int(iterable, empty=None): + return [int(x) if x != '' else None for x in iterable] + + +def q_or(disjuncts, default=True): + if disjuncts: + return reduce(lambda acc, d: acc | d, disjuncts) + return Q(pk__isnull=(not default)) # otherwise, check whether PK is null + + + +## ... source file abbreviated to get to MultipleChoiceField examples ... + + + ) + + Q1 = 'Q1' + Q2 = 'Q2' + Q3 = 'Q3' + Q4 = 'Q4' + QUARTILE_CHOICES = ((Q1, 'Q1'), (Q2, 'Q2'), (Q3, 'Q3'), (Q4, 'Q4')) + + ORDER_BY_PK = 'PK' + ORDER_BY_TITLE = 'TITLE' + ORDER_BY_SCORE = 'SCORE' + ORDER_CHOICES = ( + (ORDER_BY_PK, 'Order by ID'), + (ORDER_BY_SCORE, 'Order by score'), + (ORDER_BY_TITLE, 'Order by title'), + ) + + DIRECTION_CHOICES = (('ASC', 'Ascending'), ('DESC', 'Descending')) + + class Meta: + model = Conference + fields = [] + + term = forms.CharField(required=False) + +~~ completion = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple(attrs={ + 'btn_class': 'btn btn-link dccn-link dccn-text-small', + 'label_class': 'dccn-text-0', + }), required=False, choices=COMPLETION_CHOICES) + +~~ types = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False) + +~~ topics = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False) + +~~ status = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + choices=Submission.STATUS_CHOICE) + +~~ countries = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False) + +~~ affiliations = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False) + +~~ proc_types = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple( + attrs={'label': 'Proceedings'}), required=False) + +~~ volumes = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False) + +~~ quartiles = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + choices=QUARTILE_CHOICES) + +~~ artifacts = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False) + + order = ChoiceField(required=False, choices=ORDER_CHOICES) + direction = ChoiceField(required=False, choices=DIRECTION_CHOICES) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert isinstance(self.instance, Conference) + self.fields['types'].choices = [ + (x.pk, x.name) for x in self.instance.submissiontype_set.all()] + self.fields['topics'].choices = [ + (x.pk, x.name) for x in self.instance.topic_set.all()] + self.fields['proc_types'].choices = [('', 'Not defined')] + [ + (x.pk, x.name) for x in self.instance.proceedingtype_set.all()] + self.fields['volumes'].choices = [('', 'Not defined')] + [ + (vol_pk, vol_name) for (vol_pk, vol_name) in + self.instance.proceedingtype_set.values_list( + 'volumes__pk', 'volumes__name').distinct()] + self.fields['artifacts'].choices = [ + (x.pk, f'{x.name} ({x.proc_type.name}') for x in + ArtifactDescriptor.objects.filter( + proc_type__conference=self.instance)] + + profiles_data = Profile.objects.filter( + + +## ... source file abbreviated to get to MultipleChoiceField examples ... + + + term = forms.CharField(required=False) + + authorship = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + choices=AUTHORSHIP_CHOICES, + ) + + countries = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + ) + + affiliations = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + ) + + graduation = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + choices=GRADUATION_CHOICES, + ) + + membership = forms.MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + choices=MEMBERSHIP_CHOICES, + ) + +~~ reviewer = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple, required=False, + choices=REVIEWER_CHOICES) + + order = ChoiceField(required=False, choices=ORDER_CHOICES) + direction = ChoiceField(required=False, choices=DIRECTION_CHOICES) + + columns = forms.MultipleChoiceField( + required=False, choices=COLUMNS, + widget=CustomCheckboxSelectMultiple + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert isinstance(self.instance, Conference) + countries_dict = dict(countries) + + self.fields['countries'].choices = [ + (code, countries_dict[code]) for code in + Profile.objects.filter(country__isnull=False).values_list( + 'country', flat=True).order_by('country').distinct()] + + self.fields['affiliations'].choices = [ + (aff, aff) for aff in + Profile.objects.values_list('affiliation', flat=True).order_by( + + +## ... source file abbreviated to get to MultipleChoiceField examples ... + + +class ExportSubmissionsForm(Form): + ORDER_COLUMN = '#' + ID_COLUMN = 'ID' + AUTHORS_COLUMN = 'AUTHORS' + TITLE_COLUMN = 'TITLE' + COUNTRY_COLUMN = 'COUNTRY' + STYPE_COLUMN = 'TYPE' + REVIEW_PAPER_COLUMN = 'REVIEW_MANUSCRIPT' + REVIEW_SCORE_COLUMN = 'REVIEW_SCORE' + STATUS_COLUMN = 'STATUS' + TOPICS_COLUMN = 'TOPICS' + + COLUMNS = ( + (ORDER_COLUMN, ORDER_COLUMN), + (ID_COLUMN, ID_COLUMN), + (TITLE_COLUMN, TITLE_COLUMN), + (AUTHORS_COLUMN, AUTHORS_COLUMN), + (COUNTRY_COLUMN, COUNTRY_COLUMN), + (STYPE_COLUMN, STYPE_COLUMN), + (REVIEW_PAPER_COLUMN, REVIEW_PAPER_COLUMN), + (REVIEW_SCORE_COLUMN, REVIEW_SCORE_COLUMN), + (STATUS_COLUMN, STATUS_COLUMN), + (TOPICS_COLUMN, TOPICS_COLUMN), + ) + +~~ columns = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple(hide_apply_btn=True), + required=False, choices=COLUMNS) + +~~ status = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple(hide_apply_btn=True), + required=False, choices=Submission.STATUS_CHOICE) + +~~ countries = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple(hide_apply_btn=True), + required=False) + +~~ topics = MultipleChoiceField( + widget=CustomCheckboxSelectMultiple(hide_apply_btn=True), + required=False) + + def __init__(self, *args, conference=None, **kwargs): + super().__init__(*args, **kwargs) + if conference is None: + raise ValueError('conference must be provided') + self.conference = conference + self.fields['columns'].initial = [ + self.ORDER_COLUMN, self.ID_COLUMN, self.TITLE_COLUMN, + self.AUTHORS_COLUMN, self.STATUS_COLUMN] + countries_list = list( + set(p.country for p in Profile.objects.all() if p.country)) + countries_list.sort(key=lambda cnt: cnt.name) + self.fields['countries'].choices = [ + (cnt.code, cnt.name) for cnt in countries_list] + self.fields['topics'].choices = [ + (t.pk, t.name) for t in self.conference.topic_set.all()] + + def apply(self, request): + submissions = Submission.objects.filter(conference=self.conference) + if self.cleaned_data['status']: + submissions = submissions.filter( + status__in=self.cleaned_data['status']) + + +## ... source file continues with no further MultipleChoiceField examples... + +``` + diff --git a/content/pages/examples/django/django-forms-select.markdown b/content/pages/examples/django/django-forms-select.markdown new file mode 100644 index 000000000..9a7f7ca44 --- /dev/null +++ b/content/pages/examples/django/django-forms-select.markdown @@ -0,0 +1,195 @@ +title: django.forms Select Example Code +category: page +slug: django-forms-select-examples +sortorder: 500011276 +toc: False +sidebartitle: django.forms Select +meta: Python example code for the Select class from the django.forms module of the Django project. + + +Select is a class within the django.forms module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / gears / widgets.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/gears/widgets.py) + +```python +# widgets.py +~~from django.forms import FileInput, CheckboxSelectMultiple, Select + + +class CustomFileInput(FileInput): + template_name = 'gears/widgets/file_input.html' + accept = '' + show_file_name = True + + +class CustomCheckboxSelectMultiple(CheckboxSelectMultiple): + template_name = 'gears/widgets/checkbox_multiple_select.html' + hide_label = False + hide_apply_btn = False + + class Media: + js = ('gears/js/checkbox_multiple_select.js',) + + def __init__(self, *args, **kwargs): + self.hide_label = kwargs.pop('hide_label', False) + self.hide_apply_btn = kwargs.pop('hide_apply_btn', False) + super().__init__(*args, **kwargs) + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + context['widget'].update({ + 'hide_label': self.hide_label, + 'hide_apply_btn': self.hide_apply_btn, + }) + return context + + +~~class DropdownSelectSubmit(Select): + template_name = 'gears/widgets/dropdown_select_submit.html' + empty_label = 'Not selected' + label_class = '' + empty_label_class = 'text-warning' + nonempty_label_class = 'text-success' + + class Media: + js = ('gears/js/dropdown_select_submit.js',) + + def __init__(self, *args, **kwargs): + self.empty_label = kwargs.pop('empty_label', 'Not selected') + self.label_class = kwargs.pop('label_class', '') + self.empty_label_class = kwargs.pop('empty_label_class', 'text-warning') + self.nonempty_label_class = kwargs.pop( + 'nonempty_label_class', 'text-success') + super().__init__(*args, **kwargs) + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + widget = context['widget'] + widget['label_class'] = self.label_class + widget['empty_label_class'] = self.empty_label_class + widget['nonempty_label_class'] = self.nonempty_label_class + widget['label'] = self.empty_label + + +## ... source file continues with no further Select examples... + +``` + + +## Example 2 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / templatetags / jet_tags.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/templatetags/jet_tags.py) + +```python +# jet_tags.py +from __future__ import unicode_literals +import json +import os +from django import template +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +~~from django.forms import CheckboxInput, ModelChoiceField, Select, ModelMultipleChoiceField, SelectMultiple +from django.contrib.admin.widgets import RelatedFieldWidgetWrapper +from django.utils.formats import get_format +from django.utils.safestring import mark_safe +from django.utils.encoding import smart_text +from jet import settings, VERSION +from jet.models import Bookmark +from jet.utils import get_model_instance_label, get_model_queryset, get_possible_language_codes, \ + get_admin_site, get_menu_items + +try: + from urllib.parse import parse_qsl +except ImportError: + from urlparse import parse_qsl + + +register = template.Library() +assignment_tag = register.assignment_tag if hasattr(register, 'assignment_tag') else register.simple_tag + + +@assignment_tag +def jet_get_date_format(): + return get_format('DATE_INPUT_FORMATS')[0] + + + + +## ... source file abbreviated to get to Select examples ... + + + initial_value = field.value() + + if hasattr(field, 'field') and isinstance(field.field, ModelMultipleChoiceField): + if initial_value: + initial_objects = model.objects.filter(pk__in=initial_value) + choices.extend( + [(initial_object.pk, get_model_instance_label(initial_object)) + for initial_object in initial_objects] + ) + + if isinstance(field.field.widget, RelatedFieldWidgetWrapper): + field.field.widget.widget = SelectMultiple(attrs) + else: + field.field.widget = SelectMultiple(attrs) + field.field.choices = choices + elif hasattr(field, 'field') and isinstance(field.field, ModelChoiceField): + if initial_value: + try: + initial_object = model.objects.get(pk=initial_value) + attrs['data-object-id'] = initial_value + choices.append((initial_object.pk, get_model_instance_label(initial_object))) + except model.DoesNotExist: + pass + + if isinstance(field.field.widget, RelatedFieldWidgetWrapper): +~~ field.field.widget.widget = Select(attrs) + else: +~~ field.field.widget = Select(attrs) + field.field.choices = choices + + return field + + +@assignment_tag(takes_context=True) +def jet_get_current_theme(context): + if 'request' in context and 'JET_THEME' in context['request'].COOKIES: + theme = context['request'].COOKIES['JET_THEME'] + if isinstance(settings.JET_THEMES, list) and len(settings.JET_THEMES) > 0: + for conf_theme in settings.JET_THEMES: + if isinstance(conf_theme, dict) and conf_theme.get('theme') == theme: + return theme + return settings.JET_DEFAULT_THEME + + +@assignment_tag +def jet_get_themes(): + return settings.JET_THEMES + + +@assignment_tag +def jet_get_current_version(): + return VERSION + + +## ... source file continues with no further Select examples... + +``` + diff --git a/content/pages/examples/django/django-forms-selectmultiple.markdown b/content/pages/examples/django/django-forms-selectmultiple.markdown new file mode 100644 index 000000000..571f1b1ce --- /dev/null +++ b/content/pages/examples/django/django-forms-selectmultiple.markdown @@ -0,0 +1,123 @@ +title: django.forms SelectMultiple Example Code +category: page +slug: django-forms-selectmultiple-examples +sortorder: 500011277 +toc: False +sidebartitle: django.forms SelectMultiple +meta: Python example code for the SelectMultiple class from the django.forms module of the Django project. + + +SelectMultiple is a class within the django.forms module of the Django project. + + +## Example 1 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / templatetags / jet_tags.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/templatetags/jet_tags.py) + +```python +# jet_tags.py +from __future__ import unicode_literals +import json +import os +from django import template +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +~~from django.forms import CheckboxInput, ModelChoiceField, Select, ModelMultipleChoiceField, SelectMultiple +from django.contrib.admin.widgets import RelatedFieldWidgetWrapper +from django.utils.formats import get_format +from django.utils.safestring import mark_safe +from django.utils.encoding import smart_text +from jet import settings, VERSION +from jet.models import Bookmark +from jet.utils import get_model_instance_label, get_model_queryset, get_possible_language_codes, \ + get_admin_site, get_menu_items + +try: + from urllib.parse import parse_qsl +except ImportError: + from urlparse import parse_qsl + + +register = template.Library() +assignment_tag = register.assignment_tag if hasattr(register, 'assignment_tag') else register.simple_tag + + +@assignment_tag +def jet_get_date_format(): + return get_format('DATE_INPUT_FORMATS')[0] + + + + +## ... source file abbreviated to get to SelectMultiple examples ... + + + model = qs.model + + if getattr(model, 'autocomplete_search_fields', None) and getattr(field.field, 'autocomplete', True): + choices = [] + app_label = model._meta.app_label + model_name = model._meta.object_name + + attrs = { + 'class': 'ajax', + 'data-app-label': app_label, + 'data-model': model_name, + 'data-ajax--url': reverse('jet:model_lookup') + } + + initial_value = field.value() + + if hasattr(field, 'field') and isinstance(field.field, ModelMultipleChoiceField): + if initial_value: + initial_objects = model.objects.filter(pk__in=initial_value) + choices.extend( + [(initial_object.pk, get_model_instance_label(initial_object)) + for initial_object in initial_objects] + ) + + if isinstance(field.field.widget, RelatedFieldWidgetWrapper): +~~ field.field.widget.widget = SelectMultiple(attrs) + else: +~~ field.field.widget = SelectMultiple(attrs) + field.field.choices = choices + elif hasattr(field, 'field') and isinstance(field.field, ModelChoiceField): + if initial_value: + try: + initial_object = model.objects.get(pk=initial_value) + attrs['data-object-id'] = initial_value + choices.append((initial_object.pk, get_model_instance_label(initial_object))) + except model.DoesNotExist: + pass + + if isinstance(field.field.widget, RelatedFieldWidgetWrapper): + field.field.widget.widget = Select(attrs) + else: + field.field.widget = Select(attrs) + field.field.choices = choices + + return field + + +@assignment_tag(takes_context=True) +def jet_get_current_theme(context): + if 'request' in context and 'JET_THEME' in context['request'].COOKIES: + theme = context['request'].COOKIES['JET_THEME'] + if isinstance(settings.JET_THEMES, list) and len(settings.JET_THEMES) > 0: + + +## ... source file continues with no further SelectMultiple examples... + +``` + diff --git a/content/pages/examples/django/django-forms-validationerror.markdown b/content/pages/examples/django/django-forms-validationerror.markdown new file mode 100644 index 000000000..59a18ace7 --- /dev/null +++ b/content/pages/examples/django/django-forms-validationerror.markdown @@ -0,0 +1,502 @@ +title: django.forms ValidationError Example Code +category: page +slug: django-forms-validationerror-examples +sortorder: 500011278 +toc: False +sidebartitle: django.forms ValidationError +meta: Python example code for the ValidationError class from the django.forms module of the Django project. + + +ValidationError is a class within the django.forms module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / helpers.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/helpers.py) + +```python +# helpers.py +from django.contrib import messages +~~from django.forms import ValidationError +from django.http import HttpResponseRedirect +from django.shortcuts import render +from django.urls import reverse + +from allauth.account import app_settings as account_settings +from allauth.account.adapter import get_adapter as get_account_adapter +from allauth.account.utils import complete_signup, perform_login, user_username +from allauth.exceptions import ImmediateHttpResponse + +from . import app_settings, signals +from .adapter import get_adapter +from .models import SocialLogin +from .providers.base import AuthError, AuthProcess + + +def _process_signup(request, sociallogin): + auto_signup = get_adapter(request).is_auto_signup_allowed( + request, + sociallogin) + if not auto_signup: + request.session['socialaccount_sociallogin'] = sociallogin.serialize() + url = reverse('socialaccount_signup') + ret = HttpResponseRedirect(url) + else: + if account_settings.USER_MODEL_USERNAME_FIELD: + username = user_username(sociallogin.user) + try: + get_account_adapter(request).clean_username(username) +~~ except ValidationError: + user_username(sociallogin.user, '') + if not get_adapter(request).is_open_for_signup( + request, + sociallogin): + return render( + request, + "account/signup_closed." + + account_settings.TEMPLATE_EXTENSION) + get_adapter(request).save_user(request, sociallogin, form=None) + ret = complete_social_signup(request, sociallogin) + return ret + + +def _login_social_account(request, sociallogin): + return perform_login(request, sociallogin.user, + email_verification=app_settings.EMAIL_VERIFICATION, + redirect_url=sociallogin.get_redirect_url(request), + signal_kwargs={"sociallogin": sociallogin}) + + +def render_authentication_error(request, + provider_id, + error=AuthError.UNKNOWN, + exception=None, + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 2 from django-jsonfield +[django-jsonfield](https://github.com/dmkoch/django-jsonfield) +([jsonfield on PyPi](https://pypi.org/project/jsonfield/)) is a +[Django](/django.html) code library that makes it easier to store validated +JSON in a [Django object-relational mapper (ORM)](/django-orm.html) database +model. + +The django-jsonfield project is open source under the +[MIT license](https://github.com/dmkoch/django-jsonfield/blob/master/LICENSE). + +[**django-jsonfield / src/jsonfield / fields.py**](https://github.com/dmkoch/django-jsonfield/blob/master/src/jsonfield/./fields.py) + +```python +# fields.py +import copy +import json +import warnings + +from django.db import models +~~from django.forms import ValidationError +from django.utils.translation import gettext_lazy as _ + +from . import forms +from .encoder import JSONEncoder +from .json import JSONString, checked_loads + +DEFAULT_DUMP_KWARGS = { + 'cls': JSONEncoder, +} + +DEFAULT_LOAD_KWARGS = {} + +INVALID_JSON_WARNING = ( + '{0!s} failed to load invalid json ({1}) from the database. The value has ' + 'been returned as a string instead.' +) + + +class JSONFieldMixin(models.Field): + form_class = forms.JSONField + + def __init__(self, *args, dump_kwargs=None, load_kwargs=None, **kwargs): + self.dump_kwargs = DEFAULT_DUMP_KWARGS if dump_kwargs is None else dump_kwargs + self.load_kwargs = DEFAULT_LOAD_KWARGS if load_kwargs is None else load_kwargs + + super().__init__(*args, **kwargs) + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + + if self.dump_kwargs != DEFAULT_DUMP_KWARGS: + kwargs['dump_kwargs'] = self.dump_kwargs + if self.load_kwargs != DEFAULT_LOAD_KWARGS: + kwargs['load_kwargs'] = self.load_kwargs + + return name, path, args, kwargs + + def to_python(self, value): + try: + return checked_loads(value, **self.load_kwargs) + except ValueError: +~~ raise ValidationError(_("Enter valid JSON.")) + + def from_db_value(self, value, expression, connection): + if value is None: + return None + + try: + return checked_loads(value, **self.load_kwargs) + except json.JSONDecodeError: + warnings.warn(INVALID_JSON_WARNING.format(self, value), RuntimeWarning) + return JSONString(value) + + def get_prep_value(self, value): + if self.null and value is None: + return None + return json.dumps(value, **self.dump_kwargs) + + def value_to_string(self, obj): + value = self.value_from_object(obj) + return json.dumps(value, **self.dump_kwargs) + + def formfield(self, **kwargs): + kwargs.setdefault('form_class', self.form_class) + if issubclass(kwargs['form_class'], forms.JSONField): + kwargs.setdefault('dump_kwargs', self.dump_kwargs) + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 3 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / forms.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./forms.py) + +```python +# forms.py +from django.db import DatabaseError +~~from django.forms import ModelForm, Field, ValidationError, BooleanField, CharField +from django.forms.widgets import CheckboxInput, Select + +from explorer.app_settings import EXPLORER_DEFAULT_CONNECTION, EXPLORER_CONNECTIONS +from explorer.models import Query, MSG_FAILED_BLACKLIST + + +class SqlField(Field): + + def validate(self, value): + + query = Query(sql=value) + + passes_blacklist, failing_words = query.passes_blacklist() + + error = MSG_FAILED_BLACKLIST % ', '.join(failing_words) if not passes_blacklist else None + + if error: +~~ raise ValidationError( + error, + code="InvalidSql" + ) + + +class QueryForm(ModelForm): + + sql = SqlField() + snapshot = BooleanField(widget=CheckboxInput, required=False) + connection = CharField(widget=Select, required=False) + + def __init__(self, *args, **kwargs): + super(QueryForm, self).__init__(*args, **kwargs) + self.fields['connection'].widget.choices = self.connections + if not self.instance.connection: + self.initial['connection'] = EXPLORER_DEFAULT_CONNECTION + self.fields['connection'].widget.attrs['class'] = 'form-control' + + def clean(self): + if self.instance and self.data.get('created_by_user', None): + self.cleaned_data['created_by_user'] = self.instance.created_by_user + return super(QueryForm, self).clean() + + @property + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 4 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / forms.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./forms.py) + +```python +# forms.py +from __future__ import unicode_literals + +import logging +import re +import collections +import datetime + +~~import django.forms +~~import django.forms.utils +~~import django.forms.widgets +import django.core.validators +import django.core.exceptions +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from django.utils.safestring import mark_safe + +import form_utils.forms +import requests +import dateutil.parser +import validate_email + +logger = logging.getLogger(__name__) + + +REGISTRATION_CONFIGURATION_NAME = 'registration_configuration' + +RE_NON_DECIMAL = re.compile(r'[^\d]+') +RE_NON_ALPHA = re.compile('[\W]+') +RE_POSTAL_CODE = re.compile(r'^[0-9]{5}$') +validate_postal_code = django.core.validators.RegexValidator( + RE_POSTAL_CODE, _("Enter a valid postal code consisting 5 numbers."), 'invalid') + + +CHOICES_GENDER = ( + + +## ... source file abbreviated to get to ValidationError examples ... + + +class StateLookupForm(django.forms.Form): + email = django.forms.EmailField(label=_('Email'), help_text=_('so we can send you confirmation of your registration')) + postal_code = django.forms.CharField( + label=_('Postal Code'), + max_length=5, min_length=5, validators=[validate_postal_code], + help_text=_('to determine which series of state-based questions we will ask next')) + + def clean_email(self): + email = self.cleaned_data['email'] + if settings.DISABLE_EMAIL_VALIDATION: + logger.warning('Email validation disabled: DISABLE_EMAIL_VALIDATION ' + 'is set') + return email + if not hasattr(settings, 'MAILGUN_PUBLIC_API_KEY'): + logger.warning( + 'Cannot validate email: MAILGUN_PUBLIC_API_KEY not set') + return email + r = requests.get( + 'https://api.mailgun.net/v2/address/validate', + data={'address': email, }, + auth=('api', settings.MAILGUN_PUBLIC_API_KEY)) + if r.status_code == 200: + if r.json()['is_valid']: + return email + logger.warning('Cannot validate email: {}'.format(r.text)) +~~ raise django.forms.ValidationError(_('Enter a valid email.')) + + +class UPENNStateLookupForm(StateLookupForm): + error_css_class = 'invalid-data-error' + email = django.forms.EmailField(label='') + postal_code = django.forms.CharField(label='', max_length=5, min_length=5, validators=[validate_postal_code]) + + email.widget.attrs['placeholder'] = 'EMAIL' + email.widget.attrs['class'] = 'upenn-text-field' + + postal_code.widget.attrs['placeholder'] = 'POSTAL CODE' + postal_code.widget.attrs['class'] = 'upenn-text-field' + + +def register_form_clean(self): + cleaned_data = super(self.__class__, self).clean() + + if self.validate_organ_tissue_selection: + organ_choices = [value for key, value in cleaned_data.items() if key.startswith('include')] + if organ_choices: + if not any(organ_choices): +~~ raise django.forms.ValidationError(_('At least one organ/tissue needs to be selected')) + + if self.api_errors and not self.skip_api_error_validation: + for k, v in self.api_errors.items(): + if k in self.fields: + self.add_error(k, v) + + return cleaned_data + + +def register_form_clean_license_id(self): + license_id = self.cleaned_data['license_id'] + if self.fields['license_id'].required and is_license_id_not_applicable(license_id): +~~ raise django.forms.ValidationError(_('License ID is required.')) + return license_id + + +def is_license_id_not_applicable(license_id): + not_applicable_list = ['na', 'n/a', ] + if license_id.lower() in not_applicable_list: + return True + return False + + +def register_form_clean_birthdate(self): + date = self.cleaned_data['birthdate'] + if not date: + return date + if date >= datetime.date.today(): +~~ raise django.forms.ValidationError(_('Enter an accurate birthdate.')) + return date + + +def register_form_clean_phone_number(self): + phone_number = self.cleaned_data['phone_number'] + if not phone_number: + return phone_number + phone_number = RE_NON_DECIMAL.sub('', phone_number) + if phone_number.startswith('1'): + phone_number = phone_number[1:] + if len(phone_number) != 10: +~~ raise django.forms.ValidationError( + _('Enter an accurate phone number including area code.')) + return phone_number + + +def register_form_clean_ssn(self): + ssn = self.cleaned_data['ssn'] + if not ssn: + return ssn + if len(ssn) != 4: +~~ raise django.forms.ValidationError( + _('Enter the last 4 digits of your social security number.')) + try: + int(ssn) + except ValueError: +~~ raise django.forms.ValidationError(_('Enter only digits.')) + return ssn + + +def validate_date_generator(min_value): + min_value = dateutil.parser.parse(min_value).date() + + def validate_date(date): + if date < min_value: +~~ raise django.forms.ValidationError( + _('Date must be later than %(date)s.') % + {'date': min_value.strftime('%m/%d/%Y'), }, + code='minimum') + + return validate_date + + +def register_form_generator(conf): + fieldsets = [] + fields = collections.OrderedDict() + for index, fieldset_def in enumerate(conf['fieldsets']): + fieldset_title = _(fieldset_def['title']) + fieldset_fields = fieldset_def['fields'] + + if not fieldset_fields: + continue + fieldset = (unicode(index), {'legend': fieldset_title, 'fields': []}, ) + + has_booleans = False + + for field_def in fieldset_def['fields']: + field_name = field_def['field_name'] + field_type = field_def.get('type') + label = _(field_def['human_name']) or '' + + +## ... source file abbreviated to get to ValidationError examples ... + + + widget=django.forms.RadioSelect) + birthdate = django.forms.DateField( + label=_('Birthdate'), + widget=django.forms.DateInput( + attrs={'placeholder': '__/__/____', 'class': 'date',})) + agree_to_tos = django.forms.BooleanField(label='', widget=django.forms.widgets.CheckboxInput(attrs={'required': 'required', })) + + def clean_email(self): + email = self.cleaned_data['email'] + if settings.DISABLE_EMAIL_VALIDATION: + logger.warning( + 'Email validation disabled: DISABLE_EMAIL_VALIDATION is set') + return email + if not hasattr(settings, 'MAILGUN_PUBLIC_API_KEY'): + logger.warning( + 'Cannot validate email: MAILGUN_PUBLIC_API_KEY not set') + return email + r = requests.get( + 'https://api.mailgun.net/v2/address/validate', + data={'address': email, }, + auth=('api', settings.MAILGUN_PUBLIC_API_KEY)) + if r.status_code == 200: + if r.json()['is_valid']: + return email + logger.warning('Cannot validate email: {}'.format(r.text)) +~~ raise django.forms.ValidationError(_('Enter a valid email.')) + + +class EmailNextOfKinForm(django.forms.Form): + to = MultiEmailField(label=_('To'), max_length=300, help_text=_('Enter one or more emails separated by commas.')) + subject = django.forms.CharField(label=_('Subject'), max_length=250) + body = django.forms.CharField(label=_('Body'), widget=django.forms.widgets.Textarea()) + + def clean_to(self): + emails = self.cleaned_data['to'] + if settings.DISABLE_EMAIL_VALIDATION: + logger.warning('Email validation disabled: DISABLE_EMAIL_VALIDATION is set') + return emails + if not hasattr(settings, 'MAILGUN_PUBLIC_API_KEY'): + logger.warning('Cannot validate email: MAILGUN_PUBLIC_API_KEY not set') + return emails + valid_emails = [] + invalid_emails = [] + for email in emails: + r = requests.get('https://api.mailgun.net/v2/address/validate', + data={'address': email, }, + auth=('api', settings.MAILGUN_PUBLIC_API_KEY)) + if r.status_code == 200 and r.json()['is_valid']: + valid_emails.append(email) + else: + logger.warning('Cannot validate email: {}'.format(r.text)) + invalid_emails.append(email) + if invalid_emails: +~~ raise django.forms.ValidationError(_('Enter valid email addresses.')) + else: + return valid_emails + + + +## ... source file continues with no further ValidationError examples... + +``` + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index c21677f40..f67cc796e 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -111,14 +111,33 @@

django.db.models.signals

django.dispatch.dispatcher Signal

django.forms + BaseForm, BooleanField, CharField, + CheckboxInput, + CheckboxSelectMultiple, ChoiceField, DateField, + DateInput, DateTimeField, EmailField, + Field, + FileInput, + FilePathField, + Form, + HiddenInput, + ImageField, IntegerField, - TypedChoiceField + Media, + MediaDefiningClass, + ModelChoiceField, + ModelForm, + ModelMultipleChoiceField, + MultipleChoiceField, + Select, + SelectMultiple, + TypedChoiceField, + ValidationError

django.http HttpResponse, From 3f18b987d6f7193ae9a297064c9d52812b665612 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 8 Jul 2020 15:27:13 -0400 Subject: [PATCH 176/302] update flask.globals g description --- content/pages/examples/flask/flask-globals-g.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 73b183032..368ce8453 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -7,7 +7,10 @@ sidebartitle: flask.globals g meta: Python example code that shows how to use the g callable from the flask.globals module of the Flask project. -g is a callable within the flask.globals module of the Flask project. +[g](https://flask.palletsprojects.com/en/1.1.x/api/#flask.g) is +an object for storing data during the +[application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/) +of a running [Flask](/flask.html) web app. ## Example 1 from Flask AppBuilder From da205be911b86d9d8e9e5e213a4d11abf77473e4 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 8 Jul 2020 20:59:31 -0400 Subject: [PATCH 177/302] add new django utils code exmaples --- ...ils-cache-add-never-cache-headers.markdown | 116 + .../django-utils-cache-cc-delim-re.markdown | 122 + ...o-utils-cache-patch-cache-control.markdown | 227 ++ ...tils-cache-patch-response-headers.markdown | 116 + ...go-utils-cache-patch-vary-headers.markdown | 373 +++ ...tils-crypto-constant-time-compare.markdown | 50 + ...go-utils-crypto-get-random-string.markdown | 112 + ...ils-datastructures-multivaluedict.markdown | 296 ++ .../django/django-utils-dateformat.markdown | 176 ++ ...go-utils-dateparse-parse-datetime.markdown | 116 + ...go-utils-dateparse-parse-duration.markdown | 118 + .../django/django-utils-dateparse.markdown | 138 + .../django/django-utils-dates-months.markdown | 70 + ...ango-utils-datetime-safe-datetime.markdown | 154 ++ .../django-utils-datetime-safe.markdown | 440 +++ ...utils-decorators-method-decorator.markdown | 1193 ++++++++ ...utils-deprecation-middlewaremixin.markdown | 628 +++++ ...ils-deprecation-renamemethodsbase.markdown | 66 + ...go-utils-duration-duration-string.markdown | 142 + ...encoding-djangounicodedecodeerror.markdown | 60 + ...go-utils-encoding-filepath-to-uri.markdown | 93 + ...django-utils-encoding-force-bytes.markdown | 389 +++ .../django-utils-encoding-force-str.markdown | 1558 +++++++++++ .../django-utils-encoding-force-text.markdown | 890 ++++++ .../django-utils-encoding-iri-to-uri.markdown | 176 ++ ...-utils-encoding-is-protected-type.markdown | 121 + ...django-utils-encoding-smart-bytes.markdown | 117 + .../django-utils-encoding-smart-str.markdown | 366 +++ .../django-utils-encoding-smart-text.markdown | 509 ++++ .../django-utils-encoding-uri-to-iri.markdown | 125 + .../django-utils-formats-get-format.markdown | 252 ++ ...ango-utils-formats-localize-input.markdown | 142 + ...utils-formats-sanitize-separators.markdown | 142 + .../django/django-utils-formats.markdown | 536 ++++ ...django-utils-functional-keep-lazy.markdown | 72 + .../django-utils-functional-lazy.markdown | 198 ++ ...jango-utils-functional-lazyobject.markdown | 266 ++ .../django-utils-functional-promise.markdown | 335 +++ ...utils-functional-simplelazyobject.markdown | 98 + ...o-utils-functional-total-ordering.markdown | 65 + .../django-utils-functional-wraps.markdown | 206 ++ ...ngo-utils-html-conditional-escape.markdown | 207 ++ .../django/django-utils-html-escape.markdown | 829 ++++++ .../django-utils-html-escapejs.markdown | 124 + ...jango-utils-html-format-html-join.markdown | 313 +++ .../django-utils-html-mark-safe.markdown | 321 +++ .../django-utils-html-smart-urlquote.markdown | 124 + .../django-utils-html-strip-tags.markdown | 213 ++ .../django-utils-http-base36-to-int.markdown | 105 + .../django-utils-http-http-date.markdown | 154 ++ .../django-utils-http-int-to-base36.markdown | 106 + .../django-utils-http-is-safe-url.markdown | 106 + .../django/django-utils-http-unquote.markdown | 68 + ...p-url-has-allowed-host-and-scheme.markdown | 125 + .../django-utils-http-urlencode.markdown | 733 +++++ .../django-utils-http-urlquote.markdown | 413 +++ .../django-utils-http-urlunquote.markdown | 130 + ...ngo-utils-ipv6-clean-ipv6-address.markdown | 142 + ...ango-utils-itercompat-is-iterable.markdown | 123 + ...dule-loading-autodiscover-modules.markdown | 98 + ...tils-module-loading-import-string.markdown | 1081 ++++++++ ...dule-loading-module-has-submodule.markdown | 268 ++ .../django-utils-module-loading.markdown | 106 + .../django-utils-numberformat-format.markdown | 125 + ...django-utils-safestring-mark-safe.markdown | 2391 +++++++++++++++++ .../django-utils-safestring-safedata.markdown | 238 ++ .../django-utils-safestring-safetext.markdown | 107 + .../django-utils-termcolors-colorize.markdown | 89 + .../django/django-utils-termcolors.markdown | 65 + .../django-utils-text-capfirst.markdown | 990 +++++++ .../django-utils-text-format-lazy.markdown | 64 + .../django-utils-text-get-text-list.markdown | 128 + ...ngo-utils-text-get-valid-filename.markdown | 103 + .../django/django-utils-text-slugify.markdown | 562 ++++ .../django-utils-text-truncator.markdown | 152 ++ ...ils-timezone-get-current-timezone.markdown | 79 + .../django-utils-timezone-make-aware.markdown | 296 ++ .../django/django-utils-timezone-now.markdown | 825 ++++++ .../django-utils-timezone-timedelta.markdown | 177 ++ ...django-utils-translation-activate.markdown | 18 +- ...-utils-translation-deactivate-all.markdown | 18 +- ...slation-get-language-from-request.markdown | 18 +- ...go-utils-translation-get-language.markdown | 23 +- ...go-utils-translation-gettext-lazy.markdown | 8 +- .../django-utils-translation-gettext.markdown | 63 +- ...-translation-language-session-key.markdown | 10 +- ...django-utils-translation-ngettext.markdown | 18 +- ...django-utils-translation-override.markdown | 18 +- ...o-utils-translation-pgettext-lazy.markdown | 23 +- ...django-utils-translation-pgettext.markdown | 13 +- ...o-utils-translation-ugettext-lazy.markdown | 8 +- ...django-utils-translation-ugettext.markdown | 13 +- ...-utils-translation-ungettext-lazy.markdown | 8 +- ...jango-utils-translation-ungettext.markdown | 22 +- .../django/django-utils-translation.markdown | 28 +- .../django/django-utils-tree.markdown | 123 + 96 files changed, 24004 insertions(+), 77 deletions(-) create mode 100644 content/pages/examples/django/django-utils-cache-add-never-cache-headers.markdown create mode 100644 content/pages/examples/django/django-utils-cache-cc-delim-re.markdown create mode 100644 content/pages/examples/django/django-utils-cache-patch-cache-control.markdown create mode 100644 content/pages/examples/django/django-utils-cache-patch-response-headers.markdown create mode 100644 content/pages/examples/django/django-utils-cache-patch-vary-headers.markdown create mode 100644 content/pages/examples/django/django-utils-crypto-constant-time-compare.markdown create mode 100644 content/pages/examples/django/django-utils-crypto-get-random-string.markdown create mode 100644 content/pages/examples/django/django-utils-datastructures-multivaluedict.markdown create mode 100644 content/pages/examples/django/django-utils-dateformat.markdown create mode 100644 content/pages/examples/django/django-utils-dateparse-parse-datetime.markdown create mode 100644 content/pages/examples/django/django-utils-dateparse-parse-duration.markdown create mode 100644 content/pages/examples/django/django-utils-dateparse.markdown create mode 100644 content/pages/examples/django/django-utils-dates-months.markdown create mode 100644 content/pages/examples/django/django-utils-datetime-safe-datetime.markdown create mode 100644 content/pages/examples/django/django-utils-datetime-safe.markdown create mode 100644 content/pages/examples/django/django-utils-decorators-method-decorator.markdown create mode 100644 content/pages/examples/django/django-utils-deprecation-middlewaremixin.markdown create mode 100644 content/pages/examples/django/django-utils-deprecation-renamemethodsbase.markdown create mode 100644 content/pages/examples/django/django-utils-duration-duration-string.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-djangounicodedecodeerror.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-filepath-to-uri.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-force-bytes.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-force-str.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-force-text.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-iri-to-uri.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-is-protected-type.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-smart-bytes.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-smart-str.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-smart-text.markdown create mode 100644 content/pages/examples/django/django-utils-encoding-uri-to-iri.markdown create mode 100644 content/pages/examples/django/django-utils-formats-get-format.markdown create mode 100644 content/pages/examples/django/django-utils-formats-localize-input.markdown create mode 100644 content/pages/examples/django/django-utils-formats-sanitize-separators.markdown create mode 100644 content/pages/examples/django/django-utils-formats.markdown create mode 100644 content/pages/examples/django/django-utils-functional-keep-lazy.markdown create mode 100644 content/pages/examples/django/django-utils-functional-lazy.markdown create mode 100644 content/pages/examples/django/django-utils-functional-lazyobject.markdown create mode 100644 content/pages/examples/django/django-utils-functional-promise.markdown create mode 100644 content/pages/examples/django/django-utils-functional-simplelazyobject.markdown create mode 100644 content/pages/examples/django/django-utils-functional-total-ordering.markdown create mode 100644 content/pages/examples/django/django-utils-functional-wraps.markdown create mode 100644 content/pages/examples/django/django-utils-html-conditional-escape.markdown create mode 100644 content/pages/examples/django/django-utils-html-escape.markdown create mode 100644 content/pages/examples/django/django-utils-html-escapejs.markdown create mode 100644 content/pages/examples/django/django-utils-html-format-html-join.markdown create mode 100644 content/pages/examples/django/django-utils-html-mark-safe.markdown create mode 100644 content/pages/examples/django/django-utils-html-smart-urlquote.markdown create mode 100644 content/pages/examples/django/django-utils-html-strip-tags.markdown create mode 100644 content/pages/examples/django/django-utils-http-base36-to-int.markdown create mode 100644 content/pages/examples/django/django-utils-http-http-date.markdown create mode 100644 content/pages/examples/django/django-utils-http-int-to-base36.markdown create mode 100644 content/pages/examples/django/django-utils-http-is-safe-url.markdown create mode 100644 content/pages/examples/django/django-utils-http-unquote.markdown create mode 100644 content/pages/examples/django/django-utils-http-url-has-allowed-host-and-scheme.markdown create mode 100644 content/pages/examples/django/django-utils-http-urlencode.markdown create mode 100644 content/pages/examples/django/django-utils-http-urlquote.markdown create mode 100644 content/pages/examples/django/django-utils-http-urlunquote.markdown create mode 100644 content/pages/examples/django/django-utils-ipv6-clean-ipv6-address.markdown create mode 100644 content/pages/examples/django/django-utils-itercompat-is-iterable.markdown create mode 100644 content/pages/examples/django/django-utils-module-loading-autodiscover-modules.markdown create mode 100644 content/pages/examples/django/django-utils-module-loading-import-string.markdown create mode 100644 content/pages/examples/django/django-utils-module-loading-module-has-submodule.markdown create mode 100644 content/pages/examples/django/django-utils-module-loading.markdown create mode 100644 content/pages/examples/django/django-utils-numberformat-format.markdown create mode 100644 content/pages/examples/django/django-utils-safestring-mark-safe.markdown create mode 100644 content/pages/examples/django/django-utils-safestring-safedata.markdown create mode 100644 content/pages/examples/django/django-utils-safestring-safetext.markdown create mode 100644 content/pages/examples/django/django-utils-termcolors-colorize.markdown create mode 100644 content/pages/examples/django/django-utils-termcolors.markdown create mode 100644 content/pages/examples/django/django-utils-text-capfirst.markdown create mode 100644 content/pages/examples/django/django-utils-text-format-lazy.markdown create mode 100644 content/pages/examples/django/django-utils-text-get-text-list.markdown create mode 100644 content/pages/examples/django/django-utils-text-get-valid-filename.markdown create mode 100644 content/pages/examples/django/django-utils-text-slugify.markdown create mode 100644 content/pages/examples/django/django-utils-text-truncator.markdown create mode 100644 content/pages/examples/django/django-utils-timezone-get-current-timezone.markdown create mode 100644 content/pages/examples/django/django-utils-timezone-make-aware.markdown create mode 100644 content/pages/examples/django/django-utils-timezone-now.markdown create mode 100644 content/pages/examples/django/django-utils-timezone-timedelta.markdown create mode 100644 content/pages/examples/django/django-utils-tree.markdown diff --git a/content/pages/examples/django/django-utils-cache-add-never-cache-headers.markdown b/content/pages/examples/django/django-utils-cache-add-never-cache-headers.markdown new file mode 100644 index 000000000..4d2add1ea --- /dev/null +++ b/content/pages/examples/django/django-utils-cache-add-never-cache-headers.markdown @@ -0,0 +1,116 @@ +title: django.utils.cache add_never_cache_headers Example Code +category: page +slug: django-utils-cache-add-never-cache-headers-examples +sortorder: 500011424 +toc: False +sidebartitle: django.utils.cache add_never_cache_headers +meta: Python example code for the add_never_cache_headers callable from the django.utils.cache module of the Django project. + + +add_never_cache_headers is a callable within the django.utils.cache module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / middleware / toolbar.py**](https://github.com/divio/django-cms/blob/develop/cms/middleware/toolbar.py) + +```python +# toolbar.py +from django import forms +from django.contrib.admin.models import LogEntry, ADDITION, CHANGE +from django.core.exceptions import ValidationError +from django.urls import resolve + +from cms.toolbar.toolbar import CMSToolbar +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils.conf import get_cms_setting +from cms.utils.compat.dj import MiddlewareMixin +from cms.utils.request_ip_resolvers import get_request_ip_resolver + + +get_request_ip = get_request_ip_resolver() + + +class ToolbarMiddleware(MiddlewareMixin): + + def is_cms_request(self, request): + toolbar_hide = get_cms_setting('TOOLBAR_HIDE') + internal_ips = get_cms_setting('INTERNAL_IPS') + + if internal_ips: + client_ip = get_request_ip(request) + try: + client_ip = forms.GenericIPAddressField().clean(client_ip) + except ValidationError: + return False + else: + if client_ip not in internal_ips: + return False + + if not toolbar_hide: + return True + + try: + + +## ... source file abbreviated to get to add_never_cache_headers examples ... + + + + if edit_enabled and show_toolbar and not request.session.get('cms_edit'): + request.session['cms_edit'] = True + request.session['cms_preview'] = False + + if edit_disabled or not show_toolbar and request.session.get('cms_edit'): + request.session['cms_edit'] = False + + if 'preview' in request.GET and not request.session.get('cms_preview'): + request.session['cms_preview'] = True + + if request.user.is_staff: + try: + request.cms_latest_entry = LogEntry.objects.filter( + user=request.user, + action_flag__in=(ADDITION, CHANGE) + ).only('pk').order_by('-pk')[0].pk + except IndexError: + request.cms_latest_entry = -1 + request.toolbar = CMSToolbar(request) + + def process_response(self, request, response): + if not self.is_cms_request(request): + return response + +~~ from django.utils.cache import add_never_cache_headers + + toolbar = get_toolbar_from_request(request) + + if toolbar._cache_disabled: +~~ add_never_cache_headers(response) + + if hasattr(request, 'user') and request.user.is_staff and response.status_code != 500: + try: + if hasattr(request, 'cms_latest_entry'): + pk = LogEntry.objects.filter( + user=request.user, + action_flag__in=(ADDITION, CHANGE) + ).only('pk').order_by('-pk')[0].pk + + if request.cms_latest_entry != pk: + request.session['cms_log_latest'] = pk + except IndexError: + pass + return response + + + +## ... source file continues with no further add_never_cache_headers examples... + +``` + diff --git a/content/pages/examples/django/django-utils-cache-cc-delim-re.markdown b/content/pages/examples/django/django-utils-cache-cc-delim-re.markdown new file mode 100644 index 000000000..2620993a8 --- /dev/null +++ b/content/pages/examples/django/django-utils-cache-cc-delim-re.markdown @@ -0,0 +1,122 @@ +title: django.utils.cache cc_delim_re Example Code +category: page +slug: django-utils-cache-cc-delim-re-examples +sortorder: 500011425 +toc: False +sidebartitle: django.utils.cache cc_delim_re +meta: Python example code for the cc_delim_re callable from the django.utils.cache module of the Django project. + + +cc_delim_re is a callable within the django.utils.cache module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / views.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./views.py) + +```python +# views.py +from django.conf import settings +from django.core.exceptions import PermissionDenied +from django.db import connection, models, transaction +from django.http import Http404 +from django.http.response import HttpResponseBase +~~from django.utils.cache import cc_delim_re, patch_vary_headers +from django.utils.encoding import smart_str +from django.views.decorators.csrf import csrf_exempt +from django.views.generic import View + +from rest_framework import exceptions, status +from rest_framework.request import Request +from rest_framework.response import Response +from rest_framework.schemas import DefaultSchema +from rest_framework.settings import api_settings +from rest_framework.utils import formatting + + +def get_view_name(view): + name = getattr(view, 'name', None) + if name is not None: + return name + + name = view.__class__.__name__ + name = formatting.remove_trailing_string(name, 'View') + name = formatting.remove_trailing_string(name, 'ViewSet') + name = formatting.camelcase_to_spaces(name) + + suffix = getattr(view, 'suffix', None) + if suffix: + + +## ... source file abbreviated to get to cc_delim_re examples ... + + + version, scheme = self.determine_version(request, *args, **kwargs) + request.version, request.versioning_scheme = version, scheme + + self.perform_authentication(request) + self.check_permissions(request) + self.check_throttles(request) + + def finalize_response(self, request, response, *args, **kwargs): + assert isinstance(response, HttpResponseBase), ( + 'Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` ' + 'to be returned from the view, but received a `%s`' + % type(response) + ) + + if isinstance(response, Response): + if not getattr(request, 'accepted_renderer', None): + neg = self.perform_content_negotiation(request, force=True) + request.accepted_renderer, request.accepted_media_type = neg + + response.accepted_renderer = request.accepted_renderer + response.accepted_media_type = request.accepted_media_type + response.renderer_context = self.get_renderer_context() + + vary_headers = self.headers.pop('Vary', None) + if vary_headers is not None: +~~ patch_vary_headers(response, cc_delim_re.split(vary_headers)) + + for key, value in self.headers.items(): + response[key] = value + + return response + + def handle_exception(self, exc): + if isinstance(exc, (exceptions.NotAuthenticated, + exceptions.AuthenticationFailed)): + auth_header = self.get_authenticate_header(self.request) + + if auth_header: + exc.auth_header = auth_header + else: + exc.status_code = status.HTTP_403_FORBIDDEN + + exception_handler = self.get_exception_handler() + + context = self.get_exception_handler_context() + response = exception_handler(exc, context) + + if response is None: + self.raise_uncaught_exception(exc) + + + +## ... source file continues with no further cc_delim_re examples... + +``` + diff --git a/content/pages/examples/django/django-utils-cache-patch-cache-control.markdown b/content/pages/examples/django/django-utils-cache-patch-cache-control.markdown new file mode 100644 index 000000000..d88446628 --- /dev/null +++ b/content/pages/examples/django/django-utils-cache-patch-cache-control.markdown @@ -0,0 +1,227 @@ +title: django.utils.cache patch_cache_control Example Code +category: page +slug: django-utils-cache-patch-cache-control-examples +sortorder: 500011426 +toc: False +sidebartitle: django.utils.cache patch_cache_control +meta: Python example code for the patch_cache_control callable from the django.utils.cache module of the Django project. + + +patch_cache_control is a callable within the django.utils.cache module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / views.py**](https://github.com/divio/django-cms/blob/develop/cms/./views.py) + +```python +# views.py + +from django.conf import settings +from django.contrib.auth import REDIRECT_FIELD_NAME, login as auth_login +from django.contrib.auth.views import redirect_to_login +from django.http import HttpResponse, HttpResponseRedirect +from django.urls import reverse +~~from django.utils.cache import patch_cache_control +from django.utils.http import is_safe_url, urlquote +from django.utils.timezone import now +from django.utils.translation import get_language_from_request +from django.views.decorators.http import require_POST + +from cms.cache.page import get_page_cache +from cms.exceptions import LanguageError +from cms.forms.login import CMSToolbarLoginForm +from cms.models.pagemodel import TreeNode +from cms.page_rendering import _handle_no_page, render_page, render_object_structure, _render_welcome_page +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils import get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import (get_fallback_languages, get_public_languages, + get_redirect_on_fallback, get_language_list, + get_default_language_for_site, + is_language_prefix_patterns_used) +from cms.utils.page import get_page_from_request +from cms.utils.page_permissions import user_can_change_page + + +def _clean_redirect_url(redirect_url, language): + if (redirect_url and is_language_prefix_patterns_used() and redirect_url[0] == "/" + and not redirect_url.startswith('/%s/' % language)): + redirect_url = "/%s/%s" % (language, redirect_url.lstrip("/")) + return redirect_url + + +def details(request, slug): + response_timestamp = now() + if get_cms_setting("PAGE_CACHE") and ( + not hasattr(request, 'toolbar') or ( + not request.toolbar.edit_mode_active and + not request.toolbar.show_toolbar and + not request.user.is_authenticated + ) + ): + cache_content = get_page_cache(request) + if cache_content is not None: + content, headers, expires_datetime = cache_content + response = HttpResponse(content) + response.xframe_options_exempt = True + response._headers = headers + max_age = int( + (expires_datetime - response_timestamp).total_seconds() + 0.5) +~~ patch_cache_control(response, max_age=max_age) + return response + + site = get_current_site() + page = get_page_from_request(request, use_path=slug) + toolbar = get_toolbar_from_request(request) + tree_nodes = TreeNode.objects.get_for_site(site) + + if not page and not slug and not tree_nodes.exists(): + return _render_welcome_page(request) + + if not page: + _handle_no_page(request) + + request.current_page = page + + if hasattr(request, 'user') and request.user.is_staff: + user_languages = get_language_list(site_id=site.pk) + else: + user_languages = get_public_languages(site_id=site.pk) + + request_language = get_language_from_request(request, check_path=True) + + if not page.is_home and request_language not in user_languages: + return _handle_no_page(request) + + +## ... source file continues with no further patch_cache_control examples... + +``` + + +## Example 2 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/models.py) + +```python +# models.py +import json +import logging +from collections import defaultdict +from io import StringIO +from urllib.parse import urlparse + +from django.conf import settings +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core import checks +from django.core.cache import cache +from django.core.exceptions import ValidationError +from django.core.handlers.base import BaseHandler +from django.core.handlers.wsgi import WSGIRequest +from django.db import models, transaction +from django.db.models import Case, Q, Value, When +from django.db.models.functions import Concat, Lower, Substr +from django.http import Http404 +from django.http.request import split_domain_port +from django.template.response import TemplateResponse +from django.urls import NoReverseMatch, reverse +from django.utils import timezone +~~from django.utils.cache import patch_cache_control +from django.utils.functional import cached_property +from django.utils.text import capfirst, slugify +from django.utils.translation import gettext_lazy as _ +from modelcluster.models import ( + ClusterableModel, get_all_child_m2m_relations, get_all_child_relations) +from treebeard.mp_tree import MP_Node + +from wagtail.core.query import PageQuerySet, TreeQuerySet +from wagtail.core.signals import page_published, page_unpublished, post_page_move, pre_page_move +from wagtail.core.sites import get_site_for_hostname +from wagtail.core.url_routing import RouteResult +from wagtail.core.utils import WAGTAIL_APPEND_SLASH, camelcase_to_underscore, resolve_model_string +from wagtail.search import index + + +logger = logging.getLogger('wagtail.core') + +PAGE_TEMPLATE_VAR = 'page' + + +class SiteManager(models.Manager): + def get_queryset(self): + return super(SiteManager, self).get_queryset().order_by(Lower("hostname")) + + + +## ... source file abbreviated to get to patch_cache_control examples ... + + + + def _get_dummy_header_url(self, original_request=None): + return self.full_url + + DEFAULT_PREVIEW_MODES = [('', _('Default'))] + + @property + def preview_modes(self): + return Page.DEFAULT_PREVIEW_MODES + + @property + def default_preview_mode(self): + return self.preview_modes[0][0] + + def is_previewable(self): + page = self + if page.specific_class.preview_modes != type(page).preview_modes: + page = page.specific + + return bool(page.preview_modes) + + def serve_preview(self, request, mode_name): + request.is_preview = True + + response = self.serve(request) +~~ patch_cache_control(response, private=True) + return response + + def get_cached_paths(self): + return ['/'] + + def get_sitemap_urls(self, request=None): + return [ + { + 'location': self.get_full_url(request), + 'lastmod': (self.last_published_at or self.latest_revision_created_at), + } + ] + + def get_static_site_paths(self): + yield '/' + + for child in self.get_children().live(): + for path in child.specific.get_static_site_paths(): + yield '/' + child.slug + path + + def get_ancestors(self, inclusive=False): + return Page.objects.ancestor_of(self, inclusive) + + def get_descendants(self, inclusive=False): + + +## ... source file continues with no further patch_cache_control examples... + +``` + diff --git a/content/pages/examples/django/django-utils-cache-patch-response-headers.markdown b/content/pages/examples/django/django-utils-cache-patch-response-headers.markdown new file mode 100644 index 000000000..ff959e180 --- /dev/null +++ b/content/pages/examples/django/django-utils-cache-patch-response-headers.markdown @@ -0,0 +1,116 @@ +title: django.utils.cache patch_response_headers Example Code +category: page +slug: django-utils-cache-patch-response-headers-examples +sortorder: 500011427 +toc: False +sidebartitle: django.utils.cache patch_response_headers +meta: Python example code for the patch_response_headers callable from the django.utils.cache module of the Django project. + + +patch_response_headers is a callable within the django.utils.cache module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / cache / page.py**](https://github.com/divio/django-cms/blob/develop/cms/cache/page.py) + +```python +# page.py + +import hashlib + +from datetime import timedelta + +from django.conf import settings +~~from django.utils.cache import add_never_cache_headers, patch_response_headers, patch_vary_headers +from django.utils.encoding import iri_to_uri +from django.utils.timezone import now + +from cms.cache import _get_cache_version, _set_cache_version, _get_cache_key +from cms.constants import EXPIRE_NOW, MAX_EXPIRATION_TTL +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils.conf import get_cms_setting +from cms.utils.helpers import get_timezone_name + + +def _page_cache_key(request): + cache_key = "%s:%d:%s" % ( + get_cms_setting("CACHE_PREFIX"), + settings.SITE_ID, + hashlib.sha1(iri_to_uri(request.get_full_path()).encode('utf-8')).hexdigest() + ) + if settings.USE_TZ: + cache_key += '.%s' % get_timezone_name() + return cache_key + + +def set_page_cache(response): + from django.core.cache import cache + + + +## ... source file abbreviated to get to patch_response_headers examples ... + + + + timestamp = now() + + placeholders = toolbar.content_renderer.get_rendered_placeholders() + placeholder_ttl_list = [] + vary_cache_on_set = set() + for ph in placeholders: + ttl = ph.get_cache_expiration(request, timestamp) + vary_cache_on = ph.get_vary_cache_on(request) + + placeholder_ttl_list.append(ttl) + if ttl and vary_cache_on: + vary_cache_on_set |= set(vary_cache_on) + + if EXPIRE_NOW not in placeholder_ttl_list: + if placeholder_ttl_list: + min_placeholder_ttl = min(x for x in placeholder_ttl_list) + else: + min_placeholder_ttl = MAX_EXPIRATION_TTL + ttl = min( + get_cms_setting('CACHE_DURATIONS')['content'], + min_placeholder_ttl + ) + + if ttl > 0: +~~ patch_response_headers(response, cache_timeout=ttl) + patch_vary_headers(response, sorted(vary_cache_on_set)) + + version = _get_cache_version() + expires_datetime = timestamp + timedelta(seconds=ttl) + cache.set( + _page_cache_key(request), + ( + response.content, + response._headers, + expires_datetime, + ), + ttl, + version=version + ) + _set_cache_version(version) + return response + + +def get_page_cache(request): + from django.core.cache import cache + return cache.get(_page_cache_key(request), version=_get_cache_version()) + + +def get_xframe_cache(page): + + +## ... source file continues with no further patch_response_headers examples... + +``` + diff --git a/content/pages/examples/django/django-utils-cache-patch-vary-headers.markdown b/content/pages/examples/django/django-utils-cache-patch-vary-headers.markdown new file mode 100644 index 000000000..7e54d16b8 --- /dev/null +++ b/content/pages/examples/django/django-utils-cache-patch-vary-headers.markdown @@ -0,0 +1,373 @@ +title: django.utils.cache patch_vary_headers Example Code +category: page +slug: django-utils-cache-patch-vary-headers-examples +sortorder: 500011428 +toc: False +sidebartitle: django.utils.cache patch_vary_headers +meta: Python example code for the patch_vary_headers callable from the django.utils.cache module of the Django project. + + +patch_vary_headers is a callable within the django.utils.cache module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / cache / page.py**](https://github.com/divio/django-cms/blob/develop/cms/cache/page.py) + +```python +# page.py + +import hashlib + +from datetime import timedelta + +from django.conf import settings +~~from django.utils.cache import add_never_cache_headers, patch_response_headers, patch_vary_headers +from django.utils.encoding import iri_to_uri +from django.utils.timezone import now + +from cms.cache import _get_cache_version, _set_cache_version, _get_cache_key +from cms.constants import EXPIRE_NOW, MAX_EXPIRATION_TTL +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils.conf import get_cms_setting +from cms.utils.helpers import get_timezone_name + + +def _page_cache_key(request): + cache_key = "%s:%d:%s" % ( + get_cms_setting("CACHE_PREFIX"), + settings.SITE_ID, + hashlib.sha1(iri_to_uri(request.get_full_path()).encode('utf-8')).hexdigest() + ) + if settings.USE_TZ: + cache_key += '.%s' % get_timezone_name() + return cache_key + + +def set_page_cache(response): + from django.core.cache import cache + + + +## ... source file abbreviated to get to patch_vary_headers examples ... + + + timestamp = now() + + placeholders = toolbar.content_renderer.get_rendered_placeholders() + placeholder_ttl_list = [] + vary_cache_on_set = set() + for ph in placeholders: + ttl = ph.get_cache_expiration(request, timestamp) + vary_cache_on = ph.get_vary_cache_on(request) + + placeholder_ttl_list.append(ttl) + if ttl and vary_cache_on: + vary_cache_on_set |= set(vary_cache_on) + + if EXPIRE_NOW not in placeholder_ttl_list: + if placeholder_ttl_list: + min_placeholder_ttl = min(x for x in placeholder_ttl_list) + else: + min_placeholder_ttl = MAX_EXPIRATION_TTL + ttl = min( + get_cms_setting('CACHE_DURATIONS')['content'], + min_placeholder_ttl + ) + + if ttl > 0: + patch_response_headers(response, cache_timeout=ttl) +~~ patch_vary_headers(response, sorted(vary_cache_on_set)) + + version = _get_cache_version() + expires_datetime = timestamp + timedelta(seconds=ttl) + cache.set( + _page_cache_key(request), + ( + response.content, + response._headers, + expires_datetime, + ), + ttl, + version=version + ) + _set_cache_version(version) + return response + + +def get_page_cache(request): + from django.core.cache import cache + return cache.get(_page_cache_key(request), version=_get_cache_version()) + + +def get_xframe_cache(page): + from django.core.cache import cache + + +## ... source file continues with no further patch_vary_headers examples... + +``` + + +## Example 2 from django-cors-headers +[django-cors-headers](https://github.com/ottoyiu/django-cors-headers) +is an +[open source](https://github.com/ottoyiu/django-cors-headers/blob/master/LICENSE) +library for enabling +[Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) +handling in your [Django](/django.html) web applications and appropriately +dealing with HTTP headers for CORS requests. + +[**django-cors-headers / src/corsheaders / middleware.py**](https://github.com/ottoyiu/django-cors-headers/blob/master/src/corsheaders/./middleware.py) + +```python +# middleware.py +import re +from urllib.parse import urlparse + +from django import http +~~from django.utils.cache import patch_vary_headers +from django.utils.deprecation import MiddlewareMixin + +from corsheaders.conf import conf +from corsheaders.signals import check_request_enabled + +ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin" +ACCESS_CONTROL_EXPOSE_HEADERS = "Access-Control-Expose-Headers" +ACCESS_CONTROL_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials" +ACCESS_CONTROL_ALLOW_HEADERS = "Access-Control-Allow-Headers" +ACCESS_CONTROL_ALLOW_METHODS = "Access-Control-Allow-Methods" +ACCESS_CONTROL_MAX_AGE = "Access-Control-Max-Age" + + +class CorsPostCsrfMiddleware(MiddlewareMixin): + def _https_referer_replace_reverse(self, request): + if conf.CORS_REPLACE_HTTPS_REFERER and "ORIGINAL_HTTP_REFERER" in request.META: + http_referer = request.META["ORIGINAL_HTTP_REFERER"] + request.META["HTTP_REFERER"] = http_referer + del request.META["ORIGINAL_HTTP_REFERER"] + + def process_request(self, request): + self._https_referer_replace_reverse(request) + return None + + + +## ... source file abbreviated to get to patch_vary_headers examples ... + + + if request._cors_enabled: + if conf.CORS_REPLACE_HTTPS_REFERER: + self._https_referer_replace(request) + + if ( + request.method == "OPTIONS" + and "HTTP_ACCESS_CONTROL_REQUEST_METHOD" in request.META + ): + response = http.HttpResponse() + response["Content-Length"] = "0" + return response + + def process_view(self, request, callback, callback_args, callback_kwargs): + if request._cors_enabled and conf.CORS_REPLACE_HTTPS_REFERER: + self._https_referer_replace(request) + return None + + def process_response(self, request, response): + enabled = getattr(request, "_cors_enabled", None) + if enabled is None: + enabled = self.is_enabled(request) + + if not enabled: + return response + +~~ patch_vary_headers(response, ["Origin"]) + + origin = request.META.get("HTTP_ORIGIN") + if not origin: + return response + + url = urlparse(origin) + + if conf.CORS_ALLOW_CREDENTIALS: + response[ACCESS_CONTROL_ALLOW_CREDENTIALS] = "true" + + if ( + not conf.CORS_ORIGIN_ALLOW_ALL + and not self.origin_found_in_white_lists(origin, url) + and not self.check_signal(request) + ): + return response + + if conf.CORS_ORIGIN_ALLOW_ALL and not conf.CORS_ALLOW_CREDENTIALS: + response[ACCESS_CONTROL_ALLOW_ORIGIN] = "*" + else: + response[ACCESS_CONTROL_ALLOW_ORIGIN] = origin + + if len(conf.CORS_EXPOSE_HEADERS): + response[ACCESS_CONTROL_EXPOSE_HEADERS] = ", ".join( + + +## ... source file continues with no further patch_vary_headers examples... + +``` + + +## Example 3 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / middleware.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./middleware.py) + +```python +# middleware.py +from django.contrib.auth import authenticate +~~from django.utils.cache import patch_vary_headers +from django.utils.deprecation import MiddlewareMixin + + +class OAuth2TokenMiddleware(MiddlewareMixin): + + def process_request(self, request): + if request.META.get("HTTP_AUTHORIZATION", "").startswith("Bearer"): + if not hasattr(request, "user") or request.user.is_anonymous: + user = authenticate(request=request) + if user: + request.user = request._cached_user = user + + def process_response(self, request, response): +~~ patch_vary_headers(response, ("Authorization",)) + return response + + + +## ... source file continues with no further patch_vary_headers examples... + +``` + + +## Example 4 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / views.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./views.py) + +```python +# views.py +from django.conf import settings +from django.core.exceptions import PermissionDenied +from django.db import connection, models, transaction +from django.http import Http404 +from django.http.response import HttpResponseBase +~~from django.utils.cache import cc_delim_re, patch_vary_headers +from django.utils.encoding import smart_str +from django.views.decorators.csrf import csrf_exempt +from django.views.generic import View + +from rest_framework import exceptions, status +from rest_framework.request import Request +from rest_framework.response import Response +from rest_framework.schemas import DefaultSchema +from rest_framework.settings import api_settings +from rest_framework.utils import formatting + + +def get_view_name(view): + name = getattr(view, 'name', None) + if name is not None: + return name + + name = view.__class__.__name__ + name = formatting.remove_trailing_string(name, 'View') + name = formatting.remove_trailing_string(name, 'ViewSet') + name = formatting.camelcase_to_spaces(name) + + suffix = getattr(view, 'suffix', None) + if suffix: + + +## ... source file abbreviated to get to patch_vary_headers examples ... + + + version, scheme = self.determine_version(request, *args, **kwargs) + request.version, request.versioning_scheme = version, scheme + + self.perform_authentication(request) + self.check_permissions(request) + self.check_throttles(request) + + def finalize_response(self, request, response, *args, **kwargs): + assert isinstance(response, HttpResponseBase), ( + 'Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` ' + 'to be returned from the view, but received a `%s`' + % type(response) + ) + + if isinstance(response, Response): + if not getattr(request, 'accepted_renderer', None): + neg = self.perform_content_negotiation(request, force=True) + request.accepted_renderer, request.accepted_media_type = neg + + response.accepted_renderer = request.accepted_renderer + response.accepted_media_type = request.accepted_media_type + response.renderer_context = self.get_renderer_context() + + vary_headers = self.headers.pop('Vary', None) + if vary_headers is not None: +~~ patch_vary_headers(response, cc_delim_re.split(vary_headers)) + + for key, value in self.headers.items(): + response[key] = value + + return response + + def handle_exception(self, exc): + if isinstance(exc, (exceptions.NotAuthenticated, + exceptions.AuthenticationFailed)): + auth_header = self.get_authenticate_header(self.request) + + if auth_header: + exc.auth_header = auth_header + else: + exc.status_code = status.HTTP_403_FORBIDDEN + + exception_handler = self.get_exception_handler() + + context = self.get_exception_handler_context() + response = exception_handler(exc, context) + + if response is None: + self.raise_uncaught_exception(exc) + + + +## ... source file continues with no further patch_vary_headers examples... + +``` + diff --git a/content/pages/examples/django/django-utils-crypto-constant-time-compare.markdown b/content/pages/examples/django/django-utils-crypto-constant-time-compare.markdown new file mode 100644 index 000000000..0aa125c7f --- /dev/null +++ b/content/pages/examples/django/django-utils-crypto-constant-time-compare.markdown @@ -0,0 +1,50 @@ +title: django.utils.crypto constant_time_compare Example Code +category: page +slug: django-utils-crypto-constant-time-compare-examples +sortorder: 500011429 +toc: False +sidebartitle: django.utils.crypto constant_time_compare +meta: Python example code for the constant_time_compare callable from the django.utils.crypto module of the Django project. + + +constant_time_compare is a callable within the django.utils.crypto module of the Django project. + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / forms.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/forms.py) + +```python +# forms.py +from django import forms +~~from django.utils.crypto import constant_time_compare +from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy + + +class PasswordViewRestrictionForm(forms.Form): + password = forms.CharField(label=gettext_lazy("Password"), widget=forms.PasswordInput) + return_url = forms.CharField(widget=forms.HiddenInput) + + def __init__(self, *args, **kwargs): + self.restriction = kwargs.pop('instance') + super().__init__(*args, **kwargs) + + def clean_password(self): + data = self.cleaned_data['password'] +~~ if not constant_time_compare(data, self.restriction.password): + raise forms.ValidationError(_("The password you have entered is not correct. Please try again.")) + + return data + + + +## ... source file continues with no further constant_time_compare examples... + +``` + diff --git a/content/pages/examples/django/django-utils-crypto-get-random-string.markdown b/content/pages/examples/django/django-utils-crypto-get-random-string.markdown new file mode 100644 index 000000000..915d495ef --- /dev/null +++ b/content/pages/examples/django/django-utils-crypto-get-random-string.markdown @@ -0,0 +1,112 @@ +title: django.utils.crypto get_random_string Example Code +category: page +slug: django-utils-crypto-get-random-string-examples +sortorder: 500011430 +toc: False +sidebartitle: django.utils.crypto get_random_string +meta: Python example code for the get_random_string callable from the django.utils.crypto module of the Django project. + + +get_random_string is a callable within the django.utils.crypto module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / models.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/models.py) + +```python +# models.py +from __future__ import absolute_import + +from django.contrib.auth import authenticate +from django.contrib.sites.models import Site +from django.contrib.sites.shortcuts import get_current_site +from django.core.exceptions import PermissionDenied +from django.db import models +~~from django.utils.crypto import get_random_string +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +import allauth.app_settings +from allauth.account.models import EmailAddress +from allauth.account.utils import get_next_redirect_url, setup_user_email +from allauth.utils import get_user_model + +from ..utils import get_request_param +from . import app_settings, providers +from .adapter import get_adapter +from .fields import JSONField + + +class SocialAppManager(models.Manager): + def get_current(self, provider, request=None): + cache = {} + if request: + cache = getattr(request, '_socialapp_cache', {}) + request._socialapp_cache = cache + app = cache.get(provider) + if not app: + site = get_current_site(request) + app = self.get( + + +## ... source file abbreviated to get to get_random_string examples ... + + + self.token = t + except SocialToken.DoesNotExist: + self.token.account = a + self.token.save() + except SocialAccount.DoesNotExist: + pass + + def get_redirect_url(self, request): + url = self.state.get('next') + return url + + @classmethod + def state_from_request(cls, request): + state = {} + next_url = get_next_redirect_url(request) + if next_url: + state['next'] = next_url + state['process'] = get_request_param(request, 'process', 'login') + state['scope'] = get_request_param(request, 'scope', '') + state['auth_params'] = get_request_param(request, 'auth_params', '') + return state + + @classmethod + def stash_state(cls, request): + state = cls.state_from_request(request) +~~ verifier = get_random_string() + request.session['socialaccount_state'] = (state, verifier) + return verifier + + @classmethod + def unstash_state(cls, request): + if 'socialaccount_state' not in request.session: + raise PermissionDenied() + state, verifier = request.session.pop('socialaccount_state') + return state + + @classmethod + def verify_and_unstash_state(cls, request, verifier): + if 'socialaccount_state' not in request.session: + raise PermissionDenied() + state, verifier2 = request.session.pop('socialaccount_state') + if verifier != verifier2: + raise PermissionDenied() + return state + + + +## ... source file continues with no further get_random_string examples... + +``` + diff --git a/content/pages/examples/django/django-utils-datastructures-multivaluedict.markdown b/content/pages/examples/django/django-utils-datastructures-multivaluedict.markdown new file mode 100644 index 000000000..625d9fbf8 --- /dev/null +++ b/content/pages/examples/django/django-utils-datastructures-multivaluedict.markdown @@ -0,0 +1,296 @@ +title: django.utils.datastructures MultiValueDict Example Code +category: page +slug: django-utils-datastructures-multivaluedict-examples +sortorder: 500011431 +toc: False +sidebartitle: django.utils.datastructures MultiValueDict +meta: Python example code for the MultiValueDict class from the django.utils.datastructures module of the Django project. + + +MultiValueDict is a class within the django.utils.datastructures module of the Django project. + + +## Example 1 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / widgets.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./widgets.py) + +```python +# widgets.py +from collections.abc import Iterable +from copy import deepcopy +from itertools import chain +from re import search, sub + +from django import forms +from django.db.models.fields import BLANK_CHOICE_DASH +from django.forms.utils import flatatt +~~from django.utils.datastructures import MultiValueDict +from django.utils.encoding import force_str +from django.utils.http import urlencode +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _ + + +class LinkWidget(forms.Widget): + def __init__(self, attrs=None, choices=()): + super().__init__(attrs) + + self.choices = choices + + def value_from_datadict(self, data, files, name): + value = super().value_from_datadict(data, files, name) + self.data = data + return value + + def render(self, name, value, attrs=None, choices=(), renderer=None): + if not hasattr(self, 'data'): + self.data = {} + if value is None: + value = '' + final_attrs = self.build_attrs(self.attrs, extra_attrs=attrs) + output = ['' % flatatt(final_attrs)] + + +## ... source file abbreviated to get to MultiValueDict examples ... + + + if len(value) <= 1: + value = value[0] if value else '' + return super().render(name, value, attrs, renderer=renderer) + + value = [force_str(self.surrogate.format_value(v)) for v in value] + value = ','.join(list(value)) + + return self.surrogate.render(name, value, attrs, renderer=renderer) + + +class CSVWidget(BaseCSVWidget, forms.TextInput): + def __init__(self, *args, attrs=None, **kwargs): + super().__init__(*args, attrs, **kwargs) + + if attrs is not None: + self.surrogate.attrs.update(attrs) + + +class QueryArrayWidget(BaseCSVWidget, forms.TextInput): + + def value_from_datadict(self, data, files, name): +~~ if not isinstance(data, MultiValueDict): + for key, value in data.items(): + if isinstance(value, str): + data[key] = [x.strip() for x in value.rstrip(',').split(',') if x] +~~ data = MultiValueDict(data) + + values_list = data.getlist(name, data.getlist('%s[]' % name)) or [] + + if len(values_list) > 0: + ret = [x for x in values_list if x] + else: + ret = [] + + return list(set(ret)) + + def render(self, name, value, attrs=None, renderer=None): + if not self._isiterable(value): + value = [value] + + + +## ... source file continues with no further MultiValueDict examples... + +``` + + +## Example 2 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / compat.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./compat.py) + +```python +# compat.py +from contextlib import contextmanager + +import django +from django.template import Context +~~from django.utils.datastructures import MultiValueDict + +MULTIVALUE_DICT_TYPES = (MultiValueDict,) + + +REQUIRED_CONTEXT_ATTRIBTUES = ( + '_form_config', + '_form_render', +) + + +class DictContext(dict): + pass + + +if django.VERSION < (1, 8): + def get_template(context, template_name): + from django.template.loader import get_template + return get_template(template_name) + + def get_context(context): + if not isinstance(context, Context): + context = Context(context) + return context + + + +## ... source file continues with no further MultiValueDict examples... + +``` + + +## Example 3 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / request.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./request.py) + +```python +# request.py +import io +import sys +from contextlib import contextmanager + +from django.conf import settings +from django.http import HttpRequest, QueryDict +from django.http.multipartparser import parse_header +from django.http.request import RawPostDataException +~~from django.utils.datastructures import MultiValueDict + +from rest_framework import HTTP_HEADER_ENCODING, exceptions +from rest_framework.settings import api_settings + + +def is_form_media_type(media_type): + base_media_type, params = parse_header(media_type.encode(HTTP_HEADER_ENCODING)) + return (base_media_type == 'application/x-www-form-urlencoded' or + base_media_type == 'multipart/form-data') + + +class override_method: + + def __init__(self, view, request, method): + self.view = view + self.request = request + self.method = method + self.action = getattr(view, 'action', None) + + def __enter__(self): + self.view.request = clone_request(self.request, self.method) + action_map = getattr(self.view, 'action_map', {}) + self.view.action = action_map.get(self.method.lower()) + return self.view.request + + +## ... source file abbreviated to get to MultiValueDict examples ... + + + self._stream = io.BytesIO(self.body) + + def _supports_form_parsing(self): + form_media = ( + 'application/x-www-form-urlencoded', + 'multipart/form-data' + ) + return any([parser.media_type in form_media for parser in self.parsers]) + + def _parse(self): + media_type = self.content_type + try: + stream = self.stream + except RawPostDataException: + if not hasattr(self._request, '_post'): + raise + if self._supports_form_parsing(): + return (self._request.POST, self._request.FILES) + stream = None + + if stream is None or media_type is None: + if media_type and is_form_media_type(media_type): + empty_data = QueryDict('', encoding=self._request._encoding) + else: + empty_data = {} +~~ empty_files = MultiValueDict() + return (empty_data, empty_files) + + parser = self.negotiator.select_parser(self, self.parsers) + + if not parser: + raise exceptions.UnsupportedMediaType(media_type) + + try: + parsed = parser.parse(stream, media_type, self.parser_context) + except Exception: + self._data = QueryDict('', encoding=self._request._encoding) +~~ self._files = MultiValueDict() + self._full_data = self._data + raise + + try: + return (parsed.data, parsed.files) + except AttributeError: +~~ empty_files = MultiValueDict() + return (parsed, empty_files) + + def _authenticate(self): + for authenticator in self.authenticators: + try: + user_auth_tuple = authenticator.authenticate(self) + except exceptions.APIException: + self._not_authenticated() + raise + + if user_auth_tuple is not None: + self._authenticator = authenticator + self.user, self.auth = user_auth_tuple + return + + self._not_authenticated() + + def _not_authenticated(self): + self._authenticator = None + + if api_settings.UNAUTHENTICATED_USER: + self.user = api_settings.UNAUTHENTICATED_USER() + else: + self.user = None + + +## ... source file continues with no further MultiValueDict examples... + +``` + diff --git a/content/pages/examples/django/django-utils-dateformat.markdown b/content/pages/examples/django/django-utils-dateformat.markdown new file mode 100644 index 000000000..fd397aed3 --- /dev/null +++ b/content/pages/examples/django/django-utils-dateformat.markdown @@ -0,0 +1,176 @@ +title: django.utils dateformat Example Code +category: page +slug: django-utils-dateformat-examples +sortorder: 500011415 +toc: False +sidebartitle: django.utils dateformat +meta: Python example code for the dateformat callable from the django.utils module of the Django project. + + +dateformat is a callable within the django.utils module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog_tests / tests.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog_tests/tests.py) + +```python +# tests.py +import datetime +import django +from django.conf import settings +from django.contrib import auth +from django.contrib.auth.models import User, AnonymousUser +from django.core.exceptions import ValidationError +from django.db.models.signals import pre_save +from django.http import HttpResponse +from django.test import TestCase, RequestFactory +~~from django.utils import dateformat, formats, timezone +from dateutil.tz import gettz + +from auditlog.middleware import AuditlogMiddleware +from auditlog.models import LogEntry +from auditlog.registry import auditlog +from auditlog_tests.models import SimpleModel, AltPrimaryKeyModel, UUIDPrimaryKeyModel, \ + ProxyModel, SimpleIncludeModel, SimpleExcludeModel, SimpleMappingModel, RelatedModel, \ + ManyRelatedModel, AdditionalDataIncludedModel, DateTimeFieldModel, ChoicesFieldModel, \ + CharfieldTextfieldModel, PostgresArrayFieldModel, NoDeleteHistoryModel +from auditlog import compat + + +class SimpleModelTest(TestCase): + def setUp(self): + self.obj = SimpleModel.objects.create(text='I am not difficult.') + + def test_create(self): + obj = self.obj + + self.assertTrue(obj.history.count() == 1, msg="There is one log entry") + + try: + history = obj.history.get() + except obj.history.DoesNotExist: + + +## ... source file abbreviated to get to dateformat examples ... + + + + self.assertTrue(dtm.history.count() == 2, msg="There are two log entries") + + def test_model_with_different_time_and_timezone(self): + timestamp = datetime.datetime(2017, 1, 10, 12, 0, tzinfo=timezone.utc) + date = datetime.date(2017, 1, 10) + time = datetime.time(12, 0) + dtm = DateTimeFieldModel(label='DateTimeField model', timestamp=timestamp, date=date, time=time, naive_dt=self.now) + dtm.save() + self.assertTrue(dtm.history.count() == 1, msg="There is one log entry") + + timestamp = datetime.datetime(2017, 1, 10, 14, 0, tzinfo=self.utc_plus_one) + dtm.timestamp = timestamp + dtm.save() + + self.assertTrue(dtm.history.count() == 2, msg="There are two log entries") + + def test_changes_display_dict_datetime(self): + timestamp = datetime.datetime(2017, 1, 10, 15, 0, tzinfo=timezone.utc) + date = datetime.date(2017, 1, 10) + time = datetime.time(12, 0) + dtm = DateTimeFieldModel(label='DateTimeField model', timestamp=timestamp, date=date, time=time, naive_dt=self.now) + dtm.save() + localized_timestamp = timestamp.astimezone(gettz(settings.TIME_ZONE)) + self.assertTrue(dtm.history.latest().changes_display_dict["timestamp"][1] == \ +~~ dateformat.format(localized_timestamp, settings.DATETIME_FORMAT), + msg=("The datetime should be formatted according to Django's settings for" + " DATETIME_FORMAT")) + timestamp = timezone.now() + dtm.timestamp = timestamp + dtm.save() + localized_timestamp = timestamp.astimezone(gettz(settings.TIME_ZONE)) + self.assertTrue(dtm.history.latest().changes_display_dict["timestamp"][1] == \ +~~ dateformat.format(localized_timestamp, settings.DATETIME_FORMAT), + msg=("The datetime should be formatted according to Django's settings for" + " DATETIME_FORMAT")) + + with self.settings(USE_L10N=True, LANGUAGE_CODE='en-GB'): + self.assertTrue(dtm.history.latest().changes_display_dict["timestamp"][1] == \ + formats.localize(localized_timestamp), + msg=("The datetime should be formatted according to Django's settings for" + " USE_L10N is True with a different LANGUAGE_CODE.")) + + + def test_changes_display_dict_date(self): + timestamp = datetime.datetime(2017, 1, 10, 15, 0, tzinfo=timezone.utc) + date = datetime.date(2017, 1, 10) + time = datetime.time(12, 0) + dtm = DateTimeFieldModel(label='DateTimeField model', timestamp=timestamp, date=date, time=time, naive_dt=self.now) + dtm.save() + self.assertTrue(dtm.history.latest().changes_display_dict["date"][1] == \ +~~ dateformat.format(date, settings.DATE_FORMAT), + msg=("The date should be formatted according to Django's settings for" + " DATE_FORMAT unless USE_L10N is True.")) + date = datetime.date(2017, 1, 11) + dtm.date = date + dtm.save() + self.assertTrue(dtm.history.latest().changes_display_dict["date"][1] == \ +~~ dateformat.format(date, settings.DATE_FORMAT), + msg=("The date should be formatted according to Django's settings for" + " DATE_FORMAT unless USE_L10N is True.")) + + with self.settings(USE_L10N=True, LANGUAGE_CODE='en-GB'): + self.assertTrue(dtm.history.latest().changes_display_dict["date"][1] == \ + formats.localize(date), + msg=("The date should be formatted according to Django's settings for" + " USE_L10N is True with a different LANGUAGE_CODE.")) + + def test_changes_display_dict_time(self): + timestamp = datetime.datetime(2017, 1, 10, 15, 0, tzinfo=timezone.utc) + date = datetime.date(2017, 1, 10) + time = datetime.time(12, 0) + dtm = DateTimeFieldModel(label='DateTimeField model', timestamp=timestamp, date=date, time=time, naive_dt=self.now) + dtm.save() + self.assertTrue(dtm.history.latest().changes_display_dict["time"][1] == \ +~~ dateformat.format(time, settings.TIME_FORMAT), + msg=("The time should be formatted according to Django's settings for" + " TIME_FORMAT unless USE_L10N is True.")) + time = datetime.time(6, 0) + dtm.time = time + dtm.save() + self.assertTrue(dtm.history.latest().changes_display_dict["time"][1] == \ +~~ dateformat.format(time, settings.TIME_FORMAT), + msg=("The time should be formatted according to Django's settings for" + " TIME_FORMAT unless USE_L10N is True.")) + + with self.settings(USE_L10N=True, LANGUAGE_CODE='en-GB'): + self.assertTrue(dtm.history.latest().changes_display_dict["time"][1] == \ + formats.localize(time), + msg=("The time should be formatted according to Django's settings for" + " USE_L10N is True with a different LANGUAGE_CODE.")) + + def test_update_naive_dt(self): + timestamp = datetime.datetime(2017, 1, 10, 15, 0, tzinfo=timezone.utc) + date = datetime.date(2017, 1, 10) + time = datetime.time(12, 0) + dtm = DateTimeFieldModel(label='DateTimeField model', timestamp=timestamp, date=date, time=time, naive_dt=self.now) + dtm.save() + + dtm.naive_dt = timezone.make_naive(timezone.now(), timezone=timezone.utc) + dtm.save() + + +class UnregisterTest(TestCase): + def setUp(self): + auditlog.unregister(SimpleModel) + self.obj = SimpleModel.objects.create(text='No history') + + +## ... source file continues with no further dateformat examples... + +``` + diff --git a/content/pages/examples/django/django-utils-dateparse-parse-datetime.markdown b/content/pages/examples/django/django-utils-dateparse-parse-datetime.markdown new file mode 100644 index 000000000..c78d152f1 --- /dev/null +++ b/content/pages/examples/django/django-utils-dateparse-parse-datetime.markdown @@ -0,0 +1,116 @@ +title: django.utils.dateparse parse_datetime Example Code +category: page +slug: django-utils-dateparse-parse-datetime-examples +sortorder: 500011432 +toc: False +sidebartitle: django.utils.dateparse parse_datetime +meta: Python example code for the parse_datetime callable from the django.utils.dateparse module of the Django project. + + +parse_datetime is a callable within the django.utils.dateparse module of the Django project. + + +## Example 1 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / fields.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./fields.py) + +```python +# fields.py +from collections import namedtuple +from datetime import datetime, time + +from django import forms +~~from django.utils.dateparse import parse_datetime +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +from .conf import settings +from .constants import EMPTY_VALUES +from .utils import handle_timezone +from .widgets import ( + BaseCSVWidget, + CSVWidget, + DateRangeWidget, + LookupChoiceWidget, + RangeWidget +) + + +class RangeField(forms.MultiValueField): + widget = RangeWidget + + def __init__(self, fields=None, *args, **kwargs): + if fields is None: + fields = ( + forms.DecimalField(), + forms.DecimalField()) + super().__init__(fields, *args, **kwargs) + + +## ... source file abbreviated to get to parse_datetime examples ... + + + kwargs['widget'] = widget + kwargs['help_text'] = field.help_text + super().__init__(fields, *args, **kwargs) + + def compress(self, data_list): + if len(data_list) == 2: + value, lookup_expr = data_list + if value not in EMPTY_VALUES: + if lookup_expr not in EMPTY_VALUES: + return Lookup(value=value, lookup_expr=lookup_expr) + else: + raise forms.ValidationError( + self.error_messages['lookup_required'], + code='lookup_required') + return None + + +class IsoDateTimeField(forms.DateTimeField): + ISO_8601 = 'iso-8601' + input_formats = [ISO_8601] + + def strptime(self, value, format): + value = force_str(value) + + if format == self.ISO_8601: +~~ parsed = parse_datetime(value) + if parsed is None: # Continue with other formats if doesn't match + raise ValueError + return handle_timezone(parsed) + return super().strptime(value, format) + + +class BaseCSVField(forms.Field): + base_widget_class = BaseCSVWidget + + def __init__(self, *args, **kwargs): + widget = kwargs.get('widget') or self.widget + kwargs['widget'] = self._get_widget_class(widget) + + super().__init__(*args, **kwargs) + + def _get_widget_class(self, widget): + if isinstance(widget, BaseCSVWidget) or ( + isinstance(widget, type) and + issubclass(widget, BaseCSVWidget)): + return widget + + assert isinstance(widget, type), \ + "'%s.widget' must be a widget class, not %s." \ + % (self.__class__.__name__, repr(widget)) + + +## ... source file continues with no further parse_datetime examples... + +``` + diff --git a/content/pages/examples/django/django-utils-dateparse-parse-duration.markdown b/content/pages/examples/django/django-utils-dateparse-parse-duration.markdown new file mode 100644 index 000000000..0a959cff7 --- /dev/null +++ b/content/pages/examples/django/django-utils-dateparse-parse-duration.markdown @@ -0,0 +1,118 @@ +title: django.utils.dateparse parse_duration Example Code +category: page +slug: django-utils-dateparse-parse-duration-examples +sortorder: 500011433 +toc: False +sidebartitle: django.utils.dateparse parse_duration +meta: Python example code for the parse_duration callable from the django.utils.dateparse module of the Django project. + + +parse_duration is a callable within the django.utils.dateparse module of the Django project. + + +## Example 1 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / widgets.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./widgets.py) + +```python +# widgets.py +import json +from datetime import date, datetime +from decimal import Decimal + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.utils import datetime_safe, timezone +~~from django.utils.dateparse import parse_duration +from django.utils.encoding import force_str, smart_str + + +class Widget: + def clean(self, value, row=None, *args, **kwargs): + return value + + def render(self, value, obj=None): + return force_str(value) + + +class NumberWidget(Widget): + + def is_empty(self, value): + if isinstance(value, str): + value = value.strip() + return value is None or value == "" + + def render(self, value, obj=None): + return value + + +class FloatWidget(NumberWidget): + + + +## ... source file abbreviated to get to parse_duration examples ... + + + self.formats = formats + + def clean(self, value, row=None, *args, **kwargs): + if not value: + return None + for format in self.formats: + try: + return datetime.strptime(value, format).time() + except (ValueError, TypeError): + continue + raise ValueError("Enter a valid time.") + + def render(self, value, obj=None): + if not value: + return "" + return value.strftime(self.formats[0]) + + +class DurationWidget(Widget): + + def clean(self, value, row=None, *args, **kwargs): + if not value: + return None + + try: +~~ return parse_duration(value) + except (ValueError, TypeError): + raise ValueError("Enter a valid duration.") + + def render(self, value, obj=None): + if value is None: + return "" + return str(value) + + +class SimpleArrayWidget(Widget): + + def __init__(self, separator=None): + if separator is None: + separator = ',' + self.separator = separator + super().__init__() + + def clean(self, value, row=None, *args, **kwargs): + return value.split(self.separator) if value else [] + + def render(self, value, obj=None): + return self.separator.join(str(v) for v in value) + + + + +## ... source file continues with no further parse_duration examples... + +``` + diff --git a/content/pages/examples/django/django-utils-dateparse.markdown b/content/pages/examples/django/django-utils-dateparse.markdown new file mode 100644 index 000000000..2ff8075a8 --- /dev/null +++ b/content/pages/examples/django/django-utils-dateparse.markdown @@ -0,0 +1,138 @@ +title: django.utils dateparse Example Code +category: page +slug: django-utils-dateparse-examples +sortorder: 500011416 +toc: False +sidebartitle: django.utils dateparse +meta: Python example code for the dateparse callable from the django.utils module of the Django project. + + +dateparse is a callable within the django.utils module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / utils.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./utils.py) + +```python +# utils.py +import base64 +import importlib +import json +import random +import re +import string +import unicodedata +from collections import OrderedDict +from urllib.parse import urlsplit + +import django +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.core.serializers.json import DjangoJSONEncoder +from django.core.validators import ValidationError, validate_email +from django.db.models import FileField +from django.db.models.fields import ( + BinaryField, + DateField, + DateTimeField, + EmailField, + TimeField, +) +~~from django.utils import dateparse +from django.utils.encoding import force_bytes, force_str + + +MAX_USERNAME_SUFFIX_LENGTH = 7 +USERNAME_SUFFIX_CHARS = ( + [string.digits] * 4 + + [string.ascii_letters] * (MAX_USERNAME_SUFFIX_LENGTH - 4)) + + +def _generate_unique_username_base(txts, regex=None): + from .account.adapter import get_adapter + adapter = get_adapter() + username = None + regex = regex or r'[^\w\s@+.-]' + for txt in txts: + if not txt: + continue + username = unicodedata.normalize('NFKD', force_str(txt)) + username = username.encode('ascii', 'ignore').decode('ascii') + username = force_str(re.sub(regex, '', username).lower()) + username = username.split('@')[0] + username = username.strip() + username = re.sub(r'\s+', '_', username) + try: + + +## ... source file abbreviated to get to dateparse examples ... + + + elif isinstance(field, FileField): + if v and not isinstance(v, str): + v = v.name + try: + json.dumps(v, cls=DjangoJSONEncoder) + except TypeError: + v = field.get_prep_value(v) + k = SERIALIZED_DB_FIELD_PREFIX + k + except FieldDoesNotExist: + pass + data[k] = v + return json.loads(json.dumps(data, cls=DjangoJSONEncoder)) + + +def deserialize_instance(model, data): + ret = model() + for k, v in data.items(): + is_db_value = False + if k.startswith(SERIALIZED_DB_FIELD_PREFIX): + k = k[len(SERIALIZED_DB_FIELD_PREFIX):] + is_db_value = True + if v is not None: + try: + f = model._meta.get_field(k) + if isinstance(f, DateTimeField): +~~ v = dateparse.parse_datetime(v) + elif isinstance(f, TimeField): +~~ v = dateparse.parse_time(v) + elif isinstance(f, DateField): +~~ v = dateparse.parse_date(v) + elif isinstance(f, BinaryField): + v = force_bytes( + base64.b64decode( + force_bytes(v))) + elif is_db_value: + try: + if django.VERSION < (3, 0): + v = f.from_db_value(v, None, None, None) + else: + v = f.from_db_value(v, None, None) + except Exception: + raise ImproperlyConfigured( + "Unable to auto serialize field '{}', custom" + " serialization override required".format(k) + ) + except FieldDoesNotExist: + pass + setattr(ret, k, v) + return ret + + +def set_form_field_order(form, field_order): + if field_order is None: + return + + +## ... source file continues with no further dateparse examples... + +``` + diff --git a/content/pages/examples/django/django-utils-dates-months.markdown b/content/pages/examples/django/django-utils-dates-months.markdown new file mode 100644 index 000000000..17838edb0 --- /dev/null +++ b/content/pages/examples/django/django-utils-dates-months.markdown @@ -0,0 +1,70 @@ +title: django.utils.dates MONTHS Example Code +category: page +slug: django-utils-dates-months-examples +sortorder: 500011434 +toc: False +sidebartitle: django.utils.dates MONTHS +meta: Python example code for the MONTHS constant from the django.utils.dates module of the Django project. + + +MONTHS is a constant within the django.utils.dates module of the Django project. + + +## Example 1 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / widgets.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./widgets.py) + +```python +# widgets.py +import datetime +import re +from itertools import chain + +import django +from django import forms +from django.conf import settings +from django.forms.widgets import FILE_INPUT_CONTRADICTION +from django.template import loader +from django.utils import datetime_safe, formats +~~from django.utils.dates import MONTHS +from django.utils.encoding import force_str +from django.utils.html import conditional_escape +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ + +from .compat import MULTIVALUE_DICT_TYPES, flatten_contexts + + +from django.forms.utils import to_current_timezone + + +RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$') + + +__all__ = ( + 'TextInput', 'PasswordInput', 'HiddenInput', 'ClearableFileInput', + 'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', + 'CheckboxInput', 'Select', 'NullBooleanSelect', 'SelectMultiple', + 'RadioSelect', 'CheckboxSelectMultiple', 'SearchInput', 'RangeInput', + 'ColorInput', 'EmailInput', 'URLInput', 'PhoneNumberInput', 'NumberInput', + 'IPAddressInput', 'MultiWidget', 'Widget', 'SplitDateTimeWidget', + 'SplitHiddenDateTimeWidget', 'MultipleHiddenInput', 'SelectDateWidget', + 'SlugInput', +) + + +## ... source file continues with no further MONTHS examples... + +``` + diff --git a/content/pages/examples/django/django-utils-datetime-safe-datetime.markdown b/content/pages/examples/django/django-utils-datetime-safe-datetime.markdown new file mode 100644 index 000000000..36d4799a0 --- /dev/null +++ b/content/pages/examples/django/django-utils-datetime-safe-datetime.markdown @@ -0,0 +1,154 @@ +title: django.utils.datetime_safe datetime Example Code +category: page +slug: django-utils-datetime-safe-datetime-examples +sortorder: 500011435 +toc: False +sidebartitle: django.utils.datetime_safe datetime +meta: Python example code for the datetime callable from the django.utils.datetime_safe module of the Django project. + + +datetime is a callable within the django.utils.datetime_safe module of the Django project. + + +## Example 1 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / backends / whoosh_backend.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/backends/whoosh_backend.py) + +```python +# whoosh_backend.py +import json +import os +import re +import shutil +import threading +import warnings + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +~~from django.utils.datetime_safe import datetime +from django.utils.encoding import force_str + +from haystack.backends import ( + BaseEngine, + BaseSearchBackend, + BaseSearchQuery, + EmptyResults, + log_query, +) +from haystack.constants import ( + DJANGO_CT, + DJANGO_ID, + FUZZY_WHOOSH_MAX_EDITS, + FUZZY_WHOOSH_MIN_PREFIX, + ID, +) +from haystack.exceptions import MissingDependency, SearchBackendError, SkipDocument +from haystack.inputs import Clean, Exact, PythonData, Raw +from haystack.models import SearchResult +from haystack.utils import get_identifier, get_model_ct +from haystack.utils import log as logging +from haystack.utils.app_loading import haystack_get_model + +try: + + +## ... source file abbreviated to get to datetime examples ... + + + + if not query_string: + return spelling_suggestion + + for rev_word in self.RESERVED_WORDS: + cleaned_query = cleaned_query.replace(rev_word, "") + + for rev_char in self.RESERVED_CHARACTERS: + cleaned_query = cleaned_query.replace(rev_char, "") + + query_words = cleaned_query.split() + suggested_words = [] + + for word in query_words: + suggestions = corrector.suggest(word, limit=1) + + if len(suggestions) > 0: + suggested_words.append(suggestions[0]) + + spelling_suggestion = " ".join(suggested_words) + return spelling_suggestion + + def _from_python(self, value): + if hasattr(value, "strftime"): + if not hasattr(value, "hour"): +~~ value = datetime(value.year, value.month, value.day, 0, 0, 0) + elif isinstance(value, bool): + if value: + value = "true" + else: + value = "false" + elif isinstance(value, (list, tuple)): + value = ",".join([force_str(v) for v in value]) + elif isinstance(value, (int, float)): + pass + else: + value = force_str(value) + return value + + def _to_python(self, value): + if value == "true": + return True + elif value == "false": + return False + + if value and isinstance(value, str): + possible_datetime = DATETIME_REGEX.search(value) + + if possible_datetime: + date_values = possible_datetime.groupdict() + + for dk, dv in date_values.items(): + date_values[dk] = int(dv) + +~~ return datetime( + date_values["year"], + date_values["month"], + date_values["day"], + date_values["hour"], + date_values["minute"], + date_values["second"], + ) + + try: + converted_value = json.loads(value) + + if isinstance( + converted_value, + (list, tuple, set, dict, int, float, complex), + ): + return converted_value + except: + pass + + return value + + +class WhooshSearchQuery(BaseSearchQuery): + def _convert_datetime(self, date): + + +## ... source file continues with no further datetime examples... + +``` + diff --git a/content/pages/examples/django/django-utils-datetime-safe.markdown b/content/pages/examples/django/django-utils-datetime-safe.markdown new file mode 100644 index 000000000..2ba481e1e --- /dev/null +++ b/content/pages/examples/django/django-utils-datetime-safe.markdown @@ -0,0 +1,440 @@ +title: django.utils datetime_safe Example Code +category: page +slug: django-utils-datetime-safe-examples +sortorder: 500011417 +toc: False +sidebartitle: django.utils datetime_safe +meta: Python example code for the datetime_safe callable from the django.utils module of the Django project. + + +datetime_safe is a callable within the django.utils module of the Django project. + + +## Example 1 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / widgets.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./widgets.py) + +```python +# widgets.py +import datetime +import re +from itertools import chain + +import django +from django import forms +from django.conf import settings +from django.forms.widgets import FILE_INPUT_CONTRADICTION +from django.template import loader +~~from django.utils import datetime_safe, formats +from django.utils.dates import MONTHS +from django.utils.encoding import force_str +from django.utils.html import conditional_escape +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ + +from .compat import MULTIVALUE_DICT_TYPES, flatten_contexts + + +from django.forms.utils import to_current_timezone + + +RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$') + + +__all__ = ( + 'TextInput', 'PasswordInput', 'HiddenInput', 'ClearableFileInput', + 'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', + 'CheckboxInput', 'Select', 'NullBooleanSelect', 'SelectMultiple', + 'RadioSelect', 'CheckboxSelectMultiple', 'SearchInput', 'RangeInput', + 'ColorInput', 'EmailInput', 'URLInput', 'PhoneNumberInput', 'NumberInput', + 'IPAddressInput', 'MultiWidget', 'Widget', 'SplitDateTimeWidget', + 'SplitHiddenDateTimeWidget', 'MultipleHiddenInput', 'SelectDateWidget', + 'SlugInput', + + +## ... source file abbreviated to get to datetime_safe examples ... + + + template_name = 'floppyforms/textarea.html' + rows = 10 + cols = 40 + + def __init__(self, attrs=None): + default_attrs = {'cols': self.cols, 'rows': self.rows} + if attrs: + default_attrs.update(attrs) + super(Textarea, self).__init__(default_attrs) + + def format_value(self, value): + return conditional_escape(force_str(value)) + + +class DateInput(Input): + template_name = 'floppyforms/date.html' + input_type = 'date' + supports_microseconds = False + + def __init__(self, attrs=None, format=None): + super(DateInput, self).__init__(attrs) + self.format = '%Y-%m-%d' + + def format_value(self, value): + if hasattr(value, 'strftime'): +~~ value = datetime_safe.new_date(value) + return value.strftime(self.format) + return value + + if django.VERSION < (1, 6): + def _has_changed(self, initial, data): + try: + input_format = formats.get_format('DATE_INPUT_FORMATS')[0] + initial = datetime.datetime.strptime(initial, input_format).date() + except (TypeError, ValueError): + pass + return super(DateInput, self)._has_changed( + self._format_value(initial), data + ) + + +class DateTimeInput(Input): + template_name = 'floppyforms/datetime.html' + input_type = 'datetime' + supports_microseconds = False + + def __init__(self, attrs=None, format=None): + super(DateTimeInput, self).__init__(attrs) + if format: + self.format = format + self.manual_format = True + else: + self.format = formats.get_format('DATETIME_INPUT_FORMATS')[0] + self.manual_format = False + + def format_value(self, value): + if hasattr(value, 'strftime'): +~~ value = datetime_safe.new_datetime(value) + return value.strftime(self.format) + return value + + if django.VERSION < (1, 6): + def _has_changed(self, initial, data): + try: + input_format = formats.get_format('DATETIME_INPUT_FORMATS')[0] + initial = datetime.datetime.strptime(initial, input_format) + except (TypeError, ValueError): + pass + return super(DateTimeInput, self)._has_changed( + self._format_value(initial), data + ) + + +class TimeInput(Input): + template_name = 'floppyforms/time.html' + input_type = 'time' + supports_microseconds = False + + def __init__(self, attrs=None, format=None): + super(TimeInput, self).__init__(attrs) + if format: + self.format = format + + +## ... source file abbreviated to get to datetime_safe examples ... + + + context['day_choices'] = [(i, i) for i in range(1, 32)] + context['day_val'] = day_val + + + if self.required is False: + context['year_choices'].insert(0, self.none_value) + context['month_choices'].insert(0, self.none_value) + context['day_choices'].insert(0, self.none_value) + + return loader.render_to_string(self.template_name, context) + + def value_from_datadict(self, data, files, name): + y = data.get(self.year_field % name) + m = data.get(self.month_field % name) + d = data.get(self.day_field % name) + if y == m == d == "0": + return None + if y and m and d: + if settings.USE_L10N: + input_format = formats.get_format('DATE_INPUT_FORMATS')[0] + try: + date_value = datetime.date(int(y), int(m), int(d)) + except ValueError: + return '%s-%s-%s' % (y, m, d) + else: +~~ date_value = datetime_safe.new_date(date_value) + return date_value.strftime(input_format) + else: + return '%s-%s-%s' % (y, m, d) + return data.get(name, None) + + + +## ... source file continues with no further datetime_safe examples... + +``` + + +## Example 2 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / fields.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./fields.py) + +```python +# fields.py +import re +from inspect import ismethod + +from django.template import loader +~~from django.utils import datetime_safe + +from haystack.exceptions import SearchFieldError +from haystack.utils import get_model_ct_tuple + + +class NOT_PROVIDED: + pass + + +DATE_REGEX = re.compile( + r"^(?P\d{4})-(?P\d{2})-(?P\d{2})(?:|T00:00:00Z?)$" +) +DATETIME_REGEX = re.compile( + r"^(?P\d{4})-(?P\d{2})-(?P\d{2})(T|\s+)(?P\d{2}):(?P\d{2}):(?P\d{2}).*?$" +) + + + + +class SearchField(object): + + field_type = None + + def __init__( + + +## ... source file abbreviated to get to datetime_safe examples ... + + + + return bool(value) + + +class DateField(SearchField): + field_type = "date" + + def __init__(self, **kwargs): + if kwargs.get("facet_class") is None: + kwargs["facet_class"] = FacetDateField + + super(DateField, self).__init__(**kwargs) + + def prepare(self, obj): + return self.convert(super(DateField, self).prepare(obj)) + + def convert(self, value): + if value is None: + return None + + if isinstance(value, str): + match = DATE_REGEX.search(value) + + if match: + data = match.groupdict() +~~ return datetime_safe.date( + int(data["year"]), int(data["month"]), int(data["day"]) + ) + else: + raise SearchFieldError( + "Date provided to '%s' field doesn't appear to be a valid date string: '%s'" + % (self.instance_name, value) + ) + + return value + + +class DateTimeField(SearchField): + field_type = "datetime" + + def __init__(self, **kwargs): + if kwargs.get("facet_class") is None: + kwargs["facet_class"] = FacetDateTimeField + + super(DateTimeField, self).__init__(**kwargs) + + def prepare(self, obj): + return self.convert(super(DateTimeField, self).prepare(obj)) + + def convert(self, value): + if value is None: + return None + + if isinstance(value, str): + match = DATETIME_REGEX.search(value) + + if match: + data = match.groupdict() +~~ return datetime_safe.datetime( + int(data["year"]), + int(data["month"]), + int(data["day"]), + int(data["hour"]), + int(data["minute"]), + int(data["second"]), + ) + else: + raise SearchFieldError( + "Datetime provided to '%s' field doesn't appear to be a valid datetime string: '%s'" + % (self.instance_name, value) + ) + + return value + + +class MultiValueField(SearchField): + field_type = "string" + + def __init__(self, **kwargs): + if kwargs.get("facet_class") is None: + kwargs["facet_class"] = FacetMultiValueField + + if kwargs.get("use_template") is True: + + +## ... source file continues with no further datetime_safe examples... + +``` + + +## Example 3 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / widgets.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./widgets.py) + +```python +# widgets.py +import json +from datetime import date, datetime +from decimal import Decimal + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +~~from django.utils import datetime_safe, timezone +from django.utils.dateparse import parse_duration +from django.utils.encoding import force_str, smart_str + + +class Widget: + def clean(self, value, row=None, *args, **kwargs): + return value + + def render(self, value, obj=None): + return force_str(value) + + +class NumberWidget(Widget): + + def is_empty(self, value): + if isinstance(value, str): + value = value.strip() + return value is None or value == "" + + def render(self, value, obj=None): + return value + + +class FloatWidget(NumberWidget): + + +## ... source file abbreviated to get to datetime_safe examples ... + + + formats = ("%Y-%m-%d",) + else: + formats = settings.DATE_INPUT_FORMATS + else: + formats = (format,) + self.formats = formats + + def clean(self, value, row=None, *args, **kwargs): + if not value: + return None + if isinstance(value, date): + return value + for format in self.formats: + try: + return datetime.strptime(value, format).date() + except (ValueError, TypeError): + continue + raise ValueError("Enter a valid date.") + + def render(self, value, obj=None): + if not value: + return "" + try: + return value.strftime(self.formats[0]) + except: +~~ return datetime_safe.new_date(value).strftime(self.formats[0]) + + +class DateTimeWidget(Widget): + + def __init__(self, format=None): + if format is None: + if not settings.DATETIME_INPUT_FORMATS: + formats = ("%Y-%m-%d %H:%M:%S",) + else: + formats = settings.DATETIME_INPUT_FORMATS + else: + formats = (format,) + self.formats = formats + + def clean(self, value, row=None, *args, **kwargs): + if not value: + return None + if isinstance(value, datetime): + return value + for format in self.formats: + try: + dt = datetime.strptime(value, format) + if settings.USE_TZ: + dt = timezone.make_aware(dt, + + +## ... source file continues with no further datetime_safe examples... + +``` + diff --git a/content/pages/examples/django/django-utils-decorators-method-decorator.markdown b/content/pages/examples/django/django-utils-decorators-method-decorator.markdown new file mode 100644 index 000000000..fe75a221e --- /dev/null +++ b/content/pages/examples/django/django-utils-decorators-method-decorator.markdown @@ -0,0 +1,1193 @@ +title: django.utils.decorators method_decorator Example Code +category: page +slug: django-utils-decorators-method-decorator-examples +sortorder: 500011436 +toc: False +sidebartitle: django.utils.decorators method_decorator +meta: Python example code for the method_decorator callable from the django.utils.decorators module of the Django project. + + +method_decorator is a callable within the django.utils.decorators module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / views.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.contrib.sites.shortcuts import get_current_site +from django.http import ( + Http404, + HttpResponsePermanentRedirect, + HttpResponseRedirect, +) +from django.shortcuts import redirect +from django.urls import reverse, reverse_lazy +~~from django.utils.decorators import method_decorator +from django.views.decorators.debug import sensitive_post_parameters +from django.views.generic.base import TemplateResponseMixin, TemplateView, View +from django.views.generic.edit import FormView + +from ..exceptions import ImmediateHttpResponse +from ..utils import get_form_class, get_request_param +from . import app_settings, signals +from .adapter import get_adapter +from .forms import ( + AddEmailForm, + ChangePasswordForm, + LoginForm, + ResetPasswordForm, + ResetPasswordKeyForm, + SetPasswordForm, + SignupForm, + UserTokenForm, +) +from .models import EmailAddress, EmailConfirmation, EmailConfirmationHMAC +from .utils import ( + complete_signup, + get_login_redirect_url, + get_next_redirect_url, + logout_on_password_change, + passthrough_next_redirect_url, + perform_login, + sync_user_email_addresses, + url_str_to_user_pk, +) + + +INTERNAL_RESET_URL_KEY = "set-password" +INTERNAL_RESET_SESSION_KEY = "_password_reset_key" + + +~~sensitive_post_parameters_m = method_decorator( + sensitive_post_parameters( + 'oldpassword', 'password', 'password1', 'password2')) + + +def _ajax_response(request, response, form=None, data=None): + adapter = get_adapter(request) + if adapter.is_ajax(request): + if (isinstance(response, HttpResponseRedirect) or isinstance( + response, HttpResponsePermanentRedirect)): + redirect_to = response['Location'] + else: + redirect_to = None + response = adapter.ajax_response( + request, + response, + form=form, + data=data, + redirect_to=redirect_to) + return response + + +class RedirectAuthenticatedUserMixin(object): + + def dispatch(self, request, *args, **kwargs): + + +## ... source file continues with no further method_decorator examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / placeholderadmin.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/placeholderadmin.py) + +```python +# placeholderadmin.py +import uuid +import warnings + +from django.conf.urls import url +from django.contrib.admin.helpers import AdminForm +from django.contrib.admin.utils import get_deleted_objects +from django.core.exceptions import PermissionDenied +from django.db import router, transaction +from django.http import ( + HttpResponse, + HttpResponseBadRequest, + HttpResponseForbidden, + HttpResponseNotFound, + HttpResponseRedirect, +) +from django.shortcuts import get_list_or_404, get_object_or_404, render +from django.template.response import TemplateResponse +~~from django.utils.decorators import method_decorator +from django.utils.encoding import force_text +from django.utils import translation +from django.utils.translation import ugettext as _ +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.decorators.http import require_POST + +from six.moves.urllib.parse import parse_qsl, urlparse + +from six import get_unbound_function, get_method_function + +from cms import operations +from cms.admin.forms import PluginAddValidationForm +from cms.constants import SLUG_REGEXP +from cms.exceptions import PluginLimitReached +from cms.models.placeholdermodel import Placeholder +from cms.models.placeholderpluginmodel import PlaceholderReference +from cms.models.pluginmodel import CMSPlugin +from cms.plugin_pool import plugin_pool +from cms.signals import pre_placeholder_operation, post_placeholder_operation +from cms.toolbar.utils import get_plugin_tree_as_json +from cms.utils import copy_plugins, get_current_site +from cms.utils.compat import DJANGO_2_0 +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import get_language_code, get_language_list + + +## ... source file abbreviated to get to method_decorator examples ... + + + 'placeholder': plugin_data['placeholder_id'], + 'parent': plugin_data.get('plugin_parent', None), + 'plugin_type': plugin_data['plugin_type'], + 'position': plugin_data['position'], + } + + response = plugin_instance.add_view(request) + + plugin = getattr(plugin_instance, 'saved_object', None) + + if plugin: + plugin.placeholder.mark_as_dirty(plugin.language, clear_cache=False) + + if plugin_instance._operation_token: + tree_order = placeholder.get_plugin_tree_order(plugin.parent_id) + self._send_post_placeholder_operation( + request, + operation=operations.ADD_PLUGIN, + token=plugin_instance._operation_token, + plugin=plugin, + placeholder=plugin.placeholder, + tree_order=tree_order, + ) + return response + +~~ @method_decorator(require_POST) + @xframe_options_sameorigin + @transaction.atomic + def copy_plugins(self, request): + source_placeholder_id = request.POST['source_placeholder_id'] + target_language = request.POST['target_language'] + target_placeholder_id = request.POST['target_placeholder_id'] + source_placeholder = get_object_or_404(Placeholder, pk=source_placeholder_id) + target_placeholder = get_object_or_404(Placeholder, pk=target_placeholder_id) + + if not target_language or not target_language in get_language_list(): + return HttpResponseBadRequest(force_text(_("Language must be set to a supported language!"))) + + copy_to_clipboard = target_placeholder.pk == request.toolbar.clipboard.pk + source_plugin_id = request.POST.get('source_plugin_id', None) + + if copy_to_clipboard and source_plugin_id: + new_plugin = self._copy_plugin_to_clipboard( + request, + source_placeholder, + target_placeholder, + ) + new_plugins = [new_plugin] + elif copy_to_clipboard: + new_plugin = self._copy_placeholder_to_clipboard( + + +## ... source file abbreviated to get to method_decorator examples ... + + + obj = self._get_plugin_from_id(plugin_id) + + plugin_instance = obj.get_plugin_class_instance(admin=self.admin_site) + + if not self.has_change_plugin_permission(request, obj): + return HttpResponseForbidden(force_text(_("You do not have permission to edit this plugin"))) + + response = plugin_instance.change_view(request, str(plugin_id)) + + plugin = getattr(plugin_instance, 'saved_object', None) + + if plugin: + plugin.placeholder.mark_as_dirty(plugin.language, clear_cache=False) + + if plugin_instance._operation_token: + self._send_post_placeholder_operation( + request, + operation=operations.CHANGE_PLUGIN, + token=plugin_instance._operation_token, + old_plugin=obj, + new_plugin=plugin, + placeholder=plugin.placeholder, + ) + return response + +~~ @method_decorator(require_POST) + @xframe_options_sameorigin + @transaction.atomic + def move_plugin(self, request): + try: + plugin_id = get_int(request.POST.get('plugin_id')) + except TypeError: + raise RuntimeError("'plugin_id' is a required parameter.") + + plugin = self._get_plugin_from_id(plugin_id) + + try: + placeholder_id = get_int(request.POST.get('placeholder_id')) + except TypeError: + raise RuntimeError("'placeholder_id' is a required parameter.") + except ValueError: + raise RuntimeError("'placeholder_id' must be an integer string.") + + placeholder = Placeholder.objects.get(pk=placeholder_id) + + parent_id = get_int(request.POST.get('plugin_parent', ""), None) + target_language = request.POST['target_language'] + move_a_copy = request.POST.get('move_a_copy') + move_a_copy = (move_a_copy and move_a_copy != "0" and + move_a_copy.lower() != "false") + + +## ... source file continues with no further method_decorator examples... + +``` + + +## Example 3 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / admin.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./admin.py) + +```python +# admin.py +from datetime import datetime + +import django +from django import forms +from django.conf import settings +from django.conf.urls import url +from django.contrib import admin, messages +from django.contrib.admin.models import ADDITION, CHANGE, DELETION, LogEntry +from django.contrib.auth import get_permission_codename +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import PermissionDenied +from django.http import HttpResponse, HttpResponseRedirect +from django.template.response import TemplateResponse +from django.urls import reverse +~~from django.utils.decorators import method_decorator +from django.utils.encoding import force_str +from django.utils.module_loading import import_string +from django.utils.translation import gettext_lazy as _ +from django.views.decorators.http import require_POST + +from .formats.base_formats import DEFAULT_FORMATS +from .forms import ConfirmImportForm, ExportForm, ImportForm, export_action_form_factory +from .resources import modelresource_factory +from .results import RowResult +from .signals import post_export, post_import +from .tmp_storages import TempFolderStorage + +SKIP_ADMIN_LOG = getattr(settings, 'IMPORT_EXPORT_SKIP_ADMIN_LOG', False) +TMP_STORAGE_CLASS = getattr(settings, 'IMPORT_EXPORT_TMP_STORAGE_CLASS', + TempFolderStorage) + + +if isinstance(TMP_STORAGE_CLASS, str): + TMP_STORAGE_CLASS = import_string(TMP_STORAGE_CLASS) + + +class ImportExportMixinBase: + def get_model_info(self): + app_label = self.model._meta.app_label + + +## ... source file abbreviated to get to method_decorator examples ... + + + name='%s_%s_process_import' % info), + url(r'^import/$', + self.admin_site.admin_view(self.import_action), + name='%s_%s_import' % info), + ] + return my_urls + urls + + def get_resource_kwargs(self, request, *args, **kwargs): + return {} + + def get_import_resource_kwargs(self, request, *args, **kwargs): + return self.get_resource_kwargs(request, *args, **kwargs) + + def get_resource_class(self): + if not self.resource_class: + return modelresource_factory(self.model) + else: + return self.resource_class + + def get_import_resource_class(self): + return self.get_resource_class() + + def get_import_formats(self): + return [f for f in self.formats if f().can_import()] + +~~ @method_decorator(require_POST) + def process_import(self, request, *args, **kwargs): + if not self.has_import_permission(request): + raise PermissionDenied + + form_type = self.get_confirm_import_form() + confirm_form = form_type(request.POST) + if confirm_form.is_valid(): + import_formats = self.get_import_formats() + input_format = import_formats[ + int(confirm_form.cleaned_data['input_format']) + ]() + tmp_storage = self.get_tmp_storage_class()(name=confirm_form.cleaned_data['import_file_name']) + data = tmp_storage.read(input_format.get_read_mode()) + if not input_format.is_binary() and self.from_encoding: + data = force_str(data, self.from_encoding) + dataset = input_format.create_dataset(data) + + result = self.process_dataset(dataset, confirm_form, request, *args, **kwargs) + + tmp_storage.remove() + + return self.process_result(result, request) + + def process_dataset(self, dataset, confirm_form, request, *args, **kwargs): + + +## ... source file continues with no further method_decorator examples... + +``` + + +## Example 4 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / views / introspect.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/views/introspect.py) + +```python +# introspect.py +import calendar +import json + +from django.core.exceptions import ObjectDoesNotExist +from django.http import HttpResponse +~~from django.utils.decorators import method_decorator +from django.views.decorators.csrf import csrf_exempt + +from oauth2_provider.models import get_access_token_model +from oauth2_provider.views import ClientProtectedScopedResourceView + + +~~@method_decorator(csrf_exempt, name="dispatch") +class IntrospectTokenView(ClientProtectedScopedResourceView): + required_scopes = ["introspection"] + + @staticmethod + def get_token_response(token_value=None): + try: + token = get_access_token_model().objects.select_related( + "user", "application" + ).get(token=token_value) + except ObjectDoesNotExist: + return HttpResponse( + content=json.dumps({"active": False}), + status=401, + content_type="application/json" + ) + else: + if token.is_valid(): + data = { + "active": True, + "scope": token.scope, + "exp": int(calendar.timegm(token.expires.timetuple())), + } + if token.application: + data["client_id"] = token.application.client_id + + +## ... source file continues with no further method_decorator examples... + +``` + + +## Example 5 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / views.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./views.py) + +```python +# views.py +import re +import six +from collections import Counter + +try: + from django.urls import reverse_lazy +except ImportError: + from django.core.urlresolvers import reverse_lazy + +import django +from django.db import DatabaseError +from django.db.models import Count +from django.forms.models import model_to_dict +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect, Http404 +from django.shortcuts import get_object_or_404, render +from django.views.decorators.http import require_POST +~~from django.utils.decorators import method_decorator +from django.views.generic import ListView +from django.views.generic.base import View +from django.views.generic.edit import CreateView, DeleteView +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.core.exceptions import ImproperlyConfigured +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.views import LoginView + +from explorer import app_settings +from explorer.connections import connections +from explorer.exporters import get_exporter_class +from explorer.forms import QueryForm +from explorer.models import Query, QueryLog, MSG_FAILED_BLACKLIST +from explorer.tasks import execute_query +from explorer.utils import ( + url_get_rows, + url_get_query_id, + url_get_log_id, + url_get_params, + safe_login_prompt, + fmt_sql, + allowed_query_pks, + url_get_show, + url_get_fullscreen + + +## ... source file abbreviated to get to method_decorator examples ... + + +class StreamQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def get(self, request, query_id, *args, **kwargs): + query = get_object_or_404(Query, pk=query_id) + return _export(request, query, download=False) + + +class EmailCsvQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def post(self, request, query_id, *args, **kwargs): + if request.is_ajax(): + email = request.POST.get('email', None) + if email: + execute_query.delay(query_id, email) + return JsonResponse({'message': 'message was sent successfully'}) + return JsonResponse({}, status=403) + + +class SchemaView(PermissionRequiredMixin, View): + permission_required = 'change_permission' + +~~ @method_decorator(xframe_options_sameorigin) + def dispatch(self, *args, **kwargs): + return super(SchemaView, self).dispatch(*args, **kwargs) + + def get(self, request, *args, **kwargs): + connection = kwargs.get('connection') + if connection not in connections: + raise Http404 + schema = schema_info(connection) + if schema: + return render(None, 'explorer/schema.html', + {'schema': schema_info(connection)}) + else: + return render(None, 'explorer/schema_building.html') + + +@require_POST +def format_sql(request): + sql = request.POST.get('sql', '') + formatted = fmt_sql(sql) + return JsonResponse({"formatted": formatted}) + + +class ListQueryView(PermissionRequiredMixin, ExplorerContextMixin, ListView): + + + +## ... source file continues with no further method_decorator examples... + +``` + + +## Example 6 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / article.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/article.py) + +```python +# article.py +import difflib +import logging +from urllib.parse import urljoin + +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.db import transaction +from django.db.models import Q +from django.http import Http404 +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.shortcuts import render +from django.urls import reverse +~~from django.utils.decorators import method_decorator +from django.utils.translation import gettext as _ +from django.utils.translation import ngettext +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.generic import DetailView +from django.views.generic import FormView +from django.views.generic import ListView +from django.views.generic import RedirectView +from django.views.generic import TemplateView +from django.views.generic import View +from wiki import editors +from wiki import forms +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.exceptions import NoRootURL +from wiki.core.paginator import WikiPaginator +from wiki.core.plugins import registry as plugin_registry +from wiki.core.utils import object_to_json_response +from wiki.decorators import get_article +from wiki.views.mixins import ArticleMixin + +log = logging.getLogger(__name__) + + +class ArticleView(ArticleMixin, TemplateView): + + template_name = "wiki/view.html" + +~~ @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + def get_context_data(self, **kwargs): + kwargs["selected_tab"] = "view" + return ArticleMixin.get_context_data(self, **kwargs) + + +class Create(FormView, ArticleMixin): + form_class = forms.CreateForm + template_name = "wiki/create.html" + +~~ @method_decorator(get_article(can_write=True, can_create=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + def get_form(self, form_class=None): + if form_class is None: + form_class = self.get_form_class() + kwargs = self.get_form_kwargs() + initial = kwargs.get("initial", {}) + initial["slug"] = self.request.GET.get("slug", None) + kwargs["initial"] = initial + form = form_class(self.request, self.urlpath, **kwargs) + form.fields["slug"].widget = forms.TextInputPrepend( + prepend="/" + self.urlpath.path, + attrs={ + "pattern": "[a-z0-9_-]+" + if not settings.URL_CASE_SENSITIVE + else "[a-zA-Z0-9_-]+", + "title": "Lowercase letters, numbers, hyphens and underscores" + if not settings.URL_CASE_SENSITIVE + else "Letters, numbers, hyphens and underscores", + }, + ) + return form + + + +## ... source file abbreviated to get to method_decorator examples ... + + + messages.error( + self.request, _("There was an error creating this article.") + ) + return redirect("wiki:get", "") + + return self.get_success_url() + + def get_success_url(self): + return redirect("wiki:get", self.newpath.path) + + def get_context_data(self, **kwargs): + c = ArticleMixin.get_context_data(self, **kwargs) + c["form"] = self.get_form() + c["parent_urlpath"] = self.urlpath + c["parent_article"] = self.article + c["create_form"] = c.pop("form", None) + c["editor"] = editors.getEditor() + return c + + +class Delete(FormView, ArticleMixin): + + form_class = forms.DeleteForm + template_name = "wiki/delete.html" + +~~ @method_decorator(get_article(can_write=True, not_locked=True, can_delete=True)) + def dispatch(self, request, article, *args, **kwargs): + return self.dispatch1(request, article, *args, **kwargs) + + def dispatch1(self, request, article, *args, **kwargs): + urlpath = kwargs.get("urlpath", None) + self.next = "" + self.cannot_delete_root = False + if urlpath and urlpath.parent: + self.next = reverse("wiki:get", kwargs={"path": urlpath.parent.path}) + elif urlpath: + self.cannot_delete_root = True + else: + for art_obj in article.articleforobject_set.filter(is_mptt=True): + if art_obj.content_object.parent: + self.next = reverse( + "wiki:get", + kwargs={"article_id": art_obj.content_object.parent.article.id}, + ) + else: + self.cannot_delete_root = True + + return super().dispatch(request, article, *args, **kwargs) + + def get_initial(self): + + +## ... source file abbreviated to get to method_decorator examples ... + + + return self.get_success_url() + + def get_success_url(self): + return redirect(self.next) + + def get_context_data(self, **kwargs): + cannot_delete_children = False + if self.children_slice and not self.article.can_moderate(self.request.user): + cannot_delete_children = True + + kwargs["delete_form"] = self.get_form() + kwargs["form"] = kwargs["delete_form"] + kwargs["cannot_delete_root"] = self.cannot_delete_root + kwargs["delete_children"] = self.children_slice[:20] + kwargs["delete_children_more"] = len(self.children_slice) > 20 + kwargs["cannot_delete_children"] = cannot_delete_children + return super().get_context_data(**kwargs) + + +class Edit(ArticleMixin, FormView): + + + form_class = forms.EditForm + template_name = "wiki/edit.html" + +~~ @method_decorator(get_article(can_write=True, not_locked=True)) + def dispatch(self, request, article, *args, **kwargs): + self.orig_content = kwargs.pop("content", None) + self.sidebar_plugins = plugin_registry.get_sidebar() + self.sidebar = [] + return super().dispatch(request, article, *args, **kwargs) + + def get_initial(self): + initial = FormView.get_initial(self) + + for field_name in ["title", "content"]: + session_key = "unsaved_article_%s_%d" % (field_name, self.article.id) + if session_key in self.request.session: + content = self.request.session[session_key] + initial[field_name] = content + del self.request.session[session_key] + return initial + + def get_form(self, form_class=None): + if form_class is None: + form_class = self.get_form_class() + kwargs = self.get_form_kwargs() + if ( + self.request.POST.get("save", "") != "1" + and self.request.POST.get("preview") != "1" + + +## ... source file abbreviated to get to method_decorator examples ... + + + self.article.add_revision(revision) + messages.success( + self.request, _("A new revision of the article was successfully added.") + ) + return self.get_success_url() + + def get_success_url(self): + if self.urlpath: + return redirect("wiki:get", path=self.urlpath.path) + return redirect("wiki:get", article_id=self.article.id) + + def get_context_data(self, **kwargs): + kwargs["form"] = self.get_form() + kwargs["edit_form"] = kwargs["form"] + kwargs["editor"] = editors.getEditor() + kwargs["selected_tab"] = "edit" + kwargs["sidebar"] = self.sidebar + return super().get_context_data(**kwargs) + + +class Move(ArticleMixin, FormView): + + form_class = forms.MoveForm + template_name = "wiki/move.html" + +~~ @method_decorator(login_required) +~~ @method_decorator(get_article(can_write=True, not_locked=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + def get_form(self, form_class=None): + if form_class is None: + form_class = self.get_form_class() + kwargs = self.get_form_kwargs() + return form_class(**kwargs) + + def get_context_data(self, **kwargs): + kwargs["form"] = self.get_form() + kwargs["root_path"] = models.URLPath.root() + return super().get_context_data(**kwargs) + + @transaction.atomic + def form_valid(self, form): + if not self.urlpath.parent: + messages.error( + self.request, + _("This article cannot be moved because it is a root article."), + ) + return redirect("wiki:get", article_id=self.article.id) + + dest_path = get_object_or_404( + + +## ... source file abbreviated to get to method_decorator examples ... + + + _("Created redirect (auto)"), + ) + urlpath_new.moved_to = descendant + urlpath_new.save() + + messages.success( + self.request, + ngettext( + "Article successfully moved! Created {n} redirect.", + "Article successfully moved! Created {n} redirects.", + len(descendants), + ).format(n=len(descendants)), + ) + + else: + messages.success(self.request, _("Article successfully moved!")) + return redirect("wiki:get", path=self.urlpath.path) + + +class Deleted(Delete): + + + template_name = "wiki/deleted.html" + form_class = forms.DeleteForm + +~~ @method_decorator(get_article(can_read=True, deleted_contents=True)) + def dispatch(self, request, article, *args, **kwargs): + + self.urlpath = kwargs.get("urlpath", None) + self.article = article + + if self.urlpath: + deleted_ancestor = self.urlpath.first_deleted_ancestor() + if deleted_ancestor is None: + return redirect("wiki:get", path=self.urlpath.path) + elif deleted_ancestor != self.urlpath: + return redirect("wiki:deleted", path=deleted_ancestor.path) + + else: + if not article.current_revision.deleted: + return redirect("wiki:get", article_id=article.id) + + if request.GET.get("restore", False): + can_restore = not article.current_revision.locked and article.can_delete( + request.user + ) + can_restore = can_restore or article.can_moderate(request.user) + + if can_restore: + revision = models.ArticleRevision() + + +## ... source file abbreviated to get to method_decorator examples ... + + + _('The article "%s" and its children are now restored.') + % revision.title, + ) + if self.urlpath: + return redirect("wiki:get", path=self.urlpath.path) + else: + return redirect("wiki:get", article_id=article.id) + + return super().dispatch1(request, article, *args, **kwargs) + + def get_initial(self): + return { + "revision": self.article.current_revision, + "purge": True, + } + + def get_context_data(self, **kwargs): + kwargs["purge_form"] = self.get_form() + kwargs["form"] = kwargs["purge_form"] + return super().get_context_data(**kwargs) + + +class Source(ArticleMixin, TemplateView): + template_name = "wiki/source.html" + +~~ @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + def get_context_data(self, **kwargs): + kwargs["selected_tab"] = "source" + return super().get_context_data(**kwargs) + + +class History(ListView, ArticleMixin): + + template_name = "wiki/history.html" + allow_empty = True + context_object_name = "revisions" + paginator_class = WikiPaginator + paginate_by = 10 + + def get_queryset(self): + return models.ArticleRevision.objects.filter(article=self.article).order_by( + "-created" + ) + + def get_context_data(self, **kwargs): + kwargs_article = ArticleMixin.get_context_data(self, **kwargs) + kwargs_listview = ListView.get_context_data(self, **kwargs) + kwargs.update(kwargs_article) + kwargs.update(kwargs_listview) + kwargs["selected_tab"] = "history" + return kwargs + +~~ @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + +class Dir(ListView, ArticleMixin): + + template_name = "wiki/dir.html" + allow_empty = True + context_object_name = "directory" + model = models.URLPath + paginator_class = WikiPaginator + paginate_by = 30 + +~~ @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + self.filter_form = forms.DirFilterForm(request.GET) + if self.filter_form.is_valid(): + self.query = self.filter_form.cleaned_data["query"] + else: + self.query = None + return super().dispatch(request, article, *args, **kwargs) + + def get_queryset(self): + children = self.urlpath.get_children().can_read(self.request.user) + if self.query: + children = children.filter( + Q(article__current_revision__title__icontains=self.query) + | Q(slug__icontains=self.query) + ) + if not self.article.can_moderate(self.request.user): + children = children.active() + children = children.select_related_common().order_by( + "article__current_revision__title" + ) + return children + + def get_context_data(self, **kwargs): + kwargs_article = ArticleMixin.get_context_data(self, **kwargs) + + +## ... source file abbreviated to get to method_decorator examples ... + + + articles = articles.active().can_read(self.request.user) + return articles.order_by("-current_revision__created") + + def get_context_data(self, **kwargs): + kwargs = super().get_context_data(**kwargs) + kwargs["search_form"] = self.search_form + kwargs["search_query"] = self.query + kwargs["urlpath"] = self.urlpath + return kwargs + + +class Plugin(View): + def dispatch(self, request, path=None, slug=None, **kwargs): + kwargs["path"] = path + for plugin in list(plugin_registry.get_plugins().values()): + if getattr(plugin, "slug", None) == slug: + return plugin.article_view(request, **kwargs) + raise Http404() + + +class Settings(ArticleMixin, TemplateView): + + permission_form_class = forms.PermissionsForm + template_name = "wiki/settings.html" + +~~ @method_decorator(login_required) +~~ @method_decorator(get_article(can_read=True)) + def dispatch(self, request, article, *args, **kwargs): + return super().dispatch(request, article, *args, **kwargs) + + def get_form_classes(self): + settings_forms = [] + if permissions.can_change_permissions(self.article, self.request.user): + settings_forms.append(self.permission_form_class) + plugin_forms = [F for F in plugin_registry.get_settings_forms()] + plugin_forms.sort(key=lambda form: form.settings_order) + settings_forms += plugin_forms + for i in range(len(settings_forms)): + setattr(settings_forms[i], "action", "form%d" % i) + + return settings_forms + + def post(self, *args, **kwargs): + self.forms = [] + for form_class in self.get_form_classes(): + if form_class.action == self.request.GET.get("f", None): + form = form_class(self.article, self.request, self.request.POST) + if form.is_valid(): + form.save() + usermessage = form.get_usermessage() + if usermessage: + + +## ... source file abbreviated to get to method_decorator examples ... + + + def get(self, *args, **kwargs): + self.forms = [] + + new_article = models.Article.objects.get(id=self.article.id) + + for Form in self.get_form_classes(): + self.forms.append(Form(new_article, self.request)) + + return super().get(*args, **kwargs) + + def get_success_url(self): + if self.urlpath: + return redirect("wiki:settings", path=self.urlpath.path) + return redirect("wiki:settings", article_id=self.article.id) + + def get_context_data(self, **kwargs): + kwargs["selected_tab"] = "settings" + kwargs["forms"] = self.forms + return super().get_context_data(**kwargs) + + +class ChangeRevisionView(RedirectView): + + permanent = False + +~~ @method_decorator(get_article(can_write=True, not_locked=True)) + def dispatch(self, request, article, *args, **kwargs): + self.article = article + self.urlpath = kwargs.pop("kwargs", False) + self.change_revision() + + return super().dispatch(request, *args, **kwargs) + + def get_redirect_url(self, **kwargs): + if self.urlpath: + return reverse("wiki:history", kwargs={"path": self.urlpath.path}) + else: + return reverse("wiki:history", kwargs={"article_id": self.article.id}) + + def change_revision(self): + revision = get_object_or_404( + models.ArticleRevision, article=self.article, id=self.kwargs["revision_id"] + ) + self.article.current_revision = revision + self.article.save() + messages.success( + self.request, + _( + "The article %(title)s is now set to display revision #%(revision_number)d" + ) + % {"title": revision.title, "revision_number": revision.revision_number}, + ) + + +class Preview(ArticleMixin, TemplateView): + + template_name = "wiki/preview_inline.html" + +~~ @method_decorator(xframe_options_sameorigin) +~~ @method_decorator(get_article(can_read=True, deleted_contents=True)) + def dispatch(self, request, article, *args, **kwargs): + revision_id = request.GET.get("r", None) + self.title = None + self.content = None + self.preview = False + if revision_id: + try: + revision_id = int(revision_id) + except ValueError: + raise Http404() + self.revision = get_object_or_404( + models.ArticleRevision, article=article, id=revision_id + ) + else: + self.revision = None + return super().dispatch(request, article, *args, **kwargs) + + def post(self, request, *args, **kwargs): + edit_form = forms.EditForm( + request, self.article.current_revision, request.POST, preview=True + ) + if edit_form.is_valid(): + self.title = edit_form.cleaned_data["title"] + self.content = edit_form.cleaned_data["content"] + + +## ... source file abbreviated to get to method_decorator examples ... + + + other_revision = revision.previous_revision + + baseText = other_revision.content if other_revision is not None else "" + newText = revision.content + + differ = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK) + diff = differ.compare( + baseText.splitlines(keepends=True), newText.splitlines(keepends=True) + ) + other_changes = [] + + if not other_revision or other_revision.title != revision.title: + other_changes.append((_("New title"), revision.title)) + + return object_to_json_response( + {"diff": list(diff), "other_changes": other_changes} + ) + + +class MergeView(View): + preview = False + template_name = "wiki/preview_inline.html" + template_error_name = "wiki/error.html" + urlpath = None + +~~ @method_decorator(get_article(can_write=True)) + def dispatch(self, request, article, revision_id, *args, **kwargs): + return super().dispatch(request, article, revision_id, *args, **kwargs) + + def get(self, request, article, revision_id, *args, **kwargs): + revision = get_object_or_404( + models.ArticleRevision, article=article, id=revision_id + ) + + current_text = ( + article.current_revision.content if article.current_revision else "" + ) + new_text = revision.content + + content = simple_merge(current_text, new_text) + + if not self.preview: + old_revision = article.current_revision + + if revision.deleted: + c = { + "error_msg": _("You cannot merge with a deleted revision"), + "article": article, + "urlpath": self.urlpath, + } + + +## ... source file continues with no further method_decorator examples... + +``` + diff --git a/content/pages/examples/django/django-utils-deprecation-middlewaremixin.markdown b/content/pages/examples/django/django-utils-deprecation-middlewaremixin.markdown new file mode 100644 index 000000000..e721b1bdb --- /dev/null +++ b/content/pages/examples/django/django-utils-deprecation-middlewaremixin.markdown @@ -0,0 +1,628 @@ +title: django.utils.deprecation MiddlewareMixin Example Code +category: page +slug: django-utils-deprecation-middlewaremixin-examples +sortorder: 500011437 +toc: False +sidebartitle: django.utils.deprecation MiddlewareMixin +meta: Python example code for the MiddlewareMixin class from the django.utils.deprecation module of the Django project. + + +MiddlewareMixin is a class within the django.utils.deprecation module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / middleware.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/middleware.py) + +```python +# middleware.py +from __future__ import unicode_literals + +import threading +import time + +from django.conf import settings +from django.db.models.signals import pre_save +from django.utils.functional import curry +from django.apps import apps +from auditlog.models import LogEntry +from auditlog.compat import is_authenticated + +try: +~~ from django.utils.deprecation import MiddlewareMixin +except ImportError: + MiddlewareMixin = object + + +threadlocal = threading.local() + + +~~class AuditlogMiddleware(MiddlewareMixin): + + def process_request(self, request): + threadlocal.auditlog = { + 'signal_duid': (self.__class__, time.time()), + 'remote_addr': request.META.get('REMOTE_ADDR'), + } + + if request.META.get('HTTP_X_FORWARDED_FOR'): + threadlocal.auditlog['remote_addr'] = request.META.get('HTTP_X_FORWARDED_FOR').split(',')[0] + + if hasattr(request, 'user') and is_authenticated(request.user): + set_actor = curry(self.set_actor, user=request.user, signal_duid=threadlocal.auditlog['signal_duid']) + pre_save.connect(set_actor, sender=LogEntry, dispatch_uid=threadlocal.auditlog['signal_duid'], weak=False) + + def process_response(self, request, response): + if hasattr(threadlocal, 'auditlog'): + pre_save.disconnect(sender=LogEntry, dispatch_uid=threadlocal.auditlog['signal_duid']) + + return response + + def process_exception(self, request, exception): + if hasattr(threadlocal, 'auditlog'): + pre_save.disconnect(sender=LogEntry, dispatch_uid=threadlocal.auditlog['signal_duid']) + + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + + +## Example 2 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / middleware.py**](https://github.com/jrief/django-angular/blob/master/djng/./middleware.py) + +```python +# middleware.py +from django import http +from django.urls import reverse +from django.utils.http import unquote +try: +~~ from django.utils.deprecation import MiddlewareMixin +except ImportError: + MiddlewareMixin = object + + +~~class AngularUrlMiddleware(MiddlewareMixin): + ANGULAR_REVERSE = '/angular/reverse/' + + def process_request(self, request): + if request.path == self.ANGULAR_REVERSE: + url_name = request.GET.get('djng_url_name') + url_args = request.GET.getlist('djng_url_args', []) + url_kwargs = {} + + url_args = filter(lambda x: x, url_args) + + for param in request.GET: + if param.startswith('djng_url_kwarg_'): + if request.GET[param]: + url_kwargs[param[15:]] = request.GET[param] # [15:] to remove 'djng_url_kwarg' prefix + + url = unquote(reverse(url_name, args=url_args, kwargs=url_kwargs)) + assert not url.startswith(self.ANGULAR_REVERSE), "Prevent recursive requests" + + request.path = request.path_info = url + request.environ['PATH_INFO'] = url + query = request.GET.copy() + for key in request.GET: + if key.startswith('djng_url'): + query.pop(key, None) + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + + +## Example 3 from django-cors-headers +[django-cors-headers](https://github.com/ottoyiu/django-cors-headers) +is an +[open source](https://github.com/ottoyiu/django-cors-headers/blob/master/LICENSE) +library for enabling +[Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) +handling in your [Django](/django.html) web applications and appropriately +dealing with HTTP headers for CORS requests. + +[**django-cors-headers / src/corsheaders / middleware.py**](https://github.com/ottoyiu/django-cors-headers/blob/master/src/corsheaders/./middleware.py) + +```python +# middleware.py +import re +from urllib.parse import urlparse + +from django import http +from django.utils.cache import patch_vary_headers +~~from django.utils.deprecation import MiddlewareMixin + +from corsheaders.conf import conf +from corsheaders.signals import check_request_enabled + +ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin" +ACCESS_CONTROL_EXPOSE_HEADERS = "Access-Control-Expose-Headers" +ACCESS_CONTROL_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials" +ACCESS_CONTROL_ALLOW_HEADERS = "Access-Control-Allow-Headers" +ACCESS_CONTROL_ALLOW_METHODS = "Access-Control-Allow-Methods" +ACCESS_CONTROL_MAX_AGE = "Access-Control-Max-Age" + + +~~class CorsPostCsrfMiddleware(MiddlewareMixin): + def _https_referer_replace_reverse(self, request): + if conf.CORS_REPLACE_HTTPS_REFERER and "ORIGINAL_HTTP_REFERER" in request.META: + http_referer = request.META["ORIGINAL_HTTP_REFERER"] + request.META["HTTP_REFERER"] = http_referer + del request.META["ORIGINAL_HTTP_REFERER"] + + def process_request(self, request): + self._https_referer_replace_reverse(request) + return None + + def process_view(self, request, callback, callback_args, callback_kwargs): + self._https_referer_replace_reverse(request) + return None + + +~~class CorsMiddleware(MiddlewareMixin): + def _https_referer_replace(self, request): + origin = request.META.get("HTTP_ORIGIN") + + if ( + request.is_secure() + and origin + and "ORIGINAL_HTTP_REFERER" not in request.META + ): + + url = urlparse(origin) + if not conf.CORS_ORIGIN_ALLOW_ALL and not self.origin_found_in_white_lists( + origin, url + ): + return + + try: + http_referer = request.META["HTTP_REFERER"] + http_host = "https://%s/" % request.META["HTTP_HOST"] + request.META = request.META.copy() + request.META["ORIGINAL_HTTP_REFERER"] = http_referer + request.META["HTTP_REFERER"] = http_host + except KeyError: + pass + + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + + +## Example 4 from django-downloadview +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + +[**django-downloadview / django_downloadview / middlewares.py**](https://github.com/benoitbryon/django-downloadview/blob/master/django_downloadview/./middlewares.py) + +```python +# middlewares.py +import collections +import copy +import os + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured + +from django_downloadview.response import DownloadResponse +from django_downloadview.utils import import_member + +try: +~~ from django.utils.deprecation import MiddlewareMixin +except ImportError: + +~~ class MiddlewareMixin(object): + def __init__(self, get_response=None): +~~ super(MiddlewareMixin, self).__init__() + + +AUTO_CONFIGURE = object() + + +def is_download_response(response): + return isinstance(response, DownloadResponse) + + +~~class BaseDownloadMiddleware(MiddlewareMixin): + + def is_download_response(self, response): + return is_download_response(response) + + def process_response(self, request, response): + if self.is_download_response(response): + return self.process_download_response(request, response) + return response + + def process_download_response(self, request, response): + raise NotImplementedError() + + +class RealDownloadMiddleware(BaseDownloadMiddleware): + + def is_download_response(self, response): + if super(RealDownloadMiddleware, self).is_download_response(response): + try: + return response.file.url or response.file.name + except AttributeError: + return False + else: + return True + return False + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + + +## Example 5 from django-easy-timezones +[django-easy-timezones](https://github.com/Miserlou/django-easy-timezones) +([project website](https://www.gun.io/blog/django-easy-timezones)) +is a Django +[middleware](https://docs.djangoproject.com/en/2.2/topics/http/middleware/) +[code library](https://pypi.org/project/django-easy-timezones/) +to simplify handling time data in your applications using +users' geolocation data. + +[**django-easy-timezones / easy_timezones / middleware.py**](https://github.com/Miserlou/django-easy-timezones/blob/master/easy_timezones/./middleware.py) + +```python +# middleware.py + if not GEOIPV6_DATABASE: + raise ImproperlyConfigured("GEOIPV6_DATABASE setting has not been properly defined.") + + if not os.path.exists(GEOIPV6_DATABASE): + raise ImproperlyConfigured("GEOIPV6_DATABASE setting is defined, but file does not exist.") + + return (GEOIP_DATABASE, GEOIPV6_DATABASE) + +load_db_settings() + +def load_db(): + + GEOIP_DATABASE, GEOIPV6_DATABASE = load_db_settings() + + global db + db = pygeoip.GeoIP(GEOIP_DATABASE, pygeoip.MEMORY_CACHE) + + global db_v6 + db_v6 = pygeoip.GeoIP(GEOIPV6_DATABASE, pygeoip.MEMORY_CACHE) + + global db_loaded + db_loaded = True + + +if django.VERSION >= (1, 10): +~~ from django.utils.deprecation import MiddlewareMixin + middleware_base_class = MiddlewareMixin +else: + middleware_base_class = object + + +class EasyTimezoneMiddleware(middleware_base_class): + def process_request(self, request): + + if not request: + return + + if not db_loaded: + load_db() + + tz = request.session.get('django_timezone') + + if not tz: + tz = timezone.get_default_timezone() + + client_ip = get_ip_address_from_request(request) + ip_addrs = client_ip.split(',') + for ip in ip_addrs: + if is_valid_ip(ip) and not is_local_ip(ip): + if ':' in ip: + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + + +## Example 6 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / middleware.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./middleware.py) + +```python +# middleware.py +from django.contrib.auth import authenticate +from django.utils.cache import patch_vary_headers +~~from django.utils.deprecation import MiddlewareMixin + + +~~class OAuth2TokenMiddleware(MiddlewareMixin): + + def process_request(self, request): + if request.META.get("HTTP_AUTHORIZATION", "").startswith("Bearer"): + if not hasattr(request, "user") or request.user.is_anonymous: + user = authenticate(request=request) + if user: + request.user = request._cached_user = user + + def process_response(self, request, response): + patch_vary_headers(response, ("Authorization",)) + return response + + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + + +## Example 7 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / middleware.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./middleware.py) + +```python +# middleware.py +from django.core.exceptions import MiddlewareNotUsed +from django.utils.encoding import DjangoUnicodeDecodeError +from django.utils.html import strip_spaces_between_tags as minify_html + +from pipeline.conf import settings + +~~from django.utils.deprecation import MiddlewareMixin + + +~~class MinifyHTMLMiddleware(MiddlewareMixin): + def __init__(self, *args, **kwargs): + super(MinifyHTMLMiddleware, self).__init__(*args, **kwargs) + if not settings.PIPELINE_ENABLED: + raise MiddlewareNotUsed + + def process_response(self, request, response): + if response.has_header('Content-Type') and 'text/html' in response['Content-Type']: + try: + response.content = minify_html(response.content.decode('utf-8').strip()) + response['Content-Length'] = str(len(response.content)) + except DjangoUnicodeDecodeError: + pass + return response + + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + + +## Example 8 from django-webtest +[django-webtest](https://github.com/django-webtest/django-webtest) +([PyPI package information](https://pypi.org/project/django-webtest/)) +is a [Django](/django.html) extension that makes it easier to use +[WebTest](http://docs.pylonsproject.org/projects/webtest/) with +your projects. + +The project is open sourced under the +[MIT license](https://github.com/django-webtest/django-webtest/blob/master/LICENSE.txt). + +[**django-webtest / django_webtest / middleware.py**](https://github.com/django-webtest/django-webtest/blob/master/django_webtest/./middleware.py) + +```python +# middleware.py +import django +from django.contrib.auth.middleware import RemoteUserMiddleware +from django.core.exceptions import ImproperlyConfigured +from django.contrib import auth +if django.VERSION >= (1, 10): +~~ from django.utils.deprecation import MiddlewareMixin +else: + MiddlewareMixin = object + +from django_webtest.compat import is_authenticated + + +class WebtestUserMiddleware(RemoteUserMiddleware): + + header = "WEBTEST_USER" + + def process_request(self, request): + if not hasattr(request, 'user'): + raise ImproperlyConfigured( + "The django-webtest auth middleware requires the " + "'django.contrib.auth.middleware.AuthenticationMiddleware' " + "to be installed. Add it to your MIDDLEWARE setting " + "or disable django-webtest auth support by setting " + "'setup_auth' property of your WebTest subclass to False." + ) + try: + username = request.META[self.header] + except KeyError: + return + if is_authenticated(request.user): + if hasattr(request.user, "get_username"): + authenticated_username = request.user.get_username() + else: + authenticated_username = request.user.username + clean_username = self.clean_username(username, request) + if authenticated_username == clean_username: + return + user = auth.authenticate(django_webtest_user=username) + if user: + request.user = user + auth.login(request, user) + + +~~class DisableCSRFCheckMiddleware(MiddlewareMixin): + def process_request(self, request): + request._dont_enforce_csrf_checks = True + + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + + +## Example 9 from graphite-web +[Graphite](https://github.com/graphite-project/graphite-web) +([project website](http://graphiteapp.org/), +[documentation](https://graphite.readthedocs.io/en/latest/) and +[PyPI package information](https://pypi.org/project/graphite-web/)) +is a metrics collection and visualization tool, built with both +Python and JavaScript. Metrics are collected by a Node.js application +and displayed using a [Django](/django.html) web application, +called "Graphite-Web", which is one of three core projects under +the Graphite umbrella (the other two are +[Carbon](https://github.com/graphite-project/carbon) and +[Whisper](https://github.com/graphite-project/whisper)). + +Graphite is provided as open sourced under the +[Apache License 2.0](https://github.com/graphite-project/whisper/blob/master/LICENSE). + +[**graphite-web / webapp / graphite / middleware.py**](https://github.com/graphite-project/graphite-web/blob/master/webapp/graphite/middleware.py) + +```python +# middleware.py +from graphite.logger import log +try: +~~ from django.utils.deprecation import MiddlewareMixin +except ImportError: # Django < 1.10 + MiddlewareMixin = object + + +~~class LogExceptionsMiddleware(MiddlewareMixin): + def process_exception(self, request, exception): + log.exception('Exception encountered in <{0} {1}>'.format(request.method, request.build_absolute_uri())) + return None + + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + + +## Example 10 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / middleware.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./middleware.py) + +```python +# middleware.py +import django.middleware.locale +import django.shortcuts +from django.utils import translation +~~from django.utils.deprecation import MiddlewareMixin + + +~~class RequestLocaleMiddleware(MiddlewareMixin): + def process_view(self, request, view_func, view_args, view_kwargs): + if request.method == 'GET': + language = request.GET.get('lang') + if language: + translation.activate(language) + request.session[translation.LANGUAGE_SESSION_KEY] = translation.get_language() + query = request.GET.copy() + del query['lang'] + path = '?'.join([request.path, query.urlencode()]) + return django.shortcuts.redirect(path) + + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + + +## Example 11 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / middleware.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/middleware.py) + +```python +# middleware.py +import warnings + +~~from django.utils.deprecation import MiddlewareMixin +from wagtail.core.models import Site +from wagtail.utils.deprecation import RemovedInWagtail211Warning + + +warnings.warn( + 'wagtail.core.middleware.SiteMiddleware and the use of request.site is deprecated. ' + 'Please update your code to use Site.find_for_request(request) in place of request.site, ' + 'and remove wagtail.core.middleware.SiteMiddleware from MIDDLEWARES', + RemovedInWagtail211Warning +) + + +~~class SiteMiddleware(MiddlewareMixin): + def process_request(self, request): + try: + request.site = Site.find_for_request(request) + except Site.DoesNotExist: + request.site = None + + + +## ... source file continues with no further MiddlewareMixin examples... + +``` + diff --git a/content/pages/examples/django/django-utils-deprecation-renamemethodsbase.markdown b/content/pages/examples/django/django-utils-deprecation-renamemethodsbase.markdown new file mode 100644 index 000000000..ebf9b13b3 --- /dev/null +++ b/content/pages/examples/django/django-utils-deprecation-renamemethodsbase.markdown @@ -0,0 +1,66 @@ +title: django.utils.deprecation RenameMethodsBase Example Code +category: page +slug: django-utils-deprecation-renamemethodsbase-examples +sortorder: 500011438 +toc: False +sidebartitle: django.utils.deprecation RenameMethodsBase +meta: Python example code for the RenameMethodsBase class from the django.utils.deprecation module of the Django project. + + +RenameMethodsBase is a class within the django.utils.deprecation module of the Django project. + + +## Example 1 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / rest_framework / backends.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/rest_framework/backends.py) + +```python +# backends.py +import warnings + +from django.template import loader +~~from django.utils.deprecation import RenameMethodsBase + +from .. import compat, utils +from . import filters, filterset + + +~~class RenameAttributes(utils.RenameAttributesBase, RenameMethodsBase): + renamed_attributes = ( + ('default_filter_set', 'filterset_base', utils.MigrationNotice), + ) + renamed_methods = ( + ('get_filter_class', 'get_filterset_class', utils.MigrationNotice), + ) + + +class DjangoFilterBackend(metaclass=RenameAttributes): + filterset_base = filterset.FilterSet + raise_exception = True + + @property + def template(self): + if compat.is_crispy(): + return 'django_filters/rest_framework/crispy_form.html' + return 'django_filters/rest_framework/form.html' + + def get_filterset(self, request, queryset, view): + filterset_class = self.get_filterset_class(view, queryset) + if filterset_class is None: + return None + + kwargs = self.get_filterset_kwargs(request, queryset, view) + + +## ... source file continues with no further RenameMethodsBase examples... + +``` + diff --git a/content/pages/examples/django/django-utils-duration-duration-string.markdown b/content/pages/examples/django/django-utils-duration-duration-string.markdown new file mode 100644 index 000000000..2bc244c18 --- /dev/null +++ b/content/pages/examples/django/django-utils-duration-duration-string.markdown @@ -0,0 +1,142 @@ +title: django.utils.duration duration_string Example Code +category: page +slug: django-utils-duration-duration-string-examples +sortorder: 500011439 +toc: False +sidebartitle: django.utils.duration duration_string +meta: Python example code for the duration_string callable from the django.utils.duration module of the Django project. + + +duration_string is a callable within the django.utils.duration module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import copy +import datetime +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +~~from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings +from rest_framework.utils import html, humanize_datetime, json, representation +from rest_framework.utils.formatting import lazy_format +from rest_framework.validators import ProhibitSurrogateCharactersValidator + + +class empty: + pass + + +class BuiltinSignatureError(Exception): + pass + + + +## ... source file abbreviated to get to duration_string examples ... + + + 'min_value': _('Ensure this value is greater than or equal to {min_value}.'), + } + + def __init__(self, **kwargs): + self.max_value = kwargs.pop('max_value', None) + self.min_value = kwargs.pop('min_value', None) + super().__init__(**kwargs) + if self.max_value is not None: + message = lazy_format(self.error_messages['max_value'], max_value=self.max_value) + self.validators.append( + MaxValueValidator(self.max_value, message=message)) + if self.min_value is not None: + message = lazy_format(self.error_messages['min_value'], min_value=self.min_value) + self.validators.append( + MinValueValidator(self.min_value, message=message)) + + def to_internal_value(self, value): + if isinstance(value, datetime.timedelta): + return value + parsed = parse_duration(str(value)) + if parsed is not None: + return parsed + self.fail('invalid', format='[DD] [HH:[MM:]]ss[.uuuuuu]') + + def to_representation(self, value): +~~ return duration_string(value) + + + +class ChoiceField(Field): + default_error_messages = { + 'invalid_choice': _('"{input}" is not a valid choice.') + } + html_cutoff = None + html_cutoff_text = _('More than {count} items...') + + def __init__(self, choices, **kwargs): + self.choices = choices + self.html_cutoff = kwargs.pop('html_cutoff', self.html_cutoff) + self.html_cutoff_text = kwargs.pop('html_cutoff_text', self.html_cutoff_text) + + self.allow_blank = kwargs.pop('allow_blank', False) + + super().__init__(**kwargs) + + def to_internal_value(self, data): + if data == '' and self.allow_blank: + return '' + + try: + + +## ... source file continues with no further duration_string examples... + +``` + diff --git a/content/pages/examples/django/django-utils-encoding-djangounicodedecodeerror.markdown b/content/pages/examples/django/django-utils-encoding-djangounicodedecodeerror.markdown new file mode 100644 index 000000000..7b06f5a36 --- /dev/null +++ b/content/pages/examples/django/django-utils-encoding-djangounicodedecodeerror.markdown @@ -0,0 +1,60 @@ +title: django.utils.encoding DjangoUnicodeDecodeError Example Code +category: page +slug: django-utils-encoding-djangounicodedecodeerror-examples +sortorder: 500011440 +toc: False +sidebartitle: django.utils.encoding DjangoUnicodeDecodeError +meta: Python example code for the DjangoUnicodeDecodeError class from the django.utils.encoding module of the Django project. + + +DjangoUnicodeDecodeError is a class within the django.utils.encoding module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / middleware.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./middleware.py) + +```python +# middleware.py +from django.core.exceptions import MiddlewareNotUsed +~~from django.utils.encoding import DjangoUnicodeDecodeError +from django.utils.html import strip_spaces_between_tags as minify_html + +from pipeline.conf import settings + +from django.utils.deprecation import MiddlewareMixin + + +class MinifyHTMLMiddleware(MiddlewareMixin): + def __init__(self, *args, **kwargs): + super(MinifyHTMLMiddleware, self).__init__(*args, **kwargs) + if not settings.PIPELINE_ENABLED: + raise MiddlewareNotUsed + + def process_response(self, request, response): + if response.has_header('Content-Type') and 'text/html' in response['Content-Type']: + try: + response.content = minify_html(response.content.decode('utf-8').strip()) + response['Content-Length'] = str(len(response.content)) +~~ except DjangoUnicodeDecodeError: + pass + return response + + + +## ... source file continues with no further DjangoUnicodeDecodeError examples... + +``` + diff --git a/content/pages/examples/django/django-utils-encoding-filepath-to-uri.markdown b/content/pages/examples/django/django-utils-encoding-filepath-to-uri.markdown new file mode 100644 index 000000000..f71de16da --- /dev/null +++ b/content/pages/examples/django/django-utils-encoding-filepath-to-uri.markdown @@ -0,0 +1,93 @@ +title: django.utils.encoding filepath_to_uri Example Code +category: page +slug: django-utils-encoding-filepath-to-uri-examples +sortorder: 500011441 +toc: False +sidebartitle: django.utils.encoding filepath_to_uri +meta: Python example code for the filepath_to_uri callable from the django.utils.encoding module of the Django project. + + +filepath_to_uri is a callable within the django.utils.encoding module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / core / http.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/core/http.py) + +```python +# http.py +import mimetypes +import os +from datetime import datetime + +from django.http import HttpResponse +from django.utils import dateformat +~~from django.utils.encoding import filepath_to_uri +from django.utils.http import http_date +from wiki.conf import settings + + +def django_sendfile_response(request, filepath): + from sendfile import sendfile + + return sendfile(request, filepath) + + +def send_file(request, filepath, last_modified=None, filename=None): + fullpath = filepath + statobj = os.stat(fullpath) + if filename: + mimetype, encoding = mimetypes.guess_type(filename) + else: + mimetype, encoding = mimetypes.guess_type(fullpath) + + mimetype = mimetype or "application/octet-stream" + + if settings.USE_SENDFILE: + response = django_sendfile_response(request, filepath) + else: + response = HttpResponse(open(fullpath, "rb").read(), content_type=mimetype) + + if not last_modified: + response["Last-Modified"] = http_date(statobj.st_mtime) + else: + if isinstance(last_modified, datetime): + last_modified = float(dateformat.format(last_modified, "U")) + response["Last-Modified"] = http_date(epoch_seconds=last_modified) + + response["Content-Length"] = statobj.st_size + + if encoding: + response["Content-Encoding"] = encoding + + if filename: +~~ filename_escaped = filepath_to_uri(filename) + if "pdf" in mimetype.lower(): + response["Content-Disposition"] = "inline; filename=%s" % filename_escaped + else: + response["Content-Disposition"] = ( + "attachment; filename=%s" % filename_escaped + ) + + return response + + + +## ... source file continues with no further filepath_to_uri examples... + +``` + diff --git a/content/pages/examples/django/django-utils-encoding-force-bytes.markdown b/content/pages/examples/django/django-utils-encoding-force-bytes.markdown new file mode 100644 index 000000000..74420d227 --- /dev/null +++ b/content/pages/examples/django/django-utils-encoding-force-bytes.markdown @@ -0,0 +1,389 @@ +title: django.utils.encoding force_bytes Example Code +category: page +slug: django-utils-encoding-force-bytes-examples +sortorder: 500011442 +toc: False +sidebartitle: django.utils.encoding force_bytes +meta: Python example code for the force_bytes callable from the django.utils.encoding module of the Django project. + + +force_bytes is a callable within the django.utils.encoding module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / utils.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./utils.py) + +```python +# utils.py +import base64 +import importlib +import json +import random +import re +import string +import unicodedata +from collections import OrderedDict +from urllib.parse import urlsplit + +import django +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.core.serializers.json import DjangoJSONEncoder +from django.core.validators import ValidationError, validate_email +from django.db.models import FileField +from django.db.models.fields import ( + BinaryField, + DateField, + DateTimeField, + EmailField, + TimeField, +) +from django.utils import dateparse +~~from django.utils.encoding import force_bytes, force_str + + +MAX_USERNAME_SUFFIX_LENGTH = 7 +USERNAME_SUFFIX_CHARS = ( + [string.digits] * 4 + + [string.ascii_letters] * (MAX_USERNAME_SUFFIX_LENGTH - 4)) + + +def _generate_unique_username_base(txts, regex=None): + from .account.adapter import get_adapter + adapter = get_adapter() + username = None + regex = regex or r'[^\w\s@+.-]' + for txt in txts: + if not txt: + continue + username = unicodedata.normalize('NFKD', force_str(txt)) + username = username.encode('ascii', 'ignore').decode('ascii') + username = force_str(re.sub(regex, '', username).lower()) + username = username.split('@')[0] + username = username.strip() + username = re.sub(r'\s+', '_', username) + try: + username = adapter.clean_username(username, shallow=True) + + +## ... source file abbreviated to get to force_bytes examples ... + + + v = field.get_prep_value(v) + k = SERIALIZED_DB_FIELD_PREFIX + k + except FieldDoesNotExist: + pass + data[k] = v + return json.loads(json.dumps(data, cls=DjangoJSONEncoder)) + + +def deserialize_instance(model, data): + ret = model() + for k, v in data.items(): + is_db_value = False + if k.startswith(SERIALIZED_DB_FIELD_PREFIX): + k = k[len(SERIALIZED_DB_FIELD_PREFIX):] + is_db_value = True + if v is not None: + try: + f = model._meta.get_field(k) + if isinstance(f, DateTimeField): + v = dateparse.parse_datetime(v) + elif isinstance(f, TimeField): + v = dateparse.parse_time(v) + elif isinstance(f, DateField): + v = dateparse.parse_date(v) + elif isinstance(f, BinaryField): +~~ v = force_bytes( + base64.b64decode( +~~ force_bytes(v))) + elif is_db_value: + try: + if django.VERSION < (3, 0): + v = f.from_db_value(v, None, None, None) + else: + v = f.from_db_value(v, None, None) + except Exception: + raise ImproperlyConfigured( + "Unable to auto serialize field '{}', custom" + " serialization override required".format(k) + ) + except FieldDoesNotExist: + pass + setattr(ret, k, v) + return ret + + +def set_form_field_order(form, field_order): + if field_order is None: + return + fields = OrderedDict() + for key in field_order: + try: + fields[key] = form.fields.pop(key) + + +## ... source file continues with no further force_bytes examples... + +``` + + +## Example 2 from django-downloadview +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + +[**django-downloadview / django_downloadview / io.py**](https://github.com/benoitbryon/django-downloadview/blob/master/django_downloadview/./io.py) + +```python +# io.py +import io + +~~from django.utils.encoding import force_bytes, force_text + + +class TextIteratorIO(io.TextIOBase): + + def __init__(self, iterator): + self._iter = iterator + + self._left = "" + + def readable(self): + return True + + def _read1(self, n=None): + while not self._left: + try: + self._left = next(self._iter) + except StopIteration: + break + else: + self._left = force_text(self._left) + ret = self._left[:n] + self._left = self._left[len(ret) :] + return ret + + + +## ... source file abbreviated to get to force_bytes examples ... + + + break + else: + chunks.append(self._left[: i + 1]) + self._left = self._left[i + 1 :] + break + return "".join(chunks) + + +class BytesIteratorIO(io.BytesIO): + + def __init__(self, iterator): + self._iter = iterator + + self._left = b"" + + def readable(self): + return True + + def _read1(self, n=None): + while not self._left: + try: + self._left = next(self._iter) + except StopIteration: + break + else: +~~ self._left = force_bytes(self._left) + ret = self._left[:n] + self._left = self._left[len(ret) :] + return ret + + def read(self, n=None): + chunks = [] + if n is None or n < 0: + while True: + m = self._read1() + if not m: + break + chunks.append(m) + else: + while n > 0: + m = self._read1(n) + if not m: + break + n -= len(m) + chunks.append(m) + return b"".join(chunks) + + def readline(self): + chunks = [] + while True: + + +## ... source file continues with no further force_bytes examples... + +``` + + +## Example 3 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / test.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./test.py) + +```python +# test.py +import io +from importlib import import_module + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.core.handlers.wsgi import WSGIHandler +from django.test import override_settings, testcases +from django.test.client import Client as DjangoClient +from django.test.client import ClientHandler +from django.test.client import RequestFactory as DjangoRequestFactory +~~from django.utils.encoding import force_bytes +from django.utils.http import urlencode + +from rest_framework.compat import coreapi, requests +from rest_framework.settings import api_settings + + +def force_authenticate(request, user=None, token=None): + request._force_auth_user = user + request._force_auth_token = token + + +if requests is not None: + class HeaderDict(requests.packages.urllib3._collections.HTTPHeaderDict): + def get_all(self, key, default): + return self.getheaders(key) + + class MockOriginalResponse: + def __init__(self, headers): + self.msg = HeaderDict(headers) + self.closed = False + + def isclosed(self): + return self.closed + + + +## ... source file abbreviated to get to force_bytes examples ... + + + def CoreAPIClient(*args, **kwargs): + raise ImproperlyConfigured('coreapi must be installed in order to use CoreAPIClient.') + + +class APIRequestFactory(DjangoRequestFactory): + renderer_classes_list = api_settings.TEST_REQUEST_RENDERER_CLASSES + default_format = api_settings.TEST_REQUEST_DEFAULT_FORMAT + + def __init__(self, enforce_csrf_checks=False, **defaults): + self.enforce_csrf_checks = enforce_csrf_checks + self.renderer_classes = {} + for cls in self.renderer_classes_list: + self.renderer_classes[cls.format] = cls + super().__init__(**defaults) + + def _encode_data(self, data, format=None, content_type=None): + + if data is None: + return ('', content_type) + + assert format is None or content_type is None, ( + 'You may not set both `format` and `content_type`.' + ) + + if content_type: +~~ ret = force_bytes(data, settings.DEFAULT_CHARSET) + + else: + format = format or self.default_format + + assert format in self.renderer_classes, ( + "Invalid format '{}'. Available formats are {}. " + "Set TEST_REQUEST_RENDERER_CLASSES to enable " + "extra request formats.".format( + format, + ', '.join(["'" + fmt + "'" for fmt in self.renderer_classes]) + ) + ) + + renderer = self.renderer_classes[format]() + ret = renderer.render(data) + + content_type = "{}; charset={}".format( + renderer.media_type, renderer.charset + ) + + if isinstance(ret, str): + ret = ret.encode(renderer.charset) + + return ret, content_type + + def get(self, path, data=None, **extra): + r = { + 'QUERY_STRING': urlencode(data or {}, doseq=True), + } + if not data and '?' in path: +~~ query_string = force_bytes(path.split('?')[1]) + query_string = query_string.decode('iso-8859-1') + r['QUERY_STRING'] = query_string + r.update(extra) + return self.generic('GET', path, **r) + + def post(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('POST', path, data, content_type, **extra) + + def put(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('PUT', path, data, content_type, **extra) + + def patch(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('PATCH', path, data, content_type, **extra) + + def delete(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('DELETE', path, data, content_type, **extra) + + def options(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('OPTIONS', path, data, content_type, **extra) + + +## ... source file continues with no further force_bytes examples... + +``` + diff --git a/content/pages/examples/django/django-utils-encoding-force-str.markdown b/content/pages/examples/django/django-utils-encoding-force-str.markdown new file mode 100644 index 000000000..3a097e807 --- /dev/null +++ b/content/pages/examples/django/django-utils-encoding-force-str.markdown @@ -0,0 +1,1558 @@ +title: django.utils.encoding force_str Example Code +category: page +slug: django-utils-encoding-force-str-examples +sortorder: 500011443 +toc: False +sidebartitle: django.utils.encoding force_str +meta: Python example code for the force_str callable from the django.utils.encoding module of the Django project. + + +force_str is a callable within the django.utils.encoding module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / utils.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./utils.py) + +```python +# utils.py +import base64 +import importlib +import json +import random +import re +import string +import unicodedata +from collections import OrderedDict +from urllib.parse import urlsplit + +import django +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.core.serializers.json import DjangoJSONEncoder +from django.core.validators import ValidationError, validate_email +from django.db.models import FileField +from django.db.models.fields import ( + BinaryField, + DateField, + DateTimeField, + EmailField, + TimeField, +) +from django.utils import dateparse +~~from django.utils.encoding import force_bytes, force_str + + +MAX_USERNAME_SUFFIX_LENGTH = 7 +USERNAME_SUFFIX_CHARS = ( + [string.digits] * 4 + + [string.ascii_letters] * (MAX_USERNAME_SUFFIX_LENGTH - 4)) + + +def _generate_unique_username_base(txts, regex=None): + from .account.adapter import get_adapter + adapter = get_adapter() + username = None + regex = regex or r'[^\w\s@+.-]' + for txt in txts: + if not txt: + continue +~~ username = unicodedata.normalize('NFKD', force_str(txt)) + username = username.encode('ascii', 'ignore').decode('ascii') +~~ username = force_str(re.sub(regex, '', username).lower()) + username = username.split('@')[0] + username = username.strip() + username = re.sub(r'\s+', '_', username) + try: + username = adapter.clean_username(username, shallow=True) + break + except ValidationError: + pass + return username or 'user' + + +def get_username_max_length(): + from .account.app_settings import USER_MODEL_USERNAME_FIELD + if USER_MODEL_USERNAME_FIELD is not None: + User = get_user_model() + max_length = User._meta.get_field(USER_MODEL_USERNAME_FIELD).max_length + else: + max_length = 0 + return max_length + + +def generate_username_candidate(basename, suffix_length): + max_length = get_username_max_length() + suffix = ''.join( + + +## ... source file abbreviated to get to force_str examples ... + + + assert isinstance(path, str) + pkg, attr = path.rsplit('.', 1) + ret = getattr(importlib.import_module(pkg), attr) + return ret + + +def import_callable(path_or_callable): + if not hasattr(path_or_callable, '__call__'): + ret = import_attribute(path_or_callable) + else: + ret = path_or_callable + return ret + + +SERIALIZED_DB_FIELD_PREFIX = '_db_' + + +def serialize_instance(instance): + data = {} + for k, v in instance.__dict__.items(): + if k.startswith('_') or callable(v): + continue + try: + field = instance._meta.get_field(k) + if isinstance(field, BinaryField): +~~ v = force_str(base64.b64encode(v)) + elif isinstance(field, FileField): + if v and not isinstance(v, str): + v = v.name + try: + json.dumps(v, cls=DjangoJSONEncoder) + except TypeError: + v = field.get_prep_value(v) + k = SERIALIZED_DB_FIELD_PREFIX + k + except FieldDoesNotExist: + pass + data[k] = v + return json.loads(json.dumps(data, cls=DjangoJSONEncoder)) + + +def deserialize_instance(model, data): + ret = model() + for k, v in data.items(): + is_db_value = False + if k.startswith(SERIALIZED_DB_FIELD_PREFIX): + k = k[len(SERIALIZED_DB_FIELD_PREFIX):] + is_db_value = True + if v is not None: + try: + f = model._meta.get_field(k) + + +## ... source file continues with no further force_str examples... + +``` + + +## Example 2 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / validators.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/./validators.py) + +```python +# validators.py +import unicodedata +import binascii + + +from django.core.exceptions import ValidationError +from django.utils.deconstruct import deconstructible +~~from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + + +@deconstructible +class NoControlCharactersValidator: + message = _("Control Characters like new lines or tabs are not allowed.") + code = "no_control_characters" + whitelist = None + + def __init__(self, message=None, code=None, whitelist=None): + if message: + self.message = message + if code: + self.code = code + if whitelist: + self.whitelist = whitelist + + def __call__(self, value): +~~ value = force_str(value) + whitelist = self.whitelist + category = unicodedata.category + for character in value: + if whitelist and character in whitelist: + continue + if category(character)[0] == "C": + params = {'value': value, 'whitelist': whitelist} + raise ValidationError(self.message, code=self.code, params=params) + + def __eq__(self, other): + return ( + isinstance(other, NoControlCharactersValidator) and + (self.whitelist == other.whitelist) and + (self.message == other.message) and + (self.code == other.code) + ) + + +@deconstructible +class NoWhitespaceValidator: + message = _("Leading and Trailing whitespaces are not allowed.") + code = "no_whitespace" + + def __init__(self, message=None, code=None, whitelist=None): + if message: + self.message = message + if code: + self.code = code + + def __call__(self, value): +~~ value = force_str(value) + if value != value.strip(): + params = {'value': value} + raise ValidationError(self.message, code=self.code, params=params) + + def __eq__(self, other): + return ( + isinstance(other, NoWhitespaceValidator) and + (self.message == other.message) and + (self.code == other.code) + ) + + +@deconstructible +class HexValidator: + messages = { + 'invalid': _("Only a hex string is allowed."), + 'length': _("Invalid length. Must be %(length)d characters."), + 'min_length': _("Ensure that there are more than %(min)s characters."), + 'max_length': _("Ensure that there are no more than %(max)s characters."), + } + code = "hex_only" + + def __init__(self, length=None, min_length=None, max_length=None, message=None, code=None): + self.length = length + self.min_length = min_length + self.max_length = max_length + if message: + self.message = message + if code: + self.code = code + + def __call__(self, value): +~~ value = force_str(value) + if self.length and len(value) != self.length: + raise ValidationError(self.messages['length'], code='hex_only_length', params={'length': self.length}) + if self.min_length and len(value) < self.min_length: + raise ValidationError(self.messages['min_length'], code='hex_only_min_length', params={'min': self.min_length}) + if self.max_length and len(value) < self.max_length: + raise ValidationError(self.messages['max_length'], code='hex_only_max_length', params={'max': self.max_length}) + + try: + binascii.unhexlify(value) + except (TypeError, binascii.Error): + raise ValidationError(self.messages['invalid'], code='hex_only') + + def __eq__(self, other): + return ( + isinstance(other, HexValidator) and + (self.message == other.message) and + (self.code == other.code) + ) + + + +## ... source file continues with no further force_str examples... + +``` + + +## Example 3 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / fields.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./fields.py) + +```python +# fields.py +from collections import namedtuple +from datetime import datetime, time + +from django import forms +from django.utils.dateparse import parse_datetime +~~from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +from .conf import settings +from .constants import EMPTY_VALUES +from .utils import handle_timezone +from .widgets import ( + BaseCSVWidget, + CSVWidget, + DateRangeWidget, + LookupChoiceWidget, + RangeWidget +) + + +class RangeField(forms.MultiValueField): + widget = RangeWidget + + def __init__(self, fields=None, *args, **kwargs): + if fields is None: + fields = ( + forms.DecimalField(), + forms.DecimalField()) + super().__init__(fields, *args, **kwargs) + + + +## ... source file abbreviated to get to force_str examples ... + + + empty_label = kwargs.pop('empty_label', settings.EMPTY_CHOICE_LABEL) + fields = (field, ChoiceField(choices=lookup_choices, empty_label=empty_label)) + widget = LookupChoiceWidget(widgets=[f.widget for f in fields]) + kwargs['widget'] = widget + kwargs['help_text'] = field.help_text + super().__init__(fields, *args, **kwargs) + + def compress(self, data_list): + if len(data_list) == 2: + value, lookup_expr = data_list + if value not in EMPTY_VALUES: + if lookup_expr not in EMPTY_VALUES: + return Lookup(value=value, lookup_expr=lookup_expr) + else: + raise forms.ValidationError( + self.error_messages['lookup_required'], + code='lookup_required') + return None + + +class IsoDateTimeField(forms.DateTimeField): + ISO_8601 = 'iso-8601' + input_formats = [ISO_8601] + + def strptime(self, value, format): +~~ value = force_str(value) + + if format == self.ISO_8601: + parsed = parse_datetime(value) + if parsed is None: # Continue with other formats if doesn't match + raise ValueError + return handle_timezone(parsed) + return super().strptime(value, format) + + +class BaseCSVField(forms.Field): + base_widget_class = BaseCSVWidget + + def __init__(self, *args, **kwargs): + widget = kwargs.get('widget') or self.widget + kwargs['widget'] = self._get_widget_class(widget) + + super().__init__(*args, **kwargs) + + def _get_widget_class(self, widget): + if isinstance(widget, BaseCSVWidget) or ( + isinstance(widget, type) and + issubclass(widget, BaseCSVWidget)): + return widget + + + +## ... source file continues with no further force_str examples... + +``` + + +## Example 4 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / widgets.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./widgets.py) + +```python +# widgets.py +import datetime +import re +from itertools import chain + +import django +from django import forms +from django.conf import settings +from django.forms.widgets import FILE_INPUT_CONTRADICTION +from django.template import loader +from django.utils import datetime_safe, formats +from django.utils.dates import MONTHS +~~from django.utils.encoding import force_str +from django.utils.html import conditional_escape +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ + +from .compat import MULTIVALUE_DICT_TYPES, flatten_contexts + + +from django.forms.utils import to_current_timezone + + +RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$') + + +__all__ = ( + 'TextInput', 'PasswordInput', 'HiddenInput', 'ClearableFileInput', + 'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', + 'CheckboxInput', 'Select', 'NullBooleanSelect', 'SelectMultiple', + 'RadioSelect', 'CheckboxSelectMultiple', 'SearchInput', 'RangeInput', + 'ColorInput', 'EmailInput', 'URLInput', 'PhoneNumberInput', 'NumberInput', + 'IPAddressInput', 'MultiWidget', 'Widget', 'SplitDateTimeWidget', + 'SplitHiddenDateTimeWidget', 'MultipleHiddenInput', 'SelectDateWidget', + 'SlugInput', +) + + + +## ... source file abbreviated to get to force_str examples ... + + + def format_value(self, value): + return self._format_value(value) + + +class Input(Widget): + template_name = 'floppyforms/input.html' + input_type = None + datalist = None + + def __init__(self, *args, **kwargs): + datalist = kwargs.pop('datalist', None) + if datalist is not None: + self.datalist = datalist + template_name = kwargs.pop('template_name', None) + if template_name is not None: + self.template_name = template_name + super(Input, self).__init__(*args, **kwargs) + self.context_instance = None + + def get_context_data(self): + return {} + + def format_value(self, value): + if self.is_localized: + value = formats.localize_input(value) +~~ return force_str(value) + + def get_context(self, name, value, attrs=None): + context = { + 'widget': self, + 'type': self.input_type, + 'name': name, + 'hidden': self.is_hidden, + 'required': self.is_required, + 'True': True, + } + + if self.is_hidden: + context['hidden'] = True + + if value is None: + value = '' + + if value != '': + context['value'] = self.format_value(value) + + context.update(self.get_context_data()) + context['attrs'] = self.build_attrs(attrs) + + for key, attr in context['attrs'].items(): + + +## ... source file abbreviated to get to force_str examples ... + + + + +class HiddenInput(Input): + template_name = 'floppyforms/hidden.html' + input_type = 'hidden' + + +class MultipleHiddenInput(HiddenInput): + def __init__(self, attrs=None, choices=()): + super(MultipleHiddenInput, self).__init__(attrs) + self.choices = choices + + def render(self, name, value, attrs=None, choices=(), renderer=None): + if value is None: + value = [] + + final_attrs = self.build_attrs(attrs) + id_ = final_attrs.get('id', None) + inputs = [] + for i, v in enumerate(value): + input_attrs = final_attrs.copy() + if id_: + input_attrs['id'] = '%s_%s' % (id_, i) + input_ = HiddenInput() + input_.is_required = self.is_required +~~ inputs.append(input_.render(name, force_str(v), input_attrs, renderer=renderer)) + return mark_safe("\n".join(inputs)) + + def value_from_datadict(self, data, files, name): + if isinstance(data, MULTIVALUE_DICT_TYPES): + return data.getlist(name) + return data.get(name, None) + + +class SlugInput(TextInput): + template_name = 'floppyforms/slug.html' + + def get_context(self, name, value, attrs): + context = super(SlugInput, self).get_context(name, value, attrs) + context['attrs']['pattern'] = r"[-\w]+" + return context + + +class IPAddressInput(TextInput): + template_name = 'floppyforms/ipaddress.html' + + ip_pattern = (r"(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25" + r"[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}") + + def get_context(self, name, value, attrs): + + +## ... source file abbreviated to get to force_str examples ... + + + + +def boolean_check(v): + return not (v is False or v is None or v == '') + + +class CheckboxInput(Input, forms.CheckboxInput): + template_name = 'floppyforms/checkbox.html' + input_type = 'checkbox' + + def __init__(self, attrs=None, check_test=None): + super(CheckboxInput, self).__init__(attrs) + self.check_test = boolean_check if check_test is None else check_test + + def get_context(self, name, value, attrs): + result = self.check_test(value) + context = super(CheckboxInput, self).get_context(name, value, attrs) + if result: + context['attrs']['checked'] = True + return context + + def format_value(self, value): + if value in ('', True, False, None): + value = None + else: +~~ value = force_str(value) + return value + + def value_from_datadict(self, data, files, name): + return forms.CheckboxInput.value_from_datadict(self, data, files, name) + + if django.VERSION < (1, 6): + def _has_changed(self, initial, data): + if initial == 'False': + initial = False + return bool(initial) != bool(data) + + +class Select(Input): + allow_multiple_selected = False + template_name = 'floppyforms/select.html' + + def __init__(self, attrs=None, choices=()): + super(Select, self).__init__(attrs) + self.choices = list(choices) + + def get_context(self, name, value, attrs=None, choices=()): + if not hasattr(value, '__iter__') or isinstance(value, + str): + value = [value] + context = super(Select, self).get_context(name, value, attrs) + + if self.allow_multiple_selected: + context['attrs']['multiple'] = "multiple" + + groups = [] + for option_value, option_label in chain(self.choices, choices): + if isinstance(option_label, (list, tuple)): + group = [] + for val, lab in option_label: + group.append((force_str(val), lab)) + groups.append((option_value, group)) + else: +~~ option_value = force_str(option_value) + if groups and groups[-1][0] is None: + groups[-1][1].append((option_value, option_label)) + else: + groups.append((None, [(option_value, option_label)])) + context["optgroups"] = groups + return context + + def format_value(self, value): + if len(value) == 1 and value[0] is None: + return [] + return set(force_str(v) for v in value) + + +class NullBooleanSelect(Select): + def __init__(self, attrs=None): + choices = (('1', _('Unknown')), + ('2', _('Yes')), + ('3', _('No'))) + super(NullBooleanSelect, self).__init__(attrs, choices) + + def format_value(self, value): + value = value[0] + try: + value = {True: '2', False: '3', '2': '2', '3': '3'}[value] + + +## ... source file abbreviated to get to force_str examples ... + + + template_name = 'floppyforms/radio.html' + + +class CheckboxSelectMultiple(SelectMultiple): + template_name = 'floppyforms/checkbox_select.html' + + +class MultiWidget(forms.MultiWidget): + @property + def is_hidden(self): + return all(w.is_hidden for w in self.widgets) + + def build_attrs(self, base_attrs, extra_attrs=None, **kwargs): + attrs = dict(self.attrs, **kwargs) + attrs.update(base_attrs) + if extra_attrs: + attrs.update(extra_attrs) + return attrs + + if django.VERSION < (1, 11): + def format_value(self, value): + if value == '' or value is None: + return None + if self.is_localized: + return formats.localize_input(value) +~~ return force_str(value) + + def get_context(self, name, value, attrs): + context = {} + context['widget'] = { + 'name': name, + 'is_hidden': self.is_hidden, + 'required': self.is_required, + 'value': self.format_value(value), + 'attrs': self.build_attrs(self.attrs, attrs), + 'template_name': self.template_name, + } + if self.is_localized: + for widget in self.widgets: + widget.is_localized = self.is_localized + if not isinstance(value, list): + value = self.decompress(value) + + final_attrs = context['widget']['attrs'] + input_type = final_attrs.pop('type', None) + id_ = final_attrs.get('id') + subwidgets = [] + for i, widget in enumerate(self.widgets): + if input_type is not None: + widget.input_type = input_type + + +## ... source file continues with no further force_str examples... + +``` + + +## Example 5 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / core.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./core.py) + +```python +# core.py +from itertools import chain + +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Permission +from django.db.models.query import QuerySet +~~from django.utils.encoding import force_str + +from guardian.conf import settings as guardian_settings +from guardian.ctypes import get_content_type +from guardian.utils import get_group_obj_perms_model, get_identity, get_user_obj_perms_model + + +def _get_pks_model_and_ctype(objects): + + if isinstance(objects, QuerySet): + model = objects.model + pks = [force_str(pk) for pk in objects.values_list('pk', flat=True)] + ctype = get_content_type(model) + else: + pks = [] + for idx, obj in enumerate(objects): + if not idx: + model = type(obj) + ctype = get_content_type(model) + pks.append(force_str(obj.pk)) + + return pks, model, ctype + + +class ObjectPermissionChecker: + + +## ... source file abbreviated to get to force_str examples ... + + + return [] + + if guardian_settings.AUTO_PREFETCH: + self._prefetch_cache() + + ctype = get_content_type(obj) + key = self.get_local_cache_key(obj) + if key not in self._obj_perms_cache: + if guardian_settings.AUTO_PREFETCH: + return [] + if self.user and self.user.is_superuser: + perms = list(chain(*Permission.objects + .filter(content_type=ctype) + .values_list("codename"))) + elif self.user: + user_perms = self.get_user_perms(obj) + group_perms = self.get_group_perms(obj) + perms = list(set(chain(user_perms, group_perms))) + else: + perms = list(set(self.get_group_perms(obj))) + self._obj_perms_cache[key] = perms + return self._obj_perms_cache[key] + + def get_local_cache_key(self, obj): + ctype = get_content_type(obj) +~~ return (ctype.id, force_str(obj.pk)) + + def prefetch_perms(self, objects): + if self.user and not self.user.is_active: + return [] + + User = get_user_model() + pks, model, ctype = _get_pks_model_and_ctype(objects) + + if self.user and self.user.is_superuser: + perms = list(chain( + *Permission.objects + .filter(content_type=ctype) + .values_list("codename"))) + + for pk in pks: +~~ key = (ctype.id, force_str(pk)) + self._obj_perms_cache[key] = perms + + return True + + group_model = get_group_obj_perms_model(model) + + if self.user: + fieldname = 'group__{}'.format( + User.groups.field.related_query_name(), + ) + group_filters = {fieldname: self.user} + else: + group_filters = {'group': self.group} + + if group_model.objects.is_generic(): + group_filters.update({ + 'content_type': ctype, + 'object_pk__in': pks, + }) + else: + group_filters.update({ + 'content_object_id__in': pks + }) + + + +## ... source file abbreviated to get to force_str examples ... + + + 'content_type': ctype, + 'object_pk__in': pks + }) + else: + user_filters.update({ + 'content_object_id__in': pks + }) + + user_perms_qs = model.objects.filter(**user_filters).select_related('permission') + group_perms_qs = group_model.objects.filter(**group_filters).select_related('permission') + perms = chain(user_perms_qs, group_perms_qs) + else: + perms = chain( + *(group_model.objects.filter(**group_filters).select_related('permission'),) + ) + + for obj in objects: + key = self.get_local_cache_key(obj) + if key not in self._obj_perms_cache: + self._obj_perms_cache[key] = [] + + for perm in perms: + if type(perm).objects.is_generic(): + key = (ctype.id, perm.object_pk) + else: +~~ key = (ctype.id, force_str(perm.content_object_id)) + + self._obj_perms_cache[key].append(perm.permission.codename) + + return True + + @staticmethod + def _init_obj_prefetch_cache(obj, *querysets): + cache = {} + for qs in querysets: + perms = qs.select_related('permission__codename').values_list('content_type_id', 'object_pk', + 'permission__codename') + for p in perms: + if p[:2] not in cache: + cache[p[:2]] = [] + cache[p[:2]] += [p[2], ] + obj._guardian_perms_cache = cache + return obj, cache + + def _prefetch_cache(self): + from guardian.utils import get_user_obj_perms_model, get_group_obj_perms_model + UserObjectPermission = get_user_obj_perms_model() + GroupObjectPermission = get_group_obj_perms_model() + if self.user: + obj = self.user + + +## ... source file continues with no further force_str examples... + +``` + + +## Example 6 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / models.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./models.py) + +```python +# models.py + +from django.core.exceptions import ObjectDoesNotExist +~~from django.utils.encoding import force_str +from django.utils.text import capfirst + +from haystack.constants import DEFAULT_ALIAS +from haystack.exceptions import NotHandled, SpatialError +from haystack.utils import log as logging +from haystack.utils.app_loading import haystack_get_model + +try: + from geopy import distance as geopy_distance +except ImportError: + geopy_distance = None + + +class SearchResult(object): + + def __init__(self, app_label, model_name, pk, score, **kwargs): + self.app_label, self.model_name = app_label, model_name + self.pk = pk + self.score = score + self._object = None + self._model = None + self._verbose_name = None + self._additional_fields = [] + self._point_of_origin = kwargs.pop("_point_of_origin", None) + self._distance = kwargs.pop("_distance", None) + self.stored_fields = None + self.log = self._get_log() + + for key, value in kwargs.items(): + if key not in self.__dict__: + self.__dict__[key] = value + self._additional_fields.append(key) + + def _get_log(self): + return logging.getLogger("haystack") + + def __repr__(self): + return "" % ( + self.app_label, + self.model_name, + self.pk, + ) + + def __str__(self): +~~ return force_str(self.__repr__()) + + def __getattr__(self, attr): + if attr == "__getnewargs__": + raise AttributeError + + return self.__dict__.get(attr, None) + + def _get_searchindex(self): + from haystack import connections + + return connections[DEFAULT_ALIAS].get_unified_index().get_index(self.model) + + searchindex = property(_get_searchindex) + + def _get_object(self): + if self._object is None: + if self.model is None: + self.log.error("Model could not be found for SearchResult '%s'.", self) + return None + + try: + try: + self._object = self.searchindex.read_queryset().get(pk=self.pk) + except NotHandled: + + +## ... source file abbreviated to get to force_str examples ... + + + ) + + po_lng, po_lat = self._point_of_origin["point"].coords + location_field = getattr(self, self._point_of_origin["field"]) + + if location_field is None: + return None + + lf_lng, lf_lat = location_field.coords + self._distance = Distance( + km=geopy_distance.distance((po_lat, po_lng), (lf_lat, lf_lng)).km + ) + + return self._distance + + def _set_distance(self, dist): + self._distance = dist + + distance = property(_get_distance, _set_distance) + + def _get_verbose_name(self): + if self.model is None: + self.log.error("Model could not be found for SearchResult '%s'.", self) + return "" + +~~ return force_str(capfirst(self.model._meta.verbose_name)) + + verbose_name = property(_get_verbose_name) + + def _get_verbose_name_plural(self): + if self.model is None: + self.log.error("Model could not be found for SearchResult '%s'.", self) + return "" + +~~ return force_str(capfirst(self.model._meta.verbose_name_plural)) + + verbose_name_plural = property(_get_verbose_name_plural) + + def content_type(self): + if self.model is None: + self.log.error("Model could not be found for SearchResult '%s'.", self) + return "" + + return str(self.model._meta) + + def get_additional_fields(self): + additional_fields = {} + + for fieldname in self._additional_fields: + additional_fields[fieldname] = getattr(self, fieldname) + + return additional_fields + + def get_stored_fields(self): + if self._stored_fields is None: + from haystack import connections + + try: + index = connections[DEFAULT_ALIAS].get_unified_index().get_index(self.model) + + +## ... source file continues with no further force_str examples... + +``` + + +## Example 7 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / widgets.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./widgets.py) + +```python +# widgets.py +import json +from datetime import date, datetime +from decimal import Decimal + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.utils import datetime_safe, timezone +from django.utils.dateparse import parse_duration +~~from django.utils.encoding import force_str, smart_str + + +class Widget: + def clean(self, value, row=None, *args, **kwargs): + return value + + def render(self, value, obj=None): +~~ return force_str(value) + + +class NumberWidget(Widget): + + def is_empty(self, value): + if isinstance(value, str): + value = value.strip() + return value is None or value == "" + + def render(self, value, obj=None): + return value + + +class FloatWidget(NumberWidget): + + def clean(self, value, row=None, *args, **kwargs): + if self.is_empty(value): + return None + return float(value) + + +class IntegerWidget(NumberWidget): + + def clean(self, value, row=None, *args, **kwargs): + if self.is_empty(value): + return None + return int(float(value)) + + +class DecimalWidget(NumberWidget): + + def clean(self, value, row=None, *args, **kwargs): + if self.is_empty(value): + return None + return Decimal(force_str(value)) + + +class CharWidget(Widget): + + def render(self, value, obj=None): +~~ return force_str(value) + + +class BooleanWidget(Widget): + TRUE_VALUES = ["1", 1, True, "true", "TRUE", "True"] + FALSE_VALUES = ["0", 0, False, "false", "FALSE", "False"] + NULL_VALUES = ["", None, "null", "NULL", "none", "NONE", "None"] + + def render(self, value, obj=None): + if value in self.NULL_VALUES: + return "" + return self.TRUE_VALUES[0] if value else self.FALSE_VALUES[0] + + def clean(self, value, row=None, *args, **kwargs): + if value in self.NULL_VALUES: + return None + return True if value in self.TRUE_VALUES else False + + +class DateWidget(Widget): + + def __init__(self, format=None): + if format is None: + if not settings.DATE_INPUT_FORMATS: + formats = ("%Y-%m-%d",) + + +## ... source file continues with no further force_str examples... + +``` + + +## Example 8 from django-jsonfield +[django-jsonfield](https://github.com/dmkoch/django-jsonfield) +([jsonfield on PyPi](https://pypi.org/project/jsonfield/)) is a +[Django](/django.html) code library that makes it easier to store validated +JSON in a [Django object-relational mapper (ORM)](/django-orm.html) database +model. + +The django-jsonfield project is open source under the +[MIT license](https://github.com/dmkoch/django-jsonfield/blob/master/LICENSE). + +[**django-jsonfield / src/jsonfield / encoder.py**](https://github.com/dmkoch/django-jsonfield/blob/master/src/jsonfield/./encoder.py) + +```python +# encoder.py +import datetime +import decimal +import json +import uuid + +from django.db.models.query import QuerySet +from django.utils import timezone +~~from django.utils.encoding import force_str +from django.utils.functional import Promise + + +class JSONEncoder(json.JSONEncoder): + def default(self, obj): # noqa: C901 + if isinstance(obj, Promise): +~~ return force_str(obj) + elif isinstance(obj, datetime.datetime): + representation = obj.isoformat() + if representation.endswith('+00:00'): + representation = representation[:-6] + 'Z' + return representation + elif isinstance(obj, datetime.date): + return obj.isoformat() + elif isinstance(obj, datetime.time): + if timezone and timezone.is_aware(obj): + raise ValueError("JSON can't represent timezone-aware times.") + representation = obj.isoformat() + return representation + elif isinstance(obj, datetime.timedelta): + return str(obj.total_seconds()) + elif isinstance(obj, decimal.Decimal): + return float(obj) + elif isinstance(obj, uuid.UUID): + return str(obj) + elif isinstance(obj, QuerySet): + return tuple(obj) + elif isinstance(obj, bytes): + return obj.decode() + elif hasattr(obj, 'tolist'): + return obj.tolist() + + +## ... source file continues with no further force_str examples... + +``` + + +## Example 9 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / validators.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./validators.py) + +```python +# validators.py +import re +from urllib.parse import urlsplit + +from django.core.exceptions import ValidationError +from django.core.validators import URLValidator +~~from django.utils.encoding import force_str + + +class URIValidator(URLValidator): + scheme_re = r"^(?:[a-z][a-z0-9\.\-\+]*)://" + + dotless_domain_re = r"(?!-)[A-Z\d-]{1,63}(?' + else: + li_format = '
  • {3}
  • ' +~~ err_tuple = (e[0], e[3], e[4], force_text(e[5])) + error_lists[e[2]].append(format_html(li_format, *err_tuple)) + dirty_errors, pristine_errors = '', '' + if len(error_lists['$dirty']) > 0: + dirty_errors = format_html( + '
      {2}
    ', # duck typing: !...$untouched + first[0], first[1], mark_safe(''.join(error_lists['$dirty'])) + ) + if len(error_lists['$pristine']) > 0: + pristine_errors = format_html( + '
      {2}
    ', + first[0], first[1], mark_safe(''.join(error_lists['$pristine'])) + ) + return format_html('{}{}', dirty_errors, pristine_errors) + return format_html('
      {0}
    ', + format_html_join('', '
  • {0}
  • ', ((force_text(e),) for e in self))) + + def as_text(self): + if not self: + return '' + if isinstance(self[0], tuple): +~~ return '\n'.join(['* %s' % force_text(e[5]) for e in self if bool(e[5])]) +~~ return '\n'.join(['* %s' % force_text(e) for e in self]) + + def __str__(self): + return self.as_ul() + + def __repr__(self): + if self and isinstance(self[0], tuple): + return repr([force_text(e[5]) for e in self]) + return repr([force_text(e) for e in self]) + + def __contains__(self, item): + return item in list(self) + + def __eq__(self, other): + return list(self) == other + + def __ne__(self, other): + return list(self) != other + + def __getitem__(self, i): + error = self.data[i] + if isinstance(error, tuple): + if isinstance(error[5], ValidationError): + error[5] = list(error[5])[0] + return error + if isinstance(error, ValidationError): + return list(error)[0] +~~ return force_text(error) + + +class NgWidgetMixin(object): + def get_context(self, name, value, attrs): + context = super(NgWidgetMixin, self).get_context(name, value, attrs) + if callable(getattr(self._field, 'update_widget_rendering_context', None)): + self._field.update_widget_rendering_context(context) + return context + + +class NgBoundField(forms.BoundField): + @property + def errors(self): + if not hasattr(self, '_errors_cache'): + self._errors_cache = self.form.get_field_errors(self) + return self._errors_cache + + def css_classes(self, extra_classes=None): + if hasattr(extra_classes, 'split'): + extra_classes = extra_classes.split() + extra_classes = set(extra_classes or []) + field_css_classes = getattr(self.form, 'field_css_classes', None) + if hasattr(field_css_classes, 'split'): + extra_classes.update(field_css_classes.split()) + + +## ... source file continues with no further force_text examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_base.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_base.py) + +```python +# plugin_base.py +import json +import re + +from django.shortcuts import render as render_to_response + +from django import forms +from django.contrib import admin +from django.contrib import messages +from django.core.exceptions import ( + ImproperlyConfigured, + ObjectDoesNotExist, + ValidationError, +) +~~from django.utils.encoding import force_text, smart_str +from django.utils.html import escapejs +from django.utils.translation import ugettext, ugettext_lazy as _ + +from six import with_metaclass, python_2_unicode_compatible + +from cms import operations +from cms.exceptions import SubClassNeededError +from cms.models import CMSPlugin +from cms.toolbar.utils import get_plugin_tree_as_json, get_plugin_toolbar_info +from cms.utils.conf import get_cms_setting + + +class CMSPluginBaseMetaclass(forms.MediaDefiningClass): + def __new__(cls, name, bases, attrs): + super_new = super(CMSPluginBaseMetaclass, cls).__new__ + parents = [base for base in bases if isinstance(base, CMSPluginBaseMetaclass)] + if not parents: + return super_new(cls, name, bases, attrs) + new_plugin = super_new(cls, name, bases, attrs) + if not issubclass(new_plugin.model, CMSPlugin): + raise SubClassNeededError( + "The 'model' attribute on CMSPluginBase subclasses must be " + "either CMSPlugin or a subclass of CMSPlugin. %r on %r is not." + % (new_plugin.model, new_plugin) + + +## ... source file abbreviated to get to force_text examples ... + + + else: + parent_id = obj.parent.pk if obj.parent else None + tree_order = obj.placeholder.get_plugin_tree_order(parent_id) + operation_kwargs['plugin'] = obj + operation_kwargs['operation'] = operations.ADD_PLUGIN + operation_kwargs['tree_order'] = tree_order + self._operation_token = pl_admin._send_pre_placeholder_operation(**operation_kwargs) + + self.saved_object = obj + return super(CMSPluginBase, self).save_model(request, obj, form, change) + + def save_form(self, request, form, change): + obj = super(CMSPluginBase, self).save_form(request, form, change) + + for field, value in self._cms_initial_attributes.items(): + setattr(obj, field, value) + return obj + + def response_add(self, request, obj, **kwargs): + self.object_successfully_changed = True + return self.render_close_frame(request, obj) + + def response_change(self, request, obj): + self.object_successfully_changed = True + opts = self.model._meta +~~ msg_dict = {'name': force_text(opts.verbose_name), 'obj': force_text(obj)} + msg = _('The %(name)s "%(obj)s" was changed successfully.') % msg_dict + self.message_user(request, msg, messages.SUCCESS) + return self.render_close_frame(request, obj) + + def log_addition(self, request, obj, bypass=None): + pass + + def log_change(self, request, obj, message, bypass=None): + pass + + def log_deletion(self, request, obj, object_repr, bypass=None): + pass + + def icon_src(self, instance): + return "" + + def icon_alt(self, instance): +~~ return "%s - %s" % (force_text(self.name), force_text(instance)) + + def get_fieldsets(self, request, obj=None): + fieldsets = super(CMSPluginBase, self).get_fieldsets(request, obj) + + for name, data in fieldsets: + if data.get('fields'): # if fieldset with non-empty fields is found, return fieldsets + return fieldsets + + if self.inlines: + return [] # if plugin has inlines but no own fields return empty fieldsets to remove empty white fieldset + + try: # if all fieldsets are empty (assuming there is only one fieldset then) add description + fieldsets[0][1]['description'] = self.get_empty_change_form_text(obj=obj) + except KeyError: + pass + return fieldsets + + @classmethod + def get_empty_change_form_text(cls, obj=None): + return ugettext('There are no further settings for this plugin. Please press save.') + + @classmethod + def get_child_class_overrides(cls, slot, page): + from cms.utils.placeholder import get_placeholder_conf + + +## ... source file continues with no further force_text examples... + +``` + + +## Example 3 from django-downloadview +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + +[**django-downloadview / django_downloadview / io.py**](https://github.com/benoitbryon/django-downloadview/blob/master/django_downloadview/./io.py) + +```python +# io.py +import io + +~~from django.utils.encoding import force_bytes, force_text + + +class TextIteratorIO(io.TextIOBase): + + def __init__(self, iterator): + self._iter = iterator + + self._left = "" + + def readable(self): + return True + + def _read1(self, n=None): + while not self._left: + try: + self._left = next(self._iter) + except StopIteration: + break + else: +~~ self._left = force_text(self._left) + ret = self._left[:n] + self._left = self._left[len(ret) :] + return ret + + def read(self, n=None): + chunks = [] + if n is None or n < 0: + while True: + m = self._read1() + if not m: + break + chunks.append(m) + else: + while n > 0: + m = self._read1(n) + if not m: + break + n -= len(m) + chunks.append(m) + return "".join(chunks) + + def readline(self): + chunks = [] + while True: + + +## ... source file continues with no further force_text examples... + +``` + + +## Example 4 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / folderadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/folderadmin.py) + +```python +# folderadmin.py +from __future__ import absolute_import, division, unicode_literals + +import itertools +import os +import re +from collections import OrderedDict + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import messages +from django.contrib.admin import helpers +from django.contrib.admin.utils import capfirst, quote, unquote +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.db import models, router +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +~~from django.utils.encoding import force_text +from django.utils.html import escape +from django.utils.http import urlquote, urlunquote +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy, ungettext + +from .. import settings +from ..models import ( + File, Folder, FolderPermission, FolderRoot, ImagesWithMissingData, + UnsortedImages, tools, +) +from ..settings import FILER_IMAGE_MODEL, FILER_PAGINATE_BY +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import get_delete_permission +from ..utils.filer_easy_thumbnails import FilerActionThumbnailer +from ..utils.loader import load_model +from . import views +from .forms import CopyFilesAndFoldersForm, RenameFilesForm, ResizeImagesForm +from .patched.admin_utils import get_deleted_objects +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import ( + AdminContext, admin_url_params_encoded, check_files_edit_permissions, + check_files_read_permissions, check_folder_edit_permissions, + check_folder_read_permissions, popup_status, userperms_for_request, + + +## ... source file abbreviated to get to force_text examples ... + + + app_label = opts.app_label + + if not self.has_delete_permission(request): + raise PermissionDenied + + current_folder = self._get_current_action_folder( + request, files_queryset, folders_queryset) + + all_protected = [] + + using = router.db_for_write(self.model) + deletable_files, model_count_files, perms_needed_files, protected_files = get_deleted_objects(files_queryset, files_queryset.model._meta, request.user, self.admin_site, using) + deletable_folders, model_count_folder, perms_needed_folders, protected_folders = get_deleted_objects(folders_queryset, folders_queryset.model._meta, request.user, self.admin_site, using) + all_protected.extend(protected_files) + all_protected.extend(protected_folders) + + all_deletable_objects = [deletable_files, deletable_folders] + all_perms_needed = perms_needed_files.union(perms_needed_folders) + + if request.POST.get('post'): + if all_perms_needed: + raise PermissionDenied + n = files_queryset.count() + folders_queryset.count() + if n: + for f in files_queryset: +~~ self.log_deletion(request, f, force_text(f)) + f.delete() + folder_ids = set() + for folder in folders_queryset: + folder_ids.add(folder.id) + folder_ids.update( + folder.get_descendants().values_list('id', flat=True)) + for f in File.objects.filter(folder__in=folder_ids): +~~ self.log_deletion(request, f, force_text(f)) + f.delete() + for f in folders_queryset: +~~ self.log_deletion(request, f, force_text(f)) + f.delete() + self.message_user(request, _("Successfully deleted %(count)d files and/or folders.") % {"count": n, }) + return None + + if all_perms_needed or all_protected: + title = _("Cannot delete files and/or folders") + else: + title = _("Are you sure?") + + context = self.admin_site.each_context(request) + context.update({ + "title": title, + "instance": current_folder, + "breadcrumbs_action": _("Delete files and/or folders"), + "deletable_objects": all_deletable_objects, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": all_perms_needed, + "protected": all_protected, + "opts": opts, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request), + "root_path": reverse('admin:index'), + "app_label": app_label, + + +## ... source file abbreviated to get to force_text examples ... + + + request, + "admin/filer/delete_selected_files_confirmation.html", + context + ) + + delete_files_or_folders.short_description = ugettext_lazy( + "Delete selected files and/or folders") + + def _format_callback(self, obj, user, admin_site, perms_needed): + has_admin = obj.__class__ in admin_site._registry + opts = obj._meta + if has_admin: + admin_url = reverse('%s:%s_%s_change' + % (admin_site.name, + opts.app_label, + opts.object_name.lower()), + None, (quote(obj._get_pk_val()),)) + p = get_delete_permission(opts) + if not user.has_perm(p): + perms_needed.add(opts.verbose_name) + return mark_safe('%s: %s' % + (escape(capfirst(opts.verbose_name)), + admin_url, + escape(obj))) + else: +~~ return '%s: %s' % (capfirst(opts.verbose_name), force_text(obj)) + + def _check_copy_perms(self, request, files_queryset, folders_queryset): + try: + check_files_read_permissions(request, files_queryset) + check_folder_read_permissions(request, folders_queryset) + except PermissionDenied: + return True + return False + + def _check_move_perms(self, request, files_queryset, folders_queryset): + try: + check_files_read_permissions(request, files_queryset) + check_folder_read_permissions(request, folders_queryset) + check_files_edit_permissions(request, files_queryset) + check_folder_edit_permissions(request, folders_queryset) + except PermissionDenied: + return True + return False + + def _get_current_action_folder(self, request, files_queryset, + folders_queryset): + if files_queryset: + return files_queryset[0].folder + elif folders_queryset: + + +## ... source file abbreviated to get to force_text examples ... + + + else: + return None + + def _list_folders_to_copy_or_move(self, request, folders): + for fo in folders: + yield self._format_callback(fo, request.user, self.admin_site, set()) + children = list(self._list_folders_to_copy_or_move(request, fo.children.all())) + children.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(fo.files)]) + if children: + yield children + + def _list_all_to_copy_or_move(self, request, files_queryset, folders_queryset): + to_copy_or_move = list(self._list_folders_to_copy_or_move(request, folders_queryset)) + to_copy_or_move.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(files_queryset)]) + return to_copy_or_move + + def _list_all_destination_folders_recursive(self, request, folders_queryset, current_folder, folders, allow_self, level): + for fo in folders: + if not allow_self and fo in folders_queryset: + continue + + if not fo.has_read_permission(request): + continue + + enabled = (allow_self or fo != current_folder) and fo.has_add_children_permission(request) +~~ yield (fo, (mark_safe(("  " * level) + force_text(fo)), enabled)) + for c in self._list_all_destination_folders_recursive(request, folders_queryset, current_folder, fo.children.all(), allow_self, level + 1): + yield c + + def _list_all_destination_folders(self, request, folders_queryset, current_folder, allow_self): + root_folders = self.get_queryset(request).filter(parent__isnull=True).order_by('name') + return list(self._list_all_destination_folders_recursive(request, folders_queryset, current_folder, root_folders, allow_self, 0)) + + def _move_files_and_folders_impl(self, files_queryset, folders_queryset, destination): + for f in files_queryset: + f.folder = destination + f.save() + for f in folders_queryset: + f.move_to(destination, 'last-child') + f.save() + + def move_files_and_folders(self, request, files_queryset, folders_queryset): + opts = self.model._meta + app_label = opts.app_label + + current_folder = self._get_current_action_folder(request, files_queryset, folders_queryset) + perms_needed = self._check_move_perms(request, files_queryset, folders_queryset) + to_move = self._list_all_to_copy_or_move(request, files_queryset, folders_queryset) + folders = self._list_all_destination_folders(request, folders_queryset, current_folder, False) + + + +## ... source file continues with no further force_text examples... + +``` + + +## Example 5 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import datetime +import json +from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 + from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +~~from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + kwargs.setdefault('content_type', 'application/json') + data = json.dumps(data, cls=encoder) + super(JsonResponse, self).__init__(content=data, **kwargs) + + +def get_app_list(context, order=True): + + +## ... source file abbreviated to get to force_text examples ... + + + try: + current_resolver = resolve(context.get('request').path) + index_resolver = resolve(reverse('%s:index' % current_resolver.namespaces[0])) + + if hasattr(index_resolver.func, 'admin_site'): + return index_resolver.func.admin_site + + for func_closure in index_resolver.func.__closure__: + if isinstance(func_closure.cell_contents, AdminSite): + return func_closure.cell_contents + except: + pass + + return admin.site + + +def get_admin_site_name(context): + return get_admin_site(context).name + + +class LazyDateTimeEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date): + return obj.isoformat() + elif isinstance(obj, Promise): +~~ return force_text(obj) + return self.encode(obj) + + +def get_model_instance_label(instance): + if getattr(instance, "related_label", None): + return instance.related_label() + return smart_text(instance) + + +class SuccessMessageMixin(object): + success_message = '' + + def form_valid(self, form): + response = super(SuccessMessageMixin, self).form_valid(form) + success_message = self.get_success_message(form.cleaned_data) + if success_message: + messages.success(self.request, success_message) + return response + + def get_success_message(self, cleaned_data): + return self.success_message % cleaned_data + + +def get_model_queryset(admin_site, model, request, preserved_filters=None): + + +## ... source file continues with no further force_text examples... + +``` + + +## Example 6 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / compressors / __init__.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/compressors/__init__.py) + +```python +# __init__.py +import base64 +import os +import posixpath +import re +import subprocess + +from itertools import takewhile + +from django.contrib.staticfiles.storage import staticfiles_storage +~~from django.utils.encoding import smart_bytes, force_text + +from pipeline.conf import settings +from pipeline.exceptions import CompressorError +from pipeline.utils import to_class, relpath, set_std_streams_blocking + +URL_DETECTOR = r"""url\((['"]?)\s*(.*?)\1\)""" +URL_REPLACER = r"""url\(__EMBED__(.+?)(\?\d+)?\)""" +NON_REWRITABLE_URL = re.compile(r'^(#|http:|https:|data:|//)') + +DEFAULT_TEMPLATE_FUNC = "template" +TEMPLATE_FUNC = r"""var template = function(str){var fn = new Function('obj', 'var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push(\''+str.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/<%=([\s\S]+?)%>/g,function(match,code){return "',"+code.replace(/\\'/g, "'")+",'";}).replace(/<%([\s\S]+?)%>/g,function(match,code){return "');"+code.replace(/\\'/g, "'").replace(/[\r\n\t]/g,' ')+"__p.push('";}).replace(/\r/g,'\\r').replace(/\n/g,'\\n').replace(/\t/g,'\\t')+"');}return __p.join('');");return fn;};""" + +MIME_TYPES = { + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.gif': 'image/gif', + '.tif': 'image/tiff', + '.tiff': 'image/tiff', + '.ttf': 'font/truetype', + '.otf': 'font/opentype', + '.woff': 'font/woff' +} +EMBED_EXTS = MIME_TYPES.keys() + + +## ... source file abbreviated to get to force_text examples ... + + + def embeddable(self, path, variant): + name, ext = os.path.splitext(path) + font = ext in FONT_EXTS + if not variant: + return False + if not (re.search(settings.EMBED_PATH, path.replace('\\', '/')) and self.storage.exists(path)): + return False + if ext not in EMBED_EXTS: + return False + if not (font or len(self.encoded_content(path)) < settings.EMBED_MAX_IMAGE_SIZE): + return False + return True + + def with_data_uri(self, css): + def datauri(match): + path = match.group(1) + mime_type = self.mime_type(path) + data = self.encoded_content(path) + return f"url(\"data:{mime_type};charset=utf-8;base64,{data}\")" + return re.sub(URL_REPLACER, datauri, css) + + def encoded_content(self, path): + if path in self.__class__.asset_contents: + return self.__class__.asset_contents[path] + data = self.read_bytes(path) +~~ self.__class__.asset_contents[path] = force_text(base64.b64encode(data)) + return self.__class__.asset_contents[path] + + def mime_type(self, path): + name, ext = os.path.splitext(path) + return MIME_TYPES[ext] + + def absolute_path(self, path, start): + if posixpath.isabs(path): + path = posixpath.join(staticfiles_storage.location, path) + else: + path = posixpath.join(start, path) + return posixpath.normpath(path) + + def relative_path(self, absolute_path, output_filename): + absolute_path = posixpath.join(settings.PIPELINE_ROOT, absolute_path) + output_path = posixpath.join(settings.PIPELINE_ROOT, posixpath.dirname(output_filename)) + return relpath(absolute_path, output_path) + + def read_bytes(self, path): + file = staticfiles_storage.open(path) + content = file.read() + file.close() + return content + + def read_text(self, path): + content = self.read_bytes(path) +~~ return force_text(content) + + +class CompressorBase(object): + def __init__(self, verbose): + self.verbose = verbose + + def filter_css(self, css): + raise NotImplementedError + + def filter_js(self, js): + raise NotImplementedError + + +class SubProcessCompressor(CompressorBase): + def execute_command(self, command, content): + argument_list = [] + for flattening_arg in command: + if isinstance(flattening_arg, (str,)): + argument_list.append(flattening_arg) + else: + argument_list.extend(flattening_arg) + + pipe = subprocess.Popen(argument_list, stdout=subprocess.PIPE, + stdin=subprocess.PIPE, stderr=subprocess.PIPE) + if content: + content = smart_bytes(content) + stdout, stderr = pipe.communicate(content) + set_std_streams_blocking() + if stderr.strip() and pipe.returncode != 0: + raise CompressorError(stderr) + elif self.verbose: + print(stderr) +~~ return force_text(stdout) + + +class NoopCompressor(CompressorBase): + def compress_js(self, js): + return js + + def compress_css(self, css): + return css + + + +## ... source file continues with no further force_text examples... + +``` + diff --git a/content/pages/examples/django/django-utils-encoding-iri-to-uri.markdown b/content/pages/examples/django/django-utils-encoding-iri-to-uri.markdown new file mode 100644 index 000000000..5f11c5609 --- /dev/null +++ b/content/pages/examples/django/django-utils-encoding-iri-to-uri.markdown @@ -0,0 +1,176 @@ +title: django.utils.encoding iri_to_uri Example Code +category: page +slug: django-utils-encoding-iri-to-uri-examples +sortorder: 500011445 +toc: False +sidebartitle: django.utils.encoding iri_to_uri +meta: Python example code for the iri_to_uri callable from the django.utils.encoding module of the Django project. + + +iri_to_uri is a callable within the django.utils.encoding module of the Django project. + + +## Example 1 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / http.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./http.py) + +```python +# http.py +from urllib.parse import urlparse + +from django.core.exceptions import DisallowedRedirect +from django.http import HttpResponse +~~from django.utils.encoding import iri_to_uri + + +class OAuth2ResponseRedirect(HttpResponse): + status_code = 302 + + def __init__(self, redirect_to, allowed_schemes, *args, **kwargs): + super().__init__(*args, **kwargs) +~~ self["Location"] = iri_to_uri(redirect_to) + self.allowed_schemes = allowed_schemes + self.validate_redirect(redirect_to) + + @property + def url(self): + return self["Location"] + + def validate_redirect(self, redirect_to): + parsed = urlparse(str(redirect_to)) + if not parsed.scheme: + raise DisallowedRedirect("OAuth2 redirects require a URI scheme.") + if parsed.scheme not in self.allowed_schemes: + raise DisallowedRedirect( + "Redirect to scheme {!r} is not permitted".format(parsed.scheme) + ) + + + +## ... source file continues with no further iri_to_uri examples... + +``` + + +## Example 2 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / templatetags / rest_framework.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/templatetags/rest_framework.py) + +```python +# rest_framework.py +import re +from collections import OrderedDict + +from django import template +from django.template import loader +from django.urls import NoReverseMatch, reverse +~~from django.utils.encoding import force_str, iri_to_uri +from django.utils.html import escape, format_html, smart_urlquote +from django.utils.safestring import SafeData, mark_safe + +from rest_framework.compat import apply_markdown, pygments_highlight +from rest_framework.renderers import HTMLFormRenderer +from rest_framework.utils.urls import replace_query_param + +register = template.Library() + +class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])') + + +@register.tag(name='code') +def highlight_code(parser, token): + code = token.split_contents()[-1] + nodelist = parser.parse(('endcode',)) + parser.delete_first_token() + return CodeNode(code, nodelist) + + +class CodeNode(template.Node): + style = 'emacs' + + def __init__(self, lang, code): + + +## ... source file abbreviated to get to iri_to_uri examples ... + + +@register.simple_tag +def optional_logout(request, user): + try: + logout_url = reverse('rest_framework:logout') + except NoReverseMatch: + snippet = format_html('', user=escape(user)) + return mark_safe(snippet) + + snippet = """""" + snippet = format_html(snippet, user=escape(user), href=logout_url, next=escape(request.path)) + + return mark_safe(snippet) + + +@register.simple_tag +def add_query_param(request, key, val): + iri = request.get_full_path() +~~ uri = iri_to_uri(iri) + return escape(replace_query_param(uri, key, val)) + + +@register.filter +def as_string(value): + if value is None: + return '' + return '%s' % value + + +@register.filter +def as_list_of_strings(value): + return [ + '' if (item is None) else ('%s' % item) + for item in value + ] + + +@register.filter +def add_class(value, css_class): + html = str(value) + match = class_re.search(html) + if match: + m = re.search(r'^%s$|^%s\s|\s%s\s|\s%s$' % (css_class, css_class, + + +## ... source file continues with no further iri_to_uri examples... + +``` + diff --git a/content/pages/examples/django/django-utils-encoding-is-protected-type.markdown b/content/pages/examples/django/django-utils-encoding-is-protected-type.markdown new file mode 100644 index 000000000..a28dcd7df --- /dev/null +++ b/content/pages/examples/django/django-utils-encoding-is-protected-type.markdown @@ -0,0 +1,121 @@ +title: django.utils.encoding is_protected_type Example Code +category: page +slug: django-utils-encoding-is-protected-type-examples +sortorder: 500011446 +toc: False +sidebartitle: django.utils.encoding is_protected_type +meta: Python example code for the is_protected_type callable from the django.utils.encoding module of the Django project. + + +is_protected_type is a callable within the django.utils.encoding module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import datetime +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +~~from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings +from rest_framework.utils import html, humanize_datetime, json, representation +from rest_framework.utils.formatting import lazy_format +from rest_framework.validators import ProhibitSurrogateCharactersValidator + + +class empty: + pass + + +class BuiltinSignatureError(Exception): + pass + + + + +## ... source file abbreviated to get to is_protected_type examples ... + + +class ModelField(Field): + default_error_messages = { + 'max_length': _('Ensure this field has no more than {max_length} characters.'), + } + + def __init__(self, model_field, **kwargs): + self.model_field = model_field + self.max_length = kwargs.pop('max_length', None) + super().__init__(**kwargs) + if self.max_length is not None: + message = lazy_format(self.error_messages['max_length'], max_length=self.max_length) + self.validators.append( + MaxLengthValidator(self.max_length, message=message)) + + def to_internal_value(self, data): + rel = self.model_field.remote_field + if rel is not None: + return rel.model._meta.get_field(rel.field_name).to_python(data) + return self.model_field.to_python(data) + + def get_attribute(self, obj): + return obj + + def to_representation(self, obj): + value = self.model_field.value_from_object(obj) +~~ if is_protected_type(value): + return value + return self.model_field.value_to_string(obj) + + + +## ... source file continues with no further is_protected_type examples... + +``` + diff --git a/content/pages/examples/django/django-utils-encoding-smart-bytes.markdown b/content/pages/examples/django/django-utils-encoding-smart-bytes.markdown new file mode 100644 index 000000000..762cb4379 --- /dev/null +++ b/content/pages/examples/django/django-utils-encoding-smart-bytes.markdown @@ -0,0 +1,117 @@ +title: django.utils.encoding smart_bytes Example Code +category: page +slug: django-utils-encoding-smart-bytes-examples +sortorder: 500011447 +toc: False +sidebartitle: django.utils.encoding smart_bytes +meta: Python example code for the smart_bytes callable from the django.utils.encoding module of the Django project. + + +smart_bytes is a callable within the django.utils.encoding module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / compressors / __init__.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/compressors/__init__.py) + +```python +# __init__.py +import base64 +import os +import posixpath +import re +import subprocess + +from itertools import takewhile + +from django.contrib.staticfiles.storage import staticfiles_storage +~~from django.utils.encoding import smart_bytes, force_text + +from pipeline.conf import settings +from pipeline.exceptions import CompressorError +from pipeline.utils import to_class, relpath, set_std_streams_blocking + +URL_DETECTOR = r"""url\((['"]?)\s*(.*?)\1\)""" +URL_REPLACER = r"""url\(__EMBED__(.+?)(\?\d+)?\)""" +NON_REWRITABLE_URL = re.compile(r'^(#|http:|https:|data:|//)') + +DEFAULT_TEMPLATE_FUNC = "template" +TEMPLATE_FUNC = r"""var template = function(str){var fn = new Function('obj', 'var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push(\''+str.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/<%=([\s\S]+?)%>/g,function(match,code){return "',"+code.replace(/\\'/g, "'")+",'";}).replace(/<%([\s\S]+?)%>/g,function(match,code){return "');"+code.replace(/\\'/g, "'").replace(/[\r\n\t]/g,' ')+"__p.push('";}).replace(/\r/g,'\\r').replace(/\n/g,'\\n').replace(/\t/g,'\\t')+"');}return __p.join('');");return fn;};""" + +MIME_TYPES = { + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.gif': 'image/gif', + '.tif': 'image/tiff', + '.tiff': 'image/tiff', + '.ttf': 'font/truetype', + '.otf': 'font/opentype', + '.woff': 'font/woff' +} +EMBED_EXTS = MIME_TYPES.keys() + + +## ... source file abbreviated to get to smart_bytes examples ... + + + + +class CompressorBase(object): + def __init__(self, verbose): + self.verbose = verbose + + def filter_css(self, css): + raise NotImplementedError + + def filter_js(self, js): + raise NotImplementedError + + +class SubProcessCompressor(CompressorBase): + def execute_command(self, command, content): + argument_list = [] + for flattening_arg in command: + if isinstance(flattening_arg, (str,)): + argument_list.append(flattening_arg) + else: + argument_list.extend(flattening_arg) + + pipe = subprocess.Popen(argument_list, stdout=subprocess.PIPE, + stdin=subprocess.PIPE, stderr=subprocess.PIPE) + if content: +~~ content = smart_bytes(content) + stdout, stderr = pipe.communicate(content) + set_std_streams_blocking() + if stderr.strip() and pipe.returncode != 0: + raise CompressorError(stderr) + elif self.verbose: + print(stderr) + return force_text(stdout) + + +class NoopCompressor(CompressorBase): + def compress_js(self, js): + return js + + def compress_css(self, css): + return css + + + +## ... source file continues with no further smart_bytes examples... + +``` + diff --git a/content/pages/examples/django/django-utils-encoding-smart-str.markdown b/content/pages/examples/django/django-utils-encoding-smart-str.markdown new file mode 100644 index 000000000..e75686ef7 --- /dev/null +++ b/content/pages/examples/django/django-utils-encoding-smart-str.markdown @@ -0,0 +1,366 @@ +title: django.utils.encoding smart_str Example Code +category: page +slug: django-utils-encoding-smart-str-examples +sortorder: 500011448 +toc: False +sidebartitle: django.utils.encoding smart_str +meta: Python example code for the smart_str callable from the django.utils.encoding module of the Django project. + + +smart_str is a callable within the django.utils.encoding module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_base.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_base.py) + +```python +# plugin_base.py +import json +import re + +from django.shortcuts import render as render_to_response + +from django import forms +from django.contrib import admin +from django.contrib import messages +from django.core.exceptions import ( + ImproperlyConfigured, + ObjectDoesNotExist, + ValidationError, +) +~~from django.utils.encoding import force_text, smart_str +from django.utils.html import escapejs +from django.utils.translation import ugettext, ugettext_lazy as _ + +from six import with_metaclass, python_2_unicode_compatible + +from cms import operations +from cms.exceptions import SubClassNeededError +from cms.models import CMSPlugin +from cms.toolbar.utils import get_plugin_tree_as_json, get_plugin_toolbar_info +from cms.utils.conf import get_cms_setting + + +class CMSPluginBaseMetaclass(forms.MediaDefiningClass): + def __new__(cls, name, bases, attrs): + super_new = super(CMSPluginBaseMetaclass, cls).__new__ + parents = [base for base in bases if isinstance(base, CMSPluginBaseMetaclass)] + if not parents: + return super_new(cls, name, bases, attrs) + new_plugin = super_new(cls, name, bases, attrs) + if not issubclass(new_plugin.model, CMSPlugin): + raise SubClassNeededError( + "The 'model' attribute on CMSPluginBase subclasses must be " + "either CMSPlugin or a subclass of CMSPlugin. %r on %r is not." + % (new_plugin.model, new_plugin) + + +## ... source file abbreviated to get to smart_str examples ... + + + def get_parent_classes(cls, slot, page, instance=None): + from cms.utils.placeholder import get_placeholder_conf + + template = page.get_template() if page else None + + ph_conf = get_placeholder_conf('parent_classes', slot, template, default={}) + parent_classes = ph_conf.get(cls.__name__, cls.parent_classes) + return parent_classes + + def get_plugin_urls(self): + return [] + + def plugin_urls(self): + return self.get_plugin_urls() + plugin_urls = property(plugin_urls) + + @classmethod + def get_extra_placeholder_menu_items(self, request, placeholder): + pass + + @classmethod + def get_extra_plugin_menu_items(cls, request, plugin): + pass + + def __repr__(self): +~~ return smart_str(self.name) + + def __str__(self): + return self.name + + +class PluginMenuItem(object): + + def __init__(self, name, url, data=None, question=None, action='ajax', attributes=None): + if not attributes: + attributes = {} + + if data: + data = json.dumps(data) + + self.name = name + self.url = url + self.data = data + self.question = question + self.action = action + self.attributes = attributes + + + +## ... source file continues with no further smart_str examples... + +``` + + +## Example 2 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / admin / __init__.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/__init__.py) + +```python +# __init__.py +import six +import operator +from functools import update_wrapper +from six.moves import reduce +from typing import Tuple, Dict, Callable # NOQA + +from django.apps import apps +from django.http import HttpResponse, HttpResponseNotFound +from django.conf import settings +from django.db import models +from django.db.models.query import QuerySet +~~from django.utils.encoding import smart_str +from django.utils.translation import gettext as _ +from django.utils.text import get_text_list +from django.contrib import admin + +from django_extensions.admin.widgets import ForeignKeySearchInput + + +class ForeignKeyAutocompleteAdminMixin: + + related_search_fields = {} # type: Dict[str, Tuple[str]] + related_string_functions = {} # type: Dict[str, Callable] + autocomplete_limit = getattr(settings, 'FOREIGNKEY_AUTOCOMPLETE_LIMIT', None) + + def get_urls(self): + from django.urls import path + + def wrap(view): + def wrapper(*args, **kwargs): + return self.admin_site.admin_view(view)(*args, **kwargs) + return update_wrapper(wrapper, view) + + return [ + path('foreignkey_autocomplete/', wrap(self.foreignkey_autocomplete), + name='%s_%s_autocomplete' % (self.model._meta.app_label, self.model._meta.model_name)) + + +## ... source file abbreviated to get to smart_str examples ... + + + search_fields = request.GET.get('search_fields', None) + object_pk = request.GET.get('object_pk', None) + + try: + to_string_function = self.related_string_functions[model_name] + except KeyError: + to_string_function = lambda x: x.__str__() + + if search_fields and app_label and model_name and (query or object_pk): + def construct_search(field_name): + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + elif field_name.startswith('@'): + return "%s__search" % field_name[1:] + else: + return "%s__icontains" % field_name + + model = apps.get_model(app_label, model_name) + + queryset = model._default_manager.all() + data = '' + if query: + for bit in query.split(): +~~ or_queries = [models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)}) for field_name in search_fields.split(',')] + other_qs = QuerySet(model) + other_qs.query.select_related = queryset.query.select_related + other_qs = other_qs.filter(reduce(operator.or_, or_queries)) + queryset = queryset & other_qs + + additional_filter = self.get_related_filter(model, request) + if additional_filter: + queryset = queryset.filter(additional_filter) + + if self.autocomplete_limit: + queryset = queryset[:self.autocomplete_limit] + + data = ''.join([six.u('%s|%s\n') % (to_string_function(f), f.pk) for f in queryset]) + elif object_pk: + try: + obj = queryset.get(pk=object_pk) + except Exception: # FIXME: use stricter exception checking + pass + else: + data = to_string_function(obj) + return HttpResponse(data, content_type='text/plain') + return HttpResponseNotFound() + + def get_related_filter(self, model, request): + + +## ... source file continues with no further smart_str examples... + +``` + + +## Example 3 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import datetime +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +~~from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings +from rest_framework.utils import html, humanize_datetime, json, representation +from rest_framework.utils.formatting import lazy_format +from rest_framework.validators import ProhibitSurrogateCharactersValidator + + +class empty: + pass + + +class BuiltinSignatureError(Exception): + pass + + + + +## ... source file abbreviated to get to smart_str examples ... + + + + if self.max_digits is not None and self.decimal_places is not None: + self.max_whole_digits = self.max_digits - self.decimal_places + else: + self.max_whole_digits = None + + super().__init__(**kwargs) + + if self.max_value is not None: + message = lazy_format(self.error_messages['max_value'], max_value=self.max_value) + self.validators.append( + MaxValueValidator(self.max_value, message=message)) + if self.min_value is not None: + message = lazy_format(self.error_messages['min_value'], min_value=self.min_value) + self.validators.append( + MinValueValidator(self.min_value, message=message)) + + if rounding is not None: + valid_roundings = [v for k, v in vars(decimal).items() if k.startswith('ROUND_')] + assert rounding in valid_roundings, ( + 'Invalid rounding option %s. Valid values for rounding are: %s' % (rounding, valid_roundings)) + self.rounding = rounding + + def to_internal_value(self, data): + +~~ data = smart_str(data).strip() + + if self.localize: + data = sanitize_separators(data) + + if len(data) > self.MAX_STRING_LENGTH: + self.fail('max_string_length') + + try: + value = decimal.Decimal(data) + except decimal.DecimalException: + self.fail('invalid') + + if value.is_nan(): + self.fail('invalid') + + if value in (decimal.Decimal('Inf'), decimal.Decimal('-Inf')): + self.fail('invalid') + + return self.quantize(self.validate_precision(value)) + + def validate_precision(self, value): + sign, digittuple, exponent = value.as_tuple() + + if exponent >= 0: + + +## ... source file continues with no further smart_str examples... + +``` + diff --git a/content/pages/examples/django/django-utils-encoding-smart-text.markdown b/content/pages/examples/django/django-utils-encoding-smart-text.markdown new file mode 100644 index 000000000..82d6442d5 --- /dev/null +++ b/content/pages/examples/django/django-utils-encoding-smart-text.markdown @@ -0,0 +1,509 @@ +title: django.utils.encoding smart_text Example Code +category: page +slug: django-utils-encoding-smart-text-examples +sortorder: 500011449 +toc: False +sidebartitle: django.utils.encoding smart_text +meta: Python example code for the smart_text callable from the django.utils.encoding module of the Django project. + + +smart_text is a callable within the django.utils.encoding module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / models.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/models.py) + +```python +# models.py +from __future__ import unicode_literals + +import json +import ast + +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import FieldDoesNotExist +from django.db import models, DEFAULT_DB_ALIAS +from django.db.models import QuerySet, Q +from django.utils import formats, timezone +~~from django.utils.encoding import python_2_unicode_compatible, smart_text +from django.utils.six import iteritems, integer_types +from django.utils.translation import ugettext_lazy as _ + +from jsonfield.fields import JSONField +from dateutil import parser +from dateutil.tz import gettz + + +class LogEntryManager(models.Manager): + + def log_create(self, instance, **kwargs): + changes = kwargs.get('changes', None) + pk = self._get_pk_value(instance) + + if changes is not None: + kwargs.setdefault('content_type', ContentType.objects.get_for_model(instance)) + kwargs.setdefault('object_pk', pk) +~~ kwargs.setdefault('object_repr', smart_text(instance)) + + if isinstance(pk, integer_types): + kwargs.setdefault('object_id', pk) + + get_additional_data = getattr(instance, 'get_additional_data', None) + if callable(get_additional_data): + kwargs.setdefault('additional_data', get_additional_data()) + + if kwargs.get('action', None) is LogEntry.Action.CREATE: + if kwargs.get('object_id', None) is not None and self.filter(content_type=kwargs.get('content_type'), object_id=kwargs.get('object_id')).exists(): + self.filter(content_type=kwargs.get('content_type'), object_id=kwargs.get('object_id')).delete() + else: + self.filter(content_type=kwargs.get('content_type'), object_pk=kwargs.get('object_pk', '')).delete() + db = instance._state.db + return self.create(**kwargs) if db is None or db == '' else self.using(db).create(**kwargs) + return None + + def get_for_object(self, instance): + if not isinstance(instance, models.Model): + return self.none() + + content_type = ContentType.objects.get_for_model(instance.__class__) + pk = self._get_pk_value(instance) + + + +## ... source file abbreviated to get to smart_text examples ... + + + + def __str__(self): + if self.action == self.Action.CREATE: + fstring = _("Created {repr:s}") + elif self.action == self.Action.UPDATE: + fstring = _("Updated {repr:s}") + elif self.action == self.Action.DELETE: + fstring = _("Deleted {repr:s}") + else: + fstring = _("Logged {repr:s}") + + return fstring.format(repr=self.object_repr) + + @property + def changes_dict(self): + try: + return json.loads(self.changes) + except ValueError: + return {} + + @property +~~ def changes_str(self, colon=': ', arrow=smart_text(' \u2192 '), separator='; '): + substrings = [] + + for field, values in iteritems(self.changes_dict): +~~ substring = smart_text('{field_name:s}{colon:s}{old:s}{arrow:s}{new:s}').format( + field_name=field, + colon=colon, + old=values[0], + arrow=arrow, + new=values[1], + ) + substrings.append(substring) + + return separator.join(substrings) + + @property + def changes_display_dict(self): + from auditlog.registry import auditlog + model = self.content_type.model_class() + model_fields = auditlog.get_model_fields(model._meta.model) + changes_display_dict = {} + for field_name, values in iteritems(self.changes_dict): + try: + field = model._meta.get_field(field_name) + except FieldDoesNotExist: + changes_display_dict[field_name] = values + continue + values_display = [] + choices_dict = None + if isinstance(pk, integer_types): + return self.filter(content_type=content_type, object_id=pk) + else: +~~ return self.filter(content_type=content_type, object_pk=smart_text(pk)) + + def get_for_objects(self, queryset): + if not isinstance(queryset, QuerySet) or queryset.count() == 0: + return self.none() + + content_type = ContentType.objects.get_for_model(queryset.model) + primary_keys = list(queryset.values_list(queryset.model._meta.pk.name, flat=True)) + + if isinstance(primary_keys[0], integer_types): + return self.filter(content_type=content_type).filter(Q(object_id__in=primary_keys)).distinct() + elif isinstance(queryset.model._meta.pk, models.UUIDField): + primary_keys = [smart_text(pk) for pk in primary_keys] + return self.filter(content_type=content_type).filter(Q(object_pk__in=primary_keys)).distinct() + else: + return self.filter(content_type=content_type).filter(Q(object_pk__in=primary_keys)).distinct() + + def get_for_model(self, model): + if not issubclass(model, models.Model): + return self.none() + + content_type = ContentType.objects.get_for_model(model) + + return self.filter(content_type=content_type) + + + +## ... source file abbreviated to get to smart_text examples ... + + + get_latest_by = 'timestamp' + ordering = ['-timestamp'] + verbose_name = _("log entry") + verbose_name_plural = _("log entries") + + +## ... source file continues with no further smart_text examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / templatetags / cms_tags.py**](https://github.com/divio/django-cms/blob/develop/cms/templatetags/cms_tags.py) + +```python +# cms_tags.py +from collections import namedtuple, OrderedDict +from copy import copy +from datetime import datetime + +from django import template +from django.conf import settings +from django.contrib.sites.models import Site +from django.core.mail import mail_managers +from django.db.models import Model +from django.middleware.common import BrokenLinkEmailsMiddleware +from django.template.loader import render_to_string +from django.urls import reverse +~~from django.utils.encoding import force_text, smart_text +from django.utils.html import escape +from django.utils.http import urlencode +from django.utils.translation import ( + get_language, + override as force_language, + ugettext_lazy as _, +) + +from six import string_types, integer_types + +from classytags.arguments import (Argument, MultiValueArgument, + MultiKeywordArgument) +from classytags.core import Options, Tag +from classytags.helpers import InclusionTag, AsTag +from classytags.parser import Parser +from classytags.utils import flatten_context +from classytags.values import ListValue, StringValue + +from cms.cache.page import get_page_url_cache, set_page_url_cache +from cms.exceptions import PlaceholderNotFound +from cms.models import Page, Placeholder as PlaceholderModel, CMSPlugin, StaticPlaceholder +from cms.plugin_pool import plugin_pool +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils import get_current_site, get_language_from_request, get_site_id + + +## ... source file abbreviated to get to smart_text examples ... + + + def render_tag(self, context, **kwargs): + context.push() + template = self.get_template(context, **kwargs) + data = self.get_context(context, **kwargs) + output = render_to_string(template, flatten_context(data)).strip() + context.pop() + if kwargs.get('varname'): + context[kwargs['varname']] = output + return '' + else: + return output + + def _get_editable_context(self, context, instance, language, edit_fields, + view_method, view_url, querystring, editmode=True): + request = context['request'] + if hasattr(request, 'toolbar'): + lang = request.toolbar.toolbar_language + else: + lang = get_language() + opts = instance._meta + if getattr(instance, '_deferred', False): + opts = opts.proxy_for_model._meta + with force_language(lang): + extra_context = {} + if edit_fields == 'changelist': +~~ instance.get_plugin_name = u"%s %s list" % (smart_text(_('Edit')), smart_text(opts.verbose_name)) + extra_context['attribute_name'] = 'changelist' + elif editmode: +~~ instance.get_plugin_name = u"%s %s" % (smart_text(_('Edit')), smart_text(opts.verbose_name)) + if not context.get('attribute_name', None): + extra_context['attribute_name'] = '-'.join(edit_fields) \ + if not isinstance('edit_fields', string_types) else edit_fields + else: +~~ instance.get_plugin_name = u"%s %s" % (smart_text(_('Add')), smart_text(opts.verbose_name)) + extra_context['attribute_name'] = 'add' + extra_context['instance'] = instance + extra_context['generic'] = opts + if view_method: + method = getattr(instance, view_method) + if callable(method): + url_base = method(context['request']) + else: + url_base = method + else: + if not editmode: + view_url = 'admin:%s_%s_add' % ( + opts.app_label, opts.model_name) + url_base = reverse(view_url) + elif not edit_fields: + if not view_url: + view_url = 'admin:%s_%s_change' % ( + opts.app_label, opts.model_name) + if isinstance(instance, Page): + url_base = reverse(view_url, args=(instance.pk, language)) + else: + url_base = reverse(view_url, args=(instance.pk,)) + else: + if not view_url: + + +## ... source file continues with no further smart_text examples... + +``` + + +## Example 3 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import datetime +import json +from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 + from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +~~from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + kwargs.setdefault('content_type', 'application/json') + data = json.dumps(data, cls=encoder) + super(JsonResponse, self).__init__(content=data, **kwargs) + + +## ... source file abbreviated to get to smart_text examples ... + + + for func_closure in index_resolver.func.__closure__: + if isinstance(func_closure.cell_contents, AdminSite): + return func_closure.cell_contents + except: + pass + + return admin.site + + +def get_admin_site_name(context): + return get_admin_site(context).name + + +class LazyDateTimeEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date): + return obj.isoformat() + elif isinstance(obj, Promise): + return force_text(obj) + return self.encode(obj) + + +def get_model_instance_label(instance): + if getattr(instance, "related_label", None): + return instance.related_label() +~~ return smart_text(instance) + + +class SuccessMessageMixin(object): + success_message = '' + + def form_valid(self, form): + response = super(SuccessMessageMixin, self).form_valid(form) + success_message = self.get_success_message(form.cleaned_data) + if success_message: + messages.success(self.request, success_message) + return response + + def get_success_message(self, cleaned_data): + return self.success_message % cleaned_data + + +def get_model_queryset(admin_site, model, request, preserved_filters=None): + model_admin = admin_site._registry.get(model) + + if model_admin is None: + return + + try: + changelist_url = reverse('%s:%s_%s_changelist' % ( + + +## ... source file continues with no further smart_text examples... + +``` + + +## Example 4 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / utils.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./utils.py) + +```python +# utils.py +try: + import fcntl +except ImportError: + fcntl = None + +import importlib +import mimetypes +import posixpath +import os +import sys + +from urllib.parse import quote + +~~from django.utils.encoding import smart_text + +from pipeline.conf import settings + + +def to_class(class_str): + if not class_str: + return None + + module_bits = class_str.split('.') + module_path, class_name = '.'.join(module_bits[:-1]), module_bits[-1] + module = importlib.import_module(module_path) + return getattr(module, class_name, None) + + +def filepath_to_uri(path): + if path is None: + return path + return quote(smart_text(path).replace("\\", "/"), safe="/-!*()'#?") + + +def guess_type(path, default=None): + for type, ext in settings.MIMETYPES: + mimetypes.add_type(type, ext) + mimetype, _ = mimetypes.guess_type(path) + if not mimetype: + return default +~~ return smart_text(mimetype) + + +def relpath(path, start=posixpath.curdir): + if not path: + raise ValueError("no path specified") + + start_list = posixpath.abspath(start).split(posixpath.sep) + path_list = posixpath.abspath(path).split(posixpath.sep) + + i = len(posixpath.commonprefix([start_list, path_list])) + + rel_list = [posixpath.pardir] * (len(start_list) - i) + path_list[i:] + if not rel_list: + return posixpath.curdir + return posixpath.join(*rel_list) + + +def set_std_streams_blocking(): + if not fcntl: + return + for f in (sys.__stdout__, sys.__stderr__): + fileno = f.fileno() + flags = fcntl.fcntl(fileno, fcntl.F_GETFL) + fcntl.fcntl(fileno, fcntl.F_SETFL, flags & -os.O_NONBLOCK) + + +## ... source file continues with no further smart_text examples... + +``` + diff --git a/content/pages/examples/django/django-utils-encoding-uri-to-iri.markdown b/content/pages/examples/django/django-utils-encoding-uri-to-iri.markdown new file mode 100644 index 000000000..cdef21329 --- /dev/null +++ b/content/pages/examples/django/django-utils-encoding-uri-to-iri.markdown @@ -0,0 +1,125 @@ +title: django.utils.encoding uri_to_iri Example Code +category: page +slug: django-utils-encoding-uri-to-iri-examples +sortorder: 500011450 +toc: False +sidebartitle: django.utils.encoding uri_to_iri +meta: Python example code for the uri_to_iri callable from the django.utils.encoding module of the Django project. + + +uri_to_iri is a callable within the django.utils.encoding module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / relations.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./relations.py) + +```python +# relations.py +import sys +from collections import OrderedDict +from urllib import parse + +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist +from django.db.models import Manager +from django.db.models.query import QuerySet +from django.urls import NoReverseMatch, Resolver404, get_script_prefix, resolve +~~from django.utils.encoding import smart_str, uri_to_iri +from django.utils.translation import gettext_lazy as _ + +from rest_framework.fields import ( + Field, empty, get_attribute, is_simple_callable, iter_options +) +from rest_framework.reverse import reverse +from rest_framework.settings import api_settings +from rest_framework.utils import html + + +def method_overridden(method_name, klass, instance): + method = getattr(klass, method_name) + default_method = getattr(method, '__func__', method) # Python 3 compat + return default_method is not getattr(instance, method_name).__func__ + + +class ObjectValueError(ValueError): + + +class ObjectTypeError(TypeError): + + +class Hyperlink(str): + def __new__(cls, url, obj): + + +## ... source file abbreviated to get to uri_to_iri examples ... + + + except TypeError: + exc = ObjectTypeError(str(sys.exc_info()[1])) + raise exc.with_traceback(sys.exc_info()[2]) + + def get_url(self, obj, view_name, request, format): + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + + def to_internal_value(self, data): + request = self.context.get('request', None) + try: + http_prefix = data.startswith(('http:', 'https:')) + except AttributeError: + self.fail('incorrect_type', data_type=type(data).__name__) + + if http_prefix: + data = parse.urlparse(data).path + prefix = get_script_prefix() + if data.startswith(prefix): + data = '/' + data[len(prefix):] + +~~ data = uri_to_iri(parse.unquote(data)) + + try: + match = resolve(data) + except Resolver404: + self.fail('no_match') + + try: + expected_viewname = request.versioning_scheme.get_versioned_viewname( + self.view_name, request + ) + except AttributeError: + expected_viewname = self.view_name + + if match.view_name != expected_viewname: + self.fail('incorrect_match') + + try: + return self.get_object(match.view_name, match.args, match.kwargs) + except (ObjectDoesNotExist, ObjectValueError, ObjectTypeError): + self.fail('does_not_exist') + + def to_representation(self, value): + assert 'request' in self.context, ( + "`%s` requires the request in the serializer" + + +## ... source file continues with no further uri_to_iri examples... + +``` + diff --git a/content/pages/examples/django/django-utils-formats-get-format.markdown b/content/pages/examples/django/django-utils-formats-get-format.markdown new file mode 100644 index 000000000..23bcfe1a7 --- /dev/null +++ b/content/pages/examples/django/django-utils-formats-get-format.markdown @@ -0,0 +1,252 @@ +title: django.utils.formats get_format Example Code +category: page +slug: django-utils-formats-get-format-examples +sortorder: 500011451 +toc: False +sidebartitle: django.utils.formats get_format +meta: Python example code for the get_format callable from the django.utils.formats module of the Django project. + + +get_format is a callable within the django.utils.formats module of the Django project. + + +## Example 1 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / templatetags / jet_tags.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/templatetags/jet_tags.py) + +```python +# jet_tags.py +from __future__ import unicode_literals +import json +import os +from django import template +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +from django.forms import CheckboxInput, ModelChoiceField, Select, ModelMultipleChoiceField, SelectMultiple +from django.contrib.admin.widgets import RelatedFieldWidgetWrapper +~~from django.utils.formats import get_format +from django.utils.safestring import mark_safe +from django.utils.encoding import smart_text +from jet import settings, VERSION +from jet.models import Bookmark +from jet.utils import get_model_instance_label, get_model_queryset, get_possible_language_codes, \ + get_admin_site, get_menu_items + +try: + from urllib.parse import parse_qsl +except ImportError: + from urlparse import parse_qsl + + +register = template.Library() +assignment_tag = register.assignment_tag if hasattr(register, 'assignment_tag') else register.simple_tag + + +@assignment_tag +def jet_get_date_format(): +~~ return get_format('DATE_INPUT_FORMATS')[0] + + +@assignment_tag +def jet_get_time_format(): +~~ return get_format('TIME_INPUT_FORMATS')[0] + + +@assignment_tag +def jet_get_datetime_format(): +~~ return get_format('DATETIME_INPUT_FORMATS')[0] + + +@assignment_tag(takes_context=True) +def jet_get_menu(context): + return get_menu_items(context) + + +@assignment_tag +def jet_get_bookmarks(user): + if user is None: + return None + return Bookmark.objects.filter(user=user.pk) + + +@register.filter +def jet_is_checkbox(field): + return field.field.widget.__class__.__name__ == CheckboxInput().__class__.__name__ + + +@register.filter +def jet_select2_lookups(field): + if hasattr(field, 'field') and \ + (isinstance(field.field, ModelChoiceField) or isinstance(field.field, ModelMultipleChoiceField)): + qs = field.field.queryset + + +## ... source file continues with no further get_format examples... + +``` + + +## Example 2 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / widgets.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/widgets.py) + +```python +# widgets.py +import itertools +import json +from functools import total_ordering + +from django import forms +from django.conf import settings +from django.forms import widgets +from django.forms.utils import flatatt +from django.template.loader import render_to_string +from django.urls import reverse +~~from django.utils.formats import get_format +from django.utils.functional import cached_property +from django.utils.html import format_html +from django.utils.translation import gettext_lazy as _ +from taggit.forms import TagWidget +from taggit.models import Tag + +from wagtail.admin.datetimepicker import to_datetimepicker_format +from wagtail.admin.staticfiles import versioned_static +from wagtail.core import hooks +from wagtail.core.models import Page +from wagtail.utils.widgets import WidgetWithScript + +DEFAULT_DATE_FORMAT = '%Y-%m-%d' +DEFAULT_DATETIME_FORMAT = '%Y-%m-%d %H:%M' +DEFAULT_TIME_FORMAT = '%H:%M' + + +class AdminAutoHeightTextInput(widgets.Textarea): + template_name = 'wagtailadmin/widgets/auto_height_text_input.html' + + def __init__(self, attrs=None): + default_attrs = {'rows': '1'} + if attrs: + default_attrs.update(attrs) + + super().__init__(default_attrs) + + +class AdminDateInput(widgets.DateInput): + template_name = 'wagtailadmin/widgets/date_input.html' + + def __init__(self, attrs=None, format=None): + default_attrs = {'autocomplete': 'off'} + fmt = format + if attrs: + default_attrs.update(attrs) + if fmt is None: + fmt = getattr(settings, 'WAGTAIL_DATE_FORMAT', DEFAULT_DATE_FORMAT) + self.js_format = to_datetimepicker_format(fmt) + super().__init__(attrs=default_attrs, format=fmt) + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + + config = { +~~ 'dayOfWeekStart': get_format('FIRST_DAY_OF_WEEK'), + 'format': self.js_format, + } + context['widget']['config_json'] = json.dumps(config) + + return context + + @property + def media(self): + return forms.Media(js=[ + versioned_static('wagtailadmin/js/date-time-chooser.js'), + ]) + + +class AdminTimeInput(widgets.TimeInput): + template_name = 'wagtailadmin/widgets/time_input.html' + + def __init__(self, attrs=None, format=None): + default_attrs = {'autocomplete': 'off'} + if attrs: + default_attrs.update(attrs) + fmt = format + if fmt is None: + fmt = getattr(settings, 'WAGTAIL_TIME_FORMAT', DEFAULT_TIME_FORMAT) + self.js_format = to_datetimepicker_format(fmt) + + +## ... source file abbreviated to get to get_format examples ... + + + versioned_static('wagtailadmin/js/date-time-chooser.js'), + ]) + + +class AdminDateTimeInput(widgets.DateTimeInput): + template_name = 'wagtailadmin/widgets/datetime_input.html' + + def __init__(self, attrs=None, format=None, time_format=None): + default_attrs = {'autocomplete': 'off'} + fmt = format + if attrs: + default_attrs.update(attrs) + if fmt is None: + fmt = getattr(settings, 'WAGTAIL_DATETIME_FORMAT', DEFAULT_DATETIME_FORMAT) + time_fmt = time_format + if time_fmt is None: + time_fmt = getattr(settings, 'WAGTAIL_TIME_FORMAT', DEFAULT_TIME_FORMAT) + self.js_format = to_datetimepicker_format(fmt) + self.js_time_format = to_datetimepicker_format(time_fmt) + super().__init__(attrs=default_attrs, format=fmt) + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + + config = { +~~ 'dayOfWeekStart': get_format('FIRST_DAY_OF_WEEK'), + 'format': self.js_format, + 'formatTime': self.js_time_format + } + context['widget']['config_json'] = json.dumps(config) + + return context + + @property + def media(self): + return forms.Media(js=[ + versioned_static('wagtailadmin/js/date-time-chooser.js'), + ]) + + +class AdminTagWidget(TagWidget): + template_name = 'wagtailadmin/widgets/tag_widget.html' + + def __init__(self, *args, **kwargs): + self.tag_model = kwargs.pop('tag_model', Tag) + self.free_tagging = kwargs.pop('free_tagging', None) + super().__init__(*args, **kwargs) + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + + +## ... source file continues with no further get_format examples... + +``` + diff --git a/content/pages/examples/django/django-utils-formats-localize-input.markdown b/content/pages/examples/django/django-utils-formats-localize-input.markdown new file mode 100644 index 000000000..a91cde6f6 --- /dev/null +++ b/content/pages/examples/django/django-utils-formats-localize-input.markdown @@ -0,0 +1,142 @@ +title: django.utils.formats localize_input Example Code +category: page +slug: django-utils-formats-localize-input-examples +sortorder: 500011452 +toc: False +sidebartitle: django.utils.formats localize_input +meta: Python example code for the localize_input callable from the django.utils.formats module of the Django project. + + +localize_input is a callable within the django.utils.formats module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +~~from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings +from rest_framework.utils import html, humanize_datetime, json, representation +from rest_framework.utils.formatting import lazy_format +from rest_framework.validators import ProhibitSurrogateCharactersValidator + + +class empty: + pass + + +class BuiltinSignatureError(Exception): + pass + + +def is_simple_callable(obj): + + +## ... source file abbreviated to get to localize_input examples ... + + + else: + total_digits = abs(exponent) + whole_digits = 0 + decimal_places = total_digits + + if self.max_digits is not None and total_digits > self.max_digits: + self.fail('max_digits', max_digits=self.max_digits) + if self.decimal_places is not None and decimal_places > self.decimal_places: + self.fail('max_decimal_places', max_decimal_places=self.decimal_places) + if self.max_whole_digits is not None and whole_digits > self.max_whole_digits: + self.fail('max_whole_digits', max_whole_digits=self.max_whole_digits) + + return value + + def to_representation(self, value): + coerce_to_string = getattr(self, 'coerce_to_string', api_settings.COERCE_DECIMAL_TO_STRING) + + if not isinstance(value, decimal.Decimal): + value = decimal.Decimal(str(value).strip()) + + quantized = self.quantize(value) + + if not coerce_to_string: + return quantized + if self.localize: +~~ return localize_input(quantized) + + return '{:f}'.format(quantized) + + def quantize(self, value): + if self.decimal_places is None: + return value + + context = decimal.getcontext().copy() + if self.max_digits is not None: + context.prec = self.max_digits + return value.quantize( + decimal.Decimal('.1') ** self.decimal_places, + rounding=self.rounding, + context=context + ) + + + +class DateTimeField(Field): + default_error_messages = { + 'invalid': _('Datetime has wrong format. Use one of these formats instead: {format}.'), + 'date': _('Expected a datetime but got a date.'), + 'make_aware': _('Invalid datetime for the timezone "{timezone}".'), + 'overflow': _('Datetime value out of range.') + + +## ... source file continues with no further localize_input examples... + +``` + diff --git a/content/pages/examples/django/django-utils-formats-sanitize-separators.markdown b/content/pages/examples/django/django-utils-formats-sanitize-separators.markdown new file mode 100644 index 000000000..d1a696a89 --- /dev/null +++ b/content/pages/examples/django/django-utils-formats-sanitize-separators.markdown @@ -0,0 +1,142 @@ +title: django.utils.formats sanitize_separators Example Code +category: page +slug: django-utils-formats-sanitize-separators-examples +sortorder: 500011453 +toc: False +sidebartitle: django.utils.formats sanitize_separators +meta: Python example code for the sanitize_separators callable from the django.utils.formats module of the Django project. + + +sanitize_separators is a callable within the django.utils.formats module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +~~from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings +from rest_framework.utils import html, humanize_datetime, json, representation +from rest_framework.utils.formatting import lazy_format +from rest_framework.validators import ProhibitSurrogateCharactersValidator + + +class empty: + pass + + +class BuiltinSignatureError(Exception): + pass + + +def is_simple_callable(obj): + + +## ... source file abbreviated to get to sanitize_separators examples ... + + + else: + self.max_whole_digits = None + + super().__init__(**kwargs) + + if self.max_value is not None: + message = lazy_format(self.error_messages['max_value'], max_value=self.max_value) + self.validators.append( + MaxValueValidator(self.max_value, message=message)) + if self.min_value is not None: + message = lazy_format(self.error_messages['min_value'], min_value=self.min_value) + self.validators.append( + MinValueValidator(self.min_value, message=message)) + + if rounding is not None: + valid_roundings = [v for k, v in vars(decimal).items() if k.startswith('ROUND_')] + assert rounding in valid_roundings, ( + 'Invalid rounding option %s. Valid values for rounding are: %s' % (rounding, valid_roundings)) + self.rounding = rounding + + def to_internal_value(self, data): + + data = smart_str(data).strip() + + if self.localize: +~~ data = sanitize_separators(data) + + if len(data) > self.MAX_STRING_LENGTH: + self.fail('max_string_length') + + try: + value = decimal.Decimal(data) + except decimal.DecimalException: + self.fail('invalid') + + if value.is_nan(): + self.fail('invalid') + + if value in (decimal.Decimal('Inf'), decimal.Decimal('-Inf')): + self.fail('invalid') + + return self.quantize(self.validate_precision(value)) + + def validate_precision(self, value): + sign, digittuple, exponent = value.as_tuple() + + if exponent >= 0: + total_digits = len(digittuple) + exponent + whole_digits = total_digits + decimal_places = 0 + + +## ... source file continues with no further sanitize_separators examples... + +``` + diff --git a/content/pages/examples/django/django-utils-formats.markdown b/content/pages/examples/django/django-utils-formats.markdown new file mode 100644 index 000000000..4367f4298 --- /dev/null +++ b/content/pages/examples/django/django-utils-formats.markdown @@ -0,0 +1,536 @@ +title: django.utils formats Example Code +category: page +slug: django-utils-formats-examples +sortorder: 500011418 +toc: False +sidebartitle: django.utils formats +meta: Python example code for the formats callable from the django.utils module of the Django project. + + +formats is a callable within the django.utils module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog_tests / tests.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog_tests/tests.py) + +```python +# tests.py +import datetime +import django +from django.conf import settings +from django.contrib import auth +from django.contrib.auth.models import User, AnonymousUser +from django.core.exceptions import ValidationError +from django.db.models.signals import pre_save +from django.http import HttpResponse +from django.test import TestCase, RequestFactory +~~from django.utils import dateformat, formats, timezone +from dateutil.tz import gettz + +from auditlog.middleware import AuditlogMiddleware +from auditlog.models import LogEntry +from auditlog.registry import auditlog +from auditlog_tests.models import SimpleModel, AltPrimaryKeyModel, UUIDPrimaryKeyModel, \ + ProxyModel, SimpleIncludeModel, SimpleExcludeModel, SimpleMappingModel, RelatedModel, \ + ManyRelatedModel, AdditionalDataIncludedModel, DateTimeFieldModel, ChoicesFieldModel, \ + CharfieldTextfieldModel, PostgresArrayFieldModel, NoDeleteHistoryModel +from auditlog import compat + + +class SimpleModelTest(TestCase): + def setUp(self): + self.obj = SimpleModel.objects.create(text='I am not difficult.') + + def test_create(self): + obj = self.obj + + self.assertTrue(obj.history.count() == 1, msg="There is one log entry") + + try: + history = obj.history.get() + except obj.history.DoesNotExist: + + +## ... source file abbreviated to get to formats examples ... + + + + self.assertTrue(dtm.history.count() == 2, msg="There are two log entries") + + def test_changes_display_dict_datetime(self): + timestamp = datetime.datetime(2017, 1, 10, 15, 0, tzinfo=timezone.utc) + date = datetime.date(2017, 1, 10) + time = datetime.time(12, 0) + dtm = DateTimeFieldModel(label='DateTimeField model', timestamp=timestamp, date=date, time=time, naive_dt=self.now) + dtm.save() + localized_timestamp = timestamp.astimezone(gettz(settings.TIME_ZONE)) + self.assertTrue(dtm.history.latest().changes_display_dict["timestamp"][1] == \ + dateformat.format(localized_timestamp, settings.DATETIME_FORMAT), + msg=("The datetime should be formatted according to Django's settings for" + " DATETIME_FORMAT")) + timestamp = timezone.now() + dtm.timestamp = timestamp + dtm.save() + localized_timestamp = timestamp.astimezone(gettz(settings.TIME_ZONE)) + self.assertTrue(dtm.history.latest().changes_display_dict["timestamp"][1] == \ + dateformat.format(localized_timestamp, settings.DATETIME_FORMAT), + msg=("The datetime should be formatted according to Django's settings for" + " DATETIME_FORMAT")) + + with self.settings(USE_L10N=True, LANGUAGE_CODE='en-GB'): + self.assertTrue(dtm.history.latest().changes_display_dict["timestamp"][1] == \ +~~ formats.localize(localized_timestamp), + msg=("The datetime should be formatted according to Django's settings for" + " USE_L10N is True with a different LANGUAGE_CODE.")) + + + def test_changes_display_dict_date(self): + timestamp = datetime.datetime(2017, 1, 10, 15, 0, tzinfo=timezone.utc) + date = datetime.date(2017, 1, 10) + time = datetime.time(12, 0) + dtm = DateTimeFieldModel(label='DateTimeField model', timestamp=timestamp, date=date, time=time, naive_dt=self.now) + dtm.save() + self.assertTrue(dtm.history.latest().changes_display_dict["date"][1] == \ + dateformat.format(date, settings.DATE_FORMAT), + msg=("The date should be formatted according to Django's settings for" + " DATE_FORMAT unless USE_L10N is True.")) + date = datetime.date(2017, 1, 11) + dtm.date = date + dtm.save() + self.assertTrue(dtm.history.latest().changes_display_dict["date"][1] == \ + dateformat.format(date, settings.DATE_FORMAT), + msg=("The date should be formatted according to Django's settings for" + " DATE_FORMAT unless USE_L10N is True.")) + + with self.settings(USE_L10N=True, LANGUAGE_CODE='en-GB'): + self.assertTrue(dtm.history.latest().changes_display_dict["date"][1] == \ +~~ formats.localize(date), + msg=("The date should be formatted according to Django's settings for" + " USE_L10N is True with a different LANGUAGE_CODE.")) + + def test_changes_display_dict_time(self): + timestamp = datetime.datetime(2017, 1, 10, 15, 0, tzinfo=timezone.utc) + date = datetime.date(2017, 1, 10) + time = datetime.time(12, 0) + dtm = DateTimeFieldModel(label='DateTimeField model', timestamp=timestamp, date=date, time=time, naive_dt=self.now) + dtm.save() + self.assertTrue(dtm.history.latest().changes_display_dict["time"][1] == \ + dateformat.format(time, settings.TIME_FORMAT), + msg=("The time should be formatted according to Django's settings for" + " TIME_FORMAT unless USE_L10N is True.")) + time = datetime.time(6, 0) + dtm.time = time + dtm.save() + self.assertTrue(dtm.history.latest().changes_display_dict["time"][1] == \ + dateformat.format(time, settings.TIME_FORMAT), + msg=("The time should be formatted according to Django's settings for" + " TIME_FORMAT unless USE_L10N is True.")) + + with self.settings(USE_L10N=True, LANGUAGE_CODE='en-GB'): + self.assertTrue(dtm.history.latest().changes_display_dict["time"][1] == \ +~~ formats.localize(time), + msg=("The time should be formatted according to Django's settings for" + " USE_L10N is True with a different LANGUAGE_CODE.")) + + def test_update_naive_dt(self): + timestamp = datetime.datetime(2017, 1, 10, 15, 0, tzinfo=timezone.utc) + date = datetime.date(2017, 1, 10) + time = datetime.time(12, 0) + dtm = DateTimeFieldModel(label='DateTimeField model', timestamp=timestamp, date=date, time=time, naive_dt=self.now) + dtm.save() + + dtm.naive_dt = timezone.make_naive(timezone.now(), timezone=timezone.utc) + dtm.save() + + +class UnregisterTest(TestCase): + def setUp(self): + auditlog.unregister(SimpleModel) + self.obj = SimpleModel.objects.create(text='No history') + + def tearDown(self): + auditlog.register(SimpleModel) + + def test_unregister_create(self): + obj = self.obj + + +## ... source file continues with no further formats examples... + +``` + + +## Example 2 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / widgets.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./widgets.py) + +```python +# widgets.py +import datetime +import re +from itertools import chain + +import django +from django import forms +from django.conf import settings +from django.forms.widgets import FILE_INPUT_CONTRADICTION +from django.template import loader +~~from django.utils import datetime_safe, formats +from django.utils.dates import MONTHS +from django.utils.encoding import force_str +from django.utils.html import conditional_escape +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ + +from .compat import MULTIVALUE_DICT_TYPES, flatten_contexts + + +from django.forms.utils import to_current_timezone + + +RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$') + + +__all__ = ( + 'TextInput', 'PasswordInput', 'HiddenInput', 'ClearableFileInput', + 'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', + 'CheckboxInput', 'Select', 'NullBooleanSelect', 'SelectMultiple', + 'RadioSelect', 'CheckboxSelectMultiple', 'SearchInput', 'RangeInput', + 'ColorInput', 'EmailInput', 'URLInput', 'PhoneNumberInput', 'NumberInput', + 'IPAddressInput', 'MultiWidget', 'Widget', 'SplitDateTimeWidget', + 'SplitHiddenDateTimeWidget', 'MultipleHiddenInput', 'SelectDateWidget', + 'SlugInput', + + +## ... source file abbreviated to get to formats examples ... + + + if not hasattr(forms.Widget, 'format_value'): + def format_value(self, value): + return self._format_value(value) + + +class Input(Widget): + template_name = 'floppyforms/input.html' + input_type = None + datalist = None + + def __init__(self, *args, **kwargs): + datalist = kwargs.pop('datalist', None) + if datalist is not None: + self.datalist = datalist + template_name = kwargs.pop('template_name', None) + if template_name is not None: + self.template_name = template_name + super(Input, self).__init__(*args, **kwargs) + self.context_instance = None + + def get_context_data(self): + return {} + + def format_value(self, value): + if self.is_localized: +~~ value = formats.localize_input(value) + return force_str(value) + + def get_context(self, name, value, attrs=None): + context = { + 'widget': self, + 'type': self.input_type, + 'name': name, + 'hidden': self.is_hidden, + 'required': self.is_required, + 'True': True, + } + + if self.is_hidden: + context['hidden'] = True + + if value is None: + value = '' + + if value != '': + context['value'] = self.format_value(value) + + context.update(self.get_context_data()) + context['attrs'] = self.build_attrs(attrs) + + + +## ... source file abbreviated to get to formats examples ... + + + default_attrs.update(attrs) + super(Textarea, self).__init__(default_attrs) + + def format_value(self, value): + return conditional_escape(force_str(value)) + + +class DateInput(Input): + template_name = 'floppyforms/date.html' + input_type = 'date' + supports_microseconds = False + + def __init__(self, attrs=None, format=None): + super(DateInput, self).__init__(attrs) + self.format = '%Y-%m-%d' + + def format_value(self, value): + if hasattr(value, 'strftime'): + value = datetime_safe.new_date(value) + return value.strftime(self.format) + return value + + if django.VERSION < (1, 6): + def _has_changed(self, initial, data): + try: +~~ input_format = formats.get_format('DATE_INPUT_FORMATS')[0] + initial = datetime.datetime.strptime(initial, input_format).date() + except (TypeError, ValueError): + pass + return super(DateInput, self)._has_changed( + self._format_value(initial), data + ) + + +class DateTimeInput(Input): + template_name = 'floppyforms/datetime.html' + input_type = 'datetime' + supports_microseconds = False + + def __init__(self, attrs=None, format=None): + super(DateTimeInput, self).__init__(attrs) + if format: + self.format = format + self.manual_format = True + else: +~~ self.format = formats.get_format('DATETIME_INPUT_FORMATS')[0] + self.manual_format = False + + def format_value(self, value): + if hasattr(value, 'strftime'): + value = datetime_safe.new_datetime(value) + return value.strftime(self.format) + return value + + if django.VERSION < (1, 6): + def _has_changed(self, initial, data): + try: +~~ input_format = formats.get_format('DATETIME_INPUT_FORMATS')[0] + initial = datetime.datetime.strptime(initial, input_format) + except (TypeError, ValueError): + pass + return super(DateTimeInput, self)._has_changed( + self._format_value(initial), data + ) + + +class TimeInput(Input): + template_name = 'floppyforms/time.html' + input_type = 'time' + supports_microseconds = False + + def __init__(self, attrs=None, format=None): + super(TimeInput, self).__init__(attrs) + if format: + self.format = format + self.manual_format = True + else: +~~ self.format = formats.get_format('TIME_INPUT_FORMATS')[0] + self.manual_format = False + + def format_value(self, value): + if hasattr(value, 'strftime'): + return value.strftime(self.format) + return value + + if django.VERSION < (1, 6): + def _has_changed(self, initial, data): + try: +~~ input_format = formats.get_format('TIME_INPUT_FORMATS')[0] + initial = datetime.datetime.strptime(initial, input_format).time() + except (TypeError, ValueError): + pass + return super(TimeInput, self)._has_changed( + self._format_value(initial), data + ) + + +class SearchInput(Input): + template_name = 'floppyforms/search.html' + input_type = 'search' + + +class EmailInput(TextInput): + template_name = 'floppyforms/email.html' + input_type = 'email' + + +class URLInput(TextInput): + template_name = 'floppyforms/url.html' + input_type = 'url' + + +class ColorInput(Input): + + +## ... source file abbreviated to get to formats examples ... + + +class RadioSelect(Select): + template_name = 'floppyforms/radio.html' + + +class CheckboxSelectMultiple(SelectMultiple): + template_name = 'floppyforms/checkbox_select.html' + + +class MultiWidget(forms.MultiWidget): + @property + def is_hidden(self): + return all(w.is_hidden for w in self.widgets) + + def build_attrs(self, base_attrs, extra_attrs=None, **kwargs): + attrs = dict(self.attrs, **kwargs) + attrs.update(base_attrs) + if extra_attrs: + attrs.update(extra_attrs) + return attrs + + if django.VERSION < (1, 11): + def format_value(self, value): + if value == '' or value is None: + return None + if self.is_localized: +~~ return formats.localize_input(value) + return force_str(value) + + def get_context(self, name, value, attrs): + context = {} + context['widget'] = { + 'name': name, + 'is_hidden': self.is_hidden, + 'required': self.is_required, + 'value': self.format_value(value), + 'attrs': self.build_attrs(self.attrs, attrs), + 'template_name': self.template_name, + } + if self.is_localized: + for widget in self.widgets: + widget.is_localized = self.is_localized + if not isinstance(value, list): + value = self.decompress(value) + + final_attrs = context['widget']['attrs'] + input_type = final_attrs.pop('type', None) + id_ = final_attrs.get('id') + subwidgets = [] + for i, widget in enumerate(self.widgets): + if input_type is not None: + + +## ... source file abbreviated to get to formats examples ... + + + if value is None: + value = '' + + context.update(self.get_context_data()) + attrs.update(self.attrs) + + for key, value in attrs.items(): + if value is True: + attrs[key] = False + context['year_id'] = self.year_field % attrs['id'] + context['month_id'] = self.month_field % attrs['id'] + context['day_id'] = self.day_field % attrs['id'] + del attrs['id'] + + context['attrs'] = attrs + return context + + def render(self, name, value, attrs=None, extra_context={}, renderer=None): + try: + year_val, month_val, day_val = value.year, value.month, value.day + except AttributeError: + year_val = month_val = day_val = None + if isinstance(value, str): + if settings.USE_L10N: + try: +~~ input_format = formats.get_format( + 'DATE_INPUT_FORMATS' + )[0] + v = datetime.datetime.strptime(value, input_format) + year_val, month_val, day_val = v.year, v.month, v.day + except ValueError: + pass + else: + match = RE_DATE.match(value) + if match: + year_val, month_val, day_val = map(int, match.groups()) + + context = self.get_context(name, value, attrs=attrs, + extra_context=extra_context) + + context['year_choices'] = [(i, i) for i in self.years] + context['year_val'] = year_val + + context['month_choices'] = list(MONTHS.items()) + context['month_val'] = month_val + + context['day_choices'] = [(i, i) for i in range(1, 32)] + context['day_val'] = day_val + + + if self.required is False: + context['year_choices'].insert(0, self.none_value) + context['month_choices'].insert(0, self.none_value) + context['day_choices'].insert(0, self.none_value) + + return loader.render_to_string(self.template_name, context) + + def value_from_datadict(self, data, files, name): + y = data.get(self.year_field % name) + m = data.get(self.month_field % name) + d = data.get(self.day_field % name) + if y == m == d == "0": + return None + if y and m and d: + if settings.USE_L10N: +~~ input_format = formats.get_format('DATE_INPUT_FORMATS')[0] + try: + date_value = datetime.date(int(y), int(m), int(d)) + except ValueError: + return '%s-%s-%s' % (y, m, d) + else: + date_value = datetime_safe.new_date(date_value) + return date_value.strftime(input_format) + else: + return '%s-%s-%s' % (y, m, d) + return data.get(name, None) + + + +## ... source file continues with no further formats examples... + +``` + diff --git a/content/pages/examples/django/django-utils-functional-keep-lazy.markdown b/content/pages/examples/django/django-utils-functional-keep-lazy.markdown new file mode 100644 index 000000000..cf82dbe3e --- /dev/null +++ b/content/pages/examples/django/django-utils-functional-keep-lazy.markdown @@ -0,0 +1,72 @@ +title: django.utils.functional keep_lazy Example Code +category: page +slug: django-utils-functional-keep-lazy-examples +sortorder: 500011457 +toc: False +sidebartitle: django.utils.functional keep_lazy +meta: Python example code for the keep_lazy callable from the django.utils.functional module of the Django project. + + +keep_lazy is a callable within the django.utils.functional module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / utils / compatibility.py**](https://github.com/divio/django-filer/blob/develop/filer/utils/compatibility.py) + +```python +# compatibility.py +from __future__ import absolute_import, unicode_literals + +import sys + +from django.utils import six +~~from django.utils.functional import keep_lazy +from django.utils.text import Truncator, format_lazy + + +def string_concat(*strings): + return format_lazy('{}' * len(strings), *strings) + + +def truncate_words(s, num, end_text='...'): + truncate = end_text and ' %s' % end_text or '' + return Truncator(s).words(num, truncate=truncate) + + +~~truncate_words = keep_lazy(truncate_words, six.text_type) + + +if not six.PY3: + fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def upath(path): + if six.PY2 and not isinstance(path, six.text_type): + return path.decode(fs_encoding) + return path + + +def get_delete_permission(opts): + from django.contrib.auth import get_permission_codename # noqa + return '%s.%s' % (opts.app_label, get_permission_codename('delete', opts)) + + +try: + from PIL import Image as PILImage # noqa + from PIL import ImageDraw as PILImageDraw # noqa + from PIL import ExifTags as PILExifTags # noqa +except ImportError: + try: + import Image as PILImage # noqa + + +## ... source file continues with no further keep_lazy examples... + +``` + diff --git a/content/pages/examples/django/django-utils-functional-lazy.markdown b/content/pages/examples/django/django-utils-functional-lazy.markdown new file mode 100644 index 000000000..4d92b9125 --- /dev/null +++ b/content/pages/examples/django/django-utils-functional-lazy.markdown @@ -0,0 +1,198 @@ +title: django.utils.functional lazy Example Code +category: page +slug: django-utils-functional-lazy-examples +sortorder: 500011458 +toc: False +sidebartitle: django.utils.functional lazy +meta: Python example code for the lazy callable from the django.utils.functional module of the Django project. + + +lazy is a callable within the django.utils.functional module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / context_processors.py**](https://github.com/divio/django-cms/blob/develop/cms/./context_processors.py) + +```python +# context_processors.py +try: + from functools import lru_cache +except ImportError: + from django.utils.lru_cache import lru_cache + +~~from django.utils.functional import lazy + +from cms.utils.conf import get_cms_setting +from cms.utils.page import get_page_template_from_request + + +def cms_settings(request): + from menus.menu_pool import MenuRenderer + + @lru_cache(maxsize=None) + def _get_menu_renderer(): + from menus.menu_pool import menu_pool + return menu_pool.get_renderer(request) + +~~ _get_menu_renderer = lazy(_get_menu_renderer, MenuRenderer) + + return { + 'cms_menu_renderer': _get_menu_renderer(), + 'CMS_MEDIA_URL': get_cms_setting('MEDIA_URL'), + 'CMS_TEMPLATE': lambda: get_page_template_from_request(request), + } + + + +## ... source file continues with no further lazy examples... + +``` + + +## Example 2 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / reverse.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./reverse.py) + +```python +# reverse.py +from django.urls import NoReverseMatch +from django.urls import reverse as django_reverse +~~from django.utils.functional import lazy + +from rest_framework.settings import api_settings +from rest_framework.utils.urls import replace_query_param + + +def preserve_builtin_query_params(url, request=None): + if request is None: + return url + + overrides = [ + api_settings.URL_FORMAT_OVERRIDE, + ] + + for param in overrides: + if param and (param in request.GET): + value = request.GET[param] + url = replace_query_param(url, param, value) + + return url + + +def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra): + scheme = getattr(request, 'versioning_scheme', None) + if scheme is not None: + try: + url = scheme.reverse(viewname, args, kwargs, request, format, **extra) + except NoReverseMatch: + url = _reverse(viewname, args, kwargs, request, format, **extra) + else: + url = _reverse(viewname, args, kwargs, request, format, **extra) + + return preserve_builtin_query_params(url, request) + + +def _reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra): + if format is not None: + kwargs = kwargs or {} + kwargs['format'] = format + url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) + if request: + return request.build_absolute_uri(url) + return url + + +~~reverse_lazy = lazy(reverse, str) + + + +## ... source file continues with no further lazy examples... + +``` + + +## Example 3 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / models / __init__.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/models/__init__.py) + +```python +# __init__.py +from django import shortcuts +from django import urls +from django.urls import base +~~from django.utils.functional import lazy + +from .article import * # noqa +from .pluginbase import * # noqa +from .urlpath import * # noqa + +original_django_reverse = urls.reverse + + +def reverse(*args, **kwargs): + if isinstance(args[0], str) and args[0].startswith("wiki:"): + url_kwargs = kwargs.get("kwargs", {}) + path = url_kwargs.get("path", False) + if path is not False: + url_kwargs.pop("article_id", None) + url_kwargs["path"] = path + kwargs["kwargs"] = url_kwargs + + url = original_django_reverse(*args, **kwargs) + if hasattr(reverse, "_transform_url"): + url = reverse._transform_url(url) + else: + url = original_django_reverse(*args, **kwargs) + + return url + + +~~reverse_lazy = lazy(reverse, str) + + +base.reverse = reverse +base.reverse_lazy = reverse_lazy +urls.reverse = reverse +urls.reverse_lazy = reverse_lazy +shortcuts.reverse = reverse + + + +## ... source file continues with no further lazy examples... + +``` + diff --git a/content/pages/examples/django/django-utils-functional-lazyobject.markdown b/content/pages/examples/django/django-utils-functional-lazyobject.markdown new file mode 100644 index 000000000..4d3d89471 --- /dev/null +++ b/content/pages/examples/django/django-utils-functional-lazyobject.markdown @@ -0,0 +1,266 @@ +title: django.utils.functional LazyObject Example Code +category: page +slug: django-utils-functional-lazyobject-examples +sortorder: 500011454 +toc: False +sidebartitle: django.utils.functional LazyObject +meta: Python example code for the LazyObject class from the django.utils.functional module of the Django project. + + +LazyObject is a class within the django.utils.functional module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / __init__.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/__init__.py) + +```python +# __init__.py +from django.conf import settings +from django.core.files.storage import get_storage_class +~~from django.utils.functional import LazyObject + +from cms.utils.conf import get_site_id # nopyflakes +from cms.utils.i18n import get_default_language +from cms.utils.i18n import get_language_list +from cms.utils.i18n import get_language_code + + +def get_current_site(): + from django.contrib.sites.models import Site + + return Site.objects.get_current() + + +def get_language_from_request(request, current_page=None): + language = None + if hasattr(request, 'POST'): + language = request.POST.get('language', None) + if hasattr(request, 'GET') and not language: + language = request.GET.get('language', None) + site_id = current_page.node.site_id if current_page else None + if language: + language = get_language_code(language) + if not language in get_language_list(site_id): + language = None + if not language: + language = get_language_code(getattr(request, 'LANGUAGE_CODE', None)) + if language: + if not language in get_language_list(site_id): + language = None + + if not language and current_page: + languages = current_page.get_languages() + + if len(languages) > 0: + language = languages[0] + + if not language: + language = get_default_language(site_id=site_id) + + return language + +default_storage = 'django.contrib.staticfiles.storage.StaticFilesStorage' + + +~~class ConfiguredStorage(LazyObject): + def _setup(self): + self._wrapped = get_storage_class(getattr(settings, 'STATICFILES_STORAGE', default_storage))() + +configured_storage = ConfiguredStorage() + + + +## ... source file continues with no further LazyObject examples... + +``` + + +## Example 2 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / panels / staticfiles.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/staticfiles.py) + +```python +# staticfiles.py +from collections import OrderedDict +from os.path import join, normpath + +from django.conf import settings +from django.contrib.staticfiles import finders, storage +from django.core.files.storage import get_storage_class +~~from django.utils.functional import LazyObject +from django.utils.translation import gettext_lazy as _, ngettext as __ + +from debug_toolbar import panels +from debug_toolbar.utils import ThreadCollector + +try: + import threading +except ImportError: + threading = None + + +class StaticFile: + + def __init__(self, path): + self.path = path + + def __str__(self): + return self.path + + def real_path(self): + return finders.find(self.path) + + def url(self): + return storage.staticfiles_storage.url(self.path) + + +class FileCollector(ThreadCollector): + def collect(self, path, thread=None): + if path.endswith("/"): + return + super().collect(StaticFile(path), thread) + + +collector = FileCollector() + + +~~class DebugConfiguredStorage(LazyObject): + + def _setup(self): + + configured_storage_cls = get_storage_class(settings.STATICFILES_STORAGE) + + class DebugStaticFilesStorage(configured_storage_cls): + def __init__(self, collector, *args, **kwargs): + super().__init__(*args, **kwargs) + self.collector = collector + + def url(self, path): + self.collector.collect(path) + return super().url(path) + + self._wrapped = DebugStaticFilesStorage(collector) + + +_original_storage = storage.staticfiles_storage + + +class StaticFilesPanel(panels.Panel): + + name = "Static files" + template = "debug_toolbar/panels/staticfiles.html" + + +## ... source file continues with no further LazyObject examples... + +``` + + +## Example 3 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / sites.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./sites.py) + +```python +# sites.py +from django.apps import apps +from django.urls import include +from django.urls import re_path +~~from django.utils.functional import LazyObject +from django.utils.module_loading import import_string +from wiki.conf import settings +from wiki.core.plugins import registry + + +class WikiSite: + + def __init__(self, name="wiki"): + from wiki.views import accounts, article, deleted_list + + self.name = name + + self.root_view = getattr(self, "root_view", article.CreateRootView.as_view()) + self.root_missing_view = getattr( + self, "root_missing_view", article.MissingRootView.as_view() + ) + + self.article_view = getattr(self, "article_view", article.ArticleView.as_view()) + self.article_create_view = getattr( + self, "article_create_view", article.Create.as_view() + ) + self.article_delete_view = getattr( + self, "article_delete_view", article.Delete.as_view() + ) + + +## ... source file abbreviated to get to LazyObject examples ... + + + return urlpatterns + + def get_plugin_urls(self): + urlpatterns = [] + for plugin in registry.get_plugins().values(): + slug = getattr(plugin, "slug", None) + if slug: + article_urlpatterns = plugin.urlpatterns.get("article", []) + urlpatterns += [ + re_path( + r"^(?P[0-9]+)/plugin/" + slug + "/", + include(article_urlpatterns), + ), + re_path( + r"^(?P.+/|)_plugin/" + slug + "/", + include(article_urlpatterns), + ), + ] + root_urlpatterns = plugin.urlpatterns.get("root", []) + urlpatterns += [ + re_path(r"^_plugin/" + slug + "/", include(root_urlpatterns)), + ] + return urlpatterns + + +~~class DefaultWikiSite(LazyObject): + def _setup(self): + WikiSiteClass = import_string(apps.get_app_config("wiki").default_site) + self._wrapped = WikiSiteClass() + + +site = DefaultWikiSite() + + + +## ... source file continues with no further LazyObject examples... + +``` + diff --git a/content/pages/examples/django/django-utils-functional-promise.markdown b/content/pages/examples/django/django-utils-functional-promise.markdown new file mode 100644 index 000000000..12ec1be58 --- /dev/null +++ b/content/pages/examples/django/django-utils-functional-promise.markdown @@ -0,0 +1,335 @@ +title: django.utils.functional Promise Example Code +category: page +slug: django-utils-functional-promise-examples +sortorder: 500011455 +toc: False +sidebartitle: django.utils.functional Promise +meta: Python example code for the Promise class from the django.utils.functional module of the Django project. + + +Promise is a class within the django.utils.functional module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / toolbar / items.py**](https://github.com/divio/django-cms/blob/develop/cms/toolbar/items.py) + +```python +# items.py +import json +from abc import ABCMeta +from collections import defaultdict + +from django.template.loader import render_to_string +from django.utils.encoding import force_text +~~from django.utils.functional import Promise + +from six import with_metaclass + +from cms.constants import RIGHT, LEFT, REFRESH_PAGE, URL_CHANGE + + +class ItemSearchResult(object): + def __init__(self, item, index): + self.item = item + self.index = index + + def __add__(self, other): + return ItemSearchResult(self.item, self.index + other) + + def __sub__(self, other): + return ItemSearchResult(self.item, self.index - other) + + def __int__(self): + return self.index + + +def may_be_lazy(thing): +~~ if isinstance(thing, Promise): + return thing._proxy____args[0] + else: + return thing + + +class ToolbarAPIMixin(with_metaclass(ABCMeta)): + REFRESH_PAGE = REFRESH_PAGE + URL_CHANGE = URL_CHANGE + LEFT = LEFT + RIGHT = RIGHT + + def __init__(self): + self.items = [] + self.menus = {} + self._memo = defaultdict(list) + + def _memoize(self, item): + self._memo[item.__class__].append(item) + + def _unmemoize(self, item): + self._memo[item.__class__].remove(item) + + def _item_position(self, item): + return self.items.index(item) + + +## ... source file continues with no further Promise examples... + +``` + + +## Example 2 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import json +from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 + from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +~~from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + kwargs.setdefault('content_type', 'application/json') + data = json.dumps(data, cls=encoder) + super(JsonResponse, self).__init__(content=data, **kwargs) + + +def get_app_list(context, order=True): + admin_site = get_admin_site(context) + + +## ... source file abbreviated to get to Promise examples ... + + +def get_admin_site(context): + try: + current_resolver = resolve(context.get('request').path) + index_resolver = resolve(reverse('%s:index' % current_resolver.namespaces[0])) + + if hasattr(index_resolver.func, 'admin_site'): + return index_resolver.func.admin_site + + for func_closure in index_resolver.func.__closure__: + if isinstance(func_closure.cell_contents, AdminSite): + return func_closure.cell_contents + except: + pass + + return admin.site + + +def get_admin_site_name(context): + return get_admin_site(context).name + + +class LazyDateTimeEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date): + return obj.isoformat() +~~ elif isinstance(obj, Promise): + return force_text(obj) + return self.encode(obj) + + +def get_model_instance_label(instance): + if getattr(instance, "related_label", None): + return instance.related_label() + return smart_text(instance) + + +class SuccessMessageMixin(object): + success_message = '' + + def form_valid(self, form): + response = super(SuccessMessageMixin, self).form_valid(form) + success_message = self.get_success_message(form.cleaned_data) + if success_message: + messages.success(self.request, success_message) + return response + + def get_success_message(self, cleaned_data): + return self.success_message % cleaned_data + + + + +## ... source file continues with no further Promise examples... + +``` + + +## Example 3 from django-jsonfield +[django-jsonfield](https://github.com/dmkoch/django-jsonfield) +([jsonfield on PyPi](https://pypi.org/project/jsonfield/)) is a +[Django](/django.html) code library that makes it easier to store validated +JSON in a [Django object-relational mapper (ORM)](/django-orm.html) database +model. + +The django-jsonfield project is open source under the +[MIT license](https://github.com/dmkoch/django-jsonfield/blob/master/LICENSE). + +[**django-jsonfield / src/jsonfield / encoder.py**](https://github.com/dmkoch/django-jsonfield/blob/master/src/jsonfield/./encoder.py) + +```python +# encoder.py +import datetime +import decimal +import json +import uuid + +from django.db.models.query import QuerySet +from django.utils import timezone +from django.utils.encoding import force_str +~~from django.utils.functional import Promise + + +class JSONEncoder(json.JSONEncoder): + def default(self, obj): # noqa: C901 +~~ if isinstance(obj, Promise): + return force_str(obj) + elif isinstance(obj, datetime.datetime): + representation = obj.isoformat() + if representation.endswith('+00:00'): + representation = representation[:-6] + 'Z' + return representation + elif isinstance(obj, datetime.date): + return obj.isoformat() + elif isinstance(obj, datetime.time): + if timezone and timezone.is_aware(obj): + raise ValueError("JSON can't represent timezone-aware times.") + representation = obj.isoformat() + return representation + elif isinstance(obj, datetime.timedelta): + return str(obj.total_seconds()) + elif isinstance(obj, decimal.Decimal): + return float(obj) + elif isinstance(obj, uuid.UUID): + return str(obj) + elif isinstance(obj, QuerySet): + return tuple(obj) + elif isinstance(obj, bytes): + return obj.decode() + elif hasattr(obj, 'tolist'): + + +## ... source file continues with no further Promise examples... + +``` + + +## Example 4 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / utils / encoders.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/utils/encoders.py) + +```python +# encoders.py +import datetime +import decimal +import json # noqa +import uuid + +from django.db.models.query import QuerySet +from django.utils import timezone +from django.utils.encoding import force_str +~~from django.utils.functional import Promise + +from rest_framework.compat import coreapi + + +class JSONEncoder(json.JSONEncoder): + def default(self, obj): +~~ if isinstance(obj, Promise): + return force_str(obj) + elif isinstance(obj, datetime.datetime): + representation = obj.isoformat() + if representation.endswith('+00:00'): + representation = representation[:-6] + 'Z' + return representation + elif isinstance(obj, datetime.date): + return obj.isoformat() + elif isinstance(obj, datetime.time): + if timezone and timezone.is_aware(obj): + raise ValueError("JSON can't represent timezone-aware times.") + representation = obj.isoformat() + return representation + elif isinstance(obj, datetime.timedelta): + return str(obj.total_seconds()) + elif isinstance(obj, decimal.Decimal): + return float(obj) + elif isinstance(obj, uuid.UUID): + return str(obj) + elif isinstance(obj, QuerySet): + return tuple(obj) + elif isinstance(obj, bytes): + return obj.decode() + elif hasattr(obj, 'tolist'): + + +## ... source file continues with no further Promise examples... + +``` + diff --git a/content/pages/examples/django/django-utils-functional-simplelazyobject.markdown b/content/pages/examples/django/django-utils-functional-simplelazyobject.markdown new file mode 100644 index 000000000..7bc37e79c --- /dev/null +++ b/content/pages/examples/django/django-utils-functional-simplelazyobject.markdown @@ -0,0 +1,98 @@ +title: django.utils.functional SimpleLazyObject Example Code +category: page +slug: django-utils-functional-simplelazyobject-examples +sortorder: 500011456 +toc: False +sidebartitle: django.utils.functional SimpleLazyObject +meta: Python example code for the SimpleLazyObject class from the django.utils.functional module of the Django project. + + +SimpleLazyObject is a class within the django.utils.functional module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / cms_menus.py**](https://github.com/divio/django-cms/blob/develop/cms/./cms_menus.py) + +```python +# cms_menus.py +from django.db.models.query import Prefetch, prefetch_related_objects +from django.urls import reverse +~~from django.utils.functional import SimpleLazyObject +from django.utils.translation import override as force_language + +from cms import constants +from cms.api import get_page_draft +from cms.apphook_pool import apphook_pool +from cms.models import EmptyTitle +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import ( + get_fallback_languages, + get_public_languages, + hide_untranslated, + is_valid_site_language, +) +from cms.utils.permissions import get_view_restrictions +from cms.utils.page import get_page_queryset +from cms.utils.page_permissions import user_can_view_all_pages + +from menus.base import Menu, NavigationNode, Modifier +from menus.menu_pool import menu_pool + + +def get_visible_nodes(request, pages, site): + user = request.user + _get_page_draft = get_page_draft + public_for = get_cms_setting('PUBLIC_FOR') + can_see_unrestricted = public_for == 'all' or (public_for == 'staff' and user.is_staff) + + if not user.is_authenticated and not can_see_unrestricted: + return [] + + if user_can_view_all_pages(user, site): + return list(pages) + + draft_pages = [_get_page_draft(page) for page in pages] + restricted_pages = get_view_restrictions(draft_pages) + + if not restricted_pages: + return list(pages) if can_see_unrestricted else [] + + user_id = user.pk +~~ user_groups = SimpleLazyObject(lambda: frozenset(user.groups.values_list('pk', flat=True))) + is_auth_user = user.is_authenticated + + def user_can_see_page(page): + page_id = page.pk if page.publisher_is_draft else page.publisher_public_id + page_permissions = restricted_pages.get(page_id, []) + + if not page_permissions: + return can_see_unrestricted + + if not is_auth_user: + return False + + for perm in page_permissions: + if perm.user_id == user_id or perm.group_id in user_groups: + return True + return False + return [page for page in pages if user_can_see_page(page)] + + +def get_menu_node_for_page(renderer, page, language, fallbacks=None): + if fallbacks is None: + fallbacks = [] + + attr = { + + +## ... source file continues with no further SimpleLazyObject examples... + +``` + diff --git a/content/pages/examples/django/django-utils-functional-total-ordering.markdown b/content/pages/examples/django/django-utils-functional-total-ordering.markdown new file mode 100644 index 000000000..de5323a43 --- /dev/null +++ b/content/pages/examples/django/django-utils-functional-total-ordering.markdown @@ -0,0 +1,65 @@ +title: django.utils.functional total_ordering Example Code +category: page +slug: django-utils-functional-total-ordering-examples +sortorder: 500011459 +toc: False +sidebartitle: django.utils.functional total_ordering +meta: Python example code for the total_ordering callable from the django.utils.functional module of the Django project. + + +total_ordering is a callable within the django.utils.functional module of the Django project. + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / search.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/search.py) + +```python +# search.py +from django.forms import Media, MediaDefiningClass +from django.forms.utils import flatatt +from django.template.loader import render_to_string +~~from django.utils.functional import cached_property, total_ordering +from django.utils.safestring import mark_safe +from django.utils.text import slugify + +from wagtail.admin.forms.search import SearchForm +from wagtail.core import hooks + + +~~@total_ordering +class SearchArea(metaclass=MediaDefiningClass): + template = 'wagtailadmin/shared/search_area.html' + + def __init__(self, label, url, name=None, classnames='', attrs=None, order=1000): + self.label = label + self.url = url + self.classnames = classnames + self.name = (name or slugify(str(label))) + self.order = order + + if attrs: + self.attr_string = flatatt(attrs) + else: + self.attr_string = "" + + def __lt__(self, other): + return (self.order, self.label) < (other.order, other.label) + + def __eq__(self, other): + return (self.order, self.label) == (other.order, other.label) + + def is_shown(self, request): + return True + + + +## ... source file continues with no further total_ordering examples... + +``` + diff --git a/content/pages/examples/django/django-utils-functional-wraps.markdown b/content/pages/examples/django/django-utils-functional-wraps.markdown new file mode 100644 index 000000000..81fb60b74 --- /dev/null +++ b/content/pages/examples/django/django-utils-functional-wraps.markdown @@ -0,0 +1,206 @@ +title: django.utils.functional wraps Example Code +category: page +slug: django-utils-functional-wraps-examples +sortorder: 500011460 +toc: False +sidebartitle: django.utils.functional wraps +meta: Python example code for the wraps callable from the django.utils.functional module of the Django project. + + +wraps is a callable within the django.utils.functional module of the Django project. + + +## Example 1 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / decorators.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./decorators.py) + +```python +# decorators.py +from django.apps import apps +from django.conf import settings +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.db.models import Model +from django.db.models.base import ModelBase +from django.db.models.query import QuerySet +from django.shortcuts import get_object_or_404 +~~from django.utils.functional import wraps +from guardian.exceptions import GuardianError +from guardian.utils import get_40x_or_None + + +def permission_required(perm, lookup_variables=None, **kwargs): + login_url = kwargs.pop('login_url', settings.LOGIN_URL) + redirect_field_name = kwargs.pop( + 'redirect_field_name', REDIRECT_FIELD_NAME) + return_403 = kwargs.pop('return_403', False) + return_404 = kwargs.pop('return_404', False) + accept_global_perms = kwargs.pop('accept_global_perms', False) + + if not isinstance(perm, str): + raise GuardianError("First argument must be in format: " + "'app_label.codename or a callable which return similar string'") + + def decorator(view_func): + def _wrapped_view(request, *args, **kwargs): + obj = None + if lookup_variables: + model, lookups = lookup_variables[0], lookup_variables[1:] + if isinstance(model, str): + splitted = model.split('.') + if len(splitted) != 2: + + +## ... source file abbreviated to get to wraps examples ... + + + "string it needs format: 'app_label.ModelClass'") + model = apps.get_model(*splitted) + elif issubclass(model.__class__, (Model, ModelBase, QuerySet)): + pass + else: + raise GuardianError("First lookup argument must always be " + "a model, string pointing at app/model or queryset. " + "Given: %s (type: %s)" % (model, type(model))) + if len(lookups) % 2 != 0: + raise GuardianError("Lookup variables must be provided " + "as pairs of lookup_string and view_arg") + lookup_dict = {} + for lookup, view_arg in zip(lookups[::2], lookups[1::2]): + if view_arg not in kwargs: + raise GuardianError("Argument %s was not passed " + "into view function" % view_arg) + lookup_dict[lookup] = kwargs[view_arg] + obj = get_object_or_404(model, **lookup_dict) + + response = get_40x_or_None(request, perms=[perm], obj=obj, + login_url=login_url, redirect_field_name=redirect_field_name, + return_403=return_403, return_404=return_404, accept_global_perms=accept_global_perms) + if response: + return response + return view_func(request, *args, **kwargs) +~~ return wraps(view_func)(_wrapped_view) + return decorator + + +def permission_required_or_403(perm, *args, **kwargs): + kwargs['return_403'] = True + return permission_required(perm, *args, **kwargs) + + +def permission_required_or_404(perm, *args, **kwargs): + kwargs['return_404'] = True + return permission_required(perm, *args, **kwargs) + + + +## ... source file continues with no further wraps examples... + +``` + + +## Example 2 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / utils.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./utils.py) + +```python +# utils.py +from django.conf import settings +~~from django.utils.functional import wraps +from django.utils.module_loading import import_string + + +def _parse_tags(tagstring): + if not tagstring: + return [] + + if "," not in tagstring and '"' not in tagstring: + words = list(set(split_strip(tagstring, " "))) + words.sort() + return words + + words = [] + buffer = [] + to_be_split = [] + saw_loose_comma = False + open_quote = False + i = iter(tagstring) + try: + while True: + c = next(i) + if c == '"': + if buffer: + to_be_split.append("".join(buffer)) + + +## ... source file abbreviated to get to wraps examples ... + + + words = list(set(words)) + words.sort() + return words + + +def split_strip(string, delimiter=","): + if not string: + return [] + + words = [w.strip() for w in string.split(delimiter)] + return [w for w in words if w] + + +def _edit_string_for_tags(tags): + names = [] + for tag in tags: + name = tag.name + if "," in name or " " in name: + names.append('"%s"' % name) + else: + names.append(name) + return ", ".join(sorted(names)) + + +def require_instance_manager(func): +~~ @wraps(func) + def inner(self, *args, **kwargs): + if self.instance is None: + raise TypeError("Can't call %s with a non-instance manager" % func.__name__) + return func(self, *args, **kwargs) + + return inner + + +def get_func(key, default): + func_path = getattr(settings, key, None) + return default if func_path is None else import_string(func_path) + + +def parse_tags(tagstring): + func = get_func("TAGGIT_TAGS_FROM_STRING", _parse_tags) + return func(tagstring) + + +def edit_string_for_tags(tags): + func = get_func("TAGGIT_STRING_FROM_TAGS", _edit_string_for_tags) + return func(tags) + + + +## ... source file continues with no further wraps examples... + +``` + diff --git a/content/pages/examples/django/django-utils-html-conditional-escape.markdown b/content/pages/examples/django/django-utils-html-conditional-escape.markdown new file mode 100644 index 000000000..afad2150a --- /dev/null +++ b/content/pages/examples/django/django-utils-html-conditional-escape.markdown @@ -0,0 +1,207 @@ +title: django.utils.html conditional_escape Example Code +category: page +slug: django-utils-html-conditional-escape-examples +sortorder: 500011461 +toc: False +sidebartitle: django.utils.html conditional_escape +meta: Python example code for the conditional_escape callable from the django.utils.html module of the Django project. + + +conditional_escape is a callable within the django.utils.html module of the Django project. + + +## Example 1 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / widgets.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./widgets.py) + +```python +# widgets.py +import datetime +import re +from itertools import chain + +import django +from django import forms +from django.conf import settings +from django.forms.widgets import FILE_INPUT_CONTRADICTION +from django.template import loader +from django.utils import datetime_safe, formats +from django.utils.dates import MONTHS +from django.utils.encoding import force_str +~~from django.utils.html import conditional_escape +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ + +from .compat import MULTIVALUE_DICT_TYPES, flatten_contexts + + +from django.forms.utils import to_current_timezone + + +RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$') + + +__all__ = ( + 'TextInput', 'PasswordInput', 'HiddenInput', 'ClearableFileInput', + 'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', + 'CheckboxInput', 'Select', 'NullBooleanSelect', 'SelectMultiple', + 'RadioSelect', 'CheckboxSelectMultiple', 'SearchInput', 'RangeInput', + 'ColorInput', 'EmailInput', 'URLInput', 'PhoneNumberInput', 'NumberInput', + 'IPAddressInput', 'MultiWidget', 'Widget', 'SplitDateTimeWidget', + 'SplitHiddenDateTimeWidget', 'MultipleHiddenInput', 'SelectDateWidget', + 'SlugInput', +) + + + + +## ... source file abbreviated to get to conditional_escape examples ... + + + data, files, self.clear_checkbox_name(name) + ): + if upload: + return FILE_INPUT_CONTRADICTION + return False + return upload + + def format_value(self, value): + if not value: + return None + return value + + +class Textarea(Input): + template_name = 'floppyforms/textarea.html' + rows = 10 + cols = 40 + + def __init__(self, attrs=None): + default_attrs = {'cols': self.cols, 'rows': self.rows} + if attrs: + default_attrs.update(attrs) + super(Textarea, self).__init__(default_attrs) + + def format_value(self, value): +~~ return conditional_escape(force_str(value)) + + +class DateInput(Input): + template_name = 'floppyforms/date.html' + input_type = 'date' + supports_microseconds = False + + def __init__(self, attrs=None, format=None): + super(DateInput, self).__init__(attrs) + self.format = '%Y-%m-%d' + + def format_value(self, value): + if hasattr(value, 'strftime'): + value = datetime_safe.new_date(value) + return value.strftime(self.format) + return value + + if django.VERSION < (1, 6): + def _has_changed(self, initial, data): + try: + input_format = formats.get_format('DATE_INPUT_FORMATS')[0] + initial = datetime.datetime.strptime(initial, input_format).date() + except (TypeError, ValueError): + pass + + +## ... source file continues with no further conditional_escape examples... + +``` + + +## Example 2 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / manytomanycolumn.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/manytomanycolumn.py) + +```python +# manytomanycolumn.py +from django.db import models +from django.utils.encoding import force_str +~~from django.utils.html import conditional_escape, mark_safe + +from .base import Column, LinkTransform, library + + +@library.register +class ManyToManyColumn(Column): + + def __init__( + self, transform=None, filter=None, separator=", ", linkify_item=None, *args, **kwargs + ): + kwargs.setdefault("orderable", False) + super().__init__(*args, **kwargs) + + if transform is not None: + self.transform = transform + if filter is not None: + self.filter = filter + self.separator = separator + + link_kwargs = None + if callable(linkify_item): + link_kwargs = dict(url=linkify_item) + elif isinstance(linkify_item, (dict, tuple)): + link_kwargs = dict(reverse_args=linkify_item) + elif linkify_item is True: + link_kwargs = dict() + + if link_kwargs is not None: + self.linkify_item = LinkTransform(attrs=self.attrs.get("a", {}), **link_kwargs) + + def transform(self, obj): + return force_str(obj) + + def filter(self, qs): + return qs.all() + + def render(self, value): + if not value.exists(): + return self.default + + items = [] + for item in self.filter(value): +~~ content = conditional_escape(self.transform(item)) + if hasattr(self, "linkify_item"): + content = self.linkify_item(content=content, record=item) + + items.append(content) + + return mark_safe(conditional_escape(self.separator).join(items)) + + @classmethod + def from_field(cls, field, **kwargs): + if isinstance(field, models.ManyToManyField): + return cls(**kwargs) + + + +## ... source file continues with no further conditional_escape examples... + +``` + diff --git a/content/pages/examples/django/django-utils-html-escape.markdown b/content/pages/examples/django/django-utils-html-escape.markdown new file mode 100644 index 000000000..5dfc6dac2 --- /dev/null +++ b/content/pages/examples/django/django-utils-html-escape.markdown @@ -0,0 +1,829 @@ +title: django.utils.html escape Example Code +category: page +slug: django-utils-html-escape-examples +sortorder: 500011462 +toc: False +sidebartitle: django.utils.html escape +meta: Python example code for the escape callable from the django.utils.html module of the Django project. + + +escape is a callable within the django.utils.html module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / angular_base.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/angular_base.py) + +```python +# angular_base.py +from base64 import b64encode +from collections import UserList +import json +import warnings + +from django.forms import forms +from django.http import QueryDict +~~from django.utils.html import format_html, format_html_join, escape, conditional_escape +from django.utils.encoding import force_text +from django.utils.module_loading import import_string +from django.utils.safestring import mark_safe, SafeText, SafeData +from django.core.exceptions import ValidationError, ImproperlyConfigured + +from .fields import DefaultFieldMixin + + +class SafeTuple(SafeData, tuple): + + +class TupleErrorList(UserList, list): + def __init__(self, initlist=None, error_class=None): + super(TupleErrorList, self).__init__(initlist) + + if error_class is None: + self.error_class = 'errorlist' + else: + self.error_class = 'errorlist {}'.format(error_class) + + def as_data(self): + return ValidationError(self.data).error_list + + def get_json_data(self, escape_html=False): + errors = [] + for error in self.as_data(): + message = list(error)[0] + errors.append({ +~~ 'message': escape(message) if escape_html else message, + 'code': error.code or '', + }) + return errors + + def as_json(self, escape_html=False): + return json.dumps(self.get_json_data(escape_html)) + + def extend(self, iterable): + for item in iterable: + if not isinstance(item, str): + self.append(item) + return None + + def as_ul(self): + if not self: + return SafeText() + first = self[0] + if isinstance(first, tuple): + error_lists = {'$pristine': [], '$dirty': []} + for e in self: + if e[5] == '$message': + li_format = '
  • ' + else: + li_format = '
  • {3}
  • ' + + +## ... source file continues with no further escape examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / templatetags / cms_tags.py**](https://github.com/divio/django-cms/blob/develop/cms/templatetags/cms_tags.py) + +```python +# cms_tags.py +from collections import namedtuple, OrderedDict +from copy import copy +from datetime import datetime + +from django import template +from django.conf import settings +from django.contrib.sites.models import Site +from django.core.mail import mail_managers +from django.db.models import Model +from django.middleware.common import BrokenLinkEmailsMiddleware +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.encoding import force_text, smart_text +~~from django.utils.html import escape +from django.utils.http import urlencode +from django.utils.translation import ( + get_language, + override as force_language, + ugettext_lazy as _, +) + +from six import string_types, integer_types + +from classytags.arguments import (Argument, MultiValueArgument, + MultiKeywordArgument) +from classytags.core import Options, Tag +from classytags.helpers import InclusionTag, AsTag +from classytags.parser import Parser +from classytags.utils import flatten_context +from classytags.values import ListValue, StringValue + +from cms.cache.page import get_page_url_cache, set_page_url_cache +from cms.exceptions import PlaceholderNotFound +from cms.models import Page, Placeholder as PlaceholderModel, CMSPlugin, StaticPlaceholder +from cms.plugin_pool import plugin_pool +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils import get_current_site, get_language_from_request, get_site_id +from cms.utils.compat.dj import get_middleware + + +## ... source file abbreviated to get to escape examples ... + + + 'as', + Argument('varname', required=False, resolve=False) + ) + + valid_attributes = [ + "title", + "slug", + "meta_description", + "page_title", + "menu_title", + "changed_date", + "changed_by", + ] + + def get_value(self, context, name, page_lookup): + if not 'request' in context: + return '' + name = name.lower() + request = context['request'] + lang = get_language_from_request(request) + page = _get_page_by_untyped_arg(page_lookup, request, get_site_id(None)) + if page and name in self.valid_attributes: + func = getattr(page, "get_%s" % name) + ret_val = func(language=lang, fallback=True) + if not isinstance(ret_val, datetime): +~~ ret_val = escape(ret_val) + return ret_val + return '' + + +class CMSToolbar(RenderBlock): + name = 'cms_toolbar' + + options = Options( + Argument('name', required=False), # just here so sekizai thinks this is a RenderBlock + parser_class=SekizaiParser, + ) + + def render_tag(self, context, name, nodelist): + request = context.get('request') + + if not request: + return nodelist.render(context) + + toolbar = get_toolbar_from_request(request) + + if toolbar and toolbar.show_toolbar: + toolbar.init_toolbar(request) + return toolbar.render_with_structure(context, nodelist) + return nodelist.render(context) + + +## ... source file continues with no further escape examples... + +``` + + +## Example 3 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / views.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/./views.py) + +```python +# views.py +from django.http import JsonResponse +~~from django.utils.html import escape +from django.utils.translation import gettext as _ + +from debug_toolbar.decorators import require_show_toolbar +from debug_toolbar.toolbar import DebugToolbar + + +@require_show_toolbar +def render_panel(request): + toolbar = DebugToolbar.fetch(request.GET["store_id"]) + if toolbar is None: + content = _( + "Data for this panel isn't available anymore. " + "Please reload the page and retry." + ) +~~ content = "

    %s

    " % escape(content) + scripts = [] + else: + panel = toolbar.get_panel_by_id(request.GET["panel_id"]) + content = panel.content + scripts = panel.scripts + return JsonResponse({"content": content, "scripts": scripts}) + + + +## ... source file continues with no further escape examples... + +``` + + +## Example 4 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / folderadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/folderadmin.py) + +```python +# folderadmin.py +from __future__ import absolute_import, division, unicode_literals + +import itertools +import os +import re +from collections import OrderedDict + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import messages +from django.contrib.admin import helpers +from django.contrib.admin.utils import capfirst, quote, unquote +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.db import models, router +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils.encoding import force_text +~~from django.utils.html import escape +from django.utils.http import urlquote, urlunquote +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy, ungettext + +from .. import settings +from ..models import ( + File, Folder, FolderPermission, FolderRoot, ImagesWithMissingData, + UnsortedImages, tools, +) +from ..settings import FILER_IMAGE_MODEL, FILER_PAGINATE_BY +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import get_delete_permission +from ..utils.filer_easy_thumbnails import FilerActionThumbnailer +from ..utils.loader import load_model +from . import views +from .forms import CopyFilesAndFoldersForm, RenameFilesForm, ResizeImagesForm +from .patched.admin_utils import get_deleted_objects +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import ( + AdminContext, admin_url_params_encoded, check_files_edit_permissions, + check_files_read_permissions, check_folder_edit_permissions, + check_folder_read_permissions, popup_status, userperms_for_request, +) + + +## ... source file abbreviated to get to escape examples ... + + + + return render( + request, + "admin/filer/delete_selected_files_confirmation.html", + context + ) + + delete_files_or_folders.short_description = ugettext_lazy( + "Delete selected files and/or folders") + + def _format_callback(self, obj, user, admin_site, perms_needed): + has_admin = obj.__class__ in admin_site._registry + opts = obj._meta + if has_admin: + admin_url = reverse('%s:%s_%s_change' + % (admin_site.name, + opts.app_label, + opts.object_name.lower()), + None, (quote(obj._get_pk_val()),)) + p = get_delete_permission(opts) + if not user.has_perm(p): + perms_needed.add(opts.verbose_name) + return mark_safe('%s: %s' % + (escape(capfirst(opts.verbose_name)), + admin_url, +~~ escape(obj))) + else: + return '%s: %s' % (capfirst(opts.verbose_name), force_text(obj)) + + def _check_copy_perms(self, request, files_queryset, folders_queryset): + try: + check_files_read_permissions(request, files_queryset) + check_folder_read_permissions(request, folders_queryset) + except PermissionDenied: + return True + return False + + def _check_move_perms(self, request, files_queryset, folders_queryset): + try: + check_files_read_permissions(request, files_queryset) + check_folder_read_permissions(request, folders_queryset) + check_files_edit_permissions(request, files_queryset) + check_folder_edit_permissions(request, folders_queryset) + except PermissionDenied: + return True + return False + + def _get_current_action_folder(self, request, files_queryset, + folders_queryset): + if files_queryset: + + +## ... source file continues with no further escape examples... + +``` + + +## Example 5 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / templatetags / rest_framework.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/templatetags/rest_framework.py) + +```python +# rest_framework.py +import re +from collections import OrderedDict + +from django import template +from django.template import loader +from django.urls import NoReverseMatch, reverse +from django.utils.encoding import force_str, iri_to_uri +~~from django.utils.html import escape, format_html, smart_urlquote +from django.utils.safestring import SafeData, mark_safe + +from rest_framework.compat import apply_markdown, pygments_highlight +from rest_framework.renderers import HTMLFormRenderer +from rest_framework.utils.urls import replace_query_param + +register = template.Library() + +class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])') + + +@register.tag(name='code') +def highlight_code(parser, token): + code = token.split_contents()[-1] + nodelist = parser.parse(('endcode',)) + parser.delete_first_token() + return CodeNode(code, nodelist) + + +class CodeNode(template.Node): + style = 'emacs' + + def __init__(self, lang, code): + self.lang = lang + + +## ... source file abbreviated to get to escape examples ... + + +def optional_logout(request, user): + try: + logout_url = reverse('rest_framework:logout') + except NoReverseMatch: +~~ snippet = format_html('', user=escape(user)) + return mark_safe(snippet) + + snippet = """""" +~~ snippet = format_html(snippet, user=escape(user), href=logout_url, next=escape(request.path)) + + return mark_safe(snippet) + + +@register.simple_tag +def add_query_param(request, key, val): + iri = request.get_full_path() + uri = iri_to_uri(iri) +~~ return escape(replace_query_param(uri, key, val)) + + +@register.filter +def as_string(value): + if value is None: + return '' + return '%s' % value + + +@register.filter +def as_list_of_strings(value): + return [ + '' if (item is None) else ('%s' % item) + for item in value + ] + + +@register.filter +def add_class(value, css_class): + html = str(value) + match = class_re.search(html) + if match: + m = re.search(r'^%s$|^%s\s|\s%s\s|\s%s$' % (css_class, css_class, + css_class, css_class), + match.group(1)) + if not m: + return mark_safe(class_re.sub(match.group(1) + " " + css_class, + html)) + else: + return mark_safe(html.replace('>', ' class="%s">' % css_class, 1)) + return value + + +@register.filter +def format_value(value): + if getattr(value, 'is_hyperlink', False): + name = str(value.obj) +~~ return mark_safe('%s' % (value, escape(name))) + if value is None or isinstance(value, bool): + return mark_safe('%s' % {True: 'true', False: 'false', None: 'null'}[value]) + elif isinstance(value, list): + if any([isinstance(item, (list, dict)) for item in value]): + template = loader.get_template('rest_framework/admin/list_value.html') + else: + template = loader.get_template('rest_framework/admin/simple_list_value.html') + context = {'value': value} + return template.render(context) + elif isinstance(value, dict): + template = loader.get_template('rest_framework/admin/dict_value.html') + context = {'value': value} + return template.render(context) + elif isinstance(value, str): + if ( + (value.startswith('http:') or value.startswith('https:')) and not + re.search(r'\s', value) + ): +~~ return mark_safe('{value}'.format(value=escape(value))) + elif '@' in value and not re.search(r'\s', value): +~~ return mark_safe('{value}'.format(value=escape(value))) + elif '\n' in value: +~~ return mark_safe('
    %s
    ' % escape(value)) + return str(value) + + +@register.filter +def items(value): + if value is None: + return [] + return value.items() + + +@register.filter +def data(value): + return value.data + + +@register.filter +def schema_links(section, sec_key=None): + NESTED_FORMAT = '%s > %s' # this format is used in docs/js/api.js:normalizeKeys + links = section.links + if section.data: + data = section.data.items() + for sub_section_key, sub_section in data: + new_links = schema_links(sub_section, sec_key=sub_section_key) + links.update(new_links) + + +## ... source file abbreviated to get to escape examples ... + + + +TRAILING_PUNCTUATION = ['.', ',', ':', ';', '.)', '"', "']", "'}", "'"] +WRAPPING_PUNCTUATION = [('(', ')'), ('<', '>'), ('[', ']'), ('<', '>'), + ('"', '"'), ("'", "'")] +word_split_re = re.compile(r'(\s+)') +simple_url_re = re.compile(r'^https?://\[?\w', re.IGNORECASE) +simple_url_2_re = re.compile(r'^www\.|^(?!http)\w[^@]+\.(com|edu|gov|int|mil|net|org)$', re.IGNORECASE) +simple_email_re = re.compile(r'^\S+@\S+\.\S+$') + + +def smart_urlquote_wrapper(matched_url): + try: + return smart_urlquote(matched_url) + except ValueError: + return None + + +@register.filter(needs_autoescape=True) +def urlize_quoted_links(text, trim_url_limit=None, nofollow=True, autoescape=True): + def trim_url(x, limit=trim_url_limit): + return limit is not None and (len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x + + safe_input = isinstance(text, SafeData) + + def conditional_escape(text): +~~ return escape(text) if autoescape and not safe_input else text + + words = word_split_re.split(force_str(text)) + for i, word in enumerate(words): + if '.' in word or '@' in word or ':' in word: + lead, middle, trail = '', word, '' + for punctuation in TRAILING_PUNCTUATION: + if middle.endswith(punctuation): + middle = middle[:-len(punctuation)] + trail = punctuation + trail + for opening, closing in WRAPPING_PUNCTUATION: + if middle.startswith(opening): + middle = middle[len(opening):] + lead = lead + opening + if ( + middle.endswith(closing) and + middle.count(closing) == middle.count(opening) + 1 + ): + middle = middle[:-len(closing)] + trail = closing + trail + + url = None + nofollow_attr = ' rel="nofollow"' if nofollow else '' + if simple_url_re.match(middle): + url = smart_urlquote_wrapper(middle) +def get_pagination_html(pager): + return pager.to_html() + + +@register.simple_tag +def render_form(serializer, template_pack=None): + style = {'template_pack': template_pack} if template_pack else {} + renderer = HTMLFormRenderer() + return renderer.render(serializer.data, None, {'style': style}) + + +@register.simple_tag +def render_field(field, style): + renderer = style.get('renderer', HTMLFormRenderer()) + return renderer.render_field(field, style) + + +@register.simple_tag +def optional_login(request): + try: + login_url = reverse('rest_framework:login') + except NoReverseMatch: + return '' + + snippet = "
  • Log in
  • " +~~ snippet = format_html(snippet, href=login_url, next=escape(request.path)) + + return mark_safe(snippet) + + +@register.simple_tag +def optional_docs_login(request): + try: + login_url = reverse('rest_framework:login') + except NoReverseMatch: + return 'log in' + + snippet = "log in" +~~ snippet = format_html(snippet, href=login_url, next=escape(request.path)) + + return mark_safe(snippet) + + +@register.simple_tag + + +## ... source file continues with no further escape examples... + +``` + + +## Example 6 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / templatetags / django_tables2.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/templatetags/django_tables2.py) + +```python +# django_tables2.py +import re +from collections import OrderedDict + +from django import template +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.template import Node, TemplateSyntaxError +from django.template.loader import get_template, select_template +from django.templatetags.l10n import register as l10n_register +~~from django.utils.html import escape +from django.utils.http import urlencode + +import django_tables2 as tables +from django_tables2.paginators import LazyPaginator +from django_tables2.utils import AttributeDict + +register = template.Library() +kwarg_re = re.compile(r"(?:(.+)=)?(.+)") +context_processor_error_msg = ( + "Tag {%% %s %%} requires django.template.context_processors.request to be " + "in the template configuration in " + "settings.TEMPLATES[]OPTIONS.context_processors) in order for the included " + "template tags to function correctly." +) + + +def token_kwargs(bits, parser): + if not bits: + return {} + kwargs = OrderedDict() + while bits: + match = kwarg_re.match(bits[0]) + if not match or not match.group(1): + return kwargs + + +## ... source file abbreviated to get to escape examples ... + + + + +class QuerystringNode(Node): + def __init__(self, updates, removals, asvar=None): + super().__init__() + self.updates = updates + self.removals = removals + self.asvar = asvar + + def render(self, context): + if "request" not in context: + raise ImproperlyConfigured(context_processor_error_msg % "querystring") + + params = dict(context["request"].GET) + for key, value in self.updates.items(): + if isinstance(key, str): + params[key] = value + continue + key = key.resolve(context) + value = value.resolve(context) + if key not in ("", None): + params[key] = value + for removal in self.removals: + params.pop(removal.resolve(context), None) + +~~ value = escape("?" + urlencode(params, doseq=True)) + + if self.asvar: + context[str(self.asvar)] = value + return "" + else: + return value + + +@register.tag +def querystring(parser, token): + bits = token.split_contents() + tag = bits.pop(0) + updates = token_kwargs(bits, parser) + + asvar_key = None + for key in updates: + if str(key) == "as": + asvar_key = key + + if asvar_key is not None: + asvar = updates[asvar_key] + del updates[asvar_key] + else: + asvar = None + + +## ... source file continues with no further escape examples... + +``` + + +## Example 7 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / images / formats.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/formats.py) + +```python +# formats.py +~~from django.utils.html import escape +from django.utils.translation import gettext_lazy as _ + +from wagtail.utils.apps import get_app_submodules + +from .shortcuts import get_rendition_or_not_found + + +class Format: + def __init__(self, name, label, classnames, filter_spec): + self.name = name + self.label = label + self.classnames = classnames + self.filter_spec = filter_spec + + def editor_attributes(self, image, alt_text): + return { + 'data-embedtype': "image", + 'data-id': image.id, + 'data-format': self.name, +~~ 'data-alt': escape(alt_text), + } + + def image_to_editor_html(self, image, alt_text): + return self.image_to_html( + image, alt_text, self.editor_attributes(image, alt_text) + ) + + def image_to_html(self, image, alt_text, extra_attributes=None): + if extra_attributes is None: + extra_attributes = {} + rendition = get_rendition_or_not_found(image, self.filter_spec) + +~~ extra_attributes['alt'] = escape(alt_text) + if self.classnames: +~~ extra_attributes['class'] = "%s" % escape(self.classnames) + + return rendition.img_tag(extra_attributes) + + +FORMATS = [] +FORMATS_BY_NAME = {} + + +def register_image_format(format): + if format.name in FORMATS_BY_NAME: + raise KeyError("Image format '%s' is already registered" % format.name) + FORMATS_BY_NAME[format.name] = format + FORMATS.append(format) + + +def unregister_image_format(format_name): + global FORMATS + try: + format_name = format_name.name + except AttributeError: + pass + + try: + del FORMATS_BY_NAME[format_name] + + +## ... source file continues with no further escape examples... + +``` + diff --git a/content/pages/examples/django/django-utils-html-escapejs.markdown b/content/pages/examples/django/django-utils-html-escapejs.markdown new file mode 100644 index 000000000..c797295b6 --- /dev/null +++ b/content/pages/examples/django/django-utils-html-escapejs.markdown @@ -0,0 +1,124 @@ +title: django.utils.html escapejs Example Code +category: page +slug: django-utils-html-escapejs-examples +sortorder: 500011463 +toc: False +sidebartitle: django.utils.html escapejs +meta: Python example code for the escapejs callable from the django.utils.html module of the Django project. + + +escapejs is a callable within the django.utils.html module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_base.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_base.py) + +```python +# plugin_base.py +import json +import re + +from django.shortcuts import render as render_to_response + +from django import forms +from django.contrib import admin +from django.contrib import messages +from django.core.exceptions import ( + ImproperlyConfigured, + ObjectDoesNotExist, + ValidationError, +) +from django.utils.encoding import force_text, smart_str +~~from django.utils.html import escapejs +from django.utils.translation import ugettext, ugettext_lazy as _ + +from six import with_metaclass, python_2_unicode_compatible + +from cms import operations +from cms.exceptions import SubClassNeededError +from cms.models import CMSPlugin +from cms.toolbar.utils import get_plugin_tree_as_json, get_plugin_toolbar_info +from cms.utils.conf import get_cms_setting + + +class CMSPluginBaseMetaclass(forms.MediaDefiningClass): + def __new__(cls, name, bases, attrs): + super_new = super(CMSPluginBaseMetaclass, cls).__new__ + parents = [base for base in bases if isinstance(base, CMSPluginBaseMetaclass)] + if not parents: + return super_new(cls, name, bases, attrs) + new_plugin = super_new(cls, name, bases, attrs) + if not issubclass(new_plugin.model, CMSPlugin): + raise SubClassNeededError( + "The 'model' attribute on CMSPluginBase subclasses must be " + "either CMSPlugin or a subclass of CMSPlugin. %r on %r is not." + % (new_plugin.model, new_plugin) + ) + + +## ... source file abbreviated to get to escapejs examples ... + + + def render_close_frame(self, request, obj, extra_context=None): + try: + root = obj.parent.get_bound_plugin() if obj.parent else obj + except ObjectDoesNotExist: + root = obj + + plugins = [root] + list(root.get_descendants().order_by('path')) + + child_classes = self.get_child_classes( + slot=obj.placeholder.slot, + page=obj.page, + instance=obj, + ) + + parent_classes = self.get_parent_classes( + slot=obj.placeholder.slot, + page=obj.page, + instance=obj, + ) + + data = get_plugin_toolbar_info( + obj, + children=child_classes, + parents=parent_classes, + ) +~~ data['plugin_desc'] = escapejs(force_text(obj.get_short_description())) + + context = { + 'plugin': obj, + 'is_popup': True, + 'plugin_data': json.dumps(data), + 'plugin_structure': get_plugin_tree_as_json(request, plugins), + } + + if extra_context: + context.update(extra_context) + return render_to_response( + request, 'admin/cms/page/plugin/confirm_form.html', context + ) + + def save_model(self, request, obj, form, change): + pl_admin = obj.placeholder._get_attached_admin() + + if pl_admin: + operation_kwargs = { + 'request': request, + 'placeholder': obj.placeholder, + } + + if change: + + +## ... source file continues with no further escapejs examples... + +``` + diff --git a/content/pages/examples/django/django-utils-html-format-html-join.markdown b/content/pages/examples/django/django-utils-html-format-html-join.markdown new file mode 100644 index 000000000..755f93e3d --- /dev/null +++ b/content/pages/examples/django/django-utils-html-format-html-join.markdown @@ -0,0 +1,313 @@ +title: django.utils.html format_html_join Example Code +category: page +slug: django-utils-html-format-html-join-examples +sortorder: 500011465 +toc: False +sidebartitle: django.utils.html format_html_join +meta: Python example code for the format_html_join callable from the django.utils.html module of the Django project. + + +format_html_join is a callable within the django.utils.html module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / sekizai_processors.py**](https://github.com/jrief/django-angular/blob/master/djng/./sekizai_processors.py) + +```python +# sekizai_processors.py + +import warnings + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +~~from django.utils.html import format_html_join +from django.utils.safestring import mark_safe + +if 'sekizai' not in settings.INSTALLED_APPS: + msg = "Install django-sekizai when using these postprocessors" + raise ImproperlyConfigured(msg) + + +def module_list(context, data, namespace): + warnings.warn("This postprocessor is deprecated. Read on how to resolve AngularJS dependencies using `{% with_data \"ng-requires\" ... %}`") + modules = set(m.strip(' "\'') for m in data.split()) +~~ text = format_html_join(', ', '"{0}"', ((m,) for m in modules)) + return text + + +def module_config(context, data, namespace): + warnings.warn("This postprocessor is deprecated. Read on how to resolve AngularJS dependencies using `{% with_data \"ng-config\" ... %}`") + configs = [(mark_safe(c),) for c in data.split('\n') if c] +~~ text = format_html_join('', '.config({0})', configs) + return text + + + +## ... source file continues with no further format_html_join examples... + +``` + + +## Example 2 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / templatetags / filer_admin_tags.py**](https://github.com/divio/django-filer/blob/develop/filer/templatetags/filer_admin_tags.py) + +```python +# filer_admin_tags.py +from __future__ import absolute_import, unicode_literals + +from django.template import Library +~~from django.utils.html import format_html_join + +from ..admin.tools import admin_url_params, admin_url_params_encoded + + +register = Library() + +assignment_tag = getattr(register, 'assignment_tag', register.simple_tag) + + +def filer_actions(context): + context['action_index'] = context.get('action_index', -1) + 1 + return context + + +filer_actions = register.inclusion_tag( + "admin/filer/actions.html", takes_context=True)(filer_actions) + + +@register.simple_tag(takes_context=True) +def filer_admin_context_url_params(context, first_separator='?'): + return admin_url_params_encoded( + context['request'], first_separator=first_separator) + + +@register.simple_tag(takes_context=True) +def filer_admin_context_hidden_formfields(context): + request = context.get('request') +~~ return format_html_join( + '\n', + '', + admin_url_params(request).items(), + ) + + +@assignment_tag(takes_context=True) +def filer_has_permission(context, item, action): + permission_method_name = 'has_{action}_permission'.format(action=action) + permission_method = getattr(item, permission_method_name, None) + request = context.get('request') + + if not permission_method or not request: + return False + return permission_method(request) + + + +## ... source file continues with no further format_html_join examples... + +``` + + +## Example 3 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / utils.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/./utils.py) + +```python +# utils.py +import inspect +import warnings +from collections import OrderedDict +from functools import total_ordering +from itertools import chain + +from django.core.exceptions import FieldDoesNotExist +from django.db import models +~~from django.utils.html import format_html_join + + +class Sequence(list): + + def expand(self, columns): + ellipses = self.count("...") + if ellipses > 1: + raise ValueError("'...' must be used at most once in a sequence.") + elif ellipses == 0: + self.append("...") + + columns = list(columns) # take a copy and exhaust the generator + head = [] + tail = [] + target = head # start by adding things to the head + for name in self: + if name == "...": + target = tail + continue + target.append(name) + if name in columns: + columns.pop(columns.index(name)) + self[:] = chain(head, columns, tail) + + + +## ... source file abbreviated to get to format_html_join examples ... + + + if hasattr(field, "remote_field"): + rel = getattr(field, "remote_field", None) + model = getattr(rel, "model", model) + + return field + + def penultimate(self, context, quiet=True): + path, _, remainder = self.rpartition(self.SEPARATOR) + return A(path).resolve(context, quiet=quiet), remainder + + +A = Accessor # alias + + +class AttributeDict(OrderedDict): + + blacklist = ("th", "td", "_ordering", "thead", "tbody", "tfoot") + + def _iteritems(self): + for key, v in self.items(): + value = v() if callable(v) else v + if key not in self.blacklist and value is not None: + yield (key, value) + + def as_html(self): +~~ return format_html_join(" ", '{}="{}"', self._iteritems()) + + +def segment(sequence, aliases): + if not (sequence or aliases): + return + for alias, parts in aliases.items(): + variants = { + alias: OrderByTuple(parts), + OrderBy(alias).opposite: OrderByTuple(parts).opposite, + } + for valias, vparts in variants.items(): + if list(sequence[: len(vparts)]) == list(vparts): + tail_aliases = dict(aliases) + del tail_aliases[alias] + tail_sequence = sequence[len(vparts) :] + if tail_sequence: + for tail in segment(tail_sequence, tail_aliases): + yield tuple(chain([valias], tail)) + else: + continue + else: + yield tuple([valias]) + + + + +## ... source file continues with no further format_html_join examples... + +``` + + +## Example 4 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / messages.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/messages.py) + +```python +# messages.py +from django.contrib import messages +from django.core.exceptions import NON_FIELD_ERRORS +from django.template.loader import render_to_string +~~from django.utils.html import format_html, format_html_join + + +def render(message, buttons, detail=''): + return render_to_string('wagtailadmin/shared/messages.html', { + 'message': message, + 'buttons': buttons, + 'detail': detail, + }) + + +def debug(request, message, buttons=None, extra_tags=''): + return messages.debug(request, render(message, buttons), extra_tags=extra_tags) + + +def info(request, message, buttons=None, extra_tags=''): + return messages.info(request, render(message, buttons), extra_tags=extra_tags) + + +def success(request, message, buttons=None, extra_tags=''): + return messages.success(request, render(message, buttons), extra_tags=extra_tags) + + +def warning(request, message, buttons=None, extra_tags=''): + return messages.warning(request, render(message, buttons), extra_tags=extra_tags) + + +def error(request, message, buttons=None, extra_tags=''): + return messages.error(request, render(message, buttons), extra_tags=extra_tags) + + +def validation_error(request, message, form, buttons=None): + if not form.non_field_errors(): + detail = '' + else: + all_errors = [] + for field_name, errors in form.errors.items(): + if field_name == NON_FIELD_ERRORS: + prefix = '' + else: + try: + field_label = form[field_name].label + except KeyError: + field_label = field_name + prefix = "%s: " % field_label + + for error in errors: + all_errors.append(prefix + error) + +~~ errors_html = format_html_join('\n', '
  • {}
  • ', ((e,) for e in all_errors)) + detail = format_html("""
      {}
    """, errors_html) + + return messages.error(request, render(message, buttons, detail=detail)) + + +def button(url, text, new_window=False): + if url is None: + raise ValueError("Button URLs must not be None") + return url, text, new_window + + + +## ... source file continues with no further format_html_join examples... + +``` + diff --git a/content/pages/examples/django/django-utils-html-mark-safe.markdown b/content/pages/examples/django/django-utils-html-mark-safe.markdown new file mode 100644 index 000000000..bf8143c5d --- /dev/null +++ b/content/pages/examples/django/django-utils-html-mark-safe.markdown @@ -0,0 +1,321 @@ +title: django.utils.html mark_safe Example Code +category: page +slug: django-utils-html-mark-safe-examples +sortorder: 500011466 +toc: False +sidebartitle: django.utils.html mark_safe +meta: Python example code for the mark_safe callable from the django.utils.html module of the Django project. + + +mark_safe is a callable within the django.utils.html module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / renderers.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./renderers.py) + +```python +# renderers.py +import base64 +from collections import OrderedDict +from urllib import parse + +from django import forms +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.core.paginator import Page +from django.http.multipartparser import parse_header +from django.template import engines, loader +from django.urls import NoReverseMatch +~~from django.utils.html import mark_safe + +from rest_framework import VERSION, exceptions, serializers, status +from rest_framework.compat import ( + INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, coreapi, coreschema, + pygments_css, yaml +) +from rest_framework.exceptions import ParseError +from rest_framework.request import is_form_media_type, override_method +from rest_framework.settings import api_settings +from rest_framework.utils import encoders, json +from rest_framework.utils.breadcrumbs import get_breadcrumbs +from rest_framework.utils.field_mapping import ClassLookupDict + + +def zero_as_none(value): + return None if value == 0 else value + + +class BaseRenderer: + media_type = None + format = None + charset = 'utf-8' + render_style = 'text' + + + +## ... source file abbreviated to get to mark_safe examples ... + + + template = loader.get_template(self.template) + context = self.get_context(data, renderer_context['request']) + return template.render(context, request=renderer_context['request']) + else: + template = loader.get_template(self.error_template) + context = { + "data": data, + "request": renderer_context['request'], + "response": renderer_context['response'], + "debug": settings.DEBUG, + } + return template.render(context, request=renderer_context['request']) + + +class SchemaJSRenderer(BaseRenderer): + media_type = 'application/javascript' + format = 'javascript' + charset = 'utf-8' + template = 'rest_framework/schema.js' + + def render(self, data, accepted_media_type=None, renderer_context=None): + codec = coreapi.codecs.CoreJSONCodec() + schema = base64.b64encode(codec.encode(data)).decode('ascii') + + template = loader.get_template(self.template) +~~ context = {'schema': mark_safe(schema)} + request = renderer_context['request'] + return template.render(context, request=request) + + +class MultiPartRenderer(BaseRenderer): + media_type = 'multipart/form-data; boundary=BoUnDaRyStRiNg' + format = 'multipart' + charset = 'utf-8' + BOUNDARY = 'BoUnDaRyStRiNg' + + def render(self, data, accepted_media_type=None, renderer_context=None): + from django.test.client import encode_multipart + + if hasattr(data, 'items'): + for key, value in data.items(): + assert not isinstance(value, dict), ( + "Test data contained a dictionary value for key '%s', " + "but multipart uploads do not support nested data. " + "You may want to consider using format='json' in this " + "test case." % key + ) + return encode_multipart(self.BOUNDARY, data) + + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 2 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / manytomanycolumn.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/manytomanycolumn.py) + +```python +# manytomanycolumn.py +from django.db import models +from django.utils.encoding import force_str +~~from django.utils.html import conditional_escape, mark_safe + +from .base import Column, LinkTransform, library + + +@library.register +class ManyToManyColumn(Column): + + def __init__( + self, transform=None, filter=None, separator=", ", linkify_item=None, *args, **kwargs + ): + kwargs.setdefault("orderable", False) + super().__init__(*args, **kwargs) + + if transform is not None: + self.transform = transform + if filter is not None: + self.filter = filter + self.separator = separator + + link_kwargs = None + if callable(linkify_item): + link_kwargs = dict(url=linkify_item) + elif isinstance(linkify_item, (dict, tuple)): + link_kwargs = dict(reverse_args=linkify_item) + elif linkify_item is True: + link_kwargs = dict() + + if link_kwargs is not None: + self.linkify_item = LinkTransform(attrs=self.attrs.get("a", {}), **link_kwargs) + + def transform(self, obj): + return force_str(obj) + + def filter(self, qs): + return qs.all() + + def render(self, value): + if not value.exists(): + return self.default + + items = [] + for item in self.filter(value): + content = conditional_escape(self.transform(item)) + if hasattr(self, "linkify_item"): + content = self.linkify_item(content=content, record=item) + + items.append(content) + +~~ return mark_safe(conditional_escape(self.separator).join(items)) + + @classmethod + def from_field(cls, field, **kwargs): + if isinstance(field, models.ManyToManyField): + return cls(**kwargs) + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 3 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / users / forms.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/users/forms.py) + +```python +# forms.py +import warnings +from itertools import groupby +from operator import itemgetter + +import l18n + +from django import forms +from django.conf import settings +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group, Permission +from django.contrib.auth.password_validation import ( + password_validators_help_text_html, validate_password) +from django.db import transaction +from django.db.models.fields import BLANK_CHOICE_DASH +from django.template.loader import render_to_string +~~from django.utils.html import mark_safe +from django.utils.translation import gettext_lazy as _ + +from wagtail.admin.localization import get_available_admin_languages, get_available_admin_time_zones +from wagtail.admin.widgets import AdminPageChooser +from wagtail.core import hooks +from wagtail.core.models import ( + PAGE_PERMISSION_TYPE_CHOICES, PAGE_PERMISSION_TYPES, GroupPagePermission, Page, + UserPagePermissionsProxy) +from wagtail.users.models import UserProfile + +User = get_user_model() + +standard_fields = set(['email', 'first_name', 'last_name', 'is_superuser', 'groups']) +if hasattr(settings, 'WAGTAIL_USER_CUSTOM_FIELDS'): + custom_fields = set(settings.WAGTAIL_USER_CUSTOM_FIELDS) +else: + custom_fields = set() + + +class UsernameForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if User.USERNAME_FIELD == 'username': + field = self.fields['username'] + + +## ... source file abbreviated to get to mark_safe examples ... + + + } + + email = forms.EmailField(required=True, label=_('Email')) + first_name = forms.CharField(required=True, label=_('First Name')) + last_name = forms.CharField(required=True, label=_('Last Name')) + + password1 = forms.CharField( + label=_('Password'), required=False, + widget=forms.PasswordInput(attrs={'autocomplete': 'new-password'}), + help_text=_("Leave blank if not changing.")) + password2 = forms.CharField( + label=_("Password confirmation"), required=False, + widget=forms.PasswordInput(attrs={'autocomplete': 'new-password'}), + help_text=_("Enter the same password as above, for verification.")) + + is_superuser = forms.BooleanField( + label=_("Administrator"), required=False, + help_text=_('Administrators have full access to manage any object ' + 'or setting.')) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if self.password_enabled: + if self.password_required: +~~ self.fields['password1'].help_text = mark_safe(password_validators_help_text_html()) + self.fields['password1'].required = True + self.fields['password2'].required = True + else: + del self.fields['password1'] + del self.fields['password2'] + + def _clean_username(self): + username_field = User.USERNAME_FIELD + if username_field not in self.cleaned_data: + return + username = self.cleaned_data[username_field] + + users = User._default_manager.all() + if self.instance.pk is not None: + users = users.exclude(pk=self.instance.pk) + if users.filter(**{username_field: username}).exists(): + self.add_error(User.USERNAME_FIELD, forms.ValidationError( + self.error_messages['duplicate_username'], + code='duplicate_username', + )) + return username + + def clean_password2(self): + password1 = self.cleaned_data.get("password1") + + +## ... source file continues with no further mark_safe examples... + +``` + diff --git a/content/pages/examples/django/django-utils-html-smart-urlquote.markdown b/content/pages/examples/django/django-utils-html-smart-urlquote.markdown new file mode 100644 index 000000000..029f04c3c --- /dev/null +++ b/content/pages/examples/django/django-utils-html-smart-urlquote.markdown @@ -0,0 +1,124 @@ +title: django.utils.html smart_urlquote Example Code +category: page +slug: django-utils-html-smart-urlquote-examples +sortorder: 500011467 +toc: False +sidebartitle: django.utils.html smart_urlquote +meta: Python example code for the smart_urlquote callable from the django.utils.html module of the Django project. + + +smart_urlquote is a callable within the django.utils.html module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / templatetags / rest_framework.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/templatetags/rest_framework.py) + +```python +# rest_framework.py +import re +from collections import OrderedDict + +from django import template +from django.template import loader +from django.urls import NoReverseMatch, reverse +from django.utils.encoding import force_str, iri_to_uri +~~from django.utils.html import escape, format_html, smart_urlquote +from django.utils.safestring import SafeData, mark_safe + +from rest_framework.compat import apply_markdown, pygments_highlight +from rest_framework.renderers import HTMLFormRenderer +from rest_framework.utils.urls import replace_query_param + +register = template.Library() + +class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])') + + +@register.tag(name='code') +def highlight_code(parser, token): + code = token.split_contents()[-1] + nodelist = parser.parse(('endcode',)) + parser.delete_first_token() + return CodeNode(code, nodelist) + + +class CodeNode(template.Node): + style = 'emacs' + + def __init__(self, lang, code): + self.lang = lang + + +## ... source file abbreviated to get to smart_urlquote examples ... + + + return new_links + + return links + + +@register.filter +def add_nested_class(value): + if isinstance(value, dict): + return 'class=nested' + if isinstance(value, list) and any([isinstance(item, (list, dict)) for item in value]): + return 'class=nested' + return '' + + +TRAILING_PUNCTUATION = ['.', ',', ':', ';', '.)', '"', "']", "'}", "'"] +WRAPPING_PUNCTUATION = [('(', ')'), ('<', '>'), ('[', ']'), ('<', '>'), + ('"', '"'), ("'", "'")] +word_split_re = re.compile(r'(\s+)') +simple_url_re = re.compile(r'^https?://\[?\w', re.IGNORECASE) +simple_url_2_re = re.compile(r'^www\.|^(?!http)\w[^@]+\.(com|edu|gov|int|mil|net|org)$', re.IGNORECASE) +simple_email_re = re.compile(r'^\S+@\S+\.\S+$') + + +def smart_urlquote_wrapper(matched_url): + try: +~~ return smart_urlquote(matched_url) + except ValueError: + return None + + +@register.filter(needs_autoescape=True) +def urlize_quoted_links(text, trim_url_limit=None, nofollow=True, autoescape=True): + def trim_url(x, limit=trim_url_limit): + return limit is not None and (len(x) > limit and ('%s...' % x[:max(0, limit - 3)])) or x + + safe_input = isinstance(text, SafeData) + + def conditional_escape(text): + return escape(text) if autoescape and not safe_input else text + + words = word_split_re.split(force_str(text)) + for i, word in enumerate(words): + if '.' in word or '@' in word or ':' in word: + lead, middle, trail = '', word, '' + for punctuation in TRAILING_PUNCTUATION: + if middle.endswith(punctuation): + middle = middle[:-len(punctuation)] + trail = punctuation + trail + for opening, closing in WRAPPING_PUNCTUATION: + if middle.startswith(opening): + + +## ... source file continues with no further smart_urlquote examples... + +``` + diff --git a/content/pages/examples/django/django-utils-html-strip-tags.markdown b/content/pages/examples/django/django-utils-html-strip-tags.markdown new file mode 100644 index 000000000..bcc36572c --- /dev/null +++ b/content/pages/examples/django/django-utils-html-strip-tags.markdown @@ -0,0 +1,213 @@ +title: django.utils.html strip_tags Example Code +category: page +slug: django-utils-html-strip-tags-examples +sortorder: 500011468 +toc: False +sidebartitle: django.utils.html strip_tags +meta: Python example code for the strip_tags callable from the django.utils.html module of the Django project. + + +strip_tags is a callable within the django.utils.html module of the Django project. + + +## Example 1 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / utils / highlighting.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/utils/highlighting.py) + +```python +# highlighting.py +~~from django.utils.html import strip_tags + + +class Highlighter(object): + css_class = "highlighted" + html_tag = "span" + max_length = 200 + text_block = "" + + def __init__(self, query, **kwargs): + self.query = query + + if "max_length" in kwargs: + self.max_length = int(kwargs["max_length"]) + + if "html_tag" in kwargs: + self.html_tag = kwargs["html_tag"] + + if "css_class" in kwargs: + self.css_class = kwargs["css_class"] + + self.query_words = set( + [word.lower() for word in self.query.split() if not word.startswith("-")] + ) + + def highlight(self, text_block): +~~ self.text_block = strip_tags(text_block) + highlight_locations = self.find_highlightable_words() + start_offset, end_offset = self.find_window(highlight_locations) + return self.render_html(highlight_locations, start_offset, end_offset) + + def find_highlightable_words(self): + word_positions = {} + + end_offset = len(self.text_block) + lower_text_block = self.text_block.lower() + + for word in self.query_words: + if word not in word_positions: + word_positions[word] = [] + + start_offset = 0 + + while start_offset < end_offset: + next_offset = lower_text_block.find(word, start_offset, end_offset) + + if next_offset == -1: + break + + word_positions[word].append(next_offset) + start_offset = next_offset + len(word) + + +## ... source file continues with no further strip_tags examples... + +``` + + +## Example 2 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / templatecolumn.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/templatecolumn.py) + +```python +# templatecolumn.py +from django.template import Context, Template +from django.template.loader import get_template +~~from django.utils.html import strip_tags + +from .base import Column, library + + +@library.register +class TemplateColumn(Column): + + empty_values = () + + def __init__(self, template_code=None, template_name=None, extra_context=None, **extra): + super().__init__(**extra) + self.template_code = template_code + self.template_name = template_name + self.extra_context = extra_context or {} + + if not self.template_code and not self.template_name: + raise ValueError("A template must be provided") + + def render(self, record, table, value, bound_column, **kwargs): + context = getattr(table, "context", Context()) + context.update(self.extra_context) + context.update( + { + "default": bound_column.default, + "column": bound_column, + "record": record, + "value": value, + "row_counter": kwargs["bound_row"].row_counter, + } + ) + + try: + if self.template_code: + return Template(self.template_code).render(context) + else: + return get_template(self.template_name).render(context.flatten()) + finally: + context.pop() + + def value(self, **kwargs): + html = super().value(**kwargs) +~~ return strip_tags(html) if isinstance(html, str) else html + + + +## ... source file continues with no further strip_tags examples... + +``` + + +## Example 3 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / bootstrap3_renderers.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./bootstrap3_renderers.py) + +```python +# bootstrap3_renderers.py +import re + +from django.forms import ( + CheckboxInput, ClearableFileInput, RadioSelect, CheckboxSelectMultiple +) +from django.forms.widgets import SelectDateWidget +~~from django.utils.html import strip_tags + +import bootstrap3.renderers +from bootstrap3.forms import render_label + + +RE_INPUT_TAG = re.compile(r'()()') + + +class FiftyThreeFieldRenderer(bootstrap3.renderers.FieldRenderer): + def post_widget_render(self, html): + if isinstance(self.widget, RadioSelect): + html = self.list_to_class(html, 'radio') + html = self.invert_radio_input(html) + elif isinstance(self.widget, CheckboxSelectMultiple): + html = self.list_to_class(html, 'checkbox') + elif isinstance(self.widget, SelectDateWidget): + html = self.fix_date_select_input(html) + elif isinstance(self.widget, ClearableFileInput): + html = self.fix_clearable_file_input(html) + elif isinstance(self.widget, CheckboxInput): + html = self.put_inside_label(html) + return html + + def put_inside_label(self, html): + return html + render_label( + content=self.field.label, label_for=self.field.id_for_label, +~~ label_title=strip_tags(self.field_help)) + + def invert_radio_input(self, html): + return re.sub(RE_INPUT_TAG, r'\2\1', html) + + + +## ... source file continues with no further strip_tags examples... + +``` + diff --git a/content/pages/examples/django/django-utils-http-base36-to-int.markdown b/content/pages/examples/django/django-utils-http-base36-to-int.markdown new file mode 100644 index 000000000..b5f2eb32c --- /dev/null +++ b/content/pages/examples/django/django-utils-http-base36-to-int.markdown @@ -0,0 +1,105 @@ +title: django.utils.http base36_to_int Example Code +category: page +slug: django-utils-http-base36-to-int-examples +sortorder: 500011469 +toc: False +sidebartitle: django.utils.http base36_to_int +meta: Python example code for the base36_to_int callable from the django.utils.http module of the Django project. + + +base36_to_int is a callable within the django.utils.http module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / tests.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./tests.py) + +```python +# tests.py +from __future__ import unicode_literals + +import json +import requests +from datetime import date, datetime + +import django +from django.core.files.base import ContentFile +from django.db import models +from django.test import RequestFactory, TestCase +~~from django.utils.http import base36_to_int, int_to_base36 +from django.views import csrf + +from . import utils + + +try: + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch # noqa + + +class MockedResponse(object): + def __init__(self, status_code, content, headers=None): + if headers is None: + headers = {} + + self.status_code = status_code + self.content = content.encode('utf8') + self.headers = headers + + def json(self): + return json.loads(self.text) + + def raise_for_status(self): + + +## ... source file abbreviated to get to base36_to_int examples ... + + + instance = SomeBinaryModel(bb=b'some binary data') + + serialized = utils.serialize_instance(instance) + deserialized = utils.deserialize_instance(SomeBinaryModel, serialized) + + self.assertEqual(serialized['bb'], 'c29tZSBiaW5hcnkgZGF0YQ==') + self.assertEqual(serialized['bb_empty'], '') + self.assertEqual(deserialized.bb, b'some binary data') + self.assertEqual(deserialized.bb_empty, b'') + + def test_build_absolute_uri(self): + self.assertEqual( + utils.build_absolute_uri(None, '/foo'), + 'http://example.com/foo') + self.assertEqual( + utils.build_absolute_uri(None, '/foo', protocol='ftp'), + 'ftp://example.com/foo') + self.assertEqual( + utils.build_absolute_uri(None, 'http://foo.com/bar'), + 'http://foo.com/bar') + + def test_int_to_base36(self): + n = 55798679658823689999 + b36 = 'brxk553wvxbf3' + assert int_to_base36(n) == b36 +~~ assert base36_to_int(b36) == n + + def test_templatetag_with_csrf_failure(self): + request = self.factory.get('/tests/test_403_csrf.html') + response = csrf.csrf_failure( + request, + template_name='tests/test_403_csrf.html' + ) + self.assertEqual(response.status_code, 403) + + + +## ... source file continues with no further base36_to_int examples... + +``` + diff --git a/content/pages/examples/django/django-utils-http-http-date.markdown b/content/pages/examples/django/django-utils-http-http-date.markdown new file mode 100644 index 000000000..8b0002b19 --- /dev/null +++ b/content/pages/examples/django/django-utils-http-http-date.markdown @@ -0,0 +1,154 @@ +title: django.utils.http http_date Example Code +category: page +slug: django-utils-http-http-date-examples +sortorder: 500011470 +toc: False +sidebartitle: django.utils.http http_date +meta: Python example code for the http_date callable from the django.utils.http module of the Django project. + + +http_date is a callable within the django.utils.http module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / core / http.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/core/http.py) + +```python +# http.py +import mimetypes +import os +from datetime import datetime + +from django.http import HttpResponse +from django.utils import dateformat +from django.utils.encoding import filepath_to_uri +~~from django.utils.http import http_date +from wiki.conf import settings + + +def django_sendfile_response(request, filepath): + from sendfile import sendfile + + return sendfile(request, filepath) + + +def send_file(request, filepath, last_modified=None, filename=None): + fullpath = filepath + statobj = os.stat(fullpath) + if filename: + mimetype, encoding = mimetypes.guess_type(filename) + else: + mimetype, encoding = mimetypes.guess_type(fullpath) + + mimetype = mimetype or "application/octet-stream" + + if settings.USE_SENDFILE: + response = django_sendfile_response(request, filepath) + else: + response = HttpResponse(open(fullpath, "rb").read(), content_type=mimetype) + + if not last_modified: +~~ response["Last-Modified"] = http_date(statobj.st_mtime) + else: + if isinstance(last_modified, datetime): + last_modified = float(dateformat.format(last_modified, "U")) +~~ response["Last-Modified"] = http_date(epoch_seconds=last_modified) + + response["Content-Length"] = statobj.st_size + + if encoding: + response["Content-Encoding"] = encoding + + if filename: + filename_escaped = filepath_to_uri(filename) + if "pdf" in mimetype.lower(): + response["Content-Disposition"] = "inline; filename=%s" % filename_escaped + else: + response["Content-Disposition"] = ( + "attachment; filename=%s" % filename_escaped + ) + + return response + + + +## ... source file continues with no further http_date examples... + +``` + + +## Example 2 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / utils / sendfile_streaming_backend.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/utils/sendfile_streaming_backend.py) + +```python +# sendfile_streaming_backend.py + +import os +import re +import stat +from email.utils import mktime_tz, parsedate_tz +from wsgiref.util import FileWrapper + +from django.http import HttpResponseNotModified, StreamingHttpResponse +~~from django.utils.http import http_date + + +def sendfile(request, filename, **kwargs): + statobj = os.stat(filename) + + if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'), + statobj[stat.ST_MTIME], statobj[stat.ST_SIZE]): + return HttpResponseNotModified() + + response = StreamingHttpResponse(FileWrapper(open(filename, 'rb'))) + +~~ response["Last-Modified"] = http_date(statobj[stat.ST_MTIME]) + return response + + +def was_modified_since(header=None, mtime=0, size=0): + try: + if header is None: + raise ValueError + matches = re.match(r"^([^;]+)(; length=([0-9]+))?$", header, + re.IGNORECASE) + header_date = parsedate_tz(matches.group(1)) + if header_date is None: + raise ValueError + header_mtime = mktime_tz(header_date) + header_len = matches.group(3) + if header_len and int(header_len) != size: + raise ValueError + if mtime > header_mtime: + raise ValueError + except (AttributeError, ValueError, OverflowError): + return True + return False + + + +## ... source file continues with no further http_date examples... + +``` + diff --git a/content/pages/examples/django/django-utils-http-int-to-base36.markdown b/content/pages/examples/django/django-utils-http-int-to-base36.markdown new file mode 100644 index 000000000..455d6fb47 --- /dev/null +++ b/content/pages/examples/django/django-utils-http-int-to-base36.markdown @@ -0,0 +1,106 @@ +title: django.utils.http int_to_base36 Example Code +category: page +slug: django-utils-http-int-to-base36-examples +sortorder: 500011471 +toc: False +sidebartitle: django.utils.http int_to_base36 +meta: Python example code for the int_to_base36 callable from the django.utils.http module of the Django project. + + +int_to_base36 is a callable within the django.utils.http module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / tests.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./tests.py) + +```python +# tests.py +from __future__ import unicode_literals + +import json +import requests +from datetime import date, datetime + +import django +from django.core.files.base import ContentFile +from django.db import models +from django.test import RequestFactory, TestCase +~~from django.utils.http import base36_to_int, int_to_base36 +from django.views import csrf + +from . import utils + + +try: + from unittest.mock import Mock, patch +except ImportError: + from mock import Mock, patch # noqa + + +class MockedResponse(object): + def __init__(self, status_code, content, headers=None): + if headers is None: + headers = {} + + self.status_code = status_code + self.content = content.encode('utf8') + self.headers = headers + + def json(self): + return json.loads(self.text) + + def raise_for_status(self): + + +## ... source file abbreviated to get to int_to_base36 examples ... + + + + instance = SomeBinaryModel(bb=b'some binary data') + + serialized = utils.serialize_instance(instance) + deserialized = utils.deserialize_instance(SomeBinaryModel, serialized) + + self.assertEqual(serialized['bb'], 'c29tZSBiaW5hcnkgZGF0YQ==') + self.assertEqual(serialized['bb_empty'], '') + self.assertEqual(deserialized.bb, b'some binary data') + self.assertEqual(deserialized.bb_empty, b'') + + def test_build_absolute_uri(self): + self.assertEqual( + utils.build_absolute_uri(None, '/foo'), + 'http://example.com/foo') + self.assertEqual( + utils.build_absolute_uri(None, '/foo', protocol='ftp'), + 'ftp://example.com/foo') + self.assertEqual( + utils.build_absolute_uri(None, 'http://foo.com/bar'), + 'http://foo.com/bar') + + def test_int_to_base36(self): + n = 55798679658823689999 + b36 = 'brxk553wvxbf3' +~~ assert int_to_base36(n) == b36 + assert base36_to_int(b36) == n + + def test_templatetag_with_csrf_failure(self): + request = self.factory.get('/tests/test_403_csrf.html') + response = csrf.csrf_failure( + request, + template_name='tests/test_403_csrf.html' + ) + self.assertEqual(response.status_code, 403) + + + +## ... source file continues with no further int_to_base36 examples... + +``` + diff --git a/content/pages/examples/django/django-utils-http-is-safe-url.markdown b/content/pages/examples/django/django-utils-http-is-safe-url.markdown new file mode 100644 index 000000000..5f21e019a --- /dev/null +++ b/content/pages/examples/django/django-utils-http-is-safe-url.markdown @@ -0,0 +1,106 @@ +title: django.utils.http is_safe_url Example Code +category: page +slug: django-utils-http-is-safe-url-examples +sortorder: 500011472 +toc: False +sidebartitle: django.utils.http is_safe_url +meta: Python example code for the is_safe_url callable from the django.utils.http module of the Django project. + + +is_safe_url is a callable within the django.utils.http module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / views.py**](https://github.com/divio/django-cms/blob/develop/cms/./views.py) + +```python +# views.py + +from django.conf import settings +from django.contrib.auth import REDIRECT_FIELD_NAME, login as auth_login +from django.contrib.auth.views import redirect_to_login +from django.http import HttpResponse, HttpResponseRedirect +from django.urls import reverse +from django.utils.cache import patch_cache_control +~~from django.utils.http import is_safe_url, urlquote +from django.utils.timezone import now +from django.utils.translation import get_language_from_request +from django.views.decorators.http import require_POST + +from cms.cache.page import get_page_cache +from cms.exceptions import LanguageError +from cms.forms.login import CMSToolbarLoginForm +from cms.models.pagemodel import TreeNode +from cms.page_rendering import _handle_no_page, render_page, render_object_structure, _render_welcome_page +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils import get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import (get_fallback_languages, get_public_languages, + get_redirect_on_fallback, get_language_list, + get_default_language_for_site, + is_language_prefix_patterns_used) +from cms.utils.page import get_page_from_request +from cms.utils.page_permissions import user_can_change_page + + +def _clean_redirect_url(redirect_url, language): + if (redirect_url and is_language_prefix_patterns_used() and redirect_url[0] == "/" + and not redirect_url.startswith('/%s/' % language)): + redirect_url = "/%s/%s" % (language, redirect_url.lstrip("/")) + + +## ... source file abbreviated to get to is_safe_url examples ... + + + redirect_url = _clean_redirect_url(redirect_url, request_language) + + if redirect_url: + if request.user.is_staff and toolbar.edit_mode_active: + toolbar.redirect_url = redirect_url + elif redirect_url not in own_urls: + return HttpResponseRedirect(redirect_url) + + if page.login_required and not request.user.is_authenticated: + return redirect_to_login(urlquote(request.get_full_path()), settings.LOGIN_URL) + + if hasattr(request, 'toolbar'): + request.toolbar.set_object(page) + + structure_requested = get_cms_setting('CMS_TOOLBAR_URL__BUILD') in request.GET + + if user_can_change_page(request.user, page) and structure_requested: + return render_object_structure(request, page) + return render_page(request, page, current_language=request_language, slug=slug) + + +@require_POST +def login(request): + redirect_to = request.GET.get(REDIRECT_FIELD_NAME) + +~~ if not is_safe_url(url=redirect_to, allowed_hosts=request.get_host()): + redirect_to = reverse("pages-root") + + if request.user.is_authenticated: + return HttpResponseRedirect(redirect_to) + + form = CMSToolbarLoginForm(request=request, data=request.POST) + + if form.is_valid(): + auth_login(request, form.user_cache) + else: + redirect_to += u'?cms_toolbar_login_error=1' + return HttpResponseRedirect(redirect_to) + + + +## ... source file continues with no further is_safe_url examples... + +``` + diff --git a/content/pages/examples/django/django-utils-http-unquote.markdown b/content/pages/examples/django/django-utils-http-unquote.markdown new file mode 100644 index 000000000..e493f3868 --- /dev/null +++ b/content/pages/examples/django/django-utils-http-unquote.markdown @@ -0,0 +1,68 @@ +title: django.utils.http unquote Example Code +category: page +slug: django-utils-http-unquote-examples +sortorder: 500011473 +toc: False +sidebartitle: django.utils.http unquote +meta: Python example code for the unquote callable from the django.utils.http module of the Django project. + + +unquote is a callable within the django.utils.http module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / middleware.py**](https://github.com/jrief/django-angular/blob/master/djng/./middleware.py) + +```python +# middleware.py +from django import http +from django.urls import reverse +~~from django.utils.http import unquote +try: + from django.utils.deprecation import MiddlewareMixin +except ImportError: + MiddlewareMixin = object + + +class AngularUrlMiddleware(MiddlewareMixin): + ANGULAR_REVERSE = '/angular/reverse/' + + def process_request(self, request): + if request.path == self.ANGULAR_REVERSE: + url_name = request.GET.get('djng_url_name') + url_args = request.GET.getlist('djng_url_args', []) + url_kwargs = {} + + url_args = filter(lambda x: x, url_args) + + for param in request.GET: + if param.startswith('djng_url_kwarg_'): + if request.GET[param]: + url_kwargs[param[15:]] = request.GET[param] # [15:] to remove 'djng_url_kwarg' prefix + +~~ url = unquote(reverse(url_name, args=url_args, kwargs=url_kwargs)) + assert not url.startswith(self.ANGULAR_REVERSE), "Prevent recursive requests" + + request.path = request.path_info = url + request.environ['PATH_INFO'] = url + query = request.GET.copy() + for key in request.GET: + if key.startswith('djng_url'): + query.pop(key, None) + request.environ['QUERY_STRING'] = query.urlencode() + + request.GET = http.QueryDict(request.environ['QUERY_STRING']) + + + +## ... source file continues with no further unquote examples... + +``` + diff --git a/content/pages/examples/django/django-utils-http-url-has-allowed-host-and-scheme.markdown b/content/pages/examples/django/django-utils-http-url-has-allowed-host-and-scheme.markdown new file mode 100644 index 000000000..73992bedc --- /dev/null +++ b/content/pages/examples/django/django-utils-http-url-has-allowed-host-and-scheme.markdown @@ -0,0 +1,125 @@ +title: django.utils.http url_has_allowed_host_and_scheme Example Code +category: page +slug: django-utils-http-url-has-allowed-host-and-scheme-examples +sortorder: 500011474 +toc: False +sidebartitle: django.utils.http url_has_allowed_host_and_scheme +meta: Python example code for the url_has_allowed_host_and_scheme callable from the django.utils.http module of the Django project. + + +url_has_allowed_host_and_scheme is a callable within the django.utils.http module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / adapter.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/adapter.py) + +```python +# adapter.py +from __future__ import unicode_literals + +import hashlib +import json +import time +import warnings + +from django import forms +from django.conf import settings +from django.contrib import messages +from django.contrib.auth import ( + authenticate, + get_backends, + login as django_login, + logout as django_logout, +) +from django.contrib.auth.models import AbstractUser +from django.contrib.auth.password_validation import validate_password +from django.contrib.sites.shortcuts import get_current_site +from django.core.cache import cache +from django.core.mail import EmailMessage, EmailMultiAlternatives +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import resolve_url +from django.template import TemplateDoesNotExist +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils import timezone +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +from ..utils import ( + build_absolute_uri, + email_address_exists, + generate_unique_username, + get_user_model, + + +## ... source file abbreviated to get to url_has_allowed_host_and_scheme examples ... + + + backend_path = '.'.join([backend.__module__, + backend.__class__.__name__]) + user.backend = backend_path + django_login(request, user) + + def logout(self, request): + django_logout(request) + + def confirm_email(self, request, email_address): + email_address.verified = True + email_address.set_as_primary(conditional=True) + email_address.save() + + def set_password(self, user, password): + user.set_password(password) + user.save() + + def get_user_search_fields(self): + user = get_user_model()() + return filter(lambda a: a and hasattr(user, a), + [app_settings.USER_MODEL_USERNAME_FIELD, + 'first_name', 'last_name', 'email']) + + def is_safe_url(self, url): + try: +~~ from django.utils.http import url_has_allowed_host_and_scheme + except ImportError: + from django.utils.http import \ + is_safe_url as url_has_allowed_host_and_scheme + +~~ return url_has_allowed_host_and_scheme(url, allowed_hosts=None) + + def get_email_confirmation_url(self, request, emailconfirmation): + url = reverse( + "account_confirm_email", + args=[emailconfirmation.key]) + ret = build_absolute_uri( + request, + url) + return ret + + def send_confirmation_mail(self, request, emailconfirmation, signup): + current_site = get_current_site(request) + activate_url = self.get_email_confirmation_url( + request, + emailconfirmation) + ctx = { + "user": emailconfirmation.email_address.user, + "activate_url": activate_url, + "current_site": current_site, + "key": emailconfirmation.key, + } + if signup: + email_template = 'account/email/email_confirmation_signup' + else: + + +## ... source file continues with no further url_has_allowed_host_and_scheme examples... + +``` + diff --git a/content/pages/examples/django/django-utils-http-urlencode.markdown b/content/pages/examples/django/django-utils-http-urlencode.markdown new file mode 100644 index 000000000..d837e19bc --- /dev/null +++ b/content/pages/examples/django/django-utils-http-urlencode.markdown @@ -0,0 +1,733 @@ +title: django.utils.http urlencode Example Code +category: page +slug: django-utils-http-urlencode-examples +sortorder: 500011475 +toc: False +sidebartitle: django.utils.http urlencode +meta: Python example code for the urlencode callable from the django.utils.http module of the Django project. + + +urlencode is a callable within the django.utils.http module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / utils.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/utils.py) + +```python +# utils.py +import unicodedata +from collections import OrderedDict +from datetime import timedelta + +from django.conf import settings +from django.contrib import messages +from django.contrib.auth import update_session_auth_hash +from django.core.exceptions import FieldDoesNotExist, ValidationError +from django.db import models +from django.db.models import Q +from django.http import HttpResponseRedirect +from django.utils.encoding import force_str +~~from django.utils.http import base36_to_int, int_to_base36, urlencode +from django.utils.timezone import now + +from ..exceptions import ImmediateHttpResponse +from ..utils import ( + get_request_param, + get_user_model, + import_callable, + valid_email_or_none, +) +from . import app_settings, signals +from .adapter import get_adapter +from .app_settings import EmailVerificationMethod + + +def _unicode_ci_compare(s1, s2): + norm_s1 = unicodedata.normalize('NFKC', s1).casefold() + norm_s2 = unicodedata.normalize('NFKC', s2).casefold() + return norm_s1 == norm_s2 + + +def get_next_redirect_url(request, redirect_field_name="next"): + redirect_to = get_request_param(request, redirect_field_name) + if not get_adapter(request).is_safe_url(redirect_to): + redirect_to = None + + +## ... source file abbreviated to get to urlencode examples ... + + + from .models import EmailAddress + User = get_user_model() + mails = EmailAddress.objects.filter(email__iexact=email) + if is_active is not None: + mails = mails.filter(user__is_active=is_active) + users = [] + for e in mails.prefetch_related('user'): + if _unicode_ci_compare(e.email, email): + users.append(e.user) + if app_settings.USER_MODEL_EMAIL_FIELD: + q_dict = {app_settings.USER_MODEL_EMAIL_FIELD + '__iexact': email} + user_qs = User.objects.filter(**q_dict) + if is_active is not None: + user_qs = user_qs.filter(is_active=is_active) + for user in user_qs.iterator(): + user_email = getattr(user, app_settings.USER_MODEL_EMAIL_FIELD) + if _unicode_ci_compare(user_email, email): + users.append(user) + return list(set(users)) + + +def passthrough_next_redirect_url(request, url, redirect_field_name): + assert url.find("?") < 0 # TODO: Handle this case properly + next_url = get_next_redirect_url(request, redirect_field_name) + if next_url: +~~ url = url + '?' + urlencode({redirect_field_name: next_url}) + return url + + +def user_pk_to_url_str(user): + User = get_user_model() + if issubclass(type(User._meta.pk), models.UUIDField): + if isinstance(user.pk, str): + return user.pk + return user.pk.hex + + ret = user.pk + if isinstance(ret, int): + ret = int_to_base36(user.pk) + return str(ret) + + +def url_str_to_user_pk(s): + User = get_user_model() + if getattr(User._meta.pk, 'remote_field', None): + pk_field = User._meta.pk.remote_field.to._meta.pk + else: + pk_field = User._meta.pk + if issubclass(type(pk_field), models.UUIDField): + return pk_field.to_python(s) + + +## ... source file continues with no further urlencode examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / templatetags / cms_tags.py**](https://github.com/divio/django-cms/blob/develop/cms/templatetags/cms_tags.py) + +```python +# cms_tags.py +from collections import namedtuple, OrderedDict +from copy import copy +from datetime import datetime + +from django import template +from django.conf import settings +from django.contrib.sites.models import Site +from django.core.mail import mail_managers +from django.db.models import Model +from django.middleware.common import BrokenLinkEmailsMiddleware +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.encoding import force_text, smart_text +from django.utils.html import escape +~~from django.utils.http import urlencode +from django.utils.translation import ( + get_language, + override as force_language, + ugettext_lazy as _, +) + +from six import string_types, integer_types + +from classytags.arguments import (Argument, MultiValueArgument, + MultiKeywordArgument) +from classytags.core import Options, Tag +from classytags.helpers import InclusionTag, AsTag +from classytags.parser import Parser +from classytags.utils import flatten_context +from classytags.values import ListValue, StringValue + +from cms.cache.page import get_page_url_cache, set_page_url_cache +from cms.exceptions import PlaceholderNotFound +from cms.models import Page, Placeholder as PlaceholderModel, CMSPlugin, StaticPlaceholder +from cms.plugin_pool import plugin_pool +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils import get_current_site, get_language_from_request, get_site_id +from cms.utils.compat.dj import get_middleware +from cms.utils.moderator import use_draft + + +## ... source file abbreviated to get to urlencode examples ... + + + else: + url_base = method + else: + if not editmode: + view_url = 'admin:%s_%s_add' % ( + opts.app_label, opts.model_name) + url_base = reverse(view_url) + elif not edit_fields: + if not view_url: + view_url = 'admin:%s_%s_change' % ( + opts.app_label, opts.model_name) + if isinstance(instance, Page): + url_base = reverse(view_url, args=(instance.pk, language)) + else: + url_base = reverse(view_url, args=(instance.pk,)) + else: + if not view_url: + view_url = 'admin:%s_%s_edit_field' % ( + opts.app_label, opts.model_name) + if view_url.endswith('_changelist'): + url_base = reverse(view_url) + else: + url_base = reverse(view_url, args=(instance.pk, language)) + querystring['edit_fields'] = ",".join(context['edit_fields']) + if editmode: +~~ extra_context['edit_url'] = "%s?%s" % (url_base, urlencode(querystring)) + else: + extra_context['edit_url'] = "%s" % url_base + extra_context['refresh_page'] = True + if getattr(context['request'], 'current_page', None): + extra_context['redirect_on_close'] = context['request'].current_page.get_absolute_url(language) + else: + extra_context['redirect_on_close'] = '' + return extra_context + + def _get_content(self, context, instance, attribute, language, filters): + extra_context = copy(context) + attr_value = None + if hasattr(instance, 'lazy_translation_getter'): + attr_value = instance.lazy_translation_getter(attribute, '') + if not attr_value: + attr_value = getattr(instance, attribute, '') + extra_context['content'] = attr_value + if callable(extra_context['content']): + if isinstance(instance, Page): + extra_context['content'] = extra_context['content'](language) + else: + extra_context['content'] = extra_context['content'](context['request']) + if filters: + expression = self.parser.compile_filter("content|%s" % (filters)) + + +## ... source file continues with no further urlencode examples... + +``` + + +## Example 3 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / tools.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/tools.py) + +```python +# tools.py +from __future__ import absolute_import, unicode_literals + +from django.contrib.admin.options import IS_POPUP_VAR +from django.core.exceptions import PermissionDenied +~~from django.utils.http import urlencode + + +ALLOWED_PICK_TYPES = ('folder', 'file') + + +def check_files_edit_permissions(request, files): + for f in files: + if not f.has_edit_permission(request): + raise PermissionDenied + + +def check_folder_edit_permissions(request, folders): + for f in folders: + if not f.has_edit_permission(request): + raise PermissionDenied + check_files_edit_permissions(request, f.files) + check_folder_edit_permissions(request, f.children.all()) + + +def check_files_read_permissions(request, files): + for f in files: + if not f.has_read_permission(request): + raise PermissionDenied + + + +## ... source file abbreviated to get to urlencode examples ... + + + IS_POPUP_VAR in request.GET + or 'pop' in request.GET + or IS_POPUP_VAR in request.POST + or 'pop' in request.POST + ) + + +def popup_pick_type(request): + pick_type = request.GET.get('_pick', request.POST.get('_pick')) + if pick_type in ALLOWED_PICK_TYPES: + return pick_type + return None + + +def admin_url_params(request, params=None): + params = params or {} + if popup_status(request): + params[IS_POPUP_VAR] = '1' + pick_type = popup_pick_type(request) + if pick_type: + params['_pick'] = pick_type + return params + + +def admin_url_params_encoded(request, first_separator='?', params=None): +~~ params = urlencode( + sorted(admin_url_params(request, params=params).items()) + ) + if not params: + return '' + return '{0}{1}'.format(first_separator, params) + + +class AdminContext(dict): + def __init__(self, request): + super(AdminContext, self).__init__() + self.update(admin_url_params(request)) + + def __missing__(self, key): + if key == 'popup': + return self.get(IS_POPUP_VAR, False) == '1' + elif key == 'pick': + return self.get('_pick', '') + elif key.startswith('pick_'): + return self.get('_pick', '') == key.split('pick_')[1] + + def __getattr__(self, name): + if name in ('popup', 'pick') or name.startswith('pick_'): + return self.get(name) + raise AttributeError + + +## ... source file continues with no further urlencode examples... + +``` + + +## Example 4 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / widgets.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./widgets.py) + +```python +# widgets.py +from collections.abc import Iterable +from copy import deepcopy +from itertools import chain +from re import search, sub + +from django import forms +from django.db.models.fields import BLANK_CHOICE_DASH +from django.forms.utils import flatatt +from django.utils.datastructures import MultiValueDict +from django.utils.encoding import force_str +~~from django.utils.http import urlencode +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _ + + +class LinkWidget(forms.Widget): + def __init__(self, attrs=None, choices=()): + super().__init__(attrs) + + self.choices = choices + + def value_from_datadict(self, data, files, name): + value = super().value_from_datadict(data, files, name) + self.data = data + return value + + def render(self, name, value, attrs=None, choices=(), renderer=None): + if not hasattr(self, 'data'): + self.data = {} + if value is None: + value = '' + final_attrs = self.build_attrs(self.attrs, extra_attrs=attrs) + output = ['' % flatatt(final_attrs)] + options = self.render_options(choices, [value], name) + if options: + + +## ... source file abbreviated to get to urlencode examples ... + + + def render_options(self, choices, selected_choices, name): + selected_choices = set(force_str(v) for v in selected_choices) + output = [] + for option_value, option_label in chain(self.choices, choices): + if isinstance(option_label, (list, tuple)): + for option in option_label: + output.append( + self.render_option(name, selected_choices, *option)) + else: + output.append( + self.render_option(name, selected_choices, + option_value, option_label)) + return '\n'.join(output) + + def render_option(self, name, selected_choices, + option_value, option_label): + option_value = force_str(option_value) + if option_label == BLANK_CHOICE_DASH[0][1]: + option_label = _("All") + data = self.data.copy() + data[name] = option_value + selected = data == self.data or option_value in selected_choices + try: + url = data.urlencode() + except AttributeError: +~~ url = urlencode(data) + return self.option_string() % { + 'attrs': selected and ' class="selected"' or '', + 'query_string': url, + 'label': force_str(option_label) + } + + def option_string(self): + return '
  • %(label)s
  • ' + + +class SuffixedMultiWidget(forms.MultiWidget): + suffixes = [] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + assert len(self.widgets) == len(self.suffixes) + assert len(self.suffixes) == len(set(self.suffixes)) + + def suffixed(self, name, suffix): + return '_'.join([name, suffix]) if suffix else name + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + + +## ... source file continues with no further urlencode examples... + +``` + + +## Example 5 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / test.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./test.py) + +```python +# test.py +import io +from importlib import import_module + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.core.handlers.wsgi import WSGIHandler +from django.test import override_settings, testcases +from django.test.client import Client as DjangoClient +from django.test.client import ClientHandler +from django.test.client import RequestFactory as DjangoRequestFactory +from django.utils.encoding import force_bytes +~~from django.utils.http import urlencode + +from rest_framework.compat import coreapi, requests +from rest_framework.settings import api_settings + + +def force_authenticate(request, user=None, token=None): + request._force_auth_user = user + request._force_auth_token = token + + +if requests is not None: + class HeaderDict(requests.packages.urllib3._collections.HTTPHeaderDict): + def get_all(self, key, default): + return self.getheaders(key) + + class MockOriginalResponse: + def __init__(self, headers): + self.msg = HeaderDict(headers) + self.closed = False + + def isclosed(self): + return self.closed + + def close(self): + + +## ... source file abbreviated to get to urlencode examples ... + + + format = format or self.default_format + + assert format in self.renderer_classes, ( + "Invalid format '{}'. Available formats are {}. " + "Set TEST_REQUEST_RENDERER_CLASSES to enable " + "extra request formats.".format( + format, + ', '.join(["'" + fmt + "'" for fmt in self.renderer_classes]) + ) + ) + + renderer = self.renderer_classes[format]() + ret = renderer.render(data) + + content_type = "{}; charset={}".format( + renderer.media_type, renderer.charset + ) + + if isinstance(ret, str): + ret = ret.encode(renderer.charset) + + return ret, content_type + + def get(self, path, data=None, **extra): + r = { +~~ 'QUERY_STRING': urlencode(data or {}, doseq=True), + } + if not data and '?' in path: + query_string = force_bytes(path.split('?')[1]) + query_string = query_string.decode('iso-8859-1') + r['QUERY_STRING'] = query_string + r.update(extra) + return self.generic('GET', path, **r) + + def post(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('POST', path, data, content_type, **extra) + + def put(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('PUT', path, data, content_type, **extra) + + def patch(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('PATCH', path, data, content_type, **extra) + + def delete(self, path, data=None, format=None, content_type=None, **extra): + data, content_type = self._encode_data(data, format, content_type) + return self.generic('DELETE', path, data, content_type, **extra) + + + +## ... source file continues with no further urlencode examples... + +``` + + +## Example 6 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / templatetags / django_tables2.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/templatetags/django_tables2.py) + +```python +# django_tables2.py +import re +from collections import OrderedDict + +from django import template +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.template import Node, TemplateSyntaxError +from django.template.loader import get_template, select_template +from django.templatetags.l10n import register as l10n_register +from django.utils.html import escape +~~from django.utils.http import urlencode + +import django_tables2 as tables +from django_tables2.paginators import LazyPaginator +from django_tables2.utils import AttributeDict + +register = template.Library() +kwarg_re = re.compile(r"(?:(.+)=)?(.+)") +context_processor_error_msg = ( + "Tag {%% %s %%} requires django.template.context_processors.request to be " + "in the template configuration in " + "settings.TEMPLATES[]OPTIONS.context_processors) in order for the included " + "template tags to function correctly." +) + + +def token_kwargs(bits, parser): + if not bits: + return {} + kwargs = OrderedDict() + while bits: + match = kwarg_re.match(bits[0]) + if not match or not match.group(1): + return kwargs + key, value = match.groups() + + +## ... source file abbreviated to get to urlencode examples ... + + + + +class QuerystringNode(Node): + def __init__(self, updates, removals, asvar=None): + super().__init__() + self.updates = updates + self.removals = removals + self.asvar = asvar + + def render(self, context): + if "request" not in context: + raise ImproperlyConfigured(context_processor_error_msg % "querystring") + + params = dict(context["request"].GET) + for key, value in self.updates.items(): + if isinstance(key, str): + params[key] = value + continue + key = key.resolve(context) + value = value.resolve(context) + if key not in ("", None): + params[key] = value + for removal in self.removals: + params.pop(removal.resolve(context), None) + +~~ value = escape("?" + urlencode(params, doseq=True)) + + if self.asvar: + context[str(self.asvar)] = value + return "" + else: + return value + + +@register.tag +def querystring(parser, token): + bits = token.split_contents() + tag = bits.pop(0) + updates = token_kwargs(bits, parser) + + asvar_key = None + for key in updates: + if str(key) == "as": + asvar_key = key + + if asvar_key is not None: + asvar = updates[asvar_key] + del updates[asvar_key] + else: + asvar = None + + +## ... source file continues with no further urlencode examples... + +``` + + +## Example 7 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / users / utils.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/users/utils.py) + +```python +# utils.py +import hashlib +from django.conf import settings +~~from django.utils.http import urlencode + +from wagtail.core.compat import AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME + +delete_user_perm = "{0}.delete_{1}".format(AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME.lower()) + + +def user_can_delete_user(current_user, user_to_delete): + if not current_user.has_perm(delete_user_perm): + return False + + if current_user == user_to_delete: + return False + + if user_to_delete.is_superuser and not current_user.is_superuser: + return False + + return True + + +def get_gravatar_url(email, size=50): + default = "mm" + size = int(size) * 2 # requested at retina size by default and scaled down at point of use with css + gravatar_provider_url = getattr(settings, 'WAGTAIL_GRAVATAR_PROVIDER_URL', '//www.gravatar.com/avatar') + + if (not email) or (gravatar_provider_url is None): + return None + + gravatar_url = "{gravatar_provider_url}/{hash}?{params}".format( + gravatar_provider_url=gravatar_provider_url.rstrip('/'), + hash=hashlib.md5(email.lower().encode('utf-8')).hexdigest(), +~~ params=urlencode({'s': size, 'd': default}) + ) + + return gravatar_url + + + +## ... source file continues with no further urlencode examples... + +``` + diff --git a/content/pages/examples/django/django-utils-http-urlquote.markdown b/content/pages/examples/django/django-utils-http-urlquote.markdown new file mode 100644 index 000000000..990e82a0a --- /dev/null +++ b/content/pages/examples/django/django-utils-http-urlquote.markdown @@ -0,0 +1,413 @@ +title: django.utils.http urlquote Example Code +category: page +slug: django-utils-http-urlquote-examples +sortorder: 500011476 +toc: False +sidebartitle: django.utils.http urlquote +meta: Python example code for the urlquote callable from the django.utils.http module of the Django project. + + +urlquote is a callable within the django.utils.http module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / folderadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/folderadmin.py) + +```python +# folderadmin.py +from __future__ import absolute_import, division, unicode_literals + +import itertools +import os +import re +from collections import OrderedDict + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import messages +from django.contrib.admin import helpers +from django.contrib.admin.utils import capfirst, quote, unquote +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.db import models, router +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils.encoding import force_text +from django.utils.html import escape +~~from django.utils.http import urlquote, urlunquote +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy, ungettext + +from .. import settings +from ..models import ( + File, Folder, FolderPermission, FolderRoot, ImagesWithMissingData, + UnsortedImages, tools, +) +from ..settings import FILER_IMAGE_MODEL, FILER_PAGINATE_BY +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import get_delete_permission +from ..utils.filer_easy_thumbnails import FilerActionThumbnailer +from ..utils.loader import load_model +from . import views +from .forms import CopyFilesAndFoldersForm, RenameFilesForm, ResizeImagesForm +from .patched.admin_utils import get_deleted_objects +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import ( + AdminContext, admin_url_params_encoded, check_files_edit_permissions, + check_files_read_permissions, check_folder_edit_permissions, + check_folder_read_permissions, popup_status, userperms_for_request, +) + + + +## ... source file abbreviated to get to urlquote examples ... + + + selection_note_all = ungettext('%(total_count)s selected', + 'All %(total_count)s selected', paginator.count) + + try: + paginated_items = paginator.page(request.GET.get('page', 1)) + except PageNotAnInteger: + paginated_items = paginator.page(1) + except EmptyPage: + paginated_items = paginator.page(paginator.num_pages) + + context = self.admin_site.each_context(request) + context.update({ + 'folder': folder, + 'clipboard_files': File.objects.filter( + in_clipboards__clipboarditem__clipboard__user=request.user + ).distinct(), + 'paginator': paginator, + 'paginated_items': paginated_items, + 'virtual_items': virtual_items, + 'uploader_connections': settings.FILER_UPLOADER_CONNECTIONS, + 'permissions': permissions, + 'permstest': userperms_for_request(folder, request), + 'current_url': request.path, + 'title': _('Directory listing for %(folder_name)s') % {'folder_name': folder.name}, + 'search_string': ' '.join(search_terms), +~~ 'q': urlquote(q), + 'show_result_count': show_result_count, + 'folder_children': folder_children, + 'folder_files': folder_files, + 'limit_search_to_folder': limit_search_to_folder, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request), + 'root_path': reverse('admin:index'), + 'action_form': action_form, + 'actions_on_top': self.actions_on_top, + 'actions_on_bottom': self.actions_on_bottom, + 'actions_selection_counter': self.actions_selection_counter, + 'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(paginated_items.object_list)}, + 'selection_note_all': selection_note_all % {'total_count': paginator.count}, + 'media': self.media, + 'enable_permissions': settings.FILER_ENABLE_PERMISSIONS, + 'can_make_folder': request.user.is_superuser or (folder.is_root and settings.FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS) or permissions.get("has_add_children_permission"), + }) + return render(request, self.directory_listing_template, context) + + def filter_folder(self, qs, terms=()): + def construct_search(field_name): + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + + +## ... source file continues with no further urlquote examples... + +``` + + +## Example 2 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / sitetreeapp.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./sitetreeapp.py) + +```python +# sitetreeapp.py +import warnings +from collections import defaultdict +from copy import deepcopy +from inspect import getfullargspec +from sys import exc_info +from threading import local +from typing import Callable, List, Optional, Dict, Union, Sequence, Any, Tuple + +from django.conf import settings +from django.core.cache import cache +from django.db.models import signals, QuerySet +from django.template.base import ( + FilterExpression, Lexer, Parser, Token, Variable, VariableDoesNotExist, VARIABLE_TAG_START, Context) +from django.template.defaulttags import url as url_tag +from django.template.loader import get_template +from django.utils import module_loading +~~from django.utils.http import urlquote +from django.utils.translation import get_language + +from .compat import TOKEN_BLOCK, TOKEN_TEXT, TOKEN_VAR +from .exceptions import SiteTreeError +from .settings import ( + ALIAS_TRUNK, ALIAS_THIS_CHILDREN, ALIAS_THIS_SIBLINGS, ALIAS_THIS_PARENT_SIBLINGS, ALIAS_THIS_ANCESTOR_CHILDREN, + UNRESOLVED_ITEM_MARKER, RAISE_ITEMS_ERRORS_ON_DEBUG, CACHE_TIMEOUT, DYNAMIC_ONLY, ADMIN_APP_NAME, SITETREE_CLS) +from .utils import get_tree_model, get_tree_item_model, import_app_sitetree_module, generate_id_for + +if False: # pragma: nocover + from django.contrib.auth.models import User # noqa + from .models import TreeItemBase, TreeBase + +TypeDynamicTrees = Dict[str, Union[Dict[str, List['TreeBase']], List['TreeBase']]] + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + +_ITEMS_PROCESSOR: Optional[Callable] = None + +_ITEMS_PROCESSOR_ARGS_LEN: int = 0 + +_I18N_TREES: List[str] = [] + + +## ... source file abbreviated to get to urlquote examples ... + + + return depth + + def get_item_by_id(self, tree_alias: str, item_id: int) -> 'TreeItemBase': + return self.cache.get_entry('items_by_ids', tree_alias)[item_id] + + def get_tree_current_item(self, tree_alias: str) -> Optional['TreeItemBase']: + current_item = self._current_items.get(tree_alias, _UNSET) + + if current_item is not _UNSET: + + if current_item is not None: + current_item.is_current = True # Could be reset by .get_sitetree() + + return current_item # noqa + + current_item = None + + if self.current_app_is_admin(): + self._current_items[tree_alias] = current_item + return None + + current_url = self.current_request.path + if isinstance(current_url, str): + current_url = current_url.encode('UTF-8') + if current_url: +~~ current_url = urlquote(current_url) + + for url_item, url in self._items_urls.items(): + if url != current_url: + continue + + url_item.is_current = True + if url_item.tree.alias == tree_alias: + current_item = url_item + + if current_item is not None: + self._current_items[tree_alias] = current_item + + return current_item + + def url(self, sitetree_item: Union['TreeItemBase', FilterExpression], context: Context = None) -> str: + context = context or self.current_page_context + resolve_var = self.resolve_var + + if not isinstance(sitetree_item, MODEL_TREE_ITEM_CLASS): + sitetree_item = resolve_var(sitetree_item, context) + + resolved_url = self._items_urls.get(sitetree_item) + if resolved_url is not None: + return resolved_url + + +## ... source file continues with no further urlquote examples... + +``` + + +## Example 3 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / decorators.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./decorators.py) + +```python +# decorators.py +from functools import wraps + +from django.http import HttpResponseForbidden +from django.http import HttpResponseNotFound +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.template.loader import render_to_string +from django.urls import reverse +~~from django.utils.http import urlquote +from wiki.conf import settings +from wiki.core.exceptions import NoRootURL + + +def response_forbidden(request, article, urlpath, read_denied=False): + if request.user.is_anonymous: + qs = request.META.get("QUERY_STRING", "") + if qs: +~~ qs = urlquote("?" + qs) + else: + qs = "" + return redirect(settings.LOGIN_URL + "?next=" + request.path + qs) + else: + return HttpResponseForbidden( + render_to_string( + "wiki/permission_denied.html", + context={ + "article": article, + "urlpath": urlpath, + "read_denied": read_denied, + }, + request=request, + ) + ) + + +def get_article( # noqa: max-complexity=23 + func=None, + can_read=True, + can_write=False, + deleted_contents=False, + not_locked=False, + can_delete=False, + + +## ... source file continues with no further urlquote examples... + +``` + + +## Example 4 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / utils / sendfile.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/utils/sendfile.py) + +```python +# sendfile.py +import os.path +from mimetypes import guess_type + +VERSION = (0, 3, 6) +__version__ = '.'.join(map(str, VERSION)) + + +def _lazy_load(fn): + _cached = [] + + def _decorated(): + if not _cached: + _cached.append(fn()) + return _cached[0] + + def clear(): + while _cached: + _cached.pop() + _decorated.clear = clear + return _decorated + + +@_lazy_load +def _get_sendfile(): + from importlib import import_module + from django.conf import settings + from django.core.exceptions import ImproperlyConfigured + + backend = getattr(settings, 'SENDFILE_BACKEND', None) + if not backend: + raise ImproperlyConfigured('You must specify a value for SENDFILE_BACKEND') + module = import_module(backend) + return module.sendfile + + + + +## ... source file abbreviated to get to urlquote examples ... + + + _sendfile = backend or _get_sendfile() + + if not os.path.exists(filename): + from django.http import Http404 + raise Http404('"%s" does not exist' % filename) + + guessed_mimetype, guessed_encoding = guess_type(filename) + if mimetype is None: + if guessed_mimetype: + mimetype = guessed_mimetype + else: + mimetype = 'application/octet-stream' + + response = _sendfile(request, filename, mimetype=mimetype) + if attachment: + if attachment_filename is None: + attachment_filename = os.path.basename(filename) + parts = ['attachment'] + if attachment_filename: + from unidecode import unidecode + from django.utils.encoding import force_str + attachment_filename = force_str(attachment_filename) + ascii_filename = unidecode(attachment_filename) + parts.append('filename="%s"' % ascii_filename) + if ascii_filename != attachment_filename: +~~ from django.utils.http import urlquote +~~ quoted_filename = urlquote(attachment_filename) + parts.append('filename*=UTF-8\'\'%s' % quoted_filename) + response['Content-Disposition'] = '; '.join(parts) + + response['Content-length'] = os.path.getsize(filename) + response['Content-Type'] = mimetype + response['Content-Encoding'] = encoding or guessed_encoding + + return response + + + +## ... source file continues with no further urlquote examples... + +``` + diff --git a/content/pages/examples/django/django-utils-http-urlunquote.markdown b/content/pages/examples/django/django-utils-http-urlunquote.markdown new file mode 100644 index 000000000..8f4cc418b --- /dev/null +++ b/content/pages/examples/django/django-utils-http-urlunquote.markdown @@ -0,0 +1,130 @@ +title: django.utils.http urlunquote Example Code +category: page +slug: django-utils-http-urlunquote-examples +sortorder: 500011477 +toc: False +sidebartitle: django.utils.http urlunquote +meta: Python example code for the urlunquote callable from the django.utils.http module of the Django project. + + +urlunquote is a callable within the django.utils.http module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / folderadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/folderadmin.py) + +```python +# folderadmin.py +from __future__ import absolute_import, division, unicode_literals + +import itertools +import os +import re +from collections import OrderedDict + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import messages +from django.contrib.admin import helpers +from django.contrib.admin.utils import capfirst, quote, unquote +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.db import models, router +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils.encoding import force_text +from django.utils.html import escape +~~from django.utils.http import urlquote, urlunquote +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy, ungettext + +from .. import settings +from ..models import ( + File, Folder, FolderPermission, FolderRoot, ImagesWithMissingData, + UnsortedImages, tools, +) +from ..settings import FILER_IMAGE_MODEL, FILER_PAGINATE_BY +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import get_delete_permission +from ..utils.filer_easy_thumbnails import FilerActionThumbnailer +from ..utils.loader import load_model +from . import views +from .forms import CopyFilesAndFoldersForm, RenameFilesForm, ResizeImagesForm +from .patched.admin_utils import get_deleted_objects +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import ( + AdminContext, admin_url_params_encoded, check_files_edit_permissions, + check_files_read_permissions, check_folder_edit_permissions, + check_folder_read_permissions, popup_status, userperms_for_request, +) + + + +## ... source file abbreviated to get to urlunquote examples ... + + + self.get_queryset(request).get(id=last_folder_id) + except self.model.DoesNotExist: + url = reverse('admin:filer-directory_listing-root') + url = "%s%s" % (url, admin_url_params_encoded(request)) + else: + url = reverse('admin:filer-directory_listing', kwargs={'folder_id': last_folder_id}) + url = "%s%s" % (url, admin_url_params_encoded(request)) + return HttpResponseRedirect(url) + elif folder_id is None: + folder = FolderRoot() + else: + folder = get_object_or_404(self.get_queryset(request), id=folder_id) + request.session['filer_last_folder_id'] = folder_id + + actions = self.get_actions(request) + + list_display = list(self.list_display) + if not actions: + try: + list_display.remove('action_checkbox') + except ValueError: + pass + + q = request.GET.get('q', None) + if q: +~~ search_terms = urlunquote(q).split(" ") + search_mode = True + else: + search_terms = [] + q = '' + search_mode = False + limit_search_to_folder = request.GET.get('limit_search_to_folder', + False) in (True, 'on') + + if len(search_terms) > 0: + if folder and limit_search_to_folder and not folder.is_root: + folder_qs = folder.get_descendants(include_self=False) + file_qs = File.objects.filter( + folder__in=folder.get_descendants(include_self=True)) + else: + folder_qs = self.get_queryset(request) + file_qs = File.objects.all() + folder_qs = self.filter_folder(folder_qs, search_terms) + file_qs = self.filter_file(file_qs, search_terms) + + show_result_count = True + else: + folder_qs = folder.children.all() + file_qs = folder.files.all() + show_result_count = False + + +## ... source file continues with no further urlunquote examples... + +``` + diff --git a/content/pages/examples/django/django-utils-ipv6-clean-ipv6-address.markdown b/content/pages/examples/django/django-utils-ipv6-clean-ipv6-address.markdown new file mode 100644 index 000000000..6cde1b274 --- /dev/null +++ b/content/pages/examples/django/django-utils-ipv6-clean-ipv6-address.markdown @@ -0,0 +1,142 @@ +title: django.utils.ipv6 clean_ipv6_address Example Code +category: page +slug: django-utils-ipv6-clean-ipv6-address-examples +sortorder: 500011478 +toc: False +sidebartitle: django.utils.ipv6 clean_ipv6_address +meta: Python example code for the clean_ipv6_address callable from the django.utils.ipv6 module of the Django project. + + +clean_ipv6_address is a callable within the django.utils.ipv6 module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +~~from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings +from rest_framework.utils import html, humanize_datetime, json, representation +from rest_framework.utils.formatting import lazy_format +from rest_framework.validators import ProhibitSurrogateCharactersValidator + + +class empty: + pass + + +class BuiltinSignatureError(Exception): + pass + + +def is_simple_callable(obj): + if inspect.isbuiltin(obj): + + +## ... source file abbreviated to get to clean_ipv6_address examples ... + + + return str(value) + else: + return getattr(value, self.uuid_format) + + +class IPAddressField(CharField): + + default_error_messages = { + 'invalid': _('Enter a valid IPv4 or IPv6 address.'), + } + + def __init__(self, protocol='both', **kwargs): + self.protocol = protocol.lower() + self.unpack_ipv4 = (self.protocol == 'both') + super().__init__(**kwargs) + validators, error_message = ip_address_validators(protocol, self.unpack_ipv4) + self.validators.extend(validators) + + def to_internal_value(self, data): + if not isinstance(data, str): + self.fail('invalid', value=data) + + if ':' in data: + try: + if self.protocol in ('both', 'ipv6'): +~~ return clean_ipv6_address(data, self.unpack_ipv4) + except DjangoValidationError: + self.fail('invalid', value=data) + + return super().to_internal_value(data) + + + +class IntegerField(Field): + default_error_messages = { + 'invalid': _('A valid integer is required.'), + 'max_value': _('Ensure this value is less than or equal to {max_value}.'), + 'min_value': _('Ensure this value is greater than or equal to {min_value}.'), + 'max_string_length': _('String value too large.') + } + MAX_STRING_LENGTH = 1000 # Guard against malicious string inputs. + re_decimal = re.compile(r'\.0*\s*$') # allow e.g. '1.0' as an int, but not '1.2' + + def __init__(self, **kwargs): + self.max_value = kwargs.pop('max_value', None) + self.min_value = kwargs.pop('min_value', None) + super().__init__(**kwargs) + if self.max_value is not None: + message = lazy_format(self.error_messages['max_value'], max_value=self.max_value) + self.validators.append( + + +## ... source file continues with no further clean_ipv6_address examples... + +``` + diff --git a/content/pages/examples/django/django-utils-itercompat-is-iterable.markdown b/content/pages/examples/django/django-utils-itercompat-is-iterable.markdown new file mode 100644 index 000000000..ce238d3f7 --- /dev/null +++ b/content/pages/examples/django/django-utils-itercompat-is-iterable.markdown @@ -0,0 +1,123 @@ +title: django.utils.itercompat is_iterable Example Code +category: page +slug: django-utils-itercompat-is-iterable-examples +sortorder: 500011479 +toc: False +sidebartitle: django.utils.itercompat is_iterable +meta: Python example code for the is_iterable callable from the django.utils.itercompat module of the Django project. + + +is_iterable is a callable within the django.utils.itercompat module of the Django project. + + +## Example 1 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / filters.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./filters.py) + +```python +# filters.py +from collections import OrderedDict +from datetime import timedelta + +from django import forms +from django.db.models import Q +from django.db.models.constants import LOOKUP_SEP +from django.forms.utils import pretty_name +~~from django.utils.itercompat import is_iterable +from django.utils.timezone import now +from django.utils.translation import gettext_lazy as _ + +from .conf import settings +from .constants import EMPTY_VALUES +from .fields import ( + BaseCSVField, + BaseRangeField, + ChoiceField, + DateRangeField, + DateTimeRangeField, + IsoDateTimeField, + IsoDateTimeRangeField, + LookupChoiceField, + ModelChoiceField, + ModelMultipleChoiceField, + MultipleChoiceField, + RangeField, + TimeRangeField +) +from .utils import get_model_field, label_for_filter + +__all__ = [ + 'AllValuesFilter', + + +## ... source file abbreviated to get to is_iterable examples ... + + + + kwargs.setdefault('label', _('Ordering')) + kwargs.setdefault('help_text', '') + kwargs.setdefault('null_label', None) + super().__init__(*args, **kwargs) + + def get_ordering_value(self, param): + descending = param.startswith('-') + param = param[1:] if descending else param + field_name = self.param_map.get(param, param) + + return "-%s" % field_name if descending else field_name + + def filter(self, qs, value): + if value in EMPTY_VALUES: + return qs + + ordering = [self.get_ordering_value(param) for param in value] + return qs.order_by(*ordering) + + @classmethod + def normalize_fields(cls, fields): + if isinstance(fields, dict): + return OrderedDict(fields) + +~~ assert is_iterable(fields), \ + "'fields' must be an iterable (e.g., a list, tuple, or mapping)." + + assert all(isinstance(field, str) or +~~ is_iterable(field) and len(field) == 2 # may need to be wrapped in parens + for field in fields), \ + "'fields' must contain strings or (field name, param name) pairs." + + return OrderedDict([ + (f, f) if isinstance(f, str) else f for f in fields + ]) + + def build_choices(self, fields, labels): + ascending = [ + (param, labels.get(field, _(pretty_name(param)))) + for field, param in fields.items() + ] + descending = [ + ('-%s' % param, labels.get('-%s' % param, self.descending_fmt % label)) + for param, label in ascending + ] + + return [val for pair in zip(ascending, descending) for val in pair] + + +class FilterMethod: + def __init__(self, filter_instance): + self.f = filter_instance + + + +## ... source file continues with no further is_iterable examples... + +``` + diff --git a/content/pages/examples/django/django-utils-module-loading-autodiscover-modules.markdown b/content/pages/examples/django/django-utils-module-loading-autodiscover-modules.markdown new file mode 100644 index 000000000..f7287f008 --- /dev/null +++ b/content/pages/examples/django/django-utils-module-loading-autodiscover-modules.markdown @@ -0,0 +1,98 @@ +title: django.utils.module_loading autodiscover_modules Example Code +category: page +slug: django-utils-module-loading-autodiscover-modules-examples +sortorder: 500011480 +toc: False +sidebartitle: django.utils.module_loading autodiscover_modules +meta: Python example code for the autodiscover_modules callable from the django.utils.module_loading module of the Django project. + + +autodiscover_modules is a callable within the django.utils.module_loading module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_pool.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_pool.py) + +```python +# plugin_pool.py +from operator import attrgetter + +from django.core.exceptions import ImproperlyConfigured +from django.conf.urls import url, include +from django.template.defaultfilters import slugify +from django.utils.encoding import force_text +from django.utils.functional import cached_property +~~from django.utils.module_loading import autodiscover_modules +from django.utils.translation import get_language, deactivate_all, activate +from django.template import TemplateDoesNotExist, TemplateSyntaxError + +from six import string_types, text_type + +from cms.exceptions import PluginAlreadyRegistered, PluginNotRegistered +from cms.plugin_base import CMSPluginBase +from cms.utils.conf import get_cms_setting +from cms.utils.helpers import normalize_name + + +class PluginPool(object): + + def __init__(self): + self.plugins = {} + self.discovered = False + + def _clear_cached(self): + if 'registered_plugins' in self.__dict__: + del self.__dict__['registered_plugins'] + + if 'plugins_with_extra_menu' in self.__dict__: + del self.__dict__['plugins_with_extra_menu'] + + if 'plugins_with_extra_placeholder_menu' in self.__dict__: + del self.__dict__['plugins_with_extra_placeholder_menu'] + + def discover_plugins(self): + if self.discovered: + return + from cms.cache import invalidate_cms_page_cache + + if get_cms_setting("PAGE_CACHE"): + invalidate_cms_page_cache() + +~~ autodiscover_modules('cms_plugins') + self.discovered = True + + def clear(self): + self.discovered = False + self.plugins = {} + self._clear_cached() + + def validate_templates(self, plugin=None): + if plugin: + plugins = [plugin] + else: + plugins = self.plugins.values() + for plugin in plugins: + if (plugin.render_plugin and not type(plugin.render_plugin) == property + or hasattr(plugin.model, 'render_template') + or hasattr(plugin, 'get_render_template')): + if (plugin.render_template is None and + not hasattr(plugin, 'get_render_template')): + raise ImproperlyConfigured( + "CMS Plugins must define a render template, " + "a get_render_template method or " + "set render_plugin=False: %s" % plugin + ) + elif not hasattr(plugin, 'get_render_template'): + + +## ... source file continues with no further autodiscover_modules examples... + +``` + diff --git a/content/pages/examples/django/django-utils-module-loading-import-string.markdown b/content/pages/examples/django/django-utils-module-loading-import-string.markdown new file mode 100644 index 000000000..68813b63a --- /dev/null +++ b/content/pages/examples/django/django-utils-module-loading-import-string.markdown @@ -0,0 +1,1081 @@ +title: django.utils.module_loading import_string Example Code +category: page +slug: django-utils-module-loading-import-string-examples +sortorder: 500011481 +toc: False +sidebartitle: django.utils.module_loading import_string +meta: Python example code for the import_string callable from the django.utils.module_loading module of the Django project. + + +import_string is a callable within the django.utils.module_loading module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / angular_base.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/angular_base.py) + +```python +# angular_base.py +from base64 import b64encode +from collections import UserList +import json +import warnings + +from django.forms import forms +from django.http import QueryDict +from django.utils.html import format_html, format_html_join, escape, conditional_escape +from django.utils.encoding import force_text +~~from django.utils.module_loading import import_string +from django.utils.safestring import mark_safe, SafeText, SafeData +from django.core.exceptions import ValidationError, ImproperlyConfigured + +from .fields import DefaultFieldMixin + + +class SafeTuple(SafeData, tuple): + + +class TupleErrorList(UserList, list): + def __init__(self, initlist=None, error_class=None): + super(TupleErrorList, self).__init__(initlist) + + if error_class is None: + self.error_class = 'errorlist' + else: + self.error_class = 'errorlist {}'.format(error_class) + + def as_data(self): + return ValidationError(self.data).error_list + + def get_json_data(self, escape_html=False): + errors = [] + for error in self.as_data(): + + +## ... source file abbreviated to get to import_string examples ... + + + elif isinstance(label_css_classes, dict): + for key in (self.name, '*',): + extra_label_classes = label_css_classes.get(key) + if hasattr(extra_label_classes, 'split'): + extra_label_classes = extra_label_classes.split() + extra_label_classes = set(extra_label_classes or []) + css_classes.update(extra_label_classes) + if css_classes: + attrs.update({'class': ' '.join(css_classes)}) + return super(NgBoundField, self).label_tag(contents, attrs, label_suffix='') + + +class BaseFieldsModifierMetaclass(type): + def __new__(cls, name, bases, attrs): + attrs.update(formfield_callback=cls.formfield_callback) + new_class = super(BaseFieldsModifierMetaclass, cls).__new__(cls, name, bases, attrs) + cls.validate_formfields(new_class) + return new_class + + @classmethod + def formfield_callback(cls, modelfield, **kwargs): + formfield = modelfield.formfield(**kwargs) + + if formfield: + try: +~~ formfield_class = import_string('djng.forms.fields.' + formfield.__class__.__name__) + except ImportError: # form field not declared by Django + formfield_class = type(str(formfield.__class__.__name__), (DefaultFieldMixin, formfield.__class__), {}) + + if hasattr(formfield, 'choices'): + kwargs.update(choices_form_class=formfield_class) + kwargs.update(form_class=formfield_class) + formfield = modelfield.formfield(**kwargs) + return formfield + + @classmethod + def validate_formfields(cls, new_class): + msg = "Please use the corresponding form fields from 'djng.forms.fields' for field '{} = {}(...)' " \ + "in form '{}', which inherits from 'NgForm' or 'NgModelForm'." + for name, field in new_class.base_fields.items(): + if not isinstance(field, DefaultFieldMixin): + raise ImproperlyConfigured(msg.format(name, field.__class__.__name__, new_class)) + + +class NgFormBaseMixin(object): + form_error_css_classes = 'djng-form-errors' + field_error_css_classes = 'djng-field-errors' + + def __init__(self, *args, **kwargs): + try: + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 2 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / checks.py**](https://github.com/jazzband/django-axes/blob/master/axes/./checks.py) + +```python +# checks.py +from django.core.checks import ( # pylint: disable=redefined-builtin + Tags, + Warning, + register, +) +~~from django.utils.module_loading import import_string + +from axes.backends import AxesBackend +from axes.conf import settings + + +class Messages: + CACHE_INVALID = ( + "You are using the django-axes cache handler for login attempt tracking." + " Your cache configuration is however invalid and will not work correctly with django-axes." + " This can leave security holes in your login systems as attempts are not tracked correctly." + " Reconfigure settings.AXES_CACHE and settings.CACHES per django-axes configuration documentation." + ) + MIDDLEWARE_INVALID = ( + "You do not have 'axes.middleware.AxesMiddleware' in your settings.MIDDLEWARE." + ) + BACKEND_INVALID = "You do not have 'axes.backends.AxesBackend' or a subclass in your settings.AUTHENTICATION_BACKENDS." + SETTING_DEPRECATED = "You have a deprecated setting {deprecated_setting} configured in your project settings" + + +class Hints: + CACHE_INVALID = None + MIDDLEWARE_INVALID = None + BACKEND_INVALID = ( + "AxesModelBackend was renamed to AxesBackend in django-axes version 5.0." + + +## ... source file abbreviated to get to import_string examples ... + + + + +@register(Tags.security, Tags.compatibility) +def axes_middleware_check(app_configs, **kwargs): # pylint: disable=unused-argument + warnings = [] + + if "axes.middleware.AxesMiddleware" not in settings.MIDDLEWARE: + warnings.append( + Warning( + msg=Messages.MIDDLEWARE_INVALID, + hint=Hints.MIDDLEWARE_INVALID, + id=Codes.MIDDLEWARE_INVALID, + ) + ) + + return warnings + + +@register(Tags.security, Tags.compatibility) +def axes_backend_check(app_configs, **kwargs): # pylint: disable=unused-argument + warnings = [] + + found = False + for name in settings.AUTHENTICATION_BACKENDS: + try: +~~ backend = import_string(name) + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + "Can not find module path defined in settings.AUTHENTICATION_BACKENDS" + ) from e + except ImportError as e: + raise ImportError( + "Can not import backend class defined in settings.AUTHENTICATION_BACKENDS" + ) from e + + if issubclass(backend, AxesBackend): + found = True + break + + if not found: + warnings.append( + Warning( + msg=Messages.BACKEND_INVALID, + hint=Hints.BACKEND_INVALID, + id=Codes.BACKEND_INVALID, + ) + ) + + return warnings + + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 3 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / toolbar_pool.py**](https://github.com/divio/django-cms/blob/develop/cms/./toolbar_pool.py) + +```python +# toolbar_pool.py +from collections import OrderedDict + +from django.core.exceptions import ImproperlyConfigured +~~from django.utils.module_loading import autodiscover_modules, import_string + +from cms.exceptions import ToolbarAlreadyRegistered, ToolbarNotRegistered +from cms.utils.conf import get_cms_setting + + +class ToolbarPool(object): + def __init__(self): + self.toolbars = OrderedDict() + self._discovered = False + self.force_register = False + + def discover_toolbars(self): + if self._discovered: + return + toolbars = get_cms_setting('TOOLBARS') + if toolbars: + for path in toolbars: +~~ cls = import_string(path) + self.force_register = True + self.register(cls) + self.force_register = False + else: + autodiscover_modules('cms_toolbars') + self._discovered = True + + def clear(self): + self.toolbars = OrderedDict() + self._discovered = False + + def register(self, toolbar): + if not self.force_register and get_cms_setting('TOOLBARS'): + return toolbar + from cms.toolbar_base import CMSToolbar + if not issubclass(toolbar, CMSToolbar): + raise ImproperlyConfigured('CMS Toolbar must inherit ' + 'cms.toolbar_base.CMSToolbar, %r does not' % toolbar) + name = "%s.%s" % (toolbar.__module__, toolbar.__name__) + if name in self.toolbars.keys(): + raise ToolbarAlreadyRegistered("[%s] a toolbar with this name is already registered" % name) + self.toolbars[name] = toolbar + return toolbar + + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 4 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / apps.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/./apps.py) + +```python +# apps.py +import inspect + +from django.apps import AppConfig +from django.conf import settings +from django.core.checks import Warning, register +from django.middleware.gzip import GZipMiddleware +~~from django.utils.module_loading import import_string +from django.utils.translation import gettext_lazy as _ + + +class DebugToolbarConfig(AppConfig): + name = "debug_toolbar" + verbose_name = _("Debug Toolbar") + + +@register +def check_middleware(app_configs, **kwargs): + from debug_toolbar.middleware import DebugToolbarMiddleware + + errors = [] + gzip_index = None + debug_toolbar_indexes = [] + + if settings.is_overridden("MIDDLEWARE_CLASSES"): + errors.append( + Warning( + "debug_toolbar is incompatible with MIDDLEWARE_CLASSES setting.", + hint="Use MIDDLEWARE instead of MIDDLEWARE_CLASSES", + id="debug_toolbar.W004", + ) + ) + + +## ... source file abbreviated to get to import_string examples ... + + + errors.append( + Warning( + "debug_toolbar.middleware.DebugToolbarMiddleware occurs " + "multiple times in MIDDLEWARE.", + hint="Load debug_toolbar.middleware.DebugToolbarMiddleware only " + "once in MIDDLEWARE.", + id="debug_toolbar.W002", + ) + ) + elif gzip_index is not None and debug_toolbar_indexes[0] < gzip_index: + errors.append( + Warning( + "debug_toolbar.middleware.DebugToolbarMiddleware occurs before " + "django.middleware.gzip.GZipMiddleware in MIDDLEWARE.", + hint="Move debug_toolbar.middleware.DebugToolbarMiddleware to " + "after django.middleware.gzip.GZipMiddleware in MIDDLEWARE.", + id="debug_toolbar.W003", + ) + ) + + return errors + + +def is_middleware_class(middleware_class, middleware_path): + try: +~~ middleware_cls = import_string(middleware_path) + except ImportError: + return + return inspect.isclass(middleware_cls) and issubclass( + middleware_cls, middleware_class + ) + + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 5 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / collision_resolvers.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/./collision_resolvers.py) + +```python +# collision_resolvers.py +import inspect +import sys +from abc import abstractmethod, ABCMeta +from typing import ( # NOQA + Dict, + List, + Optional, + Tuple, +) + +~~from django.utils.module_loading import import_string +from six import add_metaclass + + +@add_metaclass(ABCMeta) +class BaseCR: + + @classmethod + def get_app_name_and_model(cls, full_model_path): # type: (str) -> Tuple[str, str] +~~ model_class = import_string(full_model_path) + return model_class._meta.app_config.name, model_class.__name__ + + @abstractmethod + def resolve_collisions(self, namespace): # type: (Dict[str, List[str]]) -> Dict[str, str] + pass + + +class LegacyCR(BaseCR): + + def resolve_collisions(self, namespace): + result = {} + for name, models in namespace.items(): + result[name] = models[-1] + return result + + +@add_metaclass(ABCMeta) +class AppsOrderCR(LegacyCR): + APP_PRIORITIES = None # type: List[str] + + def resolve_collisions(self, namespace): + assert self.APP_PRIORITIES is not None, "You must define APP_PRIORITIES in your resolver class!" + result = {} + for name, models in namespace.items(): + + +## ... source file abbreviated to get to import_string examples ... + + + MODIFICATION_STRING = "{model_name}_{app_name}" + + +class AppNamePrefixCustomOrderCR(AppNamePrefixCR, InstalledAppsOrderCR): + + pass + + +class AppNameSuffixCustomOrderCR(AppNameSuffixCR, InstalledAppsOrderCR): + + pass + + +class FullPathCustomOrderCR(FullPathCR, InstalledAppsOrderCR): + + pass + + +@add_metaclass(ABCMeta) +class AppLabelCR(PathBasedCR): + + MODIFICATION_STRING = None # type: Optional[str] + + def transform_import(self, module_path): + assert self.MODIFICATION_STRING is not None, "You must define MODIFICATION_STRING in your resolver class!" +~~ model_class = import_string(module_path) + app_label, model_name = model_class._meta.app_label, model_class.__name__ + return self.MODIFICATION_STRING.format(app_label=app_label, model_name=model_name) + + +class AppLabelPrefixCR(AppLabelCR): + + MODIFICATION_STRING = "{app_label}_{model_name}" + + +class AppLabelSuffixCR(AppLabelCR): + + MODIFICATION_STRING = "{model_name}_{app_label}" + + +class CollisionResolvingRunner: + def __init__(self): + pass + + def run_collision_resolver(self, models_to_import): + dictionary_of_names = self._get_dictionary_of_names(models_to_import) # type: Dict[str, str] + return self._get_dictionary_of_modules(dictionary_of_names) + + @classmethod + def _get_dictionary_of_names(cls, models_to_import): # type: (Dict[str, List[str]]) -> (Dict[str, str]) + from django.conf import settings +~~ collision_resolver_class = import_string(getattr( + settings, 'SHELL_PLUS_MODEL_IMPORTS_RESOLVER', + 'django_extensions.collision_resolvers.LegacyCR' + )) + + cls._assert_is_collision_resolver_class_correct(collision_resolver_class) + result = collision_resolver_class().resolve_collisions(models_to_import) + cls._assert_is_collision_resolver_result_correct(result) + + return result + + @classmethod + def _assert_is_collision_resolver_result_correct(cls, result): + assert isinstance(result, dict), "Result of resolve_collisions function must be a dict!" + for key, value in result.items(): + assert isinstance(key, str), "key in collision resolver result should be str not %s" % key + assert isinstance(value, str), "value in collision resolver result should be str not %s" % value + + @classmethod + def _assert_is_collision_resolver_class_correct(cls, collision_resolver_class): + assert inspect.isclass(collision_resolver_class) and issubclass( + collision_resolver_class, BaseCR), "SHELL_PLUS_MODEL_IMPORTS_RESOLVER " \ + "must be subclass of BaseCR!" + assert len(inspect.getfullargspec(collision_resolver_class.resolve_collisions).args) == 2, \ + "resolve_collisions function must take one argument!" + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 6 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / ctypes.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./ctypes.py) + +```python +# ctypes.py +from django.contrib.contenttypes.models import ContentType +~~from django.utils.module_loading import import_string + +from guardian.conf import settings as guardian_settings + + +def get_content_type(obj): +~~ get_content_type_function = import_string( + guardian_settings.GET_CONTENT_TYPE) + return get_content_type_function(obj) + + +def get_default_content_type(obj): + return ContentType.objects.get_for_model(obj) + + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 7 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / admin.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./admin.py) + +```python +# admin.py +from datetime import datetime + +import django +from django import forms +from django.conf import settings +from django.conf.urls import url +from django.contrib import admin, messages +from django.contrib.admin.models import ADDITION, CHANGE, DELETION, LogEntry +from django.contrib.auth import get_permission_codename +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import PermissionDenied +from django.http import HttpResponse, HttpResponseRedirect +from django.template.response import TemplateResponse +from django.urls import reverse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_str +~~from django.utils.module_loading import import_string +from django.utils.translation import gettext_lazy as _ +from django.views.decorators.http import require_POST + +from .formats.base_formats import DEFAULT_FORMATS +from .forms import ConfirmImportForm, ExportForm, ImportForm, export_action_form_factory +from .resources import modelresource_factory +from .results import RowResult +from .signals import post_export, post_import +from .tmp_storages import TempFolderStorage + +SKIP_ADMIN_LOG = getattr(settings, 'IMPORT_EXPORT_SKIP_ADMIN_LOG', False) +TMP_STORAGE_CLASS = getattr(settings, 'IMPORT_EXPORT_TMP_STORAGE_CLASS', + TempFolderStorage) + + +if isinstance(TMP_STORAGE_CLASS, str): +~~ TMP_STORAGE_CLASS = import_string(TMP_STORAGE_CLASS) + + +class ImportExportMixinBase: + def get_model_info(self): + app_label = self.model._meta.app_label + return (app_label, self.model._meta.model_name) + + +class ImportMixin(ImportExportMixinBase): + + change_list_template = 'admin/import_export/change_list_import.html' + import_template_name = 'admin/import_export/import.html' + resource_class = None + formats = DEFAULT_FORMATS + from_encoding = "utf-8" + skip_admin_log = None + tmp_storage_class = None + + def get_skip_admin_log(self): + if self.skip_admin_log is None: + return SKIP_ADMIN_LOG + else: + return self.skip_admin_log + + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 8 from django-push-notifications +[django-push-notifications](https://github.com/jazzband/django-push-notifications) +is a [Django](/django.html) app for storing and interacting with +push notification services such as +[Google's Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/) +and +[Apple Notifications](https://developer.apple.com/notifications/). +The django-push-notification project's source code is available +open source under the +[MIT license](https://github.com/jazzband/django-push-notifications/blob/master/LICENSE). + +[**django-push-notifications / push_notifications / conf / __init__.py**](https://github.com/jazzband/django-push-notifications/blob/master/push_notifications/conf/__init__.py) + +```python +# __init__.py +~~from django.utils.module_loading import import_string + +from .app import AppConfig # noqa: F401 +from .appmodel import AppModelConfig # noqa: F401 +from .legacy import LegacyConfig # noqa: F401 +from ..settings import PUSH_NOTIFICATIONS_SETTINGS as SETTINGS # noqa: I001 + + +manager = None + + +def get_manager(reload=False): + global manager + + if not manager or reload is True: +~~ manager = import_string(SETTINGS["CONFIG"])() + + return manager + + +get_manager() + + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 9 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / settings.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./settings.py) + +```python +# settings.py +from django.conf import settings +from django.test.signals import setting_changed +~~from django.utils.module_loading import import_string + +from rest_framework import ISO_8601 + +DEFAULTS = { + 'DEFAULT_RENDERER_CLASSES': [ + 'rest_framework.renderers.JSONRenderer', + 'rest_framework.renderers.BrowsableAPIRenderer', + ], + 'DEFAULT_PARSER_CLASSES': [ + 'rest_framework.parsers.JSONParser', + 'rest_framework.parsers.FormParser', + 'rest_framework.parsers.MultiPartParser' + ], + 'DEFAULT_AUTHENTICATION_CLASSES': [ + 'rest_framework.authentication.SessionAuthentication', + 'rest_framework.authentication.BasicAuthentication' + ], + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.AllowAny', + ], + 'DEFAULT_THROTTLE_CLASSES': [], + 'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'rest_framework.negotiation.DefaultContentNegotiation', + 'DEFAULT_METADATA_CLASS': 'rest_framework.metadata.SimpleMetadata', + 'DEFAULT_VERSIONING_CLASS': None, + + +## ... source file abbreviated to get to import_string examples ... + + + 'TEST_REQUEST_RENDERER_CLASSES', + 'UNAUTHENTICATED_USER', + 'UNAUTHENTICATED_TOKEN', + 'VIEW_NAME_FUNCTION', + 'VIEW_DESCRIPTION_FUNCTION' +] + + +REMOVED_SETTINGS = [ + 'PAGINATE_BY', 'PAGINATE_BY_PARAM', 'MAX_PAGINATE_BY', +] + + +def perform_import(val, setting_name): + if val is None: + return None + elif isinstance(val, str): + return import_from_string(val, setting_name) + elif isinstance(val, (list, tuple)): + return [import_from_string(item, setting_name) for item in val] + return val + + +def import_from_string(val, setting_name): + try: +~~ return import_string(val) + except ImportError as e: + msg = "Could not import '%s' for API setting '%s'. %s: %s." % (val, setting_name, e.__class__.__name__, e) + raise ImportError(msg) + + +class APISettings: + def __init__(self, user_settings=None, defaults=None, import_strings=None): + if user_settings: + self._user_settings = self.__check_user_settings(user_settings) + self.defaults = defaults or DEFAULTS + self.import_strings = import_strings or IMPORT_STRINGS + self._cached_attrs = set() + + @property + def user_settings(self): + if not hasattr(self, '_user_settings'): + self._user_settings = getattr(settings, 'REST_FRAMEWORK', {}) + return self._user_settings + + def __getattr__(self, attr): + if attr not in self.defaults: + raise AttributeError("Invalid API setting: '%s'" % attr) + + try: + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 10 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / exporters.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./exporters.py) + +```python +# exporters.py +from django.db import DatabaseError +from django.core.serializers.json import DjangoJSONEncoder +import json +import uuid +import string +import sys +from datetime import datetime +PY3 = sys.version_info[0] == 3 +if PY3: + import csv +else: + import unicodecsv as csv + +~~from django.utils.module_loading import import_string +from django.utils.text import slugify +from explorer import app_settings +from six import StringIO, BytesIO + + +def get_exporter_class(format): + class_str = dict(getattr(app_settings, 'EXPLORER_DATA_EXPORTERS'))[format] +~~ return import_string(class_str) + + +class BaseExporter(object): + + name = '' + content_type = '' + file_extension = '' + + def __init__(self, query): + self.query = query + + def get_output(self, **kwargs): + value = self.get_file_output(**kwargs).getvalue() + if PY3: + return value + else: + return str(value) + + def get_file_output(self, **kwargs): + res = self.query.execute_query_only() + return self._get_output(res, **kwargs) + + def _get_output(self, res, **kwargs): + raise NotImplementedError + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 11 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / utils.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./utils.py) + +```python +# utils.py +from django.conf import settings +from django.utils.functional import wraps +~~from django.utils.module_loading import import_string + + +def _parse_tags(tagstring): + if not tagstring: + return [] + + if "," not in tagstring and '"' not in tagstring: + words = list(set(split_strip(tagstring, " "))) + words.sort() + return words + + words = [] + buffer = [] + to_be_split = [] + saw_loose_comma = False + open_quote = False + i = iter(tagstring) + try: + while True: + c = next(i) + if c == '"': + if buffer: + to_be_split.append("".join(buffer)) + buffer = [] + + +## ... source file abbreviated to get to import_string examples ... + + + + +def _edit_string_for_tags(tags): + names = [] + for tag in tags: + name = tag.name + if "," in name or " " in name: + names.append('"%s"' % name) + else: + names.append(name) + return ", ".join(sorted(names)) + + +def require_instance_manager(func): + @wraps(func) + def inner(self, *args, **kwargs): + if self.instance is None: + raise TypeError("Can't call %s with a non-instance manager" % func.__name__) + return func(self, *args, **kwargs) + + return inner + + +def get_func(key, default): + func_path = getattr(settings, key, None) +~~ return default if func_path is None else import_string(func_path) + + +def parse_tags(tagstring): + func = get_func("TAGGIT_TAGS_FROM_STRING", _parse_tags) + return func(tagstring) + + +def edit_string_for_tags(tags): + func = get_func("TAGGIT_STRING_FROM_TAGS", _edit_string_for_tags) + return func(tags) + + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 12 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / sites.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./sites.py) + +```python +# sites.py +from django.apps import apps +from django.urls import include +from django.urls import re_path +from django.utils.functional import LazyObject +~~from django.utils.module_loading import import_string +from wiki.conf import settings +from wiki.core.plugins import registry + + +class WikiSite: + + def __init__(self, name="wiki"): + from wiki.views import accounts, article, deleted_list + + self.name = name + + self.root_view = getattr(self, "root_view", article.CreateRootView.as_view()) + self.root_missing_view = getattr( + self, "root_missing_view", article.MissingRootView.as_view() + ) + + self.article_view = getattr(self, "article_view", article.ArticleView.as_view()) + self.article_create_view = getattr( + self, "article_create_view", article.Create.as_view() + ) + self.article_delete_view = getattr( + self, "article_delete_view", article.Delete.as_view() + ) + self.article_deleted_view = getattr( + + +## ... source file abbreviated to get to import_string examples ... + + + def get_plugin_urls(self): + urlpatterns = [] + for plugin in registry.get_plugins().values(): + slug = getattr(plugin, "slug", None) + if slug: + article_urlpatterns = plugin.urlpatterns.get("article", []) + urlpatterns += [ + re_path( + r"^(?P[0-9]+)/plugin/" + slug + "/", + include(article_urlpatterns), + ), + re_path( + r"^(?P.+/|)_plugin/" + slug + "/", + include(article_urlpatterns), + ), + ] + root_urlpatterns = plugin.urlpatterns.get("root", []) + urlpatterns += [ + re_path(r"^_plugin/" + slug + "/", include(root_urlpatterns)), + ] + return urlpatterns + + +class DefaultWikiSite(LazyObject): + def _setup(self): +~~ WikiSiteClass = import_string(apps.get_app_config("wiki").default_site) + self._wrapped = WikiSiteClass() + + +site = DefaultWikiSite() + + + +## ... source file continues with no further import_string examples... + +``` + + +## Example 13 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / utils / loading.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/utils/loading.py) + +```python +# loading.py +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +~~from django.utils.module_loading import import_string + + +def get_custom_form(form_setting): + try: +~~ return import_string(getattr(settings, form_setting)) + except ImportError: + raise ImproperlyConfigured( + "%s refers to a form '%s' that is not available" % + (form_setting, getattr(settings, form_setting)) + ) + + + +## ... source file continues with no further import_string examples... + +``` + diff --git a/content/pages/examples/django/django-utils-module-loading-module-has-submodule.markdown b/content/pages/examples/django/django-utils-module-loading-module-has-submodule.markdown new file mode 100644 index 000000000..e0708ccb7 --- /dev/null +++ b/content/pages/examples/django/django-utils-module-loading-module-has-submodule.markdown @@ -0,0 +1,268 @@ +title: django.utils.module_loading module_has_submodule Example Code +category: page +slug: django-utils-module-loading-module-has-submodule-examples +sortorder: 500011482 +toc: False +sidebartitle: django.utils.module_loading module_has_submodule +meta: Python example code for the module_has_submodule callable from the django.utils.module_loading module of the Django project. + + +module_has_submodule is a callable within the django.utils.module_loading module of the Django project. + + +## Example 1 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / utils / loading.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/utils/loading.py) + +```python +# loading.py +import copy +import inspect +import threading +import warnings +from collections import OrderedDict + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +~~from django.utils.module_loading import module_has_submodule + +from haystack import constants +from haystack.exceptions import NotHandled, SearchFieldError +from haystack.utils import importlib +from haystack.utils.app_loading import haystack_get_app_modules + + +def import_class(path): + path_bits = path.split(".") + class_name = path_bits.pop() + module_path = ".".join(path_bits) + module_itself = importlib.import_module(module_path) + + if not hasattr(module_itself, class_name): + raise ImportError( + "The Python module '%s' has no '%s' class." % (module_path, class_name) + ) + + return getattr(module_itself, class_name) + + +def load_backend(full_backend_path): + path_bits = full_backend_path.split(".") + + + +## ... source file abbreviated to get to module_has_submodule examples ... + + + self._indexes = {} + self.fields = OrderedDict() + self._built = False + self.excluded_indexes = excluded_indexes or [] + self.excluded_indexes_ids = {} + self.document_field = constants.DOCUMENT_FIELD + self._fieldnames = {} + self._facet_fieldnames = {} + + @property + def indexes(self): + warnings.warn( + "'UnifiedIndex.indexes' was deprecated in Haystack v2.3.0. Please use UnifiedIndex.get_indexes()." + ) + return self._indexes + + def collect_indexes(self): + indexes = [] + + for app_mod in haystack_get_app_modules(): + try: + search_index_module = importlib.import_module( + "%s.search_indexes" % app_mod.__name__ + ) + except ImportError: +~~ if module_has_submodule(app_mod, "search_indexes"): + raise + + continue + + for item_name, item in inspect.getmembers( + search_index_module, inspect.isclass + ): + if getattr(item, "haystack_use_for_indexing", False) and getattr( + item, "get_model", None + ): + class_path = "%s.search_indexes.%s" % (app_mod.__name__, item_name) + + if class_path in self.excluded_indexes or self.excluded_indexes_ids.get( + item_name + ) == id( + item + ): + self.excluded_indexes_ids[str(item_name)] = id(item) + continue + + indexes.append(item()) + + return indexes + + + +## ... source file continues with no further module_has_submodule examples... + +``` + + +## Example 2 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / utils.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./utils.py) + +```python +# utils.py +from importlib import import_module +from types import ModuleType +from typing import Any, Sequence, Type, Union, List, Optional, Tuple + +from django.apps import apps +from django.contrib.auth.models import Permission +from django.core.exceptions import ImproperlyConfigured +~~from django.utils.module_loading import module_has_submodule + +from . import settings + +if False: # pragma: nocover + from .models import TreeItemBase, TreeBase # noqa + + +TypePermission = Union[str, int, Permission] + +apps_get_model = apps.get_model + + +def generate_id_for(obj: Any): + return id(obj) + + +def tree(alias: str, title: str = '', items: Sequence['TreeItemBase'] = None, **kwargs) -> 'TreeBase': + tree_obj = get_tree_model()(alias=alias, title=title, **kwargs) + tree_obj.id = generate_id_for(tree_obj) + tree_obj.is_dynamic = True + + if items is not None: + tree_obj.dynamic_items = [] + + + +## ... source file abbreviated to get to module_has_submodule examples ... + + + cleaned_permissions.append(perm) + + item_obj.permissions = cleaned_permissions or [] + item_obj.access_perm_type = item_obj.PERM_TYPE_ALL if perms_mode_all else item_obj.PERM_TYPE_ANY + + if item_obj.permissions: + item_obj.access_restricted = True + + if children is not None: + for child in children: + child.parent = item_obj + item_obj.dynamic_children.append(child) + + return item_obj + + +def import_app_sitetree_module(app: str) -> Optional[ModuleType]: + module_name = settings.APP_MODULE_NAME + module = import_module(app) + + try: + sub_module = import_module(f'{app}.{module_name}') + return sub_module + + except ImportError: +~~ if module_has_submodule(module, module_name): + raise + return None + + +def import_project_sitetree_modules() -> List[ModuleType]: + from django.conf import settings as django_settings + + submodules = [] + for app in django_settings.INSTALLED_APPS: + module = import_app_sitetree_module(app) + if module is not None: + submodules.append(module) + + return submodules + + +def get_app_n_model(settings_entry_name: str) -> Tuple[str, str]: + try: + app_name, model_name = getattr(settings, settings_entry_name).split('.') + + except ValueError: + raise ImproperlyConfigured( + f'`SITETREE_{settings_entry_name}` must have the following format: `app_name.model_name`.') + + + +## ... source file continues with no further module_has_submodule examples... + +``` + + +## Example 3 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / utils / apps.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/utils/apps.py) + +```python +# apps.py +from importlib import import_module + +from django.apps import apps +~~from django.utils.module_loading import module_has_submodule + + +def get_app_modules(): + for app in apps.get_app_configs(): + yield app.name, app.module + + +def get_app_submodules(submodule_name): + for name, module in get_app_modules(): +~~ if module_has_submodule(module, submodule_name): + yield name, import_module('%s.%s' % (name, submodule_name)) + + + +## ... source file continues with no further module_has_submodule examples... + +``` + diff --git a/content/pages/examples/django/django-utils-module-loading.markdown b/content/pages/examples/django/django-utils-module-loading.markdown new file mode 100644 index 000000000..14b42141c --- /dev/null +++ b/content/pages/examples/django/django-utils-module-loading.markdown @@ -0,0 +1,106 @@ +title: django.utils module_loading Example Code +category: page +slug: django-utils-module-loading-examples +sortorder: 500011419 +toc: False +sidebartitle: django.utils module_loading +meta: Python example code for the module_loading callable from the django.utils module of the Django project. + + +module_loading is a callable within the django.utils module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / sitetreeapp.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./sitetreeapp.py) + +```python +# sitetreeapp.py +import warnings +from collections import defaultdict +from copy import deepcopy +from inspect import getfullargspec +from sys import exc_info +from threading import local +from typing import Callable, List, Optional, Dict, Union, Sequence, Any, Tuple + +from django.conf import settings +from django.core.cache import cache +from django.db.models import signals, QuerySet +from django.template.base import ( + FilterExpression, Lexer, Parser, Token, Variable, VariableDoesNotExist, VARIABLE_TAG_START, Context) +from django.template.defaulttags import url as url_tag +from django.template.loader import get_template +~~from django.utils import module_loading +from django.utils.http import urlquote +from django.utils.translation import get_language + +from .compat import TOKEN_BLOCK, TOKEN_TEXT, TOKEN_VAR +from .exceptions import SiteTreeError +from .settings import ( + ALIAS_TRUNK, ALIAS_THIS_CHILDREN, ALIAS_THIS_SIBLINGS, ALIAS_THIS_PARENT_SIBLINGS, ALIAS_THIS_ANCESTOR_CHILDREN, + UNRESOLVED_ITEM_MARKER, RAISE_ITEMS_ERRORS_ON_DEBUG, CACHE_TIMEOUT, DYNAMIC_ONLY, ADMIN_APP_NAME, SITETREE_CLS) +from .utils import get_tree_model, get_tree_item_model, import_app_sitetree_module, generate_id_for + +if False: # pragma: nocover + from django.contrib.auth.models import User # noqa + from .models import TreeItemBase, TreeBase + +TypeDynamicTrees = Dict[str, Union[Dict[str, List['TreeBase']], List['TreeBase']]] + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + +_ITEMS_PROCESSOR: Optional[Callable] = None + +_ITEMS_PROCESSOR_ARGS_LEN: int = 0 + + + +## ... source file abbreviated to get to module_loading examples ... + + + base_item.in_current_branch = True + if hasattr(base_item, 'parent') and base_item.parent is not None: + self.tree_climber(tree_alias, self.get_item_by_id(tree_alias, base_item.parent.id)) + + def resolve_var( + self, + varname: Union[str, 'TreeItemBase', FilterExpression], + context: Context = None + ) -> Any: + context = context or self.current_page_context + + if isinstance(varname, FilterExpression): + varname = varname.resolve(context) + + else: + varname = varname.strip() + + try: + varname = Variable(varname).resolve(context) + except VariableDoesNotExist: + varname = varname + + return varname + + +~~_SITETREE_CLS = module_loading.import_string(SITETREE_CLS) if SITETREE_CLS else SiteTree + + + +## ... source file continues with no further module_loading examples... + +``` + diff --git a/content/pages/examples/django/django-utils-numberformat-format.markdown b/content/pages/examples/django/django-utils-numberformat-format.markdown new file mode 100644 index 000000000..ec382753b --- /dev/null +++ b/content/pages/examples/django/django-utils-numberformat-format.markdown @@ -0,0 +1,125 @@ +title: django.utils.numberformat format Example Code +category: page +slug: django-utils-numberformat-format-examples +sortorder: 500011483 +toc: False +sidebartitle: django.utils.numberformat format +meta: Python example code for the format callable from the django.utils.numberformat module of the Django project. + + +format is a callable within the django.utils.numberformat module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / tests / test_placeholder.py**](https://github.com/divio/django-cms/blob/develop/cms/tests/test_placeholder.py) + +```python +# test_placeholder.py +from django.conf import settings +from django.contrib.auth import get_user_model +from django.core.cache import cache +from django.core.exceptions import ImproperlyConfigured +from django.template import TemplateSyntaxError, Template +from django.template.loader import get_template +from django.test import TestCase +from django.test.utils import override_settings +from django.utils.encoding import force_text +~~from django.utils.numberformat import format +from sekizai.context import SekizaiContext + +from cms import constants +from cms.api import add_plugin, create_page, create_title +from cms.exceptions import DuplicatePlaceholderWarning +from cms.models.fields import PlaceholderField +from cms.models.placeholdermodel import Placeholder +from cms.models.pluginmodel import CMSPlugin +from cms.plugin_pool import plugin_pool +from cms.tests.test_toolbar import ToolbarTestBase +from cms.test_utils.fixtures.fakemlng import FakemlngFixtures +from cms.test_utils.project.fakemlng.models import Translations +from cms.test_utils.project.placeholderapp.models import ( + DynamicPlaceholderSlotExample, + Example1, + TwoPlaceholderExample, +) +from cms.test_utils.project.sampleapp.models import Category +from cms.test_utils.testcases import CMSTestCase, TransactionCMSTestCase +from cms.test_utils.util.mock import AttributeObject +from cms.toolbar.toolbar import CMSToolbar +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils.compat.tests import UnittestCompatMixin +from cms.utils.conf import get_cms_setting + + +## ... source file abbreviated to get to format examples ... + + + self.assertEqual(plugins[0].plugin_type, 'TextPlugin') + self.assertEqual(plugins[1].plugin_type, 'LinkPlugin') + self.assertEqual(plugins[2].plugin_type, 'LinkPlugin') + self.assertTrue(plugins[1].parent == plugins[2].parent and plugins[1].parent == plugins[0]) + + def test_placeholder_pk_thousands_format(self): + page = create_page("page", "nav_playground.html", "en", published=True) + for placeholder in page.placeholders.all(): + page.placeholders.remove(placeholder) + placeholder.pk += 1000 + placeholder.save() + page.placeholders.add(placeholder) + page.reload() + for placeholder in page.placeholders.all(): + add_plugin(placeholder, "TextPlugin", "en", body="body") + with self.settings(USE_THOUSAND_SEPARATOR=True, USE_L10N=True): + user = self.get_superuser() + self.client.login(username=getattr(user, get_user_model().USERNAME_FIELD), + password=getattr(user, get_user_model().USERNAME_FIELD)) + endpoint = page.get_absolute_url() + '?' + get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON') + response = self.client.get(endpoint) + for placeholder in page.placeholders.all(): + self.assertContains( + response, '"placeholder_id": "%s"' % placeholder.pk) + self.assertNotContains( +~~ response, '"placeholder_id": "%s"' % format( + placeholder.pk, ".", grouping=3, thousand_sep=",")) + self.assertNotContains( +~~ response, '"plugin_id": "%s"' % format( + placeholder.pk, ".", grouping=3, thousand_sep=",")) + self.assertNotContains( +~~ response, '"clipboard": "%s"' % format( + response.context['request'].toolbar.clipboard.pk, ".", + grouping=3, thousand_sep=",")) + + def test_placeholder_languages_model(self): + avail_langs = set([u'en', u'de', u'fr']) + ex = Example1( + char_1='one', + char_2='two', + char_3='tree', + char_4='four' + ) + ex.save() + for lang in avail_langs: + add_plugin(ex.placeholder, u"EmptyPlugin", lang) + ex = Example1.objects.get(pk=ex.pk) + langs = [lang['code'] for lang in ex.placeholder.get_filled_languages()] + self.assertEqual(avail_langs, set(langs)) + + def test_placeholder_languages_page(self): + avail_langs = set([u'en', u'de', u'fr']) + page = create_page('test page', 'col_two.html', u'en') + for lang in avail_langs: + if lang != u'en': + create_title(lang, 'test page %s' % lang, page) + + +## ... source file continues with no further format examples... + +``` + diff --git a/content/pages/examples/django/django-utils-safestring-mark-safe.markdown b/content/pages/examples/django/django-utils-safestring-mark-safe.markdown new file mode 100644 index 000000000..ba71e864b --- /dev/null +++ b/content/pages/examples/django/django-utils-safestring-mark-safe.markdown @@ -0,0 +1,2391 @@ +title: django.utils.safestring mark_safe Example Code +category: page +slug: django-utils-safestring-mark-safe-examples +sortorder: 500011486 +toc: False +sidebartitle: django.utils.safestring mark_safe +meta: Python example code for the mark_safe callable from the django.utils.safestring module of the Django project. + + +mark_safe is a callable within the django.utils.safestring module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / mixins.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/mixins.py) + +```python +# mixins.py +import json + +from django.conf import settings +try: + from django.core import urlresolvers +except ImportError: + from django import urls as urlresolvers +try: + from django.urls.exceptions import NoReverseMatch +except ImportError: + from django.core.urlresolvers import NoReverseMatch +from django.utils.html import format_html +~~from django.utils.safestring import mark_safe + +MAX = 75 + + +class LogEntryAdminMixin(object): + + def created(self, obj): + return obj.timestamp.strftime('%Y-%m-%d %H:%M:%S') + created.short_description = 'Created' + + def user_url(self, obj): + if obj.actor: + app_label, model = settings.AUTH_USER_MODEL.split('.') + viewname = 'admin:%s_%s_change' % (app_label, model.lower()) + try: + link = urlresolvers.reverse(viewname, args=[obj.actor.id]) + except NoReverseMatch: + return u'%s' % (obj.actor) + return format_html(u'{}', link, obj.actor) + + return 'system' + user_url.short_description = 'User' + + def resource_url(self, obj): + + +## ... source file abbreviated to get to mark_safe examples ... + + + return format_html(u'{}', link, obj.object_repr) + resource_url.short_description = 'Resource' + + def msg_short(self, obj): + if obj.action == 2: + return '' # delete + changes = json.loads(obj.changes) + s = '' if len(changes) == 1 else 's' + fields = ', '.join(changes.keys()) + if len(fields) > MAX: + i = fields.rfind(' ', 0, MAX) + fields = fields[:i] + ' ..' + return '%d change%s: %s' % (len(changes), s, fields) + msg_short.short_description = 'Changes' + + def msg(self, obj): + if obj.action == 2: + return '' # delete + changes = json.loads(obj.changes) + msg = '' + for i, field in enumerate(sorted(changes), 1): + value = [i, field] + (['***', '***'] if field == 'password' else changes[field]) + msg += format_html('', *value) + + msg += '
    #FieldFromTo
    {}{}{}{}
    ' +~~ return mark_safe(msg) + msg.short_description = 'Changes' + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 2 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / templatetags / djng_tags.py**](https://github.com/jrief/django-angular/blob/master/djng/templatetags/djng_tags.py) + +```python +# djng_tags.py +import json + +from django.template import Library +from django.template.base import Node, NodeList, TextNode, VariableNode +from django.utils.html import format_html +~~from django.utils.safestring import mark_safe +from django.utils.translation import get_language_from_request + +from djng.core.urlresolvers import get_all_remote_methods, get_current_remote_methods + + +register = Library() + + +@register.simple_tag(name='djng_all_rmi') +def djng_all_rmi(): +~~ return mark_safe(json.dumps(get_all_remote_methods())) + + +@register.simple_tag(name='djng_current_rmi', takes_context=True) +def djng_current_rmi(context): +~~ return mark_safe(json.dumps(get_current_remote_methods(context.get('view')))) + + +@register.simple_tag(name='load_djng_urls', takes_context=True) +def djng_urls(context, *namespaces): + raise DeprecationWarning( + "load_djng_urls templatetag is deprecated and has been removed from this version of django-angular." + "Please refer to documentation for updated way to manage django urls in angular.") + + +class AngularJsNode(Node): + def __init__(self, django_nodelist, angular_nodelist, variable): + self.django_nodelist = django_nodelist + self.angular_nodelist = angular_nodelist + self.variable = variable + + def render(self, context): + if self.variable.resolve(context): + return self.angular_nodelist.render(context) + return self.django_nodelist.render(context) + + +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 3 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_rendering.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_rendering.py) + +```python +# plugin_rendering.py +from __future__ import unicode_literals +from collections import OrderedDict + +from functools import partial + +from classytags.utils import flatten_context + +from django.contrib.sites.models import Site +from django.template import Context +from django.utils.functional import cached_property +from django.utils.module_loading import import_string +~~from django.utils.safestring import mark_safe + +from cms.cache.placeholder import get_placeholder_cache, set_placeholder_cache +from cms.toolbar.utils import ( + get_placeholder_toolbar_js, + get_plugin_toolbar_js, + get_toolbar_from_request, +) +from cms.utils import get_language_from_request +from cms.utils.conf import get_cms_setting +from cms.utils.permissions import has_plugin_permission +from cms.utils.placeholder import get_toolbar_plugin_struct, restore_sekizai_context +from cms.utils.plugins import get_plugin_restrictions + + +def _unpack_plugins(parent_plugin): + found_plugins = [] + + for plugin in parent_plugin.child_plugin_instances or []: + found_plugins.append(plugin) + + if plugin.child_plugin_instances: + found_plugins.extend(_unpack_plugins(plugin)) + return found_plugins + + + +## ... source file abbreviated to get to mark_safe examples ... + + + return False + return not self._placeholders_are_editable + + def render_placeholder(self, placeholder, context, language=None, page=None, + editable=False, use_cache=False, nodelist=None, width=None): + from sekizai.helpers import Watcher + + language = language or self.request_language + editable = editable and self._placeholders_are_editable + + if use_cache and not editable and placeholder.cache_placeholder: + use_cache = self.placeholder_cache_is_enabled() + else: + use_cache = False + + if use_cache: + cached_value = self._get_cached_placeholder_content( + placeholder=placeholder, + language=language, + ) + else: + cached_value = None + + if cached_value is not None: + restore_sekizai_context(context, cached_value['sekizai']) +~~ return mark_safe(cached_value['content']) + + context.push() + + width = width or placeholder.default_width + template = page.get_template() if page else None + + if width: + context['width'] = width + + for key, value in placeholder.get_extra_context(template).items(): + if key not in context: + context[key] = value + + if use_cache: + watcher = Watcher(context) + + plugin_content = self.render_plugins( + placeholder, + language=language, + context=context, + editable=editable, + template=template, + ) + placeholder_content = ''.join(plugin_content) + + +## ... source file abbreviated to get to mark_safe examples ... + + + site_id=self.current_site.pk, + content=content, + request=self.request, + ) + + rendered_placeholder = RenderedPlaceholder( + placeholder=placeholder, + language=language, + site_id=self.current_site.pk, + cached=use_cache, + editable=editable, + has_content=bool(placeholder_content), + ) + + if placeholder.pk not in self._rendered_placeholders: + if not self.toolbar._cache_disabled: + self.toolbar._cache_disabled = not use_cache + self._rendered_placeholders[placeholder.pk] = rendered_placeholder + + if editable: + data = self.get_editable_placeholder_context(placeholder, page=page) + data['content'] = placeholder_content + placeholder_content = self.placeholder_edit_template.format(**data) + + context.pop() +~~ return mark_safe(placeholder_content) + + def get_editable_placeholder_context(self, placeholder, page=None): + placeholder_cache = self.get_rendered_plugins_cache(placeholder) + placeholder_toolbar_js = self.get_placeholder_toolbar_js(placeholder, page) + plugin_toolbar_js_bits = (self.get_plugin_toolbar_js(plugin, page=page) + for plugin in placeholder_cache['plugins']) + context = { + 'plugin_js': ''.join(plugin_toolbar_js_bits), + 'placeholder_js': placeholder_toolbar_js, + 'placeholder_id': placeholder.pk, + } + return context + + def render_page_placeholder(self, slot, context, inherit, + page=None, nodelist=None, editable=True): + if not self.current_page: + return '' + + current_page = page or self.current_page + placeholder_cache = self._placeholders_by_page_cache + + if current_page.pk not in placeholder_cache: + self._preload_placeholders_for_page(current_page) + + + +## ... source file abbreviated to get to mark_safe examples ... + + + if not placeholder: + placeholder = instance.placeholder + + instance, plugin = instance.get_plugin_instance() + + if not instance or not plugin.render_plugin: + return '' + + context = PluginContext(context, instance, placeholder) + context = plugin.render(context, instance, placeholder.slot) + context = flatten_context(context) + + template = plugin._get_render_template(context, instance, placeholder) + template = self.templates.get_cached_template(template) + + content = template.render(context) + + for path in get_cms_setting('PLUGIN_PROCESSORS'): + processor = import_string(path) + content = processor(instance, placeholder, content, context) + + if editable: + content = self.plugin_edit_template.format(pk=instance.pk, content=content) + placeholder_cache = self._rendered_plugins_by_placeholder.setdefault(placeholder.pk, {}) + placeholder_cache.setdefault('plugins', []).append(instance) +~~ return mark_safe(content) + + def render_plugins(self, placeholder, language, context, editable=False, template=None): + plugins = self.get_plugins_to_render( + placeholder=placeholder, + template=template, + language=language, + ) + + for plugin in plugins: + plugin._placeholder_cache = placeholder + yield self.render_plugin(plugin, context, placeholder, editable) + + def _get_cached_placeholder_content(self, placeholder, language): + site_id = self.current_site.pk + site_cache = self._placeholders_content_cache.setdefault(site_id, {}) + language_cache = site_cache.setdefault(language, {}) + + if placeholder.pk not in language_cache: + cached_value = get_placeholder_cache( + placeholder, + lang=language, + site_id=site_id, + request=self.request, + ) + + +## ... source file abbreviated to get to mark_safe examples ... + + + for plugin in _unpack_plugins(plugin): + yield plugin + + def render_placeholder(self, placeholder, language, page=None): + rendered_plugins = self.render_plugins(placeholder, language=language, page=page) + plugin_js_output = ''.join(rendered_plugins) + + placeholder_toolbar_js = self.get_placeholder_toolbar_js(placeholder, page) + rendered_placeholder = RenderedPlaceholder( + placeholder=placeholder, + language=language, + site_id=self.current_site.pk, + cached=False, + editable=True, + ) + + if placeholder.pk not in self._rendered_placeholders: + self._rendered_placeholders[placeholder.pk] = rendered_placeholder + + placeholder_structure_is = self.placeholder_edit_template.format( + placeholder_id=placeholder.pk, + plugin_js=plugin_js_output, + plugin_menu_js=self.get_placeholder_plugin_menu(placeholder, page=page), + placeholder_js=placeholder_toolbar_js, + ) +~~ return mark_safe(placeholder_structure_is) + + def render_page_placeholder(self, page, placeholder, language=None): + return self.render_placeholder(placeholder, language=language, page=page) + + def render_static_placeholder(self, static_placeholder, language=None): + user = self.request.user + + if not user.has_perm('cms.edit_static_placeholder'): + return '' + + language = language or self.request_language + + placeholder = static_placeholder.draft + placeholder.is_static = True + + content = self.render_placeholder(placeholder, language=language) + + if static_placeholder.pk not in self._rendered_static_placeholders: + self._rendered_static_placeholders[static_placeholder.pk] = static_placeholder + return content + + def render_plugin(self, instance, page=None): + placeholder_cache = self._rendered_plugins_by_placeholder.setdefault(instance.placeholder_id, {}) + placeholder_cache.setdefault('plugins', []).append(instance) + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 4 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / utils.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/./utils.py) + +```python +# utils.py +import inspect +import os.path +import re +import sys +from importlib import import_module +from itertools import chain + +import django +from django.core.exceptions import ImproperlyConfigured +from django.template import Node +from django.template.loader import render_to_string +~~from django.utils.safestring import mark_safe + +from debug_toolbar import settings as dt_settings + +try: + import threading +except ImportError: + threading = None + + +django_path = os.path.realpath(os.path.dirname(django.__file__)) + + +def get_module_path(module_name): + try: + module = import_module(module_name) + except ImportError as e: + raise ImproperlyConfigured("Error importing HIDE_IN_STACKTRACES: {}".format(e)) + else: + source_path = inspect.getsourcefile(module) + if source_path.endswith("__init__.py"): + source_path = os.path.dirname(source_path) + return os.path.realpath(source_path) + + + + +## ... source file abbreviated to get to mark_safe examples ... + + +def tidy_stacktrace(stack): + trace = [] + for frame, path, line_no, func_name, text in (f[:5] for f in stack): + if omit_path(os.path.realpath(path)): + continue + text = "".join(text).strip() if text else "" + frame_locals = ( + frame.f_locals + if dt_settings.get_config()["ENABLE_STACKTRACES_LOCALS"] + else None + ) + trace.append((path, line_no, func_name, text, frame_locals)) + return trace + + +def render_stacktrace(trace): + stacktrace = [] + for frame in trace: + params = (v for v in chain(frame[0].rsplit(os.path.sep, 1), frame[1:])) + params_dict = {str(idx): v for idx, v in enumerate(params)} + try: + stacktrace.append(params_dict) + except KeyError: + continue + +~~ return mark_safe( + render_to_string( + "debug_toolbar/panels/sql_stacktrace.html", + { + "stacktrace": stacktrace, + "show_locals": dt_settings.get_config()["ENABLE_STACKTRACES_LOCALS"], + }, + ) + ) + + +def get_template_info(): + template_info = None + cur_frame = sys._getframe().f_back + try: + while cur_frame is not None: + in_utils_module = cur_frame.f_code.co_filename.endswith( + "/debug_toolbar/utils.py" + ) + is_get_template_context = ( + cur_frame.f_code.co_name == get_template_context.__name__ + ) + if in_utils_module and is_get_template_context: + break + elif cur_frame.f_code.co_name == "render": + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 5 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / templatetags / highlighting.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/templatetags/highlighting.py) + +```python +# highlighting.py + +from django import template +from django.template import ( + Context, Node, Template, TemplateSyntaxError, Variable, +) +from django.template.defaultfilters import stringfilter +~~from django.utils.safestring import mark_safe + +try: + from pygments import highlight as pyghighlight + from pygments.lexers import get_lexer_by_name + from pygments.formatters import HtmlFormatter + HAS_PYGMENTS = True +except ImportError: # pragma: no cover + HAS_PYGMENTS = False + +register = template.Library() + + +@register.filter(is_safe=True) +@stringfilter +def parse_template(value): +~~ return mark_safe(Template(value).render(Context())) + + +class CodeNode(Node): + def __init__(self, language, nodelist, name=''): + self.language = Variable(language) + self.nodelist = nodelist + if name: + self.name = Variable(name) + else: + self.name = None + + def render(self, context): + code = self.nodelist.render(context).strip() + lexer = get_lexer_by_name(self.language.resolve(context)) + formatter = HtmlFormatter(linenos=False) + html = "" + if self.name: + name = self.name.resolve(context) + html = '
    %s
    ' % name + return html + pyghighlight(code, lexer, formatter) + + +@register.tag +def highlight(parser, token): + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 6 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / fileadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/fileadmin.py) + +```python +# fileadmin.py +from __future__ import absolute_import + +from django import forms +from django.contrib.admin.utils import unquote +from django.http import HttpResponseRedirect +from django.urls import reverse +~~from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ + +from .. import settings +from ..models import File +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import AdminContext, admin_url_params_encoded, popup_status + + +class FileAdminChangeFrom(forms.ModelForm): + class Meta(object): + model = File + exclude = () + + +class FileAdmin(PrimitivePermissionAwareModelAdmin): + list_display = ('label',) + list_per_page = 10 + search_fields = ['name', 'original_filename', 'sha1', 'description'] + raw_id_fields = ('owner',) + readonly_fields = ('sha1', 'display_canonical') + + form = FileAdminChangeFrom + + @classmethod + + +## ... source file abbreviated to get to mark_safe examples ... + + + if parent_folder: + url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': parent_folder.id}) + else: + url = reverse('admin:filer-directory_listing-unfiled_images') + url = "{0}{1}".format( + url, + admin_url_params_encoded(request) + ) + return HttpResponseRedirect(url) + + return super(FileAdmin, self).delete_view( + request=request, object_id=object_id, + extra_context=extra_context) + + def get_model_perms(self, request): + return { + 'add': False, + 'change': False, + 'delete': False, + } + + def display_canonical(self, instance): + canonical = instance.canonical_url + if canonical: +~~ return mark_safe('%s' % (canonical, canonical)) + else: + return '-' + display_canonical.allow_tags = True + display_canonical.short_description = _('canonical URL') + + +FileAdmin.fieldsets = FileAdmin.build_fieldsets() + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 7 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / widgets.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./widgets.py) + +```python +# widgets.py +from collections.abc import Iterable +from copy import deepcopy +from itertools import chain +from re import search, sub + +from django import forms +from django.db.models.fields import BLANK_CHOICE_DASH +from django.forms.utils import flatatt +from django.utils.datastructures import MultiValueDict +from django.utils.encoding import force_str +from django.utils.http import urlencode +~~from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _ + + +class LinkWidget(forms.Widget): + def __init__(self, attrs=None, choices=()): + super().__init__(attrs) + + self.choices = choices + + def value_from_datadict(self, data, files, name): + value = super().value_from_datadict(data, files, name) + self.data = data + return value + + def render(self, name, value, attrs=None, choices=(), renderer=None): + if not hasattr(self, 'data'): + self.data = {} + if value is None: + value = '' + final_attrs = self.build_attrs(self.attrs, extra_attrs=attrs) + output = ['' % flatatt(final_attrs)] + options = self.render_options(choices, [value], name) + if options: + output.append(options) + output.append('') +~~ return mark_safe('\n'.join(output)) + + def render_options(self, choices, selected_choices, name): + selected_choices = set(force_str(v) for v in selected_choices) + output = [] + for option_value, option_label in chain(self.choices, choices): + if isinstance(option_label, (list, tuple)): + for option in option_label: + output.append( + self.render_option(name, selected_choices, *option)) + else: + output.append( + self.render_option(name, selected_choices, + option_value, option_label)) + return '\n'.join(output) + + def render_option(self, name, selected_choices, + option_value, option_label): + option_value = force_str(option_value) + if option_label == BLANK_CHOICE_DASH[0][1]: + option_label = _("All") + data = self.data.copy() + data[name] = option_value + selected = data == self.data or option_value in selected_choices + try: + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 8 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / widgets.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./widgets.py) + +```python +# widgets.py +import datetime +import re +from itertools import chain + +import django +from django import forms +from django.conf import settings +from django.forms.widgets import FILE_INPUT_CONTRADICTION +from django.template import loader +from django.utils import datetime_safe, formats +from django.utils.dates import MONTHS +from django.utils.encoding import force_str +from django.utils.html import conditional_escape +~~from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ + +from .compat import MULTIVALUE_DICT_TYPES, flatten_contexts + + +from django.forms.utils import to_current_timezone + + +RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$') + + +__all__ = ( + 'TextInput', 'PasswordInput', 'HiddenInput', 'ClearableFileInput', + 'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', + 'CheckboxInput', 'Select', 'NullBooleanSelect', 'SelectMultiple', + 'RadioSelect', 'CheckboxSelectMultiple', 'SearchInput', 'RangeInput', + 'ColorInput', 'EmailInput', 'URLInput', 'PhoneNumberInput', 'NumberInput', + 'IPAddressInput', 'MultiWidget', 'Widget', 'SplitDateTimeWidget', + 'SplitHiddenDateTimeWidget', 'MultipleHiddenInput', 'SelectDateWidget', + 'SlugInput', +) + + +class Widget(forms.Widget): + + +## ... source file abbreviated to get to mark_safe examples ... + + + +class HiddenInput(Input): + template_name = 'floppyforms/hidden.html' + input_type = 'hidden' + + +class MultipleHiddenInput(HiddenInput): + def __init__(self, attrs=None, choices=()): + super(MultipleHiddenInput, self).__init__(attrs) + self.choices = choices + + def render(self, name, value, attrs=None, choices=(), renderer=None): + if value is None: + value = [] + + final_attrs = self.build_attrs(attrs) + id_ = final_attrs.get('id', None) + inputs = [] + for i, v in enumerate(value): + input_attrs = final_attrs.copy() + if id_: + input_attrs['id'] = '%s_%s' % (id_, i) + input_ = HiddenInput() + input_.is_required = self.is_required + inputs.append(input_.render(name, force_str(v), input_attrs, renderer=renderer)) +~~ return mark_safe("\n".join(inputs)) + + def value_from_datadict(self, data, files, name): + if isinstance(data, MULTIVALUE_DICT_TYPES): + return data.getlist(name) + return data.get(name, None) + + +class SlugInput(TextInput): + template_name = 'floppyforms/slug.html' + + def get_context(self, name, value, attrs): + context = super(SlugInput, self).get_context(name, value, attrs) + context['attrs']['pattern'] = r"[-\w]+" + return context + + +class IPAddressInput(TextInput): + template_name = 'floppyforms/ipaddress.html' + + ip_pattern = (r"(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25" + r"[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}") + + def get_context(self, name, value, attrs): + context = super(IPAddressInput, self).get_context(name, value, attrs) + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 9 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / resources.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./resources.py) + +```python +# resources.py +import functools +import logging +import tablib +import traceback +from collections import OrderedDict +from copy import deepcopy + +from diff_match_patch import diff_match_patch + +import django +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.management.color import no_style +from django.core.paginator import Paginator +from django.db import DEFAULT_DB_ALIAS, connections +from django.db.models.fields.related import ForeignObjectRel +from django.db.models.query import QuerySet +from django.db.transaction import ( + TransactionManagementError, + atomic, + savepoint, + savepoint_commit, + savepoint_rollback +) +from django.utils.encoding import force_str +~~from django.utils.safestring import mark_safe + +from . import widgets +from .fields import Field +from .instance_loaders import ModelInstanceLoader +from .results import Error, Result, RowResult +from .utils import atomic_if_using_transaction + +if django.VERSION[0] >= 3: + from django.core.exceptions import FieldDoesNotExist +else: + from django.db.models.fields import FieldDoesNotExist + + +logger = logging.getLogger(__name__) +logger.addHandler(logging.NullHandler()) + +USE_TRANSACTIONS = getattr(settings, 'IMPORT_EXPORT_USE_TRANSACTIONS', True) +CHUNK_SIZE = getattr(settings, 'IMPORT_EXPORT_CHUNK_SIZE', 1) + + +def get_related_model(field): + if hasattr(field, 'related_model'): + return field.related_model + if field.rel: + + +## ... source file abbreviated to get to mark_safe examples ... + + + if not option.startswith('_')]: + setattr(meta, option, getattr(options, option)) + new_class._meta = meta + + return new_class + + +class Diff: + def __init__(self, resource, instance, new): + self.left = self._export_resource_fields(resource, instance) + self.right = [] + self.new = new + + def compare_with(self, resource, instance, dry_run=False): + self.right = self._export_resource_fields(resource, instance) + + def as_html(self): + data = [] + dmp = diff_match_patch() + for v1, v2 in zip(self.left, self.right): + if v1 != v2 and self.new: + v1 = "" + diff = dmp.diff_main(force_str(v1), force_str(v2)) + dmp.diff_cleanupSemantic(diff) + html = dmp.diff_prettyHtml(diff) +~~ html = mark_safe(html) + data.append(html) + return data + + def _export_resource_fields(self, resource, instance): + return [resource.export_field(f, instance) if instance else "" for f in resource.get_user_visible_fields()] + + +class Resource(metaclass=DeclarativeMetaclass): + + def __init__(self): + self.fields = deepcopy(self.fields) + + self.create_instances = list() + self.update_instances = list() + self.delete_instances = list() + + @classmethod + def get_result_class(self): + return Result + + @classmethod + def get_row_result_class(self): + return RowResult + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 10 from django-inline-actions +[django-inline-actions](https://github.com/escaped/django-inline-actions) +([PyPI package information](https://pypi.org/project/django-inline-actions/)) +is an extension that adds actions to the [Django](/django.html) +Admin InlineModelAdmin and ModelAdmin changelists. The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/escaped/django-inline-actions/blob/master/LICENSE). + +[**django-inline-actions / inline_actions / admin.py**](https://github.com/escaped/django-inline-actions/blob/master/inline_actions/./admin.py) + +```python +# admin.py +from django.apps import apps +from django.contrib import admin +from django.http import HttpResponse +from django.shortcuts import redirect +from django.urls import reverse +~~from django.utils.safestring import mark_safe +from django.utils.text import capfirst +from django.utils.translation import ugettext_lazy as _ + + +class InlineActionException(Exception): + pass + + +class ActionNotCallable(InlineActionException): + def __init__(self, model_admin, action, *args, **kwargs): + super().__init__(*args, **kwargs) + self.model_admin = model_admin + self.action = action + + +class BaseInlineActionsMixin: + INLINE_MODEL_ADMIN = 'inline' + MODEL_ADMIN = 'admin' + + inline_actions = [] + + def get_inline_actions(self, request, obj=None): + if self.inline_actions is None: + return [] + + +## ... source file abbreviated to get to mark_safe examples ... + + + css_handler = getattr( + self, 'get_{}_css'.format(action_name), None) + if callable(css_handler): + css_classes = css_handler(obj=obj) + else: + try: + css_classes = action_func.css_classes + except AttributeError: + css_classes = '' + + action_data = [ + self.__class__.__name__.lower(), + self._get_admin_type(), + action_name, + obj._meta.app_label, + obj._meta.model_name, + str(obj.pk), + ] + buttons.append( + ''.format( + '_action__{}'.format('__'.join(action_data)), + description, + css_classes, + ) + ) +~~ return mark_safe('
    {}
    '.format( + ''.join(buttons) + )) + render_inline_actions.short_description = _("Actions") + render_inline_actions.allow_tags = True + + +class InlineActionsMixin(BaseInlineActionsMixin): + def render_inline_actions(self, obj=None): + html = super().render_inline_actions(obj=obj) +~~ return mark_safe('

    {}

    '.format(html)) + + render_inline_actions.short_description = _("Actions") + render_inline_actions.allow_tags = True + + def get_fields(self, request, obj=None): + self._request = request + + fields = super().get_fields(request, obj) + if self.inline_actions is not None: # is it explicitly disabled? + fields = list(fields) + if 'render_inline_actions' not in fields: + fields.append('render_inline_actions') + return fields + + +class InlineActionsModelAdminMixin(BaseInlineActionsMixin): + class Media: + css = { + "all": ( + "inline_actions/css/inline_actions.css", + ) + } + + def get_list_display(self, request): + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 11 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / templatetags / jet_tags.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/templatetags/jet_tags.py) + +```python +# jet_tags.py +from __future__ import unicode_literals +import json +import os +from django import template +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +from django.forms import CheckboxInput, ModelChoiceField, Select, ModelMultipleChoiceField, SelectMultiple +from django.contrib.admin.widgets import RelatedFieldWidgetWrapper +from django.utils.formats import get_format +~~from django.utils.safestring import mark_safe +from django.utils.encoding import smart_text +from jet import settings, VERSION +from jet.models import Bookmark +from jet.utils import get_model_instance_label, get_model_queryset, get_possible_language_codes, \ + get_admin_site, get_menu_items + +try: + from urllib.parse import parse_qsl +except ImportError: + from urlparse import parse_qsl + + +register = template.Library() +assignment_tag = register.assignment_tag if hasattr(register, 'assignment_tag') else register.simple_tag + + +@assignment_tag +def jet_get_date_format(): + return get_format('DATE_INPUT_FORMATS')[0] + + +@assignment_tag +def jet_get_time_format(): + return get_format('TIME_INPUT_FORMATS')[0] + + +## ... source file abbreviated to get to mark_safe examples ... + + + return jet_sibling_object(context, False) + + +@assignment_tag(takes_context=True) +def jet_next_object(context): + return jet_sibling_object(context, True) + + +@assignment_tag(takes_context=True) +def jet_popup_response_data(context): + if context.get('popup_response_data'): + return context['popup_response_data'] + + return json.dumps({ + 'action': context.get('action'), + 'value': context.get('value') or context.get('pk_value'), + 'obj': smart_text(context.get('obj')), + 'new_value': context.get('new_value') + }) + + +@assignment_tag(takes_context=True) +def jet_delete_confirmation_context(context): + if context.get('deletable_objects') is None and context.get('deleted_objects') is None: + return '' +~~ return mark_safe('

    ') + + +@assignment_tag +def jet_static_translation_urls(): + language_codes = get_possible_language_codes() + + urls = [] + url_templates = [ + 'jet/js/i18n/jquery-ui/datepicker-__LANGUAGE_CODE__.js', + 'jet/js/i18n/jquery-ui-timepicker/jquery.ui.timepicker-__LANGUAGE_CODE__.js', + 'jet/js/i18n/select2/__LANGUAGE_CODE__.js' + ] + + static_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'static') + + for tpl in url_templates: + for language_code in language_codes: + url = tpl.replace('__LANGUAGE_CODE__', language_code) + path = os.path.join(static_dir, url) + + if os.path.exists(path): + urls.append(url) + break + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 12 from django-markdown-view +[django-markdown-view](https://github.com/rgs258/django-markdown-view) +([PyPI package information](https://pypi.org/project/django-markdown-view/)) +is a Django extension for serving [Markdown](/markdown.html) files as +[Django templates](/django-templates.html). The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/rgs258/django-markdown-view/blob/master/LICENSE). + +[**django-markdown-view / markdown_view / views.py**](https://github.com/rgs258/django-markdown-view/blob/master/markdown_view/./views.py) + +```python +# views.py +import logging + +import markdown +from django.conf import settings +from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin +from django.template import Engine, Template, Context +from django.template.loader import render_to_string +~~from django.utils.safestring import mark_safe +from django.views.generic import TemplateView +from markdown_view.constants import ( + DEFAULT_MARKDOWN_VIEW_LOADERS, + DEFAULT_MARKDOWN_VIEW_EXTENSIONS, DEFAULT_MARKDOWN_VIEW_TEMPLATE, + DEFAULT_MARKDOWN_VIEW_USE_REQUEST_CONTEXT, DEFAULT_MARKDOWN_VIEW_EXTRA_CONTEXT, +) + +logger = logging.getLogger(__name__) + + +class MarkdownView(TemplateView): + file_name = None + + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(*args, **kwargs) + if self.file_name: + engine = Engine(loaders=getattr( + settings, "MARKDOWN_VIEW_LOADERS", DEFAULT_MARKDOWN_VIEW_LOADERS) + ) + template = engine.get_template(self.file_name) + md = markdown.Markdown(extensions=getattr( + settings, + "MARKDOWN_VIEW_EXTENSIONS", + DEFAULT_MARKDOWN_VIEW_EXTENSIONS + )) + template = Template( + "{{% load static %}}{}".format(md.convert(template.source)) + ) + render_context_base = {} + if getattr( + settings, + "MARKDOWN_VIEW_USE_REQUEST_CONTEXT", + DEFAULT_MARKDOWN_VIEW_USE_REQUEST_CONTEXT + ): + render_context_base = context + render_context = Context({ + **render_context_base, + **(getattr( + settings, + "MARKDOWN_VIEW_EXTRA_CONTEXT", + DEFAULT_MARKDOWN_VIEW_EXTRA_CONTEXT + )) + }) + context.update({ +~~ "markdown_content": mark_safe(template.render(render_context)), +~~ "markdown_toc": mark_safe(md.toc), +~~ "page_title": mark_safe(md.toc_tokens[0]['name']), + }) + return context + + template_name = getattr( + settings, + "MARKDOWN_VIEW_TEMPLATE", + DEFAULT_MARKDOWN_VIEW_TEMPLATE + ) + + +class LoggedInMarkdownView(LoginRequiredMixin, MarkdownView): + pass + + +class StaffMarkdownView(UserPassesTestMixin, MarkdownView): + def test_func(self): + return self.request.user.is_active and self.request.user.is_staff + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 13 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / templatetags / mongonaut_tags.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/templatetags/mongonaut_tags.py) + +```python +# mongonaut_tags.py + +from django import template +from django.urls import reverse +~~from django.utils.safestring import mark_safe + +from bson.objectid import ObjectId +from mongoengine import Document +from mongoengine.fields import URLField + +register = template.Library() + + +@register.simple_tag() +def get_document_value(document, key): + value = getattr(document, key) + if isinstance(value, ObjectId): + return value + + if isinstance(document._fields.get(key), URLField): +~~ return mark_safe("""{1}""".format(value, value)) + + if isinstance(value, Document): + app_label = value.__module__.replace(".models", "") + document_name = value._class_name + url = reverse( + "document_detail", + kwargs={'app_label': app_label, 'document_name': document_name, + 'id': value.id}) +~~ return mark_safe("""{1}""".format(url, value)) + + return value + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 14 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / templatetags / pipeline.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/templatetags/pipeline.py) + +```python +# pipeline.py +import logging +import subprocess + +from django.contrib.staticfiles.storage import staticfiles_storage + +from django import template +from django.template.base import Context, VariableDoesNotExist +from django.template.loader import render_to_string +~~from django.utils.safestring import mark_safe + +from ..collector import default_collector +from ..conf import settings +from ..exceptions import CompilerError +from ..packager import Packager, PackageNotFound +from ..utils import guess_type + +logger = logging.getLogger(__name__) + +register = template.Library() + + +class PipelineMixin(object): + request = None + _request_var = None + + @property + def request_var(self): + if not self._request_var: + self._request_var = template.Variable('request') + return self._request_var + + def package_for(self, package_name, package_type): + package = { + + +## ... source file abbreviated to get to mark_safe examples ... + + + 'command': subprocess.list2cmdline(e.command), + 'errors': e.error_output, + }) + + +class StylesheetNode(PipelineMixin, template.Node): + def __init__(self, name): + self.name = name + + def render(self, context): + super(StylesheetNode, self).render(context) + package_name = template.Variable(self.name).resolve(context) + + try: + package = self.package_for(package_name, 'css') + except PackageNotFound: + logger.warn("Package %r is unknown. Check PIPELINE['STYLESHEETS'] in your settings.", package_name) + return '' # fail silently, do not return anything if an invalid group is specified + return self.render_compressed(package, package_name, 'css') + + def render_css(self, package, path): + template_name = package.template_name or "pipeline/css.html" + context = package.extra_context + context.update({ + 'type': guess_type(path, 'text/css'), +~~ 'url': mark_safe(staticfiles_storage.url(path)) + }) + return render_to_string(template_name, context) + + def render_individual_css(self, package, paths, **kwargs): + tags = [self.render_css(package, path) for path in paths] + return '\n'.join(tags) + + def render_error_css(self, package_name, e): + return super(StylesheetNode, self).render_error( + 'CSS', package_name, e) + + +class JavascriptNode(PipelineMixin, template.Node): + def __init__(self, name): + self.name = name + + def render(self, context): + super(JavascriptNode, self).render(context) + package_name = template.Variable(self.name).resolve(context) + + try: + package = self.package_for(package_name, 'js') + except PackageNotFound: + logger.warn("Package %r is unknown. Check PIPELINE['JAVASCRIPT'] in your settings.", package_name) + return '' # fail silently, do not return anything if an invalid group is specified + return self.render_compressed(package, package_name, 'js') + + def render_js(self, package, path): + template_name = package.template_name or "pipeline/js.html" + context = package.extra_context + context.update({ + 'type': guess_type(path, 'text/javascript'), +~~ 'url': mark_safe(staticfiles_storage.url(path)) + }) + return render_to_string(template_name, context) + + def render_inline(self, package, js): + context = package.extra_context + context.update({ + 'source': js + }) + return render_to_string("pipeline/inline_js.html", context) + + def render_individual_js(self, package, paths, templates=None): + tags = [self.render_js(package, js) for js in paths] + if templates: + tags.append(self.render_inline(package, templates)) + return '\n'.join(tags) + + def render_error_js(self, package_name, e): + return super(JavascriptNode, self).render_error( + 'JavaScript', package_name, e) + + +@register.tag +def stylesheet(parser, token): + try: + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 15 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / templatetags / rest_framework.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/templatetags/rest_framework.py) + +```python +# rest_framework.py +import re +from collections import OrderedDict + +from django import template +from django.template import loader +from django.urls import NoReverseMatch, reverse +from django.utils.encoding import force_str, iri_to_uri +from django.utils.html import escape, format_html, smart_urlquote +~~from django.utils.safestring import SafeData, mark_safe + +from rest_framework.compat import apply_markdown, pygments_highlight +from rest_framework.renderers import HTMLFormRenderer +from rest_framework.utils.urls import replace_query_param + +register = template.Library() + +class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])') + + +@register.tag(name='code') +def highlight_code(parser, token): + code = token.split_contents()[-1] + nodelist = parser.parse(('endcode',)) + parser.delete_first_token() + return CodeNode(code, nodelist) + + +class CodeNode(template.Node): + style = 'emacs' + + def __init__(self, lang, code): + self.lang = lang + self.nodelist = code + + +## ... source file abbreviated to get to mark_safe examples ... + + + text = self.nodelist.render(context) + return pygments_highlight(text, self.lang, self.style) + + +@register.filter() +def with_location(fields, location): + return [ + field for field in fields + if field.location == location + ] + + +@register.simple_tag +def form_for_link(link): + import coreschema + properties = OrderedDict([ + (field.name, field.schema or coreschema.String()) + for field in link.fields + ]) + required = [ + field.name + for field in link.fields + if field.required + ] + schema = coreschema.Object(properties=properties, required=required) +~~ return mark_safe(coreschema.render_to_form(schema)) + + +@register.simple_tag +def render_markdown(markdown_text): + if apply_markdown is None: + return markdown_text +~~ return mark_safe(apply_markdown(markdown_text)) + + +@register.simple_tag +def get_pagination_html(pager): + return pager.to_html() + + +@register.simple_tag +def render_form(serializer, template_pack=None): + style = {'template_pack': template_pack} if template_pack else {} + renderer = HTMLFormRenderer() + return renderer.render(serializer.data, None, {'style': style}) + + +@register.simple_tag +def render_field(field, style): + renderer = style.get('renderer', HTMLFormRenderer()) + return renderer.render_field(field, style) + + +@register.simple_tag +def optional_login(request): + try: + login_url = reverse('rest_framework:login') + except NoReverseMatch: + return '' + + snippet = "
  • Log in
  • " + snippet = format_html(snippet, href=login_url, next=escape(request.path)) + +~~ return mark_safe(snippet) + + +@register.simple_tag +def optional_docs_login(request): + try: + login_url = reverse('rest_framework:login') + except NoReverseMatch: + return 'log in' + + snippet = "log in" + snippet = format_html(snippet, href=login_url, next=escape(request.path)) + +~~ return mark_safe(snippet) + + +@register.simple_tag +def optional_logout(request, user): + try: + logout_url = reverse('rest_framework:logout') + except NoReverseMatch: + snippet = format_html('', user=escape(user)) +~~ return mark_safe(snippet) + + snippet = """""" + snippet = format_html(snippet, user=escape(user), href=logout_url, next=escape(request.path)) + +~~ return mark_safe(snippet) + + +@register.simple_tag +def add_query_param(request, key, val): + iri = request.get_full_path() + uri = iri_to_uri(iri) + return escape(replace_query_param(uri, key, val)) + + +@register.filter +def as_string(value): + if value is None: + return '' + return '%s' % value + + +@register.filter +def as_list_of_strings(value): + return [ + '' if (item is None) else ('%s' % item) + for item in value + ] + + +@register.filter +def add_class(value, css_class): + html = str(value) + match = class_re.search(html) + if match: + m = re.search(r'^%s$|^%s\s|\s%s\s|\s%s$' % (css_class, css_class, + css_class, css_class), + match.group(1)) + if not m: +~~ return mark_safe(class_re.sub(match.group(1) + " " + css_class, + html)) + else: +~~ return mark_safe(html.replace('>', ' class="%s">' % css_class, 1)) + return value + + +@register.filter +def format_value(value): + if getattr(value, 'is_hyperlink', False): + name = str(value.obj) +~~ return mark_safe('%s' % (value, escape(name))) + if value is None or isinstance(value, bool): +~~ return mark_safe('%s' % {True: 'true', False: 'false', None: 'null'}[value]) + elif isinstance(value, list): + if any([isinstance(item, (list, dict)) for item in value]): + template = loader.get_template('rest_framework/admin/list_value.html') + else: + template = loader.get_template('rest_framework/admin/simple_list_value.html') + context = {'value': value} + return template.render(context) + elif isinstance(value, dict): + template = loader.get_template('rest_framework/admin/dict_value.html') + context = {'value': value} + return template.render(context) + elif isinstance(value, str): + if ( + (value.startswith('http:') or value.startswith('https:')) and not + re.search(r'\s', value) + ): +~~ return mark_safe('{value}'.format(value=escape(value))) + elif '@' in value and not re.search(r'\s', value): +~~ return mark_safe('{value}'.format(value=escape(value))) + elif '\n' in value: +~~ return mark_safe('
    %s
    ' % escape(value)) + return str(value) + + +@register.filter +def items(value): + if value is None: + return [] + return value.items() + + +@register.filter +def data(value): + return value.data + + +@register.filter +def schema_links(section, sec_key=None): + NESTED_FORMAT = '%s > %s' # this format is used in docs/js/api.js:normalizeKeys + links = section.links + if section.data: + data = section.data.items() + for sub_section_key, sub_section in data: + new_links = schema_links(sub_section, sec_key=sub_section_key) + links.update(new_links) + + +## ... source file abbreviated to get to mark_safe examples ... + + + url = None + nofollow_attr = ' rel="nofollow"' if nofollow else '' + if simple_url_re.match(middle): + url = smart_urlquote_wrapper(middle) + elif simple_url_2_re.match(middle): + url = smart_urlquote_wrapper('http://%s' % middle) + elif ':' not in middle and simple_email_re.match(middle): + local, domain = middle.rsplit('@', 1) + try: + domain = domain.encode('idna').decode('ascii') + except UnicodeError: + continue + url = 'mailto:%s@%s' % (local, domain) + nofollow_attr = '' + + if url: + trimmed = trim_url(middle) + lead, trail = conditional_escape(lead), conditional_escape(trail) + url, trimmed = conditional_escape(url), conditional_escape(trimmed) + middle = '%s' % (url, nofollow_attr, trimmed) + words[i] = '%s%s%s' % (lead, middle, trail) + else: + words[i] = conditional_escape(word) + else: + words[i] = conditional_escape(word) +~~ return mark_safe(''.join(words)) + + +@register.filter +def break_long_headers(header): + if len(header) > 160 and ',' in header: +~~ header = mark_safe('
    ' + ',
    '.join(header.split(','))) + return header + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 16 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / fields.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./fields.py) + +```python +# fields.py +from typing import Optional + +from django import template +from django.template.base import Parser, Token +from django.forms import ChoiceField +~~from django.utils.safestring import mark_safe + +from .compat import TOKEN_BLOCK +from .templatetags.sitetree import sitetree_tree +from .utils import get_tree_model, get_tree_item_model +from .settings import ITEMS_FIELD_ROOT_ID + +if False: # pragma: nocover + from .models import TreeItemBase, TreeBase # noqa + + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + +class TreeItemChoiceField(ChoiceField): + template: str = 'admin/sitetree/tree/tree_combo.html' + root_title: str = '---------' + + def __init__( + self, + tree: 'TreeBase' = None, + required: bool = True, + widget=None, + label=None, + + +## ... source file abbreviated to get to mark_safe examples ... + + + if not tree: + return + + if isinstance(tree, MODEL_TREE_CLASS): + tree = tree.alias + + self.tree = tree + self.choices = self._build_choices() + + def _build_choices(self): + tree_token = f'sitetree_tree from "{self.tree}" template "{self.template}"' + + context_kwargs = {'current_app': 'admin'} + context = template.Context(context_kwargs) + context.update({'request': object()}) + + choices_str = sitetree_tree( + Parser(None), Token(token_type=TOKEN_BLOCK, contents=tree_token) + ).render(context) + + tree_choices = [(ITEMS_FIELD_ROOT_ID, self.root_title)] + + for line in choices_str.splitlines(): + if line.strip(): + splitted = line.split(':::') +~~ tree_choices.append((splitted[0], mark_safe(splitted[1]))) + + return tree_choices + + def clean(self, value): + if not value: + return None + + try: + return MODEL_TREE_ITEM_CLASS.objects.get(pk=value) + + except MODEL_TREE_ITEM_CLASS.DoesNotExist: + return None + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 17 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / checkboxcolumn.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/checkboxcolumn.py) + +```python +# checkboxcolumn.py +~~from django.utils.safestring import mark_safe + +from django_tables2.utils import Accessor, AttributeDict + +from .base import Column, library + + +@library.register +class CheckBoxColumn(Column): + + def __init__(self, attrs=None, checked=None, **extra): + self.checked = checked + kwargs = {"orderable": False, "attrs": attrs} + kwargs.update(extra) + super().__init__(**kwargs) + + @property + def header(self): + default = {"type": "checkbox"} + general = self.attrs.get("input") + specific = self.attrs.get("th__input") + attrs = AttributeDict(default, **(specific or general or {})) +~~ return mark_safe("" % attrs.as_html()) + + def render(self, value, bound_column, record): + default = {"type": "checkbox", "name": bound_column.name, "value": value} + if self.is_checked(value, record): + default.update({"checked": "checked"}) + + general = self.attrs.get("input") + specific = self.attrs.get("td__input") + attrs = AttributeDict(default, **(specific or general or {})) +~~ return mark_safe("" % attrs.as_html()) + + def is_checked(self, value, record): + if self.checked is None: + return False + if self.checked is True: + return True + + if callable(self.checked): + return bool(self.checked(value, record)) + + checked = Accessor(self.checked) + if checked in record: + return bool(record[checked]) + return False + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 18 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms.py) + +```python +# forms.py + "WikiSlugField", + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", + "TextInputPrepend", + "CreateForm", + "DeleteForm", + "PermissionsForm", + "DirFilterForm", + "SearchForm", +] + +from datetime import timedelta + +from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model +from django.core import validators +from django.core.validators import RegexValidator +from django.forms.widgets import HiddenInput +from django.shortcuts import get_object_or_404 +from django.urls import Resolver404, resolve +from django.utils import timezone +~~from django.utils.safestring import mark_safe +from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.plugins.base import PluginSettingsFormMixin +from wiki.editors import getEditor + +from .forms_account_handling import UserCreationForm, UserUpdateForm + +validate_slug_numbers = RegexValidator( + r"^[0-9]+$", + _("A 'slug' cannot consist solely of numbers."), + "invalid", + inverse_match=True, +) + + +class WikiSlugField(forms.CharField): + + default_validators = [validators.validate_slug, validate_slug_numbers] + + def __init__(self, *args, **kwargs): + self.allow_unicode = kwargs.pop("allow_unicode", False) + + +## ... source file abbreviated to get to mark_safe examples ... + + + self.check_spam() + return self.cleaned_data + + +class SelectWidgetBootstrap(forms.Select): + + def __init__(self, attrs=None, choices=()): + if attrs is None: + attrs = {"class": ""} + elif "class" not in attrs: + attrs["class"] = "" + attrs["class"] += " form-control" + + super().__init__(attrs, choices) + + +class TextInputPrepend(forms.TextInput): + template_name = "wiki/forms/text.html" + + def __init__(self, *args, **kwargs): + self.prepend = kwargs.pop("prepend", "") + super().__init__(*args, **kwargs) + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) +~~ context["prepend"] = mark_safe(self.prepend) + return context + + +class CreateForm(forms.Form, SpamProtectionMixin): + def __init__(self, request, urlpath_parent, *args, **kwargs): + super().__init__(*args, **kwargs) + self.request = request + self.urlpath_parent = urlpath_parent + + title = forms.CharField(label=_("Title"),) + slug = WikiSlugField( + label=_("Slug"), + help_text=_( + "This will be the address where your article can be found. Use only alphanumeric characters and - or _.
    Note: If you change the slug later on, links pointing to this article are not updated." + ), + max_length=models.URLPath.SLUG_MAX_LENGTH, + ) + content = forms.CharField( + label=_("Contents"), required=False, widget=getEditor().get_widget() + ) # @UndefinedVariable + + summary = forms.CharField( + label=pgettext_lazy("Revision comment", "Summary"), + help_text=_("Write a brief message for the article's history log."), + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 19 from elasticsearch-django +[elasticsearch-django](https://github.com/yunojuno/elasticsearch-django) +([PyPI package information](https://pypi.org/project/elasticsearch-django/)) +is a [Django](/django.html) app for managing +[ElasticSearch](https://github.com/elastic/elasticsearch) indexes +populated by [Django ORM](/django-orm.html) models. The project is +available as open source under the +[MIT license](https://github.com/yunojuno/elasticsearch-django/blob/master/LICENSE). + +[**elasticsearch-django / elasticsearch_django / admin.py**](https://github.com/yunojuno/elasticsearch-django/blob/master/elasticsearch_django/./admin.py) + +```python +# admin.py +import logging + +import simplejson as json # simplejson supports Decimal serialization +from django.contrib import admin +from django.template.defaultfilters import truncatechars, truncatewords +~~from django.utils.safestring import mark_safe + +from .models import SearchQuery + +logger = logging.getLogger(__name__) + + +def pprint(data: dict) -> str: + pretty = json.dumps(data, sort_keys=True, indent=4, separators=(",", ": ")) + html = pretty.replace(" ", " ").replace("\n", "
    ") +~~ return mark_safe("%s" % html) + + +class SearchQueryAdmin(admin.ModelAdmin): + + list_display = ( + "id", + "user", + "search_terms_", + "total_hits", + "returned_", + "min_", + "max_", + "reference", + "executed_at", + ) + list_filter = ("index", "query_type") + search_fields = ("search_terms", "user__first_name", "user__last_name", "reference") + exclude = ("hits", "query", "page") + readonly_fields = ( + "user", + "index", + "search_terms", + "query_type", + "total_hits", + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 20 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / forms.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./forms.py) + +```python +# forms.py +from __future__ import unicode_literals + +import logging +import re +import collections +import datetime + +import django.forms +import django.forms.utils +import django.forms.widgets +import django.core.validators +import django.core.exceptions +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +~~from django.utils.safestring import mark_safe + +import form_utils.forms +import requests +import dateutil.parser +import validate_email + +logger = logging.getLogger(__name__) + + +REGISTRATION_CONFIGURATION_NAME = 'registration_configuration' + +RE_NON_DECIMAL = re.compile(r'[^\d]+') +RE_NON_ALPHA = re.compile('[\W]+') +RE_POSTAL_CODE = re.compile(r'^[0-9]{5}$') +validate_postal_code = django.core.validators.RegexValidator( + RE_POSTAL_CODE, _("Enter a valid postal code consisting 5 numbers."), 'invalid') + + +CHOICES_GENDER = ( + ('M', _('Male')), + ('F', _('Female')), +) + + + + +## ... source file abbreviated to get to mark_safe examples ... + + + + d = { + 'label': label, + } + + if field_type == 'string': + d['required'] = is_required + d['initial'] = initial + if choices and is_editable: + d['help_text'] = help_text + d['choices'] = choices + d['widget'] = django.forms.RadioSelect + field_class = django.forms.ChoiceField + elif field_name == 'email': + d['max_length'] = max_length + d['help_text'] = help_text + field_class = django.forms.EmailField + elif field_name == 'license_id' \ + and 'license_id_formats' in conf: + d['max_length'] = max_length + license_id_formats = '{}{}{}'.format( + _('

    Valid state License IDs should look like: '), + ', '.join(map(unicode, conf['license_id_formats'])), '

    ') + help_text = '{}{}{}'.format('

    ', unicode(help_text), '

    ') + license_id_formats = '{}{}'.format(license_id_formats, help_text) +~~ d['help_text'] = mark_safe(license_id_formats) + field_class = django.forms.CharField + else: + d['max_length'] = max_length + d['help_text'] = help_text + field_class = django.forms.CharField + elif field_type == 'date': + d['required'] = is_required + d['initial'] = initial + d['help_text'] = help_text + if min_value: + d['validators'] = [validate_date_generator(min_value), ] + field_class = django.forms.DateField + elif field_type == 'boolean': + has_booleans = True + d['initial'] = initial + if field_name == 'agree_to_tos': +~~ d['help_text'] = mark_safe(help_text) +~~ d['label'] = mark_safe(label) + else: + d['required'] = False + d['help_text'] = help_text + field_class = django.forms.BooleanField + else: + raise Exception('Unknown field type: {}'.format(field_type)) + + fields[field_name] = field_class(**d) + fieldset[1]['fields'].append(field_name) + + widget = fields[field_name].widget + if not is_editable: + if isinstance(widget, django.forms.Select): + widget.attrs['disabled'] = 'disabled' + else: + widget.attrs['readonly'] = 'readonly' + if field_type == 'date': + widget.attrs['placeholder'] = '__/__/____' + widget.attrs['class'] = 'date' + if field_name == 'phone_number': + widget.attrs['placeholder'] = '(___) ___-____' + widget.attrs['class'] = 'phonenumber' + if field_name == 'ssn': + widget.attrs['placeholder'] = '____' + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 21 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / snippets / edit_handlers.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/snippets/edit_handlers.py) + +```python +# edit_handlers.py +from django.template.loader import render_to_string +~~from django.utils.safestring import mark_safe + +from wagtail.admin.edit_handlers import BaseChooserPanel + +from .widgets import AdminSnippetChooser + + +class SnippetChooserPanel(BaseChooserPanel): + object_type_name = 'item' + + def widget_overrides(self): + return {self.field_name: AdminSnippetChooser(model=self.target_model)} + + def render_as_field(self): + instance_obj = self.get_chosen_item() +~~ return mark_safe(render_to_string(self.field_template, { + 'field': self.bound_field, + self.object_type_name: instance_obj, + })) + + def on_model_bound(self): + super().on_model_bound() + self.target_model = self.db_field.remote_field.model + + + +## ... source file continues with no further mark_safe examples... + +``` + diff --git a/content/pages/examples/django/django-utils-safestring-safedata.markdown b/content/pages/examples/django/django-utils-safestring-safedata.markdown new file mode 100644 index 000000000..c271f8d28 --- /dev/null +++ b/content/pages/examples/django/django-utils-safestring-safedata.markdown @@ -0,0 +1,238 @@ +title: django.utils.safestring SafeData Example Code +category: page +slug: django-utils-safestring-safedata-examples +sortorder: 500011484 +toc: False +sidebartitle: django.utils.safestring SafeData +meta: Python example code for the SafeData class from the django.utils.safestring module of the Django project. + + +SafeData is a class within the django.utils.safestring module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / angular_base.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/angular_base.py) + +```python +# angular_base.py +from base64 import b64encode +from collections import UserList +import json +import warnings + +from django.forms import forms +from django.http import QueryDict +from django.utils.html import format_html, format_html_join, escape, conditional_escape +from django.utils.encoding import force_text +from django.utils.module_loading import import_string +~~from django.utils.safestring import mark_safe, SafeText, SafeData +from django.core.exceptions import ValidationError, ImproperlyConfigured + +from .fields import DefaultFieldMixin + + +~~class SafeTuple(SafeData, tuple): + + +class TupleErrorList(UserList, list): + def __init__(self, initlist=None, error_class=None): + super(TupleErrorList, self).__init__(initlist) + + if error_class is None: + self.error_class = 'errorlist' + else: + self.error_class = 'errorlist {}'.format(error_class) + + def as_data(self): + return ValidationError(self.data).error_list + + def get_json_data(self, escape_html=False): + errors = [] + for error in self.as_data(): + message = list(error)[0] + errors.append({ + 'message': escape(message) if escape_html else message, + 'code': error.code or '', + }) + return errors + + + +## ... source file continues with no further SafeData examples... + +``` + + +## Example 2 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / templatetags / rest_framework.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/templatetags/rest_framework.py) + +```python +# rest_framework.py +import re +from collections import OrderedDict + +from django import template +from django.template import loader +from django.urls import NoReverseMatch, reverse +from django.utils.encoding import force_str, iri_to_uri +from django.utils.html import escape, format_html, smart_urlquote +~~from django.utils.safestring import SafeData, mark_safe + +from rest_framework.compat import apply_markdown, pygments_highlight +from rest_framework.renderers import HTMLFormRenderer +from rest_framework.utils.urls import replace_query_param + +register = template.Library() + +class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])') + + +@register.tag(name='code') +def highlight_code(parser, token): + code = token.split_contents()[-1] + nodelist = parser.parse(('endcode',)) + parser.delete_first_token() + return CodeNode(code, nodelist) + + +class CodeNode(template.Node): + style = 'emacs' + + def __init__(self, lang, code): + self.lang = lang + self.nodelist = code + + +## ... source file continues with no further SafeData examples... + +``` + + +## Example 3 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / base.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/base.py) + +```python +# base.py +from collections import OrderedDict +from itertools import islice + +from django.core.exceptions import ImproperlyConfigured +from django.urls import reverse +from django.utils.html import format_html +~~from django.utils.safestring import SafeData +from django.utils.text import capfirst + +from ..utils import ( + Accessor, + AttributeDict, + OrderBy, + OrderByTuple, + call_with_appropriate, + computed_values, +) + + +class Library: + + def __init__(self): + self.columns = [] + + def register(self, column): + if not hasattr(column, "from_field"): + raise ImproperlyConfigured( + "{} is not a subclass of Column".format(column.__class__.__name__) + ) + self.columns.append(column) + return column + + +## ... source file abbreviated to get to SafeData examples ... + + + def is_ordered(self): + return self.name in (self._table.order_by or ()) + + @property + def orderable(self): + if self.column.orderable is not None: + return self.column.orderable + return self._table.orderable + + @property + def verbose_name(self): + if self.column.verbose_name is not None: + return self.column.verbose_name + + name = self.name.replace("_", " ") + + model = self._table.data.model + if model: + field = Accessor(self.accessor).get_field(model) + if field: + if hasattr(field, "field"): + name = field.field.verbose_name + else: + name = getattr(field, "verbose_name", field.name) + +~~ if isinstance(name, SafeData): + return name + + return capfirst(name) + + @property + def visible(self): + return self.column.visible + + @property + def localize(self): + return self.column.localize + + +class BoundColumns: + + def __init__(self, table, base_columns): + self._table = table + self.columns = OrderedDict() + for name, column in base_columns.items(): + self.columns[name] = bound_column = BoundColumn(table, column, name) + bound_column.render = getattr(table, "render_" + name, column.render) + bound_column.value = getattr( + table, "value_" + name, getattr(table, "render_" + name, column.value) + ) + + +## ... source file continues with no further SafeData examples... + +``` + diff --git a/content/pages/examples/django/django-utils-safestring-safetext.markdown b/content/pages/examples/django/django-utils-safestring-safetext.markdown new file mode 100644 index 000000000..705923248 --- /dev/null +++ b/content/pages/examples/django/django-utils-safestring-safetext.markdown @@ -0,0 +1,107 @@ +title: django.utils.safestring SafeText Example Code +category: page +slug: django-utils-safestring-safetext-examples +sortorder: 500011485 +toc: False +sidebartitle: django.utils.safestring SafeText +meta: Python example code for the SafeText class from the django.utils.safestring module of the Django project. + + +SafeText is a class within the django.utils.safestring module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / angular_base.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/angular_base.py) + +```python +# angular_base.py +from base64 import b64encode +from collections import UserList +import json +import warnings + +from django.forms import forms +from django.http import QueryDict +from django.utils.html import format_html, format_html_join, escape, conditional_escape +from django.utils.encoding import force_text +from django.utils.module_loading import import_string +~~from django.utils.safestring import mark_safe, SafeText, SafeData +from django.core.exceptions import ValidationError, ImproperlyConfigured + +from .fields import DefaultFieldMixin + + +class SafeTuple(SafeData, tuple): + + +class TupleErrorList(UserList, list): + def __init__(self, initlist=None, error_class=None): + super(TupleErrorList, self).__init__(initlist) + + if error_class is None: + self.error_class = 'errorlist' + else: + self.error_class = 'errorlist {}'.format(error_class) + + def as_data(self): + return ValidationError(self.data).error_list + + def get_json_data(self, escape_html=False): + errors = [] + for error in self.as_data(): + message = list(error)[0] + errors.append({ + 'message': escape(message) if escape_html else message, + 'code': error.code or '', + }) + return errors + + def as_json(self, escape_html=False): + return json.dumps(self.get_json_data(escape_html)) + + def extend(self, iterable): + for item in iterable: + if not isinstance(item, str): + self.append(item) + return None + + def as_ul(self): + if not self: +~~ return SafeText() + first = self[0] + if isinstance(first, tuple): + error_lists = {'$pristine': [], '$dirty': []} + for e in self: + if e[5] == '$message': + li_format = '
  • ' + else: + li_format = '
  • {3}
  • ' + err_tuple = (e[0], e[3], e[4], force_text(e[5])) + error_lists[e[2]].append(format_html(li_format, *err_tuple)) + dirty_errors, pristine_errors = '', '' + if len(error_lists['$dirty']) > 0: + dirty_errors = format_html( + '
      {2}
    ', # duck typing: !...$untouched + first[0], first[1], mark_safe(''.join(error_lists['$dirty'])) + ) + if len(error_lists['$pristine']) > 0: + pristine_errors = format_html( + '
      {2}
    ', + first[0], first[1], mark_safe(''.join(error_lists['$pristine'])) + ) + return format_html('{}{}', dirty_errors, pristine_errors) + return format_html('
      {0}
    ', + format_html_join('', '
  • {0}
  • ', ((force_text(e),) for e in self))) + + +## ... source file continues with no further SafeText examples... + +``` + diff --git a/content/pages/examples/django/django-utils-termcolors-colorize.markdown b/content/pages/examples/django/django-utils-termcolors-colorize.markdown new file mode 100644 index 000000000..212495b15 --- /dev/null +++ b/content/pages/examples/django/django-utils-termcolors-colorize.markdown @@ -0,0 +1,89 @@ +title: django.utils.termcolors colorize Example Code +category: page +slug: django-utils-termcolors-colorize-examples +sortorder: 500011487 +toc: False +sidebartitle: django.utils.termcolors colorize +meta: Python example code for the colorize callable from the django.utils.termcolors module of the Django project. + + +colorize is a callable within the django.utils.termcolors module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / check.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/check.py) + +```python +# check.py +from contextlib import contextmanager +import inspect +from itertools import chain + +from django.conf import settings +from django.utils.decorators import method_decorator +~~from django.utils.termcolors import colorize +from sekizai.helpers import validate_template + +from cms import constants +from cms.models import AliasPluginModel +from cms.utils.conf import get_cms_setting +from cms.utils.compat.dj import is_installed + + +SUCCESS = 1 +WARNING = 2 +ERROR = 3 +SKIPPED = 4 + +CHECKERS = [] + + +class FileOutputWrapper(object): + def __init__(self, stdout, stderr): + self.stdout = stdout + self.stderr = stderr + self.section_wrapper = FileSectionWrapper + self.errors = 0 + self.successes = 0 + self.warnings = 0 + self.skips = 0 + +~~ def colorize(self, msg, opts=(), **kwargs): +~~ return colorize(msg, opts=opts, **kwargs) + + def write_line(self, message=''): + self.write(u'%s\n' % message) + + def write(self, message): + self.stdout.write(message) + + def write_stderr_line(self, message=''): + self.write_stderr(u'%s\n' % message) + + def write_stderr(self, message): + self.stderr.write(message) + + def success(self, message): + self.successes += 1 + self.write_line(u'%s %s' % (message, self.colorize('[OK]', fg='green', opts=['bold']))) + + def error(self, message): + self.errors += 1 + self.write_stderr_line(u'%s %s' % (message, self.colorize('[ERROR]', fg='red', opts=['bold']))) + + def warn(self, message): + self.warnings += 1 + self.write_stderr_line(u'%s %s' % (message, self.colorize('[WARNING]', fg='yellow', opts=['bold']))) + + +## ... source file continues with no further colorize examples... + +``` + diff --git a/content/pages/examples/django/django-utils-termcolors.markdown b/content/pages/examples/django/django-utils-termcolors.markdown new file mode 100644 index 000000000..6754d5cdf --- /dev/null +++ b/content/pages/examples/django/django-utils-termcolors.markdown @@ -0,0 +1,65 @@ +title: django.utils termcolors Example Code +category: page +slug: django-utils-termcolors-examples +sortorder: 500011420 +toc: False +sidebartitle: django.utils termcolors +meta: Python example code for the termcolors callable from the django.utils module of the Django project. + + +termcolors is a callable within the django.utils module of the Django project. + + +## Example 1 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / management / color.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/management/color.py) + +```python +# color.py + +from django.core.management import color +~~from django.utils import termcolors + + +def _dummy_style_func(msg): + return msg + + +def no_style(): + style = color.no_style() + for role in ('INFO', 'WARN', 'BOLD', 'URL', 'MODULE', 'MODULE_NAME', 'URL_NAME'): + setattr(style, role, _dummy_style_func) + return style + + +def color_style(): + if color.supports_color(): + style = color.color_style() +~~ style.INFO = termcolors.make_style(fg='green') +~~ style.WARN = termcolors.make_style(fg='yellow') +~~ style.BOLD = termcolors.make_style(opts=('bold',)) +~~ style.URL = termcolors.make_style(fg='green', opts=('bold',)) +~~ style.MODULE = termcolors.make_style(fg='yellow') +~~ style.MODULE_NAME = termcolors.make_style(opts=('bold',)) +~~ style.URL_NAME = termcolors.make_style(fg='red') + else: + style = no_style() + return style + + + +## ... source file continues with no further termcolors examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-capfirst.markdown b/content/pages/examples/django/django-utils-text-capfirst.markdown new file mode 100644 index 000000000..f40a7e5ca --- /dev/null +++ b/content/pages/examples/django/django-utils-text-capfirst.markdown @@ -0,0 +1,990 @@ +title: django.utils.text capfirst Example Code +category: page +slug: django-utils-text-capfirst-examples +sortorder: 500011489 +toc: False +sidebartitle: django.utils.text capfirst +meta: Python example code for the capfirst callable from the django.utils.text module of the Django project. + + +capfirst is a callable within the django.utils.text module of the Django project. + + +## Example 1 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / utils.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./utils.py) + +```python +# utils.py +import warnings +from collections import OrderedDict + +from django.conf import settings +from django.core.exceptions import FieldDoesNotExist, FieldError +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.expressions import Expression +from django.db.models.fields.related import ForeignObjectRel, RelatedField +from django.utils import timezone +from django.utils.encoding import force_str +~~from django.utils.text import capfirst +from django.utils.translation import gettext as _ + +from .exceptions import FieldLookupError + + +def deprecate(msg, level_modifier=0): + warnings.warn(msg, MigrationNotice, stacklevel=3 + level_modifier) + + +class MigrationNotice(DeprecationWarning): + url = 'https://django-filter.readthedocs.io/en/master/guide/migration.html' + + def __init__(self, message): + super().__init__('%s See: %s' % (message, self.url)) + + +class RenameAttributesBase(type): + renamed_attributes = () + + def __new__(metacls, name, bases, attrs): + old_names = [r[0] for r in metacls.renamed_attributes] + old_names = [name for name in old_names if name in attrs] + old_attrs = {name: attrs.pop(name) for name in old_names} + + + +## ... source file abbreviated to get to capfirst examples ... + + + names.append(force_str(part.verbose_name)) + + return ' '.join(names) + + +def verbose_lookup_expr(lookup_expr): + from .conf import settings as app_settings + + VERBOSE_LOOKUPS = app_settings.VERBOSE_LOOKUPS or {} + lookups = [ + force_str(VERBOSE_LOOKUPS.get(lookup, _(lookup))) + for lookup in lookup_expr.split(LOOKUP_SEP) + ] + + return ' '.join(lookups) + + +def label_for_filter(model, field_name, lookup_expr, exclude=False): + name = verbose_field_name(model, field_name) + verbose_expression = [_('exclude'), name] if exclude else [name] + + if isinstance(lookup_expr, str): + verbose_expression += [verbose_lookup_expr(lookup_expr)] + + verbose_expression = [force_str(part) for part in verbose_expression if part] +~~ verbose_expression = capfirst(' '.join(verbose_expression)) + + return verbose_expression + + +def translate_validation(error_dict): + from rest_framework.exceptions import ValidationError, ErrorDetail + + exc = OrderedDict( + (key, [ErrorDetail(e.message % (e.params or ()), code=e.code) + for e in error_list]) + for key, error_list in error_dict.as_data().items() + ) + + return ValidationError(exc) + + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 2 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / forms.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./forms.py) + +```python +# forms.py +from django import forms +from django.utils.encoding import smart_text +~~from django.utils.text import capfirst +from django.utils.translation import ugettext_lazy as _ + +from haystack import connections +from haystack.constants import DEFAULT_ALIAS +from haystack.query import EmptySearchQuerySet, SearchQuerySet +from haystack.utils import get_model_ct +from haystack.utils.app_loading import haystack_get_model + + +def model_choices(using=DEFAULT_ALIAS): + choices = [ +~~ (get_model_ct(m), capfirst(smart_text(m._meta.verbose_name_plural))) + for m in connections[using].get_unified_index().get_indexed_models() + ] + return sorted(choices, key=lambda x: x[1]) + + +class SearchForm(forms.Form): + q = forms.CharField( + required=False, + label=_("Search"), + widget=forms.TextInput(attrs={"type": "search"}), + ) + + def __init__(self, *args, **kwargs): + self.searchqueryset = kwargs.pop("searchqueryset", None) + self.load_all = kwargs.pop("load_all", False) + + if self.searchqueryset is None: + self.searchqueryset = SearchQuerySet() + + super(SearchForm, self).__init__(*args, **kwargs) + + def no_query_found(self): + return EmptySearchQuerySet() + + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 3 from django-inline-actions +[django-inline-actions](https://github.com/escaped/django-inline-actions) +([PyPI package information](https://pypi.org/project/django-inline-actions/)) +is an extension that adds actions to the [Django](/django.html) +Admin InlineModelAdmin and ModelAdmin changelists. The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/escaped/django-inline-actions/blob/master/LICENSE). + +[**django-inline-actions / inline_actions / admin.py**](https://github.com/escaped/django-inline-actions/blob/master/inline_actions/./admin.py) + +```python +# admin.py +from django.apps import apps +from django.contrib import admin +from django.http import HttpResponse +from django.shortcuts import redirect +from django.urls import reverse +from django.utils.safestring import mark_safe +~~from django.utils.text import capfirst +from django.utils.translation import ugettext_lazy as _ + + +class InlineActionException(Exception): + pass + + +class ActionNotCallable(InlineActionException): + def __init__(self, model_admin, action, *args, **kwargs): + super().__init__(*args, **kwargs) + self.model_admin = model_admin + self.action = action + + +class BaseInlineActionsMixin: + INLINE_MODEL_ADMIN = 'inline' + MODEL_ADMIN = 'admin' + + inline_actions = [] + + def get_inline_actions(self, request, obj=None): + if self.inline_actions is None: + return [] + + + +## ... source file abbreviated to get to capfirst examples ... + + + + if isinstance(model_admin, admin.options.InlineModelAdmin): + return self.INLINE_MODEL_ADMIN + return self.MODEL_ADMIN + + def render_inline_actions(self, obj=None): # NOQA: C901 + if not (obj and obj.pk): + return '' + + buttons = [] + for action_name in self.get_inline_actions(self._request, obj): + action_func = getattr(self, action_name, None) + if not action_func: + raise RuntimeError( + "Could not find action `{}`".format(action_name)) + + action_name = action_func.__name__ + label_handler = getattr( + self, 'get_{}_label'.format(action_name), None) + if callable(label_handler): + description = label_handler(obj=obj) + else: + try: + description = action_func.short_description + except AttributeError: +~~ description = capfirst(action_name.replace('_', ' ')) + + css_handler = getattr( + self, 'get_{}_css'.format(action_name), None) + if callable(css_handler): + css_classes = css_handler(obj=obj) + else: + try: + css_classes = action_func.css_classes + except AttributeError: + css_classes = '' + + action_data = [ + self.__class__.__name__.lower(), + self._get_admin_type(), + action_name, + obj._meta.app_label, + obj._meta.model_name, + str(obj.pk), + ] + buttons.append( + ''.format( + '_action__{}'.format('__'.join(action_data)), + description, + css_classes, + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 4 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import datetime +import json +from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 + from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +~~from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + kwargs.setdefault('content_type', 'application/json') + data = json.dumps(data, cls=encoder) + super(JsonResponse, self).__init__(content=data, **kwargs) + + +def get_app_list(context, order=True): + admin_site = get_admin_site(context) + request = context['request'] + + app_dict = {} + for model, model_admin in admin_site._registry.items(): + app_label = model._meta.app_label + try: + has_module_perms = model_admin.has_module_permission(request) + except AttributeError: + has_module_perms = request.user.has_module_perms(app_label) # Fix Django < 1.8 issue + + if has_module_perms: + perms = model_admin.get_model_perms(request) + + if True in perms.values(): + info = (app_label, model._meta.model_name) + model_dict = { +~~ 'name': capfirst(model._meta.verbose_name_plural), + 'object_name': model._meta.object_name, + 'perms': perms, + 'model_name': model._meta.model_name + } + if perms.get('change', False): + try: + model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=admin_site.name) + except NoReverseMatch: + pass + if perms.get('add', False): + try: + model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=admin_site.name) + except NoReverseMatch: + pass + if app_label in app_dict: + app_dict[app_label]['models'].append(model_dict) + else: + try: + name = apps.get_app_config(app_label).verbose_name + except NameError: + name = app_label.title() + app_dict[app_label] = { + 'name': name, + 'app_label': app_label, + + +## ... source file abbreviated to get to capfirst examples ... + + + + split = language_code.split('-', 2) + if len(split) == 2: + language_code = '%s-%s' % (split[0].lower(), split[1].upper()) if split[0] != split[1] else split[0] + + language_codes.append(language_code) + + if len(split) == 2: + language_codes.append(split[0].lower()) + + return language_codes + + +def get_original_menu_items(context): + if context.get('user') and user_is_authenticated(context['user']): + pinned_apps = PinnedApplication.objects.filter(user=context['user'].pk).values_list('app_label', flat=True) + else: + pinned_apps = [] + + original_app_list = get_app_list(context) + + return map(lambda app: { + 'app_label': app['app_label'], + 'url': app['app_url'], + 'url_blank': False, +~~ 'label': app.get('name', capfirst(_(app['app_label']))), + 'has_perms': app.get('has_module_perms', False), + 'models': list(map(lambda model: { + 'url': model.get('admin_url'), + 'url_blank': False, + 'name': model['model_name'], + 'object_name': model['object_name'], + 'label': model.get('name', model['object_name']), + 'has_perms': any(model.get('perms', {}).values()), + }, app['models'])), + 'pinned': app['app_label'] in pinned_apps, + 'custom': False + }, original_app_list) + + +def get_menu_item_url(url, original_app_list): + if isinstance(url, dict): + url_type = url.get('type') + + if url_type == 'app': + return original_app_list[url['app_label']]['url'] + elif url_type == 'model': + models = dict(map( + lambda x: (x['name'], x['url']), + original_app_list[url['app_label']]['models'] + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 5 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / utils / field_mapping.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/utils/field_mapping.py) + +```python +# field_mapping.py +import inspect + +from django.core import validators +from django.db import models +~~from django.utils.text import capfirst + +from rest_framework.compat import postgres_fields +from rest_framework.validators import UniqueValidator + +NUMERIC_FIELD_TYPES = ( + models.IntegerField, models.FloatField, models.DecimalField, models.DurationField, +) + + +class ClassLookupDict: + def __init__(self, mapping): + self.mapping = mapping + + def __getitem__(self, key): + if hasattr(key, '_proxy_class'): + base_class = key._proxy_class + else: + base_class = key.__class__ + + for cls in inspect.getmro(base_class): + if cls in self.mapping: + return self.mapping[cls] + raise KeyError('Class %s not found in lookup.' % base_class.__name__) + + def __setitem__(self, key, value): + self.mapping[key] = value + + +def needs_label(model_field, field_name): + default_label = field_name.replace('_', ' ').capitalize() +~~ return capfirst(model_field.verbose_name) != default_label + + +def get_detail_view_name(model): + return '%(model_name)s-detail' % { + 'app_label': model._meta.app_label, + 'model_name': model._meta.object_name.lower() + } + + +def get_field_kwargs(field_name, model_field): + kwargs = {} + validator_kwarg = list(model_field.validators) + + kwargs['model_field'] = model_field + + if model_field.verbose_name and needs_label(model_field, field_name): +~~ kwargs['label'] = capfirst(model_field.verbose_name) + + if model_field.help_text: + kwargs['help_text'] = model_field.help_text + + max_digits = getattr(model_field, 'max_digits', None) + if max_digits is not None: + kwargs['max_digits'] = max_digits + + decimal_places = getattr(model_field, 'decimal_places', None) + if decimal_places is not None: + kwargs['decimal_places'] = decimal_places + + if isinstance(model_field, models.SlugField): + kwargs['allow_unicode'] = model_field.allow_unicode + + if isinstance(model_field, models.TextField) and not model_field.choices or \ + (postgres_fields and isinstance(model_field, postgres_fields.JSONField)): + kwargs['style'] = {'base_template': 'textarea.html'} + + if isinstance(model_field, models.AutoField) or not model_field.editable: + kwargs['read_only'] = True + return kwargs + + if model_field.has_default() or model_field.blank or model_field.null: + + +## ... source file abbreviated to get to capfirst examples ... + + +def get_relation_kwargs(field_name, relation_info): + model_field, related_model, to_many, to_field, has_through_model, reverse = relation_info + kwargs = { + 'queryset': related_model._default_manager, + 'view_name': get_detail_view_name(related_model) + } + + if to_many: + kwargs['many'] = True + + if to_field: + kwargs['to_field'] = to_field + + limit_choices_to = model_field and model_field.get_limit_choices_to() + if limit_choices_to: + if not isinstance(limit_choices_to, models.Q): + limit_choices_to = models.Q(**limit_choices_to) + kwargs['queryset'] = kwargs['queryset'].filter(limit_choices_to) + + if has_through_model: + kwargs['read_only'] = True + kwargs.pop('queryset', None) + + if model_field: + if model_field.verbose_name and needs_label(model_field, field_name): +~~ kwargs['label'] = capfirst(model_field.verbose_name) + help_text = model_field.help_text + if help_text: + kwargs['help_text'] = help_text + if not model_field.editable: + kwargs['read_only'] = True + kwargs.pop('queryset', None) + if kwargs.get('read_only', False): + return kwargs + + if model_field.has_default() or model_field.blank or model_field.null: + kwargs['required'] = False + if model_field.null: + kwargs['allow_null'] = True + if model_field.validators: + kwargs['validators'] = model_field.validators + if getattr(model_field, 'unique', False): + validator = UniqueValidator(queryset=model_field.model._default_manager) + kwargs['validators'] = kwargs.get('validators', []) + [validator] + if to_many and not model_field.blank: + kwargs['allow_empty'] = False + + return kwargs + + + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 6 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / base.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/base.py) + +```python +# base.py +from collections import OrderedDict +from itertools import islice + +from django.core.exceptions import ImproperlyConfigured +from django.urls import reverse +from django.utils.html import format_html +from django.utils.safestring import SafeData +~~from django.utils.text import capfirst + +from ..utils import ( + Accessor, + AttributeDict, + OrderBy, + OrderByTuple, + call_with_appropriate, + computed_values, +) + + +class Library: + + def __init__(self): + self.columns = [] + + def register(self, column): + if not hasattr(column, "from_field"): + raise ImproperlyConfigured( + "{} is not a subclass of Column".format(column.__class__.__name__) + ) + self.columns.append(column) + return column + + def column_for_field(self, field, **kwargs): + if field is None: + return self.columns[0](**kwargs) + + for candidate in reversed(self.columns): + if hasattr(field, "get_related_field"): + verbose_name = field.get_related_field().verbose_name + else: + verbose_name = getattr(field, "verbose_name", field.name) +~~ kwargs["verbose_name"] = capfirst(verbose_name) + column = candidate.from_field(field, **kwargs) + if column is None: + continue + return column + + +library = Library() + + +class LinkTransform: + + viewname = None + accessor = None + attrs = None + + def __init__(self, url=None, accessor=None, attrs=None, reverse_args=None): + self.url = url + self.attrs = attrs + self.accessor = accessor + + if isinstance(reverse_args, (list, tuple)): + viewname, args = reverse_args + reverse_args = {"viewname": viewname} + reverse_args["kwargs" if isinstance(args, dict) else "args"] = args + + +## ... source file abbreviated to get to capfirst examples ... + + + @property + def orderable(self): + if self.column.orderable is not None: + return self.column.orderable + return self._table.orderable + + @property + def verbose_name(self): + if self.column.verbose_name is not None: + return self.column.verbose_name + + name = self.name.replace("_", " ") + + model = self._table.data.model + if model: + field = Accessor(self.accessor).get_field(model) + if field: + if hasattr(field, "field"): + name = field.field.verbose_name + else: + name = getattr(field, "verbose_name", field.name) + + if isinstance(name, SafeData): + return name + +~~ return capfirst(name) + + @property + def visible(self): + return self.column.visible + + @property + def localize(self): + return self.column.localize + + +class BoundColumns: + + def __init__(self, table, base_columns): + self._table = table + self.columns = OrderedDict() + for name, column in base_columns.items(): + self.columns[name] = bound_column = BoundColumn(table, column, name) + bound_column.render = getattr(table, "render_" + name, column.render) + bound_column.value = getattr( + table, "value_" + name, getattr(table, "render_" + name, column.value) + ) + bound_column.order = getattr(table, "order_" + name, column.order) + + def iternames(self): + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 7 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / managers.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./managers.py) + +```python +# managers.py +import uuid +from operator import attrgetter + +from django import VERSION +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.db import connections, models, router +from django.db.models import signals +from django.db.models.fields.related import ( + ManyToManyRel, + OneToOneRel, + RelatedField, + lazy_related_operation, +) +from django.db.models.query_utils import PathInfo +~~from django.utils.text import capfirst +from django.utils.translation import gettext_lazy as _ + +from taggit.forms import TagField +from taggit.models import ( + CommonGenericTaggedItemBase, + GenericUUIDTaggedItemBase, + TaggedItem, +) +from taggit.utils import require_instance_manager + + +class ExtraJoinRestriction: + + contains_aggregate = False + + def __init__(self, alias, col, content_types): + self.alias = alias + self.col = col + self.content_types = content_types + + def as_sql(self, compiler, connection): + qn = compiler.quote_name_unless_alias + if len(self.content_types) == 1: + extra_where = "{}.{} = %s".format(qn(self.alias), qn(self.col)) + + +## ... source file abbreviated to get to capfirst examples ... + + + ) + + if not self.remote_field.model: + self.remote_field.model = self.through._meta.get_field( + "tag" + ).remote_field.model + + if self.use_gfk: + tagged_items = GenericRelation(self.through) + tagged_items.contribute_to_class(cls, "tagged_items") + + for rel in cls._meta.local_many_to_many: + if rel == self or not isinstance(rel, TaggableManager): + continue + if rel.through == self.through: + raise ValueError( + "You can't have two TaggableManagers with the" + " same through model." + ) + + def save_form_data(self, instance, value): + getattr(instance, self.name).set(*value) + + def formfield(self, form_class=TagField, **kwargs): + defaults = { +~~ "label": capfirst(self.verbose_name), + "help_text": self.help_text, + "required": not self.blank, + } + defaults.update(kwargs) + return form_class(**defaults) + + def value_from_object(self, obj): + if obj.pk is None: + return [] + qs = self.through.objects.select_related("tag").filter( + **self.through.lookup_kwargs(obj) + ) + return [ti.tag for ti in qs] + + def m2m_reverse_name(self): + return self.through._meta.get_field("tag").column + + def m2m_reverse_field_name(self): + return self.through._meta.get_field("tag").name + + def m2m_target_field_name(self): + return self.model._meta.pk.name + + def m2m_reverse_target_field_name(self): + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 8 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/models.py) + +```python +# models.py +import json +import logging +from collections import defaultdict +from io import StringIO +from urllib.parse import urlparse + +from django.conf import settings +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core import checks +from django.core.cache import cache +from django.core.exceptions import ValidationError +from django.core.handlers.base import BaseHandler +from django.core.handlers.wsgi import WSGIRequest +from django.db import models, transaction +from django.db.models import Case, Q, Value, When +from django.db.models.functions import Concat, Lower, Substr +from django.http import Http404 +from django.http.request import split_domain_port +from django.template.response import TemplateResponse +from django.urls import NoReverseMatch, reverse +from django.utils import timezone +from django.utils.cache import patch_cache_control +from django.utils.functional import cached_property +~~from django.utils.text import capfirst, slugify +from django.utils.translation import gettext_lazy as _ +from modelcluster.models import ( + ClusterableModel, get_all_child_m2m_relations, get_all_child_relations) +from treebeard.mp_tree import MP_Node + +from wagtail.core.query import PageQuerySet, TreeQuerySet +from wagtail.core.signals import page_published, page_unpublished, post_page_move, pre_page_move +from wagtail.core.sites import get_site_for_hostname +from wagtail.core.url_routing import RouteResult +from wagtail.core.utils import WAGTAIL_APPEND_SLASH, camelcase_to_underscore, resolve_model_string +from wagtail.search import index + + +logger = logging.getLogger('wagtail.core') + +PAGE_TEMPLATE_VAR = 'page' + + +class SiteManager(models.Manager): + def get_queryset(self): + return super(SiteManager, self).get_queryset().order_by(Lower("hostname")) + + def get_by_natural_key(self, hostname, port): + return self.get(hostname=hostname, port=port) + + +## ... source file abbreviated to get to capfirst examples ... + + + page_model for page_model in cls.allowed_subpage_models() + if page_model.is_creatable + ] + + @classmethod + def can_exist_under(cls, parent): + return cls in parent.specific_class.allowed_subpage_models() + + @classmethod + def can_create_at(cls, parent): + can_create = cls.is_creatable and cls.can_exist_under(parent) + + if cls.max_count is not None: + can_create = can_create and cls.objects.count() < cls.max_count + + if cls.max_count_per_parent is not None: + can_create = can_create and parent.get_children().type(cls).count() < cls.max_count_per_parent + + return can_create + + def can_move_to(self, parent): + return self.can_exist_under(parent) + + @classmethod + def get_verbose_name(cls): +~~ return capfirst(cls._meta.verbose_name) + + @property + def status_string(self): + if not self.live: + if self.expired: + return _("expired") + elif self.approved_schedule: + return _("scheduled") + else: + return _("draft") + else: + if self.approved_schedule: + return _("live + scheduled") + elif self.has_unpublished_changes: + return _("live + draft") + else: + return _("live") + + @property + def approved_schedule(self): + return self.revisions.exclude(approved_go_live_at__isnull=True).exists() + + def has_unpublished_subtree(self): + return (not self.live) and (not self.get_descendants().filter(live=True).exists()) + + +## ... source file continues with no further capfirst examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-format-lazy.markdown b/content/pages/examples/django/django-utils-text-format-lazy.markdown new file mode 100644 index 000000000..4480fe6c2 --- /dev/null +++ b/content/pages/examples/django/django-utils-text-format-lazy.markdown @@ -0,0 +1,64 @@ +title: django.utils.text format_lazy Example Code +category: page +slug: django-utils-text-format-lazy-examples +sortorder: 500011490 +toc: False +sidebartitle: django.utils.text format_lazy +meta: Python example code for the format_lazy callable from the django.utils.text module of the Django project. + + +format_lazy is a callable within the django.utils.text module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / utils / compatibility.py**](https://github.com/divio/django-filer/blob/develop/filer/utils/compatibility.py) + +```python +# compatibility.py +from __future__ import absolute_import, unicode_literals + +import sys + +from django.utils import six +from django.utils.functional import keep_lazy +~~from django.utils.text import Truncator, format_lazy + + +def string_concat(*strings): +~~ return format_lazy('{}' * len(strings), *strings) + + +def truncate_words(s, num, end_text='...'): + truncate = end_text and ' %s' % end_text or '' + return Truncator(s).words(num, truncate=truncate) + + +truncate_words = keep_lazy(truncate_words, six.text_type) + + +if not six.PY3: + fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def upath(path): + if six.PY2 and not isinstance(path, six.text_type): + return path.decode(fs_encoding) + return path + + +def get_delete_permission(opts): + from django.contrib.auth import get_permission_codename # noqa + return '%s.%s' % (opts.app_label, get_permission_codename('delete', opts)) + + + +## ... source file continues with no further format_lazy examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-get-text-list.markdown b/content/pages/examples/django/django-utils-text-get-text-list.markdown new file mode 100644 index 000000000..ff9b4f286 --- /dev/null +++ b/content/pages/examples/django/django-utils-text-get-text-list.markdown @@ -0,0 +1,128 @@ +title: django.utils.text get_text_list Example Code +category: page +slug: django-utils-text-get-text-list-examples +sortorder: 500011491 +toc: False +sidebartitle: django.utils.text get_text_list +meta: Python example code for the get_text_list callable from the django.utils.text module of the Django project. + + +get_text_list is a callable within the django.utils.text module of the Django project. + + +## Example 1 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / admin / __init__.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/__init__.py) + +```python +# __init__.py +import six +import operator +from functools import update_wrapper +from six.moves import reduce +from typing import Tuple, Dict, Callable # NOQA + +from django.apps import apps +from django.http import HttpResponse, HttpResponseNotFound +from django.conf import settings +from django.db import models +from django.db.models.query import QuerySet +from django.utils.encoding import smart_str +from django.utils.translation import gettext as _ +~~from django.utils.text import get_text_list +from django.contrib import admin + +from django_extensions.admin.widgets import ForeignKeySearchInput + + +class ForeignKeyAutocompleteAdminMixin: + + related_search_fields = {} # type: Dict[str, Tuple[str]] + related_string_functions = {} # type: Dict[str, Callable] + autocomplete_limit = getattr(settings, 'FOREIGNKEY_AUTOCOMPLETE_LIMIT', None) + + def get_urls(self): + from django.urls import path + + def wrap(view): + def wrapper(*args, **kwargs): + return self.admin_site.admin_view(view)(*args, **kwargs) + return update_wrapper(wrapper, view) + + return [ + path('foreignkey_autocomplete/', wrap(self.foreignkey_autocomplete), + name='%s_%s_autocomplete' % (self.model._meta.app_label, self.model._meta.model_name)) + ] + super().get_urls() + + + +## ... source file abbreviated to get to get_text_list examples ... + + + if additional_filter: + queryset = queryset.filter(additional_filter) + + if self.autocomplete_limit: + queryset = queryset[:self.autocomplete_limit] + + data = ''.join([six.u('%s|%s\n') % (to_string_function(f), f.pk) for f in queryset]) + elif object_pk: + try: + obj = queryset.get(pk=object_pk) + except Exception: # FIXME: use stricter exception checking + pass + else: + data = to_string_function(obj) + return HttpResponse(data, content_type='text/plain') + return HttpResponseNotFound() + + def get_related_filter(self, model, request): + return None + + def get_help_text(self, field_name, model_name): + searchable_fields = self.related_search_fields.get(field_name, None) + if searchable_fields: + help_kwargs = { + 'model_name': model_name, +~~ 'field_list': get_text_list(searchable_fields, _('and')), + } + return _('Use the left field to do %(model_name)s lookups in the fields %(field_list)s.') % help_kwargs + return '' + + def formfield_for_dbfield(self, db_field, **kwargs): + if isinstance(db_field, models.ForeignKey) and db_field.name in self.related_search_fields: + help_text = self.get_help_text(db_field.name, db_field.remote_field.model._meta.object_name) + if kwargs.get('help_text'): + help_text = six.u('%s %s' % (kwargs['help_text'], help_text)) + kwargs['widget'] = ForeignKeySearchInput(db_field.remote_field, self.related_search_fields[db_field.name]) + kwargs['help_text'] = help_text + return super().formfield_for_dbfield(db_field, **kwargs) + + +class ForeignKeyAutocompleteAdmin(ForeignKeyAutocompleteAdminMixin, admin.ModelAdmin): + pass + + +class ForeignKeyAutocompleteTabularInline(ForeignKeyAutocompleteAdminMixin, admin.TabularInline): + pass + + +class ForeignKeyAutocompleteStackedInline(ForeignKeyAutocompleteAdminMixin, admin.StackedInline): + pass + + +## ... source file continues with no further get_text_list examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-get-valid-filename.markdown b/content/pages/examples/django/django-utils-text-get-valid-filename.markdown new file mode 100644 index 000000000..ccc590d50 --- /dev/null +++ b/content/pages/examples/django/django-utils-text-get-valid-filename.markdown @@ -0,0 +1,103 @@ +title: django.utils.text get_valid_filename Example Code +category: page +slug: django-utils-text-get-valid-filename-examples +sortorder: 500011492 +toc: False +sidebartitle: django.utils.text get_valid_filename +meta: Python example code for the get_valid_filename callable from the django.utils.text module of the Django project. + + +get_valid_filename is a callable within the django.utils.text module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / utils / files.py**](https://github.com/divio/django-filer/blob/develop/filer/utils/files.py) + +```python +# files.py +from __future__ import absolute_import, unicode_literals + +import os + +from django.http.multipartparser import ( + ChunkIter, SkipFile, StopFutureHandlers, StopUpload, exhaust, +) +from django.template.defaultfilters import slugify as slugify_django +from django.utils.encoding import force_text +~~from django.utils.text import get_valid_filename as get_valid_filename_django + +from unidecode import unidecode + + +class UploadException(Exception): + pass + + +def handle_upload(request): + if not request.method == "POST": + raise UploadException("AJAX request not valid: must be POST") + if request.is_ajax(): + is_raw = True + filename = request.GET.get('qqfile', False) or request.GET.get('filename', False) or '' + + try: + content_length = int(request.META['CONTENT_LENGTH']) + except (IndexError, TypeError, ValueError): + content_length = None + + if content_length < 0: + raise UploadException("Invalid content length: %r" % content_length) + + upload_handlers = request.upload_handlers + + +## ... source file abbreviated to get to get_valid_filename examples ... + + + + for i, handler in enumerate(upload_handlers): + file_obj = handler.file_complete(counters[i]) + if file_obj: + upload = file_obj + break + else: + if len(request.FILES) == 1: + upload, filename, is_raw = handle_request_files_upload(request) + else: + raise UploadException("AJAX request not valid: Bad Upload") + return upload, filename, is_raw + + +def handle_request_files_upload(request): + is_raw = False + upload = list(request.FILES.values())[0] + filename = upload.name + return upload, filename, is_raw + + +def slugify(string): + return slugify_django(unidecode(force_text(string))) + + +~~def get_valid_filename(s): + s = get_valid_filename_django(s) + filename, ext = os.path.splitext(s) + filename = slugify(filename) + ext = slugify(ext) + if ext: + return "%s.%s" % (filename, ext) + else: + return "%s" % (filename,) + + + +## ... source file continues with no further get_valid_filename examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-slugify.markdown b/content/pages/examples/django/django-utils-text-slugify.markdown new file mode 100644 index 000000000..739c0520a --- /dev/null +++ b/content/pages/examples/django/django-utils-text-slugify.markdown @@ -0,0 +1,562 @@ +title: django.utils.text slugify Example Code +category: page +slug: django-utils-text-slugify-examples +sortorder: 500011493 +toc: False +sidebartitle: django.utils.text slugify +meta: Python example code for the slugify callable from the django.utils.text module of the Django project. + + +slugify is a callable within the django.utils.text module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / forms / wizards.py**](https://github.com/divio/django-cms/blob/develop/cms/forms/wizards.py) + +```python +# wizards.py + +from __future__ import unicode_literals + +from django import forms +from django.core.exceptions import ValidationError +from django.db import transaction +~~from django.utils.text import slugify +from django.utils.translation import ( + ugettext, + ugettext_lazy as _, +) + +from cms.admin.forms import AddPageForm +from cms.plugin_pool import plugin_pool +from cms.utils import get_current_site, permissions +from cms.utils.page import get_available_slug +from cms.utils.page_permissions import ( + user_can_add_page, + user_can_add_subpage, +) +from cms.utils.conf import get_cms_setting +from cms.utils.urlutils import static_with_version + +try: + from djangocms_text_ckeditor.widgets import TextEditorWidget + text_widget = TextEditorWidget +except ImportError: + text_widget = forms.Textarea + + +class SlugWidget(forms.widgets.TextInput): + + +## ... source file abbreviated to get to slugify examples ... + + + super(CreateCMSPageForm, self).__init__(*args, **kwargs) + self.fields['title'].help_text = _(u"Provide a title for the new page.") + self.fields['slug'].required = False + self.fields['slug'].widget = SlugWidget() + self.fields['slug'].help_text = _(u"Leave empty for automatic slug, or override as required.") + + @staticmethod + def get_placeholder(page, slot=None): + placeholders = page.get_placeholders() + + if slot: + placeholders = placeholders.filter(slot=slot) + + for ph in placeholders: + if not ph.is_static and ph.is_editable: + return ph + + return None + + def clean(self): + data = self.cleaned_data + + if self._errors: + return data + +~~ slug = data.get('slug') or slugify(data['title']) + + parent_node = data.get('parent_node') + + if parent_node: + base = parent_node.item.get_path(self._language) + path = u'%s/%s' % (base, slug) if base else slug + else: + base = '' + path = slug + + data['slug'] = get_available_slug(self._site, path, self._language, suffix=None) + data['path'] = '%s/%s' % (base, data['slug']) if base else data['slug'] + + if not data['slug']: + raise forms.ValidationError("Please provide a valid slug.") + return data + + def clean_parent_node(self): + if self.page and self.sub_page_form: + parent_page = self.page + elif self.page and self.page.parent_page: + parent_page = self.page.parent_page + else: + parent_page = None + + +## ... source file continues with no further slugify examples... + +``` + + +## Example 2 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 + from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +~~from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + kwargs.setdefault('content_type', 'application/json') + data = json.dumps(data, cls=encoder) + super(JsonResponse, self).__init__(content=data, **kwargs) + + +def get_app_list(context, order=True): + admin_site = get_admin_site(context) + request = context['request'] + + app_dict = {} + for model, model_admin in admin_site._registry.items(): + + +## ... source file abbreviated to get to slugify examples ... + + + )) + + if name in models: + item = models[name].copy() + + if 'label' in data: + item['label'] = data['label'] + + if 'url' in data: + item['url'] = get_menu_item_url(data['url'], original_app_list) + + if 'url_blank' in data: + item['url_blank'] = data['url_blank'] + + if 'permissions' in data: + item['has_perms'] = item.get('has_perms', True) and context['user'].has_perms(data['permissions']) + + return item + + def get_menu_item_app(data): + app_label = data.get('app_label') + + if not app_label: + if 'label' not in data: + raise Exception('Custom menu items should at least have \'label\' or \'app_label\' key') +~~ app_label = 'custom_%s' % slugify(data['label'], allow_unicode=True) + + if app_label in original_app_list: + item = original_app_list[app_label].copy() + else: + item = {'app_label': app_label, 'has_perms': True} + + if 'label' in data: + item['label'] = data['label'] + + if 'items' in data: + item['items'] = list(map(lambda x: get_menu_item_app_model(app_label, x), data['items'])) + + if 'url' in data: + item['url'] = get_menu_item_url(data['url'], original_app_list) + + if 'url_blank' in data: + item['url_blank'] = data['url_blank'] + + if 'permissions' in data: + item['has_perms'] = item.get('has_perms', True) and context['user'].has_perms(data['permissions']) + + item['pinned'] = item['app_label'] in pinned_apps + + return item + + +## ... source file continues with no further slugify examples... + +``` + + +## Example 3 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / exporters.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./exporters.py) + +```python +# exporters.py +from django.db import DatabaseError +from django.core.serializers.json import DjangoJSONEncoder +import json +import uuid +import string +import sys +from datetime import datetime +PY3 = sys.version_info[0] == 3 +if PY3: + import csv +else: + import unicodecsv as csv + +from django.utils.module_loading import import_string +~~from django.utils.text import slugify +from explorer import app_settings +from six import StringIO, BytesIO + + +def get_exporter_class(format): + class_str = dict(getattr(app_settings, 'EXPLORER_DATA_EXPORTERS'))[format] + return import_string(class_str) + + +class BaseExporter(object): + + name = '' + content_type = '' + file_extension = '' + + def __init__(self, query): + self.query = query + + def get_output(self, **kwargs): + value = self.get_file_output(**kwargs).getvalue() + if PY3: + return value + else: + return str(value) + + +## ... source file abbreviated to get to slugify examples ... + + + + row = 0 + col = 0 + header_style = wb.add_format({'bold': True}) + for header in res.header_strings: + ws.write(row, col, header, header_style) + col += 1 + + row = 1 + col = 0 + for data_row in res.data: + for data in data_row: + if isinstance(data, datetime) or isinstance(data, uuid.UUID): + data = str(data) + if isinstance(data, dict) or isinstance(data, list): + data = json.dumps(data) + ws.write(row, col, data) + col += 1 + row += 1 + col = 0 + + wb.close() + return output + + def _format_title(self): +~~ title = slugify(self.query.title) + return title[:31] + + + +## ... source file continues with no further slugify examples... + +``` + + +## Example 4 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / models.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./models.py) + +```python +# models.py +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.db import IntegrityError, models, router, transaction +~~from django.utils.text import slugify +from django.utils.translation import gettext, gettext_lazy as _ + +try: + from unidecode import unidecode +except ImportError: + + def unidecode(tag): + return tag + + +class TagBase(models.Model): + name = models.CharField(verbose_name=_("name"), unique=True, max_length=100) + slug = models.SlugField(verbose_name=_("slug"), unique=True, max_length=100) + + def __str__(self): + return self.name + + def __gt__(self, other): + return self.name.lower() > other.name.lower() + + def __lt__(self, other): + return self.name.lower() < other.name.lower() + + class Meta: + + +## ... source file abbreviated to get to slugify examples ... + + + using = kwargs.get("using") or router.db_for_write( + type(self), instance=self + ) + kwargs["using"] = using + try: + with transaction.atomic(using=using): + res = super().save(*args, **kwargs) + return res + except IntegrityError: + pass + slugs = set( + type(self) + ._default_manager.filter(slug__startswith=self.slug) + .values_list("slug", flat=True) + ) + i = 1 + while True: + slug = self.slugify(self.name, i) + if slug not in slugs: + self.slug = slug + return super().save(*args, **kwargs) + i += 1 + else: + return super().save(*args, **kwargs) + +~~ def slugify(self, tag, i=None): +~~ slug = slugify(unidecode(tag)) + if i is not None: + slug += "_%d" % i + return slug + + +class Tag(TagBase): + class Meta: + verbose_name = _("tag") + verbose_name_plural = _("tags") + app_label = "taggit" + + +class ItemBase(models.Model): + def __str__(self): + return gettext("%(object)s tagged with %(tag)s") % { + "object": self.content_object, + "tag": self.tag, + } + + class Meta: + abstract = True + + @classmethod + def tag_model(cls): + + +## ... source file continues with no further slugify examples... + +``` + + +## Example 5 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/models.py) + +```python +# models.py +import json +import logging +from collections import defaultdict +from io import StringIO +from urllib.parse import urlparse + +from django.conf import settings +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core import checks +from django.core.cache import cache +from django.core.exceptions import ValidationError +from django.core.handlers.base import BaseHandler +from django.core.handlers.wsgi import WSGIRequest +from django.db import models, transaction +from django.db.models import Case, Q, Value, When +from django.db.models.functions import Concat, Lower, Substr +from django.http import Http404 +from django.http.request import split_domain_port +from django.template.response import TemplateResponse +from django.urls import NoReverseMatch, reverse +from django.utils import timezone +from django.utils.cache import patch_cache_control +from django.utils.functional import cached_property +~~from django.utils.text import capfirst, slugify +from django.utils.translation import gettext_lazy as _ +from modelcluster.models import ( + ClusterableModel, get_all_child_m2m_relations, get_all_child_relations) +from treebeard.mp_tree import MP_Node + +from wagtail.core.query import PageQuerySet, TreeQuerySet +from wagtail.core.signals import page_published, page_unpublished, post_page_move, pre_page_move +from wagtail.core.sites import get_site_for_hostname +from wagtail.core.url_routing import RouteResult +from wagtail.core.utils import WAGTAIL_APPEND_SLASH, camelcase_to_underscore, resolve_model_string +from wagtail.search import index + + +logger = logging.getLogger('wagtail.core') + +PAGE_TEMPLATE_VAR = 'page' + + +class SiteManager(models.Manager): + def get_queryset(self): + return super(SiteManager, self).get_queryset().order_by(Lower("hostname")) + + def get_by_natural_key(self, hostname, port): + return self.get(hostname=hostname, port=port) + + +## ... source file abbreviated to get to slugify examples ... + + + def _slug_is_available(slug, parent_page, page=None): + if parent_page is None: + return True + + siblings = parent_page.get_children() + if page: + siblings = siblings.not_page(page) + + return not siblings.filter(slug=slug).exists() + + def _get_autogenerated_slug(self, base_slug): + candidate_slug = base_slug + suffix = 1 + parent_page = self.get_parent() + + while not Page._slug_is_available(candidate_slug, parent_page, self): + suffix += 1 + candidate_slug = "%s-%d" % (base_slug, suffix) + + return candidate_slug + + def full_clean(self, *args, **kwargs): + + if not self.slug: + allow_unicode = getattr(settings, 'WAGTAIL_ALLOW_UNICODE_SLUGS', True) +~~ base_slug = slugify(self.title, allow_unicode=allow_unicode) + + if base_slug: + self.slug = self._get_autogenerated_slug(base_slug) + + if not self.draft_title: + self.draft_title = self.title + + super().full_clean(*args, **kwargs) + + def clean(self): + super().clean() + if not Page._slug_is_available(self.slug, self.get_parent(), self): + raise ValidationError({'slug': _("This slug is already in use")}) + + @transaction.atomic + def save(self, clean=True, **kwargs): + if clean: + self.full_clean() + + update_descendant_url_paths = False + is_new = self.id is None + + if is_new: + self.set_url_path(self.get_parent()) + + +## ... source file continues with no further slugify examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-truncator.markdown b/content/pages/examples/django/django-utils-text-truncator.markdown new file mode 100644 index 000000000..a0fb92648 --- /dev/null +++ b/content/pages/examples/django/django-utils-text-truncator.markdown @@ -0,0 +1,152 @@ +title: django.utils.text Truncator Example Code +category: page +slug: django-utils-text-truncator-examples +sortorder: 500011488 +toc: False +sidebartitle: django.utils.text Truncator +meta: Python example code for the Truncator class from the django.utils.text module of the Django project. + + +Truncator is a class within the django.utils.text module of the Django project. + + +## Example 1 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / admin / widgets.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/widgets.py) + +```python +# widgets.py +import six +from six.moves import urllib +from django import forms +from django.contrib.admin.sites import site +from django.contrib.admin.widgets import ForeignKeyRawIdWidget +from django.template.loader import render_to_string +from django.templatetags.static import static +from django.urls import reverse +from django.utils.safestring import mark_safe +~~from django.utils.text import Truncator + + +class ForeignKeySearchInput(ForeignKeyRawIdWidget): + + widget_template = None + search_path = None + + def _media(self): + js_files = [ + static('django_extensions/js/jquery.bgiframe.js'), + static('django_extensions/js/jquery.ajaxQueue.js'), + static('django_extensions/js/jquery.autocomplete.js'), + ] + + return forms.Media( + css={'all': (static('django_extensions/css/jquery.autocomplete.css'), )}, + js=js_files, + ) + media = property(_media) + + def label_for_value(self, value): + key = self.rel.get_related_field().name + obj = self.rel.model._default_manager.get(**{key: value}) + +~~ return Truncator(obj).words(14, truncate='...') + + def __init__(self, rel, search_fields, attrs=None): + self.search_fields = search_fields + super().__init__(rel, site, attrs) + + def render(self, name, value, attrs=None, renderer=None): + if attrs is None: + attrs = {} + opts = self.rel.model._meta + app_label = opts.app_label + model_name = opts.object_name.lower() + related_url = reverse('admin:%s_%s_changelist' % (app_label, model_name)) + if not self.search_path: + self.search_path = urllib.parse.urljoin(related_url, 'foreignkey_autocomplete/') + params = self.url_parameters() + if params: + url = '?' + '&'.join(['%s=%s' % (k, v) for k, v in params.items()]) + else: + url = '' + + if 'class' not in attrs: + attrs['class'] = 'vForeignKeyRawIdAdminField' + output = [forms.TextInput.render(self, name, value, attrs)] + + + +## ... source file continues with no further Truncator examples... + +``` + + +## Example 2 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / utils / compatibility.py**](https://github.com/divio/django-filer/blob/develop/filer/utils/compatibility.py) + +```python +# compatibility.py +from __future__ import absolute_import, unicode_literals + +import sys + +from django.utils import six +from django.utils.functional import keep_lazy +~~from django.utils.text import Truncator, format_lazy + + +def string_concat(*strings): + return format_lazy('{}' * len(strings), *strings) + + +def truncate_words(s, num, end_text='...'): + truncate = end_text and ' %s' % end_text or '' +~~ return Truncator(s).words(num, truncate=truncate) + + +truncate_words = keep_lazy(truncate_words, six.text_type) + + +if not six.PY3: + fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def upath(path): + if six.PY2 and not isinstance(path, six.text_type): + return path.decode(fs_encoding) + return path + + +def get_delete_permission(opts): + from django.contrib.auth import get_permission_codename # noqa + return '%s.%s' % (opts.app_label, get_permission_codename('delete', opts)) + + +try: + from PIL import Image as PILImage # noqa + from PIL import ImageDraw as PILImageDraw # noqa + from PIL import ExifTags as PILExifTags # noqa + + +## ... source file continues with no further Truncator examples... + +``` + diff --git a/content/pages/examples/django/django-utils-timezone-get-current-timezone.markdown b/content/pages/examples/django/django-utils-timezone-get-current-timezone.markdown new file mode 100644 index 000000000..fd87a5d16 --- /dev/null +++ b/content/pages/examples/django/django-utils-timezone-get-current-timezone.markdown @@ -0,0 +1,79 @@ +title: django.utils.timezone get_current_timezone Example Code +category: page +slug: django-utils-timezone-get-current-timezone-examples +sortorder: 500011494 +toc: False +sidebartitle: django.utils.timezone get_current_timezone +meta: Python example code for the get_current_timezone callable from the django.utils.timezone module of the Django project. + + +get_current_timezone is a callable within the django.utils.timezone module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / models / imagemodels.py**](https://github.com/divio/django-filer/blob/develop/filer/models/imagemodels.py) + +```python +# imagemodels.py +from __future__ import absolute_import + +import logging +from datetime import datetime + +from django.conf import settings +from django.db import models +~~from django.utils.timezone import get_current_timezone, make_aware, now +from django.utils.translation import ugettext_lazy as _ + +from .abstract import BaseImage + + +logger = logging.getLogger("filer") + + +class Image(BaseImage): + date_taken = models.DateTimeField(_('date taken'), null=True, blank=True, + editable=False) + author = models.CharField(_('author'), max_length=255, null=True, blank=True) + must_always_publish_author_credit = models.BooleanField(_('must always publish author credit'), default=False) + must_always_publish_copyright = models.BooleanField(_('must always publish copyright'), default=False) + + class Meta(BaseImage.Meta): + swappable = 'FILER_IMAGE_MODEL' + default_manager_name = 'objects' + + def save(self, *args, **kwargs): + if self.date_taken is None: + try: + exif_date = self.exif.get('DateTimeOriginal', None) + if exif_date is not None: + d, t = exif_date.split(" ") + year, month, day = d.split(':') + hour, minute, second = t.split(':') + if getattr(settings, "USE_TZ", False): +~~ tz = get_current_timezone() + self.date_taken = make_aware(datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)), tz) + else: + self.date_taken = datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)) + except Exception: + pass + if self.date_taken is None: + self.date_taken = now() + super(Image, self).save(*args, **kwargs) + + + +## ... source file continues with no further get_current_timezone examples... + +``` + diff --git a/content/pages/examples/django/django-utils-timezone-make-aware.markdown b/content/pages/examples/django/django-utils-timezone-make-aware.markdown new file mode 100644 index 000000000..7935b8df0 --- /dev/null +++ b/content/pages/examples/django/django-utils-timezone-make-aware.markdown @@ -0,0 +1,296 @@ +title: django.utils.timezone make_aware Example Code +category: page +slug: django-utils-timezone-make-aware-examples +sortorder: 500011495 +toc: False +sidebartitle: django.utils.timezone make_aware +meta: Python example code for the make_aware callable from the django.utils.timezone module of the Django project. + + +make_aware is a callable within the django.utils.timezone module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / models / imagemodels.py**](https://github.com/divio/django-filer/blob/develop/filer/models/imagemodels.py) + +```python +# imagemodels.py +from __future__ import absolute_import + +import logging +from datetime import datetime + +from django.conf import settings +from django.db import models +~~from django.utils.timezone import get_current_timezone, make_aware, now +from django.utils.translation import ugettext_lazy as _ + +from .abstract import BaseImage + + +logger = logging.getLogger("filer") + + +class Image(BaseImage): + date_taken = models.DateTimeField(_('date taken'), null=True, blank=True, + editable=False) + author = models.CharField(_('author'), max_length=255, null=True, blank=True) + must_always_publish_author_credit = models.BooleanField(_('must always publish author credit'), default=False) + must_always_publish_copyright = models.BooleanField(_('must always publish copyright'), default=False) + + class Meta(BaseImage.Meta): + swappable = 'FILER_IMAGE_MODEL' + default_manager_name = 'objects' + + def save(self, *args, **kwargs): + if self.date_taken is None: + try: + exif_date = self.exif.get('DateTimeOriginal', None) + if exif_date is not None: + d, t = exif_date.split(" ") + year, month, day = d.split(':') + hour, minute, second = t.split(':') + if getattr(settings, "USE_TZ", False): + tz = get_current_timezone() +~~ self.date_taken = make_aware(datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)), tz) + else: + self.date_taken = datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)) + except Exception: + pass + if self.date_taken is None: + self.date_taken = now() + super(Image, self).save(*args, **kwargs) + + + +## ... source file continues with no further make_aware examples... + +``` + + +## Example 2 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / oauth2_validators.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./oauth2_validators.py) + +```python +# oauth2_validators.py +import base64 +import binascii +import http.client +import logging +from collections import OrderedDict +from datetime import datetime, timedelta +from urllib.parse import unquote_plus + +import requests +from django.conf import settings +from django.contrib.auth import authenticate, get_user_model +from django.core.exceptions import ObjectDoesNotExist +from django.db import transaction +from django.db.models import Q +from django.utils import timezone +~~from django.utils.timezone import make_aware +from django.utils.translation import gettext_lazy as _ +from oauthlib.oauth2 import RequestValidator + +from .exceptions import FatalClientError +from .models import ( + AbstractApplication, get_access_token_model, + get_application_model, get_grant_model, get_refresh_token_model +) +from .scopes import get_scopes_backend +from .settings import oauth2_settings + + +log = logging.getLogger("oauth2_provider") + +GRANT_TYPE_MAPPING = { + "authorization_code": (AbstractApplication.GRANT_AUTHORIZATION_CODE, ), + "password": (AbstractApplication.GRANT_PASSWORD, ), + "client_credentials": (AbstractApplication.GRANT_CLIENT_CREDENTIALS, ), + "refresh_token": ( + AbstractApplication.GRANT_AUTHORIZATION_CODE, + AbstractApplication.GRANT_PASSWORD, + AbstractApplication.GRANT_CLIENT_CREDENTIALS, + ) +} + + +## ... source file abbreviated to get to make_aware examples ... + + + content = response.json() + except ValueError: + log.exception("Introspection: Failed to parse response as json") + return None + + if "active" in content and content["active"] is True: + if "username" in content: + user, _created = UserModel.objects.get_or_create( + **{UserModel.USERNAME_FIELD: content["username"]} + ) + else: + user = None + + max_caching_time = datetime.now() + timedelta( + seconds=oauth2_settings.RESOURCE_SERVER_TOKEN_CACHING_SECONDS + ) + + if "exp" in content: + expires = datetime.utcfromtimestamp(content["exp"]) + if expires > max_caching_time: + expires = max_caching_time + else: + expires = max_caching_time + + scope = content.get("scope", "") +~~ expires = make_aware(expires) + + access_token, _created = AccessToken.objects.update_or_create( + token=token, + defaults={ + "user": user, + "application": None, + "scope": scope, + "expires": expires, + }) + + return access_token + + def validate_bearer_token(self, token, scopes, request): + if not token: + return False + + introspection_url = oauth2_settings.RESOURCE_SERVER_INTROSPECTION_URL + introspection_token = oauth2_settings.RESOURCE_SERVER_AUTH_TOKEN + introspection_credentials = oauth2_settings.RESOURCE_SERVER_INTROSPECTION_CREDENTIALS + + try: + access_token = AccessToken.objects.select_related("application", "user").get(token=token) + except AccessToken.DoesNotExist: + access_token = None + + +## ... source file continues with no further make_aware examples... + +``` + + +## Example 3 from graphite-web +[Graphite](https://github.com/graphite-project/graphite-web) +([project website](http://graphiteapp.org/), +[documentation](https://graphite.readthedocs.io/en/latest/) and +[PyPI package information](https://pypi.org/project/graphite-web/)) +is a metrics collection and visualization tool, built with both +Python and JavaScript. Metrics are collected by a Node.js application +and displayed using a [Django](/django.html) web application, +called "Graphite-Web", which is one of three core projects under +the Graphite umbrella (the other two are +[Carbon](https://github.com/graphite-project/carbon) and +[Whisper](https://github.com/graphite-project/whisper)). + +Graphite is provided as open sourced under the +[Apache License 2.0](https://github.com/graphite-project/whisper/blob/master/LICENSE). + +[**graphite-web / webapp / graphite / util.py**](https://github.com/graphite-project/graphite-web/blob/master/webapp/graphite/util.py) + +```python +# util.py + +import imp +import io +import json as _json +import socket +import time +import sys +import calendar +import pytz +import six +import traceback + +from datetime import datetime +from functools import wraps +from os.path import splitext, basename + +from django.conf import settings +~~from django.utils.timezone import make_aware + +from graphite.compat import HttpResponse +from graphite.logger import log + +if sys.version_info >= (3, 0): + PY3 = True + import pickle + from io import BytesIO +else: + PY3 = False + import cPickle as pickle + from cStringIO import StringIO as BytesIO + +try: + import msgpack # NOQA +except ImportError: + import graphite.umsgpack as msgpack # NOQA + + +def epoch(dt): + if not dt.tzinfo: + tb = traceback.extract_stack(None, 2) + log.warning('epoch() called with non-timezone-aware datetime in %s at %s:%d' % (tb[0][2], tb[0][0], tb[0][1])) + return calendar.timegm(make_aware(dt, pytz.timezone(settings.TIME_ZONE)).astimezone(pytz.utc).timetuple()) + return calendar.timegm(dt.astimezone(pytz.utc).timetuple()) + + +def epoch_to_dt(timestamp): +~~ return make_aware(datetime.utcfromtimestamp(timestamp), pytz.utc) + + +def timebounds(requestContext): + startTime = int(epoch(requestContext['startTime'])) + endTime = int(epoch(requestContext['endTime'])) + now = int(epoch(requestContext['now'])) + + return (startTime, endTime, now) + + +def is_local_interface(host): + is_ipv6 = False + if ':' not in host: + pass + elif host.count(':') == 1: + host = host.split(':', 1)[0] + else: + is_ipv6 = True + + if host.find('[', 0, 2) != -1: + last_bracket_position = host.rfind(']') + last_colon_position = host.rfind(':') + if last_colon_position > last_bracket_position: + host = host.rsplit(':', 1)[0] + + +## ... source file continues with no further make_aware examples... + +``` + diff --git a/content/pages/examples/django/django-utils-timezone-now.markdown b/content/pages/examples/django/django-utils-timezone-now.markdown new file mode 100644 index 000000000..46a227ee3 --- /dev/null +++ b/content/pages/examples/django/django-utils-timezone-now.markdown @@ -0,0 +1,825 @@ +title: django.utils.timezone now Example Code +category: page +slug: django-utils-timezone-now-examples +sortorder: 500011496 +toc: False +sidebartitle: django.utils.timezone now +meta: Python example code for the now callable from the django.utils.timezone module of the Django project. + + +now is a callable within the django.utils.timezone module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / utils.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/utils.py) + +```python +# utils.py +import unicodedata +from collections import OrderedDict +from datetime import timedelta + +from django.conf import settings +from django.contrib import messages +from django.contrib.auth import update_session_auth_hash +from django.core.exceptions import FieldDoesNotExist, ValidationError +from django.db import models +from django.db.models import Q +from django.http import HttpResponseRedirect +from django.utils.encoding import force_str +from django.utils.http import base36_to_int, int_to_base36, urlencode +~~from django.utils.timezone import now + +from ..exceptions import ImmediateHttpResponse +from ..utils import ( + get_request_param, + get_user_model, + import_callable, + valid_email_or_none, +) +from . import app_settings, signals +from .adapter import get_adapter +from .app_settings import EmailVerificationMethod + + +def _unicode_ci_compare(s1, s2): + norm_s1 = unicodedata.normalize('NFKC', s1).casefold() + norm_s2 = unicodedata.normalize('NFKC', s2).casefold() + return norm_s1 == norm_s2 + + +def get_next_redirect_url(request, redirect_field_name="next"): + redirect_to = get_request_param(request, redirect_field_name) + if not get_adapter(request).is_safe_url(redirect_to): + redirect_to = None + return redirect_to + + +## ... source file abbreviated to get to now examples ... + + + a.user = user + a.save() + EmailAddress.objects.fill_cache_for_user(user, addresses) + if (primary and email and email.lower() != primary.email.lower()): + user_email(user, primary.email) + user.save() + return primary + + +def send_email_confirmation(request, user, signup=False): + from .models import EmailAddress, EmailConfirmation + + cooldown_period = timedelta( + seconds=app_settings.EMAIL_CONFIRMATION_COOLDOWN + ) + + email = user_email(user) + if email: + try: + email_address = EmailAddress.objects.get_for_user(user, email) + if not email_address.verified: + if app_settings.EMAIL_CONFIRMATION_HMAC: + send_email = True + else: + send_email = not EmailConfirmation.objects.filter( +~~ sent__gt=now() - cooldown_period, + email_address=email_address).exists() + if send_email: + email_address.send_confirmation(request, + signup=signup) + else: + send_email = False + except EmailAddress.DoesNotExist: + send_email = True + email_address = EmailAddress.objects.add_email(request, + user, + email, + signup=signup, + confirm=True) + assert email_address + if send_email: + get_adapter(request).add_message( + request, + messages.INFO, + 'account/messages/' + 'email_confirmation_sent.txt', + {'email': email}) + if signup: + get_adapter(request).stash_user(request, user_pk_to_url_str(user)) + + + +## ... source file continues with no further now examples... + +``` + + +## Example 2 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / attempts.py**](https://github.com/jazzband/django-axes/blob/master/axes/./attempts.py) + +```python +# attempts.py +from logging import getLogger + +from django.db.models import QuerySet +~~from django.utils.timezone import datetime, now + +from axes.conf import settings +from axes.models import AccessAttempt +from axes.helpers import get_client_username, get_client_parameters, get_cool_off + +log = getLogger(settings.AXES_LOGGER) + + +def get_cool_off_threshold(attempt_time: datetime = None) -> datetime: + + cool_off = get_cool_off() + if cool_off is None: + raise TypeError( + "Cool off threshold can not be calculated with settings.AXES_COOLOFF_TIME set to None" + ) + + if attempt_time is None: +~~ return now() - cool_off + return attempt_time - cool_off + + +def filter_user_attempts(request, credentials: dict = None) -> QuerySet: + + username = get_client_username(request, credentials) + + filter_kwargs = get_client_parameters( + username, request.axes_ip_address, request.axes_user_agent + ) + + return AccessAttempt.objects.filter(**filter_kwargs) + + +def get_user_attempts(request, credentials: dict = None) -> QuerySet: + + attempts = filter_user_attempts(request, credentials) + + if settings.AXES_COOLOFF_TIME is None: + log.debug( + "AXES: Getting all access attempts from database because no AXES_COOLOFF_TIME is configured" + ) + return attempts + + + +## ... source file continues with no further now examples... + +``` + + +## Example 3 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / views.py**](https://github.com/divio/django-cms/blob/develop/cms/./views.py) + +```python +# views.py + +from django.conf import settings +from django.contrib.auth import REDIRECT_FIELD_NAME, login as auth_login +from django.contrib.auth.views import redirect_to_login +from django.http import HttpResponse, HttpResponseRedirect +from django.urls import reverse +from django.utils.cache import patch_cache_control +from django.utils.http import is_safe_url, urlquote +~~from django.utils.timezone import now +from django.utils.translation import get_language_from_request +from django.views.decorators.http import require_POST + +from cms.cache.page import get_page_cache +from cms.exceptions import LanguageError +from cms.forms.login import CMSToolbarLoginForm +from cms.models.pagemodel import TreeNode +from cms.page_rendering import _handle_no_page, render_page, render_object_structure, _render_welcome_page +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils import get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import (get_fallback_languages, get_public_languages, + get_redirect_on_fallback, get_language_list, + get_default_language_for_site, + is_language_prefix_patterns_used) +from cms.utils.page import get_page_from_request +from cms.utils.page_permissions import user_can_change_page + + +def _clean_redirect_url(redirect_url, language): + if (redirect_url and is_language_prefix_patterns_used() and redirect_url[0] == "/" + and not redirect_url.startswith('/%s/' % language)): + redirect_url = "/%s/%s" % (language, redirect_url.lstrip("/")) + return redirect_url + + +def details(request, slug): +~~ response_timestamp = now() + if get_cms_setting("PAGE_CACHE") and ( + not hasattr(request, 'toolbar') or ( + not request.toolbar.edit_mode_active and + not request.toolbar.show_toolbar and + not request.user.is_authenticated + ) + ): + cache_content = get_page_cache(request) + if cache_content is not None: + content, headers, expires_datetime = cache_content + response = HttpResponse(content) + response.xframe_options_exempt = True + response._headers = headers + max_age = int( + (expires_datetime - response_timestamp).total_seconds() + 0.5) + patch_cache_control(response, max_age=max_age) + return response + + site = get_current_site() + page = get_page_from_request(request, use_path=slug) + toolbar = get_toolbar_from_request(request) + tree_nodes = TreeNode.objects.get_for_site(site) + + if not page and not slug and not tree_nodes.exists(): + + +## ... source file continues with no further now examples... + +``` + + +## Example 4 from django-downloadview +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + +[**django-downloadview / django_downloadview / nginx / response.py**](https://github.com/benoitbryon/django-downloadview/blob/master/django_downloadview/nginx/response.py) + +```python +# response.py +from datetime import timedelta + +~~from django.utils.timezone import now + +from django_downloadview.response import ProxiedDownloadResponse, content_disposition +from django_downloadview.utils import content_type_to_charset, url_basename + + +class XAccelRedirectResponse(ProxiedDownloadResponse): + "Http response that delegates serving file to Nginx via X-Accel headers." + + def __init__( + self, + redirect_url, + content_type, + basename=None, + expires=None, + with_buffering=None, + limit_rate=None, + attachment=True, + ): + super(XAccelRedirectResponse, self).__init__(content_type=content_type) + if attachment: + self.basename = basename or url_basename(redirect_url, content_type) + self["Content-Disposition"] = content_disposition(self.basename) + self["X-Accel-Redirect"] = redirect_url + self["X-Accel-Charset"] = content_type_to_charset(content_type) + if with_buffering is not None: + self["X-Accel-Buffering"] = with_buffering and "yes" or "no" + if expires: +~~ expire_seconds = timedelta(expires - now()).seconds + self["X-Accel-Expires"] = expire_seconds + elif expires is not None: # We explicitely want it off. + self["X-Accel-Expires"] = "off" + if limit_rate is not None: + self["X-Accel-Limit-Rate"] = limit_rate and "%d" % limit_rate or "off" + + + +## ... source file continues with no further now examples... + +``` + + +## Example 5 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / db / models.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/db/models.py) + +```python +# models.py + +from django.db import models +~~from django.utils.timezone import now +from django.utils.translation import gettext_lazy as _ + +from django_extensions.db.fields import AutoSlugField, CreationDateTimeField, ModificationDateTimeField + + +class TimeStampedModel(models.Model): + + created = CreationDateTimeField(_('created')) + modified = ModificationDateTimeField(_('modified')) + + def save(self, **kwargs): + self.update_modified = kwargs.pop('update_modified', getattr(self, 'update_modified', True)) + super().save(**kwargs) + + class Meta: + get_latest_by = 'modified' + abstract = True + + +class TitleDescriptionModel(models.Model): + + title = models.CharField(_('title'), max_length=255) + description = models.TextField(_('description'), blank=True, null=True) + + + +## ... source file abbreviated to get to now examples ... + + + + def inactive(self): + return self.get_queryset().inactive() + + +class ActivatorModel(models.Model): + + INACTIVE_STATUS = 0 + ACTIVE_STATUS = 1 + + STATUS_CHOICES = ( + (INACTIVE_STATUS, _('Inactive')), + (ACTIVE_STATUS, _('Active')), + ) + status = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=ACTIVE_STATUS) + activate_date = models.DateTimeField(blank=True, null=True, help_text=_('keep empty for an immediate activation')) + deactivate_date = models.DateTimeField(blank=True, null=True, help_text=_('keep empty for indefinite activation')) + objects = ActivatorModelManager() + + class Meta: + ordering = ('status', '-activate_date',) + abstract = True + + def save(self, *args, **kwargs): + if not self.activate_date: +~~ self.activate_date = now() + super().save(*args, **kwargs) + + + +## ... source file continues with no further now examples... + +``` + + +## Example 6 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / models / imagemodels.py**](https://github.com/divio/django-filer/blob/develop/filer/models/imagemodels.py) + +```python +# imagemodels.py +from __future__ import absolute_import + +import logging +from datetime import datetime + +from django.conf import settings +from django.db import models +~~from django.utils.timezone import get_current_timezone, make_aware, now +from django.utils.translation import ugettext_lazy as _ + +from .abstract import BaseImage + + +logger = logging.getLogger("filer") + + +class Image(BaseImage): + date_taken = models.DateTimeField(_('date taken'), null=True, blank=True, + editable=False) + author = models.CharField(_('author'), max_length=255, null=True, blank=True) + must_always_publish_author_credit = models.BooleanField(_('must always publish author credit'), default=False) + must_always_publish_copyright = models.BooleanField(_('must always publish copyright'), default=False) + + class Meta(BaseImage.Meta): + swappable = 'FILER_IMAGE_MODEL' + default_manager_name = 'objects' + + def save(self, *args, **kwargs): + if self.date_taken is None: + try: + exif_date = self.exif.get('DateTimeOriginal', None) + if exif_date is not None: + d, t = exif_date.split(" ") + year, month, day = d.split(':') + hour, minute, second = t.split(':') + if getattr(settings, "USE_TZ", False): + tz = get_current_timezone() + self.date_taken = make_aware(datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)), tz) + else: + self.date_taken = datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)) + except Exception: + pass + if self.date_taken is None: +~~ self.date_taken = now() + super(Image, self).save(*args, **kwargs) + + + +## ... source file continues with no further now examples... + +``` + + +## Example 7 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / filters.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./filters.py) + +```python +# filters.py +from collections import OrderedDict +from datetime import timedelta + +from django import forms +from django.db.models import Q +from django.db.models.constants import LOOKUP_SEP +from django.forms.utils import pretty_name +from django.utils.itercompat import is_iterable +~~from django.utils.timezone import now +from django.utils.translation import gettext_lazy as _ + +from .conf import settings +from .constants import EMPTY_VALUES +from .fields import ( + BaseCSVField, + BaseRangeField, + ChoiceField, + DateRangeField, + DateTimeRangeField, + IsoDateTimeField, + IsoDateTimeRangeField, + LookupChoiceField, + ModelChoiceField, + ModelMultipleChoiceField, + MultipleChoiceField, + RangeField, + TimeRangeField +) +from .utils import get_model_field, label_for_filter + +__all__ = [ + 'AllValuesFilter', + 'AllValuesMultipleFilter', + + +## ... source file abbreviated to get to now examples ... + + + elif value.start is not None: + self.lookup_expr = 'gte' + value = value.start + elif value.stop is not None: + self.lookup_expr = 'lte' + value = value.stop + + return super().filter(qs, value) + + +def _truncate(dt): + return dt.date() + + +class DateRangeFilter(ChoiceFilter): + choices = [ + ('today', _('Today')), + ('yesterday', _('Yesterday')), + ('week', _('Past 7 days')), + ('month', _('This month')), + ('year', _('This year')), + ] + + filters = { + 'today': lambda qs, name: qs.filter(**{ +~~ '%s__year' % name: now().year, +~~ '%s__month' % name: now().month, +~~ '%s__day' % name: now().day + }), + 'yesterday': lambda qs, name: qs.filter(**{ + '%s__year' % name: (now() - timedelta(days=1)).year, + '%s__month' % name: (now() - timedelta(days=1)).month, + '%s__day' % name: (now() - timedelta(days=1)).day, + }), + 'week': lambda qs, name: qs.filter(**{ + '%s__gte' % name: _truncate(now() - timedelta(days=7)), + '%s__lt' % name: _truncate(now() + timedelta(days=1)), + }), + 'month': lambda qs, name: qs.filter(**{ +~~ '%s__year' % name: now().year, +~~ '%s__month' % name: now().month + }), + 'year': lambda qs, name: qs.filter(**{ +~~ '%s__year' % name: now().year, + }), + } + + def __init__(self, choices=None, filters=None, *args, **kwargs): + if choices is not None: + self.choices = choices + if filters is not None: + self.filters = filters + + unique = set([x[0] for x in self.choices]) ^ set(self.filters) + assert not unique, \ + "Keys must be present in both 'choices' and 'filters'. Missing keys: " \ + "'%s'" % ', '.join(sorted(unique)) + + assert not hasattr(self, 'options'), \ + "The 'options' attribute has been replaced by 'choices' and 'filters'. " \ + "See: https://django-filter.readthedocs.io/en/master/guide/migration.html" + + kwargs.setdefault('null_label', None) + super().__init__(choices=self.choices, *args, **kwargs) + + def filter(self, qs, value): + if not value: + return qs + + +## ... source file continues with no further now examples... + +``` + + +## Example 8 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / mixins.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./mixins.py) + +```python +# mixins.py +from django.http import HttpResponse +~~from django.utils.timezone import now +from django.views.generic.edit import FormView + +from .formats import base_formats +from .forms import ExportForm +from .resources import modelresource_factory +from .signals import post_export + + +class ExportViewMixin: + formats = base_formats.DEFAULT_FORMATS + form_class = ExportForm + resource_class = None + + def get_export_formats(self): + return [f for f in self.formats if f().can_export()] + + def get_resource_class(self): + if not self.resource_class: + return modelresource_factory(self.model) + return self.resource_class + + def get_export_resource_class(self): + return self.get_resource_class() + + def get_resource_kwargs(self, request, *args, **kwargs): + return {} + + def get_export_resource_kwargs(self, request, *args, **kwargs): + return self.get_resource_kwargs(request, *args, **kwargs) + + def get_export_data(self, file_format, queryset, *args, **kwargs): + resource_class = self.get_export_resource_class() + data = resource_class(**self.get_export_resource_kwargs(self.request))\ + .export(queryset, *args, **kwargs) + export_data = file_format.export_data(data) + return export_data + + def get_export_filename(self, file_format): +~~ date_str = now().strftime('%Y-%m-%d') + filename = "%s-%s.%s" % (self.model.__name__, + date_str, + file_format.get_extension()) + return filename + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + return context + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs['formats'] = self.get_export_formats() + return kwargs + + +class ExportViewFormMixin(ExportViewMixin, FormView): + def form_valid(self, form): + formats = self.get_export_formats() + file_format = formats[ + int(form.cleaned_data['file_format']) + ]() + if hasattr(self, 'get_filterset'): + queryset = self.get_filterset(self.get_filterset_class()).qs + else: + + +## ... source file continues with no further now examples... + +``` + + +## Example 9 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / fields.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./fields.py) + +```python +# fields.py +import uuid +from django.db import models +from django.conf import settings +from django.core.exceptions import ValidationError +~~from django.utils.timezone import now + +DEFAULT_CHOICES_NAME = 'STATUS' + + +class AutoCreatedField(models.DateTimeField): + + def __init__(self, *args, **kwargs): + kwargs.setdefault('editable', False) + kwargs.setdefault('default', now) + super().__init__(*args, **kwargs) + + +class AutoLastModifiedField(AutoCreatedField): + def get_default(self): + if not hasattr(self, "_default"): + self._default = self._get_default() + return self._default + + def pre_save(self, model_instance, add): +~~ value = now() + if add: + current_value = getattr(model_instance, self.attname, self.get_default()) + if current_value != self.get_default(): + value = getattr(model_instance, self.attname) + else: + for field in model_instance._meta.get_fields(): + if isinstance(field, AutoCreatedField): + value = getattr(model_instance, field.name) + break + setattr(model_instance, self.attname, value) + return value + + +class StatusField(models.CharField): + + def __init__(self, *args, **kwargs): + kwargs.setdefault('max_length', 100) + self.check_for_status = not kwargs.pop('no_check_for_status', False) + self.choices_name = kwargs.pop('choices_name', DEFAULT_CHOICES_NAME) + super().__init__(*args, **kwargs) + + def prepare_class(self, sender, **kwargs): + if not sender._meta.abstract and self.check_for_status: + assert hasattr(sender, self.choices_name), \ + + +## ... source file abbreviated to get to now examples ... + + + monitor = kwargs.pop('monitor', None) + if not monitor: + raise TypeError( + '%s requires a "monitor" argument' % self.__class__.__name__) + self.monitor = monitor + when = kwargs.pop('when', None) + if when is not None: + when = set(when) + self.when = when + super().__init__(*args, **kwargs) + + def contribute_to_class(self, cls, name): + self.monitor_attname = '_monitor_%s' % name + models.signals.post_init.connect(self._save_initial, sender=cls) + super().contribute_to_class(cls, name) + + def get_monitored_value(self, instance): + return getattr(instance, self.monitor) + + def _save_initial(self, sender, instance, **kwargs): + if self.monitor in instance.get_deferred_fields(): + return + setattr(instance, self.monitor_attname, self.get_monitored_value(instance)) + + def pre_save(self, model_instance, add): +~~ value = now() + previous = getattr(model_instance, self.monitor_attname, None) + current = self.get_monitored_value(model_instance) + if previous != current: + if self.when is None or current in self.when: + setattr(model_instance, self.attname, value) + self._save_initial(model_instance.__class__, model_instance) + return super().pre_save(model_instance, add) + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + kwargs['monitor'] = self.monitor + if self.when is not None: + kwargs['when'] = self.when + return name, path, args, kwargs + + +SPLIT_MARKER = getattr(settings, 'SPLIT_MARKER', '') + +SPLIT_DEFAULT_PARAGRAPHS = getattr(settings, 'SPLIT_DEFAULT_PARAGRAPHS', 2) + + +def _excerpt_field_name(name): + return '_%s_excerpt' % name + + + +## ... source file continues with no further now examples... + +``` + diff --git a/content/pages/examples/django/django-utils-timezone-timedelta.markdown b/content/pages/examples/django/django-utils-timezone-timedelta.markdown new file mode 100644 index 000000000..4bd751e05 --- /dev/null +++ b/content/pages/examples/django/django-utils-timezone-timedelta.markdown @@ -0,0 +1,177 @@ +title: django.utils.timezone timedelta Example Code +category: page +slug: django-utils-timezone-timedelta-examples +sortorder: 500011497 +toc: False +sidebartitle: django.utils.timezone timedelta +meta: Python example code for the timedelta callable from the django.utils.timezone module of the Django project. + + +timedelta is a callable within the django.utils.timezone module of the Django project. + + +## Example 1 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / tests / test_handlers.py**](https://github.com/jazzband/django-axes/blob/master/axes/tests/test_handlers.py) + +```python +# test_handlers.py +from unittest.mock import MagicMock, patch + +from django.test import override_settings +from django.urls import reverse +from django.utils import timezone +~~from django.utils.timezone import timedelta + +from axes.conf import settings +from axes.handlers.proxy import AxesProxyHandler +from axes.helpers import get_client_str +from axes.models import AccessAttempt, AccessLog +from axes.tests.base import AxesTestCase + + +@override_settings(AXES_HANDLER="axes.handlers.base.AxesHandler") +class AxesHandlerTestCase(AxesTestCase): + def test_base_handler_reset_attempts_raises(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.reset_attempts() + + def test_base_handler_reset_logs_raises(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.reset_logs() + + def test_base_handler_raises_on_undefined_is_allowed_to_authenticate(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.is_allowed(self.request, {}) + + @override_settings(AXES_IP_BLACKLIST=["127.0.0.1"]) + def test_is_allowed_with_blacklisted_ip_address(self): + + +## ... source file abbreviated to get to timedelta examples ... + + + +class AxesHandlerBaseTestCase(AxesTestCase): + def check_whitelist(self, log): + with override_settings( + AXES_NEVER_LOCKOUT_WHITELIST=True, AXES_IP_WHITELIST=[self.ip_address] + ): + AxesProxyHandler.user_login_failed( + sender=None, request=self.request, credentials=self.credentials + ) + client_str = get_client_str( + self.username, self.ip_address, self.user_agent, self.path_info + ) + log.info.assert_called_with( + "AXES: Login failed from whitelisted client %s.", client_str + ) + + def check_empty_request(self, log, handler): + AxesProxyHandler.user_login_failed(sender=None, credentials={}, request=None) + log.error.assert_called_with( + f"AXES: {handler}.user_login_failed does not function without a request." + ) + + +@override_settings( + AXES_HANDLER="axes.handlers.database.AxesDatabaseHandler", +~~ AXES_COOLOFF_TIME=timedelta(seconds=1), + AXES_RESET_ON_SUCCESS=True, +) +class AxesDatabaseHandlerTestCase(AxesHandlerBaseTestCase): + def test_handler_reset_attempts(self): + self.create_attempt() + self.assertEqual(1, AxesProxyHandler.reset_attempts()) + self.assertFalse(AccessAttempt.objects.count()) + + def test_handler_reset_logs(self): + self.create_log() + self.assertEqual(1, AxesProxyHandler.reset_logs()) + self.assertFalse(AccessLog.objects.count()) + + def test_handler_reset_logs_older_than_42_days(self): + self.create_log() + + then = timezone.now() - timezone.timedelta(days=90) + with patch("django.utils.timezone.now", return_value=then): + self.create_log() + + self.assertEqual(AccessLog.objects.count(), 2) + self.assertEqual(1, AxesProxyHandler.reset_logs(age_days=42)) + self.assertEqual(AccessLog.objects.count(), 1) + + + +## ... source file abbreviated to get to timedelta examples ... + + + usernames, + ) in configurations: + with self.settings(**overrides): + with self.subTest( + total_attempts_count=total_attempts_count, + failures_since_start=failures_since_start, + settings=overrides, + ): + self.login(username=usernames[0]) + attempt = AccessAttempt.objects.get(username=usernames[0]) + self.assertEqual(1, attempt.failures_since_start) + + self.login(username=usernames[1]) + attempt = AccessAttempt.objects.get(username=usernames[1]) + self.assertEqual(failures_since_start, attempt.failures_since_start) + + self.assertEqual( + total_attempts_count, AccessAttempt.objects.count() + ) + + AccessAttempt.objects.all().delete() + + +@override_settings( + AXES_HANDLER="axes.handlers.cache.AxesCacheHandler", +~~ AXES_COOLOFF_TIME=timedelta(seconds=1), +) +class AxesCacheHandlerTestCase(AxesHandlerBaseTestCase): + @override_settings(AXES_RESET_ON_SUCCESS=True) + def test_handler(self): + self.check_handler() + + @override_settings(AXES_RESET_ON_SUCCESS=False) + def test_handler_without_reset(self): + self.check_handler() + + @override_settings(AXES_LOCK_OUT_AT_FAILURE=False) + def test_handler_without_lockout(self): + self.check_handler() + + @patch("axes.handlers.cache.log") + def test_empty_request(self, log): + self.check_empty_request(log, "AxesCacheHandler") + + @patch("axes.handlers.cache.log") + def test_whitelist(self, log): + self.check_whitelist(log) + + +@override_settings(AXES_HANDLER="axes.handlers.dummy.AxesDummyHandler") + + +## ... source file continues with no further timedelta examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-activate.markdown b/content/pages/examples/django/django-utils-translation-activate.markdown index 1442cd3da..d5af83b0c 100644 --- a/content/pages/examples/django/django-utils-translation-activate.markdown +++ b/content/pages/examples/django/django-utils-translation-activate.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation activate code examples +title: django.utils.translation activate Example Code category: page slug: django-utils-translation-activate-examples -sortorder: 500011494 +sortorder: 500011499 toc: False sidebartitle: django.utils.translation activate -meta: Python example code for the activate function from the django.utils.translation module of the Django project. +meta: Python example code for the activate callable from the django.utils.translation module of the Django project. -activate is a function within the django.utils.translation module of the Django project. +activate is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -60,6 +60,11 @@ class PluginPool(object): ## ... source file abbreviated to get to activate examples ... + def get_text_enabled_plugins(self, placeholder, page): + plugins = set(self.get_all_plugins(placeholder, page)) + plugins.update(self.get_all_plugins(placeholder, page, 'text_only_plugins')) + return sorted((p for p in plugins if p.text_enabled), + key=attrgetter('module', 'name')) def get_plugin(self, name): self.discover_plugins() @@ -160,6 +165,11 @@ def test_items_hook(template_render_tag, template_context, common_tree): ## ... source file abbreviated to get to activate examples ... + register_items_hook(None) # Reset. + + +def test_i18n(build_tree, template_render_tag, template_context): + from sitetree.toolbox import register_i18n_trees build_tree( diff --git a/content/pages/examples/django/django-utils-translation-deactivate-all.markdown b/content/pages/examples/django/django-utils-translation-deactivate-all.markdown index c35b0be19..6f61206bf 100644 --- a/content/pages/examples/django/django-utils-translation-deactivate-all.markdown +++ b/content/pages/examples/django/django-utils-translation-deactivate-all.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation deactivate_all code examples +title: django.utils.translation deactivate_all Example Code category: page slug: django-utils-translation-deactivate-all-examples -sortorder: 500011495 +sortorder: 500011500 toc: False sidebartitle: django.utils.translation deactivate_all -meta: Python example code for the deactivate_all function from the django.utils.translation module of the Django project. +meta: Python example code for the deactivate_all callable from the django.utils.translation module of the Django project. -deactivate_all is a function within the django.utils.translation module of the Django project. +deactivate_all is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -60,6 +60,11 @@ class PluginPool(object): ## ... source file abbreviated to get to deactivate_all examples ... + if allowed_plugins: + plugins = (plugin for plugin in plugins if plugin.__name__ in allowed_plugins) + + if excluded_plugins: + plugins = (plugin for plugin in plugins if plugin.__name__ not in excluded_plugins) if placeholder: plugins = (plugin for plugin in plugins @@ -160,6 +165,11 @@ def test_items_hook(template_render_tag, template_context, common_tree): ## ... source file abbreviated to get to deactivate_all examples ... + + activate('en') + result = template_render_tag('sitetree', 'sitetree_tree from "i18tree"', template_context()) + + assert '/url_default/' in result assert 'My title' in result activate('ru') diff --git a/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown b/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown index 0b7d3d996..103efee74 100644 --- a/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown +++ b/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation get_language_from_request code examples +title: django.utils.translation get_language_from_request Example Code category: page slug: django-utils-translation-get-language-from-request-examples -sortorder: 500011497 +sortorder: 500011502 toc: False sidebartitle: django.utils.translation get_language_from_request -meta: Python example code for the get_language_from_request function from the django.utils.translation module of the Django project. +meta: Python example code for the get_language_from_request callable from the django.utils.translation module of the Django project. -get_language_from_request is a function within the django.utils.translation module of the Django project. +get_language_from_request is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-angular @@ -58,6 +58,11 @@ def djng_urls(context, *namespaces): ## ... source file abbreviated to get to get_language_from_request examples ... +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + if len(bits) < 2: + bits.append('1') values = [parser.compile_filter(bit) for bit in bits[1:]] django_nodelist = parser.parse(('endangularjs',)) angular_nodelist = NodeList() @@ -141,6 +146,11 @@ def _clean_redirect_url(redirect_url, language): ## ... source file abbreviated to get to get_language_from_request examples ... + response.xframe_options_exempt = True + response._headers = headers + max_age = int( + (expires_datetime - response_timestamp).total_seconds() + 0.5) + patch_cache_control(response, max_age=max_age) return response site = get_current_site() diff --git a/content/pages/examples/django/django-utils-translation-get-language.markdown b/content/pages/examples/django/django-utils-translation-get-language.markdown index b0cdc386a..1bf9ec1bc 100644 --- a/content/pages/examples/django/django-utils-translation-get-language.markdown +++ b/content/pages/examples/django/django-utils-translation-get-language.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation get_language code examples +title: django.utils.translation get_language Example Code category: page slug: django-utils-translation-get-language-examples -sortorder: 500011496 +sortorder: 500011501 toc: False sidebartitle: django.utils.translation get_language -meta: Python example code for the get_language function from the django.utils.translation module of the Django project. +meta: Python example code for the get_language callable from the django.utils.translation module of the Django project. -get_language is a function within the django.utils.translation module of the Django project. +get_language is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -60,6 +60,11 @@ class PluginPool(object): ## ... source file abbreviated to get to get_language examples ... + + if allowed_plugins: + plugins = (plugin for plugin in plugins if plugin.__name__ in allowed_plugins) + + if excluded_plugins: plugins = (plugin for plugin in plugins if plugin.__name__ not in excluded_plugins) if placeholder: @@ -175,6 +180,11 @@ _I18N_TREES: List[str] = [] ## ... source file abbreviated to get to get_language examples ... + + def get_entry(self, entry_name: str, key) -> Any: + return self.cache[entry_name].get(key, False) + + def update_entry_value(self, entry_name: str, key: str, value: Any): if key not in self.cache[entry_name]: self.cache[entry_name][key] = {} @@ -274,6 +284,11 @@ class UserProfile(models.Model): ## ... source file abbreviated to get to get_language examples ... + preferred_language = models.CharField( + verbose_name=_('preferred language'), + max_length=10, + help_text=_("Select language for the admin"), + default='' ) current_time_zone = models.CharField( diff --git a/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown index dd7ed3bab..c709f84b4 100644 --- a/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown +++ b/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation gettext_lazy code examples +title: django.utils.translation gettext_lazy Example Code category: page slug: django-utils-translation-gettext-lazy-examples -sortorder: 500011499 +sortorder: 500011504 toc: False sidebartitle: django.utils.translation gettext_lazy -meta: Python example code for the gettext_lazy function from the django.utils.translation module of the Django project. +meta: Python example code for the gettext_lazy callable from the django.utils.translation module of the Django project. -gettext_lazy is a function within the django.utils.translation module of the Django project. +gettext_lazy is a callable within the django.utils.translation module of the Django project. ## Example 1 from wagtail diff --git a/content/pages/examples/django/django-utils-translation-gettext.markdown b/content/pages/examples/django/django-utils-translation-gettext.markdown index 28b65593e..66705feae 100644 --- a/content/pages/examples/django/django-utils-translation-gettext.markdown +++ b/content/pages/examples/django/django-utils-translation-gettext.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation gettext code examples +title: django.utils.translation gettext Example Code category: page slug: django-utils-translation-gettext-examples -sortorder: 500011498 +sortorder: 500011503 toc: False sidebartitle: django.utils.translation gettext -meta: Python example code for the gettext function from the django.utils.translation module of the Django project. +meta: Python example code for the gettext callable from the django.utils.translation module of the Django project. -gettext is a function within the django.utils.translation module of the Django project. +gettext is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-allauth @@ -62,6 +62,11 @@ class EmailAwarePasswordResetTokenGenerator(PasswordResetTokenGenerator): ## ... source file abbreviated to get to gettext examples ... + username_field = self.fields['username'] + username_field.max_length = get_username_max_length() + username_field.validators.append( + validators.MaxLengthValidator(username_field.max_length)) + username_field.widget.attrs['maxlength'] = str( username_field.max_length) default_field_order = [ @@ -171,6 +176,11 @@ class GuardedModelAdminMixin: ## ... source file abbreviated to get to gettext examples ... + context['groups_perms'] = groups_perms + context['user_form'] = user_form + context['group_form'] = group_form + + request.current_app = self.admin_site.name return render(request, self.get_obj_perms_manage_template(), context) @@ -216,11 +226,9 @@ class GuardedModelAdminMixin: def get_obj_perms_manage_user_template(self): if 'grappelli' in settings.INSTALLED_APPS: return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + return self.obj_perms_manage_user_template - -## ... source file abbreviated to get to gettext examples ... - - + def get_obj_perms_user_select_form(self, request): return UserManage def get_obj_perms_group_select_form(self, request): @@ -274,9 +282,8 @@ class GuardedModelAdminMixin: ## Example 3 from django-taggit -[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) -([source code](https://github.com/jazzband/django-debug-toolbar) and -[PyPI page](https://pypi.org/project/django-taggit/)) provides a way +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way to create, store, manage and use tags in a [Django](/django.html) project. The code for django-taggit is [open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) @@ -321,6 +328,11 @@ class TagBase(models.Model): ## ... source file abbreviated to get to gettext examples ... + while True: + slug = self.slugify(self.name, i) + if slug not in slugs: + self.slug = slug + return super().save(*args, **kwargs) i += 1 else: return super().save(*args, **kwargs) @@ -393,6 +405,11 @@ The code for django-wiki is provided as open source under the ```python # forms.py + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", "TextInputPrepend", "CreateForm", "DeleteForm", @@ -438,11 +455,10 @@ class WikiSlugField(forms.CharField): def __init__(self, *args, **kwargs): self.allow_unicode = kwargs.pop("allow_unicode", False) if self.allow_unicode: - - -## ... source file abbreviated to get to gettext examples ... - - + self.default_validators = [ + validators.validate_unicode_slug, + validate_slug_numbers, + ] super().__init__(*args, **kwargs) @@ -551,6 +567,11 @@ class SpamProtectionMixin: ## ... source file abbreviated to get to gettext examples ... + if not str(self.presumed_revision) == str(self.initial_revision.id): + newdata = {} + for k, v in data.items(): + newdata[k] = v + newdata["current_revision"] = self.initial_revision.id if provided_content: self.presumed_revision = self.initial_revision.id else: @@ -610,6 +631,11 @@ class SelectWidgetBootstrap(forms.Select): ## ... source file abbreviated to get to gettext examples ... + +class DeleteForm(forms.Form): + def __init__(self, *args, **kwargs): + self.article = kwargs.pop("article") + self.has_children = kwargs.pop("has_children") super().__init__(*args, **kwargs) confirm = forms.BooleanField(required=False, label=_("Yes, I am sure")) @@ -707,6 +733,11 @@ def register_admin_urls(): ## ... source file abbreviated to get to gettext examples ... + reverse('wagtailimages:chooser') + ) + + +@hooks.register('register_rich_text_features') def register_image_feature(features): features.register_embed_type(ImageEmbedHandler) diff --git a/content/pages/examples/django/django-utils-translation-language-session-key.markdown b/content/pages/examples/django/django-utils-translation-language-session-key.markdown index 4d5e63725..12610c6a9 100644 --- a/content/pages/examples/django/django-utils-translation-language-session-key.markdown +++ b/content/pages/examples/django/django-utils-translation-language-session-key.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation LANGUAGE_SESSION_KEY code examples +title: django.utils.translation LANGUAGE_SESSION_KEY Example Code category: page slug: django-utils-translation-language-session-key-examples -sortorder: 500011493 +sortorder: 500011498 toc: False sidebartitle: django.utils.translation LANGUAGE_SESSION_KEY -meta: Python example code for the LANGUAGE_SESSION_KEY class from the django.utils.translation module of the Django project. +meta: Python example code for the LANGUAGE_SESSION_KEY constant from the django.utils.translation module of the Django project. -LANGUAGE_SESSION_KEY is a class within the django.utils.translation module of the Django project. +LANGUAGE_SESSION_KEY is a constant within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -37,7 +37,7 @@ class LanguageCookieMiddleware(MiddlewareMixin): if hasattr(request, 'session') and DJANGO_2_2: ~~ session_language = request.session.get(LANGUAGE_SESSION_KEY, None) if session_language and not session_language == language: -~~ request.session[LANGUAGE_SESSION_KEY] = language + request.session[LANGUAGE_SESSION_KEY] = language request.session.save() if settings.LANGUAGE_COOKIE_NAME in request.COOKIES and \ request.COOKIES[settings.LANGUAGE_COOKIE_NAME] == language: diff --git a/content/pages/examples/django/django-utils-translation-ngettext.markdown b/content/pages/examples/django/django-utils-translation-ngettext.markdown index 1cfcbf7e2..7b58498db 100644 --- a/content/pages/examples/django/django-utils-translation-ngettext.markdown +++ b/content/pages/examples/django/django-utils-translation-ngettext.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation ngettext code examples +title: django.utils.translation ngettext Example Code category: page slug: django-utils-translation-ngettext-examples -sortorder: 500011500 +sortorder: 500011505 toc: False sidebartitle: django.utils.translation ngettext -meta: Python example code for the ngettext function from the django.utils.translation module of the Django project. +meta: Python example code for the ngettext callable from the django.utils.translation module of the Django project. -ngettext is a function within the django.utils.translation module of the Django project. +ngettext is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-wiki @@ -75,6 +75,11 @@ class ArticleView(ArticleMixin, TemplateView): ## ... source file abbreviated to get to ngettext examples ... + + for descendant in descendants: + descendant.refresh_from_db() + dst_path = descendant.path + src_path = urljoin(old_path, dst_path[root_len:]) src_len = len(src_path) pos = src_path.rfind("/", 0, src_len - 1) slug = src_path[pos + 1 : src_len - 1] @@ -172,6 +177,11 @@ def register_admin_urls(): ## ... source file abbreviated to get to ngettext examples ... + request.user, ['add', 'change', 'delete'] + ) + + +@hooks.register('register_admin_search_area') def register_images_search_area(): return ImagesSearchArea( _('Images'), reverse('wagtailimages:index'), diff --git a/content/pages/examples/django/django-utils-translation-override.markdown b/content/pages/examples/django/django-utils-translation-override.markdown index 701e02c49..677e62844 100644 --- a/content/pages/examples/django/django-utils-translation-override.markdown +++ b/content/pages/examples/django/django-utils-translation-override.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation override code examples +title: django.utils.translation override Example Code category: page slug: django-utils-translation-override-examples -sortorder: 500011501 +sortorder: 500011506 toc: False sidebartitle: django.utils.translation override -meta: Python example code for the override function from the django.utils.translation module of the Django project. +meta: Python example code for the override callable from the django.utils.translation module of the Django project. -override is a function within the django.utils.translation module of the Django project. +override is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -58,6 +58,11 @@ def applications_page_check(request, current_page=None, path=None): ## ... source file abbreviated to get to override examples ... + from cms.models import Title + + included = [] + + title_qs = Title.objects.public().filter(page__node__site=site) hooked_applications = OrderedDict() @@ -154,6 +159,11 @@ def send_mail(subject, message, recipient_list, from_email=None, **kwargs): ## ... source file abbreviated to get to override examples ... + email_recipients = [ + recipient for recipient in recipients + if recipient.email and recipient.pk != excluded_user_id and getattr( + UserProfile.get_for_user(recipient), + notification + '_notifications' ) ] diff --git a/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown index 18758dcf8..d5ef274c0 100644 --- a/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown +++ b/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation pgettext_lazy code examples +title: django.utils.translation pgettext_lazy Example Code category: page slug: django-utils-translation-pgettext-lazy-examples -sortorder: 500011503 +sortorder: 500011508 toc: False sidebartitle: django.utils.translation pgettext_lazy -meta: Python example code for the pgettext_lazy function from the django.utils.translation module of the Django project. +meta: Python example code for the pgettext_lazy callable from the django.utils.translation module of the Django project. -pgettext_lazy is a function within the django.utils.translation module of the Django project. +pgettext_lazy is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-wiki @@ -30,6 +30,11 @@ The code for django-wiki is provided as open source under the ```python # forms.py + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", "TextInputPrepend", "CreateForm", "DeleteForm", @@ -80,6 +85,11 @@ class WikiSlugField(forms.CharField): ## ... source file abbreviated to get to pgettext_lazy examples ... + slug = WikiSlugField(max_length=models.URLPath.SLUG_MAX_LENGTH) + redirect = forms.BooleanField( + label=_("Redirect pages"), + help_text=_("Create a redirect page for every moved article?"), + required=False, ) def clean(self): @@ -130,6 +140,11 @@ class EditForm(forms.Form, SpamProtectionMixin): ## ... source file abbreviated to get to pgettext_lazy examples ... + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + context["prepend"] = mark_safe(self.prepend) + return context + class CreateForm(forms.Form, SpamProtectionMixin): def __init__(self, request, urlpath_parent, *args, **kwargs): diff --git a/content/pages/examples/django/django-utils-translation-pgettext.markdown b/content/pages/examples/django/django-utils-translation-pgettext.markdown index cc4eac5ee..a548708ad 100644 --- a/content/pages/examples/django/django-utils-translation-pgettext.markdown +++ b/content/pages/examples/django/django-utils-translation-pgettext.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation pgettext code examples +title: django.utils.translation pgettext Example Code category: page slug: django-utils-translation-pgettext-examples -sortorder: 500011502 +sortorder: 500011507 toc: False sidebartitle: django.utils.translation pgettext -meta: Python example code for the pgettext function from the django.utils.translation module of the Django project. +meta: Python example code for the pgettext callable from the django.utils.translation module of the Django project. -pgettext is a function within the django.utils.translation module of the Django project. +pgettext is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-allauth @@ -62,6 +62,11 @@ class EmailAwarePasswordResetTokenGenerator(PasswordResetTokenGenerator): ## ... source file abbreviated to get to pgettext examples ... + def __init__(self, *args, **kwargs): + self.request = kwargs.pop('request', None) + super(LoginForm, self).__init__(*args, **kwargs) + if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: + login_widget = forms.TextInput(attrs={'type': 'email', 'placeholder': _('E-mail address'), 'autofocus': 'autofocus'}) diff --git a/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown index e8b3da9d2..042ab4467 100644 --- a/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown +++ b/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation ugettext_lazy code examples +title: django.utils.translation ugettext_lazy Example Code category: page slug: django-utils-translation-ugettext-lazy-examples -sortorder: 500011505 +sortorder: 500011510 toc: False sidebartitle: django.utils.translation ugettext_lazy -meta: Python example code for the ugettext_lazy function from the django.utils.translation module of the Django project. +meta: Python example code for the ugettext_lazy callable from the django.utils.translation module of the Django project. -ugettext_lazy is a function within the django.utils.translation module of the Django project. +ugettext_lazy is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-filer diff --git a/content/pages/examples/django/django-utils-translation-ugettext.markdown b/content/pages/examples/django/django-utils-translation-ugettext.markdown index 12b70ad87..4d003aaf6 100644 --- a/content/pages/examples/django/django-utils-translation-ugettext.markdown +++ b/content/pages/examples/django/django-utils-translation-ugettext.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation ugettext code examples +title: django.utils.translation ugettext Example Code category: page slug: django-utils-translation-ugettext-examples -sortorder: 500011504 +sortorder: 500011509 toc: False sidebartitle: django.utils.translation ugettext -meta: Python example code for the ugettext function from the django.utils.translation module of the Django project. +meta: Python example code for the ugettext callable from the django.utils.translation module of the Django project. -ugettext is a function within the django.utils.translation module of the Django project. +ugettext is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -67,6 +67,11 @@ class CMSPluginBaseMetaclass(forms.MediaDefiningClass): ## ... source file abbreviated to get to ugettext examples ... + + def icon_src(self, instance): + return "" + + def icon_alt(self, instance): return "%s - %s" % (force_text(self.name), force_text(instance)) def get_fieldsets(self, request, obj=None): diff --git a/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown index 322d48bf1..0872e9896 100644 --- a/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown +++ b/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation ungettext_lazy code examples +title: django.utils.translation ungettext_lazy Example Code category: page slug: django-utils-translation-ungettext-lazy-examples -sortorder: 500011507 +sortorder: 500011512 toc: False sidebartitle: django.utils.translation ungettext_lazy -meta: Python example code for the ungettext_lazy function from the django.utils.translation module of the Django project. +meta: Python example code for the ungettext_lazy callable from the django.utils.translation module of the Django project. -ungettext_lazy is a function within the django.utils.translation module of the Django project. +ungettext_lazy is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-angular diff --git a/content/pages/examples/django/django-utils-translation-ungettext.markdown b/content/pages/examples/django/django-utils-translation-ungettext.markdown index 2d1e5714d..ed932d381 100644 --- a/content/pages/examples/django/django-utils-translation-ungettext.markdown +++ b/content/pages/examples/django/django-utils-translation-ungettext.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation ungettext code examples +title: django.utils.translation ungettext Example Code category: page slug: django-utils-translation-ungettext-examples -sortorder: 500011506 +sortorder: 500011511 toc: False sidebartitle: django.utils.translation ungettext -meta: Python example code for the ungettext function from the django.utils.translation module of the Django project. +meta: Python example code for the ungettext callable from the django.utils.translation module of the Django project. -ungettext is a function within the django.utils.translation module of the Django project. +ungettext is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-filer @@ -21,6 +21,10 @@ in Django's admin interface. The project's code is available under the ```python # folderadmin.py +from __future__ import absolute_import, division, unicode_literals + +import itertools +import os import re from collections import OrderedDict @@ -71,6 +75,11 @@ Image = load_model(FILER_IMAGE_MODEL) ## ... source file abbreviated to get to ungettext examples ... + response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) + if response: + return response + else: + msg = _("Items must be selected in order to perform " "actions on them. No items have been changed.") self.message_user(request, msg) @@ -177,6 +186,11 @@ class SearchChangeList(ChangeList): ## ... source file abbreviated to get to ungettext examples ... + "model": self.model, + "list_display": list_display, + "list_display_links": self.list_display_links, + "list_filter": self.list_filter, + "date_hierarchy": self.date_hierarchy, "search_fields": self.search_fields, "list_select_related": self.list_select_related, "list_per_page": self.list_per_page, diff --git a/content/pages/examples/django/django-utils-translation.markdown b/content/pages/examples/django/django-utils-translation.markdown index 79d1cc0b3..e74637893 100644 --- a/content/pages/examples/django/django-utils-translation.markdown +++ b/content/pages/examples/django/django-utils-translation.markdown @@ -1,13 +1,13 @@ -title: django.utils translation code examples +title: django.utils translation Example Code category: page slug: django-utils-translation-examples -sortorder: 500011417 +sortorder: 500011422 toc: False sidebartitle: django.utils translation -meta: Python example code for the translation function from the django.utils module of the Django project. +meta: Python example code for the translation callable from the django.utils module of the Django project. -translation is a function within the django.utils module of the Django project. +translation is a callable within the django.utils module of the Django project. ## Example 1 from django-cms @@ -71,6 +71,11 @@ from cms.utils.urlutils import admin_reverse ## ... source file abbreviated to get to translation examples ... + 'has_add_permission': False, + 'window_close_timeout': 10, + } + if cancel_clicked: + context.update({ 'cancel': True, }) return render(request, 'admin/cms/page/plugin/confirm_form.html', context) @@ -172,6 +177,11 @@ class BaseGeometryWidget(forms.Textarea): ## ... source file abbreviated to get to translation examples ... + + if value and value.geom_type.upper() != self.geom_type and self.geom_type != 'GEOMETRY': + value = None + + wkt = '' if value: srid = self.map_srid if value.srid != srid: @@ -271,6 +281,11 @@ from django.contrib.admin.options import IncorrectLookupParameters ## ... source file abbreviated to get to translation examples ... + + ChangeList = model_admin.get_changelist(request) + + change_list_args = [ + request, model, list_display, list_display_links, list_filter, model_admin.date_hierarchy, search_fields, list_select_related, model_admin.list_per_page, model_admin.list_max_show_all, model_admin.list_editable, model_admin] @@ -383,6 +398,11 @@ class Article(models.Model): ## ... source file abbreviated to get to translation examples ... + return self.current_revision.title + obj_name = _("Article without content (%(id)d)") % {"id": self.id} + return str(obj_name) + + class Meta: permissions = ( ("moderate", _("Can edit all articles and lock/unlock/restore")), ("assign", _("Can change ownership of any article")), diff --git a/content/pages/examples/django/django-utils-tree.markdown b/content/pages/examples/django/django-utils-tree.markdown new file mode 100644 index 000000000..c3496e58f --- /dev/null +++ b/content/pages/examples/django/django-utils-tree.markdown @@ -0,0 +1,123 @@ +title: django.utils tree Example Code +category: page +slug: django-utils-tree-examples +sortorder: 500011423 +toc: False +sidebartitle: django.utils tree +meta: Python example code for the tree callable from the django.utils module of the Django project. + + +tree is a callable within the django.utils module of the Django project. + + +## Example 1 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / backends / __init__.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/backends/__init__.py) + +```python +# __init__.py +import copy +from copy import deepcopy +from time import time + +from django.conf import settings +from django.db.models import Q +from django.db.models.base import ModelBase +~~from django.utils import tree +from django.utils.encoding import force_str + +from haystack.constants import VALID_FILTERS, FILTER_SEPARATOR, DEFAULT_ALIAS +from haystack.exceptions import MoreLikeThisError, FacetingError +from haystack.models import SearchResult +from haystack.utils.loading import UnifiedIndex +from haystack.utils import get_model_ct + +VALID_GAPS = ["year", "month", "day", "hour", "minute", "second"] + +SPELLING_SUGGESTION_HAS_NOT_RUN = object() + + +def log_query(func): + + def wrapper(obj, query_string, *args, **kwargs): + start = time() + + try: + return func(obj, query_string, *args, **kwargs) + finally: + stop = time() + + if settings.DEBUG: + + +## ... source file abbreviated to get to tree examples ... + + + if " " in query_string: + query_string = "(%s)" % query_string + + return "NOT %s" % query_string + + def build_exact_query(self, query_string): + return '"%s"' % query_string + + def add_filter(self, query_filter, use_or=False): + if use_or: + connector = SQ.OR + else: + connector = SQ.AND + + if ( + self.query_filter + and query_filter.connector != connector + and len(query_filter) > 1 + ): + self.query_filter.start_subtree(connector) + subtree = True + else: + subtree = False + + for child in query_filter.children: +~~ if isinstance(child, tree.Node): + self.query_filter.start_subtree(connector) + self.add_filter(child) + self.query_filter.end_subtree() + else: + expression, value = child + self.query_filter.add((expression, value), connector) + + connector = query_filter.connector + + if query_filter.negated: + self.query_filter.negate() + + if subtree: + self.query_filter.end_subtree() + + def add_order_by(self, field): + self.order_by.append(field) + + def clear_order_by(self): + self.order_by = [] + + def add_model(self, model): + if not isinstance(model, ModelBase): + raise AttributeError( + + +## ... source file continues with no further tree examples... + +``` + From 1d17eee2ec2bd383c99188cedfa14974e544478d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 9 Jul 2020 07:41:57 -0400 Subject: [PATCH 178/302] working on code example explanations --- .../django-urls-clear-url-caches.markdown | 78 + .../django/django-urls-get-callable.markdown | 58 + .../django/django-urls-get-resolver.markdown | 209 ++ .../django-urls-get-script-prefix.markdown | 124 + .../django/django-urls-include.markdown | 328 ++ .../django/django-urls-re-path.markdown | 359 +++ .../django-urls-register-converter.markdown | 101 + .../django/django-urls-resolve.markdown | 615 ++++ .../django/django-urls-reverse.markdown | 2796 +++++++++++++++++ .../django/django-urls-urlpattern.markdown | 124 + .../django/django-urls-urlresolver.markdown | 98 + .../examples/flask/flask-app-flask.markdown | 2 +- .../examples/flask/flask-app-headers.markdown | 5 +- .../flask/flask-app-immutabledict.markdown | 2 +- .../flask/flask-blueprints-blueprint.markdown | 4 +- .../flask/flask-cli-appgroup.markdown | 2 +- .../flask/flask-cli-dispatchingapp.markdown | 2 +- .../flask/flask-cli-flaskgroup.markdown | 2 +- .../flask/flask-cli-pass-script-info.markdown | 2 +- .../flask/flask-cli-scriptinfo.markdown | 2 +- .../flask/flask-cli-with-appcontext.markdown | 2 +- .../flask-ctx-after-this-request.markdown | 2 +- .../flask/flask-ctx-has-app-context.markdown | 2 +- .../flask-ctx-has-request-context.markdown | 2 +- .../flask/flask-globals-current-app.markdown | 2 +- .../flask/flask-globals-request.markdown | 13 +- .../flask/flask-globals-session.markdown | 13 +- .../flask/flask-helpers-flash.markdown | 9 +- theme/templates/code-examples/django.html | 141 +- 29 files changed, 5079 insertions(+), 20 deletions(-) create mode 100644 content/pages/examples/django/django-urls-clear-url-caches.markdown create mode 100644 content/pages/examples/django/django-urls-get-callable.markdown create mode 100644 content/pages/examples/django/django-urls-get-resolver.markdown create mode 100644 content/pages/examples/django/django-urls-get-script-prefix.markdown create mode 100644 content/pages/examples/django/django-urls-include.markdown create mode 100644 content/pages/examples/django/django-urls-re-path.markdown create mode 100644 content/pages/examples/django/django-urls-register-converter.markdown create mode 100644 content/pages/examples/django/django-urls-resolve.markdown create mode 100644 content/pages/examples/django/django-urls-reverse.markdown create mode 100644 content/pages/examples/django/django-urls-urlpattern.markdown create mode 100644 content/pages/examples/django/django-urls-urlresolver.markdown diff --git a/content/pages/examples/django/django-urls-clear-url-caches.markdown b/content/pages/examples/django/django-urls-clear-url-caches.markdown new file mode 100644 index 000000000..9917fae45 --- /dev/null +++ b/content/pages/examples/django/django-urls-clear-url-caches.markdown @@ -0,0 +1,78 @@ +title: django.urls clear_url_caches Example Code +category: page +slug: django-urls-clear-url-caches-examples +sortorder: 500011402 +toc: False +sidebartitle: django.urls clear_url_caches +meta: Python example code for the clear_url_caches callable from the django.urls module of the Django project. + + +clear_url_caches is a callable within the django.urls module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / signals / apphook.py**](https://github.com/divio/django-cms/blob/develop/cms/signals/apphook.py) + +```python +# apphook.py +import logging +import sys + +from django.core.management import color_style +from django.core.signals import request_finished +~~from django.urls import clear_url_caches + +from cms.utils.apphook_reload import mark_urlconf_as_changed + + +logger = logging.getLogger(__name__) + +DISPATCH_UID = 'cms-restart' + + +def trigger_server_restart(**kwargs): + mark_urlconf_as_changed() + + +def set_restart_trigger(): + request_finished.connect(trigger_restart, dispatch_uid=DISPATCH_UID) + + +def trigger_restart(**kwargs): + from cms.signals import urls_need_reloading + + request_finished.disconnect(trigger_restart, dispatch_uid=DISPATCH_UID) + urls_need_reloading.send(sender=None) + + +def debug_server_restart(**kwargs): + from cms.appresolver import clear_app_resolvers + if 'runserver' in sys.argv or 'server' in sys.argv: + clear_app_resolvers() +~~ clear_url_caches() + import cms.urls + try: + reload(cms.urls) + except NameError: #python3 + from imp import reload + reload(cms.urls) + if not 'test' in sys.argv: + msg = 'Application url changed and urls_need_reloading signal fired. ' \ + 'Please reload the urls.py or restart the server.\n' + styles = color_style() + msg = styles.NOTICE(msg) + sys.stderr.write(msg) + + + +## ... source file continues with no further clear_url_caches examples... + +``` + diff --git a/content/pages/examples/django/django-urls-get-callable.markdown b/content/pages/examples/django/django-urls-get-callable.markdown new file mode 100644 index 000000000..367b6e01d --- /dev/null +++ b/content/pages/examples/django/django-urls-get-callable.markdown @@ -0,0 +1,58 @@ +title: django.urls get_callable Example Code +category: page +slug: django-urls-get-callable-examples +sortorder: 500011403 +toc: False +sidebartitle: django.urls get_callable +meta: Python example code for the get_callable callable from the django.urls module of the Django project. + + +get_callable is a callable within the django.urls module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / editors / __init__.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/editors/__init__.py) + +```python +# __init__.py +~~from django.urls import get_callable +from wiki.conf import settings + +_EditorClass = None +_editor = None + + +def getEditorClass(): + global _EditorClass + if not _EditorClass: +~~ _EditorClass = get_callable(settings.EDITOR) + return _EditorClass + + +def getEditor(): + global _editor + if not _editor: + _editor = getEditorClass()() + return _editor + + + +## ... source file continues with no further get_callable examples... + +``` + diff --git a/content/pages/examples/django/django-urls-get-resolver.markdown b/content/pages/examples/django/django-urls-get-resolver.markdown new file mode 100644 index 000000000..b88d6017f --- /dev/null +++ b/content/pages/examples/django/django-urls-get-resolver.markdown @@ -0,0 +1,209 @@ +title: django.urls get_resolver Example Code +category: page +slug: django-urls-get-resolver-examples +sortorder: 500011404 +toc: False +sidebartitle: django.urls get_resolver +meta: Python example code for the get_resolver callable from the django.urls module of the Django project. + + +get_resolver is a callable within the django.urls module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / i18n.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/i18n.py) + +```python +# i18n.py +from contextlib import contextmanager + +from django.conf import settings +from django.utils import translation +from django.utils.translation import ugettext_lazy as _ +~~from django.urls import get_resolver + +from cms.exceptions import LanguageError +from cms.utils.compat.dj import LocalePrefixPattern +from cms.utils.conf import get_cms_setting, get_site_id + + +@contextmanager +def force_language(new_lang): + old_lang = get_current_language() + if old_lang != new_lang: + translation.activate(new_lang) + yield + translation.activate(old_lang) + + +def get_languages(site_id=None): + site_id = get_site_id(site_id) + result = get_cms_setting('LANGUAGES').get(site_id) + if not result: + result = [] + defaults = get_cms_setting('LANGUAGES').get('default', {}) + for code, name in settings.LANGUAGES: + lang = {'code': code, 'name': _(name)} + lang.update(defaults) + + +## ... source file abbreviated to get to get_resolver examples ... + + + +def get_fallback_languages(language, site_id=None): + try: + language = get_language_object(language, site_id) + except LanguageError: + language = get_languages(site_id)[0] + return language.get('fallbacks', []) + + +def get_redirect_on_fallback(language, site_id=None): + language = get_language_object(language, site_id) + return language.get('redirect_on_fallback', True) + + +def hide_untranslated(language, site_id=None): + obj = get_language_object(language, site_id) + return obj.get('hide_untranslated', True) + + +def is_language_prefix_patterns_used(): + return any( + isinstance( + getattr(url_pattern, 'pattern', url_pattern), + LocalePrefixPattern + ) +~~ for url_pattern in get_resolver(None).url_patterns + ) + + +def is_valid_site_language(language, site_id): + return language in get_language_list(site_id) + + + +## ... source file continues with no further get_resolver examples... + +``` + + +## Example 2 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / admin.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./admin.py) + +```python +# admin.py +from typing import Tuple, Type, Optional + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import admin +from django.contrib import messages +from django.contrib.admin.sites import NotRegistered +from django.http import HttpResponseRedirect, HttpRequest, HttpResponse +~~from django.urls import get_urlconf, get_resolver +from django.utils.translation import gettext_lazy as _ + +from .fields import TreeItemChoiceField +from .settings import MODEL_TREE, MODEL_TREE_ITEM +from .utils import get_tree_model, get_tree_item_model, get_app_n_model + +if False: # pragma: nocover + from .models import TreeItemBase, TreeBase # noqa + + +SMUGGLER_INSTALLED = 'smuggler' in django_settings.INSTALLED_APPS + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + +_TREE_ADMIN = lambda: TreeAdmin +_ITEM_ADMIN = lambda: TreeItemAdmin + + +def get_model_url_name(model_nfo: Tuple[str, str], page: str, with_namespace: bool = False) -> str: + prefix = '' + if with_namespace: + prefix = 'admin:' + return (f'{prefix}%s_{page}' % '%s_%s' % model_nfo).lower() + + +## ... source file abbreviated to get to get_resolver examples ... + + + elif '_continue' in request.POST: + return response + + return HttpResponseRedirect('') + + def response_add(self, request, obj, post_url_continue=None, **kwargs): + if post_url_continue is None: + post_url_continue = f'../item_{obj.pk}/' + + return self._redirect(request, super().response_add(request, obj, post_url_continue)) + + def response_change(self, request, obj, **kwargs): + return self._redirect(request, super().response_change(request, obj)) + + def get_form(self, request, obj=None, **kwargs): + if obj is not None and obj.parent is not None: + self.previous_parent = obj.parent + + form = super().get_form(request, obj, **kwargs) + form.base_fields['parent'].choices_init(self.tree) + + if not getattr(self, 'known_url_names', False): + self.known_url_names = [] + self.known_url_rules = [] + +~~ resolver = get_resolver(get_urlconf()) + + for ns, (url_prefix, ns_resolver) in resolver.namespace_dict.items(): + if ns != 'admin': + self._stack_known_urls(ns_resolver.reverse_dict, ns) + + self._stack_known_urls(resolver.reverse_dict) + self.known_url_rules = sorted(self.known_url_rules) + + form.known_url_names_hint = _( + 'You are seeing this warning because "URL as Pattern" option is active and pattern entered above ' + 'seems to be invalid. Currently registered URL pattern names and parameters: ') + + form.known_url_names = self.known_url_names + form.known_url_rules = self.known_url_rules + + return form + + def _stack_known_urls(self, reverse_dict, ns=None): + for url_name, url_rules in reverse_dict.items(): + if isinstance(url_name, str): + if ns is not None: + url_name = f'{ns}:{url_name}' + self.known_url_names.append(url_name) + self.known_url_rules.append(f"{url_name} {' '.join(url_rules[0][0][1])}") + + +## ... source file continues with no further get_resolver examples... + +``` + diff --git a/content/pages/examples/django/django-urls-get-script-prefix.markdown b/content/pages/examples/django/django-urls-get-script-prefix.markdown new file mode 100644 index 000000000..375b7cc92 --- /dev/null +++ b/content/pages/examples/django/django-urls-get-script-prefix.markdown @@ -0,0 +1,124 @@ +title: django.urls get_script_prefix Example Code +category: page +slug: django-urls-get-script-prefix-examples +sortorder: 500011405 +toc: False +sidebartitle: django.urls get_script_prefix +meta: Python example code for the get_script_prefix callable from the django.urls module of the Django project. + + +get_script_prefix is a callable within the django.urls module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / relations.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./relations.py) + +```python +# relations.py +import sys +from collections import OrderedDict +from urllib import parse + +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist +from django.db.models import Manager +from django.db.models.query import QuerySet +~~from django.urls import NoReverseMatch, Resolver404, get_script_prefix, resolve +from django.utils.encoding import smart_str, uri_to_iri +from django.utils.translation import gettext_lazy as _ + +from rest_framework.fields import ( + Field, empty, get_attribute, is_simple_callable, iter_options +) +from rest_framework.reverse import reverse +from rest_framework.settings import api_settings +from rest_framework.utils import html + + +def method_overridden(method_name, klass, instance): + method = getattr(klass, method_name) + default_method = getattr(method, '__func__', method) # Python 3 compat + return default_method is not getattr(instance, method_name).__func__ + + +class ObjectValueError(ValueError): + + +class ObjectTypeError(TypeError): + + +class Hyperlink(str): + + +## ... source file abbreviated to get to get_script_prefix examples ... + + + return queryset.get(**lookup_kwargs) + except ValueError: + exc = ObjectValueError(str(sys.exc_info()[1])) + raise exc.with_traceback(sys.exc_info()[2]) + except TypeError: + exc = ObjectTypeError(str(sys.exc_info()[1])) + raise exc.with_traceback(sys.exc_info()[2]) + + def get_url(self, obj, view_name, request, format): + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + + def to_internal_value(self, data): + request = self.context.get('request', None) + try: + http_prefix = data.startswith(('http:', 'https:')) + except AttributeError: + self.fail('incorrect_type', data_type=type(data).__name__) + + if http_prefix: + data = parse.urlparse(data).path +~~ prefix = get_script_prefix() + if data.startswith(prefix): + data = '/' + data[len(prefix):] + + data = uri_to_iri(parse.unquote(data)) + + try: + match = resolve(data) + except Resolver404: + self.fail('no_match') + + try: + expected_viewname = request.versioning_scheme.get_versioned_viewname( + self.view_name, request + ) + except AttributeError: + expected_viewname = self.view_name + + if match.view_name != expected_viewname: + self.fail('incorrect_match') + + try: + return self.get_object(match.view_name, match.args, match.kwargs) + except (ObjectDoesNotExist, ObjectValueError, ObjectTypeError): + self.fail('does_not_exist') + + +## ... source file continues with no further get_script_prefix examples... + +``` + diff --git a/content/pages/examples/django/django-urls-include.markdown b/content/pages/examples/django/django-urls-include.markdown new file mode 100644 index 000000000..30788b92a --- /dev/null +++ b/content/pages/examples/django/django-urls-include.markdown @@ -0,0 +1,328 @@ +title: django.urls include Example Code +category: page +slug: django-urls-include-examples +sortorder: 500011406 +toc: False +sidebartitle: django.urls include +meta: Python example code for the include callable from the django.urls module of the Django project. + + +include is a callable within the django.urls module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / wwwdccn / urls.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/wwwdccn/urls.py) + +```python +# urls.py +from django.conf import settings +from django.conf.urls.static import static +~~from django.urls import path, include + +urlpatterns = [ +~~ path('', include('public_site.urls')), +~~ path('user/', include('user_site.urls')), +~~ path('auth/', include('auth_app.urls')), +~~ path('users/', include('users.urls')), +~~ path('registration/', include('registration.urls')), +~~ path('conferences/', include('conferences.urls')), +~~ path('submissions/', include('submissions.urls')), +~~ path('chair/', include('chair.urls')), +~~ path('chair_mail/', include('chair_mail.urls')), +~~ path('review/', include('review.urls')), +~~ path('gears/', include('gears.urls')), +~~ path('proceedings/', include('proceedings.urls')), +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + +if settings.USE_LOCAL_MEDIA: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + +if settings.USE_DEBUG_TOOLBAR: + import debug_toolbar + urlpatterns = [ +~~ path('__debug__/', include(debug_toolbar.urls)), + + + ] + urlpatterns + + + +## ... source file continues with no further include examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / urls.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./urls.py) + +```python +# urls.py +from importlib import import_module + +~~from django.urls import include, path + +from allauth.socialaccount import providers + +from . import app_settings + + +~~urlpatterns = [path('', include('allauth.account.urls'))] + +if app_settings.SOCIALACCOUNT_ENABLED: +~~ urlpatterns += [path('social/', include('allauth.socialaccount.urls'))] + +provider_urlpatterns = [] +for provider in providers.registry.get_list(): + try: + prov_mod = import_module(provider.get_package() + '.urls') + except ImportError: + continue + prov_urlpatterns = getattr(prov_mod, 'urlpatterns', None) + if prov_urlpatterns: + provider_urlpatterns += prov_urlpatterns +urlpatterns += provider_urlpatterns + + + +## ... source file continues with no further include examples... + +``` + + +## Example 3 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / sites.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./sites.py) + +```python +# sites.py +from django.apps import apps +~~from django.urls import include +from django.urls import re_path +from django.utils.functional import LazyObject +from django.utils.module_loading import import_string +from wiki.conf import settings +from wiki.core.plugins import registry + + +class WikiSite: + + def __init__(self, name="wiki"): + from wiki.views import accounts, article, deleted_list + + self.name = name + + self.root_view = getattr(self, "root_view", article.CreateRootView.as_view()) + self.root_missing_view = getattr( + self, "root_missing_view", article.MissingRootView.as_view() + ) + + self.article_view = getattr(self, "article_view", article.ArticleView.as_view()) + self.article_create_view = getattr( + self, "article_create_view", article.Create.as_view() + ) + self.article_delete_view = getattr( + + +## ... source file abbreviated to get to include examples ... + + + re_path( + r"^_accounts/settings/$", + self.profile_update_view, + name="profile_update", + ), + ] + else: + urlpatterns = [] + return urlpatterns + + def get_revision_urls(self): + urlpatterns = [ + re_path( + r"^change/(?P[0-9]+)/$", + self.revision_change_view, + name="change_revision", + ), + re_path(r"^preview/$", self.article_preview_view, name="preview_revision"), + re_path( + r"^merge/(?P[0-9]+)/preview/$", + self.revision_preview_merge_view, + name="merge_revision_preview", + ), + ] + return [ +~~ re_path(r"^_revision/(?P[0-9]+)/", include(urlpatterns)), + ] + + def get_article_urls(self): + urlpatterns = [ + re_path(r"^$", self.article_view, name="get"), + re_path(r"^delete/$", self.article_delete_view, name="delete"), + re_path(r"^deleted/$", self.article_deleted_view, name="deleted"), + re_path(r"^edit/$", self.article_edit_view, name="edit"), + re_path(r"^move/$", self.article_move_view, name="move"), + re_path(r"^preview/$", self.article_preview_view, name="preview"), + re_path(r"^history/$", self.article_history_view, name="history"), + re_path(r"^settings/$", self.article_settings_view, name="settings"), + re_path(r"^source/$", self.article_source_view, name="source"), + re_path( + r"^revision/change/(?P[0-9]+)/$", + self.revision_change_view, + name="change_revision", + ), + re_path( + r"^revision/merge/(?P[0-9]+)/$", + self.revision_merge_view, + name="merge_revision", + ), + re_path( + r"^plugin/(?P\w+)/$", self.article_plugin_view, name="plugin" + ), + ] + return [ +~~ re_path(r"^(?P[0-9]+)/", include(urlpatterns)), + ] + + def get_article_path_urls(self): + urlpatterns = [ + re_path( + r"^(?P.+/|)_create/$", self.article_create_view, name="create" + ), + re_path( + r"^(?P.+/|)_delete/$", self.article_delete_view, name="delete" + ), + re_path( + r"^(?P.+/|)_deleted/$", self.article_deleted_view, name="deleted" + ), + re_path(r"^(?P.+/|)_edit/$", self.article_edit_view, name="edit"), + re_path(r"^(?P.+/|)_move/$", self.article_move_view, name="move"), + re_path( + r"^(?P.+/|)_preview/$", self.article_preview_view, name="preview" + ), + re_path( + r"^(?P.+/|)_history/$", self.article_history_view, name="history" + ), + re_path(r"^(?P.+/|)_dir/$", self.article_dir_view, name="dir"), + re_path(r"^(?P.+/|)_search/$", self.search_view, name="search"), + re_path( + + +## ... source file abbreviated to get to include examples ... + + + name="change_revision", + ), + re_path( + r"^(?P.+/|)_revision/merge/(?P[0-9]+)/$", + self.revision_merge_view, + name="merge_revision", + ), + re_path( + r"^(?P.+/|)_plugin/(?P\w+)/$", + self.article_plugin_view, + name="plugin", + ), + re_path(r"^(?P.+/|)$", self.article_view, name="get"), + ] + return urlpatterns + + def get_plugin_urls(self): + urlpatterns = [] + for plugin in registry.get_plugins().values(): + slug = getattr(plugin, "slug", None) + if slug: + article_urlpatterns = plugin.urlpatterns.get("article", []) + urlpatterns += [ + re_path( + r"^(?P[0-9]+)/plugin/" + slug + "/", +~~ include(article_urlpatterns), + ), + re_path( + r"^(?P.+/|)_plugin/" + slug + "/", +~~ include(article_urlpatterns), + ), + ] + root_urlpatterns = plugin.urlpatterns.get("root", []) + urlpatterns += [ +~~ re_path(r"^_plugin/" + slug + "/", include(root_urlpatterns)), + ] + return urlpatterns + + +class DefaultWikiSite(LazyObject): + def _setup(self): + WikiSiteClass = import_string(apps.get_app_config("wiki").default_site) + self._wrapped = WikiSiteClass() + + +site = DefaultWikiSite() + + + +## ... source file continues with no further include examples... + +``` + + +## Example 4 from drf-action-serializer +[drf-action-serializer](https://github.com/gregschmit/drf-action-serializer) +([PyPI page](https://pypi.org/project/drf-action-serializer/)) +that makes it easier to configure specific serializers to use based on the +client's request action. For example, a list view should have one serializer +whereas the detail view would have a different serializer. + +The project is open source under the +[MIT license](https://github.com/gregschmit/drf-action-serializer/blob/master/LICENSE). + +[**drf-action-serializer / action_serializer / urls.py**](https://github.com/gregschmit/drf-action-serializer/blob/master/action_serializer/./urls.py) + +```python +# urls.py +from django.contrib import admin +~~from django.urls import include, path +from rest_framework.routers import DefaultRouter + +from .sample_group_viewset import GroupViewSet + + +router = DefaultRouter() +router.register("auth/group", GroupViewSet) +router.register("auth/groups", GroupViewSet) + +urlpatterns = [ +~~ path("api/", include(router.urls)), +~~ path("admin/doc/", include("django.contrib.admindocs.urls")), + path("admin/", admin.site.urls), +] + + + +## ... source file continues with no further include examples... + +``` + diff --git a/content/pages/examples/django/django-urls-re-path.markdown b/content/pages/examples/django/django-urls-re-path.markdown new file mode 100644 index 000000000..e150f7d10 --- /dev/null +++ b/content/pages/examples/django/django-urls-re-path.markdown @@ -0,0 +1,359 @@ +title: django.urls re_path Example Code +category: page +slug: django-urls-re-path-examples +sortorder: 500011408 +toc: False +sidebartitle: django.urls re_path +meta: Python example code for the re_path callable from the django.urls module of the Django project. + + +re_path is a callable within the django.urls module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / urls.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/urls.py) + +```python +# urls.py +~~from django.urls import path, re_path + +from . import views + + +urlpatterns = [ + path("signup/", views.signup, name="account_signup"), + path("login/", views.login, name="account_login"), + path("logout/", views.logout, name="account_logout"), + path("password/change/", views.password_change, + name="account_change_password"), + path("password/set/", views.password_set, name="account_set_password"), + path("inactive/", views.account_inactive, name="account_inactive"), + + path("email/", views.email, name="account_email"), + path("confirm-email/", views.email_verification_sent, + name="account_email_verification_sent"), +~~ re_path(r"^confirm-email/(?P[-:\w]+)/$", views.confirm_email, + name="account_confirm_email"), + + path("password/reset/", views.password_reset, + name="account_reset_password"), + path("password/reset/done/", views.password_reset_done, + name="account_reset_password_done"), +~~ re_path(r"^password/reset/key/(?P[0-9A-Za-z]+)-(?P.+)/$", + views.password_reset_from_key, + name="account_reset_password_from_key"), + path("password/reset/key/done/", views.password_reset_from_key_done, + name="account_reset_password_from_key_done"), +] + + + +## ... source file continues with no further re_path examples... + +``` + + +## Example 2 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / urls.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./urls.py) + +```python +# urls.py +~~from django.urls import re_path + +from . import views + + +app_name = "oauth2_provider" + + +base_urlpatterns = [ +~~ re_path(r"^authorize/$", views.AuthorizationView.as_view(), name="authorize"), +~~ re_path(r"^token/$", views.TokenView.as_view(), name="token"), +~~ re_path(r"^revoke_token/$", views.RevokeTokenView.as_view(), name="revoke-token"), +~~ re_path(r"^introspect/$", views.IntrospectTokenView.as_view(), name="introspect"), +] + + +management_urlpatterns = [ +~~ re_path(r"^applications/$", views.ApplicationList.as_view(), name="list"), +~~ re_path(r"^applications/register/$", views.ApplicationRegistration.as_view(), name="register"), +~~ re_path(r"^applications/(?P[\w-]+)/$", views.ApplicationDetail.as_view(), name="detail"), +~~ re_path(r"^applications/(?P[\w-]+)/delete/$", views.ApplicationDelete.as_view(), name="delete"), +~~ re_path(r"^applications/(?P[\w-]+)/update/$", views.ApplicationUpdate.as_view(), name="update"), +~~ re_path(r"^authorized_tokens/$", views.AuthorizedTokensListView.as_view(), name="authorized-token-list"), +~~ re_path(r"^authorized_tokens/(?P[\w-]+)/delete/$", views.AuthorizedTokenDeleteView.as_view(), + name="authorized-token-delete"), +] + + +urlpatterns = base_urlpatterns + management_urlpatterns + + + +## ... source file continues with no further re_path examples... + +``` + + +## Example 3 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / sites.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./sites.py) + +```python +# sites.py +from django.apps import apps +from django.urls import include +~~from django.urls import re_path +from django.utils.functional import LazyObject +from django.utils.module_loading import import_string +from wiki.conf import settings +from wiki.core.plugins import registry + + +class WikiSite: + + def __init__(self, name="wiki"): + from wiki.views import accounts, article, deleted_list + + self.name = name + + self.root_view = getattr(self, "root_view", article.CreateRootView.as_view()) + self.root_missing_view = getattr( + self, "root_missing_view", article.MissingRootView.as_view() + ) + + self.article_view = getattr(self, "article_view", article.ArticleView.as_view()) + self.article_create_view = getattr( + self, "article_create_view", article.Create.as_view() + ) + self.article_delete_view = getattr( + self, "article_delete_view", article.Delete.as_view() + + +## ... source file abbreviated to get to re_path examples ... + + + self.profile_update_view = getattr( + self, "profile_update_view", accounts.Update.as_view() + ) + + self.deleted_list_view = getattr( + self, "deleted_list_view", deleted_list.DeletedListView.as_view() + ) + + def get_urls(self): + urlpatterns = self.get_root_urls() + urlpatterns += self.get_accounts_urls() + urlpatterns += self.get_deleted_list_urls() + urlpatterns += self.get_revision_urls() + urlpatterns += self.get_article_urls() + urlpatterns += self.get_plugin_urls() + + urlpatterns += self.get_article_path_urls() + return urlpatterns + + @property + def urls(self): + return self.get_urls(), "wiki", self.name + + def get_root_urls(self): + urlpatterns = [ +~~ re_path(r"^$", self.article_view, name="root", kwargs={"path": ""}), +~~ re_path(r"^create-root/$", self.root_view, name="root_create"), +~~ re_path(r"^missing-root/$", self.root_missing_view, name="root_missing"), +~~ re_path(r"^_search/$", self.search_view, name="search"), +~~ re_path( + r"^_revision/diff/(?P[0-9]+)/$", + self.article_diff_view, + name="diff", + ), + ] + return urlpatterns + + def get_deleted_list_urls(self): + urlpatterns = [ +~~ re_path("^_admin/$", self.deleted_list_view, name="deleted_list"), + ] + return urlpatterns + + def get_accounts_urls(self): + if settings.ACCOUNT_HANDLING: + urlpatterns = [ +~~ re_path(r"^_accounts/sign-up/$", self.signup_view, name="signup"), +~~ re_path(r"^_accounts/logout/$", self.logout_view, name="logout"), +~~ re_path(r"^_accounts/login/$", self.login_view, name="login"), +~~ re_path( + r"^_accounts/settings/$", + self.profile_update_view, + name="profile_update", + ), + ] + else: + urlpatterns = [] + return urlpatterns + + def get_revision_urls(self): + urlpatterns = [ +~~ re_path( + r"^change/(?P[0-9]+)/$", + self.revision_change_view, + name="change_revision", + ), +~~ re_path(r"^preview/$", self.article_preview_view, name="preview_revision"), +~~ re_path( + r"^merge/(?P[0-9]+)/preview/$", + self.revision_preview_merge_view, + name="merge_revision_preview", + ), + ] + return [ +~~ re_path(r"^_revision/(?P[0-9]+)/", include(urlpatterns)), + ] + + def get_article_urls(self): + urlpatterns = [ +~~ re_path(r"^$", self.article_view, name="get"), +~~ re_path(r"^delete/$", self.article_delete_view, name="delete"), +~~ re_path(r"^deleted/$", self.article_deleted_view, name="deleted"), +~~ re_path(r"^edit/$", self.article_edit_view, name="edit"), +~~ re_path(r"^move/$", self.article_move_view, name="move"), +~~ re_path(r"^preview/$", self.article_preview_view, name="preview"), +~~ re_path(r"^history/$", self.article_history_view, name="history"), +~~ re_path(r"^settings/$", self.article_settings_view, name="settings"), +~~ re_path(r"^source/$", self.article_source_view, name="source"), +~~ re_path( + r"^revision/change/(?P[0-9]+)/$", + self.revision_change_view, + name="change_revision", + ), +~~ re_path( + r"^revision/merge/(?P[0-9]+)/$", + self.revision_merge_view, + name="merge_revision", + ), +~~ re_path( + r"^plugin/(?P\w+)/$", self.article_plugin_view, name="plugin" + ), + ] + return [ +~~ re_path(r"^(?P[0-9]+)/", include(urlpatterns)), + ] + + def get_article_path_urls(self): + urlpatterns = [ +~~ re_path( + r"^(?P.+/|)_create/$", self.article_create_view, name="create" + ), +~~ re_path( + r"^(?P.+/|)_delete/$", self.article_delete_view, name="delete" + ), +~~ re_path( + r"^(?P.+/|)_deleted/$", self.article_deleted_view, name="deleted" + ), +~~ re_path(r"^(?P.+/|)_edit/$", self.article_edit_view, name="edit"), +~~ re_path(r"^(?P.+/|)_move/$", self.article_move_view, name="move"), +~~ re_path( + r"^(?P.+/|)_preview/$", self.article_preview_view, name="preview" + ), +~~ re_path( + r"^(?P.+/|)_history/$", self.article_history_view, name="history" + ), +~~ re_path(r"^(?P.+/|)_dir/$", self.article_dir_view, name="dir"), +~~ re_path(r"^(?P.+/|)_search/$", self.search_view, name="search"), +~~ re_path( + r"^(?P.+/|)_settings/$", + self.article_settings_view, + name="settings", + ), +~~ re_path( + r"^(?P.+/|)_source/$", self.article_source_view, name="source" + ), +~~ re_path( + r"^(?P.+/|)_revision/change/(?P[0-9]+)/$", + self.revision_change_view, + name="change_revision", + ), +~~ re_path( + r"^(?P.+/|)_revision/merge/(?P[0-9]+)/$", + self.revision_merge_view, + name="merge_revision", + ), +~~ re_path( + r"^(?P.+/|)_plugin/(?P\w+)/$", + self.article_plugin_view, + name="plugin", + ), +~~ re_path(r"^(?P.+/|)$", self.article_view, name="get"), + ] + return urlpatterns + + def get_plugin_urls(self): + urlpatterns = [] + for plugin in registry.get_plugins().values(): + slug = getattr(plugin, "slug", None) + if slug: + article_urlpatterns = plugin.urlpatterns.get("article", []) + urlpatterns += [ +~~ re_path( + r"^(?P[0-9]+)/plugin/" + slug + "/", + include(article_urlpatterns), + ), +~~ re_path( + r"^(?P.+/|)_plugin/" + slug + "/", + include(article_urlpatterns), + ), + ] + root_urlpatterns = plugin.urlpatterns.get("root", []) + urlpatterns += [ +~~ re_path(r"^_plugin/" + slug + "/", include(root_urlpatterns)), + ] + return urlpatterns + + +class DefaultWikiSite(LazyObject): + def _setup(self): + WikiSiteClass = import_string(apps.get_app_config("wiki").default_site) + self._wrapped = WikiSiteClass() + + +site = DefaultWikiSite() + + + +## ... source file continues with no further re_path examples... + +``` + diff --git a/content/pages/examples/django/django-urls-register-converter.markdown b/content/pages/examples/django/django-urls-register-converter.markdown new file mode 100644 index 000000000..652ace426 --- /dev/null +++ b/content/pages/examples/django/django-urls-register-converter.markdown @@ -0,0 +1,101 @@ +title: django.urls register_converter Example Code +category: page +slug: django-urls-register-converter-examples +sortorder: 500011409 +toc: False +sidebartitle: django.urls register_converter +meta: Python example code for the register_converter callable from the django.urls module of the Django project. + + +register_converter is a callable within the django.urls module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / urlpatterns.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./urlpatterns.py) + +```python +# urlpatterns.py +from django.conf.urls import include, url +~~from django.urls import URLResolver, path, register_converter +from django.urls.resolvers import RoutePattern + +from rest_framework.settings import api_settings + + +def _get_format_path_converter(suffix_kwarg, allowed): + if allowed: + if len(allowed) == 1: + allowed_pattern = allowed[0] + else: + allowed_pattern = '(?:%s)' % '|'.join(allowed) + suffix_pattern = r"\.%s/?" % allowed_pattern + else: + suffix_pattern = r"\.[a-z0-9]+/?" + + class FormatSuffixConverter: + regex = suffix_pattern + + def to_python(self, value): + return value.strip('./') + + def to_url(self, value): + return '.' + value + '/' + + + +## ... source file abbreviated to get to register_converter examples ... + + + assert path is not None + assert suffix_route is not None + route = str(urlpattern.pattern).rstrip('$').rstrip('/') + suffix_route + new_pattern = path(route, view, kwargs, name) + else: + new_pattern = url(regex, view, kwargs, name) + + ret.append(new_pattern) + + return ret + + +def format_suffix_patterns(urlpatterns, suffix_required=False, allowed=None): + suffix_kwarg = api_settings.FORMAT_SUFFIX_KWARG + if allowed: + if len(allowed) == 1: + allowed_pattern = allowed[0] + else: + allowed_pattern = '(%s)' % '|'.join(allowed) + suffix_pattern = r'\.(?P<%s>%s)/?$' % (suffix_kwarg, allowed_pattern) + else: + suffix_pattern = r'\.(?P<%s>[a-z0-9]+)/?$' % suffix_kwarg + + if path and register_converter: + converter_name, suffix_converter = _get_format_path_converter(suffix_kwarg, allowed) +~~ register_converter(suffix_converter, converter_name) + + suffix_route = '<%s:%s>' % (converter_name, suffix_kwarg) + else: + suffix_route = None + + return apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required, suffix_route) + + + +## ... source file continues with no further register_converter examples... + +``` + diff --git a/content/pages/examples/django/django-urls-resolve.markdown b/content/pages/examples/django/django-urls-resolve.markdown new file mode 100644 index 000000000..3b34c1096 --- /dev/null +++ b/content/pages/examples/django/django-urls-resolve.markdown @@ -0,0 +1,615 @@ +title: django.urls resolve Example Code +category: page +slug: django-urls-resolve-examples +sortorder: 500011410 +toc: False +sidebartitle: django.urls resolve +meta: Python example code for the resolve callable from the django.urls module of the Django project. + + +resolve is a callable within the django.urls module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / core / urlresolvers.py**](https://github.com/jrief/django-angular/blob/master/djng/core/urlresolvers.py) + +```python +# urlresolvers.py +from inspect import isclass + +~~from django.urls import (get_resolver, get_urlconf, resolve, reverse, NoReverseMatch) +from django.core.exceptions import ImproperlyConfigured + +try: + from django.utils.module_loading import import_string +except ImportError: + from django.utils.module_loading import import_by_path as import_string + +from djng.views.mixins import JSONResponseMixin + + +def _get_remote_methods_for(view_object, url): + result = {} + for field in dir(view_object): + member = getattr(view_object, field, None) + if callable(member) and hasattr(member, 'allow_rmi'): + config = { + 'url': url, + 'method': getattr(member, 'allow_rmi'), + 'headers': {'DjNg-Remote-Method': field}, + } + result.update({field: config}) + return result + + +def get_all_remote_methods(resolver=None, ns_prefix=''): + if not resolver: + resolver = get_resolver(get_urlconf()) + result = {} + for name in resolver.reverse_dict.keys(): + if not isinstance(name, str): + continue + try: + url = reverse(ns_prefix + name) +~~ resmgr = resolve(url) + ViewClass = import_string('{0}.{1}'.format(resmgr.func.__module__, resmgr.func.__name__)) + if isclass(ViewClass) and issubclass(ViewClass, JSONResponseMixin): + result[name] = _get_remote_methods_for(ViewClass, url) + except (NoReverseMatch, ImproperlyConfigured): + pass + for namespace, ns_pattern in resolver.namespace_dict.items(): + sub_res = get_all_remote_methods(ns_pattern[1], ns_prefix + namespace + ':') + if sub_res: + result[namespace] = sub_res + return result + + +def get_current_remote_methods(view): + if isinstance(view, JSONResponseMixin): + return _get_remote_methods_for(view, view.request.path_info) + + + +## ... source file continues with no further resolve examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / page_rendering.py**](https://github.com/divio/django-cms/blob/develop/cms/./page_rendering.py) + +```python +# page_rendering.py +from django.conf import settings +from django.http import Http404 +from django.shortcuts import render +from django.template.response import TemplateResponse +~~from django.urls import Resolver404, resolve, reverse + +from cms import __version__ +from cms.cache.page import set_page_cache +from cms.models import Page +from cms.utils.conf import get_cms_setting +from cms.utils.page import get_page_template_from_request +from cms.utils.page_permissions import user_can_change_page, user_can_view_page + + +def render_page(request, page, current_language, slug): + context = {} + context['lang'] = current_language + context['current_page'] = page + context['has_change_permissions'] = user_can_change_page(request.user, page) + context['has_view_permissions'] = user_can_view_page(request.user, page) + + if not context['has_view_permissions']: + return _handle_no_page(request) + + template = get_page_template_from_request(request) + response = TemplateResponse(request, template, context) + response.add_post_render_callback(set_page_cache) + + xframe_options = page.get_xframe_options() + if xframe_options == Page.X_FRAME_OPTIONS_INHERIT or xframe_options is None: + return response + + response.xframe_options_exempt = True + + if xframe_options == Page.X_FRAME_OPTIONS_ALLOW: + return response + elif xframe_options == Page.X_FRAME_OPTIONS_SAMEORIGIN: + response['X-Frame-Options'] = 'SAMEORIGIN' + elif xframe_options == Page.X_FRAME_OPTIONS_DENY: + response['X-Frame-Options'] = 'DENY' + return response + + +def render_object_structure(request, obj): + context = { + 'object': obj, + 'cms_toolbar': request.toolbar, + } + return render(request, 'cms/toolbar/structure.html', context) + + +def _handle_no_page(request): + try: +~~ resolve('%s$' % request.path) + except Resolver404 as e: + exc = Http404(dict(path=request.path, tried=e.args[0]['tried'])) + raise exc + raise Http404('CMS Page not found: %s' % request.path) + + +def _render_welcome_page(request): + context = { + 'cms_version': __version__, + 'cms_edit_on': get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON'), + 'django_debug': settings.DEBUG, + 'next_url': reverse('pages-root'), + } + return TemplateResponse(request, "cms/welcome.html", context) + + + +## ... source file continues with no further resolve examples... + +``` + + +## Example 3 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / panels / request.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/request.py) + +```python +# request.py +from django.http import Http404 +~~from django.urls import resolve +from django.utils.translation import gettext_lazy as _ + +from debug_toolbar.panels import Panel +from debug_toolbar.utils import get_name_from_obj + + +class RequestPanel(Panel): + + template = "debug_toolbar/panels/request.html" + + title = _("Request") + + @property + def nav_subtitle(self): + view_func = self.get_stats().get("view_func", "") + return view_func.rsplit(".", 1)[-1] + + def generate_stats(self, request, response): + self.record_stats( + { + "get": [(k, request.GET.getlist(k)) for k in sorted(request.GET)], + "post": [(k, request.POST.getlist(k)) for k in sorted(request.POST)], + "cookies": [ + (k, request.COOKIES.get(k)) for k in sorted(request.COOKIES) + ], + } + ) + view_info = { + "view_func": _(""), + "view_args": "None", + "view_kwargs": "None", + "view_urlname": "None", + } + try: +~~ match = resolve(request.path) + func, args, kwargs = match + view_info["view_func"] = get_name_from_obj(func) + view_info["view_args"] = args + view_info["view_kwargs"] = kwargs + view_info["view_urlname"] = getattr(match, "url_name", _("")) + except Http404: + pass + self.record_stats(view_info) + + if hasattr(request, "session"): + self.record_stats( + { + "session": [ + (k, request.session.get(k)) + for k in sorted(request.session.keys()) + ] + } + ) + + + +## ... source file continues with no further resolve examples... + +``` + + +## Example 4 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import datetime +import json +from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 +~~ from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + + +## ... source file abbreviated to get to resolve examples ... + + + app_dict[app_label] = { + 'name': name, + 'app_label': app_label, + 'app_url': reverse( + 'admin:app_list', + kwargs={'app_label': app_label}, + current_app=admin_site.name, + ), + 'has_module_perms': has_module_perms, + 'models': [model_dict], + } + + app_list = list(app_dict.values()) + + if order: + app_list.sort(key=lambda x: x['name'].lower()) + + for app in app_list: + app['models'].sort(key=lambda x: x['name']) + + return app_list + + +def get_admin_site(context): + try: +~~ current_resolver = resolve(context.get('request').path) +~~ index_resolver = resolve(reverse('%s:index' % current_resolver.namespaces[0])) + + if hasattr(index_resolver.func, 'admin_site'): + return index_resolver.func.admin_site + + for func_closure in index_resolver.func.__closure__: + if isinstance(func_closure.cell_contents, AdminSite): + return func_closure.cell_contents + except: + pass + + return admin.site + + +def get_admin_site_name(context): + return get_admin_site(context).name + + +class LazyDateTimeEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date): + return obj.isoformat() + elif isinstance(obj, Promise): + return force_text(obj) + return self.encode(obj) + + +## ... source file continues with no further resolve examples... + +``` + + +## Example 5 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / relations.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./relations.py) + +```python +# relations.py +import sys +from collections import OrderedDict +from urllib import parse + +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist +from django.db.models import Manager +from django.db.models.query import QuerySet +~~from django.urls import NoReverseMatch, Resolver404, get_script_prefix, resolve +from django.utils.encoding import smart_str, uri_to_iri +from django.utils.translation import gettext_lazy as _ + +from rest_framework.fields import ( + Field, empty, get_attribute, is_simple_callable, iter_options +) +from rest_framework.reverse import reverse +from rest_framework.settings import api_settings +from rest_framework.utils import html + + +def method_overridden(method_name, klass, instance): + method = getattr(klass, method_name) + default_method = getattr(method, '__func__', method) # Python 3 compat + return default_method is not getattr(instance, method_name).__func__ + + +class ObjectValueError(ValueError): + + +class ObjectTypeError(TypeError): + + +class Hyperlink(str): + + +## ... source file abbreviated to get to resolve examples ... + + + + def get_url(self, obj, view_name, request, format): + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + + def to_internal_value(self, data): + request = self.context.get('request', None) + try: + http_prefix = data.startswith(('http:', 'https:')) + except AttributeError: + self.fail('incorrect_type', data_type=type(data).__name__) + + if http_prefix: + data = parse.urlparse(data).path + prefix = get_script_prefix() + if data.startswith(prefix): + data = '/' + data[len(prefix):] + + data = uri_to_iri(parse.unquote(data)) + + try: +~~ match = resolve(data) + except Resolver404: + self.fail('no_match') + + try: + expected_viewname = request.versioning_scheme.get_versioned_viewname( + self.view_name, request + ) + except AttributeError: + expected_viewname = self.view_name + + if match.view_name != expected_viewname: + self.fail('incorrect_match') + + try: + return self.get_object(match.view_name, match.args, match.kwargs) + except (ObjectDoesNotExist, ObjectValueError, ObjectTypeError): + self.fail('does_not_exist') + + def to_representation(self, value): + assert 'request' in self.context, ( + "`%s` requires the request in the serializer" + " context. Add `context={'request': request}` when instantiating " + "the serializer." % self.__class__.__name__ + ) + + +## ... source file continues with no further resolve examples... + +``` + + +## Example 6 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms.py) + +```python +# forms.py + "UserCreationForm", + "UserUpdateForm", + "WikiSlugField", + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", + "TextInputPrepend", + "CreateForm", + "DeleteForm", + "PermissionsForm", + "DirFilterForm", + "SearchForm", +] + +from datetime import timedelta + +from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model +from django.core import validators +from django.core.validators import RegexValidator +from django.forms.widgets import HiddenInput +from django.shortcuts import get_object_or_404 +~~from django.urls import Resolver404, resolve +from django.utils import timezone +from django.utils.safestring import mark_safe +from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.plugins.base import PluginSettingsFormMixin +from wiki.editors import getEditor + +from .forms_account_handling import UserCreationForm, UserUpdateForm + +validate_slug_numbers = RegexValidator( + r"^[0-9]+$", + _("A 'slug' cannot consist solely of numbers."), + "invalid", + inverse_match=True, +) + + +class WikiSlugField(forms.CharField): + + default_validators = [validators.validate_slug, validate_slug_numbers] + + + +## ... source file abbreviated to get to resolve examples ... + + + raise forms.ValidationError(gettext("A slug may not begin with an underscore.")) + if slug == "admin": + raise forms.ValidationError(gettext("'admin' is not a permitted slug name.")) + + if settings.URL_CASE_SENSITIVE: + already_existing_slug = models.URLPath.objects.filter(slug=slug, parent=urlpath) + else: + slug = slug.lower() + already_existing_slug = models.URLPath.objects.filter( + slug__iexact=slug, parent=urlpath + ) + if already_existing_slug: + already_urlpath = already_existing_slug[0] + if already_urlpath.article and already_urlpath.article.current_revision.deleted: + raise forms.ValidationError( + gettext('A deleted article with slug "%s" already exists.') + % already_urlpath.slug + ) + else: + raise forms.ValidationError( + gettext('A slug named "%s" already exists.') % already_urlpath.slug + ) + + if settings.CHECK_SLUG_URL_AVAILABLE: + try: +~~ match = resolve(urlpath.path + "/" + slug + "/") + if match.app_name != "wiki": + raise forms.ValidationError( + gettext("This slug conflicts with an existing URL.") + ) + except Resolver404: + pass + + return slug + + +User = get_user_model() +Group = apps.get_model(settings.GROUP_MODEL) + + +class SpamProtectionMixin: + + + revision_model = models.ArticleRevision + + def check_spam(self): # noqa + request = self.request + user = None + ip_address = None + if request.user.is_authenticated: + + +## ... source file continues with no further resolve examples... + +``` + diff --git a/content/pages/examples/django/django-urls-reverse.markdown b/content/pages/examples/django/django-urls-reverse.markdown new file mode 100644 index 000000000..b56cbce5b --- /dev/null +++ b/content/pages/examples/django/django-urls-reverse.markdown @@ -0,0 +1,2796 @@ +title: django.urls reverse Example Code +category: page +slug: django-urls-reverse-examples +sortorder: 500011411 +toc: False +sidebartitle: django.urls reverse +meta: Python example code for the reverse callable from the django.urls module of the Django project. + + +reverse is a callable within the django.urls module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair/forms.py) + +```python +# forms.py +from functools import reduce + +from django import forms +from django.contrib.auth import get_user_model +from django.db import models +from django.db.models import Q, F, Count, Max, Subquery, OuterRef, Value +from django.db.models.functions import Concat +from django.forms import MultipleChoiceField, ChoiceField, Form +~~from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ + +from django_countries import countries + +from conferences.models import Conference, ArtifactDescriptor +from gears.widgets import CustomCheckboxSelectMultiple, CustomFileInput +from review.models import Reviewer, Review, ReviewStats +from review.utilities import get_average_score +from submissions.models import Submission, Attachment +from users.models import Profile + +User = get_user_model() + + +def clean_data_to_int(iterable, empty=None): + return [int(x) if x != '' else None for x in iterable] + + +def q_or(disjuncts, default=True): + if disjuncts: + return reduce(lambda acc, d: acc | d, disjuncts) + return Q(pk__isnull=(not default)) # otherwise, check whether PK is null + + + + +## ... source file abbreviated to get to reverse examples ... + + + record[self.ORDER_COLUMN] = order + + if self.ID_COLUMN in columns: + record[self.ID_COLUMN] = sub.pk + + if self.TITLE_COLUMN in columns: + record[self.TITLE_COLUMN] = sub.title + + if self.AUTHORS_COLUMN in columns: + names = [get_user_name(profiles[a.user_id]) for a in authors] + record[self.AUTHORS_COLUMN] = '; '.join(names) + + if self.COUNTRY_COLUMN in columns: + countries_list = [ + profiles[a.user_id].get_country_display() for a in authors] + countries_list = list(set(countries_list)) # remove duplicates + countries_list.sort() + record[self.COUNTRY_COLUMN] = '; '.join(countries_list) + + if self.STYPE_COLUMN in columns: + record[self.STYPE_COLUMN] = ( + sub.stype.get_language_display() if sub.stype else '') + + if self.REVIEW_PAPER_COLUMN in columns: + record[self.REVIEW_PAPER_COLUMN] = request.build_absolute_uri( +~~ reverse('submissions:download-manuscript', args=[sub.pk])) + + if self.REVIEW_SCORE_COLUMN in columns: + score = get_average_score(sub) + score_string = f'{score:.1f}' if score else '-' + record[self.REVIEW_SCORE_COLUMN] = score_string + + if self.STATUS_COLUMN in columns: + record[self.STATUS_COLUMN] = sub.get_status_display() + + if self.TOPICS_COLUMN in columns: + record[self.TOPICS_COLUMN] = '; '.join(sub.topics.values_list( + 'name', flat=True)) + + + result.append(record) + return result + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / adapter.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/adapter.py) + +```python +# adapter.py +from __future__ import absolute_import + +from django.core.exceptions import ValidationError +~~from django.urls import reverse +from django.utils.translation import gettext_lazy as _ + +from ..account import app_settings as account_settings +from ..account.adapter import get_adapter as get_account_adapter +from ..account.app_settings import EmailVerificationMethod +from ..account.models import EmailAddress +from ..account.utils import user_email, user_field, user_username +from ..utils import ( + deserialize_instance, + email_address_exists, + import_attribute, + serialize_instance, + valid_email_or_none, +) +from . import app_settings + + +class DefaultSocialAccountAdapter(object): + + error_messages = { + 'email_taken': + _("An account already exists with this e-mail address." + " Please sign in to that account first, then connect" + " your %s account.") + + +## ... source file abbreviated to get to reverse examples ... + + + get_account_adapter().save_user(request, u, form) + else: + get_account_adapter().populate_username(request, u) + sociallogin.save(request) + return u + + def populate_user(self, + request, + sociallogin, + data): + username = data.get('username') + first_name = data.get('first_name') + last_name = data.get('last_name') + email = data.get('email') + name = data.get('name') + user = sociallogin.user + user_username(user, username or '') + user_email(user, valid_email_or_none(email) or '') + name_parts = (name or '').partition(' ') + user_field(user, 'first_name', first_name or name_parts[0]) + user_field(user, 'last_name', last_name or name_parts[2]) + return user + + def get_connect_redirect_url(self, request, socialaccount): + assert request.user.is_authenticated +~~ url = reverse('socialaccount_connections') + return url + + def validate_disconnect(self, account, accounts): + if len(accounts) == 1: + if not account.user.has_usable_password(): + raise ValidationError(_("Your account has no password set" + " up.")) + if app_settings.EMAIL_VERIFICATION \ + == EmailVerificationMethod.MANDATORY: + if EmailAddress.objects.filter(user=account.user, + verified=True).count() == 0: + raise ValidationError(_("Your account has no verified" + " e-mail address.")) + + def is_auto_signup_allowed(self, request, sociallogin): + auto_signup = app_settings.AUTO_SIGNUP + if auto_signup: + email = user_email(sociallogin.user) + if email: + if account_settings.UNIQUE_EMAIL: + if email_address_exists(email): + auto_signup = False + elif app_settings.EMAIL_REQUIRED: + auto_signup = False + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 3 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / urls.py**](https://github.com/jrief/django-angular/blob/master/djng/./urls.py) + +```python +# urls.py +import warnings +~~from django.urls import reverse +from django.conf.urls import url +from django.http.response import HttpResponsePermanentRedirect + + +warnings.warn("Reversing URL's using urlpatterns is deprecated. Please use the middleware instead", + DeprecationWarning) + + +def angular_reverse(request, *args, **kwargs): + url_name = request.GET.get('djng_url_name') + url_args = request.GET.getlist('djng_url_args', None) + url_kwargs = {} + + prefix = 'djng_url_kwarg_' + for param in request.GET: + if param.startswith(prefix): + url_kwargs[param[len(prefix):]] = request.GET[param] + +~~ url = reverse(url_name, args=url_args, kwargs=url_kwargs) + return HttpResponsePermanentRedirect(url) + + +urlpatterns = [ + url(r'^reverse/$', angular_reverse), +] + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 4 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / tests / test_handlers.py**](https://github.com/jazzband/django-axes/blob/master/axes/tests/test_handlers.py) + +```python +# test_handlers.py +from unittest.mock import MagicMock, patch + +from django.test import override_settings +~~from django.urls import reverse +from django.utils import timezone +from django.utils.timezone import timedelta + +from axes.conf import settings +from axes.handlers.proxy import AxesProxyHandler +from axes.helpers import get_client_str +from axes.models import AccessAttempt, AccessLog +from axes.tests.base import AxesTestCase + + +@override_settings(AXES_HANDLER="axes.handlers.base.AxesHandler") +class AxesHandlerTestCase(AxesTestCase): + def test_base_handler_reset_attempts_raises(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.reset_attempts() + + def test_base_handler_reset_logs_raises(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.reset_logs() + + def test_base_handler_raises_on_undefined_is_allowed_to_authenticate(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.is_allowed(self.request, {}) + + + +## ... source file abbreviated to get to reverse examples ... + + + @override_settings( + AXES_NEVER_LOCKOUT_WHITELIST=True, AXES_IP_WHITELIST=["127.0.0.1"] + ) + def test_is_allowed_with_whitelisted_ip_address(self): + self.assertTrue(AxesProxyHandler.is_allowed(self.request)) + + @override_settings(AXES_NEVER_LOCKOUT_GET=True) + def test_is_allowed_with_whitelisted_method(self): + self.request.method = "GET" + self.assertTrue(AxesProxyHandler.is_allowed(self.request)) + + @override_settings(AXES_LOCK_OUT_AT_FAILURE=False) + def test_is_allowed_no_lock_out(self): + self.assertTrue(AxesProxyHandler.is_allowed(self.request)) + + @override_settings(AXES_ONLY_ADMIN_SITE=True) + def test_only_admin_site(self): + request = MagicMock() + request.path = "/test/" + self.assertTrue(AxesProxyHandler.is_allowed(self.request)) + + def test_is_admin_site(self): + request = MagicMock() + tests = ( # (AXES_ONLY_ADMIN_SITE, URL, Expected) + (True, "/test/", True), +~~ (True, reverse("admin:index"), False), + (False, "/test/", False), +~~ (False, reverse("admin:index"), False), + ) + + for setting_value, url, expected in tests: + with override_settings(AXES_ONLY_ADMIN_SITE=setting_value): + request.path = url + self.assertEqual(AxesProxyHandler().is_admin_site(request), expected) + + @override_settings(ROOT_URLCONF="axes.tests.urls_empty") + @override_settings(AXES_ONLY_ADMIN_SITE=True) + def test_is_admin_site_no_admin_site(self): + request = MagicMock() + request.path = "/admin/" + self.assertTrue(AxesProxyHandler().is_admin_site(self.request)) + + +class AxesProxyHandlerTestCase(AxesTestCase): + def setUp(self): + self.sender = MagicMock() + self.credentials = MagicMock() + self.request = MagicMock() + self.user = MagicMock() + self.instance = MagicMock() + + @patch("axes.handlers.proxy.AxesProxyHandler.implementation", None) + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 5 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / page_rendering.py**](https://github.com/divio/django-cms/blob/develop/cms/./page_rendering.py) + +```python +# page_rendering.py +from django.conf import settings +from django.http import Http404 +from django.shortcuts import render +from django.template.response import TemplateResponse +~~from django.urls import Resolver404, resolve, reverse + +from cms import __version__ +from cms.cache.page import set_page_cache +from cms.models import Page +from cms.utils.conf import get_cms_setting +from cms.utils.page import get_page_template_from_request +from cms.utils.page_permissions import user_can_change_page, user_can_view_page + + +def render_page(request, page, current_language, slug): + context = {} + context['lang'] = current_language + context['current_page'] = page + context['has_change_permissions'] = user_can_change_page(request.user, page) + context['has_view_permissions'] = user_can_view_page(request.user, page) + + if not context['has_view_permissions']: + return _handle_no_page(request) + + template = get_page_template_from_request(request) + response = TemplateResponse(request, template, context) + response.add_post_render_callback(set_page_cache) + + xframe_options = page.get_xframe_options() + + +## ... source file abbreviated to get to reverse examples ... + + + return response + + +def render_object_structure(request, obj): + context = { + 'object': obj, + 'cms_toolbar': request.toolbar, + } + return render(request, 'cms/toolbar/structure.html', context) + + +def _handle_no_page(request): + try: + resolve('%s$' % request.path) + except Resolver404 as e: + exc = Http404(dict(path=request.path, tried=e.args[0]['tried'])) + raise exc + raise Http404('CMS Page not found: %s' % request.path) + + +def _render_welcome_page(request): + context = { + 'cms_version': __version__, + 'cms_edit_on': get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON'), + 'django_debug': settings.DEBUG, +~~ 'next_url': reverse('pages-root'), + } + return TemplateResponse(request, "cms/welcome.html", context) + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 6 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / admin / widgets.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/widgets.py) + +```python +# widgets.py +import six +from six.moves import urllib +from django import forms +from django.contrib.admin.sites import site +from django.contrib.admin.widgets import ForeignKeyRawIdWidget +from django.template.loader import render_to_string +from django.templatetags.static import static +~~from django.urls import reverse +from django.utils.safestring import mark_safe +from django.utils.text import Truncator + + +class ForeignKeySearchInput(ForeignKeyRawIdWidget): + + widget_template = None + search_path = None + + def _media(self): + js_files = [ + static('django_extensions/js/jquery.bgiframe.js'), + static('django_extensions/js/jquery.ajaxQueue.js'), + static('django_extensions/js/jquery.autocomplete.js'), + ] + + return forms.Media( + css={'all': (static('django_extensions/css/jquery.autocomplete.css'), )}, + js=js_files, + ) + media = property(_media) + + def label_for_value(self, value): + key = self.rel.get_related_field().name + obj = self.rel.model._default_manager.get(**{key: value}) + + return Truncator(obj).words(14, truncate='...') + + def __init__(self, rel, search_fields, attrs=None): + self.search_fields = search_fields + super().__init__(rel, site, attrs) + + def render(self, name, value, attrs=None, renderer=None): + if attrs is None: + attrs = {} + opts = self.rel.model._meta + app_label = opts.app_label + model_name = opts.object_name.lower() +~~ related_url = reverse('admin:%s_%s_changelist' % (app_label, model_name)) + if not self.search_path: + self.search_path = urllib.parse.urljoin(related_url, 'foreignkey_autocomplete/') + params = self.url_parameters() + if params: + url = '?' + '&'.join(['%s=%s' % (k, v) for k, v in params.items()]) + else: + url = '' + + if 'class' not in attrs: + attrs['class'] = 'vForeignKeyRawIdAdminField' + output = [forms.TextInput.render(self, name, value, attrs)] + + if value: + label = self.label_for_value(value) + else: + label = six.u('') + + context = { + 'url': url, + 'related_url': related_url, + 'search_path': self.search_path, + 'search_fields': ','.join(self.search_fields), + 'app_label': app_label, + 'model_name': model_name, + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 7 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / fileadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/fileadmin.py) + +```python +# fileadmin.py +from __future__ import absolute_import + +from django import forms +from django.contrib.admin.utils import unquote +from django.http import HttpResponseRedirect +~~from django.urls import reverse +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ + +from .. import settings +from ..models import File +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import AdminContext, admin_url_params_encoded, popup_status + + +class FileAdminChangeFrom(forms.ModelForm): + class Meta(object): + model = File + exclude = () + + +class FileAdmin(PrimitivePermissionAwareModelAdmin): + list_display = ('label',) + list_per_page = 10 + search_fields = ['name', 'original_filename', 'sha1', 'description'] + raw_id_fields = ('owner',) + readonly_fields = ('sha1', 'display_canonical') + + form = FileAdminChangeFrom + + + +## ... source file abbreviated to get to reverse examples ... + + + (_('Advanced'), { + 'fields': ( + 'file', + 'sha1', + 'display_canonical', + ) + extra_advanced_fields, + 'classes': ('collapse',), + }), + ) + extra_fieldsets + if settings.FILER_ENABLE_PERMISSIONS: + fieldsets = fieldsets + ( + (None, { + 'fields': ('is_public',) + }), + ) + return fieldsets + + def response_change(self, request, obj): + if ( + request.POST + and '_continue' not in request.POST + and '_saveasnew' not in request.POST + and '_addanother' not in request.POST + ): + if obj.folder: +~~ url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': obj.folder.id}) + else: +~~ url = reverse( + 'admin:filer-directory_listing-unfiled_images') + url = "{0}{1}".format( + url, + admin_url_params_encoded(request), + ) + return HttpResponseRedirect(url) + return super(FileAdmin, self).response_change(request, obj) + + def render_change_form(self, request, context, add=False, change=False, + form_url='', obj=None): + info = self.model._meta.app_label, self.model._meta.model_name + extra_context = {'show_delete': True, + 'history_url': 'admin:%s_%s_history' % info, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request)} + context.update(extra_context) + return super(FileAdmin, self).render_change_form( + request=request, context=context, add=add, change=change, + form_url=form_url, obj=obj) + + def delete_view(self, request, object_id, extra_context=None): + try: + obj = self.get_queryset(request).get(pk=unquote(object_id)) + parent_folder = obj.folder + except self.model.DoesNotExist: + parent_folder = None + + if request.POST: + super(FileAdmin, self).delete_view( + request=request, object_id=object_id, + extra_context=extra_context) + if parent_folder: +~~ url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': parent_folder.id}) + else: +~~ url = reverse('admin:filer-directory_listing-unfiled_images') + url = "{0}{1}".format( + url, + admin_url_params_encoded(request) + ) + return HttpResponseRedirect(url) + + return super(FileAdmin, self).delete_view( + request=request, object_id=object_id, + extra_context=extra_context) + + def get_model_perms(self, request): + return { + 'add': False, + 'change': False, + 'delete': False, + } + + def display_canonical(self, instance): + canonical = instance.canonical_url + if canonical: + return mark_safe('%s' % (canonical, canonical)) + else: + return '-' + display_canonical.allow_tags = True + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 8 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / admin.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./admin.py) + +```python +# admin.py +from collections import OrderedDict + +from django import forms +from django.conf import settings +from django.contrib import admin, messages +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth import get_user_model +from django.shortcuts import get_object_or_404, redirect, render +~~from django.urls import reverse, path +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext +from guardian.forms import GroupObjectPermissionsForm, UserObjectPermissionsForm +from django.contrib.auth.models import Group +from guardian.shortcuts import (get_group_perms, get_groups_with_perms, get_perms_for_model, get_user_perms, + get_users_with_perms) + + +class AdminUserObjectPermissionsForm(UserObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class AdminGroupObjectPermissionsForm(GroupObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class GuardedModelAdminMixin: + change_form_template = \ + 'admin/guardian/model/change_form.html' + obj_perms_manage_template = \ + + +## ... source file abbreviated to get to reverse examples ... + + + path('/permissions/group-manage//', + view=self.admin_site.admin_view( + self.obj_perms_manage_group_view), + name='%s_%s_permissions_manage_group' % info), + ] + urls = myurls + urls + return urls + + def get_obj_perms_base_context(self, request, obj): + context = self.admin_site.each_context(request) + context.update({ + 'adminform': {'model_admin': self}, + 'media': self.media, + 'object': obj, + 'app_label': self.model._meta.app_label, + 'opts': self.model._meta, + 'original': str(obj), + 'has_change_permission': self.has_change_permission(request, obj), + 'model_perms': get_perms_for_model(obj), + 'title': _("Object permissions"), + }) + return context + + def obj_perms_manage_view(self, request, object_pk): + if not self.has_change_permission(request, None): +~~ post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + from django.contrib.admin.utils import unquote + obj = get_object_or_404(self.get_queryset( + request), pk=unquote(object_pk)) + users_perms = OrderedDict( + sorted( + get_users_with_perms(obj, attach_perms=True, + with_group_users=False).items(), + key=lambda user: getattr( + user[0], get_user_model().USERNAME_FIELD) + ) + ) + + groups_perms = OrderedDict( + sorted( + get_groups_with_perms(obj, attach_perms=True).items(), + key=lambda group: group[0].name + ) + ) + + if request.method == 'POST' and 'submit_manage_user' in request.POST: + user_form = self.get_obj_perms_user_select_form( + request)(request.POST) + group_form = self.get_obj_perms_group_select_form( + request)(request.POST) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + if user_form.is_valid(): + user_id = user_form.cleaned_data['user'].pk +~~ url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user_id] + ) + return redirect(url) + elif request.method == 'POST' and 'submit_manage_group' in request.POST: + user_form = self.get_obj_perms_user_select_form( + request)(request.POST) + group_form = self.get_obj_perms_group_select_form( + request)(request.POST) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + if group_form.is_valid(): + group_id = group_form.cleaned_data['group'].id +~~ url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group_id] + ) + return redirect(url) + else: + user_form = self.get_obj_perms_user_select_form(request)() + group_form = self.get_obj_perms_group_select_form(request)() + + context = self.get_obj_perms_base_context(request, obj) + context['users_perms'] = users_perms + context['groups_perms'] = groups_perms + context['user_form'] = user_form + context['group_form'] = group_form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_template(), context) + + def get_obj_perms_manage_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage.html' + return self.obj_perms_manage_template + + def obj_perms_manage_user_view(self, request, object_pk, user_id): + if not self.has_change_permission(request, None): +~~ post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + user = get_object_or_404(get_user_model(), pk=user_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_user_form(request) + form = form_class(user, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) +~~ url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user.pk] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['user_obj'] = user + context['user_perms'] = get_user_perms(user, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_user_template(), context) + + def get_obj_perms_manage_user_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + return self.obj_perms_manage_user_template + + def get_obj_perms_user_select_form(self, request): + return UserManage + + def get_obj_perms_group_select_form(self, request): + return GroupManage + + def get_obj_perms_manage_user_form(self, request): + return AdminUserObjectPermissionsForm + + def obj_perms_manage_group_view(self, request, object_pk, group_id): + if not self.has_change_permission(request, None): +~~ post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + group = get_object_or_404(Group, id=group_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_group_form(request) + form = form_class(group, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) +~~ url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group.id] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['group_obj'] = group + context['group_perms'] = get_group_perms(group, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_group_template(), context) + + def get_obj_perms_manage_group_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_group.html' + return self.obj_perms_manage_group_template + + def get_obj_perms_manage_group_form(self, request): + return AdminGroupObjectPermissionsForm + + +class GuardedModelAdmin(GuardedModelAdminMixin, admin.ModelAdmin): + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 9 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / admin.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./admin.py) + +```python +# admin.py +from datetime import datetime + +import django +from django import forms +from django.conf import settings +from django.conf.urls import url +from django.contrib import admin, messages +from django.contrib.admin.models import ADDITION, CHANGE, DELETION, LogEntry +from django.contrib.auth import get_permission_codename +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import PermissionDenied +from django.http import HttpResponse, HttpResponseRedirect +from django.template.response import TemplateResponse +~~from django.urls import reverse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_str +from django.utils.module_loading import import_string +from django.utils.translation import gettext_lazy as _ +from django.views.decorators.http import require_POST + +from .formats.base_formats import DEFAULT_FORMATS +from .forms import ConfirmImportForm, ExportForm, ImportForm, export_action_form_factory +from .resources import modelresource_factory +from .results import RowResult +from .signals import post_export, post_import +from .tmp_storages import TempFolderStorage + +SKIP_ADMIN_LOG = getattr(settings, 'IMPORT_EXPORT_SKIP_ADMIN_LOG', False) +TMP_STORAGE_CLASS = getattr(settings, 'IMPORT_EXPORT_TMP_STORAGE_CLASS', + TempFolderStorage) + + +if isinstance(TMP_STORAGE_CLASS, str): + TMP_STORAGE_CLASS = import_string(TMP_STORAGE_CLASS) + + +class ImportExportMixinBase: + def get_model_info(self): + + +## ... source file abbreviated to get to reverse examples ... + + + + result = self.process_dataset(dataset, confirm_form, request, *args, **kwargs) + + tmp_storage.remove() + + return self.process_result(result, request) + + def process_dataset(self, dataset, confirm_form, request, *args, **kwargs): + + res_kwargs = self.get_import_resource_kwargs(request, form=confirm_form, *args, **kwargs) + resource = self.get_import_resource_class()(**res_kwargs) + + imp_kwargs = self.get_import_data_kwargs(request, form=confirm_form, *args, **kwargs) + return resource.import_data(dataset, + dry_run=False, + raise_errors=True, + file_name=confirm_form.cleaned_data['original_file_name'], + user=request.user, + **imp_kwargs) + + def process_result(self, result, request): + self.generate_log_entries(result, request) + self.add_success_message(result, request) + post_import.send(sender=None, model=self.model) + +~~ url = reverse('admin:%s_%s_changelist' % self.get_model_info(), + current_app=self.admin_site.name) + return HttpResponseRedirect(url) + + def generate_log_entries(self, result, request): + if not self.get_skip_admin_log(): + logentry_map = { + RowResult.IMPORT_TYPE_NEW: ADDITION, + RowResult.IMPORT_TYPE_UPDATE: CHANGE, + RowResult.IMPORT_TYPE_DELETE: DELETION, + } + content_type_id = ContentType.objects.get_for_model(self.model).pk + for row in result: + if row.import_type != row.IMPORT_TYPE_ERROR and row.import_type != row.IMPORT_TYPE_SKIP: + LogEntry.objects.log_action( + user_id=request.user.pk, + content_type_id=content_type_id, + object_id=row.object_id, + object_repr=row.object_repr, + action_flag=logentry_map[row.import_type], + change_message=_("%s through import_export" % row.import_type), + ) + + def add_success_message(self, result, request): + opts = self.model._meta + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 10 from django-inline-actions +[django-inline-actions](https://github.com/escaped/django-inline-actions) +([PyPI package information](https://pypi.org/project/django-inline-actions/)) +is an extension that adds actions to the [Django](/django.html) +Admin InlineModelAdmin and ModelAdmin changelists. The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/escaped/django-inline-actions/blob/master/LICENSE). + +[**django-inline-actions / inline_actions / actions.py**](https://github.com/escaped/django-inline-actions/blob/master/inline_actions/./actions.py) + +```python +# actions.py +from django.contrib import messages +from django.shortcuts import redirect +~~from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ + + +class ViewAction: + inline_actions = ['view_action'] + + def view_action(self, request, obj, parent_obj=None): +~~ url = reverse( + 'admin:{}_{}_change'.format( + obj._meta.app_label, + obj._meta.model_name, + ), + args=(obj.pk,) + ) + return redirect(url) + view_action.short_description = _("View") + + +class DeleteAction: + def get_inline_actions(self, request, obj=None): + actions = super().get_inline_actions(request, obj) + if self.has_delete_permission(request, obj): + actions.append('delete_action') + return actions + + def delete_action(self, request, obj, parent_obj=None): + if self.has_delete_permission(request): + obj.delete() + messages.info(request, "`{}` deleted.".format(obj)) + delete_action.short_description = _("Delete") + + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 11 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import datetime +import json +from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 +~~ from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + + +## ... source file abbreviated to get to reverse examples ... + + +def get_app_list(context, order=True): + admin_site = get_admin_site(context) + request = context['request'] + + app_dict = {} + for model, model_admin in admin_site._registry.items(): + app_label = model._meta.app_label + try: + has_module_perms = model_admin.has_module_permission(request) + except AttributeError: + has_module_perms = request.user.has_module_perms(app_label) # Fix Django < 1.8 issue + + if has_module_perms: + perms = model_admin.get_model_perms(request) + + if True in perms.values(): + info = (app_label, model._meta.model_name) + model_dict = { + 'name': capfirst(model._meta.verbose_name_plural), + 'object_name': model._meta.object_name, + 'perms': perms, + 'model_name': model._meta.model_name + } + if perms.get('change', False): + try: +~~ model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=admin_site.name) + except NoReverseMatch: + pass + if perms.get('add', False): + try: +~~ model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=admin_site.name) + except NoReverseMatch: + pass + if app_label in app_dict: + app_dict[app_label]['models'].append(model_dict) + else: + try: + name = apps.get_app_config(app_label).verbose_name + except NameError: + name = app_label.title() + app_dict[app_label] = { + 'name': name, + 'app_label': app_label, +~~ 'app_url': reverse( + 'admin:app_list', + kwargs={'app_label': app_label}, + current_app=admin_site.name, + ), + 'has_module_perms': has_module_perms, + 'models': [model_dict], + } + + app_list = list(app_dict.values()) + + if order: + app_list.sort(key=lambda x: x['name'].lower()) + + for app in app_list: + app['models'].sort(key=lambda x: x['name']) + + return app_list + + +def get_admin_site(context): + try: + current_resolver = resolve(context.get('request').path) + index_resolver = resolve(reverse('%s:index' % current_resolver.namespaces[0])) + + + +## ... source file abbreviated to get to reverse examples ... + + + return instance.related_label() + return smart_text(instance) + + +class SuccessMessageMixin(object): + success_message = '' + + def form_valid(self, form): + response = super(SuccessMessageMixin, self).form_valid(form) + success_message = self.get_success_message(form.cleaned_data) + if success_message: + messages.success(self.request, success_message) + return response + + def get_success_message(self, cleaned_data): + return self.success_message % cleaned_data + + +def get_model_queryset(admin_site, model, request, preserved_filters=None): + model_admin = admin_site._registry.get(model) + + if model_admin is None: + return + + try: +~~ changelist_url = reverse('%s:%s_%s_changelist' % ( + admin_site.name, + model._meta.app_label, + model._meta.model_name + )) + except NoReverseMatch: + return + + changelist_filters = None + + if preserved_filters: + changelist_filters = preserved_filters.get('_changelist_filters') + + if changelist_filters: + changelist_url += '?' + changelist_filters + + if model_admin: + queryset = model_admin.get_queryset(request) + else: + queryset = model.objects + + list_display = model_admin.get_list_display(request) + list_display_links = model_admin.get_list_display_links(request, list_display) + list_filter = model_admin.get_list_filter(request) + search_fields = model_admin.get_search_fields(request) \ + + +## ... source file abbreviated to get to reverse examples ... + + + 'url': model.get('admin_url'), + 'url_blank': False, + 'name': model['model_name'], + 'object_name': model['object_name'], + 'label': model.get('name', model['object_name']), + 'has_perms': any(model.get('perms', {}).values()), + }, app['models'])), + 'pinned': app['app_label'] in pinned_apps, + 'custom': False + }, original_app_list) + + +def get_menu_item_url(url, original_app_list): + if isinstance(url, dict): + url_type = url.get('type') + + if url_type == 'app': + return original_app_list[url['app_label']]['url'] + elif url_type == 'model': + models = dict(map( + lambda x: (x['name'], x['url']), + original_app_list[url['app_label']]['models'] + )) + return models[url['model']] + elif url_type == 'reverse': +~~ return reverse(url['name'], args=url.get('args'), kwargs=url.get('kwargs')) + elif isinstance(url, str): + return url + + +def get_menu_items(context): + pinned_apps = PinnedApplication.objects.filter(user=context['user'].pk).values_list('app_label', flat=True) + original_app_list = OrderedDict(map(lambda app: (app['app_label'], app), get_original_menu_items(context))) + custom_app_list = settings.JET_SIDE_MENU_ITEMS + custom_app_list_deprecated = settings.JET_SIDE_MENU_CUSTOM_APPS + + if custom_app_list not in (None, False): + if isinstance(custom_app_list, dict): + admin_site = get_admin_site(context) + custom_app_list = custom_app_list.get(admin_site.name, []) + + app_list = [] + + def get_menu_item_app_model(app_label, data): + item = {'has_perms': True} + + if 'name' in data: + parts = data['name'].split('.', 2) + + if len(parts) > 1: + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 12 from django-loginas +[django-loginas](https://github.com/skorokithakis/django-loginas) +([PyPI package information](https://pypi.org/project/django-loginas/)) +is [Django](/django.html) code library for admins to log into an application +as another user, typically for debugging purposes. + +django-loginas is open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/skorokithakis/django-loginas/blob/master/LICENSE). + +[**django-loginas / loginas / tests / tests.py**](https://github.com/skorokithakis/django-loginas/blob/master/loginas/tests/tests.py) + +```python +# tests.py +from __future__ import absolute_import, print_function, unicode_literals + +import unittest +from datetime import timedelta + +import django +from django.conf import settings as django_settings +from django.contrib.auth.models import User +from django.contrib.messages.storage.cookie import CookieStorage +from django.core.exceptions import ImproperlyConfigured, PermissionDenied +from django.test import Client, TestCase +from django.test.utils import override_settings as override_settings_orig +from django.utils import timezone +from loginas import settings as la_settings + +try: + from django.core.urlresolvers import reverse +except ImportError: +~~ from django.urls import reverse + +try: + from urllib.parse import urlsplit +except ImportError: + from urlparse import urlsplit # type: ignore + + +try: + import imp + + reload = imp.reload # @ReservedAssignment +except ImportError: + pass + + +class override_settings(override_settings_orig): + + def enable(self): + super(override_settings, self).enable() + from loginas import settings as loginas_settings + + reload(loginas_settings) + + def disable(self): + + +## ... source file abbreviated to get to reverse examples ... + + + raise PermissionDenied("You can't login as target user") + + +class WrongAuthBackend: + + def authenticate(self, *args, **kwargs): + return None + + +class ViewTest(TestCase): + + + def setUp(self): + self.client = Client(enforce_csrf_checks=True) + self.client.get("/") # To get the CSRF token for next request + assert django_settings.CSRF_COOKIE_NAME in self.client.cookies + self.target_user = User.objects.create(username="target") + + def get_csrf_token_payload(self): + return {"csrfmiddlewaretoken": self.client.cookies[django_settings.CSRF_COOKIE_NAME].value} + + def get_target_url(self, target_user=None): + if target_user is None: + target_user = self.target_user + response = self.client.post( +~~ reverse("loginas-user-login", kwargs={"user_id": target_user.id}), data=self.get_csrf_token_payload() + ) + self.assertEqual(response.status_code, 302) + return response + + def assertCurrentUserIs(self, user): + id_ = str(user.id if user is not None else None).encode("utf-8") + r = self.client.post(reverse("current_user"), data=self.get_csrf_token_payload()) + self.assertEqual(r.content, id_) + + def assertLoginError(self, resp, message=None): + self.assertEqual(urlsplit(resp["Location"])[2], "/") + message = message or "You do not have permission to do that." + messages = CookieStorage(resp)._decode(resp.cookies["messages"].value) + self.assertIn((40, message), [(m.level, m.message) for m in messages]) + + def assertLoginSuccess(self, resp, user): + self.assertEqual(urlsplit(resp["Location"])[2], django_settings.LOGIN_REDIRECT_URL) + msg = la_settings.MESSAGE_LOGIN_SWITCH.format(username=user.__dict__[la_settings.USERNAME_FIELD]) + messages = CookieStorage(resp)._decode(resp.cookies["messages"].value) + self.assertIn(msg, "".join([m.message for m in messages])) + + def assertRaisesExact(self, exception, func, *args, **kwargs): + try: + func(*args, **kwargs) + + +## ... source file abbreviated to get to reverse examples ... + + + self.assertCurrentUserIs(user) + + @unittest.skipIf(django.VERSION[:2] < (1, 10), "Django < 1.10 allows to authenticate as inactive user") + def test_auth_backends_user_not_found(self): + superuser = create_user("me", "pass", is_superuser=True, is_staff=True) + self.assertTrue(self.client.login(username="me", password="pass")) + self.assertCurrentUserIs(superuser) + inactive_user = create_user("name", "pass", is_active=False) + with self.settings( + AUTHENTICATION_BACKENDS=("django.contrib.auth.backends.ModelBackend", "tests.WrongAuthBackend") + ): + message = "Could not find an appropriate authentication backend" + self.assertLoginError(self.get_target_url(target_user=inactive_user), message=message) + self.assertCurrentUserIs(superuser) + + @override_settings(CAN_LOGIN_AS=can_login_as_always_raise_permission_denied) + def test_can_login_as_permission_denied(self): + message = "You can't login as target user" + self.assertLoginError(self.get_target_url(), message=message) + + def test_as_anonymous_user(self): + self.assertLoginError(self.get_target_url()) + self.assertCurrentUserIs(None) + + def test_get_405_method_not_allowed(self): +~~ url = reverse("loginas-user-login", kwargs={"user_id": "0"}) + r = self.client.get(url) + self.assertEqual(r.status_code, 405) + + def test_missing_csrf_token_403_forbidden(self): +~~ url = reverse("loginas-user-login", kwargs={"user_id": "0"}) + r = self.client.post(url) + self.assertEqual(r.status_code, 403) + + @override_settings(LOGINAS_REDIRECT_URL="/another-redirect") + def test_loginas_redirect_url(self): + create_user("me", "pass", is_superuser=True, is_staff=True) + self.assertTrue(self.client.login(username="me", password="pass")) + + response = self.client.post( +~~ reverse("loginas-user-login", kwargs={"user_id": self.target_user.id}), data=self.get_csrf_token_payload() + ) + self.assertEqual(response.status_code, 302) + self.assertEqual(urlsplit(response["Location"])[2], "/another-redirect") + + def test_restore_original_user(self): + + original_user = create_user("me", "pass", is_superuser=True, is_staff=True) + self.assertTrue(self.client.login(username="me", password="pass")) + response = self.get_target_url() + self.assertLoginSuccess(response, self.target_user) + +~~ url = reverse("loginas-user-login", kwargs={"user_id": self.target_user.id}) + self.client.get(url) + self.assertCurrentUserIs(self.target_user) + +~~ url = reverse("loginas-logout") + self.client.get(url) + self.assertCurrentUserIs(original_user) + + @override_settings(LOGINAS_LOGOUT_REDIRECT_URL="/another-redirect") + def test_loginas_redirect_url_again(self): + create_user("me", "pass", is_superuser=True, is_staff=True) + self.assertTrue(self.client.login(username="me", password="pass")) + response = self.client.get(reverse("loginas-logout")) + self.assertEqual(response.status_code, 302) + self.assertEqual(urlsplit(response["Location"])[2], "/another-redirect") + + def test_last_login_not_updated(self): + last_login = timezone.now() - timedelta(hours=1) + self.target_user.last_login = last_login + self.target_user.save() + create_user("me", "pass", is_superuser=True, is_staff=True) + self.assertTrue(self.client.login(username="me", password="pass")) + response = self.get_target_url() + self.assertLoginSuccess(response, self.target_user) + self.assertCurrentUserIs(self.target_user) + target_user = User.objects.get(id=self.target_user.id) # refresh from db + self.assertEqual(target_user.last_login, last_login) + + @override_settings(LOGINAS_UPDATE_LAST_LOGIN=True) + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 13 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / views.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/./views.py) + +```python +# views.py +import math + +from django.contrib import messages +~~from django.urls import reverse +from django.forms import Form +from django.http import HttpResponseForbidden +from django.http import Http404 +from django.utils.functional import cached_property +from django.views.generic.edit import DeletionMixin +from django.views.generic import ListView +from django.views.generic import TemplateView +from django.views.generic.edit import FormView +from mongoengine.fields import EmbeddedDocumentField, ListField + +from mongonaut.forms import MongoModelForm +from mongonaut.mixins import MongonautFormViewMixin +from mongonaut.mixins import MongonautViewMixin +from mongonaut.utils import is_valid_object_id + + +class IndexView(MongonautViewMixin, ListView): + + template_name = "mongonaut/index.html" + queryset = [] + permission = 'has_view_permission' + + def get_queryset(self): + return self.get_mongoadmins() + + +## ... source file abbreviated to get to reverse examples ... + + + context['app_label'] = self.app_label + context['document_name'] = self.document_name + context['keys'] = ['id', ] + context['embedded_documents'] = [] + context['list_fields'] = [] + for key in sorted([x for x in self.document._fields.keys() if x != 'id']): + if isinstance(self.document._fields[key], EmbeddedDocumentField): + context['embedded_documents'].append(key) + continue + if isinstance(self.document._fields[key], ListField): + context['list_fields'].append(key) + continue + context['keys'].append(key) + return context + + +class DocumentEditFormView(MongonautViewMixin, FormView, MongonautFormViewMixin): + + template_name = "mongonaut/document_edit_form.html" + form_class = Form + success_url = '/' + permission = 'has_edit_permission' + + def get_success_url(self): + self.set_mongonaut_base() +~~ return reverse('document_detail_edit_form', kwargs={'app_label': self.app_label, 'document_name': self.document_name, 'id': self.kwargs.get('id')}) + + def get_context_data(self, **kwargs): + context = super(DocumentEditFormView, self).get_context_data(**kwargs) + self.set_mongoadmin() + context = self.set_permissions_in_context(context) + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + self.document = self.document_type.objects.get(pk=self.ident) + + context['document'] = self.document + context['app_label'] = self.app_label + context['document_name'] = self.document_name +~~ context['form_action'] = reverse('document_detail_edit_form', args=[self.kwargs.get('app_label'), + self.kwargs.get('document_name'), + self.kwargs.get('id')]) + + return context + + def get_form(self): #get_form(self, Form) leads to "get_form() missing 1 required positional argument: 'Form'" error." + self.set_mongoadmin() + context = self.set_permissions_in_context({}) + + if not context['has_edit_permission']: + return HttpResponseForbidden("You do not have permissions to edit this content.") + + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + try: + self.document = self.document_type.objects.get(pk=self.ident) + except self.document_type.DoesNotExist: + raise Http404 + self.form = Form() + + if self.request.method == 'POST': + self.form = self.process_post_form('Your changes have been saved.') + else: + self.form = MongoModelForm(model=self.document_type, instance=self.document).get_form() + return self.form + + +class DocumentAddFormView(MongonautViewMixin, FormView, MongonautFormViewMixin): + + template_name = "mongonaut/document_add_form.html" + form_class = Form + success_url = '/' + permission = 'has_add_permission' + + def get_success_url(self): + self.set_mongonaut_base() +~~ return reverse('document_detail', kwargs={'app_label': self.app_label, 'document_name': self.document_name, 'id': str(self.new_document.id)}) + + def get_context_data(self, **kwargs): + context = super(DocumentAddFormView, self).get_context_data(**kwargs) + self.set_mongoadmin() + context = self.set_permissions_in_context(context) + self.document_type = getattr(self.models, self.document_name) + + context['app_label'] = self.app_label + context['document_name'] = self.document_name +~~ context['form_action'] = reverse('document_detail_add_form', args=[self.kwargs.get('app_label'), + self.kwargs.get('document_name')]) + + return context + + def get_form(self): + self.set_mongonaut_base() + self.document_type = getattr(self.models, self.document_name) + self.form = Form() + + if self.request.method == 'POST': + self.form = self.process_post_form('Your new document has been added and saved.') + else: + self.form = MongoModelForm(model=self.document_type).get_form() + return self.form + + +class DocumentDeleteView(DeletionMixin, MongonautViewMixin, TemplateView): + + success_url = "/" + template_name = "mongonaut/document_delete.html" + + def get_success_url(self): + self.set_mongonaut_base() + messages.add_message(self.request, messages.INFO, 'Your document has been deleted.') +~~ return reverse('document_list', kwargs={'app_label': self.app_label, 'document_name': self.document_name}) + + def get_object(self): + self.set_mongoadmin() + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + self.document = self.document_type.objects.get(pk=self.ident) + return self.document + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 14 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / models.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./models.py) + +```python +# models.py +import logging +from datetime import timedelta +from urllib.parse import parse_qsl, urlparse + +from django.apps import apps +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db import models, transaction +~~from django.urls import reverse +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + +from .generators import generate_client_id, generate_client_secret +from .scopes import get_scopes_backend +from .settings import oauth2_settings +from .validators import RedirectURIValidator, WildcardSet + + +logger = logging.getLogger(__name__) + + +class AbstractApplication(models.Model): + CLIENT_CONFIDENTIAL = "confidential" + CLIENT_PUBLIC = "public" + CLIENT_TYPES = ( + (CLIENT_CONFIDENTIAL, _("Confidential")), + (CLIENT_PUBLIC, _("Public")), + ) + + GRANT_AUTHORIZATION_CODE = "authorization-code" + GRANT_IMPLICIT = "implicit" + GRANT_PASSWORD = "password" + GRANT_CLIENT_CREDENTIALS = "client-credentials" + + +## ... source file abbreviated to get to reverse examples ... + + + + grant_types = ( + AbstractApplication.GRANT_AUTHORIZATION_CODE, + AbstractApplication.GRANT_IMPLICIT, + ) + + redirect_uris = self.redirect_uris.strip().split() + allowed_schemes = set(s.lower() for s in self.get_allowed_schemes()) + + if redirect_uris: + validator = RedirectURIValidator(WildcardSet()) + for uri in redirect_uris: + validator(uri) + scheme = urlparse(uri).scheme + if scheme not in allowed_schemes: + raise ValidationError(_( + "Unauthorized redirect scheme: {scheme}" + ).format(scheme=scheme)) + + elif self.authorization_grant_type in grant_types: + raise ValidationError(_( + "redirect_uris cannot be empty with grant_type {grant_type}" + ).format(grant_type=self.authorization_grant_type)) + + def get_absolute_url(self): +~~ return reverse("oauth2_provider:detail", args=[str(self.id)]) + + def get_allowed_schemes(self): + return oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES + + def allows_grant_type(self, *grant_types): + return self.authorization_grant_type in grant_types + + def is_usable(self, request): + return True + + +class ApplicationManager(models.Manager): + def get_by_natural_key(self, client_id): + return self.get(client_id=client_id) + + +class Application(AbstractApplication): + objects = ApplicationManager() + + class Meta(AbstractApplication.Meta): + swappable = "OAUTH2_PROVIDER_APPLICATION_MODEL" + + def natural_key(self): + return (self.client_id,) + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 15 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / reverse.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./reverse.py) + +```python +# reverse.py +from django.urls import NoReverseMatch +~~from django.urls import reverse as django_reverse +from django.utils.functional import lazy + +from rest_framework.settings import api_settings +from rest_framework.utils.urls import replace_query_param + + +def preserve_builtin_query_params(url, request=None): + if request is None: + return url + + overrides = [ + api_settings.URL_FORMAT_OVERRIDE, + ] + + for param in overrides: + if param and (param in request.GET): + value = request.GET[param] + url = replace_query_param(url, param, value) + + return url + + +~~def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra): + scheme = getattr(request, 'versioning_scheme', None) + if scheme is not None: + try: + url = scheme.reverse(viewname, args, kwargs, request, format, **extra) + except NoReverseMatch: + url = _reverse(viewname, args, kwargs, request, format, **extra) + else: + url = _reverse(viewname, args, kwargs, request, format, **extra) + + return preserve_builtin_query_params(url, request) + + +def _reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra): + if format is not None: + kwargs = kwargs or {} + kwargs['format'] = format + url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) + if request: + return request.build_absolute_uri(url) + return url + + +reverse_lazy = lazy(reverse, str) + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 16 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / models.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./models.py) + +```python +# models.py +from __future__ import unicode_literals + +import logging +from time import time +import six + +from django.db import models, DatabaseError +try: +~~ from django.urls import reverse +except ImportError: + from django.core.urlresolvers import reverse + +from django.conf import settings + +from explorer import app_settings +from explorer.utils import ( + passes_blacklist, + swap_params, + extract_params, + shared_dict_update, + get_s3_bucket, + get_params_for_url, + get_valid_connection +) + +MSG_FAILED_BLACKLIST = "Query failed the SQL blacklist: %s" + + +logger = logging.getLogger(__name__) + +@six.python_2_unicode_compatible +class Query(models.Model): + title = models.CharField(max_length=255) + + +## ... source file abbreviated to get to reverse examples ... + + + return swap_params(self.sql, self.available_params()) + + def execute_query_only(self): + return QueryResult(self.final_sql(), get_valid_connection(self.connection)) + + def execute_with_logging(self, executing_user): + ql = self.log(executing_user) + ret = self.execute() + ql.duration = ret.duration + ql.save() + return ret, ql + + def execute(self): + ret = self.execute_query_only() + ret.process() + return ret + + def available_params(self): + + p = extract_params(self.sql) + if self.params: + shared_dict_update(p, self.params) + return p + + def get_absolute_url(self): +~~ return reverse("query_detail", kwargs={'query_id': self.id}) + + @property + def params_for_url(self): + return get_params_for_url(self) + + def log(self, user=None): + if user: + try: + is_anonymous = user.is_anonymous() + except TypeError: + is_anonymous = user.is_anonymous + if is_anonymous: + user = None + ql = QueryLog(sql=self.final_sql(), query_id=self.id, run_by_user=user, connection=self.connection) + ql.save() + return ql + + @property + def shared(self): + return self.id in set(sum(app_settings.EXPLORER_GET_USER_QUERY_VIEWS().values(), [])) + + @property + def snapshots(self): + if app_settings.ENABLE_TASKS: + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 17 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / base.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/base.py) + +```python +# base.py +from collections import OrderedDict +from itertools import islice + +from django.core.exceptions import ImproperlyConfigured +~~from django.urls import reverse +from django.utils.html import format_html +from django.utils.safestring import SafeData +from django.utils.text import capfirst + +from ..utils import ( + Accessor, + AttributeDict, + OrderBy, + OrderByTuple, + call_with_appropriate, + computed_values, +) + + +class Library: + + def __init__(self): + self.columns = [] + + def register(self, column): + if not hasattr(column, "from_field"): + raise ImproperlyConfigured( + "{} is not a subclass of Column".format(column.__class__.__name__) + ) + + +## ... source file abbreviated to get to reverse examples ... + + + "for linkify=True, '{}' must have a method get_absolute_url".format( + str(context) + ) + ) + return context.get_absolute_url() + + def call_reverse(self, record): + + def resolve_if_accessor(val): + return val.resolve(record) if isinstance(val, Accessor) else val + + params = self.reverse_args.copy() + + params["viewname"] = resolve_if_accessor(params["viewname"]) + if params.get("urlconf", None): + params["urlconf"] = resolve_if_accessor(params["urlconf"]) + if params.get("args", None): + params["args"] = [resolve_if_accessor(a) for a in params["args"]] + if params.get("kwargs", None): + params["kwargs"] = { + key: resolve_if_accessor(val) for key, val in params["kwargs"].items() + } + if params.get("current_app", None): + params["current_app"] = resolve_if_accessor(params["current_app"]) + +~~ return reverse(**params) + + def get_attrs(self, **kwargs): + attrs = AttributeDict(self.attrs or {}) + attrs["href"] = self.compose_url(**kwargs) + + return attrs + + def __call__(self, content, **kwargs): + attrs = self.get_attrs(**kwargs) + if attrs["href"] is None: + return content + + return format_html("{}", attrs.as_html(), content) + + +@library.register +class Column: + + creation_counter = 0 + empty_values = (None, "") + + link = None + + _explicit = False + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 18 from django-webshell +[django-webshell](https://github.com/onrik/django-webshell) is an extension +for executing arbitrary code in the +[Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/), +similar to how you can run code by using the `django manage.py shell` +command from the terminal. + +The django-webshell project is provided as open source under the +[MIT license](https://github.com/onrik/django-webshell/blob/master/LICENSE). + +[**django-webshell / webshell / tests.py**](https://github.com/onrik/django-webshell/blob/master/webshell/./tests.py) + +```python +# tests.py +from django.test import TestCase +from django.conf import settings +from django.contrib.auth import get_user_model +try: + from django.core.urlresolvers import reverse +except ImportError: +~~ from django.urls import reverse + +from webshell.models import Script + +User = get_user_model() + + +class WebshellTestCase(TestCase): + def setUp(self): + self.user = User.objects.create( + username='user', is_staff=True, is_superuser=True) + self.user.set_password('123456') + self.user.save() +~~ self.url = reverse('execute-script') + self.login_url = '%s?next=%s' % (settings.LOGIN_URL, self.url) + + def login(self): + self.assertTrue(self.client.login( + username=self.user.username, password='123456')) + + def test_wrong_method(self): + response = self.client.get(self.url) + self.assertEqual(response.status_code, 405) + + def test_login_required(self): + response = self.client.post(self.url) + self.assertRedirects(response, self.login_url, 302, 404) + + def test_superuser_required(self): + self.user.is_superuser = False + self.user.save() + self.login() + response = self.client.post(self.url) + self.assertRedirects(response, self.login_url, 302, 404) + + def test_success(self): + self.login() + + response = self.client.post(self.url, data={'source': 'print(1)'}) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.content, b'1\n') + + def test_success_exception(self): + self.login() + + response = self.client.post(self.url, data={'source': '[1][1]'}) + self.assertEqual(response.status_code, 200) + self.assertIn(b'IndexError: list index out of range', response.content) + + def test_admin(self): + self.login() + + script = Script.objects.create(name='Test') + + urls = ( +~~ reverse('admin:webshell_script_add'), +~~ reverse('admin:webshell_script_change', args=[script.id]), +~~ reverse('admin:webshell_script_changelist'), + ) + + for url in urls: + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 19 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / decorators.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./decorators.py) + +```python +# decorators.py +from functools import wraps + +from django.http import HttpResponseForbidden +from django.http import HttpResponseNotFound +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.template.loader import render_to_string +~~from django.urls import reverse +from django.utils.http import urlquote +from wiki.conf import settings +from wiki.core.exceptions import NoRootURL + + +def response_forbidden(request, article, urlpath, read_denied=False): + if request.user.is_anonymous: + qs = request.META.get("QUERY_STRING", "") + if qs: + qs = urlquote("?" + qs) + else: + qs = "" + return redirect(settings.LOGIN_URL + "?next=" + request.path + qs) + else: + return HttpResponseForbidden( + render_to_string( + "wiki/permission_denied.html", + context={ + "article": article, + "urlpath": urlpath, + "read_denied": read_denied, + }, + request=request, + ) + + +## ... source file abbreviated to get to reverse examples ... + + + can_write=False, + deleted_contents=False, + not_locked=False, + can_delete=False, + can_moderate=False, + can_create=False, +): + + def wrapper(request, *args, **kwargs): + from . import models + + path = kwargs.pop("path", None) + article_id = kwargs.pop("article_id", None) + + if path is not None: + try: + urlpath = models.URLPath.get_by_path(path, select_related=True) + except NoRootURL: + return redirect("wiki:root_create") + except models.URLPath.DoesNotExist: + try: + pathlist = list(filter(lambda x: x != "", path.split("/"),)) + path = "/".join(pathlist[:-1]) + parent = models.URLPath.get_by_path(path) + return HttpResponseRedirect( +~~ reverse("wiki:create", kwargs={"path": parent.path}) + + "?slug=%s" % pathlist[-1].lower() + ) + except models.URLPath.DoesNotExist: + return HttpResponseNotFound( + render_to_string( + "wiki/error.html", + context={"error_type": "ancestors_missing"}, + request=request, + ) + ) + if urlpath.article: + article = urlpath.article + else: +~~ return_url = reverse("wiki:get", kwargs={"path": urlpath.parent.path}) + urlpath.delete() + return HttpResponseRedirect(return_url) + + elif article_id: + articles = models.Article.objects + + article = get_object_or_404(articles, id=article_id) + try: + urlpath = models.URLPath.objects.get(articles__article=article) + except ( + models.URLPath.DoesNotExist, + models.URLPath.MultipleObjectsReturned, + ): + urlpath = None + + else: + raise TypeError("You should specify either article_id or path") + + if not deleted_contents: + if urlpath: + if urlpath.is_deleted(): # This also checks all ancestors + return redirect("wiki:deleted", path=urlpath.path) + else: + if article.current_revision and article.current_revision.deleted: + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 20 from graphite-web +[Graphite](https://github.com/graphite-project/graphite-web) +([project website](http://graphiteapp.org/), +[documentation](https://graphite.readthedocs.io/en/latest/) and +[PyPI package information](https://pypi.org/project/graphite-web/)) +is a metrics collection and visualization tool, built with both +Python and JavaScript. Metrics are collected by a Node.js application +and displayed using a [Django](/django.html) web application, +called "Graphite-Web", which is one of three core projects under +the Graphite umbrella (the other two are +[Carbon](https://github.com/graphite-project/carbon) and +[Whisper](https://github.com/graphite-project/whisper)). + +Graphite is provided as open sourced under the +[Apache License 2.0](https://github.com/graphite-project/whisper/blob/master/LICENSE). + +[**graphite-web / webapp / tests / test_metrics.py**](https://github.com/graphite-project/graphite-web/blob/master/webapp/tests/test_metrics.py) + +```python +# test_metrics.py +import copy +import os +import shutil +import time + +from mock import patch + +from django.conf import settings +try: +~~ from django.urls import reverse +except ImportError: # Django < 1.10 + from django.core.urlresolvers import reverse +from .base import TestCase + +import whisper + +from graphite.util import unpickle, msgpack, json + + +class MetricsTester(TestCase): + db = os.path.join(settings.WHISPER_DIR, 'test.wsp') + hostcpu = os.path.join(settings.WHISPER_DIR, 'hosts/hostname/cpu.wsp') + + def wipe_whisper(self): + try: + os.remove(self.db) + except OSError: + pass + + def create_whisper_hosts(self, ts=None): + worker1 = self.hostcpu.replace('hostname', 'worker1') + worker2 = self.hostcpu.replace('hostname', 'worker2') + try: + os.makedirs(worker1.replace('cpu.wsp', '')) + os.makedirs(worker2.replace('cpu.wsp', '')) + except OSError: + pass + + whisper.create(worker1, [(1, 60)]) + whisper.create(worker2, [(1, 60)]) + + ts = ts or int(time.time()) + whisper.update(worker1, 1, ts) + whisper.update(worker2, 2, ts) + + def wipe_whisper_hosts(self): + try: + os.remove(self.hostcpu.replace('hostname', 'worker1')) + os.remove(self.hostcpu.replace('hostname', 'worker2')) + shutil.rmtree(self.hostcpu.replace('hostname/cpu.wsp', '')) + except OSError: + pass + + def test_index_json(self): + self.create_whisper_hosts() + self.addCleanup(self.wipe_whisper_hosts) + +~~ url = reverse('metrics_index') + + request = {} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data[0], 'hosts.worker1.cpu') + self.assertEqual(data[1], 'hosts.worker2.cpu') + + + request = {'jsonp': 'callback'} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content.split(b"(")[1].strip(b")")) + self.assertEqual(data[0], 'hosts.worker1.cpu') + self.assertEqual(data[1], 'hosts.worker2.cpu') + + def mock_STORE_get_index(self, requestContext=None): + raise Exception('test') + + with patch('graphite.metrics.views.STORE.get_index', mock_STORE_get_index): + request = {} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 500) + data = json.loads(response.content) + self.assertEqual(data, []) + + def test_find_view(self): + ts = int(time.time()) + + self.create_whisper_hosts(ts) + self.addCleanup(self.wipe_whisper_hosts) + +~~ url = reverse('metrics_find') + + response = self.client.post(url, {}) + self.assertEqual(response.status_code, 400) + self.assertEqual(response.content, b"Bad Request: Missing required parameter 'query'") + + response = self.client.post(url, { + 'query': '*', + 'from': 'now-1h', + 'until': 'now-2h', + }) + self.assertEqual(response.status_code, 400) + self.assertRegex(response.content, b"^Bad Request: Failed to instantiate find query: Invalid interval start=[0-9]+ end=[0-9]+$") + + response = self.client.post(url, { + 'query': '*', + 'wildcards': '123a', + }) + self.assertEqual(response.status_code, 400) + self.assertRegex(response.content, b"^Bad Request: Invalid int value u?'123a' for param wildcards: invalid literal for int\\(\\) with base 10: u?'123a'$") + + response = self.client.post(url, { + 'query': '*', + 'from': 'now-1mmminute', # "mmminute" is misspelled + }) + + +## ... source file abbreviated to get to reverse examples ... + + + + request['query']='hosts.*.cpu' + content = test_find_view_basics(request) + data = json.loads(content.split(b"(")[1].strip(b")")) + self.assertEqual(len(data), 2) + + self.assertEqual(data[0]['path'], 'hosts.worker1.cpu') + self.assertEqual(data[0]['is_leaf'], True) + self.assertEqual(len(data[0]['intervals']), 1) + self.assertIn(int(data[0]['intervals'][0]['end']), [ts, ts - 1]) + + self.assertEqual(data[1]['path'], 'hosts.worker2.cpu') + self.assertEqual(data[1]['is_leaf'], True) + self.assertEqual(len(data[1]['intervals']), 1) + self.assertIn(int(data[1]['intervals'][0]['end']), [ts, ts - 1]) + + request['query']='other' + content = test_find_view_basics(request) + data = json.loads(content.split(b"(")[1].strip(b")")) + self.assertEqual(data, []) + + def test_expand_view(self): + self.create_whisper_hosts() + self.addCleanup(self.wipe_whisper_hosts) + +~~ url = reverse('metrics_expand') + + request = {'query': '*'} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data['results'], [u'hosts']) + + request = {'query': ''} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data['results'], [u'']) + + def test_get_metadata_view(self): + self.create_whisper_hosts() + self.addCleanup(self.wipe_whisper_hosts) + +~~ url = reverse('metrics_get_metadata') + + request = {'metric': 'hosts.worker1.cpu', 'key': 'a'} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data['hosts.worker1.cpu']['error'], "Unexpected error occurred in CarbonLink.get_metadata(hosts.worker1.cpu, a)") + + def test_set_metadata_view(self): + self.create_whisper_hosts() + self.addCleanup(self.wipe_whisper_hosts) + +~~ url = reverse('metrics_set_metadata') + + request = {'metric': 'hosts.worker1.cpu', 'key': 'a', 'value': 'b'} + response = self.client.get(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data['hosts.worker1.cpu']['error'], "Unexpected error occurred in CarbonLink.set_metadata(hosts.worker1.cpu, a)") + + request = {'operations': '[{ "metric": "hosts.worker1.cpu", "key": "a", "value": "b" }]'} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data['hosts.worker1.cpu']['error'], "Unexpected error occurred in bulk CarbonLink.set_metadata(hosts.worker1.cpu)") + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 21 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / views.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./views.py) + +```python +# views.py +from __future__ import unicode_literals + +import logging +import collections +import datetime +import json +import random + +import dateutil.parser +import django.contrib.messages +~~import django.urls +import django.http +import django.shortcuts +import django.views.generic.edit +import django.forms +import django.utils +from django.core.cache import cache +from django.conf import settings +from formtools.wizard.forms import ManagementForm +from formtools.wizard.storage import get_storage +from formtools.wizard.views import NamedUrlSessionWizardView +from django.utils.translation import ugettext_lazy as _ +from django.utils.safestring import mark_safe + +from axes import utils +import dateutil.parser + +import cobrand.models +import widget.models +import fiftythree.client +import forms + +logger = logging.getLogger(__name__) + +SESSION_REGISTRATION_CONFIGURATION = 'registration_configuration' + + +## ... source file abbreviated to get to reverse examples ... + + + secure=False, httponly=True) + return response + + +class StateLookupView(MinorRestrictedMixin, django.views.generic.edit.FormView): + template_name = 'registration/start.html' + form_class = forms.StateLookupForm + accepts_registration = True + + def get(self, request, *args, **kwargs): + clean_session(request.session) + clean_next_of_kin_email_session(request.session) + setup_external_source_session(request) + if self.request.GET.get('email') and self.request.GET.get('postal_code'): + email = self.request.GET['email'] + postal_code = self.request.GET['postal_code'] + form = self.form_class(data={'email': email, 'postal_code': postal_code}) + if form.is_valid(): + return self.form_valid(form) + else: + return self.form_invalid(form) + return super(StateLookupView, self).get(request, *args, **kwargs) + + def get_success_url(self): + if self.accepts_registration: +~~ return django.urls.reverse( + 'register', kwargs={'step': '1',}) + else: +~~ return django.urls.reverse('unsupported_state') + + def get_initial(self): + initial = self.initial.copy() + if 'email' in self.request.GET: + initial['email'] = self.request.GET['email'] + if 'postal_code' in self.request.GET: + initial['postal_code'] = self.request.GET['postal_code'] + return initial + + def get_context_data(self, **kwargs): + data = super(StateLookupView, self).get_context_data(**kwargs) + data['update'] = self.is_update + if data['update']: + data['page_title'] = _('Update your registration') + else: + data['page_title'] = _('Let’s Begin...') + + return data + + @property + def is_update(self): + return self.kwargs.get('update') is True + + def submit_email(self, data): + + +## ... source file abbreviated to get to reverse examples ... + + +class WaitingListFilmRedirectView(django.views.generic.RedirectView): + def get_redirect_url(self, *args, **kwargs): + return '/?reg_source=waitinglistfilm' + + +class UnsupportedStateView(django.views.generic.TemplateView): + template_name = 'registration/unsupported_state.html' + + def get(self, request, *args, **kwargs): + redirect_url = self.request.session.get(SESSION_REDIRECT_URL) + if not redirect_url: + return django.shortcuts.redirect('start') + context = self.get_context_data(**kwargs) + context['state'] = self.request.session[SESSION_STATE] + context['state_name'] = self.request.session[SESSION_STATE_NAME] + return self.render_to_response(context) + + +class StateRedirectView(django.views.generic.RedirectView): + def get_redirect_url(self, *args, **kwargs): + redirect_url = self.request.session.get(SESSION_REDIRECT_URL) + clean_session(self.request.session) + if redirect_url: + return redirect_url + else: +~~ return django.urls.reverse('start') + + +class RegistrationWizardView(MinorRestrictedMixin, NamedUrlSessionWizardView): + form_list = [forms.StateLookupForm, ] + page_titles = collections.OrderedDict() + page_fieldsets = collections.OrderedDict() + page_explanatory_texts = collections.OrderedDict() + page_count = 0 + configuration = None + api_error_key = 'api_error' + + def check_configuration(self): + if not self.configuration and (SESSION_REGISTRATION_CONFIGURATION not in self.request.session): + return False + else: + return True + + def process_registration_configuration(self): + self.configuration = self.request.session[SESSION_REGISTRATION_CONFIGURATION] + license_id_formats = None + if SESSION_LICENSE_ID_FORMATS in self.request.session: + license_id_formats = self.request.session[SESSION_LICENSE_ID_FORMATS] + + validate_organ_tissue_selection = False + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 22 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / snippets / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/snippets/models.py) + +```python +# models.py +from django.contrib.admin.utils import quote +from django.core import checks +~~from django.urls import reverse + +from wagtail.admin.checks import check_panels_in_model +from wagtail.admin.models import get_object_usage + +SNIPPET_MODELS = [] + + +def get_snippet_models(): + return SNIPPET_MODELS + + +def register_snippet(model): + if model not in SNIPPET_MODELS: + model.get_usage = get_object_usage + model.usage_url = get_snippet_usage_url + SNIPPET_MODELS.append(model) + SNIPPET_MODELS.sort(key=lambda x: x._meta.verbose_name) + + @checks.register('panels') + def modeladmin_model_check(app_configs, **kwargs): + errors = check_panels_in_model(model, 'snippets') + return errors + + return model + + +def get_snippet_usage_url(self): +~~ return reverse('wagtailsnippets:usage', args=( + self._meta.app_label, self._meta.model_name, quote(self.pk))) + + + +## ... source file continues with no further reverse examples... + +``` + diff --git a/content/pages/examples/django/django-urls-urlpattern.markdown b/content/pages/examples/django/django-urls-urlpattern.markdown new file mode 100644 index 000000000..267bba914 --- /dev/null +++ b/content/pages/examples/django/django-urls-urlpattern.markdown @@ -0,0 +1,124 @@ +title: django.urls URLPattern Example Code +category: page +slug: django-urls-urlpattern-examples +sortorder: 500011400 +toc: False +sidebartitle: django.urls URLPattern +meta: Python example code for the URLPattern class from the django.urls module of the Django project. + + +URLPattern is a class within the django.urls module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / schemas / generators.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/schemas/generators.py) + +```python +# generators.py +import re +from importlib import import_module + +from django.conf import settings +from django.contrib.admindocs.views import simplify_regex +from django.core.exceptions import PermissionDenied +from django.http import Http404 +~~from django.urls import URLPattern, URLResolver + +from rest_framework import exceptions +from rest_framework.request import clone_request +from rest_framework.settings import api_settings +from rest_framework.utils.model_meta import _get_pk + + +def get_pk_name(model): + meta = model._meta.concrete_model._meta + return _get_pk(meta).name + + +def is_api_view(callback): + from rest_framework.views import APIView + cls = getattr(callback, 'cls', None) + return (cls is not None) and issubclass(cls, APIView) + + +def endpoint_ordering(endpoint): + path, method, callback = endpoint + method_priority = { + 'GET': 0, + 'POST': 1, + 'PUT': 2, + + +## ... source file abbreviated to get to URLPattern examples ... + + +) + + +class EndpointEnumerator: + def __init__(self, patterns=None, urlconf=None): + if patterns is None: + if urlconf is None: + urlconf = settings.ROOT_URLCONF + + if isinstance(urlconf, str): + urls = import_module(urlconf) + else: + urls = urlconf + patterns = urls.urlpatterns + + self.patterns = patterns + + def get_api_endpoints(self, patterns=None, prefix=''): + if patterns is None: + patterns = self.patterns + + api_endpoints = [] + + for pattern in patterns: + path_regex = prefix + str(pattern.pattern) +~~ if isinstance(pattern, URLPattern): + path = self.get_path_from_regex(path_regex) + callback = pattern.callback + if self.should_include_endpoint(path, callback): + for method in self.get_allowed_methods(callback): + endpoint = (path, method, callback) + api_endpoints.append(endpoint) + + elif isinstance(pattern, URLResolver): + nested_endpoints = self.get_api_endpoints( + patterns=pattern.url_patterns, + prefix=path_regex + ) + api_endpoints.extend(nested_endpoints) + + return sorted(api_endpoints, key=endpoint_ordering) + + def get_path_from_regex(self, path_regex): + + path = simplify_regex(path_regex) + + return re.sub(_PATH_PARAMETER_COMPONENT_RE, r'{\g}', path) + + def should_include_endpoint(self, path, callback): + if not is_api_view(callback): + + +## ... source file continues with no further URLPattern examples... + +``` + diff --git a/content/pages/examples/django/django-urls-urlresolver.markdown b/content/pages/examples/django/django-urls-urlresolver.markdown new file mode 100644 index 000000000..cd80c8c3c --- /dev/null +++ b/content/pages/examples/django/django-urls-urlresolver.markdown @@ -0,0 +1,98 @@ +title: django.urls URLResolver Example Code +category: page +slug: django-urls-urlresolver-examples +sortorder: 500011401 +toc: False +sidebartitle: django.urls URLResolver +meta: Python example code for the URLResolver class from the django.urls module of the Django project. + + +URLResolver is a class within the django.urls module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / urlpatterns.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./urlpatterns.py) + +```python +# urlpatterns.py +from django.conf.urls import include, url +~~from django.urls import URLResolver, path, register_converter +from django.urls.resolvers import RoutePattern + +from rest_framework.settings import api_settings + + +def _get_format_path_converter(suffix_kwarg, allowed): + if allowed: + if len(allowed) == 1: + allowed_pattern = allowed[0] + else: + allowed_pattern = '(?:%s)' % '|'.join(allowed) + suffix_pattern = r"\.%s/?" % allowed_pattern + else: + suffix_pattern = r"\.[a-z0-9]+/?" + + class FormatSuffixConverter: + regex = suffix_pattern + + def to_python(self, value): + return value.strip('./') + + def to_url(self, value): + return '.' + value + '/' + + converter_name = 'drf_format_suffix' + if allowed: + converter_name += '_' + '_'.join(allowed) + + return converter_name, FormatSuffixConverter + + +def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required, suffix_route=None): + ret = [] + for urlpattern in urlpatterns: +~~ if isinstance(urlpattern, URLResolver): + regex = urlpattern.pattern.regex.pattern + namespace = urlpattern.namespace + app_name = urlpattern.app_name + kwargs = urlpattern.default_kwargs + patterns = apply_suffix_patterns(urlpattern.url_patterns, + suffix_pattern, + suffix_required, + suffix_route) + + if isinstance(urlpattern.pattern, RoutePattern): + assert path is not None + route = str(urlpattern.pattern) + new_pattern = path(route, include((patterns, app_name), namespace), kwargs) + else: + new_pattern = url(regex, include((patterns, app_name), namespace), kwargs) + + ret.append(new_pattern) + else: + regex = urlpattern.pattern.regex.pattern.rstrip('$').rstrip('/') + suffix_pattern + view = urlpattern.callback + kwargs = urlpattern.default_args + name = urlpattern.name + if not suffix_required: + ret.append(urlpattern) + + +## ... source file continues with no further URLResolver examples... + +``` + diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index b1cacf751..85fc5a7d8 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -8,7 +8,7 @@ meta: Example code for understanding how to use the Flask class from the flask.a [Flask](https://github.com/pallets/flask/blob/master/src/flask/app.py) is -a class within the flask.app module of the [Flask](/flask.html) framework +a class within the `flask.app` module of the [Flask](/flask.html) framework that implements the [WSGI application specification](/wsgi-servers.html). This class acts as a central registry for a significant amount of a Flask application's functionality, including URL rounting, diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index ff99441e6..18cc60a3b 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -8,13 +8,14 @@ meta: Example code for understanding how to use the Headers class from the flask [Headers](https://github.com/pallets/flask/blob/master/src/flask/app.py) -is class within the flask.app module of the [Flask](/flask.html) +is class within the `flask.app` module of the [Flask](/flask.html) [web framework](/web-frameworks.html) that is imported from the [datastructures](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/datastructures.py) module of the [Werkzeug](https://palletsprojects.com/p/werkzeug/) project. Headers handles the [HTTP headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) -from requests and responses for Flask web applications. +from [requests](/flask-globals-request-examples.html) and responses for +Flask web applications. ## Example 1 from flask-restx diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 86f4394f4..5521638d2 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -11,7 +11,7 @@ meta: Example code for understanding how to use the ImmutableDict class from the is a class within the flask.app module of the [Flask](/flask.html) framework that is actually imported from the Werkzeug [datastructures module](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/datastructures.py). -The ImmutableDict class wraps a +The `ImmutableDict` class wraps a [standard Python dictionary](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) so that values cannot be modified after initially being set. diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 1ceec615e..daec67197 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -11,8 +11,8 @@ A Blueprint in [Flask](/flask.html) is [a "mold" or template for creating parts of web applications](https://stackoverflow.com/questions/24420857/what-are-flask-blueprints-exactly). This [Blueprint](https://github.com/pallets/flask/blob/master/src/flask/blueprints.py) -class within the flask.blueprints module implements that functionality -for Flask web apps. +class within the `flask.blueprints` module implements that functionality +for Flask [web apps](/web-development.html). ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-cli-appgroup.markdown b/content/pages/examples/flask/flask-cli-appgroup.markdown index 194244886..36d9fe188 100644 --- a/content/pages/examples/flask/flask-cli-appgroup.markdown +++ b/content/pages/examples/flask/flask-cli-appgroup.markdown @@ -8,7 +8,7 @@ meta: Example code for understanding how to use the AppGroup class from the flas [AppGroup](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a class within the flask.cli module of the Flask project. It +is a class within the `flask.cli` module of the Flask project. It works like the [Click Group](https://click.palletsprojects.com/en/7.x/commands/) class and automatically wraps the functions using diff --git a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown index 18e556c1b..30ab2e594 100644 --- a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown +++ b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown @@ -8,7 +8,7 @@ meta: Example code for understanding how to use the DispatchingApp class from th [DispatchingApp](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a class within the flask.cli module of the [Flask](/flask.html) project. +is a class within the `flask.cli` module of the [Flask](/flask.html) project. DispatchingApp is a special application that dispatches to a Flask app if it is imported by name in a background thread. diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 0471d96df..4528f6f91 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -8,7 +8,7 @@ meta: Example code for understanding how to use the FlaskGroup class from the fl [FlaskGroup](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a class within the flask.cli module of the [Flask project](/flask.html). +is a class within the `flask.cli` module of the [Flask project](/flask.html). FlaskGroup is a subclass of [AppGroup](/flask-cli-appgroup-examples.html) that provides for loading more commands from a configured Flask app. Generally, only advanced use cases will need to use this class. diff --git a/content/pages/examples/flask/flask-cli-pass-script-info.markdown b/content/pages/examples/flask/flask-cli-pass-script-info.markdown index 5a2714c4a..d976323d0 100644 --- a/content/pages/examples/flask/flask-cli-pass-script-info.markdown +++ b/content/pages/examples/flask/flask-cli-pass-script-info.markdown @@ -9,7 +9,7 @@ meta: Python example code that shows how to use the pass_script_info callable fr [pass_script_info](https://github.com/pallets/flask/blob/master/src/flask/cli.py) is simply a decorator around the [ScriptInfo](/flask-cli-scriptinfo-examples.html) -class within this same flask.cli module. +class within this same `flask.cli` module. ## Example 1 from indico diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index 2180a5b34..d348c758f 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -8,7 +8,7 @@ meta: Example code for understanding how to use the ScriptInfo class from the fl [ScriptInfo](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a class within the flask.app module of the [Flask](/flask.html) +is a class within the `flask.cli` module of the [Flask](/flask.html) framework. It is a helper object for Flask application and not usually dealt with directly by developers, instead it is created automatically by the [FlaskGroup](/flask-cli-flaskgroup-examples.html) object. diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index 6f10a698a..c3daf2cc9 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -8,7 +8,7 @@ meta: Python example code that shows how to use the with_appcontext callable fro [with_appcontext](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a [Flask](/flask.html) decorator in the flask.cli module that +is a [Flask](/flask.html) decorator in the `flask.cli` module that wraps a callback to guarantee it will be called with a script's application context. Any callbacks registered with `app.cli` are wrapped with this function by default. diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index 53a0442f0..d662d8a8c 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -8,7 +8,7 @@ meta: Python example code that shows how to use the after_this_request callable [after_this_request](https://github.com/pallets/flask/blob/master/src/flask/ctx.py) -is a function in the flask.ctx module of the [Flask](/flask.html) +is a function in the `flask.ctx` module of the [Flask](/flask.html) [web framework](/web-frameworks.html). The function's name is strongly descriptive of what it does and it particularly useful for modifying response objects, especially when you want a function other than the diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index 3af9ae9ed..ef7e5208a 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -8,7 +8,7 @@ meta: Python example code that shows how to use the has_app_context callable fro [has_app_context](https://github.com/pallets/flask/blob/master/src/flask/ctx.py) -is a function in the flask.ctx module that is similar to +is a function in the `flask.ctx` module that is similar to [has_request_context](/flask-ctx-has-request-context-examples.html) but for the [application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/) diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index a0d150579..d88ba4585 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -8,7 +8,7 @@ meta: Python example code that shows how to use the has_request_context callable [has_request_context](https://github.com/pallets/flask/blob/master/src/flask/ctx.py) -is a function within the flask.ctx module that is useful for +is a function within the `flask.ctx` module that is useful for determining if a [request context](https://flask.palletsprojects.com/en/1.1.x/reqcontext/) is available or not. There is a similar diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 44ff8b057..694ed1551 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -8,7 +8,7 @@ meta: Python example code that shows how to use the current_app callable from th [current_app](https://github.com/pallets/flask/blob/master/src/flask/globals.py) -is function in [Flask](/flask.html)'s flask.globals module and is an +is function in [Flask](/flask.html)'s `flask.globals` module and is an instance of [LocalProxy](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/local.py) from the Werkzeug framework. `current_app` can be used to access data about the diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index cd7d9545e..b3205cf6e 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -7,7 +7,18 @@ sidebartitle: flask.globals request meta: Python example code that shows how to use the request callable from the flask.globals module of the Flask project. -request is a callable within the flask.globals module of the Flask project. +[request](https://github.com/pallets/flask/blob/master/src/flask/globals.py) +is function in [Flask](/flask.html)'s `flask.globals` module and is an +instance of +[LocalProxy](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/local.py) +from the [Werkzeug](https://werkzeug.palletsprojects.com/en/1.0.x/) library. +`request` stores data about the active HTTP request and can be used to access +data about that request. + +Note that `request` is typically imported directly from `flask` instead of +from `flask.globals`, even though it is defined within the `globals` module. +It's the same import, just less characters to type when you import it +from `flask`. ## Example 1 from Braintree Flask app diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 202b4707e..6960f013f 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -7,7 +7,18 @@ sidebartitle: flask.globals session meta: Python example code that shows how to use the session callable from the flask.globals module of the Flask project. -session is a callable within the flask.globals module of the Flask project. +[session](https://github.com/pallets/flask/blob/master/src/flask/globals.py) +is function in the [Flask](/flask.html) `flask.globals` module and is an +instance of +[LocalProxy](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/local.py) +from the [Werkzeug](https://werkzeug.palletsprojects.com/en/1.0.x/) library. +`session` stores data about the user session for the current request and it +can be used to access session data. + +Note that `session` is usually imported directly from `flask` instead of +from `flask.globals`, even though it is defined within the `globals` module. +It's the same function that is imported, but it's less characters to type +when you leave off the `.globals` part. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 299b5777f..a53c58adb 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -7,7 +7,14 @@ sidebartitle: flask.helpers flash meta: Python example code that shows how to use the flash callable from the flask.helpers module of the Flask project. -flash is a callable within the flask.helpers module of the Flask project. +[flash](https://github.com/pallets/flask/blob/master/src/flask/helpers.py) +is a function within the `flask.helpers` module of the [Flask](/flask.html) +framework. `flash` passes a string message to the *next* request. The +following request can access it in a template by using the +`get_flashed_messages` function. + +`flash` can also be imported directly from the `flask` module instead +of `flask.helpers` so you will often see that shortcut in example code. ## Example 1 from Braintree Flask app diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index f67cc796e..a58c7399b 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -149,7 +149,18 @@

    django.http HttpResponseRedirect

    django.urls + URLPattern, + URLResolver, + clear_url_caches, + get_callable, + get_resolver, + get_script_prefix, + include, path, + re_path, + register_converter, + resolve, + reverse, reverse_lazy

    django.urls.exceptions @@ -161,7 +172,135 @@

    django.template.response SimpleTemplateResponse, TemplateResponse

    -

    django.utils.timezone

    +

    django.utils + dateformat, + dateparse, + datetime_safe, + formats, + module_loading, + termcolors, + timezone, + translation, + tree +

    +

    django.utils.cache + add_never_cache_headers, + cc_delim_re, + patch_cache_control, + patch_response_headers, + patch_vary_headers +

    +

    django.utils.crypto + constant_time_compare, + get_random_string +

    +

    django.utils.datastructures + MultiValueDict +

    +

    django.utils.dateparse + parse_datetime, + parse_duration +

    +

    django.utils.dates + MONTHS +

    +

    django.utils.datetime_safe + datetime +

    +

    django.utils.decorators + method_decorator +

    +

    django.utils.deprecation + MiddlewareMixin, + RenameMethodsBase +

    +

    django.utils.duration + duration_string +

    +

    django.utils.encoding + DjangoUnicodeDecodeError, + filepath_to_uri, + force_bytes, + force_str, + force_text, + iri_to_uri, + is_protected_type, + smart_bytes, + smart_str, + smart_text, + uri_to_iri +

    +

    django.utils.formats + get_format, + localize_input, + sanitize_separators +

    +

    django.utils.functional + LazyObject, + Promise, + SimpleLazyObject, + keep_lazy, + lazy, + total_ordering, + wraps +

    +

    django.utils.html + conditional_escape, + escape, + escapejs, + format_html, + format_html_join, + mark_safe, + smart_urlquote, + strip_tags +

    +

    django.utils.http + base36_to_int, + http_date, + int_to_base36, + is_safe_url, + unquote, + url_has_allowed_host_and_scheme, + urlencode, + urlquote, + urlunquote +

    +

    django.utils.ipv6 + clean_ipv6_address +

    +

    django.utils.itercompat + is_iterable +

    +

    django.utils.module_loading + autodiscover_modules, + import_string, + module_has_submodule +

    +

    django.utils.numberformat + format +

    +

    django.utils.safestring + SafeData, + SafeText, + mark_safe +

    +

    django.utils.termcolors + colorize +

    +

    django.utils.text + Truncator, + capfirst, + format_lazy, + get_text_list, + get_valid_filename, + slugify +

    +

    django.utils.timezone + get_current_timezone, + make_aware, + now, + timedelta +

    django.utils.translation LANGUAGE_SESSION_KEY, activate, From 4c2da72e30c965f1ba0cbeb86890e5b5ec4262ae Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 9 Jul 2020 08:22:31 -0400 Subject: [PATCH 179/302] adding additional flask example descriptions --- .../flask/flask-globals-current-app.markdown | 4 ++++ .../pages/examples/flask/flask-globals-g.markdown | 3 +++ .../flask/flask-helpers-get-root-path.markdown | 5 ++++- .../flask/flask-helpers-make-response.markdown | 12 +++++++++++- .../examples/flask/flask-helpers-send-file.markdown | 12 +++++++++++- .../examples/flask/flask-helpers-url-for.markdown | 10 +++++++++- 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 694ed1551..6f7ad9d1d 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -15,6 +15,10 @@ from the Werkzeug framework. `current_app` can be used to access data about the running application, including the configuration. This is useful for both developers using the framework and ones building extensions for Flask. +You will often see `current_app` imported directly from `flask` instead +of `flask.globals`. These imports are equivalent because `flask` is simply +importing `current_app` from `flask.globals`. + ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 368ce8453..0824e343f 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -12,6 +12,9 @@ an object for storing data during the [application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/) of a running [Flask](/flask.html) web app. +`g` can also be imported directly from the `flask` module instead +of `flask.globals`, so you will often see that shortcut in example code. + ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-helpers-get-root-path.markdown b/content/pages/examples/flask/flask-helpers-get-root-path.markdown index d58e6a1fa..ca4551848 100644 --- a/content/pages/examples/flask/flask-helpers-get-root-path.markdown +++ b/content/pages/examples/flask/flask-helpers-get-root-path.markdown @@ -7,7 +7,10 @@ sidebartitle: flask.helpers get_root_path meta: Python example code that shows how to use the get_root_path callable from the flask.helpers module of the Flask project. -get_root_path is a callable within the flask.helpers module of the Flask project. +[get_root_path](https://github.com/pallets/flask/blob/master/src/flask/helpers.py) +is a function within the `flask.helpers` module of the [Flask](/flask.html) +framework. `get_root_path` returns the filesystem path to a package +or the current working directly if the path cannot be found. ## Example 1 from indico diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 8fdaf6966..bb62836a4 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -7,7 +7,17 @@ sidebartitle: flask.helpers make_response meta: Python example code that shows how to use the make_response callable from the flask.helpers module of the Flask project. -make_response is a callable within the flask.helpers module of the Flask project. +[make_response](https://github.com/pallets/flask/blob/master/src/flask/helpers.py) +is a function in the `flask.helpers` module of the [Flask](/flask.html) +[web framework](/web-framework.html). `make_response` is for adding additional +HTTP headers to a response within a view's code. Sometimes views do not return +a response object so it's unclear how to add headers to the response, which +is where `make_response` is particularly useful in solving that specific +problem. + +`make_response` can also be imported directly from the `flask` module +instead of `flask.helpers` so you will typically see that shortcut +in example code. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown index e3c57445b..e707fb77d 100644 --- a/content/pages/examples/flask/flask-helpers-send-file.markdown +++ b/content/pages/examples/flask/flask-helpers-send-file.markdown @@ -7,7 +7,17 @@ sidebartitle: flask.helpers send_file meta: Python example code that shows how to use the send_file callable from the flask.helpers module of the Flask project. -send_file is a callable within the flask.helpers module of the Flask project. +[send_file](https://github.com/pallets/flask/blob/master/src/flask/helpers.py) +is function in the [Flask](/flask.html) `flask.helpers` module. +`send_file` transfers the contents of a file to the client using the most +efficient method available and configured in the Flask settings. It +attempts to guess the correct mimetype to use but it can also be +explicitly configured. + +Note that `send_file` is usually imported directly from `flask` instead of +from `flask.helpers`, even though it is defined within the `helpers` module. +It's the same function that is imported, but it's less characters to type +when you leave off the `.helpers` part. ## Example 1 from Flask-VueJs-Template diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 1db0ddf96..fbb2b5c31 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -7,7 +7,15 @@ sidebartitle: flask.helpers url_for meta: Python example code that shows how to use the url_for callable from the flask.helpers module of the Flask project. -url_for is a callable within the flask.helpers module of the Flask project. +[url_for](https://github.com/pallets/flask/blob/master/src/flask/helpers.py) +is function in the [Flask](/flask.html) `flask.helpers` module. +`url_for` generates a URL to an endpoint using the method passed in +as an argument. + +Note that `url_for` is typically imported directly from `flask` instead of +from `flask.helpers`, even though it is defined within the `helpers` module. +It is the same function that is imported, but it's less characters to type +when you leave off the `.helpers` part. ## Example 1 from Flask AppBuilder From bf57a4ca08ded8fd354396b8583011c439ba456d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 9 Jul 2020 20:38:46 -0400 Subject: [PATCH 180/302] update flask descriptions --- .../examples/flask/flask-json-jsonencoder.markdown | 7 ++++++- .../pages/examples/flask/flask-json-jsonify.markdown | 12 +++++++++++- .../flask/flask-sessions-badsignature.markdown | 6 +++++- .../flask/flask-sessions-sessioninterface.markdown | 5 ++++- .../flask/flask-sessions-sessionmixin.markdown | 7 ++++++- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index 22f4b9a2f..96cf91c66 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -7,7 +7,12 @@ sidebartitle: flask.json JSONEncoder meta: Example code for understanding how to use the JSONEncoder class from the flask.json module of the Flask project. -JSONEncoder is a class within the flask.json module of the Flask project. +[JSONEncoder](https://github.com/pallets/flask/blob/master/src/flask/json/__init__.py) +is a class within the [Flask](/flask.html) project under the `flask.json` +module. `JSONEncoder` is the default [JSON](https://www.json.org/json-en.html) +encoder for Flask and was designed to handle more types than Python's +standard library [json](https://docs.python.org/3/library/json.html) module. + ## Example 1 from Flask-Security-Too diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 70d393c0b..7d782befc 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -7,7 +7,17 @@ sidebartitle: flask.json jsonify meta: Python example code that shows how to use the jsonify callable from the flask.json module of the Flask project. -jsonify is a callable within the flask.json module of the Flask project. +[jsonify](https://github.com/pallets/flask/blob/master/src/flask/json/__init__.py) +is a function in [Flask](/flask.html)'s `flask.json` module. `jsonify` +serializes data to +[JavaScript Object Notation (JSON)](https://www.json.org/json-en.html) format, +wraps it in a +[Response](https://blog.miguelgrinberg.com/post/customizing-the-flask-response-class) +object with the application/json mimetype. + +Note that `jsonify` is sometimes imported directly from the `flask` module +instead of from `flask.json`. It is the same function that is imported, but +there are less characters to type when you leave off the `.json` part. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index b4a85ddc3..2ddacd7f9 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -7,7 +7,11 @@ sidebartitle: flask.sessions BadSignature meta: Example code for understanding how to use the BadSignature class from the flask.sessions module of the Flask project. -BadSignature is a class within the flask.sessions module of the Flask project. +[BadSignature](https://github.com/pallets/flask/blob/master/src/flask/sessions.py) +is a class often imported into [Flask](/flask.html) applications from +the `flask.sessions` module. `BadSignature` is actually defined in the +[itsdangerous](https://github.com/pallets/itsdangerous) project and +imported into Flask sessions for applications to use. ## Example 1 from FlaskBB diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 9cae62575..9ba9138fd 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -7,7 +7,10 @@ sidebartitle: flask.sessions SessionInterface meta: Example code for understanding how to use the SessionInterface class from the flask.sessions module of the Flask project. -SessionInterface is a class within the flask.sessions module of the Flask project. +[SessionInterface](https://github.com/pallets/flask/blob/master/src/flask/sessions.py) +is a class used with [Flask](/flask.html) projects that is defined in +the `flask.sessions` module. `SessionInterface` is the basic interface +that must be implemented to replace the default session interface. ## Example 1 from tedivms-flask diff --git a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown index 69c354a97..8cc0cafcd 100644 --- a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown +++ b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown @@ -7,7 +7,12 @@ sidebartitle: flask.sessions SessionMixin meta: Example code for understanding how to use the SessionMixin class from the flask.sessions module of the Flask project. -SessionMixin is a class within the flask.sessions module of the Flask project. +[SessionMixin](https://github.com/pallets/flask/blob/master/src/flask/sessions.py) +is a class used with [Flask](/flask.html) projects that is defined in +the `flask.sessions` module. `SessionMixin` expands a standard +[Python dictionary](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) +with [session](https://flask.palletsprojects.com/en/1.1.x/quickstart/#sessions) +attributes. ## Example 1 from Flask-SocketIO From 20af5bfbdd3d30e9647152244f914674cbb44344 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 9 Jul 2020 20:50:21 -0400 Subject: [PATCH 181/302] adding more django code examples --- .../django-shortcuts-get-list-or-404.markdown | 125 ++ ...jango-shortcuts-get-object-or-404.markdown | 1530 ++++++++++++++ .../django/django-shortcuts-redirect.markdown | 1115 ++++++++++ .../django/django-shortcuts-render.markdown | 1883 +++++++++++++++++ .../django-shortcuts-resolve-url.markdown | 135 ++ theme/templates/code-examples/django.html | 16 +- 6 files changed, 4799 insertions(+), 5 deletions(-) create mode 100644 content/pages/examples/django/django-shortcuts-get-list-or-404.markdown create mode 100644 content/pages/examples/django/django-shortcuts-get-object-or-404.markdown create mode 100644 content/pages/examples/django/django-shortcuts-redirect.markdown create mode 100644 content/pages/examples/django/django-shortcuts-render.markdown create mode 100644 content/pages/examples/django/django-shortcuts-resolve-url.markdown diff --git a/content/pages/examples/django/django-shortcuts-get-list-or-404.markdown b/content/pages/examples/django/django-shortcuts-get-list-or-404.markdown new file mode 100644 index 000000000..70a07e08a --- /dev/null +++ b/content/pages/examples/django/django-shortcuts-get-list-or-404.markdown @@ -0,0 +1,125 @@ +title: django.shortcuts get_list_or_404 Example Code +category: page +slug: django-shortcuts-get-list-or-404-examples +sortorder: 500011345 +toc: False +sidebartitle: django.shortcuts get_list_or_404 +meta: Python example code for the get_list_or_404 callable from the django.shortcuts module of the Django project. + + +get_list_or_404 is a callable within the django.shortcuts module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / placeholderadmin.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/placeholderadmin.py) + +```python +# placeholderadmin.py +import uuid +import warnings + +from django.conf.urls import url +from django.contrib.admin.helpers import AdminForm +from django.contrib.admin.utils import get_deleted_objects +from django.core.exceptions import PermissionDenied +from django.db import router, transaction +from django.http import ( + HttpResponse, + HttpResponseBadRequest, + HttpResponseForbidden, + HttpResponseNotFound, + HttpResponseRedirect, +) +~~from django.shortcuts import get_list_or_404, get_object_or_404, render +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_text +from django.utils import translation +from django.utils.translation import ugettext as _ +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.decorators.http import require_POST + +from six.moves.urllib.parse import parse_qsl, urlparse + +from six import get_unbound_function, get_method_function + +from cms import operations +from cms.admin.forms import PluginAddValidationForm +from cms.constants import SLUG_REGEXP +from cms.exceptions import PluginLimitReached +from cms.models.placeholdermodel import Placeholder +from cms.models.placeholderpluginmodel import PlaceholderReference +from cms.models.pluginmodel import CMSPlugin +from cms.plugin_pool import plugin_pool +from cms.signals import pre_placeholder_operation, post_placeholder_operation +from cms.toolbar.utils import get_plugin_tree_as_json +from cms.utils import copy_plugins, get_current_site +from cms.utils.compat import DJANGO_2_0 + + +## ... source file abbreviated to get to get_list_or_404 examples ... + + + operation=operation, + request=request, + language=self._get_operation_language(request), + token=token, + origin=self._get_operation_origin(request), + **kwargs + ) + return token + + def _send_post_placeholder_operation(self, request, operation, token, **kwargs): + if not request.GET.get('cms_path'): + return + + post_placeholder_operation.send( + sender=self.__class__, + operation=operation, + request=request, + language=self._get_operation_language(request), + token=token, + origin=self._get_operation_origin(request), + **kwargs + ) + + def _get_plugin_from_id(self, plugin_id): + queryset = CMSPlugin.objects.values_list('plugin_type', flat=True) +~~ plugin_type = get_list_or_404(queryset, pk=plugin_id)[0] + plugin_class = plugin_pool.get_plugin(plugin_type) + real_queryset = plugin_class.get_render_queryset().select_related('parent', 'placeholder') + return get_object_or_404(real_queryset, pk=plugin_id) + + def get_urls(self): + info = "%s_%s" % (self.model._meta.app_label, self.model._meta.model_name) + pat = lambda regex, fn: url(regex, self.admin_site.admin_view(fn), name='%s_%s' % (info, fn.__name__)) + url_patterns = [ + pat(r'copy-plugins/$', self.copy_plugins), + pat(r'add-plugin/$', self.add_plugin), + pat(r'edit-plugin/(%s)/$' % SLUG_REGEXP, self.edit_plugin), + pat(r'delete-plugin/(%s)/$' % SLUG_REGEXP, self.delete_plugin), + pat(r'clear-placeholder/(%s)/$' % SLUG_REGEXP, self.clear_placeholder), + pat(r'move-plugin/$', self.move_plugin), + ] + return url_patterns + super(PlaceholderAdminMixin, self).get_urls() + + def has_add_plugin_permission(self, request, placeholder, plugin_type): + return placeholder.has_add_plugin_permission(request.user, plugin_type) + + def has_change_plugin_permission(self, request, plugin): + placeholder = plugin.placeholder + return placeholder.has_change_plugin_permission(request.user, plugin) + + + +## ... source file continues with no further get_list_or_404 examples... + +``` + diff --git a/content/pages/examples/django/django-shortcuts-get-object-or-404.markdown b/content/pages/examples/django/django-shortcuts-get-object-or-404.markdown new file mode 100644 index 000000000..529114790 --- /dev/null +++ b/content/pages/examples/django/django-shortcuts-get-object-or-404.markdown @@ -0,0 +1,1530 @@ +title: django.shortcuts get_object_or_404 Example Code +category: page +slug: django-shortcuts-get-object-or-404-examples +sortorder: 500011346 +toc: False +sidebartitle: django.shortcuts get_object_or_404 +meta: Python example code for the get_object_or_404 callable from the django.shortcuts module of the Django project. + + +get_object_or_404 is a callable within the django.shortcuts module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / proceedings / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/proceedings/views.py) + +```python +# views.py +from django.http import JsonResponse +~~from django.shortcuts import render, get_object_or_404 +from django.views.decorators.http import require_POST + +from conferences.utilities import validate_chair_access +from proceedings.forms import UpdateVolumeForm +from proceedings.models import CameraReady + + +@require_POST +def update_volume(request, camera_id): +~~ camera = get_object_or_404(CameraReady, id=camera_id) + validate_chair_access(request.user, camera.submission.conference) + form = UpdateVolumeForm(request.POST, instance=camera) + if form.is_valid(): + form.save() + return JsonResponse(status=200, data={}) + return JsonResponse(status=500, data={}) + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / placeholderadmin.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/placeholderadmin.py) + +```python +# placeholderadmin.py +import uuid +import warnings + +from django.conf.urls import url +from django.contrib.admin.helpers import AdminForm +from django.contrib.admin.utils import get_deleted_objects +from django.core.exceptions import PermissionDenied +from django.db import router, transaction +from django.http import ( + HttpResponse, + HttpResponseBadRequest, + HttpResponseForbidden, + HttpResponseNotFound, + HttpResponseRedirect, +) +~~from django.shortcuts import get_list_or_404, get_object_or_404, render +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_text +from django.utils import translation +from django.utils.translation import ugettext as _ +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.decorators.http import require_POST + +from six.moves.urllib.parse import parse_qsl, urlparse + +from six import get_unbound_function, get_method_function + +from cms import operations +from cms.admin.forms import PluginAddValidationForm +from cms.constants import SLUG_REGEXP +from cms.exceptions import PluginLimitReached +from cms.models.placeholdermodel import Placeholder +from cms.models.placeholderpluginmodel import PlaceholderReference +from cms.models.pluginmodel import CMSPlugin +from cms.plugin_pool import plugin_pool +from cms.signals import pre_placeholder_operation, post_placeholder_operation +from cms.toolbar.utils import get_plugin_tree_as_json +from cms.utils import copy_plugins, get_current_site +from cms.utils.compat import DJANGO_2_0 + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + token=token, + origin=self._get_operation_origin(request), + **kwargs + ) + return token + + def _send_post_placeholder_operation(self, request, operation, token, **kwargs): + if not request.GET.get('cms_path'): + return + + post_placeholder_operation.send( + sender=self.__class__, + operation=operation, + request=request, + language=self._get_operation_language(request), + token=token, + origin=self._get_operation_origin(request), + **kwargs + ) + + def _get_plugin_from_id(self, plugin_id): + queryset = CMSPlugin.objects.values_list('plugin_type', flat=True) + plugin_type = get_list_or_404(queryset, pk=plugin_id)[0] + plugin_class = plugin_pool.get_plugin(plugin_type) + real_queryset = plugin_class.get_render_queryset().select_related('parent', 'placeholder') +~~ return get_object_or_404(real_queryset, pk=plugin_id) + + def get_urls(self): + info = "%s_%s" % (self.model._meta.app_label, self.model._meta.model_name) + pat = lambda regex, fn: url(regex, self.admin_site.admin_view(fn), name='%s_%s' % (info, fn.__name__)) + url_patterns = [ + pat(r'copy-plugins/$', self.copy_plugins), + pat(r'add-plugin/$', self.add_plugin), + pat(r'edit-plugin/(%s)/$' % SLUG_REGEXP, self.edit_plugin), + pat(r'delete-plugin/(%s)/$' % SLUG_REGEXP, self.delete_plugin), + pat(r'clear-placeholder/(%s)/$' % SLUG_REGEXP, self.clear_placeholder), + pat(r'move-plugin/$', self.move_plugin), + ] + return url_patterns + super(PlaceholderAdminMixin, self).get_urls() + + def has_add_plugin_permission(self, request, placeholder, plugin_type): + return placeholder.has_add_plugin_permission(request.user, plugin_type) + + def has_change_plugin_permission(self, request, plugin): + placeholder = plugin.placeholder + return placeholder.has_change_plugin_permission(request.user, plugin) + + def has_delete_plugin_permission(self, request, plugin): + placeholder = plugin.placeholder + return placeholder.has_delete_plugin_permission(request.user, plugin) + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + + plugin = getattr(plugin_instance, 'saved_object', None) + + if plugin: + plugin.placeholder.mark_as_dirty(plugin.language, clear_cache=False) + + if plugin_instance._operation_token: + tree_order = placeholder.get_plugin_tree_order(plugin.parent_id) + self._send_post_placeholder_operation( + request, + operation=operations.ADD_PLUGIN, + token=plugin_instance._operation_token, + plugin=plugin, + placeholder=plugin.placeholder, + tree_order=tree_order, + ) + return response + + @method_decorator(require_POST) + @xframe_options_sameorigin + @transaction.atomic + def copy_plugins(self, request): + source_placeholder_id = request.POST['source_placeholder_id'] + target_language = request.POST['target_language'] + target_placeholder_id = request.POST['target_placeholder_id'] +~~ source_placeholder = get_object_or_404(Placeholder, pk=source_placeholder_id) +~~ target_placeholder = get_object_or_404(Placeholder, pk=target_placeholder_id) + + if not target_language or not target_language in get_language_list(): + return HttpResponseBadRequest(force_text(_("Language must be set to a supported language!"))) + + copy_to_clipboard = target_placeholder.pk == request.toolbar.clipboard.pk + source_plugin_id = request.POST.get('source_plugin_id', None) + + if copy_to_clipboard and source_plugin_id: + new_plugin = self._copy_plugin_to_clipboard( + request, + source_placeholder, + target_placeholder, + ) + new_plugins = [new_plugin] + elif copy_to_clipboard: + new_plugin = self._copy_placeholder_to_clipboard( + request, + source_placeholder, + target_placeholder, + ) + new_plugins = [new_plugin] + else: + new_plugins = self._add_plugins_from_placeholder( + request, + source_placeholder, + target_placeholder, + ) + data = get_plugin_tree_as_json(request, new_plugins) + return HttpResponse(data, content_type='application/json') + + def _copy_plugin_to_clipboard(self, request, source_placeholder, target_placeholder): + source_language = request.POST['source_language'] + source_plugin_id = request.POST.get('source_plugin_id') + target_language = request.POST['target_language'] + +~~ source_plugin = get_object_or_404( + CMSPlugin, + pk=source_plugin_id, + language=source_language, + ) + + old_plugins = ( + CMSPlugin + .get_tree(parent=source_plugin) + .filter(placeholder=source_placeholder) + .order_by('path') + ) + + if not self.has_copy_plugins_permission(request, old_plugins): + message = _('You do not have permission to copy these plugins.') + raise PermissionDenied(force_text(message)) + + target_placeholder.clear() + + plugin_pairs = copy_plugins.copy_plugins_to( + old_plugins, + to_placeholder=target_placeholder, + to_language=target_language, + ) + return plugin_pairs[0][0] + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + + if placeholder != source_placeholder: + try: + template = self.get_placeholder_template(request, placeholder) + has_reached_plugin_limit(placeholder, plugin.plugin_type, + target_language, template=template) + except PluginLimitReached as er: + return HttpResponseBadRequest(er) + + exclude_from_order_check = ['__COPY__', str(plugin.pk)] + ordered_plugin_ids = [int(pk) for pk in order if pk not in exclude_from_order_check] + plugins_in_tree_count = ( + placeholder + .get_plugins(target_language) + .filter(parent=parent_id, pk__in=ordered_plugin_ids) + .count() + ) + + if len(ordered_plugin_ids) != plugins_in_tree_count: + message = _('order parameter references plugins in different trees') + return HttpResponseBadRequest(force_text(message)) + + move_a_plugin = not move_a_copy and not move_to_clipboard + + if parent_id and plugin.parent_id != parent_id: +~~ target_parent = get_object_or_404(CMSPlugin, pk=parent_id) + + if move_a_plugin and target_parent.placeholder_id != placeholder.pk: + return HttpResponseBadRequest(force_text( + _('parent must be in the same placeholder'))) + + if move_a_plugin and target_parent.language != target_language: + return HttpResponseBadRequest(force_text( + _('parent must be in the same language as ' + 'plugin_language'))) + elif parent_id: + target_parent = plugin.parent + else: + target_parent = None + + new_plugin = None + fetch_tree = False + + if move_a_copy and plugin.plugin_type == "PlaceholderPlugin": + new_plugins = self._paste_placeholder( + request, + plugin=plugin, + target_language=target_language, + target_placeholder=placeholder, + tree_order=order, + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + return HttpResponseRedirect(admin_reverse('index', current_app=self.admin_site.name)) + + plugin_name = force_text(plugin.get_plugin_class().name) + + if perms_needed or protected: + title = _("Cannot delete %(name)s") % {"name": plugin_name} + else: + title = _("Are you sure?") + context = { + "title": title, + "object_name": plugin_name, + "object": plugin, + "deleted_objects": deleted_objects, + "perms_lacking": perms_needed, + "protected": protected, + "opts": opts, + "app_label": opts.app_label, + } + request.current_app = self.admin_site.name + return TemplateResponse( + request, "admin/cms/page/plugin/delete_confirmation.html", context + ) + + @xframe_options_sameorigin + def clear_placeholder(self, request, placeholder_id): +~~ placeholder = get_object_or_404(Placeholder, pk=placeholder_id) + language = request.GET.get('language') + + if placeholder.pk == request.toolbar.clipboard.pk: + placeholder.clear(language) + return HttpResponseRedirect(admin_reverse('index', current_app=self.admin_site.name)) + + if not self.has_clear_placeholder_permission(request, placeholder, language): + return HttpResponseForbidden(force_text(_("You do not have permission to clear this placeholder"))) + + opts = Placeholder._meta + using = router.db_for_write(Placeholder) + plugins = placeholder.get_plugins_list(language) + + if DJANGO_2_0: + get_deleted_objects_additional_kwargs = { + 'opts': opts, + 'using': using, + 'user': request.user, + } + else: + get_deleted_objects_additional_kwargs = {'request': request} + deleted_objects, __, perms_needed, protected = get_deleted_objects( + plugins, admin_site=self.admin_site, + **get_deleted_objects_additional_kwargs + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 3 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / views.py**](https://github.com/divio/django-filer/blob/develop/filer/./views.py) + +```python +# views.py +from __future__ import absolute_import, unicode_literals + +from django.http import Http404 +~~from django.shortcuts import get_object_or_404, redirect + +from .models import File + + +def canonical(request, uploaded_at, file_id): +~~ filer_file = get_object_or_404(File, pk=file_id, is_public=True) + if (not filer_file.file or int(uploaded_at) != filer_file.canonical_time): + raise Http404('No %s matches the given query.' % File._meta.object_name) + return redirect(filer_file.url) + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 4 from django-flexible-subscriptions +[django-flexible-subscriptions](https://github.com/studybuffalo/django-flexible-subscriptions) +([project documentation](https://django-flexible-subscriptions.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-flexible-subscriptions/)) +provides boilerplate code for adding subscription and recurrent billing +to [Django](/django.html) web applications. Various payment providers +can be added on the back end to run the transactions. + +The django-flexible-subscriptions project is open sourced under the +[GNU General Public License v3.0](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/LICENSE). + +[**django-flexible-subscriptions / subscriptions / views.py**](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/subscriptions/./views.py) + +```python +# views.py +from copy import copy + +from django.contrib import messages +from django.contrib.auth import get_user_model +from django.contrib.auth.mixins import ( + LoginRequiredMixin, PermissionRequiredMixin +) +from django.contrib.messages.views import SuccessMessageMixin +from django.forms import HiddenInput +from django.forms.models import inlineformset_factory +from django.http import HttpResponseRedirect +from django.http.response import HttpResponseNotAllowed, HttpResponseNotFound +~~from django.shortcuts import get_object_or_404 +from django.template.response import TemplateResponse +from django.urls import reverse_lazy +from django.utils import timezone + +from subscriptions import models, forms, abstract + + +class DashboardView(PermissionRequiredMixin, abstract.TemplateView): + permission_required = 'subscriptions.subscriptions' + raise_exception = True + template_name = 'subscriptions/dashboard.html' + + +class TagListView(PermissionRequiredMixin, abstract.ListView): + model = models.PlanTag + permission_required = 'subscriptions.subscriptions' + raise_exception = True + context_object_name = 'tags' + template_name = 'subscriptions/tag_list.html' + + +class TagCreateView( + PermissionRequiredMixin, SuccessMessageMixin, abstract.CreateView +): + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + +class PlanListDetailListView(PermissionRequiredMixin, abstract.DetailView): + model = models.PlanList + pk_url_kwarg = 'plan_list_id' + permission_required = 'subscriptions.subscriptions' + raise_exception = True + context_object_name = 'plan_list' + template_name = 'subscriptions/plan_list_detail_list.html' + + +class PlanListDetailCreateView( + PermissionRequiredMixin, SuccessMessageMixin, abstract.CreateView +): + model = models.PlanListDetail + fields = [ + 'plan', 'plan_list', 'html_content', 'subscribe_button_text', 'order' + ] + permission_required = 'subscriptions.subscriptions' + raise_exception = True + success_message = 'Subscription plan successfully added to plan list' + template_name = 'subscriptions/plan_list_detail_create.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + +~~ context['plan_list'] = get_object_or_404( + models.PlanList, id=self.kwargs.get('plan_list_id', None) + ) + + return context + + def get_success_url(self): + return reverse_lazy( + 'dfs_plan_list_detail_list', + kwargs={'plan_list_id': self.kwargs['plan_list_id']}, + ) + + +class PlanListDetailUpdateView( + PermissionRequiredMixin, SuccessMessageMixin, abstract.UpdateView +): + model = models.PlanListDetail + permission_required = 'subscriptions.subscriptions' + raise_exception = True + fields = [ + 'plan', 'plan_list', 'html_content', 'subscribe_button_text', 'order' + ] + success_message = 'Plan list details successfully updated' + pk_url_kwarg = 'plan_list_detail_id' + template_name = 'subscriptions/plan_list_detail_update.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + +~~ context['plan_list'] = get_object_or_404( + models.PlanList, id=self.kwargs.get('plan_list_id', None) + ) + + return context + + def get_success_url(self): + return reverse_lazy( + 'dfs_plan_list_detail_list', + kwargs={'plan_list_id': self.kwargs['plan_list_id']}, + ) + + +class PlanListDetailDeleteView(PermissionRequiredMixin, abstract.DeleteView): + model = models.PlanListDetail + permission_required = 'subscriptions.subscriptions' + raise_exception = True + context_object_name = 'plan_list_detail' + pk_url_kwarg = 'plan_list_detail_id' + success_message = 'Subscription plan successfully removed from plan list' + template_name = 'subscriptions/plan_list_detail_delete.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + +~~ context['plan_list'] = get_object_or_404( + models.PlanList, id=self.kwargs.get('plan_list_id', None) + ) + + return context + + def delete(self, request, *args, **kwargs): + messages.success(self.request, self.success_message) + return super(PlanListDetailDeleteView, self).delete( + request, *args, **kwargs + ) + + def get_success_url(self): + return reverse_lazy( + 'dfs_plan_list_detail_list', + kwargs={'plan_list_id': self.kwargs['plan_list_id']}, + ) + + +class SubscribeList(abstract.TemplateView): + context_object_name = 'plan_list' + template_name = 'subscriptions/subscribe_list.html' + + def get(self, request, *args, **kwargs): + plan_list = models.PlanList.objects.filter(active=True).first() + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + self.get_context_data(plan_list=plan_list, details=details) + ) + + return response + + return HttpResponseNotFound('No subscription plans are available') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context['plan_list'] = kwargs['plan_list'] + context['details'] = kwargs['details'] + + return context + + +class SubscribeView(LoginRequiredMixin, abstract.TemplateView): + confirmation = False + payment_form = forms.PaymentForm + subscription_plan = None + success_url = 'dfs_subscribe_thank_you' + template_preview = 'subscriptions/subscribe_preview.html' + template_confirmation = 'subscriptions/subscribe_confirmation.html' + + def get_object(self): +~~ return get_object_or_404( + models.SubscriptionPlan, id=self.request.POST.get('plan_id', None) + ) + + def get_context_data(self, **kwargs): + context = super(SubscribeView, self).get_context_data(**kwargs) + + context['confirmation'] = self.confirmation + + context['plan'] = self.subscription_plan + + return context + + def get_template_names(self): + conf_templates = [self.template_confirmation] + prev_templates = [self.template_preview] + + return conf_templates if self.confirmation else prev_templates + + def get_success_url(self, **kwargs): + return reverse_lazy(self.success_url, kwargs=kwargs) + + def get(self, request, *args, **kwargs): + return HttpResponseNotAllowed(['POST']) + + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + try: + return models.SubscriptionTransaction.objects.get( + id=self.kwargs['transaction_id'], + user=self.request.user, + ) + except models.SubscriptionTransaction.DoesNotExist: + return None + + def get_context_data(self, **kwargs): + context = super(SubscribeThankYouView, self).get_context_data(**kwargs) + + context[self.context_object_name] = self.get_object() + + return context + + +class SubscribeCancelView(LoginRequiredMixin, abstract.DetailView): + model = models.UserSubscription + context_object_name = 'subscription' + pk_url_kwarg = 'subscription_id' + success_message = 'Subscription successfully cancelled' + success_url = 'dfs_subscribe_user_list' + template_name = 'subscriptions/subscribe_cancel.html' + + def get_object(self, queryset=None): +~~ return get_object_or_404( + self.model, + user=self.request.user, + id=self.kwargs['subscription_id'], + ) + + def get_success_url(self): + return reverse_lazy(self.success_url) + + def post(self, request, *args, **kwargs): # pylint: disable=unused-argument + subscription = self.get_object() + subscription.date_billing_end = copy(subscription.date_billing_next) + subscription.date_billing_next = None + subscription.cancelled = True + subscription.save() + + messages.success(self.request, self.success_message) + + return HttpResponseRedirect(self.get_success_url()) + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 5 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / admin.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./admin.py) + +```python +# admin.py +from collections import OrderedDict + +from django import forms +from django.conf import settings +from django.contrib import admin, messages +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth import get_user_model +~~from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse, path +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext +from guardian.forms import GroupObjectPermissionsForm, UserObjectPermissionsForm +from django.contrib.auth.models import Group +from guardian.shortcuts import (get_group_perms, get_groups_with_perms, get_perms_for_model, get_user_perms, + get_users_with_perms) + + +class AdminUserObjectPermissionsForm(UserObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class AdminGroupObjectPermissionsForm(GroupObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class GuardedModelAdminMixin: + change_form_template = \ + 'admin/guardian/model/change_form.html' + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + ] + urls = myurls + urls + return urls + + def get_obj_perms_base_context(self, request, obj): + context = self.admin_site.each_context(request) + context.update({ + 'adminform': {'model_admin': self}, + 'media': self.media, + 'object': obj, + 'app_label': self.model._meta.app_label, + 'opts': self.model._meta, + 'original': str(obj), + 'has_change_permission': self.has_change_permission(request, obj), + 'model_perms': get_perms_for_model(obj), + 'title': _("Object permissions"), + }) + return context + + def obj_perms_manage_view(self, request, object_pk): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + from django.contrib.admin.utils import unquote +~~ obj = get_object_or_404(self.get_queryset( + request), pk=unquote(object_pk)) + users_perms = OrderedDict( + sorted( + get_users_with_perms(obj, attach_perms=True, + with_group_users=False).items(), + key=lambda user: getattr( + user[0], get_user_model().USERNAME_FIELD) + ) + ) + + groups_perms = OrderedDict( + sorted( + get_groups_with_perms(obj, attach_perms=True).items(), + key=lambda group: group[0].name + ) + ) + + if request.method == 'POST' and 'submit_manage_user' in request.POST: + user_form = self.get_obj_perms_user_select_form( + request)(request.POST) + group_form = self.get_obj_perms_group_select_form( + request)(request.POST) + info = ( + self.admin_site.name, + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + return redirect(url) + else: + user_form = self.get_obj_perms_user_select_form(request)() + group_form = self.get_obj_perms_group_select_form(request)() + + context = self.get_obj_perms_base_context(request, obj) + context['users_perms'] = users_perms + context['groups_perms'] = groups_perms + context['user_form'] = user_form + context['group_form'] = group_form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_template(), context) + + def get_obj_perms_manage_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage.html' + return self.obj_perms_manage_template + + def obj_perms_manage_user_view(self, request, object_pk, user_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + +~~ user = get_object_or_404(get_user_model(), pk=user_id) +~~ obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_user_form(request) + form = form_class(user, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user.pk] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['user_obj'] = user + context['user_perms'] = get_user_perms(user, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_user_template(), context) + + def get_obj_perms_manage_user_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + return self.obj_perms_manage_user_template + + def get_obj_perms_user_select_form(self, request): + return UserManage + + def get_obj_perms_group_select_form(self, request): + return GroupManage + + def get_obj_perms_manage_user_form(self, request): + return AdminUserObjectPermissionsForm + + def obj_perms_manage_group_view(self, request, object_pk, group_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + +~~ group = get_object_or_404(Group, id=group_id) +~~ obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_group_form(request) + form = form_class(group, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group.id] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['group_obj'] = group + context['group_perms'] = get_group_perms(group, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 6 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / generics.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./generics.py) + +```python +# generics.py +from django.core.exceptions import ValidationError +from django.db.models.query import QuerySet +from django.http import Http404 +~~from django.shortcuts import get_object_or_404 as _get_object_or_404 + +from rest_framework import mixins, views +from rest_framework.settings import api_settings + + +~~def get_object_or_404(queryset, *filter_args, **filter_kwargs): + try: + return _get_object_or_404(queryset, *filter_args, **filter_kwargs) + except (TypeError, ValueError, ValidationError): + raise Http404 + + +class GenericAPIView(views.APIView): + queryset = None + serializer_class = None + + lookup_field = 'pk' + lookup_url_kwarg = None + + filter_backends = api_settings.DEFAULT_FILTER_BACKENDS + + pagination_class = api_settings.DEFAULT_PAGINATION_CLASS + + def get_queryset(self): + assert self.queryset is not None, ( + "'%s' should either include a `queryset` attribute, " + "or override the `get_queryset()` method." + % self.__class__.__name__ + ) + + queryset = self.queryset + if isinstance(queryset, QuerySet): + queryset = queryset.all() + return queryset + + def get_object(self): + queryset = self.filter_queryset(self.get_queryset()) + + lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field + + assert lookup_url_kwarg in self.kwargs, ( + 'Expected view %s to be called with a URL keyword argument ' + 'named "%s". Fix your URL conf, or set the `.lookup_field` ' + 'attribute on the view correctly.' % + (self.__class__.__name__, lookup_url_kwarg) + ) + + filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} +~~ obj = get_object_or_404(queryset, **filter_kwargs) + + self.check_object_permissions(self.request, obj) + + return obj + + def get_serializer(self, *args, **kwargs): + serializer_class = self.get_serializer_class() + kwargs.setdefault('context', self.get_serializer_context()) + return serializer_class(*args, **kwargs) + + def get_serializer_class(self): + assert self.serializer_class is not None, ( + "'%s' should either include a `serializer_class` attribute, " + "or override the `get_serializer_class()` method." + % self.__class__.__name__ + ) + + return self.serializer_class + + def get_serializer_context(self): + return { + 'request': self.request, + 'format': self.format_kwarg, + 'view': self + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 7 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / views.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./views.py) + +```python +# views.py +import re +import six +from collections import Counter + +try: + from django.urls import reverse_lazy +except ImportError: + from django.core.urlresolvers import reverse_lazy + +import django +from django.db import DatabaseError +from django.db.models import Count +from django.forms.models import model_to_dict +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect, Http404 +~~from django.shortcuts import get_object_or_404, render +from django.views.decorators.http import require_POST +from django.utils.decorators import method_decorator +from django.views.generic import ListView +from django.views.generic.base import View +from django.views.generic.edit import CreateView, DeleteView +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.core.exceptions import ImproperlyConfigured +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.views import LoginView + +from explorer import app_settings +from explorer.connections import connections +from explorer.exporters import get_exporter_class +from explorer.forms import QueryForm +from explorer.models import Query, QueryLog, MSG_FAILED_BLACKLIST +from explorer.tasks import execute_query +from explorer.utils import ( + url_get_rows, + url_get_query_id, + url_get_log_id, + url_get_params, + safe_login_prompt, + fmt_sql, + allowed_query_pks, + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + +def _export(request, query, download=True): + format = request.GET.get('format', 'csv') + exporter_class = get_exporter_class(format) + query.params = url_get_params(request) + delim = request.GET.get('delim') + exporter = exporter_class(query) + try: + output = exporter.get_output(delim=delim) + except DatabaseError as e: + msg = "Error executing query %s: %s" % (query.title, e) + return HttpResponse(msg, status=500) + response = HttpResponse(output, content_type=exporter.content_type) + if download: + response['Content-Disposition'] = 'attachment; filename="%s"' % ( + exporter.get_filename() + ) + return response + + +class DownloadQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def get(self, request, query_id, *args, **kwargs): +~~ query = get_object_or_404(Query, pk=query_id) + return _export(request, query) + + +class DownloadFromSqlView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def post(self, request, *args, **kwargs): + sql = request.POST.get('sql') + connection = request.POST.get('connection') + query = Query(sql=sql, connection=connection, title='') + ql = query.log(request.user) + query.title = 'Playground - %s' % ql.id + return _export(request, query) + + +class StreamQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def get(self, request, query_id, *args, **kwargs): +~~ query = get_object_or_404(Query, pk=query_id) + return _export(request, query, download=False) + + +class EmailCsvQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def post(self, request, query_id, *args, **kwargs): + if request.is_ajax(): + email = request.POST.get('email', None) + if email: + execute_query.delay(query_id, email) + return JsonResponse({'message': 'message was sent successfully'}) + return JsonResponse({}, status=403) + + +class SchemaView(PermissionRequiredMixin, View): + permission_required = 'change_permission' + + @method_decorator(xframe_options_sameorigin) + def dispatch(self, *args, **kwargs): + return super(SchemaView, self).dispatch(*args, **kwargs) + + def get(self, request, *args, **kwargs): + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + +class CreateQueryView(PermissionRequiredMixin, ExplorerContextMixin, CreateView): + + permission_required = 'change_permission' + + def form_valid(self, form): + form.instance.created_by_user = self.request.user + return super(CreateQueryView, self).form_valid(form) + + form_class = QueryForm + template_name = 'explorer/query.html' + + +class DeleteQueryView(PermissionRequiredMixin, ExplorerContextMixin, DeleteView): + + permission_required = 'change_permission' + model = Query + success_url = reverse_lazy("explorer_index") + + +class PlayQueryView(PermissionRequiredMixin, ExplorerContextMixin, View): + + permission_required = 'change_permission' + + def get(self, request): + if url_get_query_id(request): +~~ query = get_object_or_404(Query, pk=url_get_query_id(request)) + return self.render_with_sql(request, query, run_query=False) + + if url_get_log_id(request): +~~ log = get_object_or_404(QueryLog, pk=url_get_log_id(request)) + query = Query(sql=log.sql, title="Playground", connection=log.connection) + return self.render_with_sql(request, query) + + return self.render() + + def post(self, request): + sql = request.POST.get('sql') + show = url_get_show(request) + query = Query(sql=sql, title="Playground", connection=request.POST.get('connection')) + passes_blacklist, failing_words = query.passes_blacklist() + error = MSG_FAILED_BLACKLIST % ', '.join(failing_words) if not passes_blacklist else None + run_query = not bool(error) if show else False + return self.render_with_sql(request, query, run_query=run_query, error=error) + + def render(self): + return self.render_template('explorer/play.html', {'title': 'Playground', 'form': QueryForm()}) + + def render_with_sql(self, request, query, run_query=True, error=None): + rows = url_get_rows(request) + fullscreen = url_get_fullscreen(request) + template = 'fullscreen' if fullscreen else 'play' + form = QueryForm(request.POST if len(request.POST) else None, instance=query) + return self.render_template('explorer/%s.html' % template, query_viewmodel(request.user, + query, + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + show = url_get_show(request) + rows = url_get_rows(request) + vm = query_viewmodel(request.user, query, form=form, run_query=show, rows=rows) + fullscreen = url_get_fullscreen(request) + template = 'fullscreen' if fullscreen else 'query' + return self.render_template('explorer/%s.html' % template, vm) + + def post(self, request, query_id): + if not app_settings.EXPLORER_PERMISSION_CHANGE(request.user): + return HttpResponseRedirect( + reverse_lazy('query_detail', kwargs={'query_id': query_id}) + ) + show = url_get_show(request) + query, form = QueryView.get_instance_and_form(request, query_id) + success = form.is_valid() and form.save() + vm = query_viewmodel(request.user, + query, + form=form, + run_query=show, + rows=url_get_rows(request), + message="Query saved." if success else None) + return self.render_template('explorer/query.html', vm) + + @staticmethod + def get_instance_and_form(request, query_id): +~~ query = get_object_or_404(Query, pk=query_id) + query.params = url_get_params(request) + form = QueryForm(request.POST if len(request.POST) else None, instance=query) + return query, form + + +def query_viewmodel(user, query, title=None, form=None, message=None, run_query=True, error=None, rows=app_settings.EXPLORER_DEFAULT_ROWS): + res = None + ql = None + if run_query: + try: + res, ql = query.execute_with_logging(user) + except DatabaseError as e: + error = str(e) + has_valid_results = not error and res and run_query + ret = { + 'tasks_enabled': app_settings.ENABLE_TASKS, + 'params': query.available_params(), + 'title': title, + 'shared': query.shared, + 'query': query, + 'form': form, + 'message': message, + 'error': error, + 'rows': rows, + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 8 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / views.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./views.py) + +```python +# views.py +from django.contrib.contenttypes.models import ContentType +~~from django.shortcuts import get_object_or_404 +from django.views.generic.list import ListView + +from taggit.models import Tag, TaggedItem + + +def tagged_object_list(request, slug, queryset, **kwargs): + if callable(queryset): + queryset = queryset() + kwargs["slug"] = slug + tag_list_view = type( + "TagListView", + (TagListMixin, ListView), + {"model": queryset.model, "queryset": queryset}, + ) + return tag_list_view.as_view()(request, **kwargs) + + +class TagListMixin: + tag_suffix = "_tag" + + def dispatch(self, request, *args, **kwargs): + slug = kwargs.pop("slug") +~~ self.tag = get_object_or_404(Tag, slug=slug) + return super().dispatch(request, *args, **kwargs) + + def get_queryset(self, **kwargs): + qs = super().get_queryset(**kwargs) + return qs.filter( + pk__in=TaggedItem.objects.filter( + tag=self.tag, content_type=ContentType.objects.get_for_model(qs.model) + ).values_list("object_id", flat=True) + ) + + def get_template_names(self): + if self.tag_suffix: + self.template_name_suffix = self.tag_suffix + self.template_name_suffix + return super().get_template_names() + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + if "extra_context" not in context: + context["extra_context"] = {} + context["extra_context"]["tag"] = self.tag + return context + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 9 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms.py) + +```python +# forms.py +__all__ = [ + "UserCreationForm", + "UserUpdateForm", + "WikiSlugField", + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", + "TextInputPrepend", + "CreateForm", + "DeleteForm", + "PermissionsForm", + "DirFilterForm", + "SearchForm", +] + +from datetime import timedelta + +from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model +from django.core import validators +from django.core.validators import RegexValidator +from django.forms.widgets import HiddenInput +~~from django.shortcuts import get_object_or_404 +from django.urls import Resolver404, resolve +from django.utils import timezone +from django.utils.safestring import mark_safe +from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.plugins.base import PluginSettingsFormMixin +from wiki.editors import getEditor + +from .forms_account_handling import UserCreationForm, UserUpdateForm + +validate_slug_numbers = RegexValidator( + r"^[0-9]+$", + _("A 'slug' cannot consist solely of numbers."), + "invalid", + inverse_match=True, +) + + +class WikiSlugField(forms.CharField): + + default_validators = [validators.validate_slug, validate_slug_numbers] + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + ), + ) + content = forms.CharField( + label=_("Type in some contents"), + help_text=_( + "This is just the initial contents of your article. After creating it, you can use more complex features like adding plugins, meta data, related articles etc..." + ), + required=False, + widget=getEditor().get_widget(), + ) # @UndefinedVariable + + +class MoveForm(forms.Form): + + destination = forms.CharField(label=_("Destination")) + slug = WikiSlugField(max_length=models.URLPath.SLUG_MAX_LENGTH) + redirect = forms.BooleanField( + label=_("Redirect pages"), + help_text=_("Create a redirect page for every moved article?"), + required=False, + ) + + def clean(self): + cd = super().clean() + if cd.get("slug"): +~~ dest_path = get_object_or_404( + models.URLPath, pk=self.cleaned_data["destination"] + ) + cd["slug"] = _clean_slug(cd["slug"], dest_path) + return cd + + +class EditForm(forms.Form, SpamProtectionMixin): + + title = forms.CharField(label=_("Title"),) + content = forms.CharField( + label=_("Contents"), required=False, widget=getEditor().get_widget() + ) # @UndefinedVariable + + summary = forms.CharField( + label=pgettext_lazy("Revision comment", "Summary"), + help_text=_( + "Give a short reason for your edit, which will be stated in the revision log." + ), + required=False, + ) + + current_revision = forms.IntegerField(required=False, widget=forms.HiddenInput()) + + def __init__(self, request, current_revision, *args, **kwargs): + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 10 from gadget-board +[gadget-board](https://github.com/mik4el/gadget-board) is a +[Django](/django.html), +[Django REST Framework (DRF)](/django-rest-framework-drf.html) and +[Angular](/angular.html) web application that is open source under the +[Apache2 license](https://github.com/mik4el/gadget-board/blob/master/LICENSE). + +[**gadget-board / web / gadgets / permissions.py**](https://github.com/mik4el/gadget-board/blob/master/web/gadgets/permissions.py) + +```python +# permissions.py +from rest_framework import permissions +~~from django.shortcuts import get_object_or_404 +from .models import Gadget + + +class CanUserAddGadgetData(permissions.BasePermission): + def has_permission(self, request, view): + if request.method in permissions.SAFE_METHODS: + return True + if request.method == "POST": + if request.user.is_authenticated: +~~ gadget = get_object_or_404(Gadget, slug=view.kwargs['gadget_slug']) + if request.user in gadget.users_can_upload.all(): + return True + return False + + def has_object_permission(self, request, view, obj): + return False + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 11 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / views.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/views.py) + +```python +# views.py +from django.http import Http404, HttpResponse +~~from django.shortcuts import get_object_or_404, redirect +from django.urls import reverse + +from wagtail.core import hooks +from wagtail.core.forms import PasswordViewRestrictionForm +from wagtail.core.models import Page, PageViewRestriction, Site + + +def serve(request, path): + site = Site.find_for_request(request) + if not site: + raise Http404 + + path_components = [component for component in path.split('/') if component] + page, args, kwargs = site.root_page.specific.route(request, path_components) + + for fn in hooks.get_hooks('before_serve_page'): + result = fn(page, request, args, kwargs) + if isinstance(result, HttpResponse): + return result + + return page.serve(request, *args, **kwargs) + + +def authenticate_with_password(request, page_view_restriction_id, page_id): +~~ restriction = get_object_or_404(PageViewRestriction, id=page_view_restriction_id) +~~ page = get_object_or_404(Page, id=page_id).specific + + if request.method == 'POST': + form = PasswordViewRestrictionForm(request.POST, instance=restriction) + if form.is_valid(): + restriction.mark_as_passed(request) + + return redirect(form.cleaned_data['return_url']) + else: + form = PasswordViewRestrictionForm(instance=restriction) + + action_url = reverse('wagtailcore_authenticate_with_password', args=[restriction.id, page.id]) + return page.serve_password_required_response(request, form, action_url) + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + diff --git a/content/pages/examples/django/django-shortcuts-redirect.markdown b/content/pages/examples/django/django-shortcuts-redirect.markdown new file mode 100644 index 000000000..31d3af0c3 --- /dev/null +++ b/content/pages/examples/django/django-shortcuts-redirect.markdown @@ -0,0 +1,1115 @@ +title: django.shortcuts redirect Example Code +category: page +slug: django-shortcuts-redirect-examples +sortorder: 500011347 +toc: False +sidebartitle: django.shortcuts redirect +meta: Python example code for the redirect callable from the django.shortcuts module of the Django project. + + +redirect is a callable within the django.shortcuts module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / registration / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/registration/views.py) + +```python +# views.py +from django.contrib.auth import get_user_model +from django.contrib.auth.decorators import login_required +~~from django.shortcuts import render, redirect + +from users.models import generate_avatar +from users.forms import PersonalForm, ProfessionalForm, SubscriptionsForm + +User = get_user_model() + + +@login_required +def personal(request): + profile = request.user.profile + if request.method == 'POST': + form = PersonalForm(request.POST, instance=profile) + if form.is_valid(): + form.save() + profile.avatar = generate_avatar(profile) + profile.save() +~~ return redirect('register-professional') + else: + form = PersonalForm(instance=profile) + return render(request, 'registration/personal.html', { + 'form': form + }) + +@login_required +def professional(request): + profile = request.user.profile + if request.method == 'POST': + form = ProfessionalForm(request.POST, instance=profile) + if form.is_valid(): + form.save() +~~ return redirect('register-subscriptions') + else: + form = ProfessionalForm(instance=profile) + return render(request, 'registration/professional.html', { + 'form': form + }) + + +@login_required +def subscriptions(request): + subscriptions = request.user.subscriptions + if request.method == 'POST': + form = SubscriptionsForm(request.POST, instance=subscriptions) + if form.is_valid(): + form.save() + request.user.has_finished_registration = True + request.user.save() +~~ return redirect('home') + else: + form = SubscriptionsForm(instance=subscriptions) + return render(request, 'registration/subscriptions.html', { + 'form': form + }) + + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / views.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.contrib.sites.shortcuts import get_current_site +from django.http import ( + Http404, + HttpResponsePermanentRedirect, + HttpResponseRedirect, +) +~~from django.shortcuts import redirect +from django.urls import reverse, reverse_lazy +from django.utils.decorators import method_decorator +from django.views.decorators.debug import sensitive_post_parameters +from django.views.generic.base import TemplateResponseMixin, TemplateView, View +from django.views.generic.edit import FormView + +from ..exceptions import ImmediateHttpResponse +from ..utils import get_form_class, get_request_param +from . import app_settings, signals +from .adapter import get_adapter +from .forms import ( + AddEmailForm, + ChangePasswordForm, + LoginForm, + ResetPasswordForm, + ResetPasswordKeyForm, + SetPasswordForm, + SignupForm, + UserTokenForm, +) +from .models import EmailAddress, EmailConfirmation, EmailConfirmationHMAC +from .utils import ( + complete_signup, + get_login_redirect_url, + + +## ... source file abbreviated to get to redirect examples ... + + + try: + self.object = self.get_object() + if app_settings.CONFIRM_EMAIL_ON_GET: + return self.post(*args, **kwargs) + except Http404: + self.object = None + ctx = self.get_context_data() + return self.render_to_response(ctx) + + def post(self, *args, **kwargs): + self.object = confirmation = self.get_object() + confirmation.confirm(self.request) + get_adapter(self.request).add_message( + self.request, + messages.SUCCESS, + 'account/messages/email_confirmed.txt', + {'email': confirmation.email_address.email}) + if app_settings.LOGIN_ON_EMAIL_CONFIRMATION: + resp = self.login_on_confirm(confirmation) + if resp is not None: + return resp + redirect_url = self.get_redirect_url() + if not redirect_url: + ctx = self.get_context_data() + return self.render_to_response(ctx) +~~ return redirect(redirect_url) + + def login_on_confirm(self, confirmation): + user_pk = None + user_pk_str = get_adapter(self.request).unstash_user(self.request) + if user_pk_str: + user_pk = url_str_to_user_pk(user_pk_str) + user = confirmation.email_address.user + if user_pk == user.pk and self.request.user.is_anonymous: + return perform_login(self.request, + user, + app_settings.EmailVerificationMethod.NONE, + redirect_url=self.get_redirect_url) + + return None + + def get_object(self, queryset=None): + key = self.kwargs['key'] + emailconfirmation = EmailConfirmationHMAC.from_key(key) + if not emailconfirmation: + if queryset is None: + queryset = self.get_queryset() + try: + emailconfirmation = queryset.get(key=key.lower()) + except EmailConfirmation.DoesNotExist: + + +## ... source file abbreviated to get to redirect examples ... + + + return get_form_class(app_settings.FORMS, + 'reset_password_from_key', + self.form_class) + + def dispatch(self, request, uidb36, key, **kwargs): + self.request = request + self.key = key + + if self.key == INTERNAL_RESET_URL_KEY: + self.key = self.request.session.get(INTERNAL_RESET_SESSION_KEY, '') + token_form = UserTokenForm( + data={'uidb36': uidb36, 'key': self.key}) + if token_form.is_valid(): + self.reset_user = token_form.reset_user + return super(PasswordResetFromKeyView, self).dispatch(request, + uidb36, + self.key, + **kwargs) + else: + token_form = UserTokenForm( + data={'uidb36': uidb36, 'key': self.key}) + if token_form.is_valid(): + self.request.session[INTERNAL_RESET_SESSION_KEY] = self.key + redirect_url = self.request.path.replace( + self.key, INTERNAL_RESET_URL_KEY) +~~ return redirect(redirect_url) + + self.reset_user = None + response = self.render_to_response( + self.get_context_data(token_fail=True) + ) + return _ajax_response(self.request, response, form=token_form) + + def get_context_data(self, **kwargs): + ret = super(PasswordResetFromKeyView, self).get_context_data(**kwargs) + ret['action_url'] = reverse( + 'account_reset_password_from_key', + kwargs={'uidb36': self.kwargs['uidb36'], + 'key': self.kwargs['key']}) + return ret + + def get_form_kwargs(self): + kwargs = super(PasswordResetFromKeyView, self).get_form_kwargs() + kwargs["user"] = self.reset_user + kwargs["temp_key"] = self.key + return kwargs + + def form_valid(self, form): + form.save() + get_adapter(self.request).add_message( + + +## ... source file abbreviated to get to redirect examples ... + + + + return super(PasswordResetFromKeyView, self).form_valid(form) + + +password_reset_from_key = PasswordResetFromKeyView.as_view() + + +class PasswordResetFromKeyDoneView(TemplateView): + template_name = ( + "account/password_reset_from_key_done." + + app_settings.TEMPLATE_EXTENSION) + + +password_reset_from_key_done = PasswordResetFromKeyDoneView.as_view() + + +class LogoutView(TemplateResponseMixin, View): + + template_name = "account/logout." + app_settings.TEMPLATE_EXTENSION + redirect_field_name = "next" + + def get(self, *args, **kwargs): + if app_settings.LOGOUT_ON_GET: + return self.post(*args, **kwargs) + if not self.request.user.is_authenticated: +~~ response = redirect(self.get_redirect_url()) + return _ajax_response(self.request, response) + ctx = self.get_context_data() + response = self.render_to_response(ctx) + return _ajax_response(self.request, response) + + def post(self, *args, **kwargs): + url = self.get_redirect_url() + if self.request.user.is_authenticated: + self.logout() +~~ response = redirect(url) + return _ajax_response(self.request, response) + + def logout(self): + adapter = get_adapter(self.request) + adapter.add_message( + self.request, + messages.SUCCESS, + 'account/messages/logged_out.txt') + adapter.logout(self.request) + + def get_context_data(self, **kwargs): + ctx = kwargs + redirect_field_value = get_request_param(self.request, + self.redirect_field_name) + ctx.update({ + "redirect_field_name": self.redirect_field_name, + "redirect_field_value": redirect_field_value}) + return ctx + + def get_redirect_url(self): + return ( + get_next_redirect_url( + self.request, + self.redirect_field_name) or get_adapter( + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 3 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / helpers.py**](https://github.com/jazzband/django-axes/blob/master/axes/./helpers.py) + +```python +# helpers.py +from datetime import timedelta +from hashlib import md5 +from logging import getLogger +from string import Template +from typing import Callable, Optional, Type, Union +from urllib.parse import urlencode + +from django.core.cache import caches, BaseCache +from django.http import HttpRequest, HttpResponse, JsonResponse, QueryDict +~~from django.shortcuts import render, redirect +from django.utils.module_loading import import_string + +import ipware.ip + +from axes.conf import settings +from axes.models import AccessBase + +log = getLogger(__name__) + + +def get_cache() -> BaseCache: + + return caches[getattr(settings, "AXES_CACHE", "default")] + + +def get_cache_timeout() -> Optional[int]: + + cool_off = get_cool_off() + if cool_off is None: + return None + return int(cool_off.total_seconds()) + + +def get_cool_off() -> Optional[timedelta]: + + +## ... source file abbreviated to get to redirect examples ... + + + "failure_limit": get_failure_limit(request, credentials), + "username": get_client_username(request, credentials) or "", + } + + cool_off = get_cool_off() + if cool_off: + context.update( + { + "cooloff_time": get_cool_off_iso8601( + cool_off + ), # differing old name is kept for backwards compatibility + "cooloff_timedelta": cool_off, + } + ) + + if request.is_ajax(): + return JsonResponse(context, status=status) + + if settings.AXES_LOCKOUT_TEMPLATE: + return render(request, settings.AXES_LOCKOUT_TEMPLATE, context, status=status) + + if settings.AXES_LOCKOUT_URL: + lockout_url = settings.AXES_LOCKOUT_URL + query_string = urlencode({"username": context["username"]}) + url = "{}?{}".format(lockout_url, query_string) +~~ return redirect(url) + + return HttpResponse(get_lockout_message(), status=status) + + +def is_ip_address_in_whitelist(ip_address: str) -> bool: + if not settings.AXES_IP_WHITELIST: + return False + + return ip_address in settings.AXES_IP_WHITELIST + + +def is_ip_address_in_blacklist(ip_address: str) -> bool: + if not settings.AXES_IP_BLACKLIST: + return False + + return ip_address in settings.AXES_IP_BLACKLIST + + +def is_client_ip_address_whitelisted(request): + + if settings.AXES_NEVER_LOCKOUT_WHITELIST and is_ip_address_in_whitelist( + request.axes_ip_address + ): + return True + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 4 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / views.py**](https://github.com/divio/django-filer/blob/develop/filer/./views.py) + +```python +# views.py +from __future__ import absolute_import, unicode_literals + +from django.http import Http404 +~~from django.shortcuts import get_object_or_404, redirect + +from .models import File + + +def canonical(request, uploaded_at, file_id): + filer_file = get_object_or_404(File, pk=file_id, is_public=True) + if (not filer_file.file or int(uploaded_at) != filer_file.canonical_time): + raise Http404('No %s matches the given query.' % File._meta.object_name) +~~ return redirect(filer_file.url) + + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 5 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / admin.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./admin.py) + +```python +# admin.py +from collections import OrderedDict + +from django import forms +from django.conf import settings +from django.contrib import admin, messages +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth import get_user_model +~~from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse, path +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext +from guardian.forms import GroupObjectPermissionsForm, UserObjectPermissionsForm +from django.contrib.auth.models import Group +from guardian.shortcuts import (get_group_perms, get_groups_with_perms, get_perms_for_model, get_user_perms, + get_users_with_perms) + + +class AdminUserObjectPermissionsForm(UserObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class AdminGroupObjectPermissionsForm(GroupObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class GuardedModelAdminMixin: + change_form_template = \ + 'admin/guardian/model/change_form.html' + + +## ... source file abbreviated to get to redirect examples ... + + + view=self.admin_site.admin_view( + self.obj_perms_manage_group_view), + name='%s_%s_permissions_manage_group' % info), + ] + urls = myurls + urls + return urls + + def get_obj_perms_base_context(self, request, obj): + context = self.admin_site.each_context(request) + context.update({ + 'adminform': {'model_admin': self}, + 'media': self.media, + 'object': obj, + 'app_label': self.model._meta.app_label, + 'opts': self.model._meta, + 'original': str(obj), + 'has_change_permission': self.has_change_permission(request, obj), + 'model_perms': get_perms_for_model(obj), + 'title': _("Object permissions"), + }) + return context + + def obj_perms_manage_view(self, request, object_pk): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) +~~ return redirect(post_url) + + from django.contrib.admin.utils import unquote + obj = get_object_or_404(self.get_queryset( + request), pk=unquote(object_pk)) + users_perms = OrderedDict( + sorted( + get_users_with_perms(obj, attach_perms=True, + with_group_users=False).items(), + key=lambda user: getattr( + user[0], get_user_model().USERNAME_FIELD) + ) + ) + + groups_perms = OrderedDict( + sorted( + get_groups_with_perms(obj, attach_perms=True).items(), + key=lambda group: group[0].name + ) + ) + + if request.method == 'POST' and 'submit_manage_user' in request.POST: + user_form = self.get_obj_perms_user_select_form( + request)(request.POST) + group_form = self.get_obj_perms_group_select_form( + request)(request.POST) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + if user_form.is_valid(): + user_id = user_form.cleaned_data['user'].pk + url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user_id] + ) +~~ return redirect(url) + elif request.method == 'POST' and 'submit_manage_group' in request.POST: + user_form = self.get_obj_perms_user_select_form( + request)(request.POST) + group_form = self.get_obj_perms_group_select_form( + request)(request.POST) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + if group_form.is_valid(): + group_id = group_form.cleaned_data['group'].id + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group_id] + ) +~~ return redirect(url) + else: + user_form = self.get_obj_perms_user_select_form(request)() + group_form = self.get_obj_perms_group_select_form(request)() + + context = self.get_obj_perms_base_context(request, obj) + context['users_perms'] = users_perms + context['groups_perms'] = groups_perms + context['user_form'] = user_form + context['group_form'] = group_form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_template(), context) + + def get_obj_perms_manage_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage.html' + return self.obj_perms_manage_template + + def obj_perms_manage_user_view(self, request, object_pk, user_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) +~~ return redirect(post_url) + + user = get_object_or_404(get_user_model(), pk=user_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_user_form(request) + form = form_class(user, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user.pk] + ) +~~ return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['user_obj'] = user + context['user_perms'] = get_user_perms(user, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_user_template(), context) + + def get_obj_perms_manage_user_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + return self.obj_perms_manage_user_template + + def get_obj_perms_user_select_form(self, request): + return UserManage + + def get_obj_perms_group_select_form(self, request): + return GroupManage + + def get_obj_perms_manage_user_form(self, request): + return AdminUserObjectPermissionsForm + + def obj_perms_manage_group_view(self, request, object_pk, group_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) +~~ return redirect(post_url) + + group = get_object_or_404(Group, id=group_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_group_form(request) + form = form_class(group, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group.id] + ) +~~ return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['group_obj'] = group + context['group_perms'] = get_group_perms(group, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_group_template(), context) + + def get_obj_perms_manage_group_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_group.html' + return self.obj_perms_manage_group_template + + def get_obj_perms_manage_group_form(self, request): + return AdminGroupObjectPermissionsForm + + +class GuardedModelAdmin(GuardedModelAdminMixin, admin.ModelAdmin): + + +class UserManage(forms.Form): + user = forms.CharField(label=_("User identification"), + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 6 from django-inline-actions +[django-inline-actions](https://github.com/escaped/django-inline-actions) +([PyPI package information](https://pypi.org/project/django-inline-actions/)) +is an extension that adds actions to the [Django](/django.html) +Admin InlineModelAdmin and ModelAdmin changelists. The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/escaped/django-inline-actions/blob/master/LICENSE). + +[**django-inline-actions / inline_actions / actions.py**](https://github.com/escaped/django-inline-actions/blob/master/inline_actions/./actions.py) + +```python +# actions.py +from django.contrib import messages +~~from django.shortcuts import redirect +from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ + + +class ViewAction: + inline_actions = ['view_action'] + + def view_action(self, request, obj, parent_obj=None): + url = reverse( + 'admin:{}_{}_change'.format( + obj._meta.app_label, + obj._meta.model_name, + ), + args=(obj.pk,) + ) +~~ return redirect(url) + view_action.short_description = _("View") + + +class DeleteAction: + def get_inline_actions(self, request, obj=None): + actions = super().get_inline_actions(request, obj) + if self.has_delete_permission(request, obj): + actions.append('delete_action') + return actions + + def delete_action(self, request, obj, parent_obj=None): + if self.has_delete_permission(request): + obj.delete() + messages.info(request, "`{}` deleted.".format(obj)) + delete_action.short_description = _("Delete") + + +class DefaultActionsMixin(ViewAction, + DeleteAction): + inline_actions = [] + + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 7 from django-loginas +[django-loginas](https://github.com/skorokithakis/django-loginas) +([PyPI package information](https://pypi.org/project/django-loginas/)) +is [Django](/django.html) code library for admins to log into an application +as another user, typically for debugging purposes. + +django-loginas is open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/skorokithakis/django-loginas/blob/master/LICENSE). + +[**django-loginas / loginas / views.py**](https://github.com/skorokithakis/django-loginas/blob/master/loginas/./views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.admin.utils import unquote +from django.core.exceptions import ImproperlyConfigured, PermissionDenied +~~from django.shortcuts import redirect +from django.utils.translation import gettext_lazy as _ +from django.views.decorators.csrf import csrf_protect +from django.views.decorators.http import require_POST + +from . import settings as la_settings +from .utils import login_as, restore_original_login + +try: + from importlib import import_module +except ImportError: + from django.utils.importlib import import_module # type: ignore + + +try: + from django.contrib.auth import get_user_model + + User = get_user_model() +except ImportError: + from django.contrib.auth.models import User # type: ignore + + +def _load_module(path): + + i = path.rfind(".") + + +## ... source file abbreviated to get to redirect examples ... + + + can_login_as = getattr(mod, attr) + except AttributeError: + raise ImproperlyConfigured("Module {0} does not define a {1} " "function.".format(module, attr)) + return can_login_as + + +@csrf_protect +@require_POST +def user_login(request, user_id): + user = User.objects.get(pk=unquote(user_id)) + + if isinstance(la_settings.CAN_LOGIN_AS, str): + can_login_as = _load_module(la_settings.CAN_LOGIN_AS) + elif hasattr(la_settings.CAN_LOGIN_AS, "__call__"): + can_login_as = la_settings.CAN_LOGIN_AS + else: + raise ImproperlyConfigured("The CAN_LOGIN_AS setting is neither a valid module nor callable.") + no_permission_error = None + try: + if not can_login_as(request, user): + no_permission_error = _("You do not have permission to do that.") + except PermissionDenied as e: + no_permission_error = str(e) + if no_permission_error is not None: + messages.error(request, no_permission_error, extra_tags=la_settings.MESSAGE_EXTRA_TAGS, fail_silently=True) +~~ return redirect(request.META.get("HTTP_REFERER", "/")) + + try: + login_as(user, request) + except ImproperlyConfigured as e: + messages.error(request, str(e), extra_tags=la_settings.MESSAGE_EXTRA_TAGS, fail_silently=True) +~~ return redirect(request.META.get("HTTP_REFERER", "/")) + +~~ return redirect(la_settings.LOGIN_REDIRECT) + + +def user_logout(request): + restore_original_login(request) + +~~ return redirect(la_settings.LOGOUT_REDIRECT) + + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 8 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / decorators.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./decorators.py) + +```python +# decorators.py +from functools import wraps + +from django.http import HttpResponseForbidden +from django.http import HttpResponseNotFound +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404 +~~from django.shortcuts import redirect +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.http import urlquote +from wiki.conf import settings +from wiki.core.exceptions import NoRootURL + + +def response_forbidden(request, article, urlpath, read_denied=False): + if request.user.is_anonymous: + qs = request.META.get("QUERY_STRING", "") + if qs: + qs = urlquote("?" + qs) + else: + qs = "" +~~ return redirect(settings.LOGIN_URL + "?next=" + request.path + qs) + else: + return HttpResponseForbidden( + render_to_string( + "wiki/permission_denied.html", + context={ + "article": article, + "urlpath": urlpath, + "read_denied": read_denied, + }, + request=request, + ) + ) + + +def get_article( # noqa: max-complexity=23 + func=None, + can_read=True, + can_write=False, + deleted_contents=False, + not_locked=False, + can_delete=False, + can_moderate=False, + can_create=False, +): + + def wrapper(request, *args, **kwargs): + from . import models + + path = kwargs.pop("path", None) + article_id = kwargs.pop("article_id", None) + + if path is not None: + try: + urlpath = models.URLPath.get_by_path(path, select_related=True) + except NoRootURL: +~~ return redirect("wiki:root_create") + except models.URLPath.DoesNotExist: + try: + pathlist = list(filter(lambda x: x != "", path.split("/"),)) + path = "/".join(pathlist[:-1]) + parent = models.URLPath.get_by_path(path) + return HttpResponseRedirect( + reverse("wiki:create", kwargs={"path": parent.path}) + + "?slug=%s" % pathlist[-1].lower() + ) + except models.URLPath.DoesNotExist: + return HttpResponseNotFound( + render_to_string( + "wiki/error.html", + context={"error_type": "ancestors_missing"}, + request=request, + ) + ) + if urlpath.article: + article = urlpath.article + else: + return_url = reverse("wiki:get", kwargs={"path": urlpath.parent.path}) + urlpath.delete() + return HttpResponseRedirect(return_url) + + elif article_id: + articles = models.Article.objects + + article = get_object_or_404(articles, id=article_id) + try: + urlpath = models.URLPath.objects.get(articles__article=article) + except ( + models.URLPath.DoesNotExist, + models.URLPath.MultipleObjectsReturned, + ): + urlpath = None + + else: + raise TypeError("You should specify either article_id or path") + + if not deleted_contents: + if urlpath: + if urlpath.is_deleted(): # This also checks all ancestors +~~ return redirect("wiki:deleted", path=urlpath.path) + else: + if article.current_revision and article.current_revision.deleted: +~~ return redirect("wiki:deleted", article_id=article.id) + + if article.current_revision.locked and not_locked: + return response_forbidden(request, article, urlpath) + + if can_read and not article.can_read(request.user): + return response_forbidden(request, article, urlpath, read_denied=True) + + if (can_write or can_create) and not article.can_write(request.user): + return response_forbidden(request, article, urlpath) + + if can_create and not ( + request.user.is_authenticated or settings.ANONYMOUS_CREATE + ): + return response_forbidden(request, article, urlpath) + + if can_delete and not article.can_delete(request.user): + return response_forbidden(request, article, urlpath) + + if can_moderate and not article.can_moderate(request.user): + return response_forbidden(request, article, urlpath) + + kwargs["urlpath"] = urlpath + + return func(request, article, *args, **kwargs) + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 9 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / middleware.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./middleware.py) + +```python +# middleware.py +import django.middleware.locale +~~import django.shortcuts +from django.utils import translation +from django.utils.deprecation import MiddlewareMixin + + +class RequestLocaleMiddleware(MiddlewareMixin): + def process_view(self, request, view_func, view_args, view_kwargs): + if request.method == 'GET': + language = request.GET.get('lang') + if language: + translation.activate(language) + request.session[translation.LANGUAGE_SESSION_KEY] = translation.get_language() + query = request.GET.copy() + del query['lang'] + path = '?'.join([request.path, query.urlencode()]) +~~ return django.shortcuts.redirect(path) + + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 10 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / views.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/views.py) + +```python +# views.py +from django.http import Http404, HttpResponse +~~from django.shortcuts import get_object_or_404, redirect +from django.urls import reverse + +from wagtail.core import hooks +from wagtail.core.forms import PasswordViewRestrictionForm +from wagtail.core.models import Page, PageViewRestriction, Site + + +def serve(request, path): + site = Site.find_for_request(request) + if not site: + raise Http404 + + path_components = [component for component in path.split('/') if component] + page, args, kwargs = site.root_page.specific.route(request, path_components) + + for fn in hooks.get_hooks('before_serve_page'): + result = fn(page, request, args, kwargs) + if isinstance(result, HttpResponse): + return result + + return page.serve(request, *args, **kwargs) + + +def authenticate_with_password(request, page_view_restriction_id, page_id): + restriction = get_object_or_404(PageViewRestriction, id=page_view_restriction_id) + page = get_object_or_404(Page, id=page_id).specific + + if request.method == 'POST': + form = PasswordViewRestrictionForm(request.POST, instance=restriction) + if form.is_valid(): + restriction.mark_as_passed(request) + +~~ return redirect(form.cleaned_data['return_url']) + else: + form = PasswordViewRestrictionForm(instance=restriction) + + action_url = reverse('wagtailcore_authenticate_with_password', args=[restriction.id, page.id]) + return page.serve_password_required_response(request, form, action_url) + + + +## ... source file continues with no further redirect examples... + +``` + diff --git a/content/pages/examples/django/django-shortcuts-render.markdown b/content/pages/examples/django/django-shortcuts-render.markdown new file mode 100644 index 000000000..7b5d2d193 --- /dev/null +++ b/content/pages/examples/django/django-shortcuts-render.markdown @@ -0,0 +1,1883 @@ +title: django.shortcuts render Example Code +category: page +slug: django-shortcuts-render-examples +sortorder: 500011348 +toc: False +sidebartitle: django.shortcuts render +meta: Python example code for the render callable from the django.shortcuts module of the Django project. + + +render is a callable within the django.shortcuts module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / registration / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/registration/views.py) + +```python +# views.py +from django.contrib.auth import get_user_model +from django.contrib.auth.decorators import login_required +~~from django.shortcuts import render, redirect + +from users.models import generate_avatar +from users.forms import PersonalForm, ProfessionalForm, SubscriptionsForm + +User = get_user_model() + + +@login_required +def personal(request): + profile = request.user.profile + if request.method == 'POST': + form = PersonalForm(request.POST, instance=profile) + if form.is_valid(): + form.save() + profile.avatar = generate_avatar(profile) + profile.save() + return redirect('register-professional') + else: + form = PersonalForm(instance=profile) +~~ return render(request, 'registration/personal.html', { + 'form': form + }) + +@login_required +def professional(request): + profile = request.user.profile + if request.method == 'POST': + form = ProfessionalForm(request.POST, instance=profile) + if form.is_valid(): + form.save() + return redirect('register-subscriptions') + else: + form = ProfessionalForm(instance=profile) +~~ return render(request, 'registration/professional.html', { + 'form': form + }) + + +@login_required +def subscriptions(request): + subscriptions = request.user.subscriptions + if request.method == 'POST': + form = SubscriptionsForm(request.POST, instance=subscriptions) + if form.is_valid(): + form.save() + request.user.has_finished_registration = True + request.user.save() + return redirect('home') + else: + form = SubscriptionsForm(instance=subscriptions) +~~ return render(request, 'registration/subscriptions.html', { + 'form': form + }) + + + +## ... source file continues with no further render examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / helpers.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/helpers.py) + +```python +# helpers.py +from django.contrib import messages +from django.forms import ValidationError +from django.http import HttpResponseRedirect +~~from django.shortcuts import render +from django.urls import reverse + +from allauth.account import app_settings as account_settings +from allauth.account.adapter import get_adapter as get_account_adapter +from allauth.account.utils import complete_signup, perform_login, user_username +from allauth.exceptions import ImmediateHttpResponse + +from . import app_settings, signals +from .adapter import get_adapter +from .models import SocialLogin +from .providers.base import AuthError, AuthProcess + + +def _process_signup(request, sociallogin): + auto_signup = get_adapter(request).is_auto_signup_allowed( + request, + sociallogin) + if not auto_signup: + request.session['socialaccount_sociallogin'] = sociallogin.serialize() + url = reverse('socialaccount_signup') + ret = HttpResponseRedirect(url) + else: + if account_settings.USER_MODEL_USERNAME_FIELD: + username = user_username(sociallogin.user) + try: + get_account_adapter(request).clean_username(username) + except ValidationError: + user_username(sociallogin.user, '') + if not get_adapter(request).is_open_for_signup( + request, + sociallogin): +~~ return render( + request, + "account/signup_closed." + + account_settings.TEMPLATE_EXTENSION) + get_adapter(request).save_user(request, sociallogin, form=None) + ret = complete_social_signup(request, sociallogin) + return ret + + +def _login_social_account(request, sociallogin): + return perform_login(request, sociallogin.user, + email_verification=app_settings.EMAIL_VERIFICATION, + redirect_url=sociallogin.get_redirect_url(request), + signal_kwargs={"sociallogin": sociallogin}) + + +def render_authentication_error(request, + provider_id, + error=AuthError.UNKNOWN, + exception=None, + extra_context=None): + try: + if extra_context is None: + extra_context = {} + get_adapter(request).authentication_error( + request, + provider_id, + error=error, + exception=exception, + extra_context=extra_context) + except ImmediateHttpResponse as e: + return e.response + if error == AuthError.CANCELLED: + return HttpResponseRedirect(reverse('socialaccount_login_cancelled')) + context = { + 'auth_error': { + 'provider': provider_id, + 'code': error, + 'exception': exception + } + } + context.update(extra_context) +~~ return render( + request, + "socialaccount/authentication_error." + + account_settings.TEMPLATE_EXTENSION, + context + ) + + +def _add_social_account(request, sociallogin): + if request.user.is_anonymous: + return HttpResponseRedirect(reverse('socialaccount_connections')) + level = messages.INFO + message = 'socialaccount/messages/account_connected.txt' + action = None + if sociallogin.is_existing: + if sociallogin.user != request.user: + level = messages.ERROR + message = 'socialaccount/messages/account_connected_other.txt' + else: + action = 'updated' + message = 'socialaccount/messages/account_connected_updated.txt' + signals.social_account_updated.send( + sender=SocialLogin, + request=request, + sociallogin=sociallogin) + + +## ... source file continues with no further render examples... + +``` + + +## Example 3 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / helpers.py**](https://github.com/jazzband/django-axes/blob/master/axes/./helpers.py) + +```python +# helpers.py +from datetime import timedelta +from hashlib import md5 +from logging import getLogger +from string import Template +from typing import Callable, Optional, Type, Union +from urllib.parse import urlencode + +from django.core.cache import caches, BaseCache +from django.http import HttpRequest, HttpResponse, JsonResponse, QueryDict +~~from django.shortcuts import render, redirect +from django.utils.module_loading import import_string + +import ipware.ip + +from axes.conf import settings +from axes.models import AccessBase + +log = getLogger(__name__) + + +def get_cache() -> BaseCache: + + return caches[getattr(settings, "AXES_CACHE", "default")] + + +def get_cache_timeout() -> Optional[int]: + + cool_off = get_cool_off() + if cool_off is None: + return None + return int(cool_off.total_seconds()) + + +def get_cool_off() -> Optional[timedelta]: + + +## ... source file abbreviated to get to render examples ... + + + raise TypeError( + "settings.AXES_LOCKOUT_CALLABLE needs to be a string, callable, or None." + ) + + status = 403 + context = { + "failure_limit": get_failure_limit(request, credentials), + "username": get_client_username(request, credentials) or "", + } + + cool_off = get_cool_off() + if cool_off: + context.update( + { + "cooloff_time": get_cool_off_iso8601( + cool_off + ), # differing old name is kept for backwards compatibility + "cooloff_timedelta": cool_off, + } + ) + + if request.is_ajax(): + return JsonResponse(context, status=status) + + if settings.AXES_LOCKOUT_TEMPLATE: +~~ return render(request, settings.AXES_LOCKOUT_TEMPLATE, context, status=status) + + if settings.AXES_LOCKOUT_URL: + lockout_url = settings.AXES_LOCKOUT_URL + query_string = urlencode({"username": context["username"]}) + url = "{}?{}".format(lockout_url, query_string) + return redirect(url) + + return HttpResponse(get_lockout_message(), status=status) + + +def is_ip_address_in_whitelist(ip_address: str) -> bool: + if not settings.AXES_IP_WHITELIST: + return False + + return ip_address in settings.AXES_IP_WHITELIST + + +def is_ip_address_in_blacklist(ip_address: str) -> bool: + if not settings.AXES_IP_BLACKLIST: + return False + + return ip_address in settings.AXES_IP_BLACKLIST + + + + +## ... source file continues with no further render examples... + +``` + + +## Example 4 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / page_rendering.py**](https://github.com/divio/django-cms/blob/develop/cms/./page_rendering.py) + +```python +# page_rendering.py +from django.conf import settings +from django.http import Http404 +~~from django.shortcuts import render +from django.template.response import TemplateResponse +from django.urls import Resolver404, resolve, reverse + +from cms import __version__ +from cms.cache.page import set_page_cache +from cms.models import Page +from cms.utils.conf import get_cms_setting +from cms.utils.page import get_page_template_from_request +from cms.utils.page_permissions import user_can_change_page, user_can_view_page + + +def render_page(request, page, current_language, slug): + context = {} + context['lang'] = current_language + context['current_page'] = page + context['has_change_permissions'] = user_can_change_page(request.user, page) + context['has_view_permissions'] = user_can_view_page(request.user, page) + + if not context['has_view_permissions']: + return _handle_no_page(request) + + template = get_page_template_from_request(request) + response = TemplateResponse(request, template, context) + response.add_post_render_callback(set_page_cache) + + xframe_options = page.get_xframe_options() + if xframe_options == Page.X_FRAME_OPTIONS_INHERIT or xframe_options is None: + return response + + response.xframe_options_exempt = True + + if xframe_options == Page.X_FRAME_OPTIONS_ALLOW: + return response + elif xframe_options == Page.X_FRAME_OPTIONS_SAMEORIGIN: + response['X-Frame-Options'] = 'SAMEORIGIN' + elif xframe_options == Page.X_FRAME_OPTIONS_DENY: + response['X-Frame-Options'] = 'DENY' + return response + + +def render_object_structure(request, obj): + context = { + 'object': obj, + 'cms_toolbar': request.toolbar, + } +~~ return render(request, 'cms/toolbar/structure.html', context) + + +def _handle_no_page(request): + try: + resolve('%s$' % request.path) + except Resolver404 as e: + exc = Http404(dict(path=request.path, tried=e.args[0]['tried'])) + raise exc + raise Http404('CMS Page not found: %s' % request.path) + + +def _render_welcome_page(request): + context = { + 'cms_version': __version__, + 'cms_edit_on': get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON'), + 'django_debug': settings.DEBUG, + 'next_url': reverse('pages-root'), + } + return TemplateResponse(request, "cms/welcome.html", context) + + + +## ... source file continues with no further render examples... + +``` + + +## Example 5 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / folderadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/folderadmin.py) + +```python +# folderadmin.py +from __future__ import absolute_import, division, unicode_literals + +import itertools +import os +import re +from collections import OrderedDict + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import messages +from django.contrib.admin import helpers +from django.contrib.admin.utils import capfirst, quote, unquote +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.db import models, router +from django.http import HttpResponse, HttpResponseRedirect +~~from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils.encoding import force_text +from django.utils.html import escape +from django.utils.http import urlquote, urlunquote +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy, ungettext + +from .. import settings +from ..models import ( + File, Folder, FolderPermission, FolderRoot, ImagesWithMissingData, + UnsortedImages, tools, +) +from ..settings import FILER_IMAGE_MODEL, FILER_PAGINATE_BY +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import get_delete_permission +from ..utils.filer_easy_thumbnails import FilerActionThumbnailer +from ..utils.loader import load_model +from . import views +from .forms import CopyFilesAndFoldersForm, RenameFilesForm, ResizeImagesForm +from .patched.admin_utils import get_deleted_objects +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import ( + AdminContext, admin_url_params_encoded, check_files_edit_permissions, + + +## ... source file abbreviated to get to render examples ... + + + 'virtual_items': virtual_items, + 'uploader_connections': settings.FILER_UPLOADER_CONNECTIONS, + 'permissions': permissions, + 'permstest': userperms_for_request(folder, request), + 'current_url': request.path, + 'title': _('Directory listing for %(folder_name)s') % {'folder_name': folder.name}, + 'search_string': ' '.join(search_terms), + 'q': urlquote(q), + 'show_result_count': show_result_count, + 'folder_children': folder_children, + 'folder_files': folder_files, + 'limit_search_to_folder': limit_search_to_folder, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request), + 'root_path': reverse('admin:index'), + 'action_form': action_form, + 'actions_on_top': self.actions_on_top, + 'actions_on_bottom': self.actions_on_bottom, + 'actions_selection_counter': self.actions_selection_counter, + 'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(paginated_items.object_list)}, + 'selection_note_all': selection_note_all % {'total_count': paginator.count}, + 'media': self.media, + 'enable_permissions': settings.FILER_ENABLE_PERMISSIONS, + 'can_make_folder': request.user.is_superuser or (folder.is_root and settings.FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS) or permissions.get("has_add_children_permission"), + }) +~~ return render(request, self.directory_listing_template, context) + + def filter_folder(self, qs, terms=()): + def construct_search(field_name): + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + elif field_name.startswith('@'): + return "%s__search" % field_name[1:] + else: + return "%s__icontains" % field_name + + for term in terms: + filters = models.Q() + for filter_ in self.search_fields: + filters |= models.Q(**{construct_search(filter_): term}) + for filter_ in self.get_owner_filter_lookups(): + filters |= models.Q(**{filter_: term}) + qs = qs.filter(filters) + return qs + + def filter_file(self, qs, terms=()): + for term in terms: + filters = (models.Q(name__icontains=term) + + +## ... source file abbreviated to get to render examples ... + + + return None + + if all_perms_needed or all_protected: + title = _("Cannot delete files and/or folders") + else: + title = _("Are you sure?") + + context = self.admin_site.each_context(request) + context.update({ + "title": title, + "instance": current_folder, + "breadcrumbs_action": _("Delete files and/or folders"), + "deletable_objects": all_deletable_objects, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": all_perms_needed, + "protected": all_protected, + "opts": opts, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request), + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + +~~ return render( + request, + "admin/filer/delete_selected_files_confirmation.html", + context + ) + + delete_files_or_folders.short_description = ugettext_lazy( + "Delete selected files and/or folders") + + def _format_callback(self, obj, user, admin_site, perms_needed): + has_admin = obj.__class__ in admin_site._registry + opts = obj._meta + if has_admin: + admin_url = reverse('%s:%s_%s_change' + % (admin_site.name, + opts.app_label, + opts.object_name.lower()), + None, (quote(obj._get_pk_val()),)) + p = get_delete_permission(opts) + if not user.has_perm(p): + perms_needed.add(opts.verbose_name) + return mark_safe('%s: %s' % + (escape(capfirst(opts.verbose_name)), + admin_url, + escape(obj))) + + +## ... source file abbreviated to get to render examples ... + + + "destination") % ", ".join(conflicting_names)) + elif n: + self._move_files_and_folders_impl(files_queryset, folders_queryset, destination) + self.message_user(request, _("Successfully moved %(count)d files and/or folders to folder '%(destination)s'.") % { + "count": n, + "destination": destination, + }) + return None + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Move files and/or folders"), + "instance": current_folder, + "breadcrumbs_action": _("Move files and/or folders"), + "to_move": to_move, + "destination_folders": folders, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + +~~ return render(request, "admin/filer/folder/choose_move_destination.html", context) + + move_files_and_folders.short_description = ugettext_lazy("Move selected files and/or folders") + + def _rename_file(self, file_obj, form_data, counter, global_counter): + original_basename, original_extension = os.path.splitext(file_obj.original_filename) + if file_obj.name: + current_basename, current_extension = os.path.splitext(file_obj.name) + else: + current_basename = "" + current_extension = "" + file_obj.name = form_data['rename_format'] % { + 'original_filename': file_obj.original_filename, + 'original_basename': original_basename, + 'original_extension': original_extension, + 'current_filename': file_obj.name or "", + 'current_basename': current_basename, + 'current_extension': current_extension, + 'current_folder': getattr(file_obj.folder, 'name', ''), + 'counter': counter + 1, # 1-based + 'global_counter': global_counter + 1, # 1-based + } + file_obj.save() + + def _rename_files(self, files, form_data, global_counter): + + +## ... source file abbreviated to get to render examples ... + + + if files_queryset.count() + folders_queryset.count(): + n = self._rename_files_impl(files_queryset, folders_queryset, form.cleaned_data, 0) + self.message_user(request, _("Successfully renamed %(count)d files.") % { + "count": n, + }) + return None + else: + form = RenameFilesForm() + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Rename files"), + "instance": current_folder, + "breadcrumbs_action": _("Rename files"), + "to_rename": to_rename, + "rename_form": form, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + +~~ return render(request, "admin/filer/folder/choose_rename_format.html", context) + + rename_files.short_description = ugettext_lazy("Rename files") + + def _generate_new_filename(self, filename, suffix): + basename, extension = os.path.splitext(filename) + return basename + suffix + extension + + def _copy_file(self, file_obj, destination, suffix, overwrite): + if overwrite: + raise NotImplementedError + + + filename = self._generate_new_filename(file_obj.file.name, suffix) + + file_obj.pk = None + file_obj.id = None + file_obj.save() + file_obj.folder = destination + file_obj._file_data_changed_hint = False # no need to update size, sha1, etc. + file_obj.file = file_obj._copy_file(filename) + file_obj.original_filename = self._generate_new_filename(file_obj.original_filename, suffix) + file_obj.save() + + def _copy_files(self, files, destination, suffix, overwrite): + + +## ... source file abbreviated to get to render examples ... + + + selected_destination_folder = int(request.POST.get('destination', 0)) + except ValueError: + if current_folder: + selected_destination_folder = current_folder.pk + else: + selected_destination_folder = 0 + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Copy files and/or folders"), + "instance": current_folder, + "breadcrumbs_action": _("Copy files and/or folders"), + "to_copy": to_copy, + "destination_folders": folders, + "selected_destination_folder": selected_destination_folder, + "copy_form": form, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + +~~ return render(request, "admin/filer/folder/choose_copy_destination.html", context) + + copy_files_and_folders.short_description = ugettext_lazy("Copy selected files and/or folders") + + def _check_resize_perms(self, request, files_queryset, folders_queryset): + try: + check_files_read_permissions(request, files_queryset) + check_folder_read_permissions(request, folders_queryset) + check_files_edit_permissions(request, files_queryset) + except PermissionDenied: + return True + return False + + def _list_folders_to_resize(self, request, folders): + for fo in folders: + children = list(self._list_folders_to_resize(request, fo.children.all())) + children.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(fo.files) if isinstance(f, Image)]) + if children: + yield self._format_callback(fo, request.user, self.admin_site, set()) + yield children + + def _list_all_to_resize(self, request, files_queryset, folders_queryset): + to_resize = list(self._list_folders_to_resize(request, folders_queryset)) + to_resize.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(files_queryset) if isinstance(f, Image)]) + return to_resize + + +## ... source file abbreviated to get to render examples ... + + + form.cleaned_data['upscale'] = form.cleaned_data['thumbnail_option'].upscale + if files_queryset.count() + folders_queryset.count(): + n = self._resize_images_impl(files_queryset, folders_queryset, form.cleaned_data) + self.message_user(request, _("Successfully resized %(count)d images.") % {"count": n, }) + return None + else: + form = ResizeImagesForm() + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Resize images"), + "instance": current_folder, + "breadcrumbs_action": _("Resize images"), + "to_resize": to_resize, + "resize_form": form, + "cmsplugin_enabled": 'cmsplugin_filer_image' in django_settings.INSTALLED_APPS, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + +~~ return render(request, "admin/filer/folder/choose_images_resize_options.html", context) + + resize_images.short_description = ugettext_lazy("Resize selected images") + + + +## ... source file continues with no further render examples... + +``` + + +## Example 6 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / admin.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./admin.py) + +```python +# admin.py +from collections import OrderedDict + +from django import forms +from django.conf import settings +from django.contrib import admin, messages +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth import get_user_model +~~from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse, path +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext +from guardian.forms import GroupObjectPermissionsForm, UserObjectPermissionsForm +from django.contrib.auth.models import Group +from guardian.shortcuts import (get_group_perms, get_groups_with_perms, get_perms_for_model, get_user_perms, + get_users_with_perms) + + +class AdminUserObjectPermissionsForm(UserObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class AdminGroupObjectPermissionsForm(GroupObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class GuardedModelAdminMixin: + change_form_template = \ + 'admin/guardian/model/change_form.html' + + +## ... source file abbreviated to get to render examples ... + + + request)(request.POST) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + if group_form.is_valid(): + group_id = group_form.cleaned_data['group'].id + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group_id] + ) + return redirect(url) + else: + user_form = self.get_obj_perms_user_select_form(request)() + group_form = self.get_obj_perms_group_select_form(request)() + + context = self.get_obj_perms_base_context(request, obj) + context['users_perms'] = users_perms + context['groups_perms'] = groups_perms + context['user_form'] = user_form + context['group_form'] = group_form + + request.current_app = self.admin_site.name + +~~ return render(request, self.get_obj_perms_manage_template(), context) + + def get_obj_perms_manage_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage.html' + return self.obj_perms_manage_template + + def obj_perms_manage_user_view(self, request, object_pk, user_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + user = get_object_or_404(get_user_model(), pk=user_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_user_form(request) + form = form_class(user, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user.pk] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['user_obj'] = user + context['user_perms'] = get_user_perms(user, obj) + context['form'] = form + + request.current_app = self.admin_site.name + +~~ return render(request, self.get_obj_perms_manage_user_template(), context) + + def get_obj_perms_manage_user_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + return self.obj_perms_manage_user_template + + def get_obj_perms_user_select_form(self, request): + return UserManage + + def get_obj_perms_group_select_form(self, request): + return GroupManage + + def get_obj_perms_manage_user_form(self, request): + return AdminUserObjectPermissionsForm + + def obj_perms_manage_group_view(self, request, object_pk, group_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + group = get_object_or_404(Group, id=group_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_group_form(request) + form = form_class(group, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group.id] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['group_obj'] = group + context['group_perms'] = get_group_perms(group, obj) + context['form'] = form + + request.current_app = self.admin_site.name + +~~ return render(request, self.get_obj_perms_manage_group_template(), context) + + def get_obj_perms_manage_group_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_group.html' + return self.obj_perms_manage_group_template + + def get_obj_perms_manage_group_form(self, request): + return AdminGroupObjectPermissionsForm + + +class GuardedModelAdmin(GuardedModelAdminMixin, admin.ModelAdmin): + + +class UserManage(forms.Form): + user = forms.CharField(label=_("User identification"), + max_length=200, + error_messages={'does_not_exist': _( + "This user does not exist")}, + help_text=_( + 'Enter a value compatible with User.USERNAME_FIELD') + ) + + def clean_user(self): + identification = self.cleaned_data['user'] + + +## ... source file continues with no further render examples... + +``` + + +## Example 7 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / admin.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./admin.py) + +```python +# admin.py +from django.contrib.admin.options import ModelAdmin, csrf_protect_m +from django.contrib.admin.views.main import SEARCH_VAR, ChangeList +from django.core.exceptions import PermissionDenied +from django.core.paginator import InvalidPage, Paginator +~~from django.shortcuts import render +from django.utils.encoding import force_str +from django.utils.translation import ungettext + +from haystack import connections +from haystack.constants import DEFAULT_ALIAS +from haystack.query import SearchQuerySet +from haystack.utils import get_model_ct_tuple + + +class SearchChangeList(ChangeList): + def __init__(self, **kwargs): + self.haystack_connection = kwargs.pop("haystack_connection", DEFAULT_ALIAS) + super(SearchChangeList, self).__init__(**kwargs) + + def get_results(self, request): + if SEARCH_VAR not in request.GET: + return super(SearchChangeList, self).get_results(request) + + sqs = ( + SearchQuerySet(self.haystack_connection) + .models(self.model) + .auto_query(request.GET[SEARCH_VAR]) + .load_all() + ) + + +## ... source file abbreviated to get to render examples ... + + + "%(total_count)s selected", + "All %(total_count)s selected", + changelist.result_count, + ) + + context = { + "module_name": force_str(self.model._meta.verbose_name_plural), + "selection_note": selection_note % {"count": len(changelist.result_list)}, + "selection_note_all": selection_note_all + % {"total_count": changelist.result_count}, + "title": changelist.title, + "is_popup": changelist.is_popup, + "cl": changelist, + "media": media, + "has_add_permission": self.has_add_permission(request), + "opts": changelist.opts, + "app_label": self.model._meta.app_label, + "action_form": action_form, + "actions_on_top": self.actions_on_top, + "actions_on_bottom": self.actions_on_bottom, + "actions_selection_counter": getattr(self, "actions_selection_counter", 0), + } + context.update(extra_context or {}) + request.current_app = self.admin_site.name + app_name, model_name = get_model_ct_tuple(self.model) +~~ return render( + request, + self.change_list_template + or [ + "admin/%s/%s/change_list.html" % (app_name, model_name), + "admin/%s/change_list.html" % app_name, + "admin/change_list.html", + ], + context, + ) + + +class SearchModelAdmin(SearchModelAdminMixin, ModelAdmin): + pass + + + +## ... source file continues with no further render examples... + +``` + + +## Example 8 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / views / base.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/views/base.py) + +```python +# base.py +import json +import logging +import urllib.parse + +from django.contrib.auth.mixins import LoginRequiredMixin +from django.http import HttpResponse, JsonResponse +~~from django.shortcuts import render +from django.urls import reverse +from django.utils import timezone +from django.utils.decorators import method_decorator +from django.views.decorators.csrf import csrf_exempt +from django.views.decorators.debug import sensitive_post_parameters +from django.views.generic import FormView, View + +from ..exceptions import OAuthToolkitError +from ..forms import AllowForm +from ..http import OAuth2ResponseRedirect +from ..models import get_access_token_model, get_application_model +from ..scopes import get_scopes_backend +from ..settings import oauth2_settings +from ..signals import app_authorized +from .mixins import OAuthLibMixin + + +log = logging.getLogger("oauth2_provider") + + +class BaseAuthorizationView(LoginRequiredMixin, OAuthLibMixin, View): + + def dispatch(self, request, *args, **kwargs): + self.oauth2_data = {} + + +## ... source file abbreviated to get to render examples ... + + + return self.error_response(error, application) + + return self.render_to_response(self.get_context_data(**kwargs)) + + def redirect(self, redirect_to, application, token=None): + + if not redirect_to.startswith("urn:ietf:wg:oauth:2.0:oob"): + return super().redirect(redirect_to, application) + + parsed_redirect = urllib.parse.urlparse(redirect_to) + code = urllib.parse.parse_qs(parsed_redirect.query)["code"][0] + + if redirect_to.startswith("urn:ietf:wg:oauth:2.0:oob:auto"): + + response = { + "access_token": code, + "token_uri": redirect_to, + "client_id": application.client_id, + "client_secret": application.client_secret, + "revoke_uri": reverse("oauth2_provider:revoke-token"), + } + + return JsonResponse(response) + + else: +~~ return render( + request=self.request, + template_name="oauth2_provider/authorized-oob.html", + context={ + "code": code, + }, + ) + + +@method_decorator(csrf_exempt, name="dispatch") +class TokenView(OAuthLibMixin, View): + server_class = oauth2_settings.OAUTH2_SERVER_CLASS + validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS + oauthlib_backend_class = oauth2_settings.OAUTH2_BACKEND_CLASS + + @method_decorator(sensitive_post_parameters("password")) + def post(self, request, *args, **kwargs): + url, headers, body, status = self.create_token_response(request) + if status == 200: + access_token = json.loads(body).get("access_token") + if access_token is not None: + token = get_access_token_model().objects.get( + token=access_token) + app_authorized.send( + sender=self, request=request, + + +## ... source file continues with no further render examples... + +``` + + +## Example 9 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / views.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./views.py) + +```python +# views.py +import re +import six +from collections import Counter + +try: + from django.urls import reverse_lazy +except ImportError: + from django.core.urlresolvers import reverse_lazy + +import django +from django.db import DatabaseError +from django.db.models import Count +from django.forms.models import model_to_dict +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect, Http404 +~~from django.shortcuts import get_object_or_404, render +from django.views.decorators.http import require_POST +from django.utils.decorators import method_decorator +from django.views.generic import ListView +from django.views.generic.base import View +from django.views.generic.edit import CreateView, DeleteView +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.core.exceptions import ImproperlyConfigured +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.views import LoginView + +from explorer import app_settings +from explorer.connections import connections +from explorer.exporters import get_exporter_class +from explorer.forms import QueryForm +from explorer.models import Query, QueryLog, MSG_FAILED_BLACKLIST +from explorer.tasks import execute_query +from explorer.utils import ( + url_get_rows, + url_get_query_id, + url_get_log_id, + url_get_params, + safe_login_prompt, + fmt_sql, + allowed_query_pks, + url_get_show, + url_get_fullscreen +) + +from explorer.schema import schema_info +from explorer import permissions + + +class ExplorerContextMixin(object): + + def gen_ctx(self): + return {'can_view': app_settings.EXPLORER_PERMISSION_VIEW(self.request.user), + 'can_change': app_settings.EXPLORER_PERMISSION_CHANGE(self.request.user)} + + def get_context_data(self, **kwargs): + ctx = super(ExplorerContextMixin, self).get_context_data(**kwargs) + ctx.update(self.gen_ctx()) + return ctx + + def render_template(self, template, ctx): + ctx.update(self.gen_ctx()) +~~ return render(self.request, template, ctx) + + +class PermissionRequiredMixin(object): + + permission_required = None + + def get_permission_required(self): + if self.permission_required is None: + raise ImproperlyConfigured( + '{0} is missing the permission_required attribute. Define {0}.permission_required, or override ' + '{0}.get_permission_required().'.format(self.__class__.__name__) + ) + return self.permission_required + + def has_permission(self, request, *args, **kwargs): + perms = self.get_permission_required() + handler = getattr(permissions, perms) # TODO: fix the case when the perms is + return handler(request, *args, **kwargs) + + def handle_no_permission(self, request): + return SafeLoginView.as_view( + extra_context={'title': 'Log in', REDIRECT_FIELD_NAME: request.get_full_path()})(request) + + def dispatch(self, request, *args, **kwargs): + + +## ... source file abbreviated to get to render examples ... + + + + permission_required = 'view_permission' + + def post(self, request, query_id, *args, **kwargs): + if request.is_ajax(): + email = request.POST.get('email', None) + if email: + execute_query.delay(query_id, email) + return JsonResponse({'message': 'message was sent successfully'}) + return JsonResponse({}, status=403) + + +class SchemaView(PermissionRequiredMixin, View): + permission_required = 'change_permission' + + @method_decorator(xframe_options_sameorigin) + def dispatch(self, *args, **kwargs): + return super(SchemaView, self).dispatch(*args, **kwargs) + + def get(self, request, *args, **kwargs): + connection = kwargs.get('connection') + if connection not in connections: + raise Http404 + schema = schema_info(connection) + if schema: +~~ return render(None, 'explorer/schema.html', + {'schema': schema_info(connection)}) + else: +~~ return render(None, 'explorer/schema_building.html') + + +@require_POST +def format_sql(request): + sql = request.POST.get('sql', '') + formatted = fmt_sql(sql) + return JsonResponse({"formatted": formatted}) + + +class ListQueryView(PermissionRequiredMixin, ExplorerContextMixin, ListView): + + permission_required = 'view_permission_list' + + def recently_viewed(self): + qll = QueryLog.objects.filter(run_by_user=self.request.user, query_id__isnull=False).order_by( + '-run_at').select_related('query') + ret = [] + tracker = [] + for ql in qll: + if len(ret) == app_settings.EXPLORER_RECENT_QUERY_COUNT: + break + + if ql.query_id not in tracker: + ret.append(ql) + + +## ... source file abbreviated to get to render examples ... + + +class PlayQueryView(PermissionRequiredMixin, ExplorerContextMixin, View): + + permission_required = 'change_permission' + + def get(self, request): + if url_get_query_id(request): + query = get_object_or_404(Query, pk=url_get_query_id(request)) + return self.render_with_sql(request, query, run_query=False) + + if url_get_log_id(request): + log = get_object_or_404(QueryLog, pk=url_get_log_id(request)) + query = Query(sql=log.sql, title="Playground", connection=log.connection) + return self.render_with_sql(request, query) + + return self.render() + + def post(self, request): + sql = request.POST.get('sql') + show = url_get_show(request) + query = Query(sql=sql, title="Playground", connection=request.POST.get('connection')) + passes_blacklist, failing_words = query.passes_blacklist() + error = MSG_FAILED_BLACKLIST % ', '.join(failing_words) if not passes_blacklist else None + run_query = not bool(error) if show else False + return self.render_with_sql(request, query, run_query=run_query, error=error) + +~~ def render(self): + return self.render_template('explorer/play.html', {'title': 'Playground', 'form': QueryForm()}) + + def render_with_sql(self, request, query, run_query=True, error=None): + rows = url_get_rows(request) + fullscreen = url_get_fullscreen(request) + template = 'fullscreen' if fullscreen else 'play' + form = QueryForm(request.POST if len(request.POST) else None, instance=query) + return self.render_template('explorer/%s.html' % template, query_viewmodel(request.user, + query, + title="Playground", + run_query=run_query, + error=error, + rows=rows, + form=form)) + + +class QueryView(PermissionRequiredMixin, ExplorerContextMixin, View): + + permission_required = 'view_permission' + + def get(self, request, query_id): + query, form = QueryView.get_instance_and_form(request, query_id) + query.save() # updates the modified date + show = url_get_show(request) + + +## ... source file continues with no further render examples... + +``` + + +## Example 10 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / accounts.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/accounts.py) + +```python +# accounts.py +from django.conf import settings as django_settings +from django.contrib import messages +from django.contrib.auth import get_user_model +from django.contrib.auth import login as auth_login +from django.contrib.auth import logout as auth_logout +from django.contrib.auth.forms import AuthenticationForm +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +~~from django.shortcuts import render +from django.urls import reverse +from django.utils.translation import gettext as _ +from django.views.generic import CreateView +from django.views.generic import FormView +from django.views.generic import UpdateView +from django.views.generic import View +from wiki import forms +from wiki.conf import settings + +User = get_user_model() + + +class Signup(CreateView): + model = User + form_class = forms.UserCreationForm + template_name = "wiki/accounts/signup.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_anonymous and not request.user.is_superuser: + return redirect("wiki:root") + if not settings.ACCOUNT_HANDLING: + return redirect(settings.SIGNUP_URL) + if not request.user.is_superuser and not settings.ACCOUNT_SIGNUP_ALLOWED: + c = {"error_msg": _("Account signup is only allowed for administrators.")} +~~ return render(request, "wiki/error.html", context=c) + + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["honeypot_class"] = context["form"].honeypot_class + context["honeypot_jsfunction"] = context["form"].honeypot_jsfunction + return context + + def get_success_url(self, *args): + messages.success( + self.request, _("You are now signed up... and now you can sign in!") + ) + return reverse("wiki:login") + + +class Logout(View): + def dispatch(self, request, *args, **kwargs): + if not settings.ACCOUNT_HANDLING: + return redirect(settings.LOGOUT_URL) + return super().dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + auth_logout(request) + + +## ... source file continues with no further render examples... + +``` + + +## Example 11 from dmd-interpreter +[dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) +([running web app](http://www.dmd.nl/DOVE)) +is a Python tool to aggregate clinically relevant information related +to variants in the DMD gene and display that [data](/data.html) to a user +with a [Django](/django.html) web application. + +[**dmd-interpreter / interpreter / views.py**](https://github.com/mitchalexbailey/dmd-interpreter/blob/master/interpreter/./views.py) + +```python +# views.py +~~from django.shortcuts import get_object_or_404, render +from django.http import HttpResponseRedirect, HttpResponse +from django.template import RequestContext, loader +from django.core.urlresolvers import reverse +from .forms import IndexForm, ACMGForm + +from interpreter_functions import * +import os,sys +import subprocess +import csv +import re +import pprint + +interpreter_dir = os.path.dirname(__file__) + +def index(request): + if request.method == "POST": + user = request.POST.get('user', None) +~~ return render(request, 'index.html') + + +def results(request): + if request.method == 'POST': + mut = request.POST.get('mutation', None) + + ucsc_info = [12, 'NM_004006', 'chrX', '-', 31137344, 33229673, 31140035, 33229429, 79, '31137344,31144758,31152218,31164407,31165391,31187559,31190464,31191655,31196048,31196785,31198486,31200854,31222077,31224698,31227614,31241163,31279071,31341714,31366672,31462597,31496222,31497099,31514904,31525397,31645789,31676106,31697491,31747747,31792076,31838091,31854834,31893307,31947712,31950196,31986455,32235032,32305645,32328198,32360216,32361250,32364059,32366522,32380904,32382698,32383136,32398626,32404426,32407617,32408187,32429868,32456357,32459296,32466572,32472778,32481555,32482702,32486614,32490280,32503035,32509393,32519871,32536124,32563275,32583818,32591646,32591861,32613873,32632419,32662248,32663080,32715986,32717228,32827609,32834584,32841411,32862899,32867844,33038255,33229398,', '31140047,31144790,31152311,31164531,31165635,31187718,31190530,31191721,31196087,31196922,31198598,31201021,31222235,31224784,31227816,31241238,31279133,31341775,31366751,31462744,31496491,31497220,31515061,31525570,31645979,31676261,31697703,31747865,31792309,31838200,31854939,31893490,31947862,31950344,31986631,32235180,32305818,32328393,32360399,32361403,32364197,32366645,32381075,32382827,32383316,32398797,32404582,32407791,32408298,32430030,32456507,32459431,32466755,32472949,32481711,32482816,32486827,32490426,32503216,32509635,32519959,32536248,32563451,32583998,32591754,32591963,32613993,32632570,32662430,32663269,32716115,32717410,32827728,32834757,32841504,32862977,32867937,33038317,33229673,', 0, 'DMD', 'cmpl', 'cmpl', '0,1,1,0,2,2,2,2,2,0,2,0,1,2,1,1,2,1,0,0,1,0,2,0,2,0,1,0,1,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,1,0,'] + + + + f = open(os.path.join(interpreter_dir, "rescue_esesites.txt")) + ese_sites = [] + for line in f: + temp = '' + for char in line: + if char != "\n": + temp += char + temp = ''.join(temp) + ese_sites += [temp] + f.close() + + f = open(os.path.join(interpreter_dir, "esssites.txt")) + ess_sites = [] + for line in f: + + +## ... source file abbreviated to get to render examples ... + + + provean = 'Not missense' + metasvm = 'Not missense' + nsfp_score = '' + nsfp_message = '' + cv = '' + consequence = '' + consequence_statement = '' + ese_message = '' + esefinder = '' + rescueese = '' + ess_message = '' + splice_message = '' + splice_message2 = '' + motif_message = '' + ds = '' + splice_result = [] + long_aa_change = [] + readthrough_elig = "Not eligible" + + ex_input = exoninput(mut) + mutype, search = type_inp(mut, ex_input) + num_list, intron_list = parse(mut, mutype, exon_positions, ex_input) + + + if mutype == "Invalid mutation" and len(num_list) == 0: +~~ return render(request, 'index.html',{'success':False}) + else: + pass + + + for num in num_list: + if int(num) > 3685*3 and not ex_input: #AA length *3 + past_max = True + elif int(num) > len_ref: + past_max = True + else: + pass + + + intron_only = intron_count(intron_list, num_list) + + + if (mutype == "Deletion" or mutype == "Duplication") and "c." not in mut and len(num_list) > 0 and not ex_input and "Nucleotide" not in mut: + if max(num_list) < 80 and not ex_input: + with open(os.path.join(interpreter_dir, 'templates/triage.html'), 'w') as g: + num_list = re.findall("\d+", mut) + g.write("""

    You entered: '""") + g.write(mut) + g.write("""'


    Did you mean...

    '""") + temp = '' + temp += mutype + if len(num_list) == 1: + temp += " of exon " + temp += str(num_list[0]) + if len(num_list) > 1: + temp += " of exons " + temp += str(min(num_list)) + temp += "-" + temp += str(max(num_list)) + g.write(temp) + g.write("""'?


    {% csrf_token %}{% csrf_token %}
    """) + g.closed +~~ return render(request, 'index.html', {'triage':True}) + + + + if past_max or mutype == "Invalid mutation": + with open(os.path.join(interpreter_dir, 'templates/triage.html'), 'w') as g: + g.write("""

    You entered: '""") + g.write(mut) + g.write("""'

    Did you mean...
    """) + + if past_max: + g.write(("""

    A smaller number?


    You entered: %s""" % str(max(num_list))) + """
    Which is larger than the length of the DMD, Dp427m coding sequence (11055 nt)

    Please enter your revised mutation below, or return to the previous page to try the "Exon deletion selector" feature.

    {% csrf_token %}

    """) + + if mutype == "Invalid mutation" and not past_max and len(num_list)>0:# and not ex_input: + tridel = "Deletion of Nucleotide(s) " + tridelex = "Deletion of Exon(s) " + tridup = "Duplication of Nucleotide(s) " + tridupex = "Duplication of Exon(s) " + triins = "Insertion at Nucleotide position(s) " + tridelins = "Deletion/Insertion at Nucleotide position(s) " + tripoint = "Point mutation at Nucleotide position(s) " + if len(num_list) == 1: + tridel += str(num_list[0]) + tridup += str(num_list[0]) + tridelex += str(num_list[0]) + + +## ... source file abbreviated to get to render examples ... + + + + g.write("

    ") + + g.write("
    ") + + g.write("
    ") + + g.write("
    """) + + g.closed +~~ return render(request, 'index.html', {'triage':True}) + + if mutype != "Invalid mutation" and len(num_list) == 0 and not intron_only: + with open(os.path.join(interpreter_dir, 'templates/triage.html'), 'w') as g: + g.write("""

    You entered: '""") + g.write(mut) + g.write("'



    This mutation type (") + g.write(mutype) + g.write(""") requires a position to be interpreted.



    Please complete the mutation in the box below, or return to the previous page to try the "Exon deletion selector" feature.

    {% csrf_token %}
    *Note that the symbol '>' denotes point mutation*

    """) + g.closed +~~ return render(request, 'index.html', {'triage':True}) + + if not past_max and mutype != "Invalid mutation": # and len(num_list) != 0: + if intron_only: + missense = False + nonsense = False + silent = True + frame_shift = False + length_mutation, pm_change, pm_pre = get_length(mut, mutype, num_list, mut, ex_input, reference_cdna) + positions_in_genomic1, positions_in_genomic2, positions_in_genomic3 = cdna2gen(num_list, exon_positions, genomic_positions1, genomic_positions2, genomic_positions3, intron_list) + ghgvs, ghgvs19 = HGVS(positions_in_genomic2, positions_in_genomic3, mutype, search, length_mutation, ex_input, [[],[]], pm_change, pm_pre, True) + + + if mutype == "Point mutation" and len(pm_pre) == 0: + if mutype == "Point mutation" or mutype == "Deletion/Insertion": + if len(num_list) == 1: + pm_pre = genomic_dna[min(positions_in_genomic1)] + if len(num_list)>1: + pm_pre = genomic_dna[min(positions_in_genomic1):max(positions_in_genomic1)] + else: + if len(num_list) == 1: + pm_change = genomic_dna[min(positions_in_genomic1)] + if len(num_list)>1 and length_mutation < 4: + pm_change = genomic_dna[min(positions_in_genomic1):max(positions_in_genomic1)] + cDNA, mut_genomic_dna = alter_cDNA(reference_cdna, num_list, positions_in_genomic1, length_mutation, mutype, pm_change, genomic_dna, intron_only) + + +## ... source file abbreviated to get to render examples ... + + + if mutype == "Deletion" or mutype == "Duplication": + if len(num_list) == 1: + pm_change = genomic_dna[min(positions_in_genomic1)] + if len(num_list)>1 and length_mutation < 4: + pm_change = genomic_dna[min(positions_in_genomic1)-1:max(positions_in_genomic1)] + cDNA, mut_genomic_dna = alter_cDNA(reference_cdna, num_list, positions_in_genomic1, length_mutation, mutype, pm_change, genomic_dna, intron_only) + if ("Insertion" in mutype or mutype == "Point mutation") and len(pm_change) == 0: + with open(os.path.join(interpreter_dir, 'templates/triage.html'), 'w') as g: + g.write("""

    You entered: '""") + g.write(mut) + g.write("""'

    This mutation type requires that you input the inserted nucleotides (i.e. an A, T, G, C or combination thereof).



    Please add the inserted bases in the box below, or return to the previous page to try the "Exon deletion selector" feature.

    {% csrf_token %}

    """) + g.closed +~~ return render(request, 'index.html', {'triage':True}) + frame_shift = frame(length_mutation, mutype, num_list) + exon_numbers = [] + exon_ints = [] + if (mutype == "Deletion" or mutype == "Duplication"): + exon_numbers, part = exons(num_list, exon_positions, ex_input, mut, part) + if len(exon_numbers) != 0: + for item in exon_numbers: + exon_ints += [int(item)] + temp = str(exon_numbers[0]), "-", str(exon_numbers[len(exon_numbers)-1]) + temp = ''.join(temp) + standard_hgvs, catcher = HGVS(num_list, num_list, mutype, search, length_mutation, ex_input, intron_list, pm_change, pm_pre) + mv_results = myVariantSearch(standard_hgvs) + CV = ClinVar(mv_results, standard_hgvs) + aa_ref = translate(reference_cdna[244:]) + nsfp_results, path_pred = gen_point(positions_in_genomic1, complement(pm_change), intron_only, length_mutation, NSFP) + + if mutype == "Deletion" and len(num_list) != 0: + cDNA, mut_genomic_dna = alter_cDNA(reference_cdna, num_list, positions_in_genomic1, length_mutation, mutype, pm_change, genomic_dna, intron_only) + aa_seq = translate(cDNA[244:]) + if frame_shift == False: + aa_length = (length_mutation)/3 + i = 0 + filler = '' + while i < aa_length: + + +## ... source file abbreviated to get to render examples ... + + + + + if len(posskip)>0 and frame_shift: + if part == True: + posskip = [] + if part and ex_input: + print part + posskip = [] + posskip += ["This variant includes a partial exon deletion."] + elif not frame_shift: + posskip = [] + posskip += ["There is no frameshift predicted."] + elif length_mutation < 32: + posskip = [] + posskip += ["This variant type (missense; nonsense; small insertion, deletion, indel; or splice-affecting) has not been clinically tested in DMD with exon skip therapy."] + elif len(posskip) == 0 and length_mutation >= 32: + posskip += ["There are no theoretical exon skips predicted to apply to this mutation."] + + if nonsense and not frame_shift: + readthrough_elig = "Eligible" + else: + pass + + + else: +~~ return render(request, 'index.html',{'success':False}) + + + if mutype != "Deletion" and mutype != "Deletion/Insertion" and mutype != "Duplication" and not intron_only: + temp_cdna = "",cDNA[0:min(num_list)+243],"",cDNA[min(num_list)+243:min(num_list)+243+length_mutation],"",cDNA[max(num_list)+243+length_mutation:len(cDNA)],"" + if mutype == "Point mutation (insertion)": + temp_cdna = "",cDNA[0:max(num_list)+244],"",cDNA[max(num_list)+244:max(num_list)+244+length_mutation],"",cDNA[max(num_list)+244+length_mutation:len(cDNA)],"" + if mutype == "Duplication" and not intron_only: + temp_cdna = "",cDNA[0:min(num_list)+244],"",cDNA[min(num_list)+244:min(num_list)+244+(length_mutation)],"",cDNA[min(num_list)+244+(length_mutation):min(num_list)+244+(length_mutation*2)],"",cDNA[min(num_list)+244+(length_mutation*2):len(cDNA)],"" + if mutype == "Insertion" and not intron_only: + temp_cdna = "",cDNA[0:min(num_list)+243],"",cDNA[min(num_list)+244:min(num_list)+244+length_mutation],"",cDNA[max(num_list)+244+length_mutation:len(cDNA)],"" + if mutype == "Deletion" and not intron_only: + fill = '' + i = 0 + while i",fill,"",cDNA[min(num_list)+244:len(cDNA)],"" + if intron_only: + temp_refcdna = "",reference_cdna,"" + temp_cdna = temp_refcdna + refcdna_for_print = ''.join(temp_refcdna) + if mutype == "Deletion/Insertion" and not intron_only: + i = 0 + fill = '' + + +## ... source file abbreviated to get to render examples ... + + + standard_hgvs_search = ''.join(standard_hgvs_search) + leiden_link ="https://databases.lovd.nl/shared/variants/DMD/unique?search_var_status=%3D%22Marked%22%7C%3D%22Public%22#object_id=VariantOnTranscriptUnique%2CVariantOnGenome&id=DMD&order=VariantOnTranscript%2FDNA%2CASC&skip[chromosome]=chromosome&skip[allele_]=allele_&skip[transcriptid]=transcriptid&search_transcriptid=00000024&skip[owner_countryid]=owner_countryid&FRMatchType_CustomVL_VOTunique_VOG_DMD=1&FRMatchType_CustomVL_VOTunique_VOG_DMD=2&FRMatchType_CustomVL_VOTunique_VOG_DMD=3&FRReplaceAll_CustomVL_VOTunique_VOG_DMD=1&=Preview&=Cancel&=Submit&search_VariantOnTranscript/DNA="+standard_hgvs_search + iframe = "" + elif length_mutation > 30 and mutype != "Deletion/Insertion": + leiden_link = "https://databases.lovd.nl/shared/variants/DMD/unique?search_var_status=%3D%22Marked%22%7C%3D%22Public%22#object_id=VariantOnTranscriptUnique%2CVariantOnGenome&id=DMD&order=VariantOnTranscript%2FDNA%2CASC&skip[chromosome]=chromosome&skip[allele_]=allele_&skip[transcriptid]=transcriptid&search_transcriptid=00000024&skip[owner_countryid]=owner_countryid&FRMatchType_CustomVL_VOTunique_VOG_DMD=1&FRMatchType_CustomVL_VOTunique_VOG_DMD=2&FRMatchType_CustomVL_VOTunique_VOG_DMD=3&FRReplaceAll_CustomVL_VOTunique_VOG_DMD=1&=Preview&=Cancel&=Submit&search_VariantOnTranscript/DNA="+search_nums+"%20"+search + iframe = "" + elif length_mutation < 30 and mutype != "Point mutation": + leiden_link = "https://databases.lovd.nl/shared/variants/DMD/unique?search_var_status=%3D%22Marked%22%7C%3D%22Public%22#object_id=VariantOnTranscriptUnique%2CVariantOnGenome&id=DMD&order=VariantOnTranscript%2FDNA%2CASC&skip[chromosome]=chromosome&skip[allele_]=allele_&skip[transcriptid]=transcriptid&search_transcriptid=00000024&skip[owner_countryid]=owner_countryid&FRMatchType_CustomVL_VOTunique_VOG_DMD=1&FRMatchType_CustomVL_VOTunique_VOG_DMD=2&FRMatchType_CustomVL_VOTunique_VOG_DMD=3&FRReplaceAll_CustomVL_VOTunique_VOG_DMD=1&=Preview&=Cancel&=Submit&search_VariantOnTranscript/DNA="+standard_hgvs_search + iframe = "" + else: + leiden_link = "https://databases.lovd.nl/shared/variants/DMD/unique?search_var_status=%3D%22Marked%22%7C%3D%22Public" + iframe = "" + + if nsfp_score == '': + nsfp_score = 'N/A' + else: + pass + + try: + mv_results = mv_results[0] + mv_results_formatted = pprint.pformat(mv_results, indent=4) + mv_disable = False + except: + mv_results_formatted = "No myVariantInfo results available" + mv_disable = True +~~ return render(request, 'main.html', + {'user_inp':mut, + 'mutype':mutype, + 'hgvs':standard_hgvs, + 'ghgvs':ghgvs, + 'ghgvs19':ghgvs19, + 'length_mutation':length_mutation, + 'exons': exon_numbers, + 'domains':ds, + 'therapy':therapy, + 'insilico_message':insilico_message, + 'splice_message':splice_message, + 'ese_message':ese_message, + 'consequence':consequence, + 'consequence_message':consequence_statement, + 'cv':cv, + 'leiden_link':leiden_link, + 'leiden_frame':iframe, + 'cdna_for_print':cdna_for_print, #full mutated sequence + 'cdna_print_preview':cdna_print_preview, #partial mutated + 'refcdna_for_print':refcdna_for_print, #full wt cdna + 'refcdna_print_preview':refcdna_print_preview, #wt preview + 'readthrough_elig':readthrough_elig, + 'posskip':posskip, #list of skips (empty if there are none) + 'sift':sift, + + +## ... source file continues with no further render examples... + +``` + diff --git a/content/pages/examples/django/django-shortcuts-resolve-url.markdown b/content/pages/examples/django/django-shortcuts-resolve-url.markdown new file mode 100644 index 000000000..b090f13f9 --- /dev/null +++ b/content/pages/examples/django/django-shortcuts-resolve-url.markdown @@ -0,0 +1,135 @@ +title: django.shortcuts resolve_url Example Code +category: page +slug: django-shortcuts-resolve-url-examples +sortorder: 500011349 +toc: False +sidebartitle: django.shortcuts resolve_url +meta: Python example code for the resolve_url callable from the django.shortcuts module of the Django project. + + +resolve_url is a callable within the django.shortcuts module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / adapter.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/adapter.py) + +```python +# adapter.py +from __future__ import unicode_literals + +import hashlib +import json +import time +import warnings + +from django import forms +from django.conf import settings +from django.contrib import messages +from django.contrib.auth import ( + authenticate, + get_backends, + login as django_login, + logout as django_logout, +) +from django.contrib.auth.models import AbstractUser +from django.contrib.auth.password_validation import validate_password +from django.contrib.sites.shortcuts import get_current_site +from django.core.cache import cache +from django.core.mail import EmailMessage, EmailMultiAlternatives +from django.http import HttpResponse, HttpResponseRedirect +~~from django.shortcuts import resolve_url +from django.template import TemplateDoesNotExist +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils import timezone +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +from ..utils import ( + build_absolute_uri, + email_address_exists, + generate_unique_username, + get_user_model, + import_attribute, +) +from . import app_settings + + +class DefaultAccountAdapter(object): + + error_messages = { + 'username_blacklisted': + _('Username can not be used. Please use other username.'), + 'username_taken': + AbstractUser._meta.get_field('username').error_messages['unique'], + + +## ... source file abbreviated to get to resolve_url examples ... + + + from_email, + [email]) + if 'html' in bodies: + msg.attach_alternative(bodies['html'], 'text/html') + else: + msg = EmailMessage(subject, + bodies['html'], + from_email, + [email]) + msg.content_subtype = 'html' # Main content is now text/html + return msg + + def send_mail(self, template_prefix, email, context): + msg = self.render_mail(template_prefix, email, context) + msg.send() + + def get_login_redirect_url(self, request): + assert request.user.is_authenticated + url = getattr(settings, "LOGIN_REDIRECT_URLNAME", None) + if url: + warnings.warn("LOGIN_REDIRECT_URLNAME is deprecated, simply" + " use LOGIN_REDIRECT_URL with a URL name", + DeprecationWarning) + else: + url = settings.LOGIN_REDIRECT_URL +~~ return resolve_url(url) + + def get_logout_redirect_url(self, request): +~~ return resolve_url(app_settings.LOGOUT_REDIRECT_URL) + + def get_email_confirmation_redirect_url(self, request): + if request.user.is_authenticated: + if app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL: + return \ + app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL + else: + return self.get_login_redirect_url(request) + else: + return app_settings.EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL + + def is_open_for_signup(self, request): + return True + + def new_user(self, request): + user = get_user_model()() + return user + + def populate_username(self, request, user): + from .utils import user_username, user_email, user_field + first_name = user_field(user, 'first_name') + last_name = user_field(user, 'last_name') + email = user_email(user) + username = user_username(user) + + +## ... source file continues with no further resolve_url examples... + +``` + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index a58c7399b..83b1b7f64 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -148,6 +148,17 @@

    django.http HttpResponsePermanentRedirect, HttpResponseRedirect

    +

    django.shortcuts + get_list_or_404, + get_object_or_404, + redirect, + render, + resolve_url +

    +

    django.template.response + SimpleTemplateResponse, + TemplateResponse +

    django.urls URLPattern, URLResolver, @@ -167,11 +178,6 @@

    django.urls.exceptions NoReverseMatch, Resolver404

    -

    django.utils.html format_html

    -

    django.template.response - SimpleTemplateResponse, - TemplateResponse -

    django.utils dateformat, dateparse, From 483f320769aed270c572cfe47630220e6bd30b72 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jul 2020 08:59:04 -0400 Subject: [PATCH 182/302] updating descriptions --- .../flask-signals-got-request-exception.markdown | 6 +++++- .../examples/flask/flask-signals-namespace.markdown | 11 ++++++++++- .../flask/flask-templating-render-template.markdown | 11 ++++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index 5cdf42512..64bfb260a 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -7,7 +7,11 @@ sidebartitle: flask.signals got_request_exception meta: Python example code that shows how to use the got_request_exception callable from the flask.signals module of the Flask project. -got_request_exception is a callable within the flask.signals module of the Flask project. +[got_request_exception](https://github.com/pallets/flask/blob/master/src/flask/signals.py) +is a signal defined in the [Flask](/flask.html) project's +`flask.signals` module that interrupts the WSGI flow when there is an +issue with the HTTP request. It can also be thrown by your own +view functions if there is an error and you want to raise it via a signal. ## Example 1 from flask-restx diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index 1e185442e..f2d968994 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -7,7 +7,16 @@ sidebartitle: flask.signals Namespace meta: Example code for understanding how to use the Namespace class from the flask.signals module of the Flask project. -Namespace is a class within the flask.signals module of the Flask project. +[Namespace](https://github.com/pallets/flask/blob/master/src/flask/signals.py) +is a class used within the `flask.signals` module, but it is +actually imported from the +[Blinker project](https://github.com/jek/blinker). Blinker +is a fast dispatching system for event subscriptions, also known as +"signals". [Flask](/flask.html) uses this library instead of +implementing its own event subscription signaling model. +[Namespace is defined within Blinker](https://github.com/jek/blinker/blob/master/blinker/base.py) +as a mapping of signal names to signals, and it serves the +same purpose in the Flask project. ## Example 1 from flask-login diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index bf2a668c6..cb0ef43aa 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -7,7 +7,16 @@ sidebartitle: flask.templating render_template meta: Python example code that shows how to use the render_template callable from the flask.templating module of the Flask project. -render_template is a callable within the flask.templating module of the Flask project. +[render_template](https://github.com/pallets/flask/blob/master/src/flask/templating.py) +is a [Flask](/flask.html) function from the `flask.templating` package. +`render_template` is used to generate output from a +[template file based on the Jinja2 engine](/template-engines.html) +that is found in the application's templates folder. + +Note that `render_template` is typically imported directly from the `flask` +package instead of from `flask.templating`. It is the same function that is +imported, but there are less characters to type when you leave off +the `.templating` part. ## Example 1 from Braintree Flask app From 93f09a59020ebcefea559296c0e34485a679e9f1 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jul 2020 11:10:18 -0400 Subject: [PATCH 183/302] update flask examples descriptions --- ...ask-templating-render-template-string.markdown | 15 ++++++++++++++- .../flask-templating-render-template.markdown | 5 +++++ .../flask/flask-views-methodview.markdown | 7 ++++++- .../examples/flask/flask-views-view.markdown | 8 +++++++- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 6006f3831..4144332d8 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -7,7 +7,20 @@ sidebartitle: flask.templating render_template_string meta: Python example code that shows how to use the render_template_string callable from the flask.templating module of the Flask project. -render_template_string is a callable within the flask.templating module of the Flask project. +[render_template_string](https://github.com/pallets/flask/blob/master/src/flask/templating.py) +is a [Flask](/flask.html) function from the `flask.templating` package. +`render_template` is used to generate output from a string +that is passed in rather than from a file in the templates folder. + +Note that `render_template_string` is sometimes imported from the `flask` +package instead of from `flask.templating`. It is the same function that is +imported, but there are less characters to type when you leave off +the `.templating` part. +Understanding the following concepts are useful when coding projects that use `render_template_string`: + + +* [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) +* [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) ## Example 1 from Flask-User diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index cb0ef43aa..dd2c6261c 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -17,6 +17,11 @@ Note that `render_template` is typically imported directly from the `flask` package instead of from `flask.templating`. It is the same function that is imported, but there are less characters to type when you leave off the `.templating` part. +Understanding the following concepts are useful when coding projects that use `render_template`: + + +* [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) +* [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) ## Example 1 from Braintree Flask app diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 7be8d78df..f6e60536c 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -7,7 +7,12 @@ sidebartitle: flask.views MethodView meta: Example code for understanding how to use the MethodView class from the flask.views module of the Flask project. -MethodView is a class within the flask.views module of the Flask project. +[MethodView](https://github.com/pallets/flask/blob/master/src/flask/views.py) +is a class within the `flask.views` module of the [Flask](/flask.html) +project. `MethodView` is a +[Python Metaclass](https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python) +that determines the methods, such as GET, POST, PUT, etc, that +a view defines. ## Example 1 from FlaskBB diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index d00a9cc54..8d60497ff 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -7,7 +7,13 @@ sidebartitle: flask.views View meta: Example code for understanding how to use the View class from the flask.views module of the Flask project. -View is a class within the flask.views module of the Flask project. +[View](https://github.com/pallets/flask/blob/master/src/flask/views.py) +is a class within the `flask.views` module of the [Flask](/flask.html) +project. `View` provides an alternative way to use view functions +by subclassing this class and implementing `dispatch_request` +for the routing system. This is typically only used in more advanced +situations such as extending the Flask source code, rather than +a standard way of interacting with the framework. ## Example 1 from FlaskBB From 37b15c48eb7034e5ee29cbc2dfece204970edc2d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jul 2020 12:37:12 -0400 Subject: [PATCH 184/302] adding related links to appropriate code examples --- content/pages/examples/flask/flask-app-badrequest.markdown | 6 ++++++ content/pages/examples/flask/flask-app-flask.markdown | 6 ++++++ content/pages/examples/flask/flask-app-headers.markdown | 6 ++++++ .../pages/examples/flask/flask-app-immutabledict.markdown | 6 ++++++ .../flask/flask-templating-render-template-string.markdown | 4 +++- .../flask/flask-templating-render-template.markdown | 4 +++- .../examples/flask/flask-views-http-method-funcs.markdown | 6 ++++++ .../pages/examples/flask/flask-views-methodview.markdown | 6 ++++++ content/pages/examples/flask/flask-views-view.markdown | 6 ++++++ 9 files changed, 48 insertions(+), 2 deletions(-) diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index ab24d4b57..8eab8d041 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -16,6 +16,12 @@ at runtime when an that accepts POSTs. +These topics are also useful while reading the `BadRequest` examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts + + ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 85fc5a7d8..599b6e5d0 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -15,6 +15,12 @@ application's functionality, including URL rounting, [template configurations](/template-engines.html), and handling view functions. +These subjects go along with the `Flask` code examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts + + ## Example 1 from Braintree Flask app [Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) demonstrates how to incorporate this payment provider's diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index 18cc60a3b..ca2b56bbb 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -18,6 +18,12 @@ from [requests](/flask-globals-request-examples.html) and responses for Flask web applications. +These topics are also useful while reading the `Headers` examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts + + ## Example 1 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 5521638d2..bebe63460 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -16,6 +16,12 @@ The `ImmutableDict` class wraps a so that values cannot be modified after initially being set. +These subjects go along with the `ImmutableDict` code examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts + + ## Example 1 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 4144332d8..7a3d30660 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -16,11 +16,13 @@ Note that `render_template_string` is sometimes imported from the `flask` package instead of from `flask.templating`. It is the same function that is imported, but there are less characters to type when you leave off the `.templating` part. -Understanding the following concepts are useful when coding projects that use `render_template_string`: +These topics are also useful while reading the `render_template_string` examples: + * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) +* [Cascading Style Sheets (CSS)](/cascading-style-sheets.html) and [web design](/web-design.html) ## Example 1 from Flask-User diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index dd2c6261c..113b4ddd4 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -17,11 +17,13 @@ Note that `render_template` is typically imported directly from the `flask` package instead of from `flask.templating`. It is the same function that is imported, but there are less characters to type when you leave off the `.templating` part. -Understanding the following concepts are useful when coding projects that use `render_template`: +These topics are also useful while reading the `render_template` examples: + * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) +* [Cascading Style Sheets (CSS)](/cascading-style-sheets.html) and [web design](/web-design.html) ## Example 1 from Braintree Flask app diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index d53bed7cb..882f5e562 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -15,6 +15,12 @@ which is useful for checking if an HTTP method is valid by comparing it against the items in this set. +These topics are also useful while reading the `http_method_funcs` examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) + + ## Example 1 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index f6e60536c..3bf523565 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -15,6 +15,12 @@ that determines the methods, such as GET, POST, PUT, etc, that a view defines. +These topics are also useful while reading the `MethodView` examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) + + ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 8d60497ff..d966b24b8 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -16,6 +16,12 @@ situations such as extending the Flask source code, rather than a standard way of interacting with the framework. +You should read up on these subjects along with these `View` examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) + + ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based From 6a85e116867af3b4487d3f597fcf47bd8ddb0456 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jul 2020 21:18:38 -0400 Subject: [PATCH 185/302] new django example code --- ...ib-staticfiles-finders-basefinder.markdown | 100 ++++++++ ...icfiles-finders-basestoragefinder.markdown | 72 ++++++ ...-contrib-staticfiles-finders-find.markdown | 107 ++++++++ ...b-staticfiles-finders-get-finders.markdown | 78 ++++++ ...jango-contrib-staticfiles-finders.markdown | 232 ++++++++++++++++++ ...files-handlers-staticfileshandler.markdown | 107 ++++++++ ...-storage-cachedstaticfilesstorage.markdown | 110 +++++++++ ...ticfiles-storage-hashedfilesmixin.markdown | 57 +++++ ...torage-manifeststaticfilesstorage.markdown | 102 ++++++++ ...files-storage-staticfiles-storage.markdown | 197 +++++++++++++++ ...cfiles-storage-staticfilesstorage.markdown | 118 +++++++++ ...jango-contrib-staticfiles-storage.markdown | 143 +++++++++++ ...taticfiles-utils-matches-patterns.markdown | 121 +++++++++ theme/templates/code-examples/django.html | 17 ++ 14 files changed, 1561 insertions(+) create mode 100644 content/pages/examples/django/django-contrib-staticfiles-finders-basefinder.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-finders-basestoragefinder.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-finders-find.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-finders-get-finders.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-finders.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-handlers-staticfileshandler.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage-cachedstaticfilesstorage.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage-hashedfilesmixin.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage-manifeststaticfilesstorage.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage-staticfiles-storage.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage-staticfilesstorage.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-utils-matches-patterns.markdown diff --git a/content/pages/examples/django/django-contrib-staticfiles-finders-basefinder.markdown b/content/pages/examples/django/django-contrib-staticfiles-finders-basefinder.markdown new file mode 100644 index 000000000..92766a9a8 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-finders-basefinder.markdown @@ -0,0 +1,100 @@ +title: django.contrib.staticfiles.finders BaseFinder Example Code +category: page +slug: django-contrib-staticfiles-finders-basefinder-examples +sortorder: 500011067 +toc: False +sidebartitle: django.contrib.staticfiles.finders BaseFinder +meta: Python example code for the BaseFinder class from the django.contrib.staticfiles.finders module of the Django project. + + +BaseFinder is a class within the django.contrib.staticfiles.finders module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / finders.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./finders.py) + +```python +# finders.py +from itertools import chain + +from django.contrib.staticfiles.storage import staticfiles_storage +~~from django.contrib.staticfiles.finders import BaseFinder, BaseStorageFinder, find, \ + AppDirectoriesFinder as DjangoAppDirectoriesFinder, FileSystemFinder as DjangoFileSystemFinder +from django.utils._os import safe_join +from os.path import normpath + +from pipeline.conf import settings + + +class PipelineFinder(BaseStorageFinder): + storage = staticfiles_storage + + def find(self, path, all=False): + if not settings.PIPELINE_ENABLED: + return super(PipelineFinder, self).find(path, all) + else: + return [] + + def list(self, ignore_patterns): + return [] + + +~~class ManifestFinder(BaseFinder): + def find(self, path, all=False): + matches = [] + for elem in chain(settings.STYLESHEETS.values(), settings.JAVASCRIPT.values()): + if normpath(elem['output_filename']) == normpath(path): + match = safe_join(settings.PIPELINE_ROOT, path) + if not all: + return match + matches.append(match) + return matches + + def list(self, *args): + return [] + + +~~class CachedFileFinder(BaseFinder): + def find(self, path, all=False): + try: + start, _, extn = path.rsplit('.', 2) + except ValueError: + return [] + path = '.'.join((start, extn)) + return find(path, all=all) or [] + + def list(self, *args): + return [] + + +class PatternFilterMixin(object): + ignore_patterns = [] + + def get_ignored_patterns(self): + return list(set(self.ignore_patterns)) + + def list(self, ignore_patterns): + if ignore_patterns: + ignore_patterns = ignore_patterns + self.get_ignored_patterns() + return super(PatternFilterMixin, self).list(ignore_patterns) + + + + +## ... source file continues with no further BaseFinder examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-finders-basestoragefinder.markdown b/content/pages/examples/django/django-contrib-staticfiles-finders-basestoragefinder.markdown new file mode 100644 index 000000000..799b108ed --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-finders-basestoragefinder.markdown @@ -0,0 +1,72 @@ +title: django.contrib.staticfiles.finders BaseStorageFinder Example Code +category: page +slug: django-contrib-staticfiles-finders-basestoragefinder-examples +sortorder: 500011068 +toc: False +sidebartitle: django.contrib.staticfiles.finders BaseStorageFinder +meta: Python example code for the BaseStorageFinder class from the django.contrib.staticfiles.finders module of the Django project. + + +BaseStorageFinder is a class within the django.contrib.staticfiles.finders module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / finders.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./finders.py) + +```python +# finders.py +from itertools import chain + +from django.contrib.staticfiles.storage import staticfiles_storage +~~from django.contrib.staticfiles.finders import BaseFinder, BaseStorageFinder, find, \ + AppDirectoriesFinder as DjangoAppDirectoriesFinder, FileSystemFinder as DjangoFileSystemFinder +from django.utils._os import safe_join +from os.path import normpath + +from pipeline.conf import settings + + +~~class PipelineFinder(BaseStorageFinder): + storage = staticfiles_storage + + def find(self, path, all=False): + if not settings.PIPELINE_ENABLED: + return super(PipelineFinder, self).find(path, all) + else: + return [] + + def list(self, ignore_patterns): + return [] + + +class ManifestFinder(BaseFinder): + def find(self, path, all=False): + matches = [] + for elem in chain(settings.STYLESHEETS.values(), settings.JAVASCRIPT.values()): + if normpath(elem['output_filename']) == normpath(path): + match = safe_join(settings.PIPELINE_ROOT, path) + if not all: + return match + matches.append(match) + return matches + + def list(self, *args): + + +## ... source file continues with no further BaseStorageFinder examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-finders-find.markdown b/content/pages/examples/django/django-contrib-staticfiles-finders-find.markdown new file mode 100644 index 000000000..c30f933a5 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-finders-find.markdown @@ -0,0 +1,107 @@ +title: django.contrib.staticfiles.finders find Example Code +category: page +slug: django-contrib-staticfiles-finders-find-examples +sortorder: 500011069 +toc: False +sidebartitle: django.contrib.staticfiles.finders find +meta: Python example code for the find callable from the django.contrib.staticfiles.finders module of the Django project. + + +find is a callable within the django.contrib.staticfiles.finders module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / finders.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./finders.py) + +```python +# finders.py +from itertools import chain + +from django.contrib.staticfiles.storage import staticfiles_storage +~~from django.contrib.staticfiles.finders import BaseFinder, BaseStorageFinder, find, \ + AppDirectoriesFinder as DjangoAppDirectoriesFinder, FileSystemFinder as DjangoFileSystemFinder +from django.utils._os import safe_join +from os.path import normpath + +from pipeline.conf import settings + + +class PipelineFinder(BaseStorageFinder): + storage = staticfiles_storage + +~~ def find(self, path, all=False): + if not settings.PIPELINE_ENABLED: + return super(PipelineFinder, self).find(path, all) + else: + return [] + + def list(self, ignore_patterns): + return [] + + +class ManifestFinder(BaseFinder): +~~ def find(self, path, all=False): + matches = [] + for elem in chain(settings.STYLESHEETS.values(), settings.JAVASCRIPT.values()): + if normpath(elem['output_filename']) == normpath(path): + match = safe_join(settings.PIPELINE_ROOT, path) + if not all: + return match + matches.append(match) + return matches + + def list(self, *args): + return [] + + +class CachedFileFinder(BaseFinder): +~~ def find(self, path, all=False): + try: + start, _, extn = path.rsplit('.', 2) + except ValueError: + return [] + path = '.'.join((start, extn)) +~~ return find(path, all=all) or [] + + def list(self, *args): + return [] + + +class PatternFilterMixin(object): + ignore_patterns = [] + + def get_ignored_patterns(self): + return list(set(self.ignore_patterns)) + + def list(self, ignore_patterns): + if ignore_patterns: + ignore_patterns = ignore_patterns + self.get_ignored_patterns() + return super(PatternFilterMixin, self).list(ignore_patterns) + + +class AppDirectoriesFinder(PatternFilterMixin, DjangoAppDirectoriesFinder): + ignore_patterns = [ + '*.js', + '*.css', + '*.less', + '*.scss', + '*.styl', + + +## ... source file continues with no further find examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-finders-get-finders.markdown b/content/pages/examples/django/django-contrib-staticfiles-finders-get-finders.markdown new file mode 100644 index 000000000..fbc7b0457 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-finders-get-finders.markdown @@ -0,0 +1,78 @@ +title: django.contrib.staticfiles.finders get_finders Example Code +category: page +slug: django-contrib-staticfiles-finders-get-finders-examples +sortorder: 500011070 +toc: False +sidebartitle: django.contrib.staticfiles.finders get_finders +meta: Python example code for the get_finders callable from the django.contrib.staticfiles.finders module of the Django project. + + +get_finders is a callable within the django.contrib.staticfiles.finders module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / manifest.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./manifest.py) + +```python +# manifest.py +import os + +from django.conf.settings import settings as django_settings +~~from django.contrib.staticfiles.finders import get_finders +from django.contrib.staticfiles.storage import staticfiles_storage + +from pipeline.conf import settings + +from manifesto import Manifest + +from pipeline.packager import Packager + + +class PipelineManifest(Manifest): + def __init__(self): + self.packager = Packager() + self.packages = self.collect_packages() +~~ self.finders = get_finders() + self.package_files = [] + + def collect_packages(self): + packages = [] + for package_name in self.packager.packages['css']: + package = self.packager.package_for('css', package_name) + if package.manifest: + packages.append(package) + for package_name in self.packager.packages['js']: + package = self.packager.package_for('js', package_name) + if package.manifest: + packages.append(package) + return packages + + def cache(self): + + if settings.PIPELINE_ENABLED: + for package in self.packages: + path = package.output_filename + self.package_files.append(path) + yield staticfiles_storage.url(path) + else: + for package in self.packages: + for path in self.packager.compile(package.paths): + + +## ... source file continues with no further get_finders examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-finders.markdown b/content/pages/examples/django/django-contrib-staticfiles-finders.markdown new file mode 100644 index 000000000..f86f42dcd --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-finders.markdown @@ -0,0 +1,232 @@ +title: django.contrib.staticfiles finders Example Code +category: page +slug: django-contrib-staticfiles-finders-examples +sortorder: 500011065 +toc: False +sidebartitle: django.contrib.staticfiles finders +meta: Python example code for the finders callable from the django.contrib.staticfiles module of the Django project. + + +finders is a callable within the django.contrib.staticfiles module of the Django project. + + +## Example 1 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / panels / staticfiles.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/staticfiles.py) + +```python +# staticfiles.py +from collections import OrderedDict +from os.path import join, normpath + +from django.conf import settings +~~from django.contrib.staticfiles import finders, storage +from django.core.files.storage import get_storage_class +from django.utils.functional import LazyObject +from django.utils.translation import gettext_lazy as _, ngettext as __ + +from debug_toolbar import panels +from debug_toolbar.utils import ThreadCollector + +try: + import threading +except ImportError: + threading = None + + +class StaticFile: + + def __init__(self, path): + self.path = path + + def __str__(self): + return self.path + + def real_path(self): +~~ return finders.find(self.path) + + def url(self): + return storage.staticfiles_storage.url(self.path) + + +class FileCollector(ThreadCollector): + def collect(self, path, thread=None): + if path.endswith("/"): + return + super().collect(StaticFile(path), thread) + + +collector = FileCollector() + + +class DebugConfiguredStorage(LazyObject): + + def _setup(self): + + configured_storage_cls = get_storage_class(settings.STATICFILES_STORAGE) + + class DebugStaticFilesStorage(configured_storage_cls): + def __init__(self, collector, *args, **kwargs): + super().__init__(*args, **kwargs) + + +## ... source file abbreviated to get to finders examples ... + + + return __("%(num_used)s file used", "%(num_used)s files used", num_used) % { + "num_used": num_used + } + + def process_request(self, request): + collector.clear_collection() + return super().process_request(request) + + def generate_stats(self, request, response): + used_paths = collector.get_collection() + self._paths[threading.currentThread()] = used_paths + + self.record_stats( + { + "num_found": self.num_found, + "num_used": self.num_used, + "staticfiles": used_paths, + "staticfiles_apps": self.get_staticfiles_apps(), + "staticfiles_dirs": self.get_staticfiles_dirs(), + "staticfiles_finders": self.get_staticfiles_finders(), + } + ) + + def get_staticfiles_finders(self): + finders_mapping = OrderedDict() +~~ for finder in finders.get_finders(): + for path, finder_storage in finder.list([]): + if getattr(finder_storage, "prefix", None): + prefixed_path = join(finder_storage.prefix, path) + else: + prefixed_path = path + finder_cls = finder.__class__ + finder_path = ".".join([finder_cls.__module__, finder_cls.__name__]) + real_path = finder_storage.path(path) + payload = (prefixed_path, real_path) + finders_mapping.setdefault(finder_path, []).append(payload) + self.num_found += 1 + return finders_mapping + + def get_staticfiles_dirs(self): + dirs = [] +~~ for finder in finders.get_finders(): +~~ if isinstance(finder, finders.FileSystemFinder): + dirs.extend(finder.locations) + return [(prefix, normpath(dir)) for prefix, dir in dirs] + + def get_staticfiles_apps(self): + apps = [] +~~ for finder in finders.get_finders(): +~~ if isinstance(finder, finders.AppDirectoriesFinder): + for app in finder.apps: + if app not in apps: + apps.append(app) + return apps + + + +## ... source file continues with no further finders examples... + +``` + + +## Example 2 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / collector.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./collector.py) + +```python +# collector.py +import os + +from collections import OrderedDict + +import django +~~from django.contrib.staticfiles import finders +from django.contrib.staticfiles.storage import staticfiles_storage + +from pipeline.finders import PipelineFinder + + +class Collector(object): + request = None + + def __init__(self, storage=None): + if storage is None: + storage = staticfiles_storage + self.storage = storage + + def _get_modified_time(self, storage, prefixed_path): + if django.VERSION[:2] >= (1, 10): + return storage.get_modified_time(prefixed_path) + return storage.modified_time(prefixed_path) + + def clear(self, path=""): + dirs, files = self.storage.listdir(path) + for f in files: + fpath = os.path.join(path, f) + self.storage.delete(fpath) + for d in dirs: + self.clear(os.path.join(path, d)) + + def collect(self, request=None, files=[]): + if self.request and self.request is request: + return + self.request = request + found_files = OrderedDict() +~~ for finder in finders.get_finders(): + if isinstance(finder, PipelineFinder): + continue + for path, storage in finder.list(['CVS', '.*', '*-']): + if getattr(storage, 'prefix', None): + prefixed_path = os.path.join(storage.prefix, path) + else: + prefixed_path = path + + if (prefixed_path not in found_files and + (not files or prefixed_path in files)): + found_files[prefixed_path] = (storage, path) + self.copy_file(path, prefixed_path, storage) + + if files and len(files) == len(found_files): + break + + return found_files.keys() + + def copy_file(self, path, prefixed_path, source_storage): + if not self.delete_file(path, prefixed_path, source_storage): + return + with source_storage.open(path) as source_file: + self.storage.save(prefixed_path, source_file) + + + +## ... source file continues with no further finders examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-handlers-staticfileshandler.markdown b/content/pages/examples/django/django-contrib-staticfiles-handlers-staticfileshandler.markdown new file mode 100644 index 000000000..b9aaa6a9e --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-handlers-staticfileshandler.markdown @@ -0,0 +1,107 @@ +title: django.contrib.staticfiles.handlers StaticFilesHandler Example Code +category: page +slug: django-contrib-staticfiles-handlers-staticfileshandler-examples +sortorder: 500011071 +toc: False +sidebartitle: django.contrib.staticfiles.handlers StaticFilesHandler +meta: Python example code for the StaticFilesHandler class from the django.contrib.staticfiles.handlers module of the Django project. + + +StaticFilesHandler is a class within the django.contrib.staticfiles.handlers module of the Django project. + + +## Example 1 from django-webtest +[django-webtest](https://github.com/django-webtest/django-webtest) +([PyPI package information](https://pypi.org/project/django-webtest/)) +is a [Django](/django.html) extension that makes it easier to use +[WebTest](http://docs.pylonsproject.org/projects/webtest/) with +your projects. + +The project is open sourced under the +[MIT license](https://github.com/django-webtest/django-webtest/blob/master/LICENSE.txt). + +[**django-webtest / django_webtest / __init__.py**](https://github.com/django-webtest/django-webtest/blob/master/django_webtest/./__init__.py) + +```python +# __init__.py +import copy + +from django.conf import settings +from django.test.signals import template_rendered +from django.core.handlers.wsgi import WSGIHandler +from django.test import TestCase, TransactionTestCase +from django.test.client import store_rendered_templates + +from functools import partial + +try: + from importlib import import_module +except ImportError: + from django.utils.importlib import import_module + +from django.core import signals +try: + from django.db import close_old_connections +except ImportError: + from django.db import close_connection + close_old_connections = None +try: + from django.core.servers.basehttp import ( + AdminMediaHandler as StaticFilesHandler) +except ImportError: +~~ from django.contrib.staticfiles.handlers import StaticFilesHandler + +from webtest import TestApp +try: + from webtest.utils import NoDefault +except ImportError: + NoDefault = '' + +from django_webtest.response import DjangoWebtestResponse +from django_webtest.compat import to_string, to_wsgi_safe_string + + +_notgiven = object() + + +class DjangoTestApp(TestApp): + response_class = DjangoWebtestResponse + + def __init__(self, *args, **kwargs): + extra_environ = (kwargs.get('extra_environ') or {}).copy() + extra_environ.setdefault('HTTP_HOST', 'testserver') + kwargs['extra_environ'] = extra_environ + super(DjangoTestApp, self).__init__(self.get_wsgi_handler(), *args, **kwargs) + + def get_wsgi_handler(self): +~~ return StaticFilesHandler(WSGIHandler()) + + def set_user(self, user): + if user is None and 'WEBTEST_USER' in self.extra_environ: + del self.extra_environ['WEBTEST_USER'] + if user is not None: + self.extra_environ = self._update_environ(self.extra_environ, user) + + def _update_environ(self, environ, user=_notgiven): + environ = environ or {} + + if user is not _notgiven: + if user is None: + environ['WEBTEST_USER'] = '' + else: + username = _get_username(user) + environ['WEBTEST_USER'] = to_wsgi_safe_string(username) + + return environ + + def do_request(self, req, status, expect_errors): + if close_old_connections is not None: # Django 1.6+ + signals.request_started.disconnect(close_old_connections) + signals.request_finished.disconnect(close_old_connections) + else: # Django < 1.6 + + +## ... source file continues with no further StaticFilesHandler examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage-cachedstaticfilesstorage.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage-cachedstaticfilesstorage.markdown new file mode 100644 index 000000000..62d79de7f --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage-cachedstaticfilesstorage.markdown @@ -0,0 +1,110 @@ +title: django.contrib.staticfiles.storage CachedStaticFilesStorage Example Code +category: page +slug: django-contrib-staticfiles-storage-cachedstaticfilesstorage-examples +sortorder: 500011072 +toc: False +sidebartitle: django.contrib.staticfiles.storage CachedStaticFilesStorage +meta: Python example code for the CachedStaticFilesStorage class from the django.contrib.staticfiles.storage module of the Django project. + + +CachedStaticFilesStorage is a class within the django.contrib.staticfiles.storage module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / storage.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./storage.py) + +```python +# storage.py +import gzip + +from io import BytesIO + +~~from django.contrib.staticfiles.storage import CachedStaticFilesStorage, ManifestStaticFilesStorage, StaticFilesStorage +from django.contrib.staticfiles.utils import matches_patterns + +from django.core.files.base import File + + +class PipelineMixin(object): + packing = True + + def post_process(self, paths, dry_run=False, **options): + if dry_run: + return + + from pipeline.packager import Packager + packager = Packager(storage=self) + for package_name in packager.packages['css']: + package = packager.package_for('css', package_name) + output_file = package.output_filename + if self.packing: + packager.pack_stylesheets(package) + paths[output_file] = (self, output_file) + yield output_file, output_file, True + for package_name in packager.packages['js']: + package = packager.package_for('js', package_name) + output_file = package.output_filename + + +## ... source file abbreviated to get to CachedStaticFilesStorage examples ... + + + for path in paths: + if path: + if not matches_patterns(path, self.gzip_patterns): + continue + original_file = self.open(path) + gzipped_path = f"{path}.gz" + if self.exists(gzipped_path): + self.delete(gzipped_path) + gzipped_file = self._compress(original_file) + gzipped_path = self.save(gzipped_path, gzipped_file) + yield gzipped_path, gzipped_path, True + + +class NonPackagingMixin(object): + packing = False + + +class PipelineStorage(PipelineMixin, StaticFilesStorage): + pass + + +class NonPackagingPipelineStorage(NonPackagingMixin, PipelineStorage): + pass + + +~~class PipelineCachedStorage(PipelineMixin, CachedStaticFilesStorage): + pass + + +class NonPackagingPipelineCachedStorage(NonPackagingMixin, PipelineCachedStorage): + pass + + +class PipelineManifestStorage(PipelineMixin, ManifestStaticFilesStorage): + pass + + +class NonPackagingPipelineManifestStorage(NonPackagingMixin, ManifestStaticFilesStorage): + pass + + + +## ... source file continues with no further CachedStaticFilesStorage examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage-hashedfilesmixin.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage-hashedfilesmixin.markdown new file mode 100644 index 000000000..ca526d574 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage-hashedfilesmixin.markdown @@ -0,0 +1,57 @@ +title: django.contrib.staticfiles.storage HashedFilesMixin Example Code +category: page +slug: django-contrib-staticfiles-storage-hashedfilesmixin-examples +sortorder: 500011073 +toc: False +sidebartitle: django.contrib.staticfiles.storage HashedFilesMixin +meta: Python example code for the HashedFilesMixin class from the django.contrib.staticfiles.storage module of the Django project. + + +HashedFilesMixin is a class within the django.contrib.staticfiles.storage module of the Django project. + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / staticfiles.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/staticfiles.py) + +```python +# staticfiles.py +import hashlib + +from django.conf import settings +~~from django.contrib.staticfiles.storage import HashedFilesMixin +from django.core.files.storage import get_storage_class +from django.templatetags.static import static + +from wagtail import __version__ + + +try: + use_version_strings = settings.WAGTAILADMIN_STATIC_FILE_VERSION_STRINGS +except AttributeError: + + if settings.DEBUG: + use_version_strings = True + else: + storage = get_storage_class(settings.STATICFILES_STORAGE) + use_version_strings = not issubclass(storage, HashedFilesMixin) + + +if use_version_strings: + VERSION_HASH = hashlib.sha1( + (__version__ + settings.SECRET_KEY).encode('utf-8') + ).hexdigest()[:8] +else: + VERSION_HASH = None + + + +## ... source file continues with no further HashedFilesMixin examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage-manifeststaticfilesstorage.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage-manifeststaticfilesstorage.markdown new file mode 100644 index 000000000..d920d3c9f --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage-manifeststaticfilesstorage.markdown @@ -0,0 +1,102 @@ +title: django.contrib.staticfiles.storage ManifestStaticFilesStorage Example Code +category: page +slug: django-contrib-staticfiles-storage-manifeststaticfilesstorage-examples +sortorder: 500011074 +toc: False +sidebartitle: django.contrib.staticfiles.storage ManifestStaticFilesStorage +meta: Python example code for the ManifestStaticFilesStorage class from the django.contrib.staticfiles.storage module of the Django project. + + +ManifestStaticFilesStorage is a class within the django.contrib.staticfiles.storage module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / storage.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./storage.py) + +```python +# storage.py +import gzip + +from io import BytesIO + +~~from django.contrib.staticfiles.storage import CachedStaticFilesStorage, ManifestStaticFilesStorage, StaticFilesStorage +from django.contrib.staticfiles.utils import matches_patterns + +from django.core.files.base import File + + +class PipelineMixin(object): + packing = True + + def post_process(self, paths, dry_run=False, **options): + if dry_run: + return + + from pipeline.packager import Packager + packager = Packager(storage=self) + for package_name in packager.packages['css']: + package = packager.package_for('css', package_name) + output_file = package.output_filename + if self.packing: + packager.pack_stylesheets(package) + paths[output_file] = (self, output_file) + yield output_file, output_file, True + for package_name in packager.packages['js']: + package = packager.package_for('js', package_name) + output_file = package.output_filename + + +## ... source file abbreviated to get to ManifestStaticFilesStorage examples ... + + + gzipped_file = self._compress(original_file) + gzipped_path = self.save(gzipped_path, gzipped_file) + yield gzipped_path, gzipped_path, True + + +class NonPackagingMixin(object): + packing = False + + +class PipelineStorage(PipelineMixin, StaticFilesStorage): + pass + + +class NonPackagingPipelineStorage(NonPackagingMixin, PipelineStorage): + pass + + +class PipelineCachedStorage(PipelineMixin, CachedStaticFilesStorage): + pass + + +class NonPackagingPipelineCachedStorage(NonPackagingMixin, PipelineCachedStorage): + pass + + +~~class PipelineManifestStorage(PipelineMixin, ManifestStaticFilesStorage): + pass + + +~~class NonPackagingPipelineManifestStorage(NonPackagingMixin, ManifestStaticFilesStorage): + pass + + + +## ... source file continues with no further ManifestStaticFilesStorage examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage-staticfiles-storage.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage-staticfiles-storage.markdown new file mode 100644 index 000000000..ae20ee1a5 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage-staticfiles-storage.markdown @@ -0,0 +1,197 @@ +title: django.contrib.staticfiles.storage staticfiles_storage Example Code +category: page +slug: django-contrib-staticfiles-storage-staticfiles-storage-examples +sortorder: 500011076 +toc: False +sidebartitle: django.contrib.staticfiles.storage staticfiles_storage +meta: Python example code for the staticfiles_storage callable from the django.contrib.staticfiles.storage module of the Django project. + + +staticfiles_storage is a callable within the django.contrib.staticfiles.storage module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / fields.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/fields.py) + +```python +# fields.py +import re +import mimetypes + +from django.conf import settings +~~from django.contrib.staticfiles.storage import staticfiles_storage +from django.core import signing +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.files.storage import default_storage +from django.core.files.uploadedfile import InMemoryUploadedFile, TemporaryUploadedFile +from django.urls import reverse_lazy +from django.forms import fields, models as model_fields, widgets +from django.utils.html import format_html +from django.utils.module_loading import import_string +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext_lazy as _, ungettext_lazy + +from djng import app_settings +from .widgets import DropFileWidget, DropImageWidget + + +class DefaultFieldMixin(object): + render_label = True + + def has_subwidgets(self): + return False + + def get_potential_errors(self): + return self.get_input_required_errors() + + + +## ... source file abbreviated to get to staticfiles_storage examples ... + + + +class FileField(FileFieldMixin, fields.FileField): + storage = app_settings.upload_storage + signer = signing.Signer() + + def __init__(self, *args, **kwargs): + accept = kwargs.pop('accept', '*/*') + fileupload_url = kwargs.pop('fileupload_url', reverse_lazy('fileupload')) + area_label = kwargs.pop('area_label', _("Drop file here or click to upload")) + attrs = { + 'accept': accept, + 'ngf-pattern': accept, + } + kwargs.update(widget=DropFileWidget(area_label, fileupload_url, attrs=attrs)) + super(FileField, self).__init__(*args, **kwargs) + + @classmethod + def preview(cls, file_obj): + available_name = cls.storage.get_available_name(file_obj.name) + temp_name = cls.storage.save(available_name, file_obj) + extension = mimetypes.guess_extension(file_obj.content_type) + if extension: + extension = extension[1:] + else: + extension = '_blank' +~~ icon_url = staticfiles_storage.url('djng/icons/{}.png'.format(extension)) + return { + 'url': 'url({})'.format(icon_url), + 'temp_name': cls.signer.sign(temp_name), + 'file_name': file_obj.name, + 'file_size': file_obj.size, + 'charset': file_obj.charset, + 'content_type': file_obj.content_type, + 'content_type_extra': file_obj.content_type_extra, + } + + +class ImageField(FileFieldMixin, fields.ImageField): + storage = app_settings.upload_storage + signer = signing.Signer() + + def __init__(self, *args, **kwargs): + if 'easy_thumbnails' not in settings.INSTALLED_APPS: + raise ImproperlyConfigured("'djng.forms.fields.ImageField' requires 'easy-thubnails' to be installed") + accept = kwargs.pop('accept', 'image/*') + fileupload_url = kwargs.pop('fileupload_url', reverse_lazy('fileupload')) + area_label = kwargs.pop('area_label', _("Drop image here or click to upload")) + attrs = { + 'accept': accept, + 'ngf-pattern': accept, + + +## ... source file continues with no further staticfiles_storage examples... + +``` + + +## Example 2 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / manifest.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./manifest.py) + +```python +# manifest.py +import os + +from django.conf.settings import settings as django_settings +from django.contrib.staticfiles.finders import get_finders +~~from django.contrib.staticfiles.storage import staticfiles_storage + +from pipeline.conf import settings + +from manifesto import Manifest + +from pipeline.packager import Packager + + +class PipelineManifest(Manifest): + def __init__(self): + self.packager = Packager() + self.packages = self.collect_packages() + self.finders = get_finders() + self.package_files = [] + + def collect_packages(self): + packages = [] + for package_name in self.packager.packages['css']: + package = self.packager.package_for('css', package_name) + if package.manifest: + packages.append(package) + for package_name in self.packager.packages['js']: + package = self.packager.package_for('js', package_name) + if package.manifest: + packages.append(package) + return packages + + def cache(self): + + if settings.PIPELINE_ENABLED: + for package in self.packages: + path = package.output_filename + self.package_files.append(path) +~~ yield staticfiles_storage.url(path) + else: + for package in self.packages: + for path in self.packager.compile(package.paths): + self.package_files.append(path) +~~ yield staticfiles_storage.url(path) + + ignore_patterns = getattr(django_settings, "STATICFILES_IGNORE_PATTERNS", None) + for finder in self.finders: + for path, storage in finder.list(ignore_patterns): + if getattr(storage, 'prefix', None): + prefixed_path = os.path.join(storage.prefix, path) + else: + prefixed_path = path + + if prefixed_path not in self.package_files: + + self.package_files.append(prefixed_path) +~~ yield staticfiles_storage.url(prefixed_path) + + + +## ... source file continues with no further staticfiles_storage examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage-staticfilesstorage.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage-staticfilesstorage.markdown new file mode 100644 index 000000000..0562d9564 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage-staticfilesstorage.markdown @@ -0,0 +1,118 @@ +title: django.contrib.staticfiles.storage StaticFilesStorage Example Code +category: page +slug: django-contrib-staticfiles-storage-staticfilesstorage-examples +sortorder: 500011075 +toc: False +sidebartitle: django.contrib.staticfiles.storage StaticFilesStorage +meta: Python example code for the StaticFilesStorage class from the django.contrib.staticfiles.storage module of the Django project. + + +StaticFilesStorage is a class within the django.contrib.staticfiles.storage module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / storage.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./storage.py) + +```python +# storage.py +import gzip + +from io import BytesIO + +~~from django.contrib.staticfiles.storage import CachedStaticFilesStorage, ManifestStaticFilesStorage, StaticFilesStorage +from django.contrib.staticfiles.utils import matches_patterns + +from django.core.files.base import File + + +class PipelineMixin(object): + packing = True + + def post_process(self, paths, dry_run=False, **options): + if dry_run: + return + + from pipeline.packager import Packager + packager = Packager(storage=self) + for package_name in packager.packages['css']: + package = packager.package_for('css', package_name) + output_file = package.output_filename + if self.packing: + packager.pack_stylesheets(package) + paths[output_file] = (self, output_file) + yield output_file, output_file, True + for package_name in packager.packages['js']: + package = packager.package_for('js', package_name) + output_file = package.output_filename + + +## ... source file abbreviated to get to StaticFilesStorage examples ... + + + for name, hashed_name, processed in super_class.post_process(paths.copy(), dry_run, **options): + if hashed_name != name: + paths[hashed_name] = (self, hashed_name) + yield name, hashed_name, processed + + if dry_run: + return + + for path in paths: + if path: + if not matches_patterns(path, self.gzip_patterns): + continue + original_file = self.open(path) + gzipped_path = f"{path}.gz" + if self.exists(gzipped_path): + self.delete(gzipped_path) + gzipped_file = self._compress(original_file) + gzipped_path = self.save(gzipped_path, gzipped_file) + yield gzipped_path, gzipped_path, True + + +class NonPackagingMixin(object): + packing = False + + +~~class PipelineStorage(PipelineMixin, StaticFilesStorage): + pass + + +class NonPackagingPipelineStorage(NonPackagingMixin, PipelineStorage): + pass + + +class PipelineCachedStorage(PipelineMixin, CachedStaticFilesStorage): + pass + + +class NonPackagingPipelineCachedStorage(NonPackagingMixin, PipelineCachedStorage): + pass + + +class PipelineManifestStorage(PipelineMixin, ManifestStaticFilesStorage): + pass + + +class NonPackagingPipelineManifestStorage(NonPackagingMixin, ManifestStaticFilesStorage): + pass + + + +## ... source file continues with no further StaticFilesStorage examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage.markdown new file mode 100644 index 000000000..9ea16df48 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage.markdown @@ -0,0 +1,143 @@ +title: django.contrib.staticfiles storage Example Code +category: page +slug: django-contrib-staticfiles-storage-examples +sortorder: 500011066 +toc: False +sidebartitle: django.contrib.staticfiles storage +meta: Python example code for the storage callable from the django.contrib.staticfiles module of the Django project. + + +storage is a callable within the django.contrib.staticfiles module of the Django project. + + +## Example 1 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / panels / staticfiles.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/staticfiles.py) + +```python +# staticfiles.py +from collections import OrderedDict +from os.path import join, normpath + +from django.conf import settings +~~from django.contrib.staticfiles import finders, storage +from django.core.files.storage import get_storage_class +from django.utils.functional import LazyObject +from django.utils.translation import gettext_lazy as _, ngettext as __ + +from debug_toolbar import panels +from debug_toolbar.utils import ThreadCollector + +try: + import threading +except ImportError: + threading = None + + +class StaticFile: + + def __init__(self, path): + self.path = path + + def __str__(self): + return self.path + + def real_path(self): + return finders.find(self.path) + + def url(self): +~~ return storage.staticfiles_storage.url(self.path) + + +class FileCollector(ThreadCollector): + def collect(self, path, thread=None): + if path.endswith("/"): + return + super().collect(StaticFile(path), thread) + + +collector = FileCollector() + + +class DebugConfiguredStorage(LazyObject): + + def _setup(self): + + configured_storage_cls = get_storage_class(settings.STATICFILES_STORAGE) + + class DebugStaticFilesStorage(configured_storage_cls): + def __init__(self, collector, *args, **kwargs): + super().__init__(*args, **kwargs) + self.collector = collector + + def url(self, path): + self.collector.collect(path) + return super().url(path) + + self._wrapped = DebugStaticFilesStorage(collector) + + +~~_original_storage = storage.staticfiles_storage + + +class StaticFilesPanel(panels.Panel): + + name = "Static files" + template = "debug_toolbar/panels/staticfiles.html" + + @property + def title(self): + return _("Static files (%(num_found)s found, %(num_used)s used)") % { + "num_found": self.num_found, + "num_used": self.num_used, + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.num_found = 0 + self._paths = {} + + def enable_instrumentation(self): +~~ storage.staticfiles_storage = DebugConfiguredStorage() + + def disable_instrumentation(self): +~~ storage.staticfiles_storage = _original_storage + + @property + def num_used(self): + return len(self._paths[threading.currentThread()]) + + nav_title = _("Static files") + + @property + def nav_subtitle(self): + num_used = self.num_used + return __("%(num_used)s file used", "%(num_used)s files used", num_used) % { + "num_used": num_used + } + + def process_request(self, request): + collector.clear_collection() + return super().process_request(request) + + def generate_stats(self, request, response): + used_paths = collector.get_collection() + self._paths[threading.currentThread()] = used_paths + + self.record_stats( + { + + +## ... source file continues with no further storage examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-utils-matches-patterns.markdown b/content/pages/examples/django/django-contrib-staticfiles-utils-matches-patterns.markdown new file mode 100644 index 000000000..47c78f231 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-utils-matches-patterns.markdown @@ -0,0 +1,121 @@ +title: django.contrib.staticfiles.utils matches_patterns Example Code +category: page +slug: django-contrib-staticfiles-utils-matches-patterns-examples +sortorder: 500011077 +toc: False +sidebartitle: django.contrib.staticfiles.utils matches_patterns +meta: Python example code for the matches_patterns callable from the django.contrib.staticfiles.utils module of the Django project. + + +matches_patterns is a callable within the django.contrib.staticfiles.utils module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / storage.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./storage.py) + +```python +# storage.py +import gzip + +from io import BytesIO + +from django.contrib.staticfiles.storage import CachedStaticFilesStorage, ManifestStaticFilesStorage, StaticFilesStorage +~~from django.contrib.staticfiles.utils import matches_patterns + +from django.core.files.base import File + + +class PipelineMixin(object): + packing = True + + def post_process(self, paths, dry_run=False, **options): + if dry_run: + return + + from pipeline.packager import Packager + packager = Packager(storage=self) + for package_name in packager.packages['css']: + package = packager.package_for('css', package_name) + output_file = package.output_filename + if self.packing: + packager.pack_stylesheets(package) + paths[output_file] = (self, output_file) + yield output_file, output_file, True + for package_name in packager.packages['js']: + package = packager.package_for('js', package_name) + output_file = package.output_filename + if self.packing: + + +## ... source file abbreviated to get to matches_patterns examples ... + + + +class GZIPMixin(object): + gzip_patterns = ("*.css", "*.js") + + def _compress(self, original_file): + content = BytesIO() + gzip_file = gzip.GzipFile(mode='wb', fileobj=content) + gzip_file.write(original_file.read()) + gzip_file.close() + content.seek(0) + return File(content) + + def post_process(self, paths, dry_run=False, **options): + super_class = super(GZIPMixin, self) + if hasattr(super_class, 'post_process'): + for name, hashed_name, processed in super_class.post_process(paths.copy(), dry_run, **options): + if hashed_name != name: + paths[hashed_name] = (self, hashed_name) + yield name, hashed_name, processed + + if dry_run: + return + + for path in paths: + if path: +~~ if not matches_patterns(path, self.gzip_patterns): + continue + original_file = self.open(path) + gzipped_path = f"{path}.gz" + if self.exists(gzipped_path): + self.delete(gzipped_path) + gzipped_file = self._compress(original_file) + gzipped_path = self.save(gzipped_path, gzipped_file) + yield gzipped_path, gzipped_path, True + + +class NonPackagingMixin(object): + packing = False + + +class PipelineStorage(PipelineMixin, StaticFilesStorage): + pass + + +class NonPackagingPipelineStorage(NonPackagingMixin, PipelineStorage): + pass + + +class PipelineCachedStorage(PipelineMixin, CachedStaticFilesStorage): + pass + + +## ... source file continues with no further matches_patterns examples... + +``` + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 83b1b7f64..917bf49e9 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -32,6 +32,23 @@

    django.contrib.auth decorators login_required, hashers make_password

    +

    django.contrib.staticfiles + finders, + .finders BaseFinder, + .finders BaseStorageFinder, + .finders find, + .finders get_finders + .handlers StaticFilesHandler + storage + .storage CachedStaticFilesStorage, + .storage HashedFilesMixin, + .storage ManifestStaticFilesStorage, + .storage StaticFilesStorage, + .storage staticfiles_storage + .utils matches_patterns +

    +

    django.contrib.staticfiles.utils +

    django.core cache, checks, From bbbdbaf1d4577bba29f76f8fa48ddb91d71cb45a Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jul 2020 21:25:50 -0400 Subject: [PATCH 186/302] fix typo in toc --- theme/templates/code-examples/django.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 917bf49e9..795915387 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -47,8 +47,6 @@

    django.contrib.staticfiles .storage staticfiles_storage .utils matches_patterns

    -

    django.contrib.staticfiles.utils -

    django.core cache, checks, From 3c03d83d818516e3e4eacdb1d54d7c71e1bc7a53 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 11 Jul 2020 06:56:57 -0400 Subject: [PATCH 187/302] add new django extension --- .../django/django-extensions-plug-ins.markdown | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 709511183..da2f727e7 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -470,6 +470,17 @@ The project is open sourced under the [Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). +### django-rq +[django-rq](https://github.com/rq/django-rq) +([PyPI package information](https://pypi.org/project/django-rq/)) +is an [RQ](/redis-queue-rq.html)-based [task queue](/task-queues.html) +that integrates with [Django](/django.html) as an app. This project +is useful when you need a lightweight task queue and do not want +to go through configuring [Celery](/celery.html) in your project. +django-rq is open sourced under the +[MIT license](https://github.com/rq/django-rq/blob/master/LICENSE.txt). + + ### django-simple-task [django-simple-task](https://github.com/ericls/django-simple-task) ([project documentation](https://django-simple-task.readthedocs.io/) From 270ea642324a51dc7de7d2525c1c041010b54878 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 11 Jul 2020 14:41:03 -0400 Subject: [PATCH 188/302] adding example code to django page --- content/pages/03-data/06-sqlalchemy.markdown | 2 +- .../04-web-development/02-django.markdown | 76 +- .../04-web-development/03-flask.markdown | 2 +- ...ore-exceptions-disallowedredirect.markdown | 64 + ...core-exceptions-fielddoesnotexist.markdown | 972 ++++++++ ...django-core-exceptions-fielderror.markdown | 371 +++ ...e-exceptions-improperlyconfigured.markdown | 2 +- ...core-exceptions-middlewarenotused.markdown | 122 + ...-core-exceptions-non-field-errors.markdown | 158 ++ ...ore-exceptions-objectdoesnotexist.markdown | 969 ++++++++ ...-core-exceptions-permissiondenied.markdown | 1120 +++++++++ ...xceptions-suspiciousfileoperation.markdown | 73 + ...xceptions-suspiciousmultipartform.markdown | 56 + ...o-core-exceptions-validationerror.markdown | 2128 +++++++++++++++++ ...-core-exceptions-improperlyconfigured.html | 8 + theme/templates/code-examples/django.html | 31 +- theme/templates/page.html | 3 + 17 files changed, 6095 insertions(+), 62 deletions(-) create mode 100644 content/pages/examples/django/django-core-exceptions-disallowedredirect.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-fielddoesnotexist.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-fielderror.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-middlewarenotused.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-non-field-errors.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-objectdoesnotexist.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-permissiondenied.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-suspiciousfileoperation.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-suspiciousmultipartform.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-validationerror.markdown create mode 100644 redirects/django-core-exceptions-improperlyconfigured.html diff --git a/content/pages/03-data/06-sqlalchemy.markdown b/content/pages/03-data/06-sqlalchemy.markdown index 32e914cb7..f4c9abf9d 100644 --- a/content/pages/03-data/06-sqlalchemy.markdown +++ b/content/pages/03-data/06-sqlalchemy.markdown @@ -222,7 +222,7 @@ implementations. based on various developers' experiences. -### Open source code for using SQLAlchemy +## Open source code for learning SQLAlchemy Many open source projects rely on SQLAlchemy. A great way to learn how to properly work with this tool is to read the code that shows how those projects use SQLAlchemy. This section alphabetically lists diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index 253e9efd9..06ee0deee 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -21,7 +21,7 @@ For example, [template engine](/django-templates.html), an [object-relational mapper](/object-relational-mappers-orms.html) (ORM), and [database schema migrations](https://docs.djangoproject.com/en/dev/topics/migrations/) -(as of version 1.7) are all included with the [Django framework](https://pypi.org/project/Django/). +are all included with the [Django framework](https://pypi.org/project/Django/). Compare that included functionality to the Flask framework which requires a separate library such as [Flask-Login](https://flask-login.readthedocs.org/en/latest/) @@ -315,33 +315,6 @@ to handle these files properly. shows how to configure Django to load and serve up static and media files, public and private, via an Amazon S3 bucket. -## Open source Django example projects -* [Browser calls with Django and Twilio](https://www.twilio.com/docs/howto/walkthrough/browser-calls/python/django) - shows how to build a web app with Django and - [Twilio Client](https://www.twilio.com/client) to turn a user's web - browser into a full-fledged phone. Pretty awesome! - -* [Txt 2 React](https://github.com/mattmakai/txt2react) is a full Django web - app that allows audiences to text in during a presentation with feedback - or questions. - -* [Openduty](https://github.com/ustream/openduty) is a website status checking - and alert system similar to PagerDuty. - -* [Courtside](https://github.com/myusuf3/courtside) is a pick up sports web - application written and maintained by the author of PyCoder's Weekly. - -* These two Django Interactive Voice Response (IVR) system web application - repositories [part 1](https://github.com/phalt/twilio-django-part-1) and - [part 2](https://github.com/phalt/twilio-django-part-2) show you how to - build a really cool Django application. There's also an accompanying - [blog post](https://www.twilio.com/blog/2014/07/build-an-ivr-system-with-twilio-and-django.html) - with detailed explanations of each step. - -* [Taiga](https://github.com/taigaio/taiga-back) is a project management - tool built with Django as the backend and AngularJS as the front end. - - ## Django project templates Project templates, not to be confused with a [template engine](/template-engines.html), generate boilerplate code for @@ -349,7 +322,7 @@ a base Django project plus optional libraries that are often used when developing web applications. * [Caktus Group's Django project template](https://github.com/caktus/django-project-template) - is Django 1.6+ ready. + is Django 2.2+ ready. * [Cookiecutter Django](https://github.com/pydanny/cookiecutter-django) is a project template from Daniel Greenfeld, for use with Audrey Roy's @@ -364,25 +337,36 @@ developing web applications. template from Mozilla that is compatible with cookiecutter. -## Django learning checklist -1. [Install Django](https://docs.djangoproject.com/en/dev/topics/install/) on - your local development machine. +## Open source Django example projects +Reading open source code can be useful when you are trying to figure +out how to build your own projects. This is a short list of some +real-world example applications, and many more can be found on the +[Django example projects and code](/django-code-examples.html) page. -1. Work through the initial - ["polls" tutorial](https://docs.djangoproject.com/en/dev/intro/tutorial01/). - -1. Build a few more simple applications using the tutorial resources found - in the "Django resources" section. +* [Browser calls with Django and Twilio](https://www.twilio.com/docs/howto/walkthrough/browser-calls/python/django) + shows how to build a web app with Django and + [Twilio Client](https://www.twilio.com/client) to turn a user's web + browser into a full-fledged phone. Pretty awesome! -1. Start coding your own Django project with help from the - [official documentation](https://docs.djangoproject.com/en/dev/) and - resource links below. You'll make plenty of mistakes which is critical - on your path to learning the right way to build applications. +* [Openduty](https://github.com/ustream/openduty) is a website status checking + and alert system similar to PagerDuty. -1. Read [2 Scoops of Django](http://www.amazon.com/Two-Scoops-Django-Best-Practices/dp/0981467342) - to understand Django good practices and learn better ways of building - Django web applications. +* [Courtside](https://github.com/myusuf3/courtside) is a pick up sports web + application written and maintained by the author of PyCoder's Weekly. + +* These two Django Interactive Voice Response (IVR) system web application + repositories [part 1](https://github.com/phalt/twilio-django-part-1) and + [part 2](https://github.com/phalt/twilio-django-part-2) show you how to + build a really cool Django application. There's also an accompanying + [blog post](https://www.twilio.com/blog/2014/07/build-an-ivr-system-with-twilio-and-django.html) + with detailed explanations of each step. + +* [Taiga](https://github.com/taigaio/taiga-back) is a project management + tool built with Django as the backend and AngularJS as the front end. -1. Move on to the [deployment section](/deployment.html) to get your Django - project on the web. +## Open source code to learn Django +There are many open source projects that rely on Django. +One of the best ways to learn how to use this framework is to read +how other projects use it in real-world code. This section lists +these code examples by class and method in Django's code base. diff --git a/content/pages/04-web-development/03-flask.markdown b/content/pages/04-web-development/03-flask.markdown index ddcc54b97..18c708e54 100644 --- a/content/pages/04-web-development/03-flask.markdown +++ b/content/pages/04-web-development/03-flask.markdown @@ -337,7 +337,7 @@ ways to structure your code. in the JavaScript world. -### Open source code for using Flask +## Open source code for learning Flask There are many open source projects that rely on Flask to operate. One of the best ways to learn how to use this framework is to read how other projects use it in real-world code. This section lists diff --git a/content/pages/examples/django/django-core-exceptions-disallowedredirect.markdown b/content/pages/examples/django/django-core-exceptions-disallowedredirect.markdown new file mode 100644 index 000000000..6ad7cc979 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-disallowedredirect.markdown @@ -0,0 +1,64 @@ +title: django.core.exceptions DisallowedRedirect Example Code +category: page +slug: django-core-exceptions-disallowedredirect-examples +sortorder: 500011098 +toc: False +sidebartitle: django.core.exceptions DisallowedRedirect +meta: Python example code for the DisallowedRedirect class from the django.core.exceptions module of the Django project. + + +DisallowedRedirect is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / http.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./http.py) + +```python +# http.py +from urllib.parse import urlparse + +~~from django.core.exceptions import DisallowedRedirect +from django.http import HttpResponse +from django.utils.encoding import iri_to_uri + + +class OAuth2ResponseRedirect(HttpResponse): + status_code = 302 + + def __init__(self, redirect_to, allowed_schemes, *args, **kwargs): + super().__init__(*args, **kwargs) + self["Location"] = iri_to_uri(redirect_to) + self.allowed_schemes = allowed_schemes + self.validate_redirect(redirect_to) + + @property + def url(self): + return self["Location"] + + def validate_redirect(self, redirect_to): + parsed = urlparse(str(redirect_to)) + if not parsed.scheme: +~~ raise DisallowedRedirect("OAuth2 redirects require a URI scheme.") + if parsed.scheme not in self.allowed_schemes: +~~ raise DisallowedRedirect( + "Redirect to scheme {!r} is not permitted".format(parsed.scheme) + ) + + + +## ... source file continues with no further DisallowedRedirect examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-fielddoesnotexist.markdown b/content/pages/examples/django/django-core-exceptions-fielddoesnotexist.markdown new file mode 100644 index 000000000..fda98d83f --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-fielddoesnotexist.markdown @@ -0,0 +1,972 @@ +title: django.core.exceptions FieldDoesNotExist Example Code +category: page +slug: django-core-exceptions-fielddoesnotexist-examples +sortorder: 500011099 +toc: False +sidebartitle: django.core.exceptions FieldDoesNotExist +meta: Python example code for the FieldDoesNotExist class from the django.core.exceptions module of the Django project. + + +FieldDoesNotExist is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / models.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/models.py) + +```python +# models.py +from __future__ import unicode_literals + +import json +import ast + +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +~~from django.core.exceptions import FieldDoesNotExist +from django.db import models, DEFAULT_DB_ALIAS +from django.db.models import QuerySet, Q +from django.utils import formats, timezone +from django.utils.encoding import python_2_unicode_compatible, smart_text +from django.utils.six import iteritems, integer_types +from django.utils.translation import ugettext_lazy as _ + +from jsonfield.fields import JSONField +from dateutil import parser +from dateutil.tz import gettz + + +class LogEntryManager(models.Manager): + + def log_create(self, instance, **kwargs): + changes = kwargs.get('changes', None) + pk = self._get_pk_value(instance) + + if changes is not None: + kwargs.setdefault('content_type', ContentType.objects.get_for_model(instance)) + kwargs.setdefault('object_pk', pk) + kwargs.setdefault('object_repr', smart_text(instance)) + + if isinstance(pk, integer_types): + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + @property + def changes_str(self, colon=': ', arrow=smart_text(' \u2192 '), separator='; '): + substrings = [] + + for field, values in iteritems(self.changes_dict): + substring = smart_text('{field_name:s}{colon:s}{old:s}{arrow:s}{new:s}').format( + field_name=field, + colon=colon, + old=values[0], + arrow=arrow, + new=values[1], + ) + substrings.append(substring) + + return separator.join(substrings) + + @property + def changes_display_dict(self): + from auditlog.registry import auditlog + model = self.content_type.model_class() + model_fields = auditlog.get_model_fields(model._meta.model) + changes_display_dict = {} + for field_name, values in iteritems(self.changes_dict): + try: + field = model._meta.get_field(field_name) +~~ except FieldDoesNotExist: + changes_display_dict[field_name] = values + continue + values_display = [] + choices_dict = None + if hasattr(field, 'choices') and len(field.choices) > 0: + choices_dict = dict(field.choices) + if hasattr(field, 'base_field') and getattr(field.base_field, 'choices', False): + choices_dict = dict(field.base_field.choices) + + if choices_dict: + for value in values: + try: + value = ast.literal_eval(value) + if type(value) is [].__class__: + values_display.append(', '.join([choices_dict.get(val, 'None') for val in value])) + else: + values_display.append(choices_dict.get(value, 'None')) + except ValueError: + values_display.append(choices_dict.get(value, 'None')) + except: + values_display.append(choices_dict.get(value, 'None')) + else: + try: + field_type = field.get_internal_type() + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / utils.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./utils.py) + +```python +# utils.py +import base64 +import importlib +import json +import random +import re +import string +import unicodedata +from collections import OrderedDict +from urllib.parse import urlsplit + +import django +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +~~from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.core.serializers.json import DjangoJSONEncoder +from django.core.validators import ValidationError, validate_email +from django.db.models import FileField +from django.db.models.fields import ( + BinaryField, + DateField, + DateTimeField, + EmailField, + TimeField, +) +from django.utils import dateparse +from django.utils.encoding import force_bytes, force_str + + +MAX_USERNAME_SUFFIX_LENGTH = 7 +USERNAME_SUFFIX_CHARS = ( + [string.digits] * 4 + + [string.ascii_letters] * (MAX_USERNAME_SUFFIX_LENGTH - 4)) + + +def _generate_unique_username_base(txts, regex=None): + from .account.adapter import get_adapter + adapter = get_adapter() + username = None + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + else: + ret = path_or_callable + return ret + + +SERIALIZED_DB_FIELD_PREFIX = '_db_' + + +def serialize_instance(instance): + data = {} + for k, v in instance.__dict__.items(): + if k.startswith('_') or callable(v): + continue + try: + field = instance._meta.get_field(k) + if isinstance(field, BinaryField): + v = force_str(base64.b64encode(v)) + elif isinstance(field, FileField): + if v and not isinstance(v, str): + v = v.name + try: + json.dumps(v, cls=DjangoJSONEncoder) + except TypeError: + v = field.get_prep_value(v) + k = SERIALIZED_DB_FIELD_PREFIX + k +~~ except FieldDoesNotExist: + pass + data[k] = v + return json.loads(json.dumps(data, cls=DjangoJSONEncoder)) + + +def deserialize_instance(model, data): + ret = model() + for k, v in data.items(): + is_db_value = False + if k.startswith(SERIALIZED_DB_FIELD_PREFIX): + k = k[len(SERIALIZED_DB_FIELD_PREFIX):] + is_db_value = True + if v is not None: + try: + f = model._meta.get_field(k) + if isinstance(f, DateTimeField): + v = dateparse.parse_datetime(v) + elif isinstance(f, TimeField): + v = dateparse.parse_time(v) + elif isinstance(f, DateField): + v = dateparse.parse_date(v) + elif isinstance(f, BinaryField): + v = force_bytes( + base64.b64decode( + force_bytes(v))) + elif is_db_value: + try: + if django.VERSION < (3, 0): + v = f.from_db_value(v, None, None, None) + else: + v = f.from_db_value(v, None, None) + except Exception: + raise ImproperlyConfigured( + "Unable to auto serialize field '{}', custom" + " serialization override required".format(k) + ) +~~ except FieldDoesNotExist: + pass + setattr(ret, k, v) + return ret + + +def set_form_field_order(form, field_order): + if field_order is None: + return + fields = OrderedDict() + for key in field_order: + try: + fields[key] = form.fields.pop(key) + except KeyError: # ignore unknown fields + pass + fields.update(form.fields) # add remaining fields in original order + form.fields = fields + + +def build_absolute_uri(request, location, protocol=None): + from .account import app_settings as account_settings + + if request is None: + site = Site.objects.get_current() + bits = urlsplit(location) + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 3 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / utils.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./utils.py) + +```python +# utils.py +import warnings +from collections import OrderedDict + +from django.conf import settings +~~from django.core.exceptions import FieldDoesNotExist, FieldError +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.expressions import Expression +from django.db.models.fields.related import ForeignObjectRel, RelatedField +from django.utils import timezone +from django.utils.encoding import force_str +from django.utils.text import capfirst +from django.utils.translation import gettext as _ + +from .exceptions import FieldLookupError + + +def deprecate(msg, level_modifier=0): + warnings.warn(msg, MigrationNotice, stacklevel=3 + level_modifier) + + +class MigrationNotice(DeprecationWarning): + url = 'https://django-filter.readthedocs.io/en/master/guide/migration.html' + + def __init__(self, message): + super().__init__('%s See: %s' % (message, self.url)) + + +class RenameAttributesBase(type): + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + + +def get_all_model_fields(model): + opts = model._meta + + return [ + f.name for f in sorted(opts.fields + opts.many_to_many) + if not isinstance(f, models.AutoField) and + not (getattr(f.remote_field, 'parent_link', False)) + ] + + +def get_model_field(model, field_name): + fields = get_field_parts(model, field_name) + return fields[-1] if fields else None + + +def get_field_parts(model, field_name): + parts = field_name.split(LOOKUP_SEP) + opts = model._meta + fields = [] + + for name in parts: + try: + field = opts.get_field(name) +~~ except FieldDoesNotExist: + return None + + fields.append(field) + if isinstance(field, RelatedField): + opts = field.remote_field.model._meta + elif isinstance(field, ForeignObjectRel): + opts = field.related_model._meta + + return fields + + +def resolve_field(model_field, lookup_expr): + query = model_field.model._default_manager.all().query + lhs = Expression(model_field) + lookups = lookup_expr.split(LOOKUP_SEP) + + assert len(lookups) > 0 + + try: + while lookups: + name = lookups[0] + args = (lhs, name) + if len(lookups) == 1: + final_lookup = lhs.get_lookup(name) + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 4 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / managers.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./managers.py) + +```python +# managers.py +~~from django.core.exceptions import FieldDoesNotExist +from django.db import models +from django.db.models import Q +from guardian.core import ObjectPermissionChecker +from guardian.ctypes import get_content_type +from guardian.exceptions import ObjectNotPersisted +from django.contrib.auth.models import Permission + +import warnings + + +class BaseObjectPermissionManager(models.Manager): + + @property + def user_or_group_field(self): + try: + self.model._meta.get_field('user') + return 'user' +~~ except FieldDoesNotExist: + return 'group' + + def is_generic(self): + try: + self.model._meta.get_field('object_pk') + return True +~~ except FieldDoesNotExist: + return False + + def assign_perm(self, perm, user_or_group, obj): + if getattr(obj, 'pk', None) is None: + raise ObjectNotPersisted("Object %s needs to be persisted first" + % obj) + ctype = get_content_type(obj) + if not isinstance(perm, Permission): + permission = Permission.objects.get(content_type=ctype, codename=perm) + else: + permission = perm + + kwargs = {'permission': permission, self.user_or_group_field: user_or_group} + if self.is_generic(): + kwargs['content_type'] = ctype + kwargs['object_pk'] = obj.pk + else: + kwargs['content_object'] = obj + obj_perm, _ = self.get_or_create(**kwargs) + return obj_perm + + def bulk_assign_perm(self, perm, user_or_group, queryset): + if isinstance(queryset, list): + ctype = get_content_type(queryset[0]) + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 5 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / resources.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./resources.py) + +```python +# resources.py +import django +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.management.color import no_style +from django.core.paginator import Paginator +from django.db import DEFAULT_DB_ALIAS, connections +from django.db.models.fields.related import ForeignObjectRel +from django.db.models.query import QuerySet +from django.db.transaction import ( + TransactionManagementError, + atomic, + savepoint, + savepoint_commit, + savepoint_rollback +) +from django.utils.encoding import force_str +from django.utils.safestring import mark_safe + +from . import widgets +from .fields import Field +from .instance_loaders import ModelInstanceLoader +from .results import Error, Result, RowResult +from .utils import atomic_if_using_transaction + +if django.VERSION[0] >= 3: +~~ from django.core.exceptions import FieldDoesNotExist +else: + from django.db.models.fields import FieldDoesNotExist + + +logger = logging.getLogger(__name__) +logger.addHandler(logging.NullHandler()) + +USE_TRANSACTIONS = getattr(settings, 'IMPORT_EXPORT_USE_TRANSACTIONS', True) +CHUNK_SIZE = getattr(settings, 'IMPORT_EXPORT_CHUNK_SIZE', 1) + + +def get_related_model(field): + if hasattr(field, 'related_model'): + return field.related_model + if field.rel: + return field.rel.to + + +class ResourceOptions: + + model = None + fields = None + + exclude = None + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + continue + + field = new_class.field_from_django_field(f.name, f, + readonly=False) + field_list.append((f.name, field, )) + + new_class.fields.update(OrderedDict(field_list)) + + if opts.fields is not None: + field_list = [] + for field_name in opts.fields: + if field_name in declared_fields: + continue + if field_name.find('__') == -1: + continue + + model = opts.model + attrs = field_name.split('__') + for i, attr in enumerate(attrs): + verbose_path = ".".join([opts.model.__name__] + attrs[0:i+1]) + + try: + f = model._meta.get_field(attr) +~~ except FieldDoesNotExist as e: + logger.debug(e, exc_info=e) +~~ raise FieldDoesNotExist( + "%s: %s has no field named '%s'" % + (verbose_path, model.__name__, attr)) + + if i < len(attrs) - 1: + if isinstance(f, ForeignObjectRel): + model = get_related_model(f) + else: + if get_related_model(f) is None: + raise KeyError( + '%s is not a relation' % verbose_path) + model = get_related_model(f) + + if isinstance(f, ForeignObjectRel): + f = f.field + + field = new_class.field_from_django_field(field_name, f, + readonly=True) + field_list.append((field_name, field)) + + new_class.fields.update(OrderedDict(field_list)) + + return new_class + + + continue + if f.name in declared_fields: + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 6 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / serializers.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./serializers.py) + +```python +# serializers.py +import copy +import inspect +import traceback +from collections import OrderedDict, defaultdict +from collections.abc import Mapping + +~~from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.core.exceptions import ValidationError as DjangoValidationError +from django.db import models +from django.db.models.fields import Field as DjangoModelField +from django.utils import timezone +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ + +from rest_framework.compat import postgres_fields +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.fields import get_error_detail, set_value +from rest_framework.settings import api_settings +from rest_framework.utils import html, model_meta, representation +from rest_framework.utils.field_mapping import ( + ClassLookupDict, get_field_kwargs, get_nested_relation_kwargs, + get_relation_kwargs, get_url_kwargs +) +from rest_framework.utils.serializer_helpers import ( + BindingDict, BoundField, JSONBoundField, NestedBoundField, ReturnDict, + ReturnList +) +from rest_framework.validators import ( + UniqueForDateValidator, UniqueForMonthValidator, UniqueForYearValidator, + UniqueTogetherValidator +) + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + extra_kwargs[key] = value + + return extra_kwargs, hidden_fields + + def _get_model_fields(self, field_names, declared_fields, extra_kwargs): + model = getattr(self.Meta, 'model') + model_fields = {} + + for field_name in field_names: + if field_name in declared_fields: + field = declared_fields[field_name] + source = field.source or field_name + else: + try: + source = extra_kwargs[field_name]['source'] + except KeyError: + source = field_name + + if '.' in source or source == '*': + continue + + try: + field = model._meta.get_field(source) + if isinstance(field, DjangoModelField): + model_fields[source] = field +~~ except FieldDoesNotExist: + pass + + return model_fields + + + def get_validators(self): + validators = getattr(getattr(self, 'Meta', None), 'validators', None) + if validators is not None: + return list(validators) + + return ( + self.get_unique_together_validators() + + self.get_unique_for_date_validators() + ) + + def get_unique_together_validators(self): + model_class_inheritance_tree = ( + [self.Meta.model] + + list(self.Meta.model._meta.parents) + ) + + field_sources = OrderedDict( + (field.field_name, field.source) for field in self._writable_fields + if (field.source != '*') and ('.' not in field.source) + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 7 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / utils.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/./utils.py) + +```python +# utils.py +import inspect +import warnings +from collections import OrderedDict +from functools import total_ordering +from itertools import chain + +~~from django.core.exceptions import FieldDoesNotExist +from django.db import models +from django.utils.html import format_html_join + + +class Sequence(list): + + def expand(self, columns): + ellipses = self.count("...") + if ellipses > 1: + raise ValueError("'...' must be used at most once in a sequence.") + elif ellipses == 0: + self.append("...") + + columns = list(columns) # take a copy and exhaust the generator + head = [] + tail = [] + target = head # start by adding things to the head + for name in self: + if name == "...": + target = tail + continue + target.append(name) + if name in columns: + columns.pop(columns.index(name)) + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + if safe and getattr(current, "alters_data", False): + raise ValueError(self.ALTERS_DATA_ERROR_FMT.format(method=repr(current))) + if not getattr(current, "do_not_call_in_templates", False): + current = current() + if current is None: + break + return current + except Exception: + if not quiet: + raise + + @property + def bits(self): + if self == "": + return () + return self.split(self.SEPARATOR) + + def get_field(self, model): + if not hasattr(model, "_meta"): + return + + field = None + for bit in self.bits: + try: + field = model._meta.get_field(bit) +~~ except FieldDoesNotExist: + break + + if hasattr(field, "remote_field"): + rel = getattr(field, "remote_field", None) + model = getattr(rel, "model", model) + + return field + + def penultimate(self, context, quiet=True): + path, _, remainder = self.rpartition(self.SEPARATOR) + return A(path).resolve(context, quiet=quiet), remainder + + +A = Accessor # alias + + +class AttributeDict(OrderedDict): + + blacklist = ("th", "td", "_ordering", "thead", "tbody", "tfoot") + + def _iteritems(self): + for key, v in self.items(): + value = v() if callable(v) else v + if key not in self.blacklist and value is not None: + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 8 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms_account_handling.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms_account_handling.py) + +```python +# forms_account_handling.py +import random +import string + +import django.contrib.auth.models +from django import forms +from django.contrib.auth import get_user_model +from django.contrib.auth.forms import UserCreationForm +~~from django.core.exceptions import FieldDoesNotExist +from django.db.models.fields import CharField +from django.db.models.fields import EmailField +from django.utils.translation import gettext_lazy as _ +from wiki.conf import settings + + +def _get_field(model, field): + try: + return model._meta.get_field(field) +~~ except FieldDoesNotExist: + return + + +User = get_user_model() + + +def check_user_field(user_model): + return isinstance(_get_field(user_model, user_model.USERNAME_FIELD), CharField) + + +def check_email_field(user_model): + return isinstance( + _get_field(user_model, user_model.get_email_field_name()), EmailField + ) + + +CustomUser = ( + User + if ( + settings.ACCOUNT_HANDLING and check_user_field(User) and check_email_field(User) + ) + else django.contrib.auth.models.User +) + + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 9 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / edit_handlers.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/edit_handlers.py) + +```python +# edit_handlers.py +import functools +import re + +from django import forms +~~from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.db.models.fields import CharField, TextField +from django.forms.formsets import DELETION_FIELD_NAME, ORDERING_FIELD_NAME +from django.forms.models import fields_for_model +from django.template.loader import render_to_string +from django.utils.functional import cached_property +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy +from taggit.managers import TaggableManager + +from wagtail.admin import compare, widgets +from wagtail.core.fields import RichTextField +from wagtail.core.models import Page +from wagtail.core.utils import camelcase_to_underscore, resolve_model_string +from wagtail.utils.decorators import cached_classmethod + +from .forms.models import ( # NOQA + DIRECT_FORM_FIELD_OVERRIDES, FORM_FIELD_OVERRIDES, WagtailAdminModelForm, formfield_for_dbfield) +from .forms.pages import WagtailAdminPageForm + + +def widget_with_script(widget, script): + return mark_safe('{0}'.format(widget, script)) + + + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + def get_comparison_class(self): + widget_override = self.widget_overrides().get(self.field_name, None) + if widget_override and widget_override.is_hidden: + return + + try: + field = self.db_field + + if field.choices: + return compare.ChoiceFieldComparison + + if field.is_relation: + if isinstance(field, TaggableManager): + return compare.TagsFieldComparison + elif field.many_to_many: + return compare.M2MFieldComparison + + return compare.ForeignObjectComparison + + if isinstance(field, RichTextField): + return compare.RichTextFieldComparison + + if isinstance(field, (CharField, TextField)): + return compare.TextFieldComparison + +~~ except FieldDoesNotExist: + pass + + return compare.FieldComparison + + def get_comparison(self): + comparator_class = self.get_comparison_class() + + if comparator_class: + try: + return [functools.partial(comparator_class, self.db_field)] +~~ except FieldDoesNotExist: + return [] + return [] + + @cached_property + def db_field(self): + try: + model = self.model + except AttributeError: + raise ImproperlyConfigured("%r must be bound to a model before calling db_field" % self) + + return model._meta.get_field(self.field_name) + + def on_form_bound(self): + self.bound_field = self.form[self.field_name] + self.heading = self.heading or self.bound_field.label + self.help_text = self.bound_field.help_text + + def __repr__(self): + return "<%s '%s' with model=%s instance=%s request=%s form=%s>" % ( + self.__class__.__name__, self.field_name, + self.model, self.instance, self.request, self.form.__class__.__name__) + + +class RichTextFieldPanel(FieldPanel): + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-fielderror.markdown b/content/pages/examples/django/django-core-exceptions-fielderror.markdown new file mode 100644 index 000000000..e9ea93104 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-fielderror.markdown @@ -0,0 +1,371 @@ +title: django.core.exceptions FieldError Example Code +category: page +slug: django-core-exceptions-fielderror-examples +sortorder: 500011100 +toc: False +sidebartitle: django.core.exceptions FieldError +meta: Python example code for the FieldError class from the django.core.exceptions module of the Django project. + + +FieldError is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / api.py**](https://github.com/divio/django-cms/blob/develop/cms/./api.py) + +```python +# api.py +import datetime + +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +~~from django.core.exceptions import FieldError +from django.core.exceptions import PermissionDenied +from django.core.exceptions import ValidationError +from django.db import transaction +from django.template.defaultfilters import slugify +from django.template.loader import get_template +from django.utils.translation import activate + +from six import string_types + +from cms import constants +from cms.app_base import CMSApp +from cms.apphook_pool import apphook_pool +from cms.constants import TEMPLATE_INHERITANCE_MAGIC +from cms.models.pagemodel import Page +from cms.models.permissionmodels import (PageUser, PagePermission, GlobalPagePermission, + ACCESS_PAGE_AND_DESCENDANTS) +from cms.models.placeholdermodel import Placeholder +from cms.models.pluginmodel import CMSPlugin +from cms.models.titlemodels import Title +from cms.plugin_base import CMSPluginBase +from cms.plugin_pool import plugin_pool +from cms.utils import copy_plugins, get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import get_language_list + + +## ... source file abbreviated to get to FieldError examples ... + + + + if navigation_extenders: + raw_menus = menu_pool.get_menus_by_attribute("cms_enabled", True) + menus = [menu[0] for menu in raw_menus] + assert navigation_extenders in menus + + accepted_limitations = (constants.VISIBILITY_ALL, constants.VISIBILITY_USERS, constants.VISIBILITY_ANONYMOUS) + assert limit_visibility_in_menu in accepted_limitations + + assert position in ('last-child', 'first-child', 'left', 'right') + target_node = parent.node if parent else None + + if apphook: + application_urls = _verify_apphook(apphook, apphook_namespace) + else: + application_urls = None + + if created_by and isinstance(created_by, get_user_model()): + _thread_locals.user = created_by + created_by = getattr(created_by, get_user_model().USERNAME_FIELD) + else: + _thread_locals.user = None + + if reverse_id: + if Page.objects.drafts().filter(reverse_id=reverse_id, node__site=site).exists(): +~~ raise FieldError('A page with the reverse_id="%s" already exist.' % reverse_id) + + page = Page( + created_by=created_by, + changed_by=created_by, + publication_date=publication_date, + publication_end_date=publication_end_date, + in_navigation=in_navigation, + soft_root=soft_root, + reverse_id=reverse_id, + navigation_extenders=navigation_extenders, + template=template, + application_urls=application_urls, + application_namespace=apphook_namespace, + login_required=login_required, + limit_visibility_in_menu=limit_visibility_in_menu, + xframe_options=xframe_options, + ) + page.set_tree_node(site=site, target=target_node, position=position) + page.save() + page.rescan_placeholders() + + create_title( + language=language, + title=title, + + +## ... source file continues with no further FieldError examples... + +``` + + +## Example 2 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / utils.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./utils.py) + +```python +# utils.py +import warnings +from collections import OrderedDict + +from django.conf import settings +~~from django.core.exceptions import FieldDoesNotExist, FieldError +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.expressions import Expression +from django.db.models.fields.related import ForeignObjectRel, RelatedField +from django.utils import timezone +from django.utils.encoding import force_str +from django.utils.text import capfirst +from django.utils.translation import gettext as _ + +from .exceptions import FieldLookupError + + +def deprecate(msg, level_modifier=0): + warnings.warn(msg, MigrationNotice, stacklevel=3 + level_modifier) + + +class MigrationNotice(DeprecationWarning): + url = 'https://django-filter.readthedocs.io/en/master/guide/migration.html' + + def __init__(self, message): + super().__init__('%s See: %s' % (message, self.url)) + + +class RenameAttributesBase(type): + + +## ... source file abbreviated to get to FieldError examples ... + + + elif isinstance(field, ForeignObjectRel): + opts = field.related_model._meta + + return fields + + +def resolve_field(model_field, lookup_expr): + query = model_field.model._default_manager.all().query + lhs = Expression(model_field) + lookups = lookup_expr.split(LOOKUP_SEP) + + assert len(lookups) > 0 + + try: + while lookups: + name = lookups[0] + args = (lhs, name) + if len(lookups) == 1: + final_lookup = lhs.get_lookup(name) + if not final_lookup: + lhs = query.try_transform(*args) + final_lookup = lhs.get_lookup('exact') + return lhs.output_field, final_lookup.lookup_name + lhs = query.try_transform(*args) + lookups = lookups[1:] +~~ except FieldError as e: + raise FieldLookupError(model_field, lookup_expr) from e + + +def handle_timezone(value, is_dst=None): + if settings.USE_TZ and timezone.is_naive(value): + return timezone.make_aware(value, timezone.get_current_timezone(), is_dst) + elif not settings.USE_TZ and timezone.is_aware(value): + return timezone.make_naive(value, timezone.utc) + return value + + +def verbose_field_name(model, field_name): + if field_name is None: + return '[invalid name]' + + parts = get_field_parts(model, field_name) + if not parts: + return '[invalid name]' + + names = [] + for part in parts: + if isinstance(part, ForeignObjectRel): + if part.related_name: + names.append(part.related_name.replace('_', ' ')) + + +## ... source file continues with no further FieldError examples... + +``` + + +## Example 3 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / tracker.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./tracker.py) + +```python +# tracker.py +from copy import deepcopy +from functools import wraps + +import django +~~from django.core.exceptions import FieldError +from django.db import models +from django.db.models.fields.files import FileDescriptor +from django.db.models.query_utils import DeferredAttribute + + +class DescriptorMixin: + tracker_instance = None + + def __get__(self, instance, owner): + if instance is None: + return self + was_deferred = False + field_name = self._get_field_name() + if field_name in instance._deferred_fields: + instance._deferred_fields.remove(field_name) + was_deferred = True + value = super().__get__(instance, owner) + if was_deferred: + self.tracker_instance.saved_data[field_name] = deepcopy(value) + return value + + def _get_field_name(self): + return self.field_name + + + +## ... source file abbreviated to get to FieldError examples ... + + + else: + self.saved_data.update(**self.current(fields=fields)) + + for field, field_value in self.saved_data.items(): + self.saved_data[field] = deepcopy(field_value) + + def current(self, fields=None): + if fields is None: + deferred_fields = self.deferred_fields + if deferred_fields: + fields = [ + field for field in self.fields + if field not in deferred_fields + ] + else: + fields = self.fields + + return {f: self.get_field_value(f) for f in fields} + + def has_changed(self, field): + if field in self.fields: + if field in self.deferred_fields and field not in self.instance.__dict__: + return False + return self.previous(field) != self.get_field_value(field) + else: +~~ raise FieldError('field "%s" not tracked' % field) + + def previous(self, field): + + if self.instance.pk and field in self.deferred_fields and field not in self.saved_data: + + if field not in self.instance.__dict__: + self.get_field_value(field) + + else: + current_value = self.get_field_value(field) + self.instance.refresh_from_db(fields=[field]) + self.saved_data[field] = deepcopy(self.get_field_value(field)) + setattr(self.instance, self.field_map[field], current_value) + + return self.saved_data.get(field) + + def changed(self): + return { + field: self.previous(field) + for field in self.fields + if self.has_changed(field) + } + + def init_deferred_fields(self): + + +## ... source file abbreviated to get to FieldError examples ... + + + field for field in update_fields if + field in self.fields + ) + getattr(instance, self.attname).set_saved_fields( + fields=fields + ) + return ret + + setattr(model, method, inner) + + def __get__(self, instance, owner): + if instance is None: + return self + else: + return getattr(instance, self.attname) + + +class ModelInstanceTracker(FieldInstanceTracker): + + def has_changed(self, field): + if not self.instance.pk: + return True + elif field in self.saved_data: + return self.previous(field) != self.get_field_value(field) + else: +~~ raise FieldError('field "%s" not tracked' % field) + + def changed(self): + if not self.instance.pk: + return {} + saved = self.saved_data.items() + current = self.current() + return {k: v for k, v in saved if v != current[k]} + + +class ModelTracker(FieldTracker): + tracker_class = ModelInstanceTracker + + def get_field_map(self, cls): + return {field: field for field in self.fields} + + + +## ... source file continues with no further FieldError examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown b/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown index d38b11d7a..8b4c0bcb0 100644 --- a/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown +++ b/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown @@ -1,6 +1,6 @@ title: django.core.exceptions ImproperlyConfigured Example Code category: page -slug: django-core-exceptions-improperlyconfigured +slug: django-core-exceptions-improperlyconfigured-examples sortorder: 500012505 toc: False sidebartitle: django.core.exceptions ImproperlyConfigured diff --git a/content/pages/examples/django/django-core-exceptions-middlewarenotused.markdown b/content/pages/examples/django/django-core-exceptions-middlewarenotused.markdown new file mode 100644 index 000000000..d93d2e380 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-middlewarenotused.markdown @@ -0,0 +1,122 @@ +title: django.core.exceptions MiddlewareNotUsed Example Code +category: page +slug: django-core-exceptions-middlewarenotused-examples +sortorder: 500011102 +toc: False +sidebartitle: django.core.exceptions MiddlewareNotUsed +meta: Python example code for the MiddlewareNotUsed class from the django.core.exceptions module of the Django project. + + +MiddlewareNotUsed is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / middleware.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./middleware.py) + +```python +# middleware.py +~~from django.core.exceptions import MiddlewareNotUsed +from django.utils.encoding import DjangoUnicodeDecodeError +from django.utils.html import strip_spaces_between_tags as minify_html + +from pipeline.conf import settings + +from django.utils.deprecation import MiddlewareMixin + + +class MinifyHTMLMiddleware(MiddlewareMixin): + def __init__(self, *args, **kwargs): + super(MinifyHTMLMiddleware, self).__init__(*args, **kwargs) + if not settings.PIPELINE_ENABLED: +~~ raise MiddlewareNotUsed + + def process_response(self, request, response): + if response.has_header('Content-Type') and 'text/html' in response['Content-Type']: + try: + response.content = minify_html(response.content.decode('utf-8').strip()) + response['Content-Length'] = str(len(response.content)) + except DjangoUnicodeDecodeError: + pass + return response + + + +## ... source file continues with no further MiddlewareNotUsed examples... + +``` + + +## Example 2 from django-user-visit +[django-user-visit](https://github.com/yunojuno/django-user-visit) +([PyPI package information](https://pypi.org/project/django-user-visit/)) +is a [Django](/django.html) app and +[middleware](https://docs.djangoproject.com/en/stable/topics/http/middleware/) +for tracking daily user visits to your web application. The goal +is to record per user per day instead of for every request a user +sends to the application. The project is provided as open source +under the +[MIT license](https://github.com/yunojuno/django-user-visit/blob/master/LICENSE). + +[**django-user-visit / user_visit / middleware.py**](https://github.com/yunojuno/django-user-visit/blob/master/user_visit/./middleware.py) + +```python +# middleware.py +import logging +import typing + +import django.db +~~from django.core.exceptions import MiddlewareNotUsed +from django.http import HttpRequest, HttpResponse +from django.utils import timezone + +from user_visit.models import UserVisit + +from .settings import RECORDING_DISABLED + +logger = logging.getLogger(__name__) + +SESSION_KEY = "user_visit.hash" + + +class UserVisitMiddleware: + + def __init__(self, get_response: typing.Callable) -> None: + if RECORDING_DISABLED: +~~ raise MiddlewareNotUsed("UserVisit recording has been disabled") + self.get_response = get_response + + def __call__(self, request: HttpRequest) -> typing.Optional[HttpResponse]: + if request.user.is_anonymous: + return self.get_response(request) + + uv = UserVisit.objects.build(request, timezone.now()) + if request.session.get(SESSION_KEY, "") == uv.hash: + return self.get_response(request) + + try: + uv.save() + except django.db.IntegrityError: + logger.warning("Unable to record user visit - duplicate request hash") + else: + request.session[SESSION_KEY] = uv.hash + return self.get_response(request) + + + +## ... source file continues with no further MiddlewareNotUsed examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-non-field-errors.markdown b/content/pages/examples/django/django-core-exceptions-non-field-errors.markdown new file mode 100644 index 000000000..0421e6dd7 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-non-field-errors.markdown @@ -0,0 +1,158 @@ +title: django.core.exceptions NON_FIELD_ERRORS Example Code +category: page +slug: django-core-exceptions-non-field-errors-examples +sortorder: 500011103 +toc: False +sidebartitle: django.core.exceptions NON_FIELD_ERRORS +meta: Python example code for the NON_FIELD_ERRORS constant from the django.core.exceptions module of the Django project. + + +NON_FIELD_ERRORS is a constant within the django.core.exceptions module of the Django project. + + +## Example 1 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / results.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./results.py) + +```python +# results.py +from collections import OrderedDict +from tablib import Dataset + +~~from django.core.exceptions import NON_FIELD_ERRORS + + +class Error: + def __init__(self, error, traceback=None, row=None): + self.error = error + self.traceback = traceback + self.row = row + + +class RowResult: + IMPORT_TYPE_UPDATE = 'update' + IMPORT_TYPE_NEW = 'new' + IMPORT_TYPE_DELETE = 'delete' + IMPORT_TYPE_SKIP = 'skip' + IMPORT_TYPE_ERROR = 'error' + IMPORT_TYPE_INVALID = 'invalid' + + valid_import_types = frozenset([ + IMPORT_TYPE_NEW, + IMPORT_TYPE_UPDATE, + IMPORT_TYPE_DELETE, + IMPORT_TYPE_SKIP, + ]) + + + +## ... source file abbreviated to get to NON_FIELD_ERRORS examples ... + + + self.diff = None + self.import_type = None + self.raw_values = {} + + +class InvalidRow: + + def __init__(self, number, validation_error, values): + self.number = number + self.error = validation_error + self.values = values + try: + self.error_dict = validation_error.message_dict + except AttributeError: + self.error_dict = {NON_FIELD_ERRORS: validation_error.messages} + + @property + def field_specific_errors(self): + return { + key: value for key, value in self.error_dict.items() + if key != NON_FIELD_ERRORS + } + + @property + def non_field_specific_errors(self): +~~ return self.error_dict.get(NON_FIELD_ERRORS, []) + + @property + def error_count(self): + count = 0 + for error_list in self.error_dict.values(): + count += len(error_list) + return count + + +class Result: + def __init__(self, *args, **kwargs): + super().__init__() + self.base_errors = [] + self.diff_headers = [] + self.rows = [] # RowResults + self.invalid_rows = [] # InvalidRow + self.failed_dataset = Dataset() + self.totals = OrderedDict([(RowResult.IMPORT_TYPE_NEW, 0), + (RowResult.IMPORT_TYPE_UPDATE, 0), + (RowResult.IMPORT_TYPE_DELETE, 0), + (RowResult.IMPORT_TYPE_SKIP, 0), + (RowResult.IMPORT_TYPE_ERROR, 0), + (RowResult.IMPORT_TYPE_INVALID, 0)]) + self.total_rows = 0 + + +## ... source file continues with no further NON_FIELD_ERRORS examples... + +``` + + +## Example 2 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / messages.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/messages.py) + +```python +# messages.py +from django.contrib import messages +~~from django.core.exceptions import NON_FIELD_ERRORS +from django.template.loader import render_to_string +from django.utils.html import format_html, format_html_join + + +def render(message, buttons, detail=''): + return render_to_string('wagtailadmin/shared/messages.html', { + 'message': message, + 'buttons': buttons, + 'detail': detail, + }) + + +def debug(request, message, buttons=None, extra_tags=''): + return messages.debug(request, render(message, buttons), extra_tags=extra_tags) + + +def info(request, message, buttons=None, extra_tags=''): + return messages.info(request, render(message, buttons), extra_tags=extra_tags) + + +def success(request, message, buttons=None, extra_tags=''): + return messages.success(request, render(message, buttons), extra_tags=extra_tags) + + + + +## ... source file continues with no further NON_FIELD_ERRORS examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-objectdoesnotexist.markdown b/content/pages/examples/django/django-core-exceptions-objectdoesnotexist.markdown new file mode 100644 index 000000000..755ef4441 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-objectdoesnotexist.markdown @@ -0,0 +1,969 @@ +title: django.core.exceptions ObjectDoesNotExist Example Code +category: page +slug: django-core-exceptions-objectdoesnotexist-examples +sortorder: 500011104 +toc: False +sidebartitle: django.core.exceptions ObjectDoesNotExist +meta: Python example code for the ObjectDoesNotExist class from the django.core.exceptions module of the Django project. + + +ObjectDoesNotExist is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / diff.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/diff.py) + +```python +# diff.py +from __future__ import unicode_literals + +from django.conf import settings +~~from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Model, NOT_PROVIDED, DateTimeField +from django.utils import timezone +from django.utils.encoding import smart_text + + +def track_field(field): + from auditlog.models import LogEntry + if field.many_to_many: + return False + + if getattr(field, 'remote_field', None) is not None and field.remote_field.model == LogEntry: + return False + + elif getattr(field, 'rel', None) is not None and field.rel.to == LogEntry: + return False + + return True + + +def get_fields_in_model(instance): + assert isinstance(instance, Model) + + use_api = hasattr(instance._meta, 'get_fields') and callable(instance._meta.get_fields) + + if use_api: + return [f for f in instance._meta.get_fields() if track_field(f)] + return instance._meta.fields + + +def get_field_value(obj, field): + if isinstance(field, DateTimeField): + try: + value = field.to_python(getattr(obj, field.name, None)) + if value is not None and settings.USE_TZ and not timezone.is_naive(value): + value = timezone.make_naive(value, timezone=timezone.utc) +~~ except ObjectDoesNotExist: + value = field.default if field.default is not NOT_PROVIDED else None + else: + try: + value = smart_text(getattr(obj, field.name, None)) +~~ except ObjectDoesNotExist: + value = field.default if field.default is not NOT_PROVIDED else None + + return value + + +def model_instance_diff(old, new): + from auditlog.registry import auditlog + + if not(old is None or isinstance(old, Model)): + raise TypeError("The supplied old instance is not a valid model instance.") + if not(new is None or isinstance(new, Model)): + raise TypeError("The supplied new instance is not a valid model instance.") + + diff = {} + + if old is not None and new is not None: + fields = set(old._meta.fields + new._meta.fields) + model_fields = auditlog.get_model_fields(new._meta.model) + elif old is not None: + fields = set(get_fields_in_model(old)) + model_fields = auditlog.get_model_fields(old._meta.model) + elif new is not None: + fields = set(get_fields_in_model(new)) + model_fields = auditlog.get_model_fields(new._meta.model) + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / test_utils / testcases.py**](https://github.com/divio/django-cms/blob/develop/cms/test_utils/testcases.py) + +```python +# testcases.py +import json +import sys +import warnings + +from django.conf import settings +from django.contrib.auth import get_user_model +from django.contrib.auth.models import AnonymousUser, Permission +from django.contrib.sites.models import Site +from django.core.cache import cache +~~from django.core.exceptions import ObjectDoesNotExist +from django.forms.models import model_to_dict +from django.template import engines +from django.template.context import Context +from django.test import testcases +from django.test.client import RequestFactory +from django.urls import reverse +from django.utils.http import urlencode +from django.utils.timezone import now +from django.utils.translation import activate +from menus.menu_pool import menu_pool + +from six.moves.urllib.parse import unquote, urljoin + +from cms.api import create_page +from cms.constants import ( + PUBLISHER_STATE_DEFAULT, + PUBLISHER_STATE_DIRTY, + PUBLISHER_STATE_PENDING, +) +from cms.plugin_rendering import ContentRenderer, StructureRenderer +from cms.models import Page +from cms.models.permissionmodels import ( + GlobalPagePermission, + PagePermission, + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + page_data['pagepermission_set-2-TOTAL_FORMS'] = 0 + page_data['pagepermission_set-2-INITIAL_FORMS'] = 0 + page_data['pagepermission_set-2-MAX_NUM_FORMS'] = 0 + return page_data + + def print_page_structure(self, qs): + for page in qs.order_by('path'): + ident = " " * page.level + print(u"%s%s (%s), path: %s, depth: %s, numchild: %s" % (ident, page, + page.pk, page.path, page.depth, page.numchild)) + + def print_node_structure(self, nodes, *extra): + def _rec(nodes, level=0): + ident = level * ' ' + for node in nodes: + raw_attrs = [(bit, getattr(node, bit, node.attr.get(bit, "unknown"))) for bit in extra] + attrs = ', '.join(['%s: %r' % data for data in raw_attrs]) + print(u"%s%s: %s" % (ident, node.title, attrs)) + _rec(node.children, level + 1) + + _rec(nodes) + + def assertObjectExist(self, qs, **filter): + try: + return qs.get(**filter) +~~ except ObjectDoesNotExist: + pass + raise self.failureException("ObjectDoesNotExist raised for filter %s" % filter) + + def assertObjectDoesNotExist(self, qs, **filter): + try: + qs.get(**filter) +~~ except ObjectDoesNotExist: + return + raise self.failureException("ObjectDoesNotExist not raised for filter %s" % filter) + + def copy_page(self, page, target_page, position=0, target_site=None): + from cms.utils.page import get_available_slug + + if target_site is None: + target_site = target_page.node.site + + data = { + 'position': position, + 'target': target_page.pk, + 'source_site': page.node.site_id, + 'copy_permissions': 'on', + 'copy_moderation': 'on', + } + source_translation = page.title_set.all()[0] + parent_translation = target_page.title_set.all()[0] + language = source_translation.language + copied_page_path = source_translation.get_path_for_base(parent_translation.path) + new_page_slug = get_available_slug(target_site, copied_page_path, language) + + with self.settings(SITE_ID=target_site.pk): + response = self.client.post(URL_CMS_PAGE + "%d/copy-page/" % page.pk, data) + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 3 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / fields / folder.py**](https://github.com/divio/django-filer/blob/develop/filer/fields/folder.py) + +```python +# folder.py +from __future__ import absolute_import + +import warnings + +from django import forms +from django.contrib.admin.sites import site +from django.contrib.admin.widgets import ForeignKeyRawIdWidget +~~from django.core.exceptions import ObjectDoesNotExist +from django.db import models +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.http import urlencode +from django.utils.safestring import mark_safe + +from ..models import Folder +from ..utils.compatibility import truncate_words +from ..utils.model_label import get_model_label + + +class AdminFolderWidget(ForeignKeyRawIdWidget): + choices = None + input_type = 'hidden' + is_hidden = False + + def render(self, name, value, attrs=None, renderer=None): + obj = self.obj_for_value(value) + css_id = attrs.get('id') + css_id_folder = "%s_folder" % css_id + css_id_description_txt = "%s_description_txt" % css_id + if attrs is None: + attrs = {} + related_url = None + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + context = { + 'hidden_input': hidden_input, + 'lookup_url': '%s%s' % (related_url, url), + 'lookup_name': name, + 'span_id': css_id_description_txt, + 'object': obj, + 'clear_id': '%s_clear' % css_id, + 'descid': css_id_description_txt, + 'noimg': 'filer/icons/nofile_32x32.png', + 'foldid': css_id_folder, + 'id': css_id, + } + html = render_to_string('admin/filer/widgets/admin_folder.html', context) + return mark_safe(html) + + def label_for_value(self, value): + obj = self.obj_for_value(value) + return ' %s' % truncate_words(obj, 14) + + def obj_for_value(self, value): + if not value: + return None + try: + key = self.rel.get_related_field().name + obj = self.rel.model._default_manager.get(**{key: value}) +~~ except ObjectDoesNotExist: + obj = None + return obj + + class Media(object): + js = ( + 'filer/js/addons/popup_handling.js', + ) + + +class AdminFolderFormField(forms.ModelChoiceField): + widget = AdminFolderWidget + + def __init__(self, rel, queryset, to_field_name, *args, **kwargs): + self.rel = rel + self.queryset = queryset + self.limit_choices_to = kwargs.pop('limit_choices_to', None) + self.to_field_name = to_field_name + self.max_value = None + self.min_value = None + kwargs.pop('widget', None) + forms.Field.__init__(self, widget=self.widget(rel, site), *args, **kwargs) + + def widget_attrs(self, widget): + widget.required = self.required + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 4 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / utils.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./utils.py) + +```python +# utils.py +import logging +import os +from itertools import chain + +from django.conf import settings +from django.contrib.auth import REDIRECT_FIELD_NAME, get_user_model +from django.contrib.auth.models import AnonymousUser, Group +~~from django.core.exceptions import ObjectDoesNotExist, PermissionDenied +from django.db.models import Model, QuerySet +from django.http import HttpResponseForbidden, HttpResponseNotFound +from django.shortcuts import render +from guardian.conf import settings as guardian_settings +from guardian.ctypes import get_content_type +from guardian.exceptions import NotUserNorGroup + +logger = logging.getLogger(__name__) +abspath = lambda *p: os.path.abspath(os.path.join(*p)) + + +def get_anonymous_user(): + User = get_user_model() + lookup = {User.USERNAME_FIELD: guardian_settings.ANONYMOUS_USER_NAME} + return User.objects.get(**lookup) + + +def get_identity(identity): + if isinstance(identity, AnonymousUser): + identity = get_anonymous_user() + + if isinstance(identity, QuerySet): + identity_model_type = identity.model + if identity_model_type == get_user_model(): + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + redirect_field_name = redirect_field_name or REDIRECT_FIELD_NAME + + + has_permissions = False + if accept_global_perms: + has_permissions = all(request.user.has_perm(perm) for perm in perms) + if not has_permissions: + has_permissions = all(request.user.has_perm(perm, obj) + for perm in perms) + + if not has_permissions: + if return_403: + if guardian_settings.RENDER_403: + response = render(request, guardian_settings.TEMPLATE_403) + response.status_code = 403 + return response + elif guardian_settings.RAISE_403: + raise PermissionDenied + return HttpResponseForbidden() + if return_404: + if guardian_settings.RENDER_404: + response = render(request, guardian_settings.TEMPLATE_404) + response.status_code = 404 + return response + elif guardian_settings.RAISE_404: +~~ raise ObjectDoesNotExist + return HttpResponseNotFound() + else: + from django.contrib.auth.views import redirect_to_login + return redirect_to_login(request.get_full_path(), + login_url, + redirect_field_name) + + +from django.apps import apps as django_apps +from django.core.exceptions import ImproperlyConfigured + +def get_obj_perm_model_by_conf(setting_name): + try: + setting_value = getattr(guardian_settings, setting_name) + return django_apps.get_model(setting_value, require_ready=False) + except ValueError as e: + raise ImproperlyConfigured("{} must be of the form 'app_label.model_name'".format(setting_value)) from e + except LookupError as e: + raise ImproperlyConfigured( + "{} refers to model '{}' that has not been installed".format(setting_name, setting_value) + ) from e + + +def clean_orphan_obj_perms(): + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 5 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / models.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./models.py) + +```python +# models.py + +~~from django.core.exceptions import ObjectDoesNotExist +from django.utils.encoding import force_str +from django.utils.text import capfirst + +from haystack.constants import DEFAULT_ALIAS +from haystack.exceptions import NotHandled, SpatialError +from haystack.utils import log as logging +from haystack.utils.app_loading import haystack_get_model + +try: + from geopy import distance as geopy_distance +except ImportError: + geopy_distance = None + + +class SearchResult(object): + + def __init__(self, app_label, model_name, pk, score, **kwargs): + self.app_label, self.model_name = app_label, model_name + self.pk = pk + self.score = score + self._object = None + self._model = None + self._verbose_name = None + self._additional_fields = [] + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + return self.__dict__.get(attr, None) + + def _get_searchindex(self): + from haystack import connections + + return connections[DEFAULT_ALIAS].get_unified_index().get_index(self.model) + + searchindex = property(_get_searchindex) + + def _get_object(self): + if self._object is None: + if self.model is None: + self.log.error("Model could not be found for SearchResult '%s'.", self) + return None + + try: + try: + self._object = self.searchindex.read_queryset().get(pk=self.pk) + except NotHandled: + self.log.warning( + "Model '%s.%s' not handled by the routers.", + self.app_label, + self.model_name, + ) + self._object = self.model._default_manager.get(pk=self.pk) +~~ except ObjectDoesNotExist: + self.log.error( + "Object could not be found in database for SearchResult '%s'.", self + ) + self._object = None + + return self._object + + def _set_object(self, obj): + self._object = obj + + object = property(_get_object, _set_object) + + def _get_model(self): + if self._model is None: + try: + self._model = haystack_get_model(self.app_label, self.model_name) + except LookupError: + pass + + return self._model + + def _set_model(self, obj): + self._model = obj + + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 6 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / fields.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./fields.py) + +```python +# fields.py +~~from django.core.exceptions import ObjectDoesNotExist +from django.db.models.fields import NOT_PROVIDED +from django.db.models.manager import Manager + +from . import widgets + + +class Field: + empty_values = [None, ''] + + def __init__(self, attribute=None, column_name=None, widget=None, + default=NOT_PROVIDED, readonly=False, saves_null_values=True): + self.attribute = attribute + self.default = default + self.column_name = column_name + if not widget: + widget = widgets.Widget() + self.widget = widget + self.readonly = readonly + self.saves_null_values = saves_null_values + + def __repr__(self): + path = '%s.%s' % (self.__class__.__module__, self.__class__.__name__) + column_name = getattr(self, 'column_name', None) + if column_name is not None: + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + try: + value = data[self.column_name] + except KeyError: + raise KeyError("Column '%s' not found in dataset. Available " + "columns are: %s" % (self.column_name, list(data))) + + value = self.widget.clean(value, row=data) + + if value in self.empty_values and self.default != NOT_PROVIDED: + if callable(self.default): + return self.default() + return self.default + + return value + + def get_value(self, obj): + if self.attribute is None: + return None + + attrs = self.attribute.split('__') + value = obj + + for attr in attrs: + try: + value = getattr(value, attr, None) +~~ except (ValueError, ObjectDoesNotExist): + return None + if value is None: + return None + + if callable(value) and not isinstance(value, Manager): + value = value() + return value + + def save(self, obj, data, is_m2m=False): + if not self.readonly: + attrs = self.attribute.split('__') + for attr in attrs[:-1]: + obj = getattr(obj, attr, None) + cleaned = self.clean(data) + if cleaned is not None or self.saves_null_values: + if not is_m2m: + setattr(obj, attrs[-1], cleaned) + else: + getattr(obj, attrs[-1]).set(cleaned) + + def export(self, obj): + value = self.get_value(obj) + if value is None: + return "" + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 7 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / managers.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./managers.py) + +```python +# managers.py +import django +~~from django.core.exceptions import ObjectDoesNotExist +from django.db import connection +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.fields.related import OneToOneField, OneToOneRel +from django.db.models.query import ModelIterable +from django.db.models.query import QuerySet +from django.db.models.sql.datastructures import Join + + +class InheritanceIterable(ModelIterable): + def __iter__(self): + queryset = self.queryset + iter = ModelIterable(queryset) + if getattr(queryset, 'subclasses', False): + extras = tuple(queryset.query.extra.keys()) + subclasses = sorted(queryset.subclasses, key=len, reverse=True) + for obj in iter: + sub_obj = None + for s in subclasses: + sub_obj = queryset._get_sub_obj_recurse(obj, s) + if sub_obj: + break + if not sub_obj: + sub_obj = obj + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + def _get_ancestors_path(self, model, levels=None): + if not issubclass(model, self.model): + raise ValueError( + "{!r} is not a subclass of {!r}".format(model, self.model)) + + ancestry = [] + parent_link = model._meta.get_ancestor_link(self.model) + if levels: + levels -= 1 + while parent_link is not None: + related = parent_link.remote_field + ancestry.insert(0, related.get_accessor_name()) + if levels or levels is None: + parent_model = related.model + parent_link = parent_model._meta.get_ancestor_link( + self.model) + else: + parent_link = None + return LOOKUP_SEP.join(ancestry) + + def _get_sub_obj_recurse(self, obj, s): + rel, _, s = s.partition(LOOKUP_SEP) + + try: + node = getattr(obj, rel) +~~ except ObjectDoesNotExist: + return None + if s: + child = self._get_sub_obj_recurse(node, s) + return child + else: + return node + + def get_subclass(self, *args, **kwargs): + return self.select_subclasses().get(*args, **kwargs) + + +class InheritanceQuerySet(InheritanceQuerySetMixin, QuerySet): + def instance_of(self, *models): + + + + where_queries = [] + for model in models: + where_queries.append('(' + ' AND '.join([ + '"{}"."{}" IS NOT NULL'.format( + model._meta.db_table, + field.attname, # Should this be something else? + ) for field in model._meta.parents.values() + ]) + ')') + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 8 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / oauth2_validators.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./oauth2_validators.py) + +```python +# oauth2_validators.py +import base64 +import binascii +import http.client +import logging +from collections import OrderedDict +from datetime import datetime, timedelta +from urllib.parse import unquote_plus + +import requests +from django.conf import settings +from django.contrib.auth import authenticate, get_user_model +~~from django.core.exceptions import ObjectDoesNotExist +from django.db import transaction +from django.db.models import Q +from django.utils import timezone +from django.utils.timezone import make_aware +from django.utils.translation import gettext_lazy as _ +from oauthlib.oauth2 import RequestValidator + +from .exceptions import FatalClientError +from .models import ( + AbstractApplication, get_access_token_model, + get_application_model, get_grant_model, get_refresh_token_model +) +from .scopes import get_scopes_backend +from .settings import oauth2_settings + + +log = logging.getLogger("oauth2_provider") + +GRANT_TYPE_MAPPING = { + "authorization_code": (AbstractApplication.GRANT_AUTHORIZATION_CODE, ), + "password": (AbstractApplication.GRANT_PASSWORD, ), + "client_credentials": (AbstractApplication.GRANT_CLIENT_CREDENTIALS, ), + "refresh_token": ( + AbstractApplication.GRANT_AUTHORIZATION_CODE, + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + scope=" ".join(request.scopes), + code_challenge=request.code_challenge or "", + code_challenge_method=request.code_challenge_method or "" + ) + + def _create_refresh_token(self, request, refresh_token_code, access_token): + return RefreshToken.objects.create( + user=request.user, + token=refresh_token_code, + application=request.client, + access_token=access_token + ) + + def revoke_token(self, token, token_type_hint, request, *args, **kwargs): + if token_type_hint not in ["access_token", "refresh_token"]: + token_type_hint = None + + token_types = { + "access_token": AccessToken, + "refresh_token": RefreshToken, + } + + token_type = token_types.get(token_type_hint, AccessToken) + try: + token_type.objects.get(token=token).revoke() +~~ except ObjectDoesNotExist: + for other_type in [_t for _t in token_types.values() if _t != token_type]: + list(map(lambda t: t.revoke(), other_type.objects.filter(token=token))) + + def validate_user(self, username, password, client, request, *args, **kwargs): + u = authenticate(username=username, password=password) + if u is not None and u.is_active: + request.user = u + return True + return False + + def get_original_scopes(self, refresh_token, request, *args, **kwargs): + rt = request.refresh_token_instance + if not rt.access_token_id: + return AccessToken.objects.get(source_refresh_token_id=rt.id).scope + + return rt.access_token.scope + + def validate_refresh_token(self, refresh_token, client, request, *args, **kwargs): + + null_or_recent = Q(revoked__isnull=True) | Q( + revoked__gt=timezone.now() - timedelta( + seconds=oauth2_settings.REFRESH_TOKEN_GRACE_PERIOD_SECONDS + ) + ) + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 9 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import copy +import datetime +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +~~from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + if inspect.isbuiltin(obj): + raise BuiltinSignatureError( + 'Built-in function signatures are not inspectable. ' + 'Wrap the function call in a simple, pure Python function.') + + if not (inspect.isfunction(obj) or inspect.ismethod(obj) or isinstance(obj, functools.partial)): + return False + + sig = inspect.signature(obj) + params = sig.parameters.values() + return all( + param.kind == param.VAR_POSITIONAL or + param.kind == param.VAR_KEYWORD or + param.default != param.empty + for param in params + ) + + +def get_attribute(instance, attrs): + for attr in attrs: + try: + if isinstance(instance, Mapping): + instance = instance[attr] + else: + instance = getattr(instance, attr) +~~ except ObjectDoesNotExist: + return None + if is_simple_callable(instance): + try: + instance = instance() + except (AttributeError, KeyError) as exc: + raise ValueError('Exception raised in callable attribute "{}"; original exception was: {}'.format(attr, exc)) + + return instance + + +def set_value(dictionary, keys, value): + if not keys: + dictionary.update(value) + return + + for key in keys[:-1]: + if key not in dictionary: + dictionary[key] = {} + dictionary = dictionary[key] + + dictionary[keys[-1]] = value + + +def to_choices_dict(choices): + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-permissiondenied.markdown b/content/pages/examples/django/django-core-exceptions-permissiondenied.markdown new file mode 100644 index 000000000..e741da531 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-permissiondenied.markdown @@ -0,0 +1,1120 @@ +title: django.core.exceptions PermissionDenied Example Code +category: page +slug: django-core-exceptions-permissiondenied-examples +sortorder: 500011105 +toc: False +sidebartitle: django.core.exceptions PermissionDenied +meta: Python example code for the PermissionDenied class from the django.core.exceptions module of the Django project. + + +PermissionDenied is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / models.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/models.py) + +```python +# models.py +from __future__ import absolute_import + +from django.contrib.auth import authenticate +from django.contrib.sites.models import Site +from django.contrib.sites.shortcuts import get_current_site +~~from django.core.exceptions import PermissionDenied +from django.db import models +from django.utils.crypto import get_random_string +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +import allauth.app_settings +from allauth.account.models import EmailAddress +from allauth.account.utils import get_next_redirect_url, setup_user_email +from allauth.utils import get_user_model + +from ..utils import get_request_param +from . import app_settings, providers +from .adapter import get_adapter +from .fields import JSONField + + +class SocialAppManager(models.Manager): + def get_current(self, provider, request=None): + cache = {} + if request: + cache = getattr(request, '_socialapp_cache', {}) + request._socialapp_cache = cache + app = cache.get(provider) + if not app: + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + def get_redirect_url(self, request): + url = self.state.get('next') + return url + + @classmethod + def state_from_request(cls, request): + state = {} + next_url = get_next_redirect_url(request) + if next_url: + state['next'] = next_url + state['process'] = get_request_param(request, 'process', 'login') + state['scope'] = get_request_param(request, 'scope', '') + state['auth_params'] = get_request_param(request, 'auth_params', '') + return state + + @classmethod + def stash_state(cls, request): + state = cls.state_from_request(request) + verifier = get_random_string() + request.session['socialaccount_state'] = (state, verifier) + return verifier + + @classmethod + def unstash_state(cls, request): + if 'socialaccount_state' not in request.session: +~~ raise PermissionDenied() + state, verifier = request.session.pop('socialaccount_state') + return state + + @classmethod + def verify_and_unstash_state(cls, request, verifier): + if 'socialaccount_state' not in request.session: +~~ raise PermissionDenied() + state, verifier2 = request.session.pop('socialaccount_state') + if verifier != verifier2: +~~ raise PermissionDenied() + return state + + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 2 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / exceptions.py**](https://github.com/jazzband/django-axes/blob/master/axes/./exceptions.py) + +```python +# exceptions.py +~~from django.core.exceptions import PermissionDenied + + +~~class AxesBackendPermissionDenied(PermissionDenied): + + +class AxesBackendRequestParameterRequired(ValueError): + + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 3 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / api.py**](https://github.com/divio/django-cms/blob/develop/cms/./api.py) + +```python +# api.py +import datetime + +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +from django.core.exceptions import FieldError +~~from django.core.exceptions import PermissionDenied +from django.core.exceptions import ValidationError +from django.db import transaction +from django.template.defaultfilters import slugify +from django.template.loader import get_template +from django.utils.translation import activate + +from six import string_types + +from cms import constants +from cms.app_base import CMSApp +from cms.apphook_pool import apphook_pool +from cms.constants import TEMPLATE_INHERITANCE_MAGIC +from cms.models.pagemodel import Page +from cms.models.permissionmodels import (PageUser, PagePermission, GlobalPagePermission, + ACCESS_PAGE_AND_DESCENDANTS) +from cms.models.placeholdermodel import Placeholder +from cms.models.pluginmodel import CMSPlugin +from cms.models.titlemodels import Title +from cms.plugin_base import CMSPluginBase +from cms.plugin_pool import plugin_pool +from cms.utils import copy_plugins, get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import get_language_list +from cms.utils.page import get_available_slug + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + 'can_add': can_add or grant_all, + 'can_change': can_change or grant_all, + 'can_delete': can_delete or grant_all, + 'can_change_advanced_settings': can_change_advanced_settings or grant_all, + 'can_publish': can_publish or grant_all, + 'can_change_permissions': can_change_permissions or grant_all, + 'can_move_page': can_move_page or grant_all, + 'can_view': can_view or grant_all, + } + + page_permission = PagePermission(page=page, user=user, + grant_on=grant_on, **data) + page_permission.save() + if global_permission: + page_permission = GlobalPagePermission( + user=user, can_recover_page=can_recover_page, **data) + page_permission.save() + page_permission.sites.add(get_current_site()) + return page_permission + + +def publish_page(page, user, language): + page = page.reload() + + if not page.has_publish_permission(user): +~~ raise PermissionDenied() + with current_user(user.get_username()): + page.publish(language) + return page.reload() + + +def publish_pages(include_unpublished=False, language=None, site=None): + qs = Page.objects.drafts() + + if not include_unpublished: + qs = qs.filter(title_set__published=True).distinct() + + if site: + qs = qs.filter(node__site=site) + + output_language = None + for i, page in enumerate(qs): + add = True + titles = page.title_set + if not include_unpublished: + titles = titles.filter(published=True) + for lang in titles.values_list("language", flat=True): + if language is None or lang == language: + if not output_language: + output_language = lang + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 4 from django-downloadview +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + +[**django-downloadview / django_downloadview / decorators.py**](https://github.com/benoitbryon/django-downloadview/blob/master/django_downloadview/./decorators.py) + +```python +# decorators.py + +from functools import wraps + +from django.conf import settings +~~from django.core.exceptions import PermissionDenied +from django.core.signing import BadSignature, SignatureExpired, TimestampSigner + + +class DownloadDecorator(object): + + def __init__(self, middleware_factory): + self.middleware_factory = middleware_factory + + def __call__(self, view_func, *middleware_args, **middleware_kwargs): + + def decorated(request, *view_args, **view_kwargs): + response = view_func(request, *view_args, **view_kwargs) + middleware = self.middleware_factory(*middleware_args, **middleware_kwargs) + return middleware.process_response(request, response) + + return decorated + + +def _signature_is_valid(request): + + signer = TimestampSigner() + signature = request.GET.get("X-Signature") + expiration = getattr(settings, "DOWNLOADVIEW_URL_EXPIRATION", None) + + try: + signature_path = signer.unsign(signature, max_age=expiration) + except SignatureExpired as e: +~~ raise PermissionDenied("Signature expired") from e + except BadSignature as e: +~~ raise PermissionDenied("Signature invalid") from e + except Exception as e: +~~ raise PermissionDenied("Signature error") from e + + if request.path != signature_path: +~~ raise PermissionDenied("Signature mismatch") + + +def signature_required(function): + + @wraps(function) + def decorator(request, *args, **kwargs): + _signature_is_valid(request) + return function(request, *args, **kwargs) + + return decorator + + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 5 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / tools.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/tools.py) + +```python +# tools.py +from __future__ import absolute_import, unicode_literals + +from django.contrib.admin.options import IS_POPUP_VAR +~~from django.core.exceptions import PermissionDenied +from django.utils.http import urlencode + + +ALLOWED_PICK_TYPES = ('folder', 'file') + + +def check_files_edit_permissions(request, files): + for f in files: + if not f.has_edit_permission(request): +~~ raise PermissionDenied + + +def check_folder_edit_permissions(request, folders): + for f in folders: + if not f.has_edit_permission(request): +~~ raise PermissionDenied + check_files_edit_permissions(request, f.files) + check_folder_edit_permissions(request, f.children.all()) + + +def check_files_read_permissions(request, files): + for f in files: + if not f.has_read_permission(request): +~~ raise PermissionDenied + + +def check_folder_read_permissions(request, folders): + for f in folders: + if not f.has_read_permission(request): +~~ raise PermissionDenied + check_files_read_permissions(request, f.files) + check_folder_read_permissions(request, f.children.all()) + + +def userperms_for_request(item, request): + r = [] + ps = ['read', 'edit', 'add_children'] + for p in ps: + attr = "has_%s_permission" % p + if hasattr(item, attr): + x = getattr(item, attr)(request) + if x: + r.append(p) + return r + + +def popup_status(request): + return ( + IS_POPUP_VAR in request.GET + or 'pop' in request.GET + or IS_POPUP_VAR in request.POST + or 'pop' in request.POST + ) + + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 6 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / mixins.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./mixins.py) + +```python +# mixins.py +from collections.abc import Iterable + +from django.conf import settings +from django.contrib.auth.decorators import login_required, REDIRECT_FIELD_NAME +~~from django.core.exceptions import ImproperlyConfigured, PermissionDenied +from guardian.utils import get_user_obj_perms_model +UserObjectPermission = get_user_obj_perms_model() +from guardian.utils import get_40x_or_None, get_anonymous_user +from guardian.shortcuts import get_objects_for_user + + +class LoginRequiredMixin: + redirect_field_name = REDIRECT_FIELD_NAME + login_url = settings.LOGIN_URL + + def dispatch(self, request, *args, **kwargs): + return login_required(redirect_field_name=self.redirect_field_name, + login_url=self.login_url)( + super().dispatch + )(request, *args, **kwargs) + + +class PermissionRequiredMixin: + login_url = settings.LOGIN_URL + permission_required = None + redirect_field_name = REDIRECT_FIELD_NAME + return_403 = False + return_404 = False + raise_exception = False + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + % self.permission_required) + return perms + + def get_permission_object(self): + if hasattr(self, 'permission_object'): + return self.permission_object + return (hasattr(self, 'get_object') and self.get_object() or + getattr(self, 'object', None)) + + def check_permissions(self, request): + obj = self.get_permission_object() + + forbidden = get_40x_or_None(request, + perms=self.get_required_permissions( + request), + obj=obj, + login_url=self.login_url, + redirect_field_name=self.redirect_field_name, + return_403=self.return_403, + return_404=self.return_404, + accept_global_perms=self.accept_global_perms + ) + if forbidden: + self.on_permission_check_fail(request, forbidden, obj=obj) + if forbidden and self.raise_exception: +~~ raise PermissionDenied() + return forbidden + + def on_permission_check_fail(self, request, response, obj=None): + + def dispatch(self, request, *args, **kwargs): + self.request = request + self.args = args + self.kwargs = kwargs + response = self.check_permissions(request) + if response: + return response + return super().dispatch(request, *args, **kwargs) + + +class GuardianUserMixin: + + @staticmethod + def get_anonymous(): + return get_anonymous_user() + + def add_obj_perm(self, perm, obj): + return UserObjectPermission.objects.assign_perm(perm, self, obj) + + def del_obj_perm(self, perm, obj): + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 7 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / admin.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./admin.py) + +```python +# admin.py +from django.contrib.admin.options import ModelAdmin, csrf_protect_m +from django.contrib.admin.views.main import SEARCH_VAR, ChangeList +~~from django.core.exceptions import PermissionDenied +from django.core.paginator import InvalidPage, Paginator +from django.shortcuts import render +from django.utils.encoding import force_str +from django.utils.translation import ungettext + +from haystack import connections +from haystack.constants import DEFAULT_ALIAS +from haystack.query import SearchQuerySet +from haystack.utils import get_model_ct_tuple + + +class SearchChangeList(ChangeList): + def __init__(self, **kwargs): + self.haystack_connection = kwargs.pop("haystack_connection", DEFAULT_ALIAS) + super(SearchChangeList, self).__init__(**kwargs) + + def get_results(self, request): + if SEARCH_VAR not in request.GET: + return super(SearchChangeList, self).get_results(request) + + sqs = ( + SearchQuerySet(self.haystack_connection) + .models(self.model) + .auto_query(request.GET[SEARCH_VAR]) + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + ) + + can_show_all = result_count <= self.list_max_show_all + multi_page = result_count > self.list_per_page + + try: + result_list = paginator.page(self.page_num + 1).object_list + result_list = [result.object for result in result_list] + except InvalidPage: + result_list = () + + self.result_count = result_count + self.full_result_count = full_result_count + self.result_list = result_list + self.can_show_all = can_show_all + self.multi_page = multi_page + self.paginator = paginator + + +class SearchModelAdminMixin(object): + haystack_connection = DEFAULT_ALIAS + + @csrf_protect_m + def changelist_view(self, request, extra_context=None): + if not self.has_change_permission(request, None): +~~ raise PermissionDenied + + if SEARCH_VAR not in request.GET: + return super(SearchModelAdminMixin, self).changelist_view( + request, extra_context + ) + + indexed_models = ( + connections[self.haystack_connection] + .get_unified_index() + .get_indexed_models() + ) + + if self.model not in indexed_models: + return super(SearchModelAdminMixin, self).changelist_view( + request, extra_context + ) + + list_display = list(self.list_display) + + kwargs = { + "haystack_connection": self.haystack_connection, + "request": request, + "model": self.model, + "list_display": list_display, + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 8 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / admin.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./admin.py) + +```python +# admin.py +from datetime import datetime + +import django +from django import forms +from django.conf import settings +from django.conf.urls import url +from django.contrib import admin, messages +from django.contrib.admin.models import ADDITION, CHANGE, DELETION, LogEntry +from django.contrib.auth import get_permission_codename +from django.contrib.contenttypes.models import ContentType +~~from django.core.exceptions import PermissionDenied +from django.http import HttpResponse, HttpResponseRedirect +from django.template.response import TemplateResponse +from django.urls import reverse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_str +from django.utils.module_loading import import_string +from django.utils.translation import gettext_lazy as _ +from django.views.decorators.http import require_POST + +from .formats.base_formats import DEFAULT_FORMATS +from .forms import ConfirmImportForm, ExportForm, ImportForm, export_action_form_factory +from .resources import modelresource_factory +from .results import RowResult +from .signals import post_export, post_import +from .tmp_storages import TempFolderStorage + +SKIP_ADMIN_LOG = getattr(settings, 'IMPORT_EXPORT_SKIP_ADMIN_LOG', False) +TMP_STORAGE_CLASS = getattr(settings, 'IMPORT_EXPORT_TMP_STORAGE_CLASS', + TempFolderStorage) + + +if isinstance(TMP_STORAGE_CLASS, str): + TMP_STORAGE_CLASS = import_string(TMP_STORAGE_CLASS) + + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + name='%s_%s_import' % info), + ] + return my_urls + urls + + def get_resource_kwargs(self, request, *args, **kwargs): + return {} + + def get_import_resource_kwargs(self, request, *args, **kwargs): + return self.get_resource_kwargs(request, *args, **kwargs) + + def get_resource_class(self): + if not self.resource_class: + return modelresource_factory(self.model) + else: + return self.resource_class + + def get_import_resource_class(self): + return self.get_resource_class() + + def get_import_formats(self): + return [f for f in self.formats if f().can_import()] + + @method_decorator(require_POST) + def process_import(self, request, *args, **kwargs): + if not self.has_import_permission(request): +~~ raise PermissionDenied + + form_type = self.get_confirm_import_form() + confirm_form = form_type(request.POST) + if confirm_form.is_valid(): + import_formats = self.get_import_formats() + input_format = import_formats[ + int(confirm_form.cleaned_data['input_format']) + ]() + tmp_storage = self.get_tmp_storage_class()(name=confirm_form.cleaned_data['import_file_name']) + data = tmp_storage.read(input_format.get_read_mode()) + if not input_format.is_binary() and self.from_encoding: + data = force_str(data, self.from_encoding) + dataset = input_format.create_dataset(data) + + result = self.process_dataset(dataset, confirm_form, request, *args, **kwargs) + + tmp_storage.remove() + + return self.process_result(result, request) + + def process_dataset(self, dataset, confirm_form, request, *args, **kwargs): + + res_kwargs = self.get_import_resource_kwargs(request, form=confirm_form, *args, **kwargs) + resource = self.get_import_resource_class()(**res_kwargs) + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + + def get_confirm_import_form(self): + return ConfirmImportForm + + def get_form_kwargs(self, form, *args, **kwargs): + return kwargs + + def get_import_data_kwargs(self, request, *args, **kwargs): + form = kwargs.get('form') + if form: + kwargs.pop('form') + return kwargs + return {} + + def write_to_tmp_storage(self, import_file, input_format): + tmp_storage = self.get_tmp_storage_class()() + data = bytes() + for chunk in import_file.chunks(): + data += chunk + + tmp_storage.save(data, input_format.get_read_mode()) + return tmp_storage + + def import_action(self, request, *args, **kwargs): + if not self.has_import_permission(request): +~~ raise PermissionDenied + + context = self.get_import_context_data() + + import_formats = self.get_import_formats() + form_type = self.get_import_form() + form_kwargs = self.get_form_kwargs(form_type, *args, **kwargs) + form = form_type(import_formats, + request.POST or None, + request.FILES or None, + **form_kwargs) + + if request.POST and form.is_valid(): + input_format = import_formats[ + int(form.cleaned_data['input_format']) + ]() + import_file = form.cleaned_data['import_file'] + tmp_storage = self.write_to_tmp_storage(import_file, input_format) + + try: + data = tmp_storage.read(input_format.get_read_mode()) + if not input_format.is_binary() and self.from_encoding: + data = force_str(data, self.from_encoding) + dataset = input_format.create_dataset(data) + except UnicodeDecodeError as e: + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + + ChangeList = self.get_changelist(request) + changelist_kwargs = { + 'request': request, + 'model': self.model, + 'list_display': list_display, + 'list_display_links': list_display_links, + 'list_filter': list_filter, + 'date_hierarchy': self.date_hierarchy, + 'search_fields': search_fields, + 'list_select_related': self.list_select_related, + 'list_per_page': self.list_per_page, + 'list_max_show_all': self.list_max_show_all, + 'list_editable': self.list_editable, + 'model_admin': self, + } + if django.VERSION >= (2, 1): + changelist_kwargs['sortable_by'] = self.sortable_by + cl = ChangeList(**changelist_kwargs) + + return cl.get_queryset(request) + + def get_export_data(self, file_format, queryset, *args, **kwargs): + request = kwargs.pop("request") + if not self.has_export_permission(request): +~~ raise PermissionDenied + + resource_class = self.get_export_resource_class() + data = resource_class(**self.get_export_resource_kwargs(request)).export(queryset, *args, **kwargs) + export_data = file_format.export_data(data) + return export_data + + def get_export_context_data(self, **kwargs): + return self.get_context_data(**kwargs) + + def get_context_data(self, **kwargs): + return {} + + def export_action(self, request, *args, **kwargs): + if not self.has_export_permission(request): +~~ raise PermissionDenied + + formats = self.get_export_formats() + form = ExportForm(formats, request.POST or None) + if form.is_valid(): + file_format = formats[ + int(form.cleaned_data['file_format']) + ]() + + queryset = self.get_export_queryset(request) + export_data = self.get_export_data(file_format, queryset, request=request) + content_type = file_format.get_content_type() + response = HttpResponse(export_data, content_type=content_type) + response['Content-Disposition'] = 'attachment; filename="%s"' % ( + self.get_export_filename(request, queryset, file_format), + ) + + post_export.send(sender=None, model=self.model) + return response + + context = self.get_export_context_data() + + context.update(self.admin_site.each_context(request)) + + context['title'] = _("Export") + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 9 from django-loginas +[django-loginas](https://github.com/skorokithakis/django-loginas) +([PyPI package information](https://pypi.org/project/django-loginas/)) +is [Django](/django.html) code library for admins to log into an application +as another user, typically for debugging purposes. + +django-loginas is open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/skorokithakis/django-loginas/blob/master/LICENSE). + +[**django-loginas / loginas / views.py**](https://github.com/skorokithakis/django-loginas/blob/master/loginas/./views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.admin.utils import unquote +~~from django.core.exceptions import ImproperlyConfigured, PermissionDenied +from django.shortcuts import redirect +from django.utils.translation import gettext_lazy as _ +from django.views.decorators.csrf import csrf_protect +from django.views.decorators.http import require_POST + +from . import settings as la_settings +from .utils import login_as, restore_original_login + +try: + from importlib import import_module +except ImportError: + from django.utils.importlib import import_module # type: ignore + + +try: + from django.contrib.auth import get_user_model + + User = get_user_model() +except ImportError: + from django.contrib.auth.models import User # type: ignore + + +def _load_module(path): + + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + except ValueError: + raise ImproperlyConfigured("Error importing CAN_LOGIN_AS" " function. Is CAN_LOGIN_AS a" " string?") + + try: + can_login_as = getattr(mod, attr) + except AttributeError: + raise ImproperlyConfigured("Module {0} does not define a {1} " "function.".format(module, attr)) + return can_login_as + + +@csrf_protect +@require_POST +def user_login(request, user_id): + user = User.objects.get(pk=unquote(user_id)) + + if isinstance(la_settings.CAN_LOGIN_AS, str): + can_login_as = _load_module(la_settings.CAN_LOGIN_AS) + elif hasattr(la_settings.CAN_LOGIN_AS, "__call__"): + can_login_as = la_settings.CAN_LOGIN_AS + else: + raise ImproperlyConfigured("The CAN_LOGIN_AS setting is neither a valid module nor callable.") + no_permission_error = None + try: + if not can_login_as(request, user): + no_permission_error = _("You do not have permission to do that.") +~~ except PermissionDenied as e: + no_permission_error = str(e) + if no_permission_error is not None: + messages.error(request, no_permission_error, extra_tags=la_settings.MESSAGE_EXTRA_TAGS, fail_silently=True) + return redirect(request.META.get("HTTP_REFERER", "/")) + + try: + login_as(user, request) + except ImproperlyConfigured as e: + messages.error(request, str(e), extra_tags=la_settings.MESSAGE_EXTRA_TAGS, fail_silently=True) + return redirect(request.META.get("HTTP_REFERER", "/")) + + return redirect(la_settings.LOGIN_REDIRECT) + + +def user_logout(request): + restore_original_login(request) + + return redirect(la_settings.LOGOUT_REDIRECT) + + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 10 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / metadata.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./metadata.py) + +```python +# metadata.py +from collections import OrderedDict + +~~from django.core.exceptions import PermissionDenied +from django.http import Http404 +from django.utils.encoding import force_str + +from rest_framework import exceptions, serializers +from rest_framework.request import clone_request +from rest_framework.utils.field_mapping import ClassLookupDict + + +class BaseMetadata: + def determine_metadata(self, request, view): + raise NotImplementedError(".determine_metadata() must be overridden.") + + +class SimpleMetadata(BaseMetadata): + label_lookup = ClassLookupDict({ + serializers.Field: 'field', + serializers.BooleanField: 'boolean', + serializers.NullBooleanField: 'boolean', + serializers.CharField: 'string', + serializers.UUIDField: 'string', + serializers.URLField: 'url', + serializers.EmailField: 'email', + serializers.RegexField: 'regex', + serializers.SlugField: 'slug', + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 11 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / auth.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/auth.py) + +```python +# auth.py +import types +from functools import wraps + +import l18n + +from django.contrib.auth import get_user_model +from django.contrib.auth.views import redirect_to_login as auth_redirect_to_login +~~from django.core.exceptions import PermissionDenied +from django.db.models import Q +from django.shortcuts import redirect +from django.urls import reverse +from django.utils.timezone import activate as activate_tz +from django.utils.translation import gettext as _ +from django.utils.translation import override + +from wagtail.admin import messages +from wagtail.core.models import GroupPagePermission + + +def users_with_page_permission(page, permission_type, include_superusers=True): + User = get_user_model() + + ancestors_and_self = list(page.get_ancestors()) + [page] + perm = GroupPagePermission.objects.filter(permission_type=permission_type, page__in=ancestors_and_self) + q = Q(groups__page_permissions__in=perm) + + if include_superusers: + q |= Q(is_superuser=True) + + return User.objects.filter(is_active=True).filter(q).distinct() + + +def permission_denied(request): + if request.is_ajax(): +~~ raise PermissionDenied + + from wagtail.admin import messages + + messages.error(request, _('Sorry, you do not have permission to access this area.')) + return redirect('wagtailadmin_home') + + +def user_passes_test(test): + def decorator(view_func): + + @wraps(view_func) + def wrapped_view_func(request, *args, **kwargs): + if test(request.user): + return view_func(request, *args, **kwargs) + else: + return permission_denied(request) + + return wrapped_view_func + + return decorator + + +def permission_required(permission_name): + def test(user): + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + return user_passes_test(test) + + def require_any(self, *actions): + def test(user): + return self.policy.user_has_any_permission(user, actions) + + return user_passes_test(test) + + +def user_has_any_page_permission(user): + if not user.is_active: + return False + + if user.is_superuser: + return True + + if GroupPagePermission.objects.filter(group__in=user.groups.all()).exists(): + return True + + + return False + + +def reject_request(request): + if request.is_ajax(): +~~ raise PermissionDenied + + return auth_redirect_to_login( + request.get_full_path(), login_url=reverse('wagtailadmin_login')) + + +def require_admin_access(view_func): + def decorated_view(request, *args, **kwargs): + + user = request.user + + if user.is_anonymous: + return reject_request(request) + + if user.has_perms(['wagtailadmin.access_admin']): + preferred_language = None + if hasattr(user, 'wagtail_userprofile'): + preferred_language = user.wagtail_userprofile.get_preferred_language() + l18n.set_language(preferred_language) + time_zone = user.wagtail_userprofile.get_current_time_zone() + activate_tz(time_zone) + if preferred_language: + with override(preferred_language): + response = view_func(request, *args, **kwargs) + if hasattr(response, "render"): + + +## ... source file continues with no further PermissionDenied examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-suspiciousfileoperation.markdown b/content/pages/examples/django/django-core-exceptions-suspiciousfileoperation.markdown new file mode 100644 index 000000000..a660aef52 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-suspiciousfileoperation.markdown @@ -0,0 +1,73 @@ +title: django.core.exceptions SuspiciousFileOperation Example Code +category: page +slug: django-core-exceptions-suspiciousfileoperation-examples +sortorder: 500011106 +toc: False +sidebartitle: django.core.exceptions SuspiciousFileOperation +meta: Python example code for the SuspiciousFileOperation class from the django.core.exceptions module of the Django project. + + +SuspiciousFileOperation is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-markdown-view +[django-markdown-view](https://github.com/rgs258/django-markdown-view) +([PyPI package information](https://pypi.org/project/django-markdown-view/)) +is a Django extension for serving [Markdown](/markdown.html) files as +[Django templates](/django-templates.html). The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/rgs258/django-markdown-view/blob/master/LICENSE). + +[**django-markdown-view / markdown_view / loaders.py**](https://github.com/rgs258/django-markdown-view/blob/master/markdown_view/./loaders.py) + +```python +# loaders.py +from django.conf import settings +~~from django.core.exceptions import SuspiciousFileOperation +from django.template import Origin +from django.template.loaders.filesystem import Loader as FilesystemLoader +from django.template.utils import get_app_template_dirs +from django.utils._os import safe_join + + +class MarkdownLoader(FilesystemLoader): + + def get_dirs(self): + base_dir = getattr( + settings, + "MARKDOWN_VIEW_BASE_DIR", + getattr( + settings, + "BASE_DIR", + None) + ) + dirs = [*get_app_template_dirs('')] + if base_dir: + dirs.extend([base_dir]) + return dirs + + def get_template_sources(self, template_name): + if template_name.endswith('.md'): + template_split = template_name.split("/") + template_split.reverse() + template_app_dir = template_split.pop() + template_split.reverse() + for template_dir in self.get_dirs(): + if template_dir.endswith(template_app_dir): + try: + name = safe_join(template_dir, *template_split) +~~ except SuspiciousFileOperation: + continue + + yield Origin( + name=name, + template_name=template_name, + loader=self, + ) + + + +## ... source file continues with no further SuspiciousFileOperation examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-suspiciousmultipartform.markdown b/content/pages/examples/django/django-core-exceptions-suspiciousmultipartform.markdown new file mode 100644 index 000000000..c1ce0e7a4 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-suspiciousmultipartform.markdown @@ -0,0 +1,56 @@ +title: django.core.exceptions SuspiciousMultipartForm Example Code +category: page +slug: django-core-exceptions-suspiciousmultipartform-examples +sortorder: 500011107 +toc: False +sidebartitle: django.core.exceptions SuspiciousMultipartForm +meta: Python example code for the SuspiciousMultipartForm class from the django.core.exceptions module of the Django project. + + +SuspiciousMultipartForm is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / views / upload.py**](https://github.com/jrief/django-angular/blob/master/djng/views/upload.py) + +```python +# upload.py +~~from django.core.exceptions import SuspiciousMultipartForm +from django.core import signing +from django.views.generic import View +from django.http import JsonResponse + +from djng import app_settings +from djng.forms.fields import FileField, ImageField + + +class FileUploadView(View): + storage = app_settings.upload_storage + thumbnail_size = app_settings.THUMBNAIL_OPTIONS + signer = signing.Signer() + + def post(self, request, *args, **kwargs): + if request.POST.get('filetype') == 'file': + field = FileField + elif request.POST.get('filetype') == 'image': + field = ImageField + else: +~~ raise SuspiciousMultipartForm("Missing attribute 'filetype' in form data.") + data = {} + for name, file_obj in request.FILES.items(): + data[name] = field.preview(file_obj) + return JsonResponse(data) + + + +## ... source file continues with no further SuspiciousMultipartForm examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-validationerror.markdown b/content/pages/examples/django/django-core-exceptions-validationerror.markdown new file mode 100644 index 000000000..8c255d787 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-validationerror.markdown @@ -0,0 +1,2128 @@ +title: django.core.exceptions ValidationError Example Code +category: page +slug: django-core-exceptions-validationerror-examples +sortorder: 500011108 +toc: False +sidebartitle: django.core.exceptions ValidationError +meta: Python example code for the ValidationError class from the django.core.exceptions module of the Django project. + + +ValidationError is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog_tests / tests.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog_tests/tests.py) + +```python +# tests.py +import datetime +import django +from django.conf import settings +from django.contrib import auth +from django.contrib.auth.models import User, AnonymousUser +~~from django.core.exceptions import ValidationError +from django.db.models.signals import pre_save +from django.http import HttpResponse +from django.test import TestCase, RequestFactory +from django.utils import dateformat, formats, timezone +from dateutil.tz import gettz + +from auditlog.middleware import AuditlogMiddleware +from auditlog.models import LogEntry +from auditlog.registry import auditlog +from auditlog_tests.models import SimpleModel, AltPrimaryKeyModel, UUIDPrimaryKeyModel, \ + ProxyModel, SimpleIncludeModel, SimpleExcludeModel, SimpleMappingModel, RelatedModel, \ + ManyRelatedModel, AdditionalDataIncludedModel, DateTimeFieldModel, ChoicesFieldModel, \ + CharfieldTextfieldModel, PostgresArrayFieldModel, NoDeleteHistoryModel +from auditlog import compat + + +class SimpleModelTest(TestCase): + def setUp(self): + self.obj = SimpleModel.objects.create(text='I am not difficult.') + + def test_create(self): + obj = self.obj + + self.assertTrue(obj.history.count() == 1, msg="There is one log entry") + + +## ... source file abbreviated to get to ValidationError examples ... + + + def test_request(self): + request = self.factory.get('/') + request.user = self.user + self.middleware.process_request(request) + + self.assertTrue(pre_save.has_listeners(LogEntry)) + + self.middleware.process_exception(request, None) + + def test_response(self): + request = self.factory.get('/') + request.user = self.user + + self.middleware.process_request(request) + self.assertTrue(pre_save.has_listeners(LogEntry)) # The signal should be present before trying to disconnect it. + self.middleware.process_response(request, HttpResponse()) + + self.assertFalse(pre_save.has_listeners(LogEntry)) + + def test_exception(self): + request = self.factory.get('/') + request.user = self.user + + self.middleware.process_request(request) + self.assertTrue(pre_save.has_listeners(LogEntry)) # The signal should be present before trying to disconnect it. +~~ self.middleware.process_exception(request, ValidationError("Test")) + + self.assertFalse(pre_save.has_listeners(LogEntry)) + + +class SimpeIncludeModelTest(TestCase): + + def test_register_include_fields(self): + sim = SimpleIncludeModel(label='Include model', text='Looong text') + sim.save() + self.assertTrue(sim.history.count() == 1, msg="There is one log entry") + + sim.label = 'Changed label' + sim.save() + self.assertTrue(sim.history.count() == 2, msg="There are two log entries") + + sim.text = 'Short text' + sim.save() + self.assertTrue(sim.history.count() == 2, msg="There are two log entries") + + +class SimpeExcludeModelTest(TestCase): + + def test_register_exclude_fields(self): + sem = SimpleExcludeModel(label='Exclude model', text='Looong text') + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 2 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair_mail / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair_mail/forms.py) + +```python +# forms.py +from django import forms +from django.conf import settings +~~from django.core.exceptions import ValidationError +from django.core.mail import send_mail +from django.template import Template, Context +from django.utils import timezone +from html2text import html2text +from markdown import markdown + +from chair_mail.context import get_conference_context, get_user_context, \ + get_submission_context +from chair_mail.mailing_lists import find_list +from chair_mail.utility import get_object_model +from submissions.models import Submission +from users.models import User +from .models import EmailFrame, MSG_TYPE_USER, MSG_TYPE_SUBMISSION, \ + SystemNotification + + +def parse_mailing_lists(names_string, separator=','): + names = names_string.split(separator) + names = [name for name in names if name.strip()] + return [find_list(name) for name in names] + + +def parse_objects(obj_class, pks_string, separator=','): + int_pks = [s for s in pks_string.split(separator) if s.strip()] + + +## ... source file abbreviated to get to ValidationError examples ... + + + from_email=settings.DEFAULT_FROM_EMAIL, + recipient_list=[user.email], + html_message=html, + ) + + +class MessageForm(forms.Form): + subject = forms.CharField() + body = forms.CharField(widget=forms.Textarea(), required=False) + lists = forms.CharField( + required=False, max_length=1000, widget=forms.HiddenInput) + objects = forms.CharField( + required=False, max_length=10000, widget=forms.HiddenInput) + + def __init__(self, *args, msg_type=None, **kwargs): + super().__init__(*args, **kwargs) + self.msg_type = msg_type + self.object_type = get_object_model(msg_type) + self.cleaned_lists = [] + self.cleaned_objects = [] + + def clean_lists(self): + _lists = parse_mailing_lists(self.cleaned_data['lists']) + for ml in _lists: + if ml.type != self.msg_type: +~~ raise ValidationError( + f'unexpected {ml.type} mailing list {ml.name}') + self.cleaned_lists = _lists + return self.cleaned_data['lists'] + + def clean_objects(self): + self.cleaned_objects = parse_objects( + self.object_type, self.cleaned_data['objects'], ',') + return self.cleaned_data['objects'] + + def clean(self): + if not self.cleaned_lists and not self.cleaned_objects: +~~ raise ValidationError('You must specify at least one recipient') + return self.cleaned_data + + +class PreviewMessageForm(forms.Form): + subject = forms.CharField( + required=False, + widget=forms.TextInput(attrs={ + 'hidden': True + }) + ) + + body = forms.CharField( + required=False, + widget=forms.Textarea(attrs={ + 'hidden': True + }) + ) + + def get_context(self, conference): + raise NotImplementedError + + def render_html(self, conference): + ctx_data = self.get_context(conference) + context = Context(ctx_data, autoescape=False) + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 3 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / fields.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/fields.py) + +```python +# fields.py +import json + +import django +~~from django.core.exceptions import ValidationError +from django.db import models + + +class JSONField(models.TextField): + if django.VERSION < (3, 0): + def from_db_value(self, value, expression, connection, context): + return self.to_python(value) + else: + def from_db_value(self, value, expression, connection): + return self.to_python(value) + + def to_python(self, value): + if self.blank and not value: + return None + if isinstance(value, str): + try: + return json.loads(value) + except Exception as e: +~~ raise ValidationError(str(e)) + else: + return value + + def validate(self, value, model_instance): + if isinstance(value, str): + super(JSONField, self).validate(value, model_instance) + try: + json.loads(value) + except Exception as e: +~~ raise ValidationError(str(e)) + + def get_prep_value(self, value): + try: + return json.dumps(value) + except Exception as e: +~~ raise ValidationError(str(e)) + + def value_from_object(self, obj): + val = super(JSONField, self).value_from_object(obj) + return self.get_prep_value(val) + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 4 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / angular_base.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/angular_base.py) + +```python +# angular_base.py +from base64 import b64encode +from collections import UserList +import json +import warnings + +from django.forms import forms +from django.http import QueryDict +from django.utils.html import format_html, format_html_join, escape, conditional_escape +from django.utils.encoding import force_text +from django.utils.module_loading import import_string +from django.utils.safestring import mark_safe, SafeText, SafeData +~~from django.core.exceptions import ValidationError, ImproperlyConfigured + +from .fields import DefaultFieldMixin + + +class SafeTuple(SafeData, tuple): + + +class TupleErrorList(UserList, list): + def __init__(self, initlist=None, error_class=None): + super(TupleErrorList, self).__init__(initlist) + + if error_class is None: + self.error_class = 'errorlist' + else: + self.error_class = 'errorlist {}'.format(error_class) + + def as_data(self): +~~ return ValidationError(self.data).error_list + + def get_json_data(self, escape_html=False): + errors = [] + for error in self.as_data(): + message = list(error)[0] + errors.append({ + 'message': escape(message) if escape_html else message, + 'code': error.code or '', + }) + return errors + + def as_json(self, escape_html=False): + return json.dumps(self.get_json_data(escape_html)) + + def extend(self, iterable): + for item in iterable: + if not isinstance(item, str): + self.append(item) + return None + + def as_ul(self): + if not self: + return SafeText() + first = self[0] + + +## ... source file abbreviated to get to ValidationError examples ... + + + return '' + if isinstance(self[0], tuple): + return '\n'.join(['* %s' % force_text(e[5]) for e in self if bool(e[5])]) + return '\n'.join(['* %s' % force_text(e) for e in self]) + + def __str__(self): + return self.as_ul() + + def __repr__(self): + if self and isinstance(self[0], tuple): + return repr([force_text(e[5]) for e in self]) + return repr([force_text(e) for e in self]) + + def __contains__(self, item): + return item in list(self) + + def __eq__(self, other): + return list(self) == other + + def __ne__(self, other): + return list(self) != other + + def __getitem__(self, i): + error = self.data[i] + if isinstance(error, tuple): +~~ if isinstance(error[5], ValidationError): + error[5] = list(error[5])[0] + return error +~~ if isinstance(error, ValidationError): + return list(error)[0] + return force_text(error) + + +class NgWidgetMixin(object): + def get_context(self, name, value, attrs): + context = super(NgWidgetMixin, self).get_context(name, value, attrs) + if callable(getattr(self._field, 'update_widget_rendering_context', None)): + self._field.update_widget_rendering_context(context) + return context + + +class NgBoundField(forms.BoundField): + @property + def errors(self): + if not hasattr(self, '_errors_cache'): + self._errors_cache = self.form.get_field_errors(self) + return self._errors_cache + + def css_classes(self, extra_classes=None): + if hasattr(extra_classes, 'split'): + extra_classes = extra_classes.split() + extra_classes = set(extra_classes or []) + field_css_classes = getattr(self.form, 'field_css_classes', None) + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 5 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / api.py**](https://github.com/divio/django-cms/blob/develop/cms/./api.py) + +```python +# api.py +import datetime + +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +from django.core.exceptions import FieldError +from django.core.exceptions import PermissionDenied +~~from django.core.exceptions import ValidationError +from django.db import transaction +from django.template.defaultfilters import slugify +from django.template.loader import get_template +from django.utils.translation import activate + +from six import string_types + +from cms import constants +from cms.app_base import CMSApp +from cms.apphook_pool import apphook_pool +from cms.constants import TEMPLATE_INHERITANCE_MAGIC +from cms.models.pagemodel import Page +from cms.models.permissionmodels import (PageUser, PagePermission, GlobalPagePermission, + ACCESS_PAGE_AND_DESCENDANTS) +from cms.models.placeholdermodel import Placeholder +from cms.models.pluginmodel import CMSPlugin +from cms.models.titlemodels import Title +from cms.plugin_base import CMSPluginBase +from cms.plugin_pool import plugin_pool +from cms.utils import copy_plugins, get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import get_language_list +from cms.utils.page import get_available_slug +from cms.utils.permissions import _thread_locals, current_user + + +## ... source file abbreviated to get to ValidationError examples ... + + + + + + +def _verify_apphook(apphook, namespace): + apphook_pool.discover_apps() + if isinstance(apphook, CMSApp): + try: + assert apphook.__class__ in [app.__class__ for app in apphook_pool.apps.values()] + except AssertionError: + print(apphook_pool.apps.values()) + raise + apphook_name = apphook.__class__.__name__ + elif hasattr(apphook, '__module__') and issubclass(apphook, CMSApp): + return apphook.__name__ + elif isinstance(apphook, string_types): + try: + assert apphook in apphook_pool.apps + except AssertionError: + print(apphook_pool.apps.values()) + raise + apphook_name = apphook + else: + raise TypeError("apphook must be string or CMSApp instance") + if apphook_pool.apps[apphook_name].app_name and not namespace: +~~ raise ValidationError('apphook with app_name must define a namespace') + return apphook_name + + +def _verify_plugin_type(plugin_type): + if (hasattr(plugin_type, '__module__') and + issubclass(plugin_type, CMSPluginBase)): + plugin_model = plugin_type.model + assert plugin_type in plugin_pool.plugins.values() + plugin_type = plugin_type.__name__ + elif isinstance(plugin_type, string_types): + try: + plugin_model = plugin_pool.get_plugin(plugin_type).model + except KeyError: + raise TypeError( + 'plugin_type must be CMSPluginBase subclass or string' + ) + else: + raise TypeError('plugin_type must be CMSPluginBase subclass or string') + return plugin_model, plugin_type + + + +@transaction.atomic +def create_page(title, template, language, menu_title=None, slug=None, + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 6 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / validators.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/./validators.py) + +```python +# validators.py +import unicodedata +import binascii + + +~~from django.core.exceptions import ValidationError +from django.utils.deconstruct import deconstructible +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + + +@deconstructible +class NoControlCharactersValidator: + message = _("Control Characters like new lines or tabs are not allowed.") + code = "no_control_characters" + whitelist = None + + def __init__(self, message=None, code=None, whitelist=None): + if message: + self.message = message + if code: + self.code = code + if whitelist: + self.whitelist = whitelist + + def __call__(self, value): + value = force_str(value) + whitelist = self.whitelist + category = unicodedata.category + for character in value: + if whitelist and character in whitelist: + continue + if category(character)[0] == "C": + params = {'value': value, 'whitelist': whitelist} +~~ raise ValidationError(self.message, code=self.code, params=params) + + def __eq__(self, other): + return ( + isinstance(other, NoControlCharactersValidator) and + (self.whitelist == other.whitelist) and + (self.message == other.message) and + (self.code == other.code) + ) + + +@deconstructible +class NoWhitespaceValidator: + message = _("Leading and Trailing whitespaces are not allowed.") + code = "no_whitespace" + + def __init__(self, message=None, code=None, whitelist=None): + if message: + self.message = message + if code: + self.code = code + + def __call__(self, value): + value = force_str(value) + if value != value.strip(): + params = {'value': value} +~~ raise ValidationError(self.message, code=self.code, params=params) + + def __eq__(self, other): + return ( + isinstance(other, NoWhitespaceValidator) and + (self.message == other.message) and + (self.code == other.code) + ) + + +@deconstructible +class HexValidator: + messages = { + 'invalid': _("Only a hex string is allowed."), + 'length': _("Invalid length. Must be %(length)d characters."), + 'min_length': _("Ensure that there are more than %(min)s characters."), + 'max_length': _("Ensure that there are no more than %(max)s characters."), + } + code = "hex_only" + + def __init__(self, length=None, min_length=None, max_length=None, message=None, code=None): + self.length = length + self.min_length = min_length + self.max_length = max_length + if message: + self.message = message + if code: + self.code = code + + def __call__(self, value): + value = force_str(value) + if self.length and len(value) != self.length: +~~ raise ValidationError(self.messages['length'], code='hex_only_length', params={'length': self.length}) + if self.min_length and len(value) < self.min_length: +~~ raise ValidationError(self.messages['min_length'], code='hex_only_min_length', params={'min': self.min_length}) + if self.max_length and len(value) < self.max_length: +~~ raise ValidationError(self.messages['max_length'], code='hex_only_max_length', params={'max': self.max_length}) + + try: + binascii.unhexlify(value) + except (TypeError, binascii.Error): +~~ raise ValidationError(self.messages['invalid'], code='hex_only') + + def __eq__(self, other): + return ( + isinstance(other, HexValidator) and + (self.message == other.message) and + (self.code == other.code) + ) + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 7 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / forms.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/forms.py) + +```python +# forms.py +from __future__ import absolute_import + +from django import forms +from django.conf import settings +from django.contrib.admin import widgets +~~from django.core.exceptions import ValidationError +from django.db import models +from django.utils.translation import ugettext as _ + +from ..models import ThumbnailOption +from ..utils.files import get_valid_filename + + +class AsPWithHelpMixin(object): + def as_p_with_help(self): + "Returns this form rendered as HTML

    s with help text formated for admin." + return self._html_output( + normal_row='%(label)s %(field)s

    %(help_text)s', + error_row='%s', + row_ender='

    ', + help_text_html='

    %s

    ', + errors_on_separate_row=True) + + +class CopyFilesAndFoldersForm(forms.Form, AsPWithHelpMixin): + suffix = forms.CharField(required=False, help_text=_("Suffix which will be appended to filenames of copied files.")) + + def clean_suffix(self): + valid = get_valid_filename(self.cleaned_data['suffix']) + if valid != self.cleaned_data['suffix']: + + +## ... source file abbreviated to get to ValidationError examples ... + + + } + except KeyError as e: + raise forms.ValidationError(_('Unknown rename format value key "%(key)s".') % {'key': e.args[0]}) + except Exception as e: + raise forms.ValidationError(_('Invalid rename format: %(error)s.') % {'error': e}) + return self.cleaned_data['rename_format'] + + +class ResizeImagesForm(forms.Form, AsPWithHelpMixin): + if 'cmsplugin_filer_image' in settings.INSTALLED_APPS: + thumbnail_option = models.ForeignKey( + ThumbnailOption, + null=True, + blank=True, + verbose_name=_("thumbnail option"), + on_delete=models.CASCADE, + ).formfield() + width = models.PositiveIntegerField(_("width"), null=True, blank=True).formfield(widget=widgets.AdminIntegerFieldWidget) + height = models.PositiveIntegerField(_("height"), null=True, blank=True).formfield(widget=widgets.AdminIntegerFieldWidget) + crop = models.BooleanField(_("crop"), default=True).formfield() + upscale = models.BooleanField(_("upscale"), default=True).formfield() + + def clean(self): + if not (self.cleaned_data.get('thumbnail_option') or ((self.cleaned_data.get('width') or 0) + (self.cleaned_data.get('height') or 0))): + if 'cmsplugin_filer_image' in settings.INSTALLED_APPS: +~~ raise ValidationError(_('Thumbnail option or resize parameters must be choosen.')) + else: +~~ raise ValidationError(_('Resize parameters must be choosen.')) + return self.cleaned_data + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 8 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / models / models.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/models/models.py) + +```python +# models.py +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +~~from django.core.exceptions import ValidationError +from django.db import models +from django.utils.translation import gettext_lazy as _ +from guardian.compat import user_model_label +from guardian.ctypes import get_content_type +from guardian.managers import GroupObjectPermissionManager, UserObjectPermissionManager + + +class BaseObjectPermission(models.Model): + permission = models.ForeignKey(Permission, on_delete=models.CASCADE) + + class Meta: + abstract = True + + def __str__(self): + return '{} | {} | {}'.format( + str(self.content_object), + str(getattr(self, 'user', False) or self.group), + str(self.permission.codename)) + + def save(self, *args, **kwargs): + content_type = get_content_type(self.content_object) + if content_type != self.permission.content_type: +~~ raise ValidationError("Cannot persist permission not designed for " + "this class (permission's type is %r and object's type is %r)" + % (self.permission.content_type, content_type)) + return super().save(*args, **kwargs) + + +class BaseGenericObjectPermission(models.Model): + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + object_pk = models.CharField(_('object ID'), max_length=255) + content_object = GenericForeignKey(fk_field='object_pk') + + class Meta: + abstract = True + indexes = [ + models.Index(fields=['content_type', 'object_pk']), + ] + + +class UserObjectPermissionBase(BaseObjectPermission): + user = models.ForeignKey(user_model_label, on_delete=models.CASCADE) + + objects = UserObjectPermissionManager() + + class Meta: + abstract = True + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 9 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / resources.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./resources.py) + +```python +# resources.py +import functools +import logging +import tablib +import traceback +from collections import OrderedDict +from copy import deepcopy + +from diff_match_patch import diff_match_patch + +import django +from django.conf import settings +~~from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.management.color import no_style +from django.core.paginator import Paginator +from django.db import DEFAULT_DB_ALIAS, connections +from django.db.models.fields.related import ForeignObjectRel +from django.db.models.query import QuerySet +from django.db.transaction import ( + TransactionManagementError, + atomic, + savepoint, + savepoint_commit, + savepoint_rollback +) +from django.utils.encoding import force_str +from django.utils.safestring import mark_safe + +from . import widgets +from .fields import Field +from .instance_loaders import ModelInstanceLoader +from .results import Error, Result, RowResult +from .utils import atomic_if_using_transaction + +if django.VERSION[0] >= 3: + from django.core.exceptions import FieldDoesNotExist +else: + + +## ... source file abbreviated to get to ValidationError examples ... + + + else: + delete_ids = [o.pk for o in self.delete_instances] + self._meta.model.objects.filter(pk__in=delete_ids).delete() + except Exception as e: + logger.exception(e) + if raise_errors: + raise e + finally: + self.delete_instances.clear() + + def validate_instance(self, instance, import_validation_errors=None, validate_unique=True): + if import_validation_errors is None: + errors = {} + else: + errors = import_validation_errors.copy() + if self._meta.clean_model_instances: + try: + instance.full_clean( + exclude=errors.keys(), + validate_unique=validate_unique, + ) +~~ except ValidationError as e: + errors = e.update_error_dict(errors) + + if errors: +~~ raise ValidationError(errors) + + def save_instance(self, instance, using_transactions=True, dry_run=False): + self.before_save_instance(instance, using_transactions, dry_run) + if self._meta.use_bulk: + if instance.pk: + self.update_instances.append(instance) + else: + self.create_instances.append(instance) + else: + if not using_transactions and dry_run: + pass + else: + instance.save() + self.after_save_instance(instance, using_transactions, dry_run) + + def before_save_instance(self, instance, using_transactions, dry_run): + pass + + def after_save_instance(self, instance, using_transactions, dry_run): + pass + + def delete_instance(self, instance, using_transactions=True, dry_run=False): + self.before_delete_instance(instance, dry_run) + if self._meta.use_bulk: + + +## ... source file abbreviated to get to ValidationError examples ... + + + else: + instance.delete() + self.after_delete_instance(instance, dry_run) + + def before_delete_instance(self, instance, dry_run): + pass + + def after_delete_instance(self, instance, dry_run): + pass + + def import_field(self, field, obj, data, is_m2m=False): + if field.attribute and field.column_name in data: + field.save(obj, data, is_m2m) + + def get_import_fields(self): + return self.get_fields() + + def import_obj(self, obj, data, dry_run): + errors = {} + for field in self.get_import_fields(): + if isinstance(field.widget, widgets.ManyToManyWidget): + continue + try: + self.import_field(field, obj, data) + except ValueError as e: +~~ errors[field.attribute] = ValidationError( + force_str(e), code="invalid") + if errors: +~~ raise ValidationError(errors) + + def save_m2m(self, obj, data, using_transactions, dry_run): + if (not using_transactions and dry_run) or self._meta.use_bulk: + pass + else: + for field in self.get_import_fields(): + if not isinstance(field.widget, widgets.ManyToManyWidget): + continue + self.import_field(field, obj, data, True) + + def for_delete(self, row, instance): + return False + + def skip_row(self, instance, original): + if not self._meta.skip_unchanged or self._meta.skip_diff: + return False + for field in self.get_import_fields(): + try: + if list(field.get_value(instance).all()) != list(field.get_value(original).all()): + return False + except AttributeError: + if field.get_value(instance) != field.get_value(original): + return False + return True + try: + if len(self.delete_instances) > 0: + if not using_transactions and dry_run: + pass + + +## ... source file abbreviated to get to ValidationError examples ... + + + self.before_import_row(row, **kwargs) + instance, new = self.get_or_init_instance(instance_loader, row) + self.after_import_instance(instance, new, **kwargs) + if new: + row_result.import_type = RowResult.IMPORT_TYPE_NEW + else: + row_result.import_type = RowResult.IMPORT_TYPE_UPDATE + row_result.new_record = new + if not skip_diff: + original = deepcopy(instance) + diff = self.get_diff_class()(self, original, new) + if self.for_delete(row, instance): + if new: + row_result.import_type = RowResult.IMPORT_TYPE_SKIP + if not skip_diff: + diff.compare_with(self, None, dry_run) + else: + row_result.import_type = RowResult.IMPORT_TYPE_DELETE + self.delete_instance(instance, using_transactions, dry_run) + if not skip_diff: + diff.compare_with(self, None, dry_run) + else: + import_validation_errors = {} + try: + self.import_obj(instance, row, dry_run) +~~ except ValidationError as e: + import_validation_errors = e.update_error_dict(import_validation_errors) + if self.skip_row(instance, original): + row_result.import_type = RowResult.IMPORT_TYPE_SKIP + else: + self.validate_instance(instance, import_validation_errors) + self.save_instance(instance, using_transactions, dry_run) + self.save_m2m(instance, row, using_transactions, dry_run) + row_result.object_id = instance.pk + row_result.object_repr = force_str(instance) + if not skip_diff: + diff.compare_with(self, instance, dry_run) + + if not skip_diff: + row_result.diff = diff.as_html() + self.after_import_row(row, row_result, **kwargs) + +~~ except ValidationError as e: + row_result.import_type = RowResult.IMPORT_TYPE_INVALID + row_result.validation_error = e + except Exception as e: + row_result.import_type = RowResult.IMPORT_TYPE_ERROR + if not isinstance(e, TransactionManagementError): + logger.debug(e, exc_info=e) + tb_info = traceback.format_exc() + row_result.errors.append(self.get_error_result_class()(e, tb_info, row)) + + if self._meta.use_bulk: + if len(self.create_instances) == self._meta.batch_size: + self.bulk_create(using_transactions, dry_run, raise_errors, batch_size=self._meta.batch_size) + if len(self.update_instances) == self._meta.batch_size: + self.bulk_update(using_transactions, dry_run, raise_errors, batch_size=self._meta.batch_size) + if len(self.delete_instances) == self._meta.batch_size: + self.bulk_delete(using_transactions, dry_run, raise_errors) + + return row_result + + def import_data(self, dataset, dry_run=False, raise_errors=False, + use_transactions=None, collect_failed_rows=False, **kwargs): + + if use_transactions is None: + use_transactions = self.get_use_transactions() + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 10 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / forms.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./forms.py) + +```python +# forms.py +import json +from django import forms +from django.contrib.auth.models import Permission +from django.contrib.contenttypes.models import ContentType +~~from django.core.exceptions import ValidationError +from django.db.models import Q +import operator + +from jet.models import Bookmark, PinnedApplication +from jet.utils import get_model_instance_label, user_is_authenticated +from functools import reduce + +try: + from django.apps import apps + get_model = apps.get_model +except ImportError: + from django.db.models.loading import get_model + + +class AddBookmarkForm(forms.ModelForm): + def __init__(self, request, *args, **kwargs): + self.request = request + super(AddBookmarkForm, self).__init__(*args, **kwargs) + + class Meta: + model = Bookmark + fields = ['url', 'title'] + + def clean(self): + data = super(AddBookmarkForm, self).clean() + if not user_is_authenticated(self.request.user) or not self.request.user.is_staff: +~~ raise ValidationError('error') + if not self.request.user.has_perm('jet.change_bookmark'): +~~ raise ValidationError('error') + return data + + def save(self, commit=True): + self.instance.user = self.request.user.pk + return super(AddBookmarkForm, self).save(commit) + + +class RemoveBookmarkForm(forms.ModelForm): + def __init__(self, request, *args, **kwargs): + self.request = request + super(RemoveBookmarkForm, self).__init__(*args, **kwargs) + + class Meta: + model = Bookmark + fields = [] + + def clean(self): + data = super(RemoveBookmarkForm, self).clean() + if not user_is_authenticated(self.request.user) or not self.request.user.is_staff: +~~ raise ValidationError('error') + if self.instance.user != self.request.user.pk: +~~ raise ValidationError('error') + return data + + def save(self, commit=True): + if commit: + self.instance.delete() + + +class ToggleApplicationPinForm(forms.ModelForm): + def __init__(self, request, *args, **kwargs): + self.request = request + super(ToggleApplicationPinForm, self).__init__(*args, **kwargs) + + class Meta: + model = PinnedApplication + fields = ['app_label'] + + def clean(self): + data = super(ToggleApplicationPinForm, self).clean() + if not user_is_authenticated(self.request.user) or not self.request.user.is_staff: +~~ raise ValidationError('error') + return data + + def save(self, commit=True): + if commit: + try: + pinned_app = PinnedApplication.objects.get( + app_label=self.cleaned_data['app_label'], + user=self.request.user.pk + ) + pinned_app.delete() + return False + except PinnedApplication.DoesNotExist: + PinnedApplication.objects.create( + app_label=self.cleaned_data['app_label'], + user=self.request.user.pk + ) + return True + + +class ModelLookupForm(forms.Form): + app_label = forms.CharField() + model = forms.CharField() + q = forms.CharField(required=False) + page = forms.IntegerField(required=False) + page_size = forms.IntegerField(required=False, min_value=1, max_value=1000) + object_id = forms.IntegerField(required=False) + model_cls = None + + def __init__(self, request, *args, **kwargs): + self.request = request + super(ModelLookupForm, self).__init__(*args, **kwargs) + + def clean(self): + data = super(ModelLookupForm, self).clean() + + if not user_is_authenticated(self.request.user) or not self.request.user.is_staff: +~~ raise ValidationError('error') + + try: + self.model_cls = get_model(data['app_label'], data['model']) + except: +~~ raise ValidationError('error') + + content_type = ContentType.objects.get_for_model(self.model_cls) + permission = Permission.objects.filter(content_type=content_type, codename__startswith='change_').first() + + if not self.request.user.has_perm('{}.{}'.format(data['app_label'], permission.codename)): +~~ raise ValidationError('error') + + return data + + def lookup(self): + qs = self.model_cls.objects + + if self.cleaned_data['q']: + if getattr(self.model_cls, 'autocomplete_search_fields', None): + search_fields = self.model_cls.autocomplete_search_fields() + filter_data = [Q((field + '__icontains', self.cleaned_data['q'])) for field in search_fields] + qs = qs.filter(reduce(operator.or_, filter_data)).distinct() + else: + qs = qs.none() + + limit = self.cleaned_data['page_size'] or 100 + page = self.cleaned_data['page'] or 1 + offset = (page - 1) * limit + + items = list(map( + lambda instance: {'id': instance.pk, 'text': get_model_instance_label(instance)}, + qs.all()[offset:offset + limit] + )) + total = qs.count() + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 11 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / fields.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./fields.py) + +```python +# fields.py +import uuid +from django.db import models +from django.conf import settings +~~from django.core.exceptions import ValidationError +from django.utils.timezone import now + +DEFAULT_CHOICES_NAME = 'STATUS' + + +class AutoCreatedField(models.DateTimeField): + + def __init__(self, *args, **kwargs): + kwargs.setdefault('editable', False) + kwargs.setdefault('default', now) + super().__init__(*args, **kwargs) + + +class AutoLastModifiedField(AutoCreatedField): + def get_default(self): + if not hasattr(self, "_default"): + self._default = self._get_default() + return self._default + + def pre_save(self, model_instance, add): + value = now() + if add: + current_value = getattr(model_instance, self.attname, self.get_default()) + if current_value != self.get_default(): + + +## ... source file abbreviated to get to ValidationError examples ... + + + excerpt = get_excerpt(value.content) + setattr(model_instance, _excerpt_field_name(self.attname), excerpt) + return value.content + + def value_to_string(self, obj): + value = self.value_from_object(obj) + return value.content + + def get_prep_value(self, value): + try: + return value.content + except AttributeError: + return value + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + kwargs['no_excerpt_field'] = True + return name, path, args, kwargs + + +class UUIDField(models.UUIDField): + + def __init__(self, primary_key=True, version=4, editable=False, *args, **kwargs): + + if version == 2: +~~ raise ValidationError( + 'UUID version 2 is not supported.') + + if version < 1 or version > 5: +~~ raise ValidationError( + 'UUID version is not valid.') + + if version == 1: + default = uuid.uuid1 + elif version == 3: + default = uuid.uuid3 + elif version == 4: + default = uuid.uuid4 + elif version == 5: + default = uuid.uuid5 + + kwargs.setdefault('primary_key', primary_key) + kwargs.setdefault('editable', editable) + kwargs.setdefault('default', default) + super().__init__(*args, **kwargs) + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 12 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / models.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./models.py) + +```python +# models.py +import logging +from datetime import timedelta +from urllib.parse import parse_qsl, urlparse + +from django.apps import apps +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db import models, transaction +from django.urls import reverse +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + +from .generators import generate_client_id, generate_client_secret +from .scopes import get_scopes_backend +from .settings import oauth2_settings +from .validators import RedirectURIValidator, WildcardSet + + +logger = logging.getLogger(__name__) + + +class AbstractApplication(models.Model): + CLIENT_CONFIDENTIAL = "confidential" + CLIENT_PUBLIC = "public" + CLIENT_TYPES = ( + (CLIENT_CONFIDENTIAL, _("Confidential")), + (CLIENT_PUBLIC, _("Public")), + ) + + GRANT_AUTHORIZATION_CODE = "authorization-code" + GRANT_IMPLICIT = "implicit" + GRANT_PASSWORD = "password" + GRANT_CLIENT_CREDENTIALS = "client-credentials" + GRANT_TYPES = ( + (GRANT_AUTHORIZATION_CODE, _("Authorization code")), + + +## ... source file abbreviated to get to ValidationError examples ... + + + + assert False, ( + "If you are using implicit, authorization_code" + "or all-in-one grant_type, you must define " + "redirect_uris field in your Application model" + ) + + def redirect_uri_allowed(self, uri): + parsed_uri = urlparse(uri) + uqs_set = set(parse_qsl(parsed_uri.query)) + for allowed_uri in self.redirect_uris.split(): + parsed_allowed_uri = urlparse(allowed_uri) + + if (parsed_allowed_uri.scheme == parsed_uri.scheme and + parsed_allowed_uri.netloc == parsed_uri.netloc and + parsed_allowed_uri.path == parsed_uri.path): + + aqs_set = set(parse_qsl(parsed_allowed_uri.query)) + + if aqs_set.issubset(uqs_set): + return True + + return False + + def clean(self): +~~ from django.core.exceptions import ValidationError + + grant_types = ( + AbstractApplication.GRANT_AUTHORIZATION_CODE, + AbstractApplication.GRANT_IMPLICIT, + ) + + redirect_uris = self.redirect_uris.strip().split() + allowed_schemes = set(s.lower() for s in self.get_allowed_schemes()) + + if redirect_uris: + validator = RedirectURIValidator(WildcardSet()) + for uri in redirect_uris: + validator(uri) + scheme = urlparse(uri).scheme + if scheme not in allowed_schemes: +~~ raise ValidationError(_( + "Unauthorized redirect scheme: {scheme}" + ).format(scheme=scheme)) + + elif self.authorization_grant_type in grant_types: +~~ raise ValidationError(_( + "redirect_uris cannot be empty with grant_type {grant_type}" + ).format(grant_type=self.authorization_grant_type)) + + def get_absolute_url(self): + return reverse("oauth2_provider:detail", args=[str(self.id)]) + + def get_allowed_schemes(self): + return oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES + + def allows_grant_type(self, *grant_types): + return self.authorization_grant_type in grant_types + + def is_usable(self, request): + return True + + +class ApplicationManager(models.Manager): + def get_by_natural_key(self, client_id): + return self.get(client_id=client_id) + + +class Application(AbstractApplication): + objects = ApplicationManager() + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 13 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import copy +import datetime +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +~~from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings + + +## ... source file abbreviated to get to ValidationError examples ... + + + def run_validators(self, value): + errors = [] + for validator in self.validators: + if hasattr(validator, 'set_context'): + warnings.warn( + "Method `set_context` on validators is deprecated and will " + "no longer be called starting with 3.13. Instead set " + "`requires_context = True` on the class, and accept the " + "context as an additional argument.", + RemovedInDRF313Warning, stacklevel=2 + ) + validator.set_context(self) + + try: + if getattr(validator, 'requires_context', False): + validator(value, self) + else: + validator(value) +~~ except ValidationError as exc: + if isinstance(exc.detail, dict): + raise + errors.extend(exc.detail) + except DjangoValidationError as exc: + errors.extend(get_error_detail(exc)) + if errors: +~~ raise ValidationError(errors) + + def to_internal_value(self, data): + raise NotImplementedError( + '{cls}.to_internal_value() must be implemented for field ' + '{field_name}. If you do not need to support write operations ' + 'you probably want to subclass `ReadOnlyField` instead.'.format( + cls=self.__class__.__name__, + field_name=self.field_name, + ) + ) + + def to_representation(self, value): + raise NotImplementedError( + '{cls}.to_representation() must be implemented for field {field_name}.'.format( + cls=self.__class__.__name__, + field_name=self.field_name, + ) + ) + + def fail(self, key, **kwargs): + try: + msg = self.error_messages[key] + except KeyError: + class_name = self.__class__.__name__ + msg = MISSING_ERROR_MESSAGE.format(class_name=class_name, key=key) + raise AssertionError(msg) + message_string = msg.format(**kwargs) +~~ raise ValidationError(message_string, code=key) + + @property + def root(self): + root = self + while root.parent is not None: + root = root.parent + return root + + @property + def context(self): + return getattr(self.root, '_context', {}) + + def __new__(cls, *args, **kwargs): + instance = super().__new__(cls) + instance._args = args + instance._kwargs = kwargs + return instance + + def __deepcopy__(self, memo): + args = [ + copy.deepcopy(item) if not isinstance(item, REGEX_TYPE) else item + for item in self._args + ] + kwargs = { + + +## ... source file abbreviated to get to ValidationError examples ... + + + + def to_internal_value(self, data): + if html.is_html_input(data): + data = html.parse_html_list(data, default=[]) + if isinstance(data, (str, Mapping)) or not hasattr(data, '__iter__'): + self.fail('not_a_list', input_type=type(data).__name__) + if not self.allow_empty and len(data) == 0: + self.fail('empty') + return self.run_child_validation(data) + + def to_representation(self, data): + return [self.child.to_representation(item) if item is not None else None for item in data] + + def run_child_validation(self, data): + result = [] + errors = OrderedDict() + + for idx, item in enumerate(data): + try: + result.append(self.child.run_validation(item)) +~~ except ValidationError as e: + errors[idx] = e.detail + + if not errors: + return result +~~ raise ValidationError(errors) + + +class DictField(Field): + child = _UnvalidatedField() + initial = {} + default_error_messages = { + 'not_a_dict': _('Expected a dictionary of items but got type "{input_type}".'), + 'empty': _('This dictionary may not be empty.'), + } + + def __init__(self, *args, **kwargs): + self.child = kwargs.pop('child', copy.deepcopy(self.child)) + self.allow_empty = kwargs.pop('allow_empty', True) + + assert not inspect.isclass(self.child), '`child` has not been instantiated.' + assert self.child.source is None, ( + "The `source` argument is not meaningful when applied to a `child=` field. " + "Remove `source=` from the field declaration." + ) + + super().__init__(*args, **kwargs) + self.child.bind(field_name='', parent=self) + + def get_value(self, dictionary): + + +## ... source file abbreviated to get to ValidationError examples ... + + + if not self.allow_empty and len(data) == 0: + self.fail('empty') + + return self.run_child_validation(data) + + def to_representation(self, value): + return { + str(key): self.child.to_representation(val) if val is not None else None + for key, val in value.items() + } + + def run_child_validation(self, data): + result = {} + errors = OrderedDict() + + for key, value in data.items(): + key = str(key) + + try: + result[key] = self.child.run_validation(value) +~~ except ValidationError as e: + errors[key] = e.detail + + if not errors: + return result +~~ raise ValidationError(errors) + + +class HStoreField(DictField): + child = CharField(allow_blank=True, allow_null=True) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert isinstance(self.child, CharField), ( + "The `child` argument must be an instance of `CharField`, " + "as the hstore extension stores values as strings." + ) + + +class JSONField(Field): + default_error_messages = { + 'invalid': _('Value must be valid JSON.') + } + + def __init__(self, *args, **kwargs): + self.binary = kwargs.pop('binary', False) + self.encoder = kwargs.pop('encoder', None) + super().__init__(*args, **kwargs) + + def get_value(self, dictionary): + (is_empty_value, data) = self.validate_empty_values(data) + if is_empty_value: + return data + value = self.to_internal_value(data) + self.run_validators(value) + return value + + + +## ... source file abbreviated to get to ValidationError examples ... + + + if len(val) > 0: + return val + return html.parse_html_list(dictionary, prefix=self.field_name, default=empty) + + return dictionary.get(self.field_name, empty) + + +## ... source file abbreviated to get to ValidationError examples ... + + + def to_internal_value(self, data): + if html.is_html_input(data): + data = html.parse_html_dict(data) + if not isinstance(data, dict): + self.fail('not_a_dict', input_type=type(data).__name__) + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 14 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / models / urlpath.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/models/urlpath.py) + +```python +# urlpath.py +import logging +import warnings + +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.models import Site +~~from django.core.exceptions import ValidationError +from django.db import models +from django.db import transaction +from django.db.models.signals import post_save +from django.db.models.signals import pre_delete +from django.urls import reverse +from django.utils.translation import gettext +from django.utils.translation import gettext_lazy as _ +from mptt.fields import TreeForeignKey +from mptt.models import MPTTModel +from wiki import managers +from wiki.conf import settings +from wiki.core.exceptions import MultipleRootURLs +from wiki.core.exceptions import NoRootURL +from wiki.decorators import disable_signal_for_loaddata +from wiki.models.article import Article +from wiki.models.article import ArticleForObject +from wiki.models.article import ArticleRevision + +__all__ = [ + "URLPath", +] + + +log = logging.getLogger(__name__) + + +## ... source file abbreviated to get to ValidationError examples ... + + + raise NoRootURL("You need to create a root article on site '%s'" % site) + if no_paths > 1: + raise MultipleRootURLs("Somehow you have multiple roots on %s" % site) + return root_nodes[0] + + class MPTTMeta: + pass + + def __str__(self): + path = self.path + return path if path else gettext("(root)") + + def delete(self, *args, **kwargs): + assert not ( + self.parent and self.get_children() + ), "You cannot delete a root article with children." + super().delete(*args, **kwargs) + + class Meta: + verbose_name = _("URL path") + verbose_name_plural = _("URL paths") + unique_together = ("site", "parent", "slug") + + def clean(self, *args, **kwargs): + if self.slug and not self.parent: +~~ raise ValidationError( + _("Sorry but you cannot have a root article with a slug.") + ) + if not self.slug and self.parent: +~~ raise ValidationError(_("A non-root note must always have a slug.")) + if not self.parent: + if URLPath.objects.root_nodes().filter(site=self.site).exclude(id=self.id): +~~ raise ValidationError( + _("There is already a root node on %s") % self.site + ) + + @classmethod + def get_by_path(cls, path, select_related=False): + + + path = path.lstrip("/") + path = path.rstrip("/") + + if not path: + return cls.root() + + slugs = path.split("/") + level = 1 + parent = cls.root() + for slug in slugs: + if settings.URL_CASE_SENSITIVE: + child = parent.get_children().select_related_common().get(slug=slug) + child.cached_ancestors = parent.cached_ancestors + [parent] + parent = child + else: + child = ( + parent.get_children().select_related_common().get(slug__iexact=slug) + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 15 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / forms.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./forms.py) + +```python +# forms.py +from __future__ import unicode_literals + +import logging +import re +import collections +import datetime + +import django.forms +import django.forms.utils +import django.forms.widgets +import django.core.validators +~~import django.core.exceptions +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from django.utils.safestring import mark_safe + +import form_utils.forms +import requests +import dateutil.parser +import validate_email + +logger = logging.getLogger(__name__) + + +REGISTRATION_CONFIGURATION_NAME = 'registration_configuration' + +RE_NON_DECIMAL = re.compile(r'[^\d]+') +RE_NON_ALPHA = re.compile('[\W]+') +RE_POSTAL_CODE = re.compile(r'^[0-9]{5}$') +validate_postal_code = django.core.validators.RegexValidator( + RE_POSTAL_CODE, _("Enter a valid postal code consisting 5 numbers."), 'invalid') + + +CHOICES_GENDER = ( + ('M', _('Male')), + ('F', _('Female')), +) + + +class MultiEmailField(django.forms.CharField): + message = _('Enter valid email addresses.') + code = 'invalid' + widget = django.forms.widgets.TextInput + + def to_python(self, value): + "Normalize data to a list of strings." + if not value: + return [] + return [v.strip() for v in re.findall(validate_email.ADDR_SPEC, value)] + + def validate(self, value): + "Check if value consists only of valid emails." + + super(MultiEmailField, self).validate(value) + try: + for email in value: + django.core.validators.validate_email(email) + except django.core.exceptions.ValidationError: +~~ raise django.core.exceptions.ValidationError(self.message, code=self.code) + + + + + +class StateLookupForm(django.forms.Form): + email = django.forms.EmailField(label=_('Email'), help_text=_('so we can send you confirmation of your registration')) + postal_code = django.forms.CharField( + label=_('Postal Code'), + max_length=5, min_length=5, validators=[validate_postal_code], + help_text=_('to determine which series of state-based questions we will ask next')) + + def clean_email(self): + email = self.cleaned_data['email'] + if settings.DISABLE_EMAIL_VALIDATION: + logger.warning('Email validation disabled: DISABLE_EMAIL_VALIDATION ' + 'is set') + return email + if not hasattr(settings, 'MAILGUN_PUBLIC_API_KEY'): + logger.warning( + 'Cannot validate email: MAILGUN_PUBLIC_API_KEY not set') + return email + r = requests.get( + 'https://api.mailgun.net/v2/address/validate', + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 16 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / snippets / tests.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/snippets/tests.py) + +```python +# tests.py +import json + +from django.contrib.admin.utils import quote +from django.contrib.auth import get_user_model +from django.contrib.auth.models import AnonymousUser, Permission +from django.core import checks +~~from django.core.exceptions import ValidationError +from django.core.files.base import ContentFile +from django.core.files.uploadedfile import SimpleUploadedFile +from django.http import HttpRequest, HttpResponse +from django.test import RequestFactory, TestCase +from django.test.utils import override_settings +from django.urls import reverse +from taggit.models import Tag + +from wagtail.admin.edit_handlers import FieldPanel +from wagtail.admin.forms import WagtailAdminModelForm +from wagtail.core.models import Page +from wagtail.snippets.blocks import SnippetChooserBlock +from wagtail.snippets.edit_handlers import SnippetChooserPanel +from wagtail.snippets.models import SNIPPET_MODELS, register_snippet +from wagtail.snippets.views.snippets import get_snippet_edit_handler +from wagtail.tests.snippets.forms import FancySnippetForm +from wagtail.tests.snippets.models import ( + AlphaSnippet, FancySnippet, FileUploadSnippet, RegisterDecorator, RegisterFunction, + SearchableSnippet, StandardSnippet, StandardSnippetWithCustomPrimaryKey, ZuluSnippet) +from wagtail.tests.testapp.models import ( + Advert, AdvertWithCustomPrimaryKey, AdvertWithCustomUUIDPrimaryKey, AdvertWithTabbedInterface, + SnippetChooserModel, SnippetChooserModelWithCustomPrimaryKey) +from wagtail.tests.utils import WagtailTestUtils + + + +## ... source file abbreviated to get to ValidationError examples ... + + + self.assertInHTML('', empty_form_html) + self.assertIn('createSnippetChooser("advert", "tests/advert");', empty_form_html) + + test_advert = Advert.objects.get(text='test_advert') + test_advert_form_html = block.render_form(test_advert, 'advert') + expected_html = '' % test_advert.id + self.assertInHTML(expected_html, test_advert_form_html) + self.assertIn("pick an advert, any advert", test_advert_form_html) + + def test_form_response(self): + block = SnippetChooserBlock(Advert) + test_advert = Advert.objects.get(text='test_advert') + + value = block.value_from_datadict({'advert': str(test_advert.id)}, {}, 'advert') + self.assertEqual(value, test_advert) + + empty_value = block.value_from_datadict({'advert': ''}, {}, 'advert') + self.assertEqual(empty_value, None) + + def test_clean(self): + required_block = SnippetChooserBlock(Advert) + nonrequired_block = SnippetChooserBlock(Advert, required=False) + test_advert = Advert.objects.get(text='test_advert') + + self.assertEqual(required_block.clean(test_advert), test_advert) +~~ with self.assertRaises(ValidationError): + required_block.clean(None) + + self.assertEqual(nonrequired_block.clean(test_advert), test_advert) + self.assertEqual(nonrequired_block.clean(None), None) + + +class TestSnippetListViewWithCustomPrimaryKey(TestCase, WagtailTestUtils): + def setUp(self): + self.login() + + self.snippet_a = StandardSnippetWithCustomPrimaryKey.objects.create(snippet_id="snippet/01", text="Hello") + self.snippet_b = StandardSnippetWithCustomPrimaryKey.objects.create(snippet_id="snippet/02", text="Hello") + self.snippet_c = StandardSnippetWithCustomPrimaryKey.objects.create(snippet_id="snippet/03", text="Hello") + + def get(self, params={}): + return self.client.get(reverse('wagtailsnippets:list', + args=('snippetstests', 'standardsnippetwithcustomprimarykey')), + params) + + def test_simple(self): + response = self.get() + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, 'wagtailsnippets/snippets/type_index.html') + + + +## ... source file abbreviated to get to ValidationError examples ... + + + self.assertInHTML('', empty_form_html) + self.assertIn('createSnippetChooser("advertwithcustomprimarykey", "tests/advertwithcustomprimarykey");', empty_form_html) + + test_advert = AdvertWithCustomPrimaryKey.objects.get(pk='advert/01') + test_advert_form_html = block.render_form(test_advert, 'advertwithcustomprimarykey') + expected_html = '' % test_advert.pk + self.assertInHTML(expected_html, test_advert_form_html) + self.assertIn("pick an advert, any advert", test_advert_form_html) + + def test_form_response(self): + block = SnippetChooserBlock(AdvertWithCustomPrimaryKey) + test_advert = AdvertWithCustomPrimaryKey.objects.get(pk='advert/01') + + value = block.value_from_datadict({'advertwithcustomprimarykey': str(test_advert.pk)}, {}, 'advertwithcustomprimarykey') + self.assertEqual(value, test_advert) + + empty_value = block.value_from_datadict({'advertwithcustomprimarykey': ''}, {}, 'advertwithcustomprimarykey') + self.assertEqual(empty_value, None) + + def test_clean(self): + required_block = SnippetChooserBlock(AdvertWithCustomPrimaryKey) + nonrequired_block = SnippetChooserBlock(AdvertWithCustomPrimaryKey, required=False) + test_advert = AdvertWithCustomPrimaryKey.objects.get(pk='advert/01') + + self.assertEqual(required_block.clean(test_advert), test_advert) +~~ with self.assertRaises(ValidationError): + required_block.clean(None) + + self.assertEqual(nonrequired_block.clean(test_advert), test_advert) + self.assertEqual(nonrequired_block.clean(None), None) + + +class TestSnippetChooserPanelWithCustomPrimaryKey(TestCase, WagtailTestUtils): + fixtures = ['test.json'] + + def setUp(self): + self.request = RequestFactory().get('/') + user = AnonymousUser() # technically, Anonymous users cannot access the admin + self.request.user = user + + model = SnippetChooserModelWithCustomPrimaryKey + self.advert_text = 'Test advert text' + test_snippet = model.objects.create( + advertwithcustomprimarykey=AdvertWithCustomPrimaryKey.objects.create( + advert_id="advert/02", + text=self.advert_text + ) + ) + + self.edit_handler = get_snippet_edit_handler(model) + + +## ... source file continues with no further ValidationError examples... + +``` + diff --git a/redirects/django-core-exceptions-improperlyconfigured.html b/redirects/django-core-exceptions-improperlyconfigured.html new file mode 100644 index 000000000..2dd308b2d --- /dev/null +++ b/redirects/django-core-exceptions-improperlyconfigured.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 795915387..59d77eb82 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -61,6 +61,19 @@

    django.core signing, validators

    +

    django.core.exceptions + DisallowedRedirect, + FieldDoesNotExist, + FieldError, + ImproperlyConfigured, + MiddlewareNotUsed, + NON_FIELD_ERRORS, + ObjectDoesNotExist, + PermissionDenied, + SuspiciousFileOperation, + SuspiciousMultipartForm, + ValidationError +

    django.db DEFAULT_DB_ALIAS, DataError, @@ -344,19 +357,11 @@

    django.utils.version

    django.views csrf -

    -

    django.views.debug - get_default_exception_reporter_filter -

    -

    django.views.decorators.csrf - csrf_exempt -

    -

    django.views.decorators.debug - sensitive_post_parameters -

    -

    django.views.decorators.http - require_GET, - require_POST + .debug get_default_exception_reporter_filter + .decorators.csrf csrf_exempt + .decorators.debug sensitive_post_parameters + .decorators.http require_GET, + .decorators.http require_POST

    django.views.generic CreateView, diff --git a/theme/templates/page.html b/theme/templates/page.html index 13c2f904d..19aed5b20 100644 --- a/theme/templates/page.html +++ b/theme/templates/page.html @@ -63,6 +63,9 @@

    {{ page.title }}

    {% include "examples-extensions-descriptions/pandas.html" %} {% endif %} {{ page.content }} + {% if page.slug == "django" %} + {% include "code-examples/django.html" %} + {% endif %} {% if page.slug == "flask" %} {% include "code-examples/flask.html" %} {% endif %} From a0329875ea8c3aa284b1a20cb212d27b8fdb1e46 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 12 Jul 2020 16:23:09 -0400 Subject: [PATCH 189/302] adding additional django template examples --- .../django-template-base-context.markdown | 67 +++++ ...go-template-base-filterexpression.markdown | 98 +++++++ .../django/django-template-base-node.markdown | 86 +++++++ .../django-template-base-nodelist.markdown | 103 ++++++++ .../django-template-base-parser.markdown | 114 +++++++++ .../django-template-base-template.markdown | 131 ++++++++++ ...template-base-templatesyntaxerror.markdown | 241 ++++++++++++++++++ .../django-template-base-textnode.markdown | 101 ++++++++ ...django-template-base-token-kwargs.markdown | 122 +++++++++ .../django-template-base-token.markdown | 114 +++++++++ .../django-template-base-tokentype.markdown | 63 +++++ ...emplate-base-variabledoesnotexist.markdown | 111 ++++++++ ...django-template-base-variablenode.markdown | 155 +++++++++++ ...kdown-django-3-0-django-markdown-view.html | 1 + theme/templates/code-examples/django.html | 15 ++ 15 files changed, 1522 insertions(+) create mode 100644 content/pages/examples/django/django-template-base-context.markdown create mode 100644 content/pages/examples/django/django-template-base-filterexpression.markdown create mode 100644 content/pages/examples/django/django-template-base-node.markdown create mode 100644 content/pages/examples/django/django-template-base-nodelist.markdown create mode 100644 content/pages/examples/django/django-template-base-parser.markdown create mode 100644 content/pages/examples/django/django-template-base-template.markdown create mode 100644 content/pages/examples/django/django-template-base-templatesyntaxerror.markdown create mode 100644 content/pages/examples/django/django-template-base-textnode.markdown create mode 100644 content/pages/examples/django/django-template-base-token-kwargs.markdown create mode 100644 content/pages/examples/django/django-template-base-token.markdown create mode 100644 content/pages/examples/django/django-template-base-tokentype.markdown create mode 100644 content/pages/examples/django/django-template-base-variabledoesnotexist.markdown create mode 100644 content/pages/examples/django/django-template-base-variablenode.markdown diff --git a/content/pages/examples/django/django-template-base-context.markdown b/content/pages/examples/django/django-template-base-context.markdown new file mode 100644 index 000000000..98338234d --- /dev/null +++ b/content/pages/examples/django/django-template-base-context.markdown @@ -0,0 +1,67 @@ +title: django.template.base Context Example Code +category: page +slug: django-template-base-context-examples +sortorder: 500011363 +toc: False +sidebartitle: django.template.base Context +meta: Python example code for the Context class from the django.template.base module of the Django project. + + +Context is a class within the django.template.base module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / templatetags / pipeline.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/templatetags/pipeline.py) + +```python +# pipeline.py +import logging +import subprocess + +from django.contrib.staticfiles.storage import staticfiles_storage + +from django import template +~~from django.template.base import Context, VariableDoesNotExist +from django.template.loader import render_to_string +from django.utils.safestring import mark_safe + +from ..collector import default_collector +from ..conf import settings +from ..exceptions import CompilerError +from ..packager import Packager, PackageNotFound +from ..utils import guess_type + +logger = logging.getLogger(__name__) + +register = template.Library() + + +class PipelineMixin(object): + request = None + _request_var = None + + @property + def request_var(self): + if not self._request_var: + self._request_var = template.Variable('request') + return self._request_var + + + +## ... source file continues with no further Context examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-filterexpression.markdown b/content/pages/examples/django/django-template-base-filterexpression.markdown new file mode 100644 index 000000000..aa466b309 --- /dev/null +++ b/content/pages/examples/django/django-template-base-filterexpression.markdown @@ -0,0 +1,98 @@ +title: django.template.base FilterExpression Example Code +category: page +slug: django-template-base-filterexpression-examples +sortorder: 500011364 +toc: False +sidebartitle: django.template.base FilterExpression +meta: Python example code for the FilterExpression class from the django.template.base module of the Django project. + + +FilterExpression is a class within the django.template.base module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / templatetags / sitetree.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/templatetags/sitetree.py) + +```python +# sitetree.py +from django import template +~~from django.template.base import FilterExpression +from django.template.loader import get_template + +from ..sitetreeapp import get_sitetree + +register = template.Library() + + +@register.tag +def sitetree_tree(parser, token): + tokens = token.split_contents() + use_template = detect_clause(parser, 'template', tokens) + tokens_num = len(tokens) + + if tokens_num in (3, 5): + tree_alias = parser.compile_filter(tokens[2]) + return sitetree_treeNode(tree_alias, use_template) + else: + raise template.TemplateSyntaxError( + '%r tag requires two arguments. E.g. {%% sitetree_tree from "mytree" %%}.' % tokens[0]) + + +@register.tag +def sitetree_children(parser, token): + tokens = token.split_contents() + + +## ... source file abbreviated to get to FilterExpression examples ... + + + + def get_value(self, context): + return get_sitetree().get_current_page_attr('description', self.item, context) + + +class sitetree_page_hintNode(SimpleNode): + + def get_value(self, context): + return get_sitetree().get_current_page_attr('hint', self.item, context) + + +def detect_clause(parser, clause_name, tokens): + if clause_name in tokens: + t_index = tokens.index(clause_name) + clause_value = parser.compile_filter(tokens[t_index + 1]) + del tokens[t_index:t_index + 2] + else: + clause_value = None + return clause_value + + +def render(context, tree_items, use_template): + context.push() + context['sitetree_items'] = tree_items + +~~ if isinstance(use_template, FilterExpression): + use_template = use_template.resolve(context) + + content = get_template(use_template).render(context.flatten()) + context.pop() + + return content + + + +## ... source file continues with no further FilterExpression examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-node.markdown b/content/pages/examples/django/django-template-base-node.markdown new file mode 100644 index 000000000..a7557b13a --- /dev/null +++ b/content/pages/examples/django/django-template-base-node.markdown @@ -0,0 +1,86 @@ +title: django.template.base Node Example Code +category: page +slug: django-template-base-node-examples +sortorder: 500011365 +toc: False +sidebartitle: django.template.base Node +meta: Python example code for the Node class from the django.template.base module of the Django project. + + +Node is a class within the django.template.base module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / templatetags / djng_tags.py**](https://github.com/jrief/django-angular/blob/master/djng/templatetags/djng_tags.py) + +```python +# djng_tags.py +import json + +from django.template import Library +~~from django.template.base import Node, NodeList, TextNode, VariableNode +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import get_language_from_request + +from djng.core.urlresolvers import get_all_remote_methods, get_current_remote_methods + + +register = Library() + + +@register.simple_tag(name='djng_all_rmi') +def djng_all_rmi(): + return mark_safe(json.dumps(get_all_remote_methods())) + + +@register.simple_tag(name='djng_current_rmi', takes_context=True) +def djng_current_rmi(context): + return mark_safe(json.dumps(get_current_remote_methods(context.get('view')))) + + +@register.simple_tag(name='load_djng_urls', takes_context=True) +def djng_urls(context, *namespaces): + raise DeprecationWarning( + "load_djng_urls templatetag is deprecated and has been removed from this version of django-angular." + "Please refer to documentation for updated way to manage django urls in angular.") + + +~~class AngularJsNode(Node): + def __init__(self, django_nodelist, angular_nodelist, variable): + self.django_nodelist = django_nodelist + self.angular_nodelist = angular_nodelist + self.variable = variable + + def render(self, context): + if self.variable.resolve(context): + return self.angular_nodelist.render(context) + return self.django_nodelist.render(context) + + +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + if len(bits) < 2: + bits.append('1') + values = [parser.compile_filter(bit) for bit in bits[1:]] + django_nodelist = parser.parse(('endangularjs',)) + angular_nodelist = NodeList() + for node in django_nodelist: + if isinstance(node, VariableNode): + tokens = node.filter_expression.token.split('.') + token = tokens[0] + for part in tokens[1:]: + + +## ... source file continues with no further Node examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-nodelist.markdown b/content/pages/examples/django/django-template-base-nodelist.markdown new file mode 100644 index 000000000..c178a8121 --- /dev/null +++ b/content/pages/examples/django/django-template-base-nodelist.markdown @@ -0,0 +1,103 @@ +title: django.template.base NodeList Example Code +category: page +slug: django-template-base-nodelist-examples +sortorder: 500011366 +toc: False +sidebartitle: django.template.base NodeList +meta: Python example code for the NodeList class from the django.template.base module of the Django project. + + +NodeList is a class within the django.template.base module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / templatetags / djng_tags.py**](https://github.com/jrief/django-angular/blob/master/djng/templatetags/djng_tags.py) + +```python +# djng_tags.py +import json + +from django.template import Library +~~from django.template.base import Node, NodeList, TextNode, VariableNode +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import get_language_from_request + +from djng.core.urlresolvers import get_all_remote_methods, get_current_remote_methods + + +register = Library() + + +@register.simple_tag(name='djng_all_rmi') +def djng_all_rmi(): + return mark_safe(json.dumps(get_all_remote_methods())) + + +@register.simple_tag(name='djng_current_rmi', takes_context=True) +def djng_current_rmi(context): + return mark_safe(json.dumps(get_current_remote_methods(context.get('view')))) + + +@register.simple_tag(name='load_djng_urls', takes_context=True) +def djng_urls(context, *namespaces): + raise DeprecationWarning( + "load_djng_urls templatetag is deprecated and has been removed from this version of django-angular." + "Please refer to documentation for updated way to manage django urls in angular.") + + +class AngularJsNode(Node): + def __init__(self, django_nodelist, angular_nodelist, variable): + self.django_nodelist = django_nodelist + self.angular_nodelist = angular_nodelist + self.variable = variable + + def render(self, context): + if self.variable.resolve(context): + return self.angular_nodelist.render(context) + return self.django_nodelist.render(context) + + +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + if len(bits) < 2: + bits.append('1') + values = [parser.compile_filter(bit) for bit in bits[1:]] + django_nodelist = parser.parse(('endangularjs',)) +~~ angular_nodelist = NodeList() + for node in django_nodelist: + if isinstance(node, VariableNode): + tokens = node.filter_expression.token.split('.') + token = tokens[0] + for part in tokens[1:]: + if part.isdigit(): + token += '[%s]' % part + else: + token += '.%s' % part + node = TextNode('{{ %s }}' % token) + angular_nodelist.append(node) + parser.delete_first_token() + return AngularJsNode(django_nodelist, angular_nodelist, values[0]) + + +@register.simple_tag(name='djng_locale_script', takes_context=True) +def djng_locale_script(context, default_language='en'): + language = get_language_from_request(context['request']) + if not language: + language = default_language + return format_html('angular-locale_{}.js', language.lower()) + + + +## ... source file continues with no further NodeList examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-parser.markdown b/content/pages/examples/django/django-template-base-parser.markdown new file mode 100644 index 000000000..a3e3fdbe2 --- /dev/null +++ b/content/pages/examples/django/django-template-base-parser.markdown @@ -0,0 +1,114 @@ +title: django.template.base Parser Example Code +category: page +slug: django-template-base-parser-examples +sortorder: 500011367 +toc: False +sidebartitle: django.template.base Parser +meta: Python example code for the Parser class from the django.template.base module of the Django project. + + +Parser is a class within the django.template.base module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / fields.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./fields.py) + +```python +# fields.py +from typing import Optional + +from django import template +~~from django.template.base import Parser, Token +from django.forms import ChoiceField +from django.utils.safestring import mark_safe + +from .compat import TOKEN_BLOCK +from .templatetags.sitetree import sitetree_tree +from .utils import get_tree_model, get_tree_item_model +from .settings import ITEMS_FIELD_ROOT_ID + +if False: # pragma: nocover + from .models import TreeItemBase, TreeBase # noqa + + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + +class TreeItemChoiceField(ChoiceField): + template: str = 'admin/sitetree/tree/tree_combo.html' + root_title: str = '---------' + + def __init__( + self, + tree: 'TreeBase' = None, + required: bool = True, + + +## ... source file abbreviated to get to Parser examples ... + + + super().__init__( + required=required, widget=widget, label=label, initial=initial, + help_text=help_text, *args, **kwargs) + + self.tree = None + self.choices_init(tree) + + def choices_init(self, tree: Optional['TreeBase']): + if not tree: + return + + if isinstance(tree, MODEL_TREE_CLASS): + tree = tree.alias + + self.tree = tree + self.choices = self._build_choices() + + def _build_choices(self): + tree_token = f'sitetree_tree from "{self.tree}" template "{self.template}"' + + context_kwargs = {'current_app': 'admin'} + context = template.Context(context_kwargs) + context.update({'request': object()}) + + choices_str = sitetree_tree( +~~ Parser(None), Token(token_type=TOKEN_BLOCK, contents=tree_token) + ).render(context) + + tree_choices = [(ITEMS_FIELD_ROOT_ID, self.root_title)] + + for line in choices_str.splitlines(): + if line.strip(): + splitted = line.split(':::') + tree_choices.append((splitted[0], mark_safe(splitted[1]))) + + return tree_choices + + def clean(self, value): + if not value: + return None + + try: + return MODEL_TREE_ITEM_CLASS.objects.get(pk=value) + + except MODEL_TREE_ITEM_CLASS.DoesNotExist: + return None + + + +## ... source file continues with no further Parser examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-template.markdown b/content/pages/examples/django/django-template-base-template.markdown new file mode 100644 index 000000000..70cb7dca7 --- /dev/null +++ b/content/pages/examples/django/django-template-base-template.markdown @@ -0,0 +1,131 @@ +title: django.template.base Template Example Code +category: page +slug: django-template-base-template-examples +sortorder: 500011368 +toc: False +sidebartitle: django.template.base Template +meta: Python example code for the Template class from the django.template.base module of the Django project. + + +Template is a class within the django.template.base module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / tests / test_static_placeholder.py**](https://github.com/divio/django-cms/blob/develop/cms/tests/test_static_placeholder.py) + +```python +# test_static_placeholder.py + +from django.contrib.admin.sites import site +from django.template import Context +~~from django.template.base import Template + +from six import text_type + +from cms.api import add_plugin +from cms.models import StaticPlaceholder, Placeholder, UserSettings +from cms.tests.test_plugins import PluginsTestBaseCase +from cms.utils.urlutils import admin_reverse + + +class StaticPlaceholderTestCase(PluginsTestBaseCase): + @property + def admin_class(self): + return site._registry[StaticPlaceholder] + + def fill_placeholder(self, placeholder=None): + if placeholder is None: + placeholder = Placeholder(slot=u"some_slot") + placeholder.save() # a good idea, if not strictly necessary + + + plugin_1 = add_plugin(placeholder, u"TextPlugin", u"en", + body=u"01", + ) + plugin_1.save() + + + plugin_2 = add_plugin(placeholder, u"TextPlugin", u"en", + body=u"02", + ) + plugin_1 = self.reload(plugin_1) + plugin_2.parent = plugin_1 + plugin_2.save() + return placeholder + + def get_admin(self): + usr = self._create_user("admin", True, True) + return usr + + def test_template_creation(self): + self.assertObjectDoesNotExist(StaticPlaceholder.objects.all(), code='foobar') + self.assertObjectDoesNotExist(Placeholder.objects.all(), slot='foobar') +~~ t = Template('{% load cms_tags %}{% static_placeholder "foobar" %}') + t.render(self.get_context('/')) + self.assertObjectExist(StaticPlaceholder.objects.all(), code='foobar', + creation_method=StaticPlaceholder.CREATION_BY_TEMPLATE) + self.assertEqual(Placeholder.objects.filter(slot='foobar').count(), 2) + + def test_empty(self): + self.assertObjectDoesNotExist(StaticPlaceholder.objects.all(), code='foobar') + self.assertObjectDoesNotExist(Placeholder.objects.all(), slot='foobar') +~~ t = Template('{% load cms_tags %}{% static_placeholder "foobar" or %}No Content{% endstatic_placeholder %}') + rendered = t.render(self.get_context('/')) + self.assertIn("No Content", rendered) + +~~ t = Template('{% load cms_tags %}{% static_placeholder "" %}') + rendered = t.render(self.get_context('/')) + self.assertEqual("", rendered) + +~~ t = Template('{% load cms_tags %}{% static_placeholder code or %}No Content{% endstatic_placeholder %}') + rendered = t.render(Context({'code': StaticPlaceholder.objects.all()[0]})) + self.assertIn("No Content", rendered) + + for p in Placeholder.objects.all(): + add_plugin(p, 'TextPlugin', 'en', body='test') +~~ t = Template('{% load cms_tags %}{% static_placeholder "foobar" or %}No Content{% endstatic_placeholder %}') + rendered = t.render(self.get_context('/')) + self.assertNotIn("No Content", rendered) + self.assertEqual(StaticPlaceholder.objects.filter(site_id__isnull=True, code='foobar').count(), 1) + + def test_local(self): + self.assertObjectDoesNotExist(StaticPlaceholder.objects.all(), code='foobar') + self.assertObjectDoesNotExist(Placeholder.objects.all(), slot='foobar') +~~ t = Template('{% load cms_tags %}{% static_placeholder "foobar" site or %}No Content{% endstatic_placeholder %}') + rendered = t.render(self.get_context('/')) + self.assertIn("No Content", rendered) + for p in Placeholder.objects.all(): + add_plugin(p, 'TextPlugin', 'en', body='test') + rendered = t.render(self.get_context('/')) + self.assertNotIn("No Content", rendered) + self.assertEqual(StaticPlaceholder.objects.filter(site_id__isnull=False, code='foobar').count(), 1) + + def test_publish_stack(self): + static_placeholder = StaticPlaceholder.objects.create(name='foo', code='bar', site_id=1) + self.fill_placeholder(static_placeholder.draft) + static_placeholder.dirty = True + static_placeholder.save() + self.assertEqual(static_placeholder.draft.cmsplugin_set.all().count(), 2) + self.assertEqual(static_placeholder.public.cmsplugin_set.all().count(), 0) + with self.login_user_context(self.get_superuser()): + response = self.client.post('%s?statics=%s' % (admin_reverse("cms_page_publish_page", args=[1, 'en']), static_placeholder.pk)) + self.assertEqual(response.status_code, 302) + + def test_permissions(self): + static_placeholder = StaticPlaceholder.objects.create(name='foo', code='bar', site_id=1) + request = self.get_request() + + request.user = self._create_user('user_a', is_staff=True, is_superuser=False, permissions=['change_staticplaceholder']) + + +## ... source file continues with no further Template examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-templatesyntaxerror.markdown b/content/pages/examples/django/django-template-base-templatesyntaxerror.markdown new file mode 100644 index 000000000..4dd549d7c --- /dev/null +++ b/content/pages/examples/django/django-template-base-templatesyntaxerror.markdown @@ -0,0 +1,241 @@ +title: django.template.base TemplateSyntaxError Example Code +category: page +slug: django-template-base-templatesyntaxerror-examples +sortorder: 500011369 +toc: False +sidebartitle: django.template.base TemplateSyntaxError +meta: Python example code for the TemplateSyntaxError class from the django.template.base module of the Django project. + + +TemplateSyntaxError is a class within the django.template.base module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / tests / test_templatetags.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/tests/test_templatetags.py) + +```python +# test_templatetags.py +import pytest +~~from django.template.base import TemplateSyntaxError +from django.utils.translation import activate, deactivate_all + +from sitetree.exceptions import SiteTreeError +from sitetree.settings import ALIAS_THIS_ANCESTOR_CHILDREN, ALIAS_THIS_CHILDREN, ALIAS_THIS_PARENT_SIBLINGS, \ + ALIAS_THIS_SIBLINGS, ALIAS_TRUNK + + +def test_items_hook(template_render_tag, template_context, common_tree): + + from sitetree.toolbox import register_items_hook + + with pytest.raises(SiteTreeError): + register_items_hook(lambda: []) + + def my_processor(tree_items, tree_sender): + for item in tree_items: + item.hint = f'hooked_hint_{item.title}' + return tree_items + + register_items_hook(my_processor) + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', template_context()) + + assert 'hooked_hint_Darwin' in result + assert 'hooked_hint_Australia' in result + + +## ... source file abbreviated to get to TemplateSyntaxError examples ... + + +def test_urlpattern_resolve(monkeypatch, template_render_tag, template_context, common_tree): + + monkeypatch.setattr('sitetree.sitetreeapp.UNRESOLVED_ITEM_MARKER', 'UNKNOWN') + + context = template_context() + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert '"/contacts/australia/australia_var/"' in result + assert 'href="UNKNOWN" >China' in result + + context = template_context({'australia_var': 33}) + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert 'href="/contacts/australia/33/"' in result + + context = template_context({'australia_var': 'пробапера'}) # non-ascii + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert '"/contacts/australia/%D0%BF%D1%80%D0%BE%D0%B1%D0%B0%D0%BF%D0%B5%D1%80%D0%B0/"' in result + + +def test_sitetree_tree(template_render_tag, template_context, common_tree): + + context = template_context() + +~~ with pytest.raises(TemplateSyntaxError): + template_render_tag('sitetree', 'sitetree_tree "mytree"', context) + + assert template_render_tag('sitetree', 'sitetree_tree from "notree"', context) == '\n' + + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert '"/articles/cats/ugly/"' in result + assert '"/contacts/russia/postal/"' not in result # insitetree False + assert '"/users/ordinary/"' in result + assert '"/users/hidden/"' not in result + + +def test_sitetree_children(template_render_tag, template_context, common_tree): + + context = template_context({ + 'parent_item': common_tree['/users/'] + }) + +~~ with pytest.raises(TemplateSyntaxError): + template_render_tag('sitetree', 'sitetree_children', context) + + result = template_render_tag( + 'sitetree', 'sitetree_children of parent_item for sitetree template "sitetree/tree.html"', context) + + assert '"/users/moderators/"' in result + assert '"/users/"' not in result + assert '"/users/hidden/"' not in result + + +def test_sitetree_breadcrumbs(template_render_tag, template_context, common_tree): + + result = template_render_tag('sitetree', 'sitetree_breadcrumbs from "notree"', template_context()) # non-existing tree + + assert result.strip() == '
      \n\t\n
    ' + +~~ with pytest.raises(TemplateSyntaxError): + template_render_tag('sitetree', 'sitetree_breadcrumbs') + + result = template_render_tag('sitetree', 'sitetree_breadcrumbs from "mytree"', template_context()) + + assert result.strip() == '
      \n\t\n
    ' + + context = template_context(request='/contacts/russia/web/private/') + result = template_render_tag('sitetree', 'sitetree_breadcrumbs from "mytree"', context) + + assert '"/contacts/russia/web/"' in result + assert '"/contacts/russia/"' in result + assert '"/contacts/"' not in result # inbreadcrumbs False + assert '"/home/"' in result + + +def check_page_attr_tag(realm, value, settings, monkeypatch, template_render_tag, template_context): + +~~ with pytest.raises(TemplateSyntaxError): # Invalid tag arguments. + template_render_tag('sitetree', f'sitetree_page_{realm}') + + context = template_context(request='/contacts/russia/') + result = template_render_tag('sitetree', f'sitetree_page_{realm} from "mytree"', context) + + assert result == value + + result = template_render_tag('sitetree', f'sitetree_page_{realm} from "mytree" as somevar', context) + + assert result == '' + assert context.get('somevar') == value + + settings.DEBUG = True + + with pytest.raises(SiteTreeError) as e: + template_render_tag('sitetree', f'sitetree_page_{realm} from "mytree"') + + assert 'django.core.context_processors.request' in f'{e.value}' + + context = template_context(request='/unknown_url/') + + with pytest.raises(SiteTreeError) as e: + template_render_tag('sitetree', f'sitetree_page_{realm} from "mytree"', context) + + assert 'Unable to resolve current sitetree item' in f'{e.value}' + + monkeypatch.setattr('sitetree.sitetreeapp.RAISE_ITEMS_ERRORS_ON_DEBUG', False) + result = template_render_tag('sitetree', f'sitetree_page_{realm} from "mytree"', context) + + assert result == '' + + +def test_sitetree_page_title(settings, monkeypatch, template_render_tag, template_context, common_tree): + check_page_attr_tag('title', 'Russia', settings, monkeypatch, template_render_tag, template_context) + + +def test_sitetree_page_hint(settings, monkeypatch, template_render_tag, template_context, common_tree): + check_page_attr_tag('hint', 'The place', settings, monkeypatch, template_render_tag, template_context) + + +def test_sitetree_page_description(settings, monkeypatch, template_render_tag, template_context, common_tree): + check_page_attr_tag( + 'description', 'Russian Federation', settings, monkeypatch, template_render_tag, template_context) + + +def test_sitetree_url(template_render_tag, template_context, common_tree): + +~~ with pytest.raises(TemplateSyntaxError): + template_render_tag('sitetree', 'sitetree_url') + + target_url = '/contacts/russia/' + + tree_item = common_tree[target_url] + context = template_context({'item_var': tree_item}) + + result = template_render_tag('sitetree', 'sitetree_url for item_var', context) + + assert result == target_url + + result = template_render_tag('sitetree', 'sitetree_url for item_var as somevar', context) + assert result == '' + assert context.get('somevar') == target_url + + +def test_sitetree_menu(template_render_tag, template_context, common_tree): + + result = template_render_tag( + 'sitetree', f'sitetree_menu from "notree" include "{ALIAS_TRUNK}"', template_context()) # non-existing tree + + assert result.strip() == '
      \n\t\n
    ' + +~~ with pytest.raises(TemplateSyntaxError): + template_render_tag('sitetree', 'sitetree_menu') + + item_ruweb = common_tree['/contacts/russia/web/'] + + context = template_context(request='/') + result = template_render_tag('sitetree', f'sitetree_menu from "mytree" include "{item_ruweb.alias}"', context) + + assert '"/contacts/russia/web/"' not in result + assert '"/contacts/russia/web/public/"' in result + assert '"/contacts/russia/web/private/"' in result + + result = template_render_tag('sitetree', f'sitetree_menu from "mytree" include "{item_ruweb.id}"', context) + + assert '"/contacts/russia/web/"' not in result + assert '"/contacts/russia/web/public/"' in result + assert '"/contacts/russia/web/private/"' in result + + context = template_context(request='/contacts/russia/web/') + result = template_render_tag('sitetree', f'sitetree_menu from "mytree" include "{ALIAS_TRUNK}"', context) + + assert '"/users/moderators/"' in result + assert '"/articles/cats/ugly/"' in result + assert '"/home/"' in result + assert '"/users/ordinary/"' in result + + +## ... source file continues with no further TemplateSyntaxError examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-textnode.markdown b/content/pages/examples/django/django-template-base-textnode.markdown new file mode 100644 index 000000000..e47a68846 --- /dev/null +++ b/content/pages/examples/django/django-template-base-textnode.markdown @@ -0,0 +1,101 @@ +title: django.template.base TextNode Example Code +category: page +slug: django-template-base-textnode-examples +sortorder: 500011370 +toc: False +sidebartitle: django.template.base TextNode +meta: Python example code for the TextNode class from the django.template.base module of the Django project. + + +TextNode is a class within the django.template.base module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / templatetags / djng_tags.py**](https://github.com/jrief/django-angular/blob/master/djng/templatetags/djng_tags.py) + +```python +# djng_tags.py +import json + +from django.template import Library +~~from django.template.base import Node, NodeList, TextNode, VariableNode +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import get_language_from_request + +from djng.core.urlresolvers import get_all_remote_methods, get_current_remote_methods + + +register = Library() + + +@register.simple_tag(name='djng_all_rmi') +def djng_all_rmi(): + return mark_safe(json.dumps(get_all_remote_methods())) + + +@register.simple_tag(name='djng_current_rmi', takes_context=True) +def djng_current_rmi(context): + return mark_safe(json.dumps(get_current_remote_methods(context.get('view')))) + + +@register.simple_tag(name='load_djng_urls', takes_context=True) +def djng_urls(context, *namespaces): + raise DeprecationWarning( + "load_djng_urls templatetag is deprecated and has been removed from this version of django-angular." + + +## ... source file abbreviated to get to TextNode examples ... + + + self.variable = variable + + def render(self, context): + if self.variable.resolve(context): + return self.angular_nodelist.render(context) + return self.django_nodelist.render(context) + + +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + if len(bits) < 2: + bits.append('1') + values = [parser.compile_filter(bit) for bit in bits[1:]] + django_nodelist = parser.parse(('endangularjs',)) + angular_nodelist = NodeList() + for node in django_nodelist: + if isinstance(node, VariableNode): + tokens = node.filter_expression.token.split('.') + token = tokens[0] + for part in tokens[1:]: + if part.isdigit(): + token += '[%s]' % part + else: + token += '.%s' % part +~~ node = TextNode('{{ %s }}' % token) + angular_nodelist.append(node) + parser.delete_first_token() + return AngularJsNode(django_nodelist, angular_nodelist, values[0]) + + +@register.simple_tag(name='djng_locale_script', takes_context=True) +def djng_locale_script(context, default_language='en'): + language = get_language_from_request(context['request']) + if not language: + language = default_language + return format_html('angular-locale_{}.js', language.lower()) + + + +## ... source file continues with no further TextNode examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-token-kwargs.markdown b/content/pages/examples/django/django-template-base-token-kwargs.markdown new file mode 100644 index 000000000..ecafe2225 --- /dev/null +++ b/content/pages/examples/django/django-template-base-token-kwargs.markdown @@ -0,0 +1,122 @@ +title: django.template.base token_kwargs Example Code +category: page +slug: django-template-base-token-kwargs-examples +sortorder: 500011375 +toc: False +sidebartitle: django.template.base token_kwargs +meta: Python example code for the token_kwargs callable from the django.template.base module of the Django project. + + +token_kwargs is a callable within the django.template.base module of the Django project. + + +## Example 1 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / templatetags / floppyforms.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/templatetags/floppyforms.py) + +```python +# floppyforms.py +from collections import defaultdict +from contextlib import contextmanager + +import django +from django.conf import settings +from django.template import (Library, Node, Variable, + TemplateSyntaxError, VariableDoesNotExist) +~~from django.template.base import token_kwargs +from django.utils.functional import empty + +from ..compat import get_template + + +from django.forms.utils import ErrorList + + +register = Library() + + +def is_formset(var): + significant_attributes = ('forms', 'management_form') + return all(hasattr(var, attr) for attr in significant_attributes) + + +def is_form(var): + significant_attributes = ('is_bound', 'data', 'fields') + return all(hasattr(var, attr) for attr in significant_attributes) + + +def is_bound_field(var): + significant_attributes = ('as_widget', 'as_hidden', 'is_hidden') + return all(hasattr(var, attr) for attr in significant_attributes) + + +## ... source file abbreviated to get to token_kwargs examples ... + + + + @classmethod + def parse_using(cls, tagname, parser, bits, options): + if bits: + if bits[0] == 'using': + bits.pop(0) + if len(bits): + if bits[0] in ('with', 'only'): + raise TemplateSyntaxError( + '%s: you must provide one template after ' + '"using" and before "with" or "only".' % + tagname) + options['using'] = Variable(bits.pop(0)) + else: + raise TemplateSyntaxError('%s: expected a template name ' + 'after "using".' % tagname) + elif not cls.optional_using_parameter: + raise TemplateSyntaxError('Unknown argument for %s tag: %r.' % + (tagname, bits[0])) + + @classmethod + def parse_with(cls, tagname, parser, bits, options): + if bits: + if bits[0] == 'with': + bits.pop(0) +~~ arguments = token_kwargs(bits, parser, support_legacy=False) + if not arguments: + raise TemplateSyntaxError('"with" in %s tag needs at ' + 'least one keyword argument.' % + tagname) + options['with'] = arguments + elif bits[0] not in ('only',) and not cls.optional_with_parameter: + raise TemplateSyntaxError('Unknown argument for %s tag: %r.' % + (tagname, bits[0])) + + if bits: + if cls.accept_only_parameter and bits[0] == 'only': + bits.pop(0) + options['only'] = True + + @classmethod + def parse_for(cls, tagname, parser, bits, options): + if bits: + if bits[0] == 'for': + bits.pop(0) + if len(bits): + options['for'] = Variable(bits.pop(0)) + else: + raise TemplateSyntaxError('%s: expected an argument ' + 'after "for".' % tagname) + + +## ... source file continues with no further token_kwargs examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-token.markdown b/content/pages/examples/django/django-template-base-token.markdown new file mode 100644 index 000000000..6c9da8eaa --- /dev/null +++ b/content/pages/examples/django/django-template-base-token.markdown @@ -0,0 +1,114 @@ +title: django.template.base Token Example Code +category: page +slug: django-template-base-token-examples +sortorder: 500011371 +toc: False +sidebartitle: django.template.base Token +meta: Python example code for the Token class from the django.template.base module of the Django project. + + +Token is a class within the django.template.base module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / fields.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./fields.py) + +```python +# fields.py +from typing import Optional + +from django import template +~~from django.template.base import Parser, Token +from django.forms import ChoiceField +from django.utils.safestring import mark_safe + +from .compat import TOKEN_BLOCK +from .templatetags.sitetree import sitetree_tree +from .utils import get_tree_model, get_tree_item_model +from .settings import ITEMS_FIELD_ROOT_ID + +if False: # pragma: nocover + from .models import TreeItemBase, TreeBase # noqa + + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + +class TreeItemChoiceField(ChoiceField): + template: str = 'admin/sitetree/tree/tree_combo.html' + root_title: str = '---------' + + def __init__( + self, + tree: 'TreeBase' = None, + required: bool = True, + + +## ... source file abbreviated to get to Token examples ... + + + super().__init__( + required=required, widget=widget, label=label, initial=initial, + help_text=help_text, *args, **kwargs) + + self.tree = None + self.choices_init(tree) + + def choices_init(self, tree: Optional['TreeBase']): + if not tree: + return + + if isinstance(tree, MODEL_TREE_CLASS): + tree = tree.alias + + self.tree = tree + self.choices = self._build_choices() + + def _build_choices(self): + tree_token = f'sitetree_tree from "{self.tree}" template "{self.template}"' + + context_kwargs = {'current_app': 'admin'} + context = template.Context(context_kwargs) + context.update({'request': object()}) + + choices_str = sitetree_tree( +~~ Parser(None), Token(token_type=TOKEN_BLOCK, contents=tree_token) + ).render(context) + + tree_choices = [(ITEMS_FIELD_ROOT_ID, self.root_title)] + + for line in choices_str.splitlines(): + if line.strip(): + splitted = line.split(':::') + tree_choices.append((splitted[0], mark_safe(splitted[1]))) + + return tree_choices + + def clean(self, value): + if not value: + return None + + try: + return MODEL_TREE_ITEM_CLASS.objects.get(pk=value) + + except MODEL_TREE_ITEM_CLASS.DoesNotExist: + return None + + + +## ... source file continues with no further Token examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-tokentype.markdown b/content/pages/examples/django/django-template-base-tokentype.markdown new file mode 100644 index 000000000..ff8af3738 --- /dev/null +++ b/content/pages/examples/django/django-template-base-tokentype.markdown @@ -0,0 +1,63 @@ +title: django.template.base TokenType Example Code +category: page +slug: django-template-base-tokentype-examples +sortorder: 500011372 +toc: False +sidebartitle: django.template.base TokenType +meta: Python example code for the TokenType class from the django.template.base module of the Django project. + + +TokenType is a class within the django.template.base module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / compat.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./compat.py) + +```python +# compat.py +from typing import Callable + +try: +~~ from django.template.base import TokenType +~~ TOKEN_BLOCK = TokenType.BLOCK +~~ TOKEN_TEXT = TokenType.TEXT +~~ TOKEN_VAR = TokenType.VAR +except ImportError: + from django.template.base import TOKEN_BLOCK, TOKEN_TEXT, TOKEN_VAR + + +class CommandOption: + + def __init__(self, *args, **kwargs): + self.args = args + self.kwargs = kwargs + + +def options_getter(command_options): + def get_options(option_func: Callable = None): + from optparse import make_option + + func = option_func or make_option + options = tuple([func(*option.args, **option.kwargs) for option in command_options]) + + return [] if option_func is None else options + + return get_options + + + +## ... source file continues with no further TokenType examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-variabledoesnotexist.markdown b/content/pages/examples/django/django-template-base-variabledoesnotexist.markdown new file mode 100644 index 000000000..cd6ea6d80 --- /dev/null +++ b/content/pages/examples/django/django-template-base-variabledoesnotexist.markdown @@ -0,0 +1,111 @@ +title: django.template.base VariableDoesNotExist Example Code +category: page +slug: django-template-base-variabledoesnotexist-examples +sortorder: 500011373 +toc: False +sidebartitle: django.template.base VariableDoesNotExist +meta: Python example code for the VariableDoesNotExist class from the django.template.base module of the Django project. + + +VariableDoesNotExist is a class within the django.template.base module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / templatetags / pipeline.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/templatetags/pipeline.py) + +```python +# pipeline.py +import logging +import subprocess + +from django.contrib.staticfiles.storage import staticfiles_storage + +from django import template +~~from django.template.base import Context, VariableDoesNotExist +from django.template.loader import render_to_string +from django.utils.safestring import mark_safe + +from ..collector import default_collector +from ..conf import settings +from ..exceptions import CompilerError +from ..packager import Packager, PackageNotFound +from ..utils import guess_type + +logger = logging.getLogger(__name__) + +register = template.Library() + + +class PipelineMixin(object): + request = None + _request_var = None + + @property + def request_var(self): + if not self._request_var: + self._request_var = template.Variable('request') + return self._request_var + + def package_for(self, package_name, package_type): + package = { + 'js': getattr(settings, 'JAVASCRIPT', {}).get(package_name, {}), + 'css': getattr(settings, 'STYLESHEETS', {}).get(package_name, {}), + }[package_type] + + if package: + package = {package_name: package} + + packager = { + 'js': Packager(css_packages={}, js_packages=package), + 'css': Packager(css_packages=package, js_packages={}), + }[package_type] + + return packager.package_for(package_type, package_name) + + def render(self, context): + try: + self.request = self.request_var.resolve(context) +~~ except VariableDoesNotExist: + pass + + def render_compressed(self, package, package_name, package_type): + if settings.PIPELINE_ENABLED: + return self.render_compressed_output(package, package_name, + package_type) + else: + return self.render_compressed_sources(package, package_name, + package_type) + + def render_compressed_output(self, package, package_name, package_type): + method = getattr(self, f'render_{package_type}') + + return method(package, package.output_filename) + + def render_compressed_sources(self, package, package_name, package_type): + if settings.PIPELINE_COLLECTOR_ENABLED: + default_collector.collect(self.request) + + packager = Packager() + method = getattr(self, f'render_individual_{package_type}') + + try: + paths = packager.compile(package.paths) + + +## ... source file continues with no further VariableDoesNotExist examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-variablenode.markdown b/content/pages/examples/django/django-template-base-variablenode.markdown new file mode 100644 index 000000000..8a0e361a0 --- /dev/null +++ b/content/pages/examples/django/django-template-base-variablenode.markdown @@ -0,0 +1,155 @@ +title: django.template.base VariableNode Example Code +category: page +slug: django-template-base-variablenode-examples +sortorder: 500011374 +toc: False +sidebartitle: django.template.base VariableNode +meta: Python example code for the VariableNode class from the django.template.base module of the Django project. + + +VariableNode is a class within the django.template.base module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / templatetags / djng_tags.py**](https://github.com/jrief/django-angular/blob/master/djng/templatetags/djng_tags.py) + +```python +# djng_tags.py +import json + +from django.template import Library +~~from django.template.base import Node, NodeList, TextNode, VariableNode +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import get_language_from_request + +from djng.core.urlresolvers import get_all_remote_methods, get_current_remote_methods + + +register = Library() + + +@register.simple_tag(name='djng_all_rmi') +def djng_all_rmi(): + return mark_safe(json.dumps(get_all_remote_methods())) + + +@register.simple_tag(name='djng_current_rmi', takes_context=True) +def djng_current_rmi(context): + return mark_safe(json.dumps(get_current_remote_methods(context.get('view')))) + + +@register.simple_tag(name='load_djng_urls', takes_context=True) +def djng_urls(context, *namespaces): + raise DeprecationWarning( + "load_djng_urls templatetag is deprecated and has been removed from this version of django-angular." + "Please refer to documentation for updated way to manage django urls in angular.") + + +class AngularJsNode(Node): + def __init__(self, django_nodelist, angular_nodelist, variable): + self.django_nodelist = django_nodelist + self.angular_nodelist = angular_nodelist + self.variable = variable + + def render(self, context): + if self.variable.resolve(context): + return self.angular_nodelist.render(context) + return self.django_nodelist.render(context) + + +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + if len(bits) < 2: + bits.append('1') + values = [parser.compile_filter(bit) for bit in bits[1:]] + django_nodelist = parser.parse(('endangularjs',)) + angular_nodelist = NodeList() + for node in django_nodelist: +~~ if isinstance(node, VariableNode): + tokens = node.filter_expression.token.split('.') + token = tokens[0] + for part in tokens[1:]: + if part.isdigit(): + token += '[%s]' % part + else: + token += '.%s' % part + node = TextNode('{{ %s }}' % token) + angular_nodelist.append(node) + parser.delete_first_token() + return AngularJsNode(django_nodelist, angular_nodelist, values[0]) + + +@register.simple_tag(name='djng_locale_script', takes_context=True) +def djng_locale_script(context, default_language='en'): + language = get_language_from_request(context['request']) + if not language: + language = default_language + return format_html('angular-locale_{}.js', language.lower()) + + + +## ... source file continues with no further VariableNode examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / placeholder.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/placeholder.py) + +```python +# placeholder.py +import operator +import warnings +from collections import OrderedDict + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db.models.query_utils import Q +from django.template import TemplateSyntaxError, NodeList, Variable, Context, Template, engines +~~from django.template.base import VariableNode +from django.template.loader import get_template +from django.template.loader_tags import BlockNode, ExtendsNode, IncludeNode + +from six import string_types + +from sekizai.helpers import get_varname + +from cms.exceptions import DuplicatePlaceholderWarning +from cms.utils.conf import get_cms_setting + + +def _get_nodelist(tpl): + if hasattr(tpl, 'template'): + return tpl.template.nodelist + else: + return tpl.nodelist + + +def get_context(): + if engines is not None: + context = Context() + context.template = Template('') + return context + else: + + +## ... source file continues with no further VariableNode examples... + +``` + diff --git a/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html b/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html index 80bb0c4a2..831ec665a 100644 --- a/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html +++ b/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html @@ -1,3 +1,4 @@ + Learning Programming Web development Django diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 59d77eb82..7b6c539bf 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -183,6 +183,21 @@

    django.shortcuts render, resolve_url

    +

    django.template.base + Context, + FilterExpression, + Node, + NodeList, + Parser, + Template, + TemplateSyntaxError, + TextNode, + Token, + TokenType, + VariableDoesNotExist, + VariableNode, + token_kwargs +

    django.template.response SimpleTemplateResponse, TemplateResponse From 3c67d084be202a9461ad3fd0cba83255b68fa49c Mon Sep 17 00:00:00 2001 From: Samuel Huang Date: Sun, 12 Jul 2020 18:27:43 -0700 Subject: [PATCH 190/302] Add Chowist to Django example projects --- content/pages/04-web-development/02-django.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index 06ee0deee..79add9f0e 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -364,6 +364,10 @@ real-world example applications, and many more can be found on the * [Taiga](https://github.com/taigaio/taiga-back) is a project management tool built with Django as the backend and AngularJS as the front end. +* [Chowist](https://github.com/huangsam/chowist) is a web application + that replicates core features of Yelp and adds a couple more bells + and whistles. + ## Open source code to learn Django There are many open source projects that rely on Django. From 042bc4ce0ba522e82fd7df1edcba669c6baec458 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 18 Jul 2020 14:39:22 -0400 Subject: [PATCH 191/302] update makefile to combine sed's --- Makefile | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/Makefile b/Makefile index 930fc187a..a7371bed8 100644 --- a/Makefile +++ b/Makefile @@ -12,31 +12,7 @@ run: prod: run rm -rf generated/updated_site/pages/ - sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_.~*=&;/-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[0-9]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /\\\()_,.&$^;:+#{}|=~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/<\/span>//g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/<\/span>//g' generated/updated_site/*.html generated/updated_site/blog/*.html + sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_.~*=&;/-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g; s/\(.[0-9]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /\\\()_,.&$^;:+#{}|=~*@`!?%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g; s/<\/span>//g; s/<\/span>//g' generated/updated_site/*.html generated/updated_site/blog/*.html bookbuild: From 71829a2f3b2852ff3c333bf7881545bbc6e4581c Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 19 Jul 2020 13:10:35 -0400 Subject: [PATCH 192/302] add new post on django-user-visit --- ...daily-user-data-django-user-visit.markdown | 389 ++++++++++++++++++ .../django-admin-dashboard.png | Bin 0 -> 198073 bytes .../django-admin-django-user-visit.png | Bin 0 -> 268931 bytes .../django-admin-login.png | Bin 0 -> 117029 bytes .../django-success.png | Bin 0 -> 101527 bytes .../django-user-visit-details.png | Bin 0 -> 286730 bytes .../user-visit-record.png | Bin 0 -> 189507 bytes ...ack-daily-user-data-django-user-visit.html | 4 + 8 files changed, 393 insertions(+) create mode 100644 content/posts/200719-track-daily-user-data-django-user-visit.markdown create mode 100644 static/img/200719-django-user-visit/django-admin-dashboard.png create mode 100644 static/img/200719-django-user-visit/django-admin-django-user-visit.png create mode 100644 static/img/200719-django-user-visit/django-admin-login.png create mode 100644 static/img/200719-django-user-visit/django-success.png create mode 100644 static/img/200719-django-user-visit/django-user-visit-details.png create mode 100644 static/img/200719-django-user-visit/user-visit-record.png create mode 100644 theme/templates/blog/track-daily-user-data-django-user-visit.html diff --git a/content/posts/200719-track-daily-user-data-django-user-visit.markdown b/content/posts/200719-track-daily-user-data-django-user-visit.markdown new file mode 100644 index 000000000..c08b23529 --- /dev/null +++ b/content/posts/200719-track-daily-user-data-django-user-visit.markdown @@ -0,0 +1,389 @@ +title: Tracking Daily User Data in Django with django-user-visit +slug: track-daily-user-data-django-user-visit +meta: Learn how to easily track daily user visits and related data in Django projects with django-user-visit. +category: post +date: 2020-07-19 +modified: 2020-07-19 +newsletter: False +headerimage: /img/headers/django.jpg +headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. + + +It can be tedious to figure out what data to track, create data models +and build [middleware](https://docs.djangoproject.com/en/stable/topics/http/middleware/) for your [Django](/django.html) project if you just want to +collect some basic information about clients that connect to your web application +. Fortunately, the library [django-user-visit](https://github.com/yunojuno/django-user-visit) +is a handy Django project that quickly handles all +of this complexity for you. In this tutorial, we'll learn +how to use django-user-visit in a new Django project +to add daily visit data tracking to Django projects. + +When we're done, we can view information like the following in the Django Admin: + +Django Admin with django-user-visit information + + + +## Project Requirements +Ensure you have Python 3 installed, because Python 2 reached its +end-of-life at the beginning of 2020 and is no longer supported. +Preferrably, you should have +[Python 3.7 or greater installed](https://www.python.org/downloads/) +in your [development environment](/development-environments.html). +This tutorial will also use: + +We will use the following dependencies to complete this +tutorial: + +* [Django](/django.html) [web framework](/web-frameworks.html), + [version 3.0.8](https://www.djangoproject.com/download/) +* [django-user-visit](https://github.com/yunojuno/django-user-visit), + [version 0.4](https://pypi.org/project/django-user-visit/) + +All code in this blog post is available open source under the MIT license +on GitHub under the +[track-daily-user-data-django-user-visit directory of the blog-code-examples repository](https://github.com/fullstackpython/blog-code-examples). +Use the source code as you desire for your own projects. + + +## Development environment set up +Change into the directory where you keep your Python +[virtual environments](/virtual-environments-virtualenvs-venvs.html). +Create a new virtualenv for this project using the following +command. + +Start the Django project by creating a new +[virtual environment](/virtual-environments-virtualenvs-venvs.html) +using the following command. I recommend using a separate directory +such as `~/venvs/` (the tilde is a shortcut for your user's `home` +directory) so that you always know where all your virtualenvs are +located. + +```bash +python3 -m venv ~/venvs/djuservisit +``` + +Activate the virtualenv with the `activate` shell script: + +```bash +source ~/venvs/djuservisit/bin/activate +``` + +After the above command is executed, the command prompt will +change so that the name of the virtualenv is prepended to the +original command prompt format, so if your prompt is simply +`$`, it will now look like the following: + +```bash +(djuservisit) $ +``` + +Remember, you have to activate your virtualenv in every new terminal +window where you want to use dependencies in the virtualenv. + +We can now install the [Django](https://pypi.org/project/Django/) +package into the activated but otherwise empty virtualenv. + +``` +pip install django==3.0.8 django-user-visit==0.4 +``` + +Look for output similar to the following to confirm the appropriate +packages were installed correctly from PyPI. + +``` +(djuservisit) $ pip install django==3.0.8 django-user-visit==0.4 +Collecting django==3.0.8 + Using cached https://files.pythonhosted.org/packages/ca/ab/5e004afa025a6fb640c6e983d4983e6507421ff01be224da79ab7de7a21f/Django-3.0.8-py3-none-any.whl +Collecting django-user-visit==0.4 + Downloading https://files.pythonhosted.org/packages/23/ef/d3ec22c3a897192e267389d6ee59ce1858f5ede262b078f93211aff110e7/django_user_visit-0.4-py3-none-any.whl +Collecting sqlparse>=0.2.2 (from django==3.0.8) + Using cached https://files.pythonhosted.org/packages/85/ee/6e821932f413a5c4b76be9c5936e313e4fc626b33f16e027866e1d60f588/sqlparse-0.3.1-py2.py3-none-any.whl +Collecting asgiref~=3.2 (from django==3.0.8) + Using cached https://files.pythonhosted.org/packages/d5/eb/64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6/asgiref-3.2.10-py3-none-any.whl +Collecting pytz (from django==3.0.8) + Using cached https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl +Collecting user-agents<3.0,>=2.1 (from django-user-visit==0.4) + Using cached https://files.pythonhosted.org/packages/1b/be/82e4d20a7716d8e5de98b948edcecff9bb237e6718c3831bd92794fe9821/user-agents-2.1.tar.gz +Collecting ua-parser>=0.9.0 (from user-agents<3.0,>=2.1->django-user-visit==0.4) + Using cached https://files.pythonhosted.org/packages/9d/22/4d16b08db329fd440eed366d35e4dd7195c9babb4ecac5218f28081522a2/ua_parser-0.10.0-py2.py3-none-any.whl +Installing collected packages: sqlparse, asgiref, pytz, django, ua-parser, user-agents, django-user-visit + Running setup.py install for user-agents ... done +Successfully installed asgiref-3.2.10 django-3.0.8 django-user-visit-0.4 pytz-2020.1 sqlparse-0.3.1 ua-parser-0.10.0 user-agents-2.1 + +``` + +Our dependencies are installed so we can now create our +project and start coding. + + +## Creating the application +We have everything we need to start building our application. + +We can use the [Django](/django.html) `django-admin` tool to create +the boilerplate code structure to get our project started. +Change into the directory where you develop your applications. For +example, I typically use `/Users/matt/devel/py/` for all of my +Python projects. Then run the following command to start a Django +project named `djuservisit`: + +``` +django-admin.py startproject djuservisit +``` + +Note that in this tutorial we are using the same name for both the +virtualenv and the Django project directory, but they can be +different names if you prefer that for organizing your own projects. + +The `django-admin` command creates a directory named `djuservisit` +along with several subdirectories that you should be familiar with +if you have previously worked with Django. + +Change directories into the new project. + +``` +cd djuservisit +``` + +Open `djuservisit/djuservisit/settings.py`. Add the `user_visits` +app and its middleware to `settings.py` by inserting the two +highlighted lines: + +```python +# djuservisit/djuservisit/settings.py +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +~~ 'user_visit', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +~~ 'user_visit.middleware.UserVisitMiddleware', +] +``` + +Make sure you change the default `DEBUG` and `SECRET_KEY` +values in `settings.py` before you deploy any code to production. Secure +your app properly with the information from the Django +[production deployment checklist](https://docs.djangoproject.com/en/stable/howto/deployment/checklist/) +so that you do not add your project to the list of hacked applications +on the web. + +Save and close `settings.py`. + +Create a [Django superuser](https://docs.djangoproject.com/en/stable/ref/django-admin/) +so you can access the Django Admin. Go to the base directory of this project +and use the `manage.py` file with the following command: + +``` +python manage.py createsuperuser +``` + +Follow the prompts and enter values for the username, email address and +password that you want your local Django superuser to have. Next, we'll +test out how this library works when a user visits a page created by +our Django web app. + + +## Testing django-user-visit +Let's test out our bare-bones application. Execute the development server +with the following command: + +```bash +python manage.py runserver +``` + +The Django development server should start up with no issues. + +``` +Watching for file changes with StatReloader +Performing system checks... + +System check identified no issues (0 silenced). +July 19, 2020 - 13:01:41 +Django version 3.0.8, using settings 'djuservisit.settings' +Starting development server at http://127.0.0.1:8000/ +Quit the server with CONTROL-C. +``` + +Open a web browser and go to "http://localhost:8000". + +Default Django page. + +That's the default page provided by Django in the absence of any other URLs +to serve at the root URL, but it works for our purposes. + +Go to the Django Admin by changing the URL in your browser to +"http://localhost:8000/admin". The Django Admin login page will appear. + +Django admin default login screen. + +Enter the username and password of the superuser you just created with +the `manage.py` command to log in. Next, you will see the Django admin +dashboard. + +Django admin dashboard. + +The "User visit log" has already been added to the Admin. Click on +the "User visits" link. + +django-user-visit list in the Django admin dashboard. + +The list of all users that have visited by day will show up. + +django-user-visit details page in the Django admin. + +Click on any of the visits to see more detailed data about the record, +just like you would with any Django Admin extension. + +That library was pretty easy to install for the information that it +aggregates for you. Next, let's take a closer look at the +[Django ORM](/django-orm.html) model that powers this library. + + +## Inspecting the django-user-visit model +We confirmed that django-user-visit is properly installed. Let's take a closer +look at the model the library provides to store the user data. + +Take a look at the source code for +[django-user-visit/user_visit/models.py](https://github.com/yunojuno/django-user-visit/blob/master/user_visit/models.py) +on GitHub. Below is an excerpt with the relevant lines of that source file. +I've highlighted a few lines that will be discussed below the code excerpt. + +```python +## ... source code abbreviated ... + +class UserVisit(models.Model): + """ + Record of a user visiting the site on a given day. + This is used for tracking and reporting - knowing the volume of visitors + to the site, and being able to report on someone's interaction with the site. + We record minimal info required to identify user sessions, plus changes in + IP and device. This is useful in identifying suspicious activity (multiple + logins from different locations). + Also helpful in identifying support issues (as getting useful browser data + out of users can be very difficult over live chat). + """ + +~~ user = models.ForeignKey( +~~ settings.AUTH_USER_MODEL, related_name="user_visits", on_delete=models.CASCADE +~~ ) + timestamp = models.DateTimeField( + help_text="The time at which the first visit of the day was recorded", + default=timezone.now, + ) + session_key = models.CharField(help_text="Django session identifier", max_length=40) + remote_addr = models.CharField( + help_text=( + "Client IP address (from X-Forwarded-For HTTP header, " + "or REMOTE_ADDR request property)" + ), + max_length=100, + blank=True, + ) +~~ ua_string = models.TextField( +~~ "User agent (raw)", help_text="Client User-Agent HTTP header", blank=True, +~~ ) + uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) + hash = models.CharField( + max_length=32, + help_text="MD5 hash generated from request properties", + unique=True, + ) + created_at = models.DateTimeField( + help_text="The time at which the database record was created (!=timestamp)", + auto_now_add=True, + ) + + objects = UserVisitManager() + + class Meta: + get_latest_by = "timestamp" + + def __str__(self) -> str: + return f"{self.user} visited the site on {self.timestamp}" + + def __repr__(self) -> str: + return f"" + + def save(self, *args: Any, **kwargs: Any) -> None: + """Set hash property and save object.""" +~~ self.hash = self.md5().hexdigest() + super().save(*args, **kwargs) + + @property + def user_agent(self) -> user_agents.parsers.UserAgent: + """Return UserAgent object from the raw user_agent string.""" + return user_agents.parsers.parse(self.ua_string) + + @property + def date(self) -> datetime.date: + """Extract the date of the visit from the timestamp.""" + return self.timestamp.date() + + # see https://github.com/python/typeshed/issues/2928 re. return type + def md5(self) -> hashlib._Hash: + """Generate MD5 hash used to identify duplicate visits.""" +~~ h = hashlib.md5(str(self.user.id).encode()) # noqa: S303 + h.update(self.date.isoformat().encode()) + h.update(self.session_key.encode()) + h.update(self.remote_addr.encode()) + h.update(self.ua_string.encode()) + return h + +``` + +A few things to note based on the highlighted above: + +* The `UserVisit` model matches up with the + [Django user model](https://docs.djangoproject.com/en/stable/ref/contrib/auth/) + using the `user = models.ForeignKey...` line +* The code uses the `save` function to ensure the some of the fields + are automatically populated, such as the `hash` property using the + `hashlib` module +* This library has a dependency on the + [user_agents library](https://pypi.org/project/user-agents/) to parse the + [User-Agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent) + of the browser the client is using + +Reading the source code for libraries like django-user-visit is helpful +not only to know what it is doing under the covers, but also to learn new +ways to code your own applications. + +Take a look at the [Django code examples](/django-code-examples.html) and +[Django extensions](/django-extensions-plug-ins-related-libraries.html) pages +to see more projects with good Python example code that you can learn from. + + +## Additional resources +We just finished building an app that tracks daily user visits with the +django-user-visit library. + +Next, try out some of these other related [Django](/django.html) tutorials: + +* [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html) +* [How to Add Maps to Django Web App Projects with Mapbox](/blog/maps-django-web-applications-projects-mapbox.html) +* [Monitoring Django Projects with Rollbar](/blog/monitor-django-projects-web-apps-rollbar.html) + +Questions? Let me know via +[a GitHub issue ticket on the Full Stack Python repository](https://github.com/mattmakai/fullstackpython.com/issues), +on Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). +If you see an issue or error in this tutorial, please +[fork the source repository on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200719-track-daily-user-data-django-user-visit.markdown) +and submit a pull request with the fix. + diff --git a/static/img/200719-django-user-visit/django-admin-dashboard.png b/static/img/200719-django-user-visit/django-admin-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..e958c6ead6e7047c8004dd4a30e436ce337147ab GIT binary patch literal 198073 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

    %i14ebrZhP$4FWRSNkSjgU^dN^ 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 aHNNoCa>!Z*JZ2N;b6(&0Eb_Et)PDibF$y~X literal 0 HcmV?d00001 diff --git a/static/img/200719-django-user-visit/django-admin-django-user-visit.png b/static/img/200719-django-user-visit/django-admin-django-user-visit.png new file mode 100644 index 0000000000000000000000000000000000000000..3c92961a9b167af72777a8efe6bde0ea8cfeaee3 GIT binary patch literal 268931 zcmb5V1#lcqk~Ta7iy17im@OuYM=V*)%xE!77Be$iWHB>Z%s66ZW@cvndUyBkHZJaa zWB-omsqCtJGON0(yEC(LLgi$>Bf{ar0RR9*aWP>9004R#003`*f%>Rn>$l+p01))e zgoNb8g@lOY>}`ISSsDWXVxhlOq16-zKWAtvh@1M#$Kvu!z|i^mCe5`N= zEFnGlu1u4-o<9=F(x92N=nj;`!5HLOoU_GH6SFq87&0*kxqWJPw4#1k)9J3As~WH8 zj7V>pK2(N_w1U0Oi){5`gcJkxW(39U5qg(UzEIht=ghDrJH;k{VbLR1?JwPG2u!An z6AdVOtiGXjb!qL_Nvy;kz@kBwbYa5Pk|&ahP@0Ec{;TdbnIe;JU(i+;5NrKm-9XDAV;CJT;)+V$_N})dtQ&Gv%fkpvE6v=CM?(cA zsVEA4d|)#=OcCUd3`N+0a!7F7Td^{lwso#P2-yt2Th7zMC)$r=*Dk5N(UF0>@ zt?%Srg=mCD*Rih>3XXi-2KH9FO9pgDep8_LEq zKlB+Dx*nLN59!DNz6*pm3PN`$6$(6>0Ch6pm^SEG9jU+vM~|Kg%vcXc4ROv_S`U5! z%nQt20LTFo<%hmO+X$%e(X@Sa^fAf$(hAlF;}?U%)y*%3BH4>%C$NIbh87Y)JSoN# z7iL7X7=j^B!V=>uhEoHs9&9OE5~~{vF(ALgIu*3Se@2`>Ah`n(md!c?`1bvDa+B)I zZkD_$2^YbrC}pn5frlfkhObI?%LLaAmD}ewzxv$q2?7K?4Q%wwD%=UmfL+u6kv=A2C&u4J+wqzLr@E3y*v>r_DNbA1yn{*H4F9d6m z-V_tCKOnLE2z|d}OAb&-5htJw!7jr*!-6)gkBC}{(L$wiASR*D`jrfj?6~Zh>>%ve zt3ww=J@`+EW5p=QuoM7a6MHE!V0gOl8QL?5BpH0a%3hhEG%(=-ETPIt?3%Xa%K zF)^_&v2qTZE_4pB9IhOwQTXS~tgY~HI?YT=gG*XmQ*c?vB4;(LEob`h?nciIx6P+L zKu4NSv_sOnaCCy8V08Mk`S@JLOvQA2(W_Q)j$vWXWJ;D|o?=C zez=Teka1Riul=uG)Zs!}q0hm;KqY#0Rn6riWhCVZD!eKZ#4c(`s3_$hh%jMPFX7_VzUA%p7(9dqqlt}$ZJi#QvxWUU& zjvyk?V3cxHQhJDtWuaCfq6}7=ya|IzwL|{3E7nZkvdC6VSH2aMe$lzy;Y3OHyp~x7 z-n`&E?!0?Xa!*b$CUPm^ok!#8#h=aL;7q)?#nEB9ajVkha?~eM(MT$SNsg`jmfDui zwyD<|=vC4c!}{<3Ab43U+1P#2@nao?%1IqQmv8Q#S9h0*?(=TWPYX{*4`ugF{cL)m zYOGq>M>G#150htt8_)CoQ`L=z`Ewg@)pxD;^fy^it_Y0C6|O4*A145xo&&!-5e*~h zMPcV1Q7Ms^obtr0-funqi~0=^9;FPD3D&-Ah-L_nk@tXR1)(!V!&eOWNEkXqE5vDJ zNjOccpX@7KJlw4mt=!!-25!QNWW>zW_O3hMGB{;BOZS|juW-IOC`n?_Q4^bM&%B!M zo4Pt~n>yYUP11Z{kE#xj?Vkbpsp*^yEpXc**~M>r5eng6w&)%ti+PnAo^#mTgkLMBTpg!5!m@@srQC zpDZB91G>7EyJh5kOal+>RQTt@$|x7X7HMj^`vkV^?UDj$)G1wK(Nk)_?ps+~p53jq zw;npONUj_b=Sj$bmOuR&9PHtHBGrF0(7-C4#6F=)-n?gS95jeo`e z1)p#a2LVq5zb-AFQDalGrgS*tFr8LNmwMMo)q1dh_~6)evxlR?vNzVq9?#-%O>3mG zSGKpvR=YobmWuh^mKYrLzYADrN1;Q=DI`*f~?}Ti0 zy;u^T>*=r5{`{QWSI|F9VQ#3os)-K&6h8jKu>}evd`>i?Gt)k5bKGX$Vm_=X9rjN= zSIch5G41pJm8&{eZct9Ged~7HJ6kvm9A+=iu8^-Vs|=|yRkLXMxwsU4+}!7ZT;0!W>%FrYpkB27__QvI zS6ef?xy?22UHj7diI-+aW_8COq~hNy^V$p*Ha22brreB2{0_O^+i&Z^ukEi{vt2_% zLBWXx1q2!1jpt&Mu^ANViu02vxyY%MZ0lTXcMH3TOmyX-+^9@0RIjZC@v%YDLU0*; zo>S+iPMo`xr`k1><1yFt<@exu!e`Ak&Ev7>G@Hf^_v~sbqvg$T0jy{pxHiWv=JTsX z8Yb1H3JUEuFS=KaXQ$0uO7<)3)<$)g+WWb*<$&dUXUFq|^=~bjw}sQ0Ez51o$gA*e z&SzfTubRk^$QeK-o|grtchpz;N5f&ztn5lA-U-5a>xJXWbd*VrNt-sg_u*^ZThsRS z`Ww>Qv)28>Srpb4mL~&N2eWJ4Yu*0wUPfa^i_O*gO*@^Z$(1$8{q8xQP=S}{Ed46> zrg|%Wy0Cv-KGWuY_x^V9!QSg#9^j8SIt0G4`x9_b3}B@1yzb$+O|R5Nxdqk{`o0Iu z-gkRlLS=paS+dR50P6#+S{(OX=>il*9ffuQZZEJcapjF%8%vu^FZzXC=I8H+@Bj*= zfXp3F&$cg5PrO~+)ITA73I>l_3M4`bKC5A?rE@GS8E;((scg7_~Qyx}ia&tAINj{??KOx*zh zfJgu91Oud|VSl(sjb=(}j%w0UT!uDQ^!i3N2FCO*RSAEcGBqdt*~m8G=< zmkW^O9~@jC^k3BsBt-vUakK!Es7cEa3E9{i6Mds+rDr7Jg(D&&;;}dS!KEN9`Y-s$ z6_CW#(b1NRfx+3?nckU&-p1a9fr*oolYx<$fti`^gM-e&)!I?th0fZ6^q)fhOOCLy zgQ2~dt)rQZHPK&k^$l#C9DyVxe<}L!H2d*CnyelEHLQ;TGW^xTz(mi;@PEOK zUCjO;u)kXV3H!&m{;7`VFJW8?#tt@?PJi`E+1kvJmzn1uI{tU{|8(-7C|P?mKLvd?IWBU*AzqI{V2mjw3 z|0e6NadXL;xfolj3!7OPTmMr((>G2YhX1qa|Aeaj50r(4h2!6$|JL*`C=bJ5bNg>| z{m+H;kJ^uw#0$s6@ZYPF7fyUqxeox~2Z##`D7k>0q(gfo?#{l;-jTt>7y-l=h)>8R zAw_63D9be(=HyMvf0mS&|1{NHzF#-@eBQELb-1Me;pge7et7; zgv1!n-xSZ-Z?C*;>wopASm)foN@dg+Y*S+f7wv?>1|!vjjPOBa{0}a0VO-c>esui* zf&4?VMCUvQwr>GsYisLG`I8%^sX*Jt>=qVlpON>M|3v*p0-7xu{`dLp_FVfheb4;_ zl@U00@IqKH^l91ns2gDx$Jjn_O+`hzy1F_AO;u7SCnp76-TlxLI^_RwaL8yEXfOMx z6@QNR?h7=+zggACQMf`?)jRO zI~a@Hf&Y{pdRRCMW36dOm7}Vn-1!9`p02-5gUQvkfsUo+KUGSGW}8l$PGVtRf)dy$ z(RTxQ=l67qz5|B-s>zWd1$P|DhqhLHOxr$kB-ErR$P|TWqLVHzqg5qdO@WXu8U;1mVkLeRGErP4I9VPOiz{f`G{IZJCir(XZr^!ZjogQ>oMt)z~DR`&s|U-(XWi z4F|uqAlRo3R`hP6pU6mfXliimXYP8R7zKJ{@>@b}ISfA8l0Bp%%e6AA~5W@97g zo28?zOn!?pUP^=HCzs$D7Lt@RMN6*x{wwRkirn7({5m;#EDHE5-OZe-zTMH8(0Y8gXtmP@?(-Y6V4-%%xelZ$8Om@Yw@Jx zsvtTVxx0A&;JIC{+QP!3!(JNH<~uhxFK#E3n0GFfq<|r9bA90hIK-S*S1@Q6Gf+x^ zbbl5wDf>0Fg!{FuEWt08`fF)<{K}T#;2>I$?xcVYA%Ek~UgOxW$ZT1>_XfG$HI(j#wz5V?{_&RRR1-ztE%Ht89 zQriMBEJ^lv^sMJ0kbtkiP<2_W)X+Mtf%C1O)|^pNlFgxbz7qx54LXD=Jim!X(LASKz1d>V8IbcsO>OY>8d1gc!xbDOKmd-*)FkU^Nel znN#;SSsDtxfR5LdzIgMBX1#WS8?>Y`wD{3ZTv8HcY;5dMaL0FHQU3Ke^R`r_X$bEr zqg)y4ntRF1?6$4bb4s9)5E&ZZrhXSQJ+aOcRImh!3sY|kR*7)I%>qM7MJ$O+(Rnu$ zxcWqRt$nkE=+AmGr}F8y&kRG8_{&gHG^)9IcS{64@db>_M7I!I5@a&oE1zo zz;QrS8bJDsZBBbVH1V_2Y$X17Fd!+Z5D5uMp2I#p8a6gSpjoP>rY1q(!^11~1ftGmHDiOZ$DD^cZ zo<2Gud_Mzz#FzM^4{1n)qGO`@9>wm7R$ou*6Nc{OXyA~{lZ0JXa@6^b?4!`X;!Arf z32o?jeG5=E$BH_eVUlTH@uc%*Tp48-Zhj6F!|ZjW#!hf}#KCb9crRio$KX^W0spKs znVz=>ohhi1&9f`f;nc_m83c{G2G&@s;%G7digNBkZTH?#R3tVAyw^(Mu*>=Jyl9d+ zm?ILN)fUJO)0aVgUi!EZa**b)5a%vu?&(j)#>3w&Bt%X|CAZZqDxpxw2wMuqejx01 zJ2B;vefVgI04C;`UYVf$EXn9tJd~z&h^fPnc}^GeVC_#v+bB8|&eAu}fU&~eUzxdG z{wJZIBD(~LiG_81o{`#OmGL#LvrJeI@UL z<<;T!n&*Ch7MGez9gKv}MQ*@H$!~34;dneJZQcI(<8Za5!SQrS+0WlU5Z~=$LqJ?o zGXC*;pB?5+9wxpM_ImHPO^MHxj{QzoU+kRZOIv=ZCmz7}S?*3?aAbkO`=RID_~Bv` zjc{FPxu>hi`CMm)Pg%$F6f=d-COZNbsD%io!6L?)F+?+D{MsyC^%E5*m01{Tac-tA z-->I_=}FG7;kCK$OTI;e3>sll(WzRsN8K8;<->+y$QWp-`t&?F$Y8SHPsuNM=Mp=H zDN>kY4j%scg3+FU2hSlkR{Ib5_or+fM3SN5;ryaTenKsbU9P~O?Q9&{I_xjj_QNBi z!(HH~0qEIGB1XaqbNgZ$YLt`CtUOdy1AQhagVoqj(18+#GU=(>E00wp!{d_{;QB=q z91IOFiLEtJA|inrP>~!a2u$nMnEr^;&STjYmz_ z!y}UW@(LllaBoS|!T&ia;RxvK+vSFwaskh?zg*pW)%v1kEL5+=SW=~*rCZox1vj#;fw!g>63BAZsd+CH%LCewtBp6!sveT%a8ZRL3VSCb@t z>xMxJ+o_g%om>9NTASp(d30U0OU@Igd&2BOVHp(sJJO;>-jA-3epJ-W1qb9APv`nT z_e)3S-F;)@UEIsY+%!i|Ku&YJN}yvq8@g~$K(iOUA$hrTgTdzZ;Tu;a2N4D8$>RJ zJz&$NNY6{NXaKotQ~?DIRFb~kKr{lsw(Be0!z5O%JLSEu*m|cYqiHUJW1Fko?ekd$@UwLQYPz*{-Mbvfi2jv#C6B`&Fm;!GT!P+2u6i$*<=2mm%Td z@m>DV!&w6UWGpO-eYfssP0)T$t*zH%+-RTY+NI_NRKT}51SyT(8GDy51uj3iH#1v4^UGCkESiD_wE7jX{teY<>QobD<&hW`+xbCep z+s}wSp45&zf%9JW>gIhPCm4n6%_xDsCcdAo3R-S)ChX@gOWdcAlOEoD7z*y3E7y#O zz-Gb?@57lYl;wk2+_c~5SqGEL5HWO6jxBI1qAGh;t&b^*u7F!q; z31dd$Lmw5y3J1KVBOCZnqT|SQ=@Z7}C(Csn)V*ZRh?`I!BMA8f>aABxkiBrx|4`V` z8FCvM80B+Imd0qHhDD$tix&oIL-&~jDuDFkI zndzwp{4YnStW@{Mw2e=jmC^hd>8&%_=zjB@xQq;Pl0Dy@ z`w0XY?rg3}cBOmrlja^*w8&Er(dZ}qD$zBHR*rH%FZS9^-kZcJyU!DkCpVm@j|ki{ z4C5C6sKaoA`d|?S0deIE3fgaTG)5`eLtlZ0m{X?P7^GEY*t%%#UCzrFy)^UT#VQ3GoKqP$_P#4rLE+E443mBiLNygNqHI2C~jvNAx&pIyqzbNO)NJ%Nl zuVT{GZCSkpqsL|Bm)}Yhev|7zJH2`x_9E(d9JO&mnbO-jbzX~8C+vWiy`?QGCRyi< zK5fw|$mG+uZrl`&l(Li$cSUTE;xAkyu^PCy{){yJFa5dQPXJoJDQ z`&bOvYtZ)nRAq$fToYusw#1NJ$m_I|yq>y8rXd44xyYLPxm8;CmWr629RcdM>bnTBPR^S-O&e3g2b6tIX5g0l zkO-DGt#-5HWPJ@`P&78Nu2&P}-k0 zoATcSzi4qO?~;~fZ{jKiJ1$pHa7U`zFfs8Uv@%U&Y#;EVdT`{5EIs(ve?CXyVL$nY zmuhT1a#=uJJ05Q)9tn`P@a~WO_JY&Q=(c-no zxVAVsoLgz!7tA+iUh}%e#2ZgrthC~G)X1i`MBN%ahfC@Kp@d*-HX+2Ik2k%{E5_BL z&DB_@03p{@aMw+(t-_#*n?o#dtQVmB7$p~h8ojp%%9;si%&}=_Yxt&pYl{RkOg(t- zK_AL@9M#KudG+VF`3!XJZ7;8Y^;l*#WM{la;|sT%?dLTYL}cXYrXDeP>-1HgRd+Q8 ziVDe>oPlb|Ed32P7()t9PLYbnEoy8uOAyPJ!$r7~^++%{PYMMY*#Xwm6&!BWA0V#3 zO79!f-nsj$}9-CTDxsK7HvG;r~vTs*A=qLa%h~-x>m@%Bt*Y;=ctEvb> zc7e0TSI|{>us1y^6!LW2c$DZ~SVI}jz3KIp{cc+Ey0Sp3W`yVS-Sk1{%Di=J@MxRn zNn?GZ+YtCxAzU^U^zS;l_IoufW?8ty88{^qFx|H{_j~Kb2Aj+?hbvPSk?HFh4{e)#meox2@mUrK6W{cUT>hulY!RZosr)I|?Q?hpxOqE0DRn z#rl3b3%<&s54Y=;(JW#zG)`PB1qPvC+fL^D%YJjx*mxu5Xw~`gT={kK{I}m~pMtwm zsa$f6=~@R4EyG`}6ZZWxQ;#HIZ+Iz|+8ey(U}BU* zZ1^J|h${WcSYf*sG+qvA;u0o=47T0PxYPPw&va*Ts$|DW>kJJI>ky7Q(+JPnJ=`TN zekG5M8Fxts-t1?%%LF>gAXz_oYoi@Y2qgP)L8~h$DEMc|6yalX`JFmbc4zGvHEsC8 zV+?+=X(eXpc&Q;1q$;G6M2+c&7eZ{k8Y;ai)qPbM<9)WoR3C_S+KZ-Cu+lz$3KT>Y zDG$)`+)3*2ki+W0(sdI!YreJ)uD$^~w{*>WmA;`{~HULOb{UNaaMSPOA(5WBIp6Lmb!`zlzu&4=(T zBM{q70K&!k9HcL^-rll_`^M}x5&|WV{yJFoNQ0CKJl7d$^^@x`9#%Qp^61Ceo&l%l zE0jpYr2oF~+~xKagc(nB_UMP)X9s6BoW$Vo^GZ&junBW-PteJRpL$Zeg@#)LoY@}yQBEr=@uh9ui%{69OAxknrAj$E_#W70yAxRh{tX0eV6s_`Q|i8tB##U~mWt3OaS=-}CjP zRdwW&q+d|CMuk51Ii44XvywVmF8v{RMa{miUFmm7w&c`#;C+q>=Zxe$02^bwI{9@` zC5BI0p;wlDZ6`}0c;+BuD;1RGS@z{x@6AY2DIwaUMXwdB>mdgcp&Pf+Lge>L&r@wA zUUX#JK?)(~R3|B00cHP=!Xj)nHv@z0av$?zbc8*BDMy7IZQ}nP$D^ zBqt8mZ=x@AHi_rn?{Kf(Ah*OMRsO8=948aPe#huU`VgWx=;LZk8ong!$;;7?4M2hK zIqjQV)@sOid~Iv$s5RNd5c8_e^tHgUq$p^w^xoGYWP&@Rk?}>9C;@^#-o8p6=fvi_* zWX@Wi_v4adV8&;ocSAv$`~ge)3%L=>47VcTSc20h$g+8?!6Jr$489eHzpRN1WSa6soDt(g<`n(+n5 zQZ7sXW-Gqy2^o!`9d(+E zZ&{ID&nN;IwzhP|ZoJhUX8eqgWrNIF?*JzRav_SlwqYM!oNpo&?ce<& zjvz5+4gsLH^E-+?c?B3guLDBNZ!^7Bh1&kj8=h|Y^FBi0X+7W@PC8+4*U0d(5)lm> zW1Cx8bLuaX^U9pI?R|9Z#9a#0#S&YSNeba&-CjCq;k*?AhE(?>+QAEVb4{18Wqh}X z^Sa*Jx580}>V%^T<+JD>YAWGe@oi%p7n!+_Dl#cGZh2D0*7)t1Q6WjW9RC)nUP(Vv{ zQ-$8dXv>_JhoHa|h47d{NoT8uR35Iuvaen^V|92nCCTvN4}l-OXTu$$Q${A07atRM zW_%?aPt66VZaW)K`C0$6PYxq-(dczExjyXN;U3%i)?a$WDV_UCb-}#Cd*yzGSJ>uA zvrK3&1L1IyRN(EV@HZcz1BmP|DEn!>M}l>j`kHT#(S=4QIJtFFg+^K3$p$%E zL+wT#2vTR^hKOf=3pf<+L|&t5kE~Dh{GTM@Ov`$j_NC(qSAQnCT~3#nzCPVvReA%b z^}dQCVN9KSZ&1RZPV0hS02Z4Z3R`d1_sN}}37W2kXgYu9T;&wKfcV}7jyaFFk)2j9 zv>cU?vL{U)ZfX zlYCMxSPA_mUdJt1ee{KbOHEGv0v+m*p^>EKf|ttF2?bi0v;8((&fDqOS8s$cXSNO8 zO8`8k6DWVasfb+fXL#fGW4-P~vae5xcnl>JGaC)ag_L}e12N8Y;BL8=^>!Ua5VKP) zaEYQc9cizZe-WI?8s#bd@qDL*nZo&V0qe%65S!C-0VbrEm?O7YX>a6JZl3H88Jhjm zq=3Ka#s-~PqxV!^ZGyB6lF&`r90Q3VC~E%GAIN>>T7)^@vITGL7GX)w?ntanU?Qj8 zmb&@vcTz;Ro9k3RKf%RTSO2+qT}uxB#(EJ!{ym{g!}wbOAxmJUEf}`IFZ%B`q=``KC;Jn^p5L97i z^bP4dLc*`aL3(WUi}R@|G!J#LNw&O#0tp?NCMoQ7S-P|Ob1`&Lp9_KZviYiPQr7oB zf0RyTMSo;Le|XD^oitLByv!^ttmiOzk{dkkX%5~LGHDSEc00=DFQz*Jq~Le1&Uo>R z9uHy>p{$3CwOC$mB_d?=U&e@o3<`_J>ZiAAKSJzk-lE&CE-)ukGd=+pY#lGQZFKbX zN`_!TM*CQ)aM;KnDO`c}&ZXZuK}aBY5H)Fn6wrdYjLH2Vjr4xlL@Vr#X2OoY$EPg? znw*#z)rm^62N~DT+EgLBiVIhyM*HGPL8pqe%1N*|Cq~JP$NBZ$%=fgfCJ{iPIawY5R|z}__`<@M7reoRCfQ>V-_=DH z8})C8v?{vq%G#C2&V)^2&%ahk5#b&1y6yyp1_uTvfa*syc6QZAkbR!AN9-%4`Oe?c z!Erbf=kd6Np*c&K@nd5cID|s`+j&W%?xNA(1z-=xaKGwCz3!dKZzWA=dpvCe|jvxV)?#Jbx&yZ|vD z!qnr88A7zRNFa1yJs)A0$7G4&*(`rkfU9cAjIAbIJ9;LscQ=9cofFw_dFAM@gLHq? z*CxrcNn%{gK%{JIrgo`U6(_%2E_QO^s%~Ftq0H=fe?5P47Zmin+A+xxqeGj9jsLY# z@Q&}i0*2f)Nlnl5xD(IO;*=j`v`}xQDfFGa0{at67(`j4h4S=+gY1ipKoI(=OQ==W zM4!Ni`>+m$d>e%_qn@aVv^>iA;IKC$kDBSfcFKdF_rML6O<&QphkKi5!u`M*NG}8B zY>!uIMfrxHpIgn*NOBum;e0&%#Y9*tnGrSnsCLKuZGD}H;$BgJ^2pe z3OH$uC6h4^nUCEB9z<@hM`M-^tM?c;F9*CoZ1P6oeVn)$z0Ws?4l}3d6jGf+JMPT- zTO8_FeF{x`OQm*WPrAxt&J1}j+)(>|>vo{@sX`mS75ic2-H-2vQlRxcZo3SxLygDz z&^fzT>87&`|6IDkZee&*5n#{DYDVcAB8kCv0uPn?S^F^o z4&NriVr;uQ@0&~Fm6^vVIhHOslMUopUWZ&o`x7oc1jeSt1!dS4Iqay<36^&Eb zv}T%N=oUUm5(ctiOr8lQsYctrM$!l^Kxm8|F1WQK?~j~%4G;s$oxJzZk6BMoSIyTd zfIov4uk_QWMHJ@3qn_}|FD_@C<3oF%+|K!CyjjF<%OS#S?K<1m%U-#8M*j}zXyV;5i54TXGH8f~8Z2dWFx0A3L zZHgi_GtR37Y0)Q-G850}jC5p&m^SPY!^jK}d2~9SKWM~-vrE1X6l7HA@H@f5 z{pqcFq>^sp(dcpRuA1eIHu)389F4Fyo=GX0L^sJ6<>NB`gtW>h1)>_(YrOdIr6m=h z5V_6qH(v^jKNF59G6t!i%~}0{3=sLUG|+B<0q)gq`G_`>ZD-HaPx*W@J^oqXfgr>X zzdiVpOADvUd*Lpji$`Tcn=#j}R}b;^{jf0899SUR!Cz_o7LnI!=Y9}L`;B9Z$M^tq zuZtx#xjzD@)R1z27cbJItLk8Ob{EFkAu+1YYMIS&v{=~tP6#9LTKVGVqr7c_$x9gK zFym*g!^W-F%|#xqB+ehEuN*dOS{~|}@IvvlDfV-VYR44(tppW@k>Gbz`I1g$Oub0z z9j{{+Q_!fKcW29iVo3W3lX#ilZ%rd_Mincb_ig4cj1GJ6`dY>%@*wB2=O|%=Rommf zTgyqo8Th$eOXOU3Tg$flGw7ub5Bh4a(9qDSN?pDHw|DR$Ce1(XJ)#JcY**oXM|HQ^d}*s9Rewkdv{BcUNBGfWVg#KI7(<< z%QODWxI&{&;o~zV@<%D75-HkPxN~oj|72C=D8t&p_|G#C zrgtG3tGEbr{cr+{C_~lchh(2SO&|Lw4N(tOSPqAf8GfnCb!gdRewYqQ{)IWNLtfxf zH_+gUn3AG>oweyame8A$TW5UT)m!tXA&5EVJ7x})s(uG25dcK?%rD#fIHrC(do@vn z8iIC0Ndq62hr4#zwJCu1Wgh4G*|^4v507Xwmf#DF5a6UCIN(9zr(ILtcJGdaOT%}! zdGUr2nHnI?xEcD9mM_&*wr%fmi16nbC~WN%F35fGePnf4k~%f1eTsLwhLs!=)W8sb zXk_yTdpGi013B~bUbk;g>FLAnNpzY)Rh@y<$u1>Vv@yolC+cC%ltW33oFD1_Y4eIz zdP9SDWqLA>9Xcz1-W)C|l;d0*1_G#=B=~LktFT>`YJ@dAoHHKUEkDayiY{=ji5TdK zPD`;UKkvEIKt&Mtj+dJq@1&M`75PW*=Xp07ake&mKh(oxW)<0ENTxY2Y>gBr2(j(` zdgMFS$Jy*2KpfUH0|>x-TZj6B4PlDlT5Oh3aQew)NO)=zzMmFNetGle5hY5k-yBFRraYI(XQ6 zJeb#Z&dmS{ZvLFe5?E5zY_Oh$ru(u@xKVk3}qUp=_aNf`!LqAX=ZfWd=9 z&r_xt;6;FqP11xtk5Qa{ogo5(zRsG(`=sHVX2)|Kj0_f3R{(l^gTS%xx`AghvG|tS zm$3@1?_(QP|B8aZ*8Z>sAK@BQOHg{d|C0Tk7qsoV&n)Z`ktgs+x5Eqn2sc|4h>`uM z_v4LNKwpC*P~8oq~~)59rQCwwEqspXXIgfyzwJDH=(-Rk$%US5Obmk}WM<*o&Hz&QpEuVr4?IL1tH zHd5JiBHi!VR67JeHrtVzEq!$eh(=z|r*0R$05|LDB7dvw0qJch4J6*znGQKV${QZe zxIyo?>l^|ge{KRYuM454N}iL6t4QA`w=v{-V_aLtYC5BVW)gTZ%A0mWa`EH{VY&R* zAs#F`jUqvwarm4ra7505N*I&66_*cp?ag|jN{7vI!N)151#Tas_K{y&QhJ_g&;&M; zZ6Lr?pa;f2OJ6ve0LVDk)9I^oxH@|w9(X!iO2!j+eH0>~DlkbbjG9cOpDc^9*A?`^lnzUcPPQsL|ut*(EOY%PMkPeOws#H3O zGD}MwA>vaj-D@S$zoLx^aW+$qw}H^f8BR2&)ko1oxxgN0JEwoU-_d5CU;g64ieB5v z;8;GM8(j_FUt`4YT|f#u#E)C~(S4~@vN6HMsMBgE<2LH+QM_CwY5qcVp{gX_nWdvJ z$slUZW)jld{ru&53!k_s9_&7|nEdLO1~ej4BfAVeNb*ICG>7DfI$CM>d}rw?z|(m} zDZI_)CV}g;X9Wz@yfvC*j)Ou7O-G^jvuv3fvx)-t4)#|T_4gaXX%;kax-`;Rez21b zBQ;$$ingBY=mbOWj-~I-!5r5?)q!6pRSDZ0Zf|+s@MowvWIqf6h}TmOVAH5?38mb?kvRwbs}z$CunhvZD-Qze z`NTj>EFhAXh`_wH0W5*r*?nF0{kQi#G0$MGk~6A-invyjpciP z9M>SM4?Vvm2owI}VlMlgTXC%VigOau@wnfiQ8N5!Q=CtZlCfu&WzryIYyL>t0=4~3 z#^?6l0{{o>n4!3<0F1Ru$eFU zO}Mq)*ZU!>^)^xS7EFXGeam&bx4QdNL=YkdYMr@SJeTts$^F{1A)-L{ab??`8@?nf zZZ@TbfdcYkokR59wzl&sT~byB#&nC5bL-swIUmtSoH^(7?a~*90SLawIye`PZPI|K zrt|h^W$d^6_pyM5Ip`c)lK{>2;vC{YZny*w#>>{zPmGpX6EfQz_)6Xgoc4Em_kj#d`OF z34x=gG0t}D9=K3nV^RmZ>nQ}}_w7Uh0))x2U^33j@WqeRxLH$j78Z0XM*?P6G5t)1 zjr{7M-w(T6agy|ksHqt@Wo*a8$6oIXg!wid!Y`+Vo`-j}?v>XXm4-w>pmyI)Kmg>U z!Jq+5!((GZ#~sb5#~wxb<*oW)WG7GhtTy;PhN+XE=WBrsZlrax%|C^bu|&H$M&eKE zyW`Ugn2);|?|7brtSWO%m>&2k<6>v#{LKNZDi?x_&&NKP-^k z&msEjW*0q#LC9N4Vo{54ukp7j@gHeg(eH=jh^|a=P|-PJQerdra&+nYzu9g2on(Ck z;^u5XQC5uL9IA+7ZoT(@`h8&H!We*x(G(7i%}(F8hnz13uBL4lB22t&;vk;mI&_D* zax6O9RR-bNDhbxAqg+?VJY(LHmnA6GAXM*SJ7QKlbq~jr?+t9a@=5TjoQ! zt&rg<*59P==|MW$#DT;=W9%Njao#@|Z0Fb}oZ90BKhcup>L5_IpAVCEJpVfJ_g6j- zSc_YLcfYnh$$?0V7M<-E%?XY_D?V;7WKX*!5Y1a%-pvVTm~GQ0xPRXT1c*;;3(^|q9_&HHFbmbIIJhEhG#n)PnXWH;Vm|!<7ONa<(jNZCn1B8eD}huxK~+YzSo^?if$pg40wug$j2qS z%XtLduK0JBH0*-TDKR8oU)%D2Tz=LHKL+|2X2YE^?1-H1d?W)Xr28US&TtnA;7K0u z5U}22b7Am49pnz#cKLm>JxZ-~pKGmDKD1p}O<)NOc=j(RNe3%d+=_@+B&rz}QT zTI2?qdhL%$w@ zyCR1$cL7ye%IHo|v5Z6>fPmbl;}t64?pQ7p5|d-zfM6p0H*r4BoA*4u3kRtZYflr) zsDB)l2V@9NN^l7BnR9(Mofxnalgm} zzPHTpo7^DpG_Rkc;k8v9^X%G&$?WkhREhycQ>rtI(ydX3DaMnzDf>T=WpK(3)30xd zx-*@RKL=Ocn;mKMxn5zo=;``1Z5N(yr|mrG58QBI3(2|UPpBg>>?NN8jbH*y;Vy2* z_OwdBiu9GZ{ z?hR_`@gqqqkNKTnONB`p<;YfBUE>{(aVvF|R$S*{24l-EzntfHA$&3l!f(3l|Ev7N|>mOEGKirhc z)9e^E#}LLEk;5dhUt~I(iM(}kg7?RSG+>(`^2%1j3B{>k6Oc>za(XUHz{~CtO#9|Y zKNra8k?k->?R>l&Xg2}d5C3P+$Us*ipVD6l8ycM=t=Kd9m(xVGhtPZD%T3Uaw@r@h zc~_|ZDHvhK#?7GLJ0Iz9AT_R{wddpcN;JNAK$<(B`0@C+yXtkmB}NLItB`&aCQ};p z@AT@sySv>BBno{l%sF6i9aNc4pGnXV#QI~=hA#s56m~lh&ugugP*dTbF?F?&&n8Ww zgn|%aEh?L23ep`a@Pyk`Dm7psqCdqYgs_Ao)oxhPvU5;D&UuZw4Z1?Oqv988xl2l1 zPa=nM72t&WjiX8a?O%ZYWcVPrj$oMEQr^5^r3OUA@;YEx0Y;XFO%}3 zBDulZ#;H@NYTMPFnOLuW#PL!4pVXeq%PR*bog4k`iY7^S4&OaR;ZS35pjEZ~+Xf_O zh%Y)AI{rWQ-ZCnVc3amDlHfEN+#!VEZVe=OaCeswAOv>{?(V@M!J%LW)99 zfUn#wflyUhJMQFs*@MQ8B7j{-if5$aB1#7y;K&}}71V;4NpcRls zOQY-AAu4%!xdxVJ)5LKvt2BH;%v+H_M$qt&{BpoeNe8bABDTxXr3_XEP0HbC zA{9g8msKF@$HQ`z=(0^dy5#@*Qeni{V(lE~P0nIRL>YW>n zgR^+*F-S7eZ-O%H70BVZiu2PF&ggw*`+{D}(iM4{-6Q)YGX&#Vp5Dq8y`J6{y7sm> zlPMK`@J||N9p@O|HhNfqrwH>qw+bdPBh^=5q_}A@nLe5qPRIMtSF-;ZNeDAnSs0Qe zJlUo*kOJv>xO42l(bEgDx>E#ME6znEWNl#tF(-dM8`=)irlfhc^UHrFi5;Bxz6ZUb zNMHHV(+MrvV^eBN(fdU-pfOUNTtV{C}p7}n*BSSw?W zmw{Bs<7@@DeNK7Lh4jq0S1e4!Hb$SYQ--)njfxx#9A*;UYUtLNt4eltecFhp92bK6 zdsvL8vWvxgKZ?V?DgP#65ahOfw zEt)@;am#&yfPBSLpQH&%J0r+7tQsEAHM~#=3oP`fDgDSRG6wKAi0%!oycg7#bT3i-yNcY*X(uj8*j`3H3qyx04`7L}S2WIM3jhciYu8PaEA+n!#bkv*U!x z=>WSuu<&5q?B))s-^TOo3ghDRcGg{$SAC{?l^2WMH-dSdcEvM`;9Q0e!vow3-&+-y z{X2$wy|*}6s~>N-VVy25 z(zeqsgBj9oi<4H1_+=eYg3Yj@a1&7^pQKS&(lho>UFVZ;j- zfhE5sKNy=K`512lve95AfW81vl*5%eFlfxp<7kK@;oyw2I7JsgeEq6BG z&4r;684krb=MnHdBn=?iwR7}sFAi9Y?Tw~a){C34m^W+h3r*^8+mSzza`*0s2}g;k z1&N1l!ekJy(vw1I*(o6Y=7#y=Vnoa@=bn{U6CPKgA&H-8Aa}63jODE{p^s|?&v3U7 z_uo)kk{gJKjo_4-Qu=6wOaR%J_hV8WNurNO*H}F{0Yi{^!w~7l z1Uhev=GObAnkhl{*AKx`h#Rr+{zH&e!O-A(hF;&REKY<@gc zlySaxwZf5GA;3Vk;}Q_)xDYt?^~f{O`SAca+Bn@oiB^Gw}?z}9OFl# zwu^h*i(4Ojmmv$ZU4wVu3<6&$wZeJ3c<~JAg?9RdN#e?7iV7YuO3b=Df=A?eS99KK zejDiuc(|^CtpmmG>pq?iw$cjD*kdNd|v9GxQagf!$t&2%of3SOWcJ#k-*=>uwRm23pW3t9$~ zP8!@GXNsU3k7Dh6-W+Sh#ci1tDy>9#Ot9sYl!*4&JCaW?&`^I+V)lN6PMAa9zPn4e zPZRiMpoyM~G^eVk%gc?#w94cOR)Z_e-6jgweZV1KudPOX%}Kn=q zTDws~K!|RGC25BZUoLqA`(5W2k2AcHjSU&R@9By*j>d@U^M4;PfwnVt33@kg{dvAl z7_CG&PF4wDd^?pE*Ugz&=euai2T%tlTe#g-Sw#B#N%2OmV-t=bIFXL02|*hH-)~sw zF@21~gXu+R^d?4txVaCec5j4EG_-gPdMMr{59OnLebrsJf`0_17)x5Jb6f{8Ym&-8h1Bhapu=8n0lMbmG2E|kw+(Q&awcG>K3&VZ*n%;06 zQ;cmplOzw-K7qTD3)1ym?&z%EC;j~Su7#t%OV^t)QaajTTpOC%Qs0H^oq2sajk}!> z*fWQxmWb@L$2V0ATyOAYl@avFX!fnrn+rAtcXr8fH*P+T3=aPAi#2uIn4A53ZvHDj z+$pD|q~uV%`4!zkz#8(2u$a%&`Poj*_*)(?teo)i)P0<@)k2}~QQ&YIM0N*fk{u38 z%jebB%DMbHnKN~3(p+8guxCwpILVU!6QKj2x!pLhSj*xSgK0X$b$PiTyT`Y8A$*#o z!nx7jeAPg2)eCGq3V&37%aP*Ymi<86L&QamXz?5T`2b1wH#u<@!Ps5!D{2TGALr9? z91fSukK10Sx1g>I6~lfZhZPV>qts1YS_?hSvV36!Om!j!T^I^0W)JCSx)THys?tL1 zh$LE(N+Io)^&f49A6zCc+Gt-h&CT*3QZYI`JdUF{k)E6DB>4$YMJh(DHKS`jgIe=>@ zuQ7u&7%fF{4uvIIxEH?ux#;C5dkB9!j`MbqB5PFcQ)X^41IxLbRrq(OG%)zMw?G8% z0jR#Y_p`edrMQX02PVXcKS_J~rx(ClKCIIB0qCH7{GMvHoTA+7{Y`~_iv|I5mUAbZ zKHO$Xw}@bZ35p@VHlgs(Z$#7C3C1u|mpHmJlka=Gjk~!IUYqU`5>rCNQi=M}Y-yT7 zwn)<%xcd8vBm~uhjE{lAstT0$e%NNA76<%UQEc$O7`Zr;*>P{|Z5G*@iZyeC&-Zlj zpF8m&A&>7buyVT}4&Aojpq4ZmvR{*VXA88cb3c8(RkvYOjOH^4Q#i?U#>%akzt=^%1C`PqIA2I*g z3K~R+*!y@nr8w&aR{EJ^m#3;z%=W_~*QAzH5a`~{$ldmMxZ%1s=BECIc<5n|WifiZ zoL%g^muhDA$|Jw9;Cqtu5pQ0_Ylk~?%_2JD0WF}Y!|@u%CNBBHx9z6svH6Fq%WC_* zJ}&Qbl}GcJi;eyUO$(Bt5Is_)wb__Cup}ld!-b8Z&aU>wL?Jl zA;L7$geL|g=aT|VJ-NGbH8!aPX>v!}?LOe#0VzI9yrUUM|ASKBk$c+MKo_ z(9r`iZsFJ1-uCQXFpr3iVA0QmP<2>qzUc><3L)uYld0+v5XI9uFJtaXp~(?5*b5ma z!?Ec#LbI}m0sv2_9Y}|FCy|ex7TEKKmxWNi`C^}^`yu|&+t_qh=}R<+op2)FLBr>J zMBvy!&wIaMwvYkLF79rrZGRSJb}Q!3O{v%9Oe!+%~p73O^}C+i50^$S{KPK+^+amo3WBg~WHI0b?v_pg$Uy6z#?Myb=u ztl~^v@qcTXL7Nk8_?clL;z`8);x|}5F#`s3Hyu@Y?i7kV1+BO&$LvH_ZO?Qa1OV1k zlxd{I_8+SvNd%Sa&sG*T*k+Zvni{m#)F^QWK&c-fiXTa2ssuO3lM-pmN9S5hwVKZ<*(NIhlyev+v``W=ez#=$C2 ze?*IYZd8kXEW;9gYeh?3DR4S^2`>aK-nTwg`bIWik*lq6&Wf^pqp3?DVeQcKxv9w> z`ki8MDE`nVEC7vbN;$O(J2l`ioJBz!O9u$w<^bq!16R_;xqj+uVcV(X>l5sQHBfomwA?%i^&3 z+)u|C>J$y^8M5un8?YJfIhbPTQ%r@tUv+?zypxkV5#y5cO>Y(S zIQF_s3Pk9>*$3v19E5dA0hs^g)HSBdw7zg+`2ofv^}&bLREE%wJl>&gVhgDFJS-2) zyx-W>d}gc>NkbZ+o%9&hME!dGrlfEPf2;8$+o<7r81P|5uIXfM`QpcI%j0=SL(zGE z<-~R5^NFo*KKZrp{q*+vEhz?L^~i1zfk8Y>zCke6=IMGKqd|2uJ8zIIfhLkLK>mO* z_DA8Zha?4GB?b9ez|7Yl=6A+$7F*iGa@UCFTWN!OGb@#U%s#V^r$?~Hdp?=QJQ<9? zhc%uxUemx`-RJ2@Et8%rHYextK}5J@{%o-Y$s)jzx#NCT?8CDoI$I#uG=ZU41<3Ks zc)-`6`Q&#m-UsG^K?ao2HCKA3&Hll}nu2}4J+M~}ti(zlOx@<>=eF@|I1GoJi&ue* zdq6~9wAl*e=GR*S!%!W%xX13i$eoh;YFWhDg2I=GKPcWHv;B{DT6Vi8zK$YmiXIPHbGkYcIk% z1{fl0NDXgHI;DNbjwb|S?!5&APv&hygYAa=KZ&JO=qF-;S8h&<_g_5zl(KSdA>Bn$ zh!}Jb+GXz6Pyzm=eYKIA`!g@Z;(t~nY@CXVH$D(W0&>5)4bMbA>18D(CDsG*k-Le| z;8q&)e$rp~4+(fy_QhlGojB zfP4`A1jI85i|Orr6UcXsC$`^UlEN1bCY8X|N+>$q*ew_0I<99t%&x2-ukg!2&lo>^ za0VowO?9mMi~`9ru5m{xCmfu*&~A&0X9w(oZuc<(w* zAL8oGMA;)Y5#GOj2arjIdqOIr6l0YM*Uch1wkakXsKq_(yr@6U$92~|Zsu;h??5+9E5D6gWl79Ub^Ti<+m`+qiGDSgn2fbg^2E&`sX=Kwx+acuO*n0Q?7> z@N#@Cc6mMh5=b{G_7CEAXlR}B_(S;42c~>(SQ#Gkt;44~dn`J%D&#UmG+&4d9jn0r z8~Lh{_{V_c>S|Q&Dz7Flz9XSWvf`__`70d{8ppCYIClpxAFd;WnR#}~4Ntts@CbWy z-hKv&jiRFW%+Q)~;iO&0 zsK7`*qWWx$BKmDKK%cD#t?GH9(Mp>q`e}st@-!Db;zN+=`+Rk!Un|M=3eD6&z0eke0gwURBOGLaa z`Z~fd>z82~LHz<#_tQF_VS3rVS2j(qz^dS%=UZFQ^dc|QX@lR+iI_`(no)A`!y9AfUoVP%X32B;75Ko1$DuVy3mg$RI)aW z@;i7F^V;xGDX`09MkFNSDinWysaR}HHv() zB)vIt%T`qjsi%&k+L~pMwz}DqmVcAyK#&qn(Vc8t{3iigiupM{rDMbB$VELt=T+OC z`!62opP^6~d9^fS8YA?s#$tT#8O*-?7-^cEQLL*(K?S}+KKPEXuO=ha!$kV}7%il# zWY~%brLaHov&B%(l3rK@YKm24OWOuM8Gh~-AI})w2RP};y7L$+KG8BzPl3rZG`biDmPCtTNpKl{NQ@eSxmZ?ZoGb_$L}P# zq4BtS61k=`dRcM6h5JlD0x%PnnmgRdS;Oj=?tE`29sgb`8#M& z`W;VL(8pv1TLo0>oe>`KuBjp^FTkkh^W&Yv)2OD*i!cL5!h`tkxg*QH`MHDQa&kq= zbah0s93H!7xnBMm2I-8{&G9-F-5plac8j#$H%0Ri0lP`VmNyX;Q?a=S<~{f2FujFJ ztGI+yaHkFuoCDx(06a=})n4kdN<{4J_wcYNe0)9Zewb#e9IWj@s&&tnnO7LRAm{Zkgs8^&BoDfQjmNw_dojr0D4Iz(f zm3L{LE|$_hs0XKfCLPmgJR$(9l@?J-DZ-2HZZCdh*_JV^fwYvC*bCR-w2I)8b(;2+ zIotJiAvcK1ne*N>-!2$@D8@>>wn#_U=l1@zk6L1r1IrxG==f2(uTMlMdhoTrsS-Wd zCwX9;h%%6BFAdOE&#%CceEDhES_|qAUrPqbL(UH2X#}_%$QmbP)xG zF66+@-}Q$#y~piN9;?MbZhPRl6lYU4)Efp0wcK-sF{w0RxA#@HsYuIXnrq{nM>OX? z47XFIB0#3<+*3UKBrP*rg?QkoRMh9*`Y1F$^ih(z;_s)C#9jKPD<``5SCipqCpgTtB;(iIHHvM;h zJlIji@gu)AyT;6$V!8G9^>jRQQ?sH^^LIN~s(&7LtWPr$&c{8MrS;`Q;;&z6jw6DZ ziL;8Z60~|b0qrn^x?|kctqdMj`a_9HIq{(G7$T;^afCFa2rQg)unNQ^pWpU-j=TsC z7tp3fBu>{&6-XQAYiHi$_8WP;s(+u7H068SLg6un&uMbk#RyN0!SXb$=3CYR6y1a^ z#lTJRpFYJ7;F>kFm%p{@oM3@pS>GmSf|B12w;k#5S=j?J&L)j3t4m;y@tpzPG^!~e zt#^Q@J>jpEJx-to{UF|^H0MniI@@javNsP4RoU9S?l_R2Ks3FNZx3ekDKZ@E2k)lG z6V43W*h%?RH{2Rzd@iT62M0H$ZZy-)mXEWULIx}xMAlZ1zTI?dv<`VK1RM7RZ`Y9v zbos0iXaT$R01)5jWDS2%6?!w{yX(3?wE(Dx*1ToOn_`lk2u}+7$l8i5PS@RL`%!X% z!aiqhuIzj-n!%W|%6p`Ma)yY_9PPJ#k}RaBZFpvPf>Ah)orp$d>f6MyJ=|Wq&Sk7Y z9D8D*u@AM2`f~3n9Wpp*#`BB^r&_Hl>kPWh26q`N#R_`(X~S;#{SERXlJ%eq?ZCv zA+Rf0K%?6RW)R8K?0dzT0?_99Zo2*Gwi@=l$1V4b1k7BH1!~-q(Qf@3=LLKaJ6L1B zDRLm0?|UNC7yX4X-}E%usLzyd>09Z`ud%>F&x(2iH0^gc;{8q|G9FL_d<(v3YYypXM zYd1FbmDxoh+U$=U`;ID+)C?ZMlX+guj)C=6;Lz-y!_mrgEruSN-s$(%^h;BBrqT;S z`;l$Nvu(hY%kqKGTBGl6mM&|wIfujYRHK3X*`~M7o4HSO-1PLar)^L;?=u*BL@VTZ zE%5||_J!_h|E(GD#scC>o0>q^`TJQ*a0b#i#NDoUcv|Su^n{LFaA4cF+gsw0M9A~q zVB|;#Yqobi;lOZv!N97@OAdKgo3B9D$wC$tbltbZO5x=eygq|cUI#%zISqW0vQUKF za$7GJmWe>M?qqrp$d6>`=>%kzTQ+CP{G?nEPOF{8> znd9-_eXyqOy$T3w-@YeZQ0RZd1np5y=}8h`YWVuPskoGCy-8U&#`;jp!p*2dJ@p;0 zr?ec{fUTzqK*A&Ew!(s2M=bEV<7!NB-`avT)$`72#vE~m_!uysj{)Nk=LY{|Iel~K zH)twbtc5c^FWp_E&q~f&K)jG}dIM@jh)?9v-4Z>d<8IKIJ6S3u?#XF9jsGz?8@Dih z)4jmN!jOQEggKP&D1r;hlexHo1WR?KTz^*h6u7Q1u;OX^*_Zr`crLTGs8rvs>$Sie zqPl%yZbbiJm3aN9xt;Iv1XJ>bFGToL~x9U@-?9Bex`9(#@5mJ6S zGIsDvsb3c06i{9L-KvlK-6vI(vs%g&WpSJAsq#OT87yg;vb61(gbE7%MmESI;jIXO z-U@_;qKdo4nc=6Ths!fFAGyuj+Z*dE%*4<)k68*1h&?ccEa_@`teaR0e;3jb{H{3T z(lGXCe)K^cXt~qrL~Ss-J7oV6tp*O^jTQ3c%E~wI1zybpU5bY20S}u4=Yi&qwzC>9 zVkNdRA+eq-FIyj?jmMLHm%7@M*64l;{wAc#(+RN$=~DhHYit90rZUHXSf8Eg=$9zx z?UZ&FeNrFvs4?d_(}t#*pFF$+9rjtwqoo%@Cr@oQ=2QODBm+NaOD9KRst_Z}-ia%+ zhA(vunJyiFlZfXNLYcrGvhQ82_l~$eSv7pzP;$v@8?3K3YM(JBi>*?3jSSj2l8oZ=EZ=B85f`NoG_r+1MN5z`b_h=;Gj z+N{W>

    4j7mKaN1wC=mJ&UZp&+Ohbz-dj1Y)1BWDwUu%bxA&TTc^{MY2_#qa8%lX zu)wpW16fS+@6=~v;53NYfF6A76z>2yo{h&BTLW+3YNK||Xb<^MmXgq0h0lN&&PZ{c zoaj^)Ij{UuJ6s3e5_wN@$8-7o4EBQdw>y1gBUQlW5MVG3yDnN`_QY0qhg3Yp8>&!= z;cnUac(9GhfD)#{RorbydEA{Z-nmtKZk|~ktQLZt`mpP=Dy&U~PtTYF)}CjG`EGz| zOUwl=N%r)i4-IWRia#*8(dRhuCCj^HXlU>hJOvA4it#__}*Kpa*qCF zzM$k($FU5xih|e|PH@hd?4o@H)Yz!hQ+{PDYe?6rbe_RUMOC}RN%d43__xNYb`HpP zfCNuxym~>8nDmEwrU?JLi#&A>878t6t?cB}s!JWi(4|kG&iPI|y|t~3obsqy$>n7b z;Mxa@S|Z*4jNg)H&Ip)f|E$oZI~VPss!R#=6e}ta@yKU>^!WDKQFF={5>qXf?)dOsjxDQH)F)t@9WG5NEkeqh;3 zqr}waDtVaF`9+mIPH?_rjMDd&592SVW6B)YwcFJLy-wr2%MQoL@T78hJtK@Vv288D z+6r0=2SKp2qmoLFtw57*O1{2#Gwz1TcwgrBuG8lX*$lKo-4+E67@YbIR=2m0W-Y+H zGjTdLIl=u~^j(1+?limJOr-7ieADPAr0Y}W%t#a6T?@2sH_4p6iWC}h)+BOj;h~K5 z*t0r2e)Qp-weO(*z*wq8ofV-KUQIfLU!uiPF#c@*m>2ml>Gfhfn@4=4Ae0*Acuf}d zC#nlkR@4DY-=31X+iBI^47#;oA4Xt4HOO8sl z3WyT)CS8x7S3M6I@FkayohmWHv(rI42w`{c;;$y141N;pHlGRNq-}*#hIJD`gSgjl z)HE6RYVqSr7-`$h8fM6b6LXGFs#*DzQMW>5CZAWUJ^QE`#)N6t&cB4<2O(`_-!sX{ zi9o#VWUM}7x1nwlfA}ywLp@lBB|w){CHl9Hhkx1f0~LN4YyzP|@7V}9w*^mIU1Ky? zIDqDe?~CSX#C<={k%yh8(PoBZGU$6=C&m_4@VTr>byJJ>7Pd=P*IdyW?Rr*&VA?3s zKS|Zsbz20JWTMS4mNdU=aA8d|7rU4tkb}zvzfn_5K4>C&SCoA(Tt)m>fBg+5oYRKr z*3a_-y@Cuh?S4WAMfa3<(2*aUm|H-_K7Nt*p)f4&nw(T`^0fOUfX>m~A`@gA>V%3C zKUMwVq8yaWu^*|T{NWQ^C;}E1Eu`-DflC(VLH~tp>3;8gB}za@s;#8Cn?Idk^8?eP z=h5dSvcGA{UvD$uOF~?!neg7wKR%-#z7*#_*pl>6}l01*DBryAI^7VjUANT-!c6ih#C~8~_c^G_+3Ivk;4L=fnif zwxmm?0ugLQ0{y@ww}sIHTb3X4YQp5+6$p~HLtY#>>~bMcz=TBd+F>nIaZf4gAx7SP z19=kMU(@4nte86I176jV*#_?f4}P|F(p1yLo~g|QNx|MUP?zK8qr<%)7{$*16d2mB zPf%nR{cc)k2#`$o_ufu_{cig+qF&U1_tX9Sg4I_<*p{5!%RO|Gp){Adz7V|)|J%Rf zL;oKZ`<)E$Hmv;*7*63B*Z!qN{Lh)t?t|DVFB{TW1pbB}jHQfH#!s%h?zQ|E+6{?Bw

    n4v?JAY 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 J-nM-De*kcUW>o+H literal 0 HcmV?d00001 diff --git a/static/img/200719-django-user-visit/django-admin-login.png b/static/img/200719-django-user-visit/django-admin-login.png new file mode 100644 index 0000000000000000000000000000000000000000..b117dcb42d94c386096116dd4e87484c670930d2 GIT binary patch literal 117029 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 literal 0 HcmV?d00001 diff --git a/static/img/200719-django-user-visit/django-success.png b/static/img/200719-django-user-visit/django-success.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2d54c5db1d38e9ddb15e6571ee681b2b977128 GIT binary patch literal 101527 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�S%J7eq-A1-TEcZ#!I*ke=L>|H`T8}Bt&*= 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 literal 0 HcmV?d00001 diff --git a/static/img/200719-django-user-visit/django-user-visit-details.png b/static/img/200719-django-user-visit/django-user-visit-details.png new file mode 100644 index 0000000000000000000000000000000000000000..2055153c545ee7c71b622f6a2f08854808a5bf67 GIT binary patch literal 286730 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≥QUB> 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

  • }G5#H}s*Au4Zf%+k| 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%0AYILz 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 literal 0 HcmV?d00001 diff --git a/static/img/200719-django-user-visit/user-visit-record.png b/static/img/200719-django-user-visit/user-visit-record.png new file mode 100644 index 0000000000000000000000000000000000000000..21373c410f351c07c4fabcf9e51ac7336196928a GIT binary patch literal 189507 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

    u=cF~Lgp_pgn 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

    m}Z6u+mL_FHq8e+th8y$Ym_B6fixX-;PtXE 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�ZhRT(n#`mEhz)J!wLJd(P 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

    4dI8* zX6AvZ1dtkWUGbsj4d+XBOy=ovDJVdd z>>OKiy?-?Y+IB$v(c4d^-ygFg3NARQ?~>Ni+V>z-__`}7-uPNa{s6c_axoE$OO93b z@GUely?S{_t^9n;1;jVbSjgzv*vP+5_?Yr{G!uau6XTMWzbzK2Yi+DNQmr&evn=7B z=?!Vt)F0_nyKHA%sfe@;r+$5whrC6qG#k_$`O+0V;}u`lHPMVo4UO;WE-YzwSpju` z8ne=4RXF`9z@qmkE8v8uavQwU+nO?cOf;B!-(; z@YL6aN>^5o3B)`(eP||)!+Hd@Gx#t{jY^gg-7bJ!?tZ7A%)r#@@RZ4FKqU(IEf3GUbRs7gBvJM&y_&m zw$yx`j>@f~sd`BqJg%QOSwEFU^#ZwJAONM6=`B&3sPnQSrB}nVl$pSn(@6 zo|?rpKpp)v8~zF?-(F<>44`*Ks>cN1dR*Jh^#nPnDP={FaGat(o;0Zxx&N&V>OOcWRK7}kt|35)9}Qx7i8NkEI=4QY-yf$eCi zqfPu?2E;{FJl`Y=H5}nO3CY|gb$IyNNRli?^nYg#eTfp5E!n#4vC>iLOHU5QJI|MMU4p$6~ zo~w?(3amh6AGp!Y$ybdZ+XP7eJcl&G5;v>7;|^ubu4iNed5b)u01QbP1_zMB3@6^v z@$LnmS+OwMp1&5$mlu5hUX6G?7|~m7|ql zLaWSK2UY!#(T0tASLReuDd;?>=wMBM-qx)P}BS!$*;=-S%~z?#eCn|D(O@jA|-f*UT`eG|^#{B8mk>PzWGMha(CY z7(i+uAQ_}d?+_r68CobohOV@X28^K!0@5RW=pCd93B4wv21w%Bo^{WARC91Kum%Pg65%U2C0#D;+{>0o|#` z*h@|m*Gmq7g%XK$a-IIfq5zw+nj^$(IL%J>@5jx2HV>Xqfqku2J44qZl6jq(xnl;`Cd#mctTQEZPqn^CA{tnpp&?!xs;utzx~=GJey9 zWLlO~>*Dh*=g3w~-G}WYSCbTjQ7>BUp0`EtpvUxJj&gko*ykAP|6SI;kGjpC8cJ+x zeH9k^*(-hpF18C)UnfXFKBNop*iU0%L2g@;2ws08jE#PVvbh^C=e6E=bFf~A#KR9C zyoF8@QAlSBRE*Ho@@K85dX=qQ4+Kl%eHUB=%{JKS+`G%9`dUjE3q@Wcbt;!F|ym6#`W%IS7HznK-5ju9X2v_;&VAj*yDEsFY*b1#uOA&{6E}MXWg{TF3#Kuhje$l=#M#)2OMy|05@At;o$* zBigvRK7h>(JQM1e6=1BhLyq5mwL>pBoBar?BndH2cFoO}QCwK*^KKX_pzMt*I0%F& z$09Br%;_T?g;W1tc=)%?b{;V?p!K7HFB3moAWL&-lme1f?{BbRw^@hPxe(UW{`a7G z40odfLT;2-8|e3H#_+8+%29IYK;NKSxnKgCFVlYsQ}7`J?II`~gU~2+&E+58i2Tu7 z|D|hi?C{ox|NS>3lB!bT#3C%3W~V_EVn(#t*Mrl>yL=_iV9JYD%ob?669Y+lva=zFP&-a}Y zD256>)hQxvB)q6e6xD*Kc`(&y3= zgY7|D5m#C*g5`GBdsVY7q$7Jb4tOp%v0<_a_@<}iL_(_Q%lF(Ns9mm5ON*chBk@K?R}f@WyhSXE6; zY%S%p#J1qzWD;!u{sB}isxe||x_b`xr3GyL{G|MJ8NB1s2&}C$-?{NDGy6!HaiN^R zCjAUemg}$uI#SRngS#TMncMJs3+4jpZrOMttKFSiN zb333-E|DuRfoxk_;mWzNt55Ge?^65>Y1;A|wZ2mdQB~7*Kjwm6e`AD_!#{R>xwsLU zx-g@vQN!5y@Nr@-ARzN;PN3^+=cB0NhP^08LMtQyG6wN38p}uzl+K7=8d~E6Z*E;p zey|j$<@fm16jKX=Gfo2!7VG8f{X3IzVM7naqRO;|P1j0(W=47KxHmZOhF~g9{i{>pS%21Kd?z$4K(}?-ZL%6 zt$MCgcRbC_9Xr$vYXEa91w(IIZX5s=&5nn*-!}*XGK!MmP^2;kItT;Mpegc+%LlGK zDEcRsl#XQ}Kd{v3-jWAPDkGb=-z^^q^8nh56hra^VSi;k!i{%5KU<-i8h&9`5NG9nX*;05>_edNdmi0u>i~ULR)bEs_;m%jJUu z-a%j6dHYvGE=1$g9c8h%rcgWRTepQ$WZ@wN7O})7q7~aS06t26vQ*>XcHTiZ0Xl*Q ztR~+YA8uVHx?y9Vvh zq!K|hz>+P@O=qKoy#FXbbEdR3L-~F{u+DADUcAt9iI*}HsT`1mU8UH^xc?OEGo*jT zd24G~cIM+Fuw?J_u>Lg_~`c7ApJ6-c_LY%d>nF0RyQ9k3$G z+cigDxnP20<2OM+PS!AJ{*LlNRgLS?=_u7Zf{|tta!)#va}-PBBqr1ZtJImEP=m+cOO6^l>{acDr}S+EEzPExU11e7w!hySg?hAJy{k1z0y9 zFn$ATO2`lzLXDlYTt=i*B}m@#&I7lL#N1=-7fD`H0Wc$nf!~`p35PI3Q z@;jN;!DT)P->RQiM4Zq^73!L_ke)0`ci1kh+9~DJQ`&+SXehM~M|WMh0)ub7{1&nK z;Vn2W+2jgnj@3x(2s%Sv`B|)Sz`{YJZt0L=_TMX~@ylTRSHGR?5J{4Gl9zn_8XGo1 zyJIw%sl@QXx67JmUz2ahOM#G`{D%vUH{>QKDpxj`d!>hn36TtlEFSD3mS$*{?0hk- z&Z7Ji%Te8~nV=u(@P)w{R{b#p!?dqU=%tj!3)f|ff zwINVqgtsFeF=B7+CPos@ROH;7hinWw%UZ44oOyaQIZQg)Yz3a76Db6%F{!zsN)U(D z&vxk=(YaS^hAS9SC+cAAu9NQBf{@7dLtJ}57RF7(oA9;!h z#ZFs8c|I4OZtFn8eBr7&+*&I?RLFX~elq$=SMOKlnk$=3C+a~|b_lUio~YQ3lBof# zg!R~;55=`F1VvsEI4^zHJc<5coDWjEXfdlB#e zM*8)H{RC?@1L&L3QUS4AcTuHKO#^V>-Ojo2Q~OO#{Qcj0Z)VcBSD86{jJl!DQpu2y z%jEzQf0wS&rxLv1B8$C1kOb5&Sj`yD`DDSK87o$?pU8<}Jh)e<72BTxOaeM#&ch`w zjZiwibNutgvd;BfCGug|MUB%VT#?zpX2s$khTIPWf!znQL&iSuW&2Ekpb$?d^zR&R zY4-3l)V7hA_~^MGy6+*z_3l^JPU&p#y!BaqJAxeFqlMYAvmh}{!uI^fSB82b#SR7J znUb7hWc4ZbPF8`(VP--p%oSFV?O?9G`E1iWX;TMgGvso5)gdA}#iJWpe|T~~k5P+s zAb%ihGRJ7^R733n|E$-JfbL?*i&zANs?lbA_iax^OYRo~TFWt>_q8o1w~ky@+!gfS zT|Y3ct9lz}IlN2YQN2v%X}je#TCISRflo_{-?j7Yv5K~8sj+v=?^bP5?NAm76P{G; zG|Jz^!OjBSFCztGsaHT3lu2%hC~@B<_?lmVe6Jp-?jE%|Ua{?1NL0#Y2<>nqL^nY@ zN3na-H1%@+Z5kPv<*~>n6ZKonnRlymy&C!rG{a-%mC3X!TpmIq(WHtnR_{<~p_`!$ ziBp$aJ96!QYoFPZhl?v|HGTL8|5&|xs-f2Ms$n6iaI)JZ&5Be?i zL!7E!hehopTuDEA{;vCM-}kov@Mg47Gp=X4g27pInui1eBHt>!5-pJ-CnZo zE%MCZc`3y%~eoX^3Xi#ZIW{qD!iDcNUL!K|+|z=;}}o zs2kRrvKAyZozkfRWkzqWR6XK*xq`U--<$ORd?omgrn`Tp4}9@y{8wfIzldya?LtEH zT_zzhatZfL2356w>T()T1rr%orWA7QuE4X$U_W8r6-Z`ajGy>*<3VfnBs}!OGn)re zs#8JsQE3lMilbZS%D(ZU6`j5#p*Vd)fjhcm@xuxZ-f=O*&KdIF&Q1X8H+GX7Hqmz` zTS@Gc0iQwM>Ie>+y=GDferHfD-j@b-FH|rnR?^N_a2#Gpu1zsGc*4-6i30^=4lqSx z=-)i;*N>kM&1fT>hSuvbVyVkbwSkEqSKh|7zw9ueIz|M}A$>>OGSo$Xyw#!l$a3tFQB8H{K$B6| z$~N8vB_`*~{A1Jj%BtClr=@AQifKe6bAT?9(m zu8*J}>=NgNH&8EKtc=g4Jfx{m13W8xugom}><5YgEX6)zT)(k%y($)4Vx!rId!iLU z2dNx!I+$HRfJin{5gu4mcwuyC&JFGEiP!V8Tw%^JcyXMllw0kYgcNJ~_QDZeEZ+Yy zscb?-BsV$tq(H&U?8M{O#!&Zsu!4Wc4U8oX#yl;@Nc4YFKg*A}%*dyoyzH-SPALti z2l9Gw1Ojz7$3c7MUT4htYqAqlKi^5V6F4N?=~0ioblr9do9?agg_DB*jH6|V?zjVJ zla7*JzCPZ%vmmCtn_Nh$T)AL?(+P`*ZTI;90P zc#RzdbWsn28~j_QU{-!ZKeqtgr*i}h#bD~eM6v&DqF|YsSa&%iNBzcoJszEr-4MA; z5#A3~-u&$HF=Jr3gQHgyZo}20&D<&MsF#s%B!93g(9^T&hR|O>r(v3tXf8{)Z7glX z5e+L^k30!81sMtOLgr~e09&q7n1Z77F!JhsYpjd<^XSSH)l=TvvBT}TO2hJU-0i9j z>Ja|!8)BThhk*lutq4QeUO3@d>=YqvG;%@&TpHM*6V`ZcivWL9Qm%;c0uHN${lP zaPtuUtGr~_gYma@X!~iqLkzW)$pJvSY$s{+++$e<2zUxH1LZLW_fS=#2)76#TU0{o zl=h>m8mQ+M$I+?*)|cVw2U=7ZO3KV3Y1pk<;4))9N*&E)r=VZNv{3AQ=?Eb)u0Vk$ zGg`D?q2_*}4y$IaVe)p3yu!T;X^wJPap;=4WdVeZ9qHtG$D0%V@^EEY)U8zqzboPB zDQ^#hiu{;%od??;6OY9e@!&@1ZC&9k2!xOCC>K|}#;1^(`>wcKXmY8p5H{<2>B_iM z%(=MGz*cBO+kQ=n^?jVZ$=boeur{X7@=J;0F!HJPG_E^eCn#GWE^)|4bFxNZb=bde z()P^sem^H&u`>7OVRqUgmng@X)P_}Ya1{cvW{|gR41DszzNUC%U%WY%Y+MXB$TyS< z((Sag6p3;E@z3%5e;fDzHRpZtSFC7$v3mR|OJ)*EX2+iehafTQn@4B*$e+oZ;oW;c zjD(H70PK$mr2}l8%PIY^uxS9hPx%bWw}cV{58N4kU+0hyX30D>&voW$f)CFQGZ?^6 zp3NEm`XYasO#gNc{_i>OZ^-@qdoK7dyg}CAZXf?0jD7fTColhak@g?EXVy<6zvHow z{*K2!_B$T?|B$TzpPui(b}jply=?#Fg;;-E&h?-C=YRj{{~zD~QJn5y^GsMjP5cq{ C2fk|n diff --git a/static/img/191115-python-basic-data-types-booleans/header.jpg b/static/img/191115-python-basic-data-types-booleans/header.jpg index f7d4ada941d68d38d89029c876225e5b272c9ced..0a53816e1a4c4f378826a2869dc1f18d7adfb0ef 100644 GIT binary patch literal 58041 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 literal 250662 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 Oefn8H{Wgt8@h<^eRMpC(@gU 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%0AQi?@YQ@ivW3n$4qa( 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 M#{c)ff!|I2KdKdK3;+NC literal 51348 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 diff --git a/static/img/headers/django-materialize.jpg b/static/img/headers/django-materialize.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c96ce07406d9e91ae1c2da2d77b8b7fd80106844 GIT binary patch literal 23240 zcmeFYc|6qL`!_y9WJ&fAQz%==E@Uj(l7uAdBxEQ1ZY)^~A-q!=B_uS-mL+2+LiT-` z5wg#S@nW{$tM_O5e((En|8f6*|J?WE@%tQJIMiGdJ{& z^dU4f5Qri81EFFdy?UYU4=)Ahs}4E-(=`=yYTqp| z@R6FVtWSW9qqFY=7a1pCZ`n}CN3wDeA4u8W(yVYt7GMfj~dPT`(TSDl4nn&&k_)k3`=dAkHUo)7i*@(EB2y(av3 z=W1a6&)c%X=l^aJ=y^@}p2_X=y1xD{=apm>Wv&Q=cl$d(R5QP>|Id5D|E>xDbC4k+ zAu=HfGQR$)NzX|xK!JoH4t^KL~Tm72n|5N^>f&XaWKN|Rt2L7Xg z|7hU#l#FYs67KYK|@P>f{vD+o(=@5G*RH^5IS~xjtg?yCppa=8HD|~Qyz}>w5YIhDJ9m?pWTnx@T?U z@_ATTI6Bs45M{&7NLQgTXaR`&Cp+`PYDYCcR`Y#QQ z?H!$6-95eE`bI{_#wRAHre`qN<)167Yrobv@O!`a4+w|A(eWR-KrH+ZvB1~=rCjWw zTqo%0Xz3XK$VGD^?+F(7|4Fic3-(`f%|dj+faFg(0sj77X#c#@($W4Ybf6@E3jIIJ$-fK3 zpThX>LIpedy9e+#@Rt#6`|r>Gw=2|nFr+w7oq@2>(twMJmK_3vkS>ITo%?p-@^@ne zxo@I-Mq*h;8}2n`TJ&81XD(jp16G}3mf$?zGiB(drN1MhNo!c1DDF=2aC@VlpQ`F*EHtnumlG^8Ul z_;3bESB~h7__2wb-D{yjnBYJnoG?X&yqU$+uOKK~G^Ewxf41_XLjE*^5vULf7ot-E zS~o;Kjb=qlQ6acOwl%d>%2ODY4>{|qN`*Y0#MDzvsgMN3HK9vCP#R*`uTE{pPr9TB zQz{mJg~+!dC00j2I@e}qhp6){Ukn(O(>gn5rU&8re|5scus%iQB~<}Tb9OWCpY^zuo4PTl9aLO{7}mUEo6fT^{jR<|lgJ@yS+KSML}7yc zIuAbl=yR8dPzqBXdw}|k4ynw`hKaeMrWb*bkT%(4M&KnCa-xt5S?2n;E*Jl)N)fVu z>mkDL7)`oidX@?qYD55Xh)keMFZv)-4pgO8Bqx5NSjxepKr*#^j7`&Ur||U7VzAPs z6Er=d1gH%FC+v}vOUYT0#-$z$JWWmG8X_O_l5RDBo$~RPy;_>d76VuF;}S&J}RUa`GE?VQeLA%^lA|m(5;OC99!FYwxb+H zB>7@G`nyUi6;g%TMiBLZhsTRczU@Oop}FcWC9rWjqc^f}DbSbPi=cy1j4Ky7UGH_uMy^nD;pMRZ^oWV7Ayw~m@ zWOF>*Kh!|}OaWWr?kr9-P)?x(Fy*E*85Wa)hxi8$Mny7D-Yj}*KA1Y&NpYQe`>ZEJ z&aa7YP4KiP^Dts*O%@OxL|5Je5TZ_2Vp(5w0p!=0pZB5SV2a1I4RW zA8-ZuIKWaoM!LzCIveZoi3NBWW#osQL72DT7}Wnd#{~_J3KiOnH>kY?po0pz*n>R{ z`}H=ooC-1JwWL%wvWw|{Ce$RM$qL+*`)c)DZA8;ZH(-1DS2P<*3BQ;^8>xfWHrn6j zS@*V6t_q5)w>rh$L_5ZQiLs4=j=yMYRP***v`L^TAfiIz=C!NgO~FOj)G$!2H~14@ zvb>@~KFh$5CUYWhg7)D;g|uCdK4WeC0oYs`O6TaKmzLhi@jhL77UKLYmt#PVBvQzh z^y^*IVyWr1lFD;+7BhAIO`gEQOhm|Lom&YbzP?&qX*^V=6~^8oI%nXG8|@Gh$1B_j zeuLY|h$_=JZO;AC$X4d4b*`5CFz+!HvXl$QnP&)yhVZksLC+;S6RS5)xjy)EX#4W{ zvuFv2q97`S&I%k^(acQkFknz-RO8y8WHIWXyT!Xri|mep$%>(Ueqt_h(s`=wMy%3pw)s9J2(&sl zP(WlklMWf|t)p&C-&6LF5!-hylGukROi$c>CK;A`l7G%9d={9On=;0KSmA2g(^h!(`K6pYc_O$Cjf3fZD121Z8JWtag*xQrgP*Uuk&kNIrD zK5rX}C9=J*ZE!i%>fk=O4%&w<5|DJ}sSJ(gO|rCKxMQwPgqyYfS)aQW z&$M?K3r~r^O@;jTONs!R;`|cbh^Ej6ntkWlse>laGuU1|_eA|PqtJkY++i!Kr^kt3 zF@{I7I4=EN>@yf=7s7Dyq{dk!TQp~AK-&jM1gr40mG-DsT{OMyH0Pjee+F=zu!M+yYQh~_9(V8Fd?*4^WRE@f^FNeV*P z9FMe=Un=&nn;+^1Ky?f~NfTJ72fiYtphI~i9@ixjzg3!s1b*`76Ss-VV%)^X4Yq-x z2PF|I*J7{m-7YBgIA$Wh9ikvilwlI3N&-A3H*bhD*rY%X+qFJ2XXSm??y zgU&XGh_cy`WyLFpw8PvGFI!Z9dNLsIl+n9bN|5G9NtP7X5ztj?+5bog$2?P_QO7$-28P{763uble9>C(b zRX8#aTyG=hQKKJ7lTZD8O61zE30EFh6Ptd$X~(xddMD?fR+{p>gv_~;(KqakNEYus zR}i1A=kd$N$TKPJ!G7h9RQ7<}UZNG|R-7V~)>?nF z&ND})`gr%{Gq&MJQlM}1LBu0*%?KA1PpH}mcb<9eCpAJ!!CNZiCYf|!sOY<;+w7RK z)TUm#>T|s_?eCcigPB{&60O%eFE1&&u4I~?e}hTFouM0*U|JRnS zqeb@$a#eJ{@H7zvZ%3s-1vN$8s1Sx0wsnQgf{T+oT?Kh1v-q$0+$@8(dvDUB-9>$K ztj3EQnUOQk`-fjXS}H@pXDIT5D2+a8!4&On!v;)d5bPdBcCw_=ffqy-e zfp(YW@oc#|E>ohQ*mAK!<+grLjP#b4t@wF56 z14N*tGp@Q5UI%FmtuWT@U2mVlhU$FQM+`=oOy`v6PYT|Q8y+YDC~#ptaX)_e21TOd z&#A2ZVe8B7&3n6|5Ybb%q^kOptvB2XUxXXd!I9BmT)|}OS+YKC*m4E8Gku{h<($v> zHWwyG`zOa~b$-_cC)KzF4X5_LoLP4ejJOi*Z4KzZ);yYhe{Yyu1hU2iq22$8u*Ivy zljw_;){=K?=7k2dos@p!t=rYJR6fg2w1|VN_erEPkVJ$b+Eg?zM|uM$(TZpezzUOI zT}%aaGn@_$c*OR_W#2QQEk>m*lbQT6X$m#J)hDdgv6WO`h0`≪P-|B@`psJE(CuI z-#t5jjqd+}ss00z#vBT)BCt@!KMrO?O!h*N#5(9+W}U4KA{)IQ1nZa6~~i)xklicir%LLt$SP8)IK`1 z*%ihjZU6&%2U>EY=7s15=%zPDOw}$1^l%E z2tW6tw#2zZt1GhxzvVVuo}V_lHhZa3H|UK=M5VXbFv`$;fWB#FaMr-w%vi9fp_^VE zDXpnoesSo=6F=J~*x(xRZm2Gntpkx7egTb>sVxdkY`@-bTw>oAK`Vj?)&KrQ6N_d> zFO`7EMh6*(u31bxFnxmfyz{yQkivSo9j-Fd*?Nm~%8RcuPu=lK4TE%s$i?V7g}U^@ z)})APlpo-Z4s%99XCrTs^EFI9go@bIKEELoc#4JRw-eyA70Xlam)T}iq~Yo*;@EQx zMxAYVO6A$&zn^6K<`2m+hAW_lUO$dvRT+H~mxgx9KY<2oyZ3&lixY zC-Foq4Usqw+wZpU#*M(ZNv3$#S9uPCxWIt0E3>nu{RHyeK$eM#m$>&QYO0m5yG=cS z4M7Qw;Do-3o=4WLrF;xRq$4;q^puf`72YIS%Q9CTF(@s2kv!u~xDBA@Jt>#CmrDmI%I6D0R@~ z#$`mehQDsNo(7$Vr)Wm|ThECXVzX=96b+DkurO_rv+pXjUEmqYQ?0RmJFtNwj(m>_ zQwlehR3;t-9!p_AhM| zzLT5eI36R~bMy^Zoj41N1Zu%T|^IJ$nrP_MbxQhM; z5-^ipvMGofXu6E%d6Lhh5`u4YGC*<9BU-E>>eizj|HwDW4`Mh6dqvVts@|p#JKngf z@*(%O!+O2YLvwYv)i~2Ds0B+cLx1&zZ-lbv1xYDZ=@&1}^Q#yiQ)&!|W}y~6P}Y{q zK;VW0%Xkff-CgBWZSm;G`{=q%+iEYFcTgQEoD_x0798klK$fWW>$tRw3Yq2^>~Djf ziR+KLl;J_g&x5`~|I|W@#@054%{V!x-|0KcNh#7k`XO`%Nr)k*X&^lDVuT0yTV+f0 zHx^v-4fj)++$Zm!xf#+JtXKKn>*VC=SOP9f|4|274ZV~B!`<;^{DVr+An66%^u16s zOhRB@IE_SxVVYcB)0s=`e=N-8bzFOmjo!N?A{nAT6?k7-Vey-4Zn`qw#wZXr#MvnX z#Y5vsdhbJ3x^1EsvMbhkKd(2|Xq zc~V0>(hu+3;lL>(6;U};QABxhof7zhFwF-|Ll{=HO?_G75oPlk2XcrIz?JB`{B2Uy ze)w0T^!S2duXU*uodFdh6i%*bJ;y|d5-m%i&)Bd2<@@ZzIao?hZKX#p z91~}R_&KPp$MtmfPJN-+9x4TfVylX#bw@hkob%(^@(FuJGzW$;X^2de*GG%i8D9b{ zzGgu2>DjGiS<3IUf#dv*&7DUzNACKX2EPk}QVCOywd(a$2&4mVkaW4(36o~p&YyKk z`oLRl^XBWb&hqxxhuJd#ZUn1ZdRiD};MQ_Sc;=-wlSbst#>-bCH?P_(=omD0n;?R1 zzayF*K7_D!3(wn^4E24k=e(>2J$G@)Ww9f6wOFmk>6Zl>Nbz<*F>}Tc`{D z?13;!rgXqYY8B4?;A<}2#(uno%vS8C@swX2^%(|fAax?z>`8QyvP8>{WyWWhH6?Ka zuPIvHn=g4hZQ~Dma**w4>GESP(7lX=ifp6VBAM~RjC;qy4H0kbjMDG2>MRc3ENC6@ zDZ-=HKDKOLE+5cgp+N8fQpcz>SZr=qWItuW2;KDw42Qpvrv7_$PM!EiEK`0AOZbVO zKoqkdlkwI>6PKa(=DAVRK0 z`@mCS=QQ-xO~^&d*GzAYa@DQG-}tfPGJ5%ZM#&iiT9f+1FysV!5@nUP8>s$XI?Ubs z;hjTS0eZ3tA{E?zYBsl_Jrv>L10{(7SFFANAjbB6{^Fg+RFJ@G9UC*+$iy{=nN=uq zYz$3+#(!aw#OVaao;Y*FEHCAZZ;G#f0Ua(ly+8v0*7_#lP{q$ws?E`nYZ$Z4tDq-h zEc~opm5_1p0={1XxD$CP-(U1$uC^X8Ga=_91OECo7AKo(W+E#INl`SYa@lyg5KMZm4)GO&%wV4AjBZ}d*; zd^sB-sM&roab`ibYPzNOtrjIG>|vmsJMXnFj8Eo#{nGemlhW~QM+bd!=``*>IQG>jy~n~fr!q(V>#ZiJKvMOpLQ z8ifa*Q2p;lCepUDAeEi@9nl5-2Hlb+>QRQG`N$Pih>Ix~Wk5*2WlV8EtVfe0ufryX z^8B`an|B0Lk4UTYUG4LB+m|b7e#VcWRY?rs_5so_ao|d7yR0DveM+)^OVY$03^WUr z;E|oPy+N!GTZ?h*_qM;Ut zjIBK2cCAf4c4L|39qlf@nK^B1aIr1J|LE!4Ykl|lsgNs+PeBG=Q#N`O##suK;X69{ zC(|@cqaMjsgeIESE%@fdRRrTdByV@fF@2ip;&+aDfA43R&0!TGj1ZyAEZ)_T?_0V; zj&?m(j5G#Gm;~5TiUViu7hFzh@?_V$>_>eD*U0+OaEAEfqlL1quiO@aVj z*o-(K)d-0oB;)2}^to~8(Rc2ZHaorVpLd8zD)i(E+f!&8W0lpIcZy$2u9DCqznx<%%_V#b{~$^N=d6NOb|_45*Z>Q%59S~9VA48=*~oC zaFhNlm!dFey=!L%@uIRlY)dKtzPQ#Yd&I7UCekjtQXw=yD=VT@PGicNSu9e=WxqkO zX>Nz|*0$e5xo#5hikOqU1L7J3MW5zhMOYm=fi{*A+9JzJ89>)?6RITaRgCbt$cnyG z7#%m|Avr={54`=k*daUO3+x4IE04n3mSK@cIW<^wKbWC25#Z^bskRhl-s zE-SC&AvgBw5v9gzm$JtdjOLR7%1TF4Io1gIysh;ug4~wVEw4>n#wHH%=p< zGsrDk#6A3HZiA3pRr8OEr9``+>DAf3nEknTK_@@V@@8Vzu>oo=^9utrWUrxx-Q>kj zLt9}u1%e?S9Y#3i>r^nYn#-s{RR2;s>z-1p)a~h_E;PVQ7F! z=ALy;lk$V`EbkxL0Qj~$Y)0tp$7q_+nFYJ&2*ypOj?$BZ4hIxz2O${V#65JAoZ~`; zyu*)HZQ>8ayVKOAJdYK~r(sLuu*XP-Ak!%wc-k>4VP7H=UKFX1_j%!pZK!zbeV19{ zk^m-s3zc8xb-S3R8?qb=?*hGR2q6x{`yQ}aBo^Hx=wK~MnZ{3)``-U7=g9N&-OU;M z=SBsYN5Lhxi(*Eqc8n;~;1`|DCsIyjEDK6b{}v|Q#9#I+)F?7N@oAY{;zd!SM8nVQ z59sRS7aEE@W?RNxu&fW-H$xbGwHjCwdy3!LN%r zQ`tmx{qA;Um4HOsxXXZPtY&!LXFb+H+%D)?(n*vohvWC7wXxOSCLeFkoG)#FlpX=M|OyN1%}h!W%Vfd zLt!;WGR5D}4{*VL)wOB_*GO(~UH+xQtg8ezMb86A3vae3Zy0Y6UX@UnqC$*!VZ-Va zrWIVv;xYpWD3*ESr|-0k5%aq zYE;PWq1jFQD%{YP9=K_aG2WAI5%SFHy$71!xggZu>hRl$DE`3(?ZosEF0bPc5RakB zh1E1J^VsZIt;gVb5w3nqjA#R_>Be_bm~k$Hl_m4y5uRk&?a`7%?WZ`s-t*}jt?c#; zB=whsdBJGGjYWXB6x{Spobg=815s-~MlhF0{LB+i7ny!|jQka8p%+z2g`8d`*CT$t z{&(X?lxyTCXphB2{&Ndr_{o@BqO|;U$lPN0C;KjtTnab++%NSZeap%t-H0}yNBHHi zNz~5?%*~Nkb{qFMMC*MxjKZ6saF7txP!=B6uwFjJ%c`_ekS%chj{U_V6epntyFpe& zWl|xIyQe=U5U;vTK8~FE+O_b>Hr+hzMz^-0e%D#eoP(}t>CSr@?rG(+>QOV$P2ZR! z*)dgJslxG>N$Lmh=co|EQpLQh&1j_3JNwWKYfsQH1~Qh7eN2?ccWRdqpV1jGj4NdznhyW_io235v-{ql_Rwxo zvYxmm=Gp4ky_VH?SDmrP(7}didDU0fF5eW&zG1xjksAPaIeJFGFdwzOjq9;vSJ1;s zE6;AU@AZGQUha&Mm97Avzl%Ok|RTbts9 z!c=BMIYr+v$FSeG>>BZJ=8Bigpcj+MYN{7_*=9(?4!fdt*fYV zw5wo3K`9~(4-!q*kzv*E*eh#3~(RBh9 z8culKW#1&{=jfN%CIq{Uh|sefZ>6ejN@^({^%g^tRWG+VvRWMm4xgMeIVbv=#9(** zXUpx!#YcNc)V`TsM93TCX-l$-z-lkvg(?+h@5}1J#Uq9SOxEb$58l4dO%VHIeuwg zm}uEjpQbk#oU+&1vEn4saL4qob3XS?y|68%7d!P8iwCzdNqNg4w4JDY=_u(~*3egR z)jZX^o@XJ&WB#3AjnzmJK?6+3X~U%*lBtkdkd+=obO=#Kq5I;Ch(#it0&~bC6bMid zU_5=o;3pi<0%TAUg3vfiQ_A(DkEzF&2q*N6OFF}2->+c>KLQUGCKE!D?Z=bxwJC~h zXAHQk9xV@~N?^Y*MlrX4e{lf8+YEP`z2Cm|*7sXU*wy+|55F)<{9l2Irw!(%VHEOM~nYWlU{L7^z+8E;DYkc5J z1OZlDWN0}-n%vlIw9G1ETmXZROvYs*;TYCiikGGw7IMFg@3*&}sqXMwwfi7<(y-(~ zO!BLYF))-mKSbgd>p)fwJ>7vhXJj0fyDYKsd72j zC+*nD&G`w(k_#xqi`53Lva@1K+q-S3jG2?Ku_)#Z{JYhewN(jW%u-|R7u^=VBGu56 zlz0h9yirl_;OD=V#T$L2laA;qgH%Y3X}9dO>9SA~{%}dCUNaVpWE=eLKJ!@eVp^6Z z^R=&?q6q~vfiw>jl35e(TMi2%%Gn@@wnez0;x3D>D_&}8=<$KQjp&{1+r!PeeonsX z;(Wn%1>^Y~rZ}lyhQqWFWGx$sABuII+^OB2TEkX88x;-CVq=Rm_?#P&Orvo{Zs1(gM&1Qq-6h?>$awiL~Cc#Tm&^RT_j%|U4RW5x2* zMN_(Mg?YRAn{dZ?H_No}p9Rk=E|*^DX@1aYl|BI9g^Tjy)SC=-M+5(f^td!84|yZsyE zo1mtMeF#M1h+8v%rPT|=L*ur6t{Vu7rVD6&XFG4$QcF6D?xnD{04YQ(k`zuTk3B!i z78~+-+x)z|wS`q}fgPfW#axbHV^!_7JSbWaz$b!1xwxbNdmUc|(fTG*vmzs3I zM7PAxk$u!zxcl)F$?S6~yfcdZUL)+S3w;ml4jwX(rBcKx5Rz#B2s|-xdpO`tVZ-iDG&`h z^5+}%Bs*87UfMnhX7dj7lqda|v+XSxHJ4%fbP}D2oB{JE<;k@qKCF5Za=N@*lL5c_ z^tZaTE|yOWw_5QmD>&u5nf*-vCAo&ThPPimOI0mZU055&>+7YICnt)rl^blQm68Mz z;ABo_YiHbT8jhB1D^p9#GXf{W!`k7h+H;}~r%$Vp%H;&ZpXaP_MnuQR2e`v+W};=J z0kDa&jhMZr&@H4qu3=Or%Wt)KS0T?7p5~K%;wh{k6%f~CXBYLl zS#T*iM(i*PXb27>d=lG7!EqTR{yfleXiU1?!Rr^{kR8LB{VfdE*BK zHCIK2oA#>hffad0q)Z|h?w^c9d@CY3fXNCSY?QwOHz?|`r4kUhCM8DtGf+~8lF_pA zATYYV2naKfIEYwZ6366{$`cA-mh>8X3l2TR(Q(RI!v`8OFx+0 zz14 zhL+`0Qqwp1_YBgRCJJK?(E`z?hyc&7N%w)ZkAT#j(b`3NZA`ymv%12Q?|%H8vaC~Kqw$ny>0nFvWw24vGGKA3(-AKd^u~FZ5(TXv z+VWlYol+;1;X}5DmesALN43VB5o~kHH$xWAHRjA3HKk<8Btp&y%(&SJb#@ThqURAc zFcRnTauB))K0SFSar8D(h2VoK-Vh&M5AQC3ht;&iT3hGb%T3k0fbqAM=NqO%M%O4z zvfwJOCFg+*0*nnjdct?NV|yG%gkOa^bvN=E2Blpnr485LsmPvHm#oPhm1jP$1N}~ACLc_-Xj+3uy7}^0 zmc_9`A}4oIL&v1klUP%dU>Q*l_>J)?UAm`v8aUm3cz0wcu&L4zcyhZTRk1PUt-EkN zk*ptqH?-$Q%Jot=WMv*wlXTWHF<#bD`y!4I59B=bpmHFS5yDHx| z+om6#J;9w!DMv4jdY`a`0+$G1KlWA>Spt>VQ(Uhw2``N8GP*U#iLZ(7(Vgh(H4wnw z{k>$h&H3)Nu5rFuNa>;tdip?6@`z?{_p*%DTB7sdDX5f$eh zM&5_W6;2|1^bC{_eIGufphqs&q&M|aijuinA*;B3UE!WbzRRq>PlZfetS)7S30tPWyFRFLP*KljGAI8~Ur=eBhH= zXsFKmc2oTkqT?8u4m}eYu?%}6q&d-YDN+mlWjtsXj7)7-tKQFLjm*OxdYyB6*Umjl zj=vysNAKv46@eS{k4Q=zMPy7P1PcSi4bm0YlJu%ZeImJWlvT(0urS5eO{-_|6K6^9 zy|YZQfqA}t+TMsMTMDZ(-YZ(X3J($y4Bh)XxrTlGi#_?{!HerRKNW;j z*039fhrRS?BY2j&BN$*0W#ezVhdYPM#z(R*&2#Co7>ZPlDptz(Y0!`)&iTEiz%2AK z;E7-Szp4#!r-oBtlLu7*=tmehqkrVX+japlnXkB}ZKlSaF5@YUQ>C`$TRGcen!&}w zPRM!do(sLZu?3z0pHp^bPa$e}2#`dQxP-ur8YU&8S^x6(Y4s0sj7u^k_a+PE%#CbRMc4%tbYm&ly zJJION!?&YXSEpVnjp(b|zGoQBqRE4FPt)I^Lg2?Pl$^@-x|zX@%T~&Hx%l}RJH5E9 z4*8_Cv19pXo`9M8okYR%WAN}G?slX@HdbY;fj3@B;%43g6NABXuvW2*HPEFh(n3#U5Bmg=NkF*vX+(2$bkL+{tRN#Ug?LJ;1~!@ ziiPD&==t==LQ6Qe3SV{)3M9>03Lfl)UAC+ddGcalp*V zY&_-zCNQ$t*xqyhF>fN6^E#h#De=r2GyiGsfGo&zewm5Mtp3iIZ^wtFR&95Xim#9s z$F{6VX_AkM>0P+8_HF2+!w_xy8aKQ&`Q0?RQ(~fw?NrQV5t4lzV7Q4+m)ciGpF=FY zb+|+s0jl4H+9+QPOryK8SwPqLxcE4HD>*u7UqdWut;ZtjBgoyq&S;O$wq6|jqQaj& zfs$6DLVS(jU@EdX%n`km<)8?HjhBS$NgX5KTHvfew#7*AHFJR^-cPbWM5mxP$f~GT z1Rz|WuGjK)c{h<$^~CDvExh1op<=9S&8yh00te4SY)idTX}^Q_^ICItm~pjnU;DJ7krT?d0cG5B=E@TAmvUa5j?D7`mqA{DS1G$`5)E(K!14 z=nBu(-{G%nyywVku~+7R71?k^emf$n&sP1hTT7T!+E*)gxuA^d!+Q*&}u=wFne1K;gptTtw7x&v-0 zYV<+Cn@8guhs??eQ&M7u=bkaa20s(2L@p*VEPs3H94sVN#d&Ut(f8bRKhit9Hafd) zN*yC*d{jfsJE{i6*0sA9t*~>sakyaH=C?*klNPW zUu4_6A@BcPjBZV!TlT}P!Mg{aiHTcq?IW|5vL$iRR}hBqphs{n(tR{r3;!lX)u-`p zc0ia=MBn@CP86bWv*ew*pKk;gl73C6YZmabS#es=TzQhce`6O1lSX^(&Uo73p(&^q z_E4Vn${Kr3UH5W3o4Uy{nQXGN%Vef6`;l_|?@#J2X7NWW=gf5C#M#*m^t8AQew>zc z%?h(GZgLX+*tPoX!2Rq_u;xn2r5Es~l_{oB53^zuZ=hujDDP?ZO~alWsdG(#>0`22 zzRtM+G~y!g)qd7dkITv(|3;7Ne|X63#Mk-auiH&C^TOW*$_xx>V$H8;GsH1&!$E57 z6PPI@MVKYWR&F=*7Q)-WgRU!br&MZl3+F$_UlsB?oN>$-a65g9!>&ea zpEzf=+xHruaz+1+VCnmz`dY+uhIV8cLJ;PVMu^0xqnGAArgw z9%JDbNN#|MzHfETjE{$pxNiA@&R8R~qaAMzh!IFQuf|u7%_TrA?wG#)Jp3SUMk9;w zvngMVd&-6xJxu^nVK&AJmMDb-)6k6iAq-5=QRnxEFu<+d-sgXjnO1i{@Lf$zs6l3V0RW@FCdk-FH| z9=q^~13qoI+Rk>poaMz-{bU~TY`;D1^_#C7V8aX~feS?XO>~XQb|u@k8P-@C^i%2> zTI0~Xj6)d>%MgYfSGQMt6Lru^O*CKyZoa9c`%od9j%9-`C>yN9^XlEe zv1U0J4F};d>^!nMjF*K#xWz>yy43%=r{A!b6+XSVwN1QAVkAGMFsvi!qUqfxH2H9O zNtb88#o89~h3$OYalW`(pg%7<+V_2@vzo)havIOaz+#nt0b6BTN{&REq|*}C$<>;I z(XGhphqc5Tk+bRm+3(&Xa4h9kPJx zA_(P|D^=%0i@I%4aizMSv9sN3dh@A8POnTqwQs5Bd9K5=e_UK{PYMUe8)IY@ZtH;I)Ks!t7Vkvv6)%&){UzGvi zVgV_KIL$W3S0n@wdeqG!g%SBZx?-09dzTZ@)&avA4YAqOu9SAB1VzQuC<+SP{*z!6 z()So-mxc-Ih@H`d+AmAOlsk-+V=KyO9k8=IjjR+Iyy4QLNU0A$BM|RPk-$~(u>iAC z3db%d$offtK$73UTT7=4DOk##r~D&ONx+pr#XUEa+PxaRN{hlT>bnd z#mh7VQL7`X=z&k|$QoqF11>h;O94L^s=VT+lr@ewAKGxQR5tE}d5fiSg*;4)fu;z@ zcu}kn4~GCSvL(Rq{?OBu@da-1%<`+l!j7%PfuPJu{K+H*U4{0McXcsy?JsU3HMv>| zsF8j+APYV=vTQKHU;esJnFR}DI27%2#S-*r zFD9FPJMmQn!`9~e6jmdHW=L!~3D|bFD59J4`VwVXz~@Y#x$b)=XK#U#-`C5%MGf3! zFe9N&0Jb!XNJ)W-i~I$=E%N~#W-I4x>_&KcK&Nq3~uJS zJ&z@aMwWa@`&#CfUqfwZW7SG31$l5(eYi$pd`*=01fPvNBylQWLfT;hGfElBt0SU# zgOo~vUF~wuQRO!Q?3>@cWd>ExwxR}5vjG(5L#*#q`JdRyG^QF*p6!9MDYA+gR*$2r z#Ek8u`)$5hO4y$53r@?+V)kKz`J#Ogvrr5gJf%?rk_ZVvVzB^kOCUIHO$Ie;Yyq7y^@~IHHA^y% zNfKaZye|z~I}2L6yuNN8!S#R^UH2e=x9g{IEDPySk5 z8ej3^@+FbduJy1n_&$DZq2M{)8Ma`k$_md~QYM9=i}iE~Rsl-SL5#9O&G#0yWPf*1NeY$?q_ zJxXA?CnZ{_Z>?{VBuDsF1Pd7&ab+$wWmhG!fQOi7%Z-Q`QLS+Q1|itilE^EM_- z>whhU+2k~5ij!Q}Q&+o3*NRn-piUTy>%q-kdIv%c7Wob-MG}Ca!uOzQ$AzD8=O#Wp zI;>~6iQQ-bpC5TUiK3U6pG*AXc_nR&|h9=+*iX`%rzB*Jq@w*uCLx&@EEHc!p4c+IUnI8AebiCz zAzQvtZ&SVJA3{r8xMa1~ zuwvrG_JTZsncx`Pw2Ja-*@myirHZ2nfv|dD`@H;l0OEXKCRMlsQd#Q*O$S@SL=!#CVQ|;=lBjZ$)Qd;$mM~Y_!oC=^7jAJ z%(cctnfBqaHlmm}hm}SR+msf=Rt_baPDF!AYGh=mQfX*dO3t1%k_aK$mdqA4j)@#v zG1Fiia~KW73^A;g!!QoR!yNW~diTTo?!Mpl!@KW?=i~Exp5Jx<{`dXAum5#jR*RUb zt{6I|3M>+N*8>{l&DMT7TVHXoiqsqj_xH+!`}UW*m9{fL6wsJApE>g~Qq$(nY%Q|X zYtjzqO1fz$e2E!2{ebr3baL<7J)+h9=dF0xMa-+v1N+WOi&PTnuWvI-AcPQ9o9OOp z`FH6rNWMVdkmL6aJk&cGfsQZr1?P&;EB8OR9L*@JaA;XdbE{)GxhHTNu4L>lYHJq5 z*9*K%YSNwC$G{hem96zkOV}s;vtXE_FM6$zTs~eHcor!=N;@y$q;JH5fCfS?Xz3^o7_<5Ci zYOH}L`U z3qfQPudDt?ty5m1885jA;doDPq$DK%m8N-H0n%MxReln>NdqFn9FHPbRUrk7n(JR- zMO?uRVHKd>e=h9D&g!p}l!_vBRUf1|_+f)uK*acEw664yr?K6`_hl~@VCafVG2NP6 z#Y)0Y>(M2GiWstxW2Db3RDyj$`;%vKI(i$(jz&bpE!e(DBYk<0lcz(ikIkfXJnbmlJ_g^$IOJxD9+cS(^`$r^^26<_j|$Cw;CP zNGv{fhke`fE`-?u5 zv?!Y7vC{K--rs(#Z`fK^_q|^{bwv3czvyXH@Ca4a(enDQ^rWjq4AF?u*8FbU9xzvw z?2rdy#xS~|^ZAnx_@N=^7-bdr6=JG-zPZDIosXVNSTjQM=j5u!Wb!fsNTF&z+DKmL zkg7EUPfDN~9^0c7RQsZkMj-L*%2R%5(6S7?WqTr4dlf4Q0GMRP1)#sw z>1VcSB-U>%1z~b*0Mul<+2s>;45|=6dwZ)rG&!AO8RD86lYR^6;*P?ba6FySW%hi) zsC%QChP{3mY<7&4SRS{&axY*Pq6JO49=sD1 z7BqzjXh}%$1X|5q57mD@)c*6SFi-Mv6a89B8bxc3uDH}zbFL)^CMG)KLxUpJJ}E4B z_^|B~?q?H71JpregIRoy4l5w82FXGzorzEjajfpmO}E*Vq3BTZ$vdj8p-g+8dSARa z3TSXx;ifz|- zRY!edqiBycQM-SEId+`_0_J$zUxUyHaUCG5p(|SnvYkB$>3A`QF11;663NwX7d<{g zt0Eb;YjLxjTm7Xe{2JqVxEvu_z6b3raZuL=U9k8C$AvPG?UO*vs0{1RB*J52?5VH)#qz~icjYS*Av6g$6;H|X_s4!*vXk}bhna#mn# z?qjK_>>q{E2GV2mAuNpcxzP3|F433%M)gj{vB2gn8&R(Ido(O2RN+C6sPuEr(RWkF z8K)bX5_@N5xDiOh8EGHsn$!3Gr)<)Iy~^yfDn=H$6{5OljGh!Dy18OF#0xzKhy3Qv zmakF-y-UnW;ET>1q>J8*RaxKc>Bmx9PsY~cR=N}9Ueo>2%F=M~sl+;TC|X}?$kAwn z%-3_Iz^#o(Mti1)R(GE}$#4(aXq4zGoDHj#1$&0M2^>1ETchL>J%rIK5VQ2-LfxGSs(Z$4$LSHxV zrr*86R+FUX3uhsG{b8S!FR)x8z~!=M07Jl#LY(sQlyp(2ejl$=Zw|?jE69e^qKx-p zRpRcb6RJHWsY7$iUHrCjo8U29W5F<`5~DYL?JNF?^0Z~A-(Z^#OWrgWgz$a}>4>(1 zRxO&185RwHHkC<&!va_-yok}2rX&rd8rU=2dd(o)3*l_ZohdLWTG>K;(mpdq(O2x; zd)rWrxsOUh`f|-Y4^jj5jxI4dA&mA74gwh)}a|GIPuMx9pOG>%UOPxwERB?9{ulw zs1*O0_wu&{VJZIG!2Y*<|8w}4;=hb16&9gmiTJk(J5&ootc~*Do$=TVgMEUH;G_OR zYSUjydiw8oOjRcB5g+UP1oHIfQ(K%ChCMwy+i$uOuJ*PN(dr84LtA&gWq|h51CUzq OE8@y12Fj`WZQ!4VZGQRy literal 0 HcmV?d00001 From 17198468ffe6cfff508be5e2ecedab8e49a15552 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 21 Jul 2020 09:30:26 -0400 Subject: [PATCH 196/302] new flask examples --- .../flask/flask-app-badrequest.markdown | 2 +- .../examples/flask/flask-app-flask.markdown | 92 +++++++++-- .../examples/flask/flask-app-headers.markdown | 2 +- .../flask/flask-app-immutabledict.markdown | 2 +- .../flask/flask-blueprints-blueprint.markdown | 44 ++++-- .../flask-example-projects-code.markdown | 10 ++ .../examples/flask/flask-globals-g.markdown | 97 +++++++++++- .../flask/flask-globals-request.markdown | 119 ++++++++++++--- .../flask/flask-helpers-flash.markdown | 90 ++++++++++- .../flask/flask-helpers-url-for.markdown | 49 ++++-- .../flask-sessions-badsignature.markdown | 102 ++++++++++++- .../flask-templating-render-template.markdown | 143 +++++++++++++++--- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 2 +- .../django-admin-login-material.jpg | Bin 0 -> 103718 bytes ...materialize-css-django-material-admin.html | 6 + 16 files changed, 671 insertions(+), 91 deletions(-) create mode 100644 static/img/200721-django-material-admin/django-admin-login-material.jpg create mode 100644 theme/templates/blog/materialize-css-django-material-admin.html diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 8eab8d041..3cd6aa5f3 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -16,7 +16,7 @@ at runtime when an that accepts POSTs. -These topics are also useful while reading the `BadRequest` examples: +These subjects go along with the `BadRequest` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 599b6e5d0..2f9c9f4cb 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -316,7 +316,69 @@ def create_app(config): ``` -## Example 5 from flask-bookshelf +## Example 5 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / __init__.py**](https://github.com/cburmeister/flask-bones/blob/master/app/./__init__.py) + +```python +# __init__.py +import time + +~~from flask import Flask, g, render_template, request +import arrow +import requests + +from app import config +from app.assets import assets +from app.auth import auth +from app.commands import create_db, drop_db, populate_db, recreate_db +from app.database import db +from app.extensions import lm, travis, mail, migrate, bcrypt, babel, rq, limiter +from app.user import user +from app.utils import url_for_other_page + + +def create_app(config=config.base_config): +~~ app = Flask(__name__) + app.config.from_object(config) + + register_extensions(app) + register_blueprints(app) + register_errorhandlers(app) + register_jinja_env(app) + register_commands(app) + + def get_locale(): + return request.accept_languages.best_match(config.SUPPORTED_LOCALES) + + if babel.locale_selector_func is None: + babel.locale_selector_func = get_locale + + @app.before_request + def before_request(): + g.request_start_time = time.time() + g.request_time = lambda: '%.5fs' % (time.time() - g.request_start_time) + g.pjax = 'X-PJAX' in request.headers + + @app.route('/', methods=['GET']) + def index(): + return render_template('index.html') + + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 6 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -368,7 +430,7 @@ def get_lang_code(endpoint, values): ``` -## Example 6 from flaskex +## Example 7 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -421,7 +483,7 @@ def logout(): ``` -## Example 7 from Flask-HTTPAuth +## Example 8 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -477,7 +539,7 @@ class HTTPAuthTestCase(unittest.TestCase): ``` -## Example 8 from flask-phone-input +## Example 9 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -529,7 +591,7 @@ def index(): ``` -## Example 9 from flaskSaaS +## Example 10 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -578,7 +640,7 @@ from app.models import User ``` -## Example 10 from Flask-SocketIO +## Example 11 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -689,7 +751,7 @@ if __name__ == '__main__': ``` -## Example 11 from Flask-User +## Example 12 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -772,7 +834,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 12 from Flask-VueJs-Template +## Example 13 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -813,7 +875,7 @@ def index_client(): ``` -## Example 13 from Flasky +## Example 14 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -877,7 +939,7 @@ def create_app(config_name): ``` -## Example 14 from Datadog Flask Example App +## Example 15 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -938,7 +1000,7 @@ def before_request(): ``` -## Example 15 from keras-flask-deploy-webapp +## Example 16 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1002,7 +1064,7 @@ def model_predict(img, model): ``` -## Example 16 from sandman2 +## Example 17 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1083,7 +1145,7 @@ def get_app( ``` -## Example 17 from Science Flask +## Example 18 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -1152,7 +1214,7 @@ def create_celery_app(): ``` -## Example 18 from tedivms-flask +## Example 19 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1281,7 +1343,7 @@ def create_app(extra_config_settings={}): ``` -## Example 19 from trape +## Example 20 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index ca2b56bbb..db6a82c4e 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -18,7 +18,7 @@ from [requests](/flask-globals-request-examples.html) and responses for Flask web applications. -These topics are also useful while reading the `Headers` examples: +You should read up on these subjects along with these `Headers` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index bebe63460..29ee3cd16 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -16,7 +16,7 @@ The `ImmutableDict` class wraps a so that values cannot be modified after initially being set. -These subjects go along with the `ImmutableDict` code examples: +You should read up on these subjects along with these `ImmutableDict` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index daec67197..875a45214 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -272,7 +272,33 @@ def about(): ``` -## Example 4 from flask-bookshelf +## Example 4 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / auth / __init__.py**](https://github.com/cburmeister/flask-bones/blob/master/app/auth/__init__.py) + +```python +# __init__.py +~~from flask import Blueprint + +~~auth = Blueprint('auth', __name__, template_folder='templates') + +from . import views + + + +## ... source file continues with no further Blueprint examples... + +``` + + +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -323,7 +349,7 @@ def create_author(): ``` -## Example 5 from Flask-Bootstrap +## Example 6 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -427,7 +453,7 @@ class Bootstrap(object): ``` -## Example 6 from flask-debugtoolbar +## Example 7 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -497,7 +523,7 @@ class DebugToolbarExtension(object): ``` -## Example 7 from flask-restx +## Example 8 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -549,7 +575,7 @@ def swagger_static(filename): ``` -## Example 8 from Flask-WTF +## Example 9 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -657,7 +683,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 9 from Flask-User +## Example 10 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -764,7 +790,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 10 from Flask-VueJs-Template +## Example 11 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -796,7 +822,7 @@ import os ``` -## Example 11 from Datadog Flask Example App +## Example 12 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -843,7 +869,7 @@ def bp_after_request(response): ``` -## Example 12 from tedivms-flask +## Example 13 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index b657bf175..05d240c49 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -50,6 +50,16 @@ FlaskBB is provided as open source [under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). +### flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + + ### Flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 0824e343f..0d5cd4002 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -219,7 +219,88 @@ from .views import ( ``` -## Example 2 from flask-bookshelf +## Example 2 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / __init__.py**](https://github.com/cburmeister/flask-bones/blob/master/app/./__init__.py) + +```python +# __init__.py +import time + +~~from flask import Flask, g, render_template, request +import arrow +import requests + +from app import config +from app.assets import assets +from app.auth import auth +from app.commands import create_db, drop_db, populate_db, recreate_db +from app.database import db +from app.extensions import lm, travis, mail, migrate, bcrypt, babel, rq, limiter +from app.user import user +from app.utils import url_for_other_page + + +def create_app(config=config.base_config): + app = Flask(__name__) + app.config.from_object(config) + + register_extensions(app) + register_blueprints(app) + register_errorhandlers(app) + register_jinja_env(app) + register_commands(app) + + def get_locale(): + return request.accept_languages.best_match(config.SUPPORTED_LOCALES) + + if babel.locale_selector_func is None: + babel.locale_selector_func = get_locale + + @app.before_request + def before_request(): +~~ g.request_start_time = time.time() +~~ g.request_time = lambda: '%.5fs' % (time.time() - g.request_start_time) +~~ g.pjax = 'X-PJAX' in request.headers + + @app.route('/', methods=['GET']) + def index(): + return render_template('index.html') + + return app + + +def register_commands(app): + for command in [create_db, drop_db, populate_db, recreate_db]: + app.cli.command()(command) + + +def register_extensions(app): + travis.init_app(app) + db.init_app(app) + lm.init_app(app) + mail.init_app(app) + bcrypt.init_app(app) + assets.init_app(app) + babel.init_app(app) + rq.init_app(app) + migrate.init_app(app, db) + limiter.init_app(app) + + +## ... source file continues with no further g examples... + +``` + + +## Example 3 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -329,7 +410,7 @@ app.register_blueprint(admin, url_prefix="//admin") ``` -## Example 3 from flask-debugtoolbar +## Example 4 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -435,7 +516,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 4 from Flask-HTTPAuth +## Example 5 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -591,7 +672,7 @@ class HTTPBasicAuth(HTTPAuth): ``` -## Example 5 from Flask-WTF +## Example 6 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -792,7 +873,7 @@ class CSRFProtect(object): ``` -## Example 6 from Flask-Security-Too +## Example 7 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -912,7 +993,7 @@ def check_and_update_authn_fresh(within, grace, method=None): ``` -## Example 7 from Flask-User +## Example 8 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1009,7 +1090,7 @@ def allow_unconfirmed_email(view_function): ``` -## Example 8 from indico +## Example 9 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1118,7 +1199,7 @@ config = IndicoConfig() ``` -## Example 9 from tedivms-flask +## Example 10 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index b3205cf6e..0fb1acf7e 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -812,7 +812,88 @@ class DeleteReport(MethodView): ``` -## Example 4 from flask-bookshelf +## Example 4 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / __init__.py**](https://github.com/cburmeister/flask-bones/blob/master/app/./__init__.py) + +```python +# __init__.py +import time + +~~from flask import Flask, g, render_template, request +import arrow +import requests + +from app import config +from app.assets import assets +from app.auth import auth +from app.commands import create_db, drop_db, populate_db, recreate_db +from app.database import db +from app.extensions import lm, travis, mail, migrate, bcrypt, babel, rq, limiter +from app.user import user +from app.utils import url_for_other_page + + +def create_app(config=config.base_config): + app = Flask(__name__) + app.config.from_object(config) + + register_extensions(app) + register_blueprints(app) + register_errorhandlers(app) + register_jinja_env(app) + register_commands(app) + + def get_locale(): +~~ return request.accept_languages.best_match(config.SUPPORTED_LOCALES) + + if babel.locale_selector_func is None: + babel.locale_selector_func = get_locale + + @app.before_request + def before_request(): + g.request_start_time = time.time() + g.request_time = lambda: '%.5fs' % (time.time() - g.request_start_time) +~~ g.pjax = 'X-PJAX' in request.headers + + @app.route('/', methods=['GET']) + def index(): + return render_template('index.html') + + return app + + +def register_commands(app): + for command in [create_db, drop_db, populate_db, recreate_db]: + app.cli.command()(command) + + +def register_extensions(app): + travis.init_app(app) + db.init_app(app) + lm.init_app(app) + mail.init_app(app) + bcrypt.init_app(app) + assets.init_app(app) + babel.init_app(app) + rq.init_app(app) + migrate.init_app(app, db) + limiter.init_app(app) + + +## ... source file continues with no further request examples... + +``` + + +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -871,7 +952,7 @@ def create_author(): ``` -## Example 5 from flask-debugtoolbar +## Example 6 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -1018,7 +1099,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 6 from flaskex +## Example 7 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -1113,7 +1194,7 @@ if __name__ == "__main__": ``` -## Example 7 from Flask-HTTPAuth +## Example 8 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -1434,7 +1515,7 @@ class MultiAuth(object): ``` -## Example 8 from flask-login +## Example 9 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -1671,7 +1752,7 @@ def _secret_key(key=None): ``` -## Example 9 from flask-restx +## Example 10 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1779,7 +1860,7 @@ class marshal_with_field(object): ``` -## Example 10 from Flask-WTF +## Example 11 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1937,7 +2018,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 11 from flaskSaaS +## Example 12 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -1988,7 +2069,7 @@ admin.add_view(FileAdmin(path, '/static/', name='Static')) ``` -## Example 12 from Flask-Security-Too +## Example 13 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -2208,7 +2289,7 @@ class ChangePasswordForm(Form, PasswordFormMixin): ``` -## Example 13 from Flask-SocketIO +## Example 14 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -2432,7 +2513,7 @@ class TestSocketIO(unittest.TestCase): ``` -## Example 14 from Flask-User +## Example 15 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -2496,7 +2577,7 @@ def init_translations(babel): ``` -## Example 15 from Flask-VueJs-Template +## Example 16 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -2531,7 +2612,7 @@ def require_auth(func): ``` -## Example 16 from indico +## Example 17 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -2620,7 +2701,7 @@ multipass = IndicoMultipass() ``` -## Example 17 from keras-flask-deploy-webapp +## Example 18 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -2713,7 +2794,7 @@ if __name__ == '__main__': ``` -## Example 18 from newspie +## Example 19 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -2894,7 +2975,7 @@ if __name__ == '__main__': ``` -## Example 19 from sandman2 +## Example 20 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -3095,7 +3176,7 @@ class Service(MethodView): ``` -## Example 20 from Science Flask +## Example 21 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -3202,7 +3283,7 @@ def security_context_processor(): ``` -## Example 21 from tedivms-flask +## Example 22 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -3260,7 +3341,7 @@ def roles_accepted_api(*role_names): ``` -## Example 22 from trape +## Example 23 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index a53c58adb..e8a047b3b 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -385,7 +385,83 @@ def flaskbb_registration_post_processor(user): ``` -## Example 4 from flask-bookshelf +## Example 4 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / user / views.py**](https://github.com/cburmeister/flask-bones/blob/master/app/user/views.py) + +```python +# views.py +~~from flask import request, redirect, url_for, render_template, flash, g +from flask_babel import gettext +from flask_login import login_required +from app.user.models import User +from .forms import EditUserForm + +from ..user import user + + +@user.route('/list', methods=['GET', 'POST']) +@login_required +def list(): + + from app.database import DataTable + datatable = DataTable( + model=User, + columns=[User.remote_addr], + sortable=[User.username, User.email, User.created_ts], + searchable=[User.username, User.email], + filterable=[User.active], + limits=[25, 50, 100], + request=request + ) + + if g.pjax: + return render_template('users.html', datatable=datatable) + + return render_template('list.html', datatable=datatable) + + +@user.route('/edit/', methods=['GET', 'POST']) +@login_required +def edit(id): + user = User.query.filter_by(id=id).first_or_404() + form = EditUserForm(obj=user) + if form.validate_on_submit(): + form.populate_obj(user) + user.update() +~~ flash( + gettext('User {username} edited'.format(username=user.username)), + 'success' + ) + return render_template('edit.html', form=form, user=user) + + +@user.route('/delete/', methods=['GET']) +@login_required +def delete(id): + user = User.query.filter_by(id=id).first_or_404() + user.delete() +~~ flash( + gettext('User {username} deleted').format(username=user.username), + 'success' + ) + return redirect(url_for('.list')) + + + +## ... source file continues with no further flash examples... + +``` + + +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -444,7 +520,7 @@ def create_author(): ``` -## Example 5 from flask_jsondash +## Example 6 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -675,7 +751,7 @@ def clone(c_id): ``` -## Example 6 from flask-login +## Example 7 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -836,7 +912,7 @@ class LoginManager(object): ``` -## Example 7 from Flask-Security-Too +## Example 8 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -956,7 +1032,7 @@ def transform_url(url, qparams=None, **kwargs): ``` -## Example 8 from Flask-User +## Example 9 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1429,7 +1505,7 @@ class UserManager__Views(object): ``` -## Example 9 from indico +## Example 10 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1515,7 +1591,7 @@ class ImportRoleMembersMixin(object): ``` -## Example 10 from tedivms-flask +## Example 11 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index fbb2b5c31..21472d8dc 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -233,7 +233,38 @@ class CustomSelectField(Field): ``` -## Example 4 from Flask-Bootstrap +## Example 4 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / utils.py**](https://github.com/cburmeister/flask-bones/blob/master/app/./utils.py) + +```python +# utils.py +~~from flask import request, url_for + + +def url_for_other_page(**kwargs): + url_for_args = request.args.copy() + if 'pjax' in url_for_args: + url_for_args.pop('_pjax') + for key, value in kwargs.items(): + url_for_args[key] = value +~~ return url_for(request.endpoint, **url_for_args) + + + +## ... source file continues with no further url_for examples... + +``` + + +## Example 5 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -323,7 +354,7 @@ class ConditionalCDN(object): ``` -## Example 5 from flask-debugtoolbar +## Example 6 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -390,7 +421,7 @@ class DebugToolbar(object): ``` -## Example 6 from flask-login +## Example 7 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -490,7 +521,7 @@ def login_user(user, remember=False, duration=None, force=False, fresh=True): ``` -## Example 7 from flask-restx +## Example 8 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -545,7 +576,7 @@ def ui_for(api): ``` -## Example 8 from flaskSaaS +## Example 9 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -686,7 +717,7 @@ def reset(token): ``` -## Example 9 from Flask-Security-Too +## Example 10 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -806,7 +837,7 @@ def get_post_action_redirect(config_key, declared=None): ``` -## Example 10 from Flask-User +## Example 11 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -955,7 +986,7 @@ class EmailManager(object): ``` -## Example 11 from Flasky +## Example 12 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1155,7 +1186,7 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body) ``` -## Example 12 from Datadog Flask Example App +## Example 13 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 2ddacd7f9..7e01300e1 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -215,7 +215,107 @@ class Role(db.Model): ``` -## Example 3 from Flask-Security-Too +## Example 3 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / auth / views.py**](https://github.com/cburmeister/flask-bones/blob/master/app/auth/views.py) + +```python +# views.py +from flask import ( + current_app, request, redirect, url_for, render_template, flash, abort, +) +from flask_babel import gettext +from flask_login import login_user, login_required, logout_user +~~from itsdangerous import URLSafeSerializer, BadSignature +from app.extensions import lm +from app.jobs import send_registration_email +from app.user.models import User +from app.user.forms import RegisterUserForm +from .forms import LoginForm +from ..auth import auth + + +@lm.user_loader +def load_user(id): + return User.get_by_id(int(id)) + + +@auth.route('/login', methods=['GET', 'POST']) +def login(): + form = LoginForm() + if form.validate_on_submit(): + login_user(form.user) + flash( + gettext( + 'You were logged in as {username}'.format( + username=form.user.username + ), + ), + + +## ... source file abbreviated to get to BadSignature examples ... + + + remote_addr=request.remote_addr, + ) + + s = URLSafeSerializer(current_app.secret_key) + token = s.dumps(user.id) + + send_registration_email.queue(user.id, token) + + flash( + gettext( + 'Sent verification email to {email}'.format( + email=user.email + ) + ), + 'success' + ) + return redirect(url_for('index')) + return render_template('register.html', form=form) + + +@auth.route('/verify/', methods=['GET']) +def verify(token): + s = URLSafeSerializer(current_app.secret_key) + try: + id = s.loads(token) +~~ except BadSignature: + abort(404) + + user = User.query.filter_by(id=id).first_or_404() + if user.active: + abort(404) + else: + user.active = True + user.update() + + flash( + gettext( + 'Registered user {username}. Please login to continue.'.format( + username=user.username + ), + ), + 'success' + ) + return redirect(url_for('auth.login')) + + + +## ... source file continues with no further BadSignature examples... + +``` + + +## Example 4 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 113b4ddd4..017dd6631 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -19,7 +19,7 @@ imported, but there are less characters to type when you leave off the `.templating` part. -These topics are also useful while reading the `render_template` examples: +These subjects go along with the `render_template` code examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) @@ -243,7 +243,114 @@ def send_email(recipient, subject, template, **kwargs): ``` -## Example 4 from flask-bookshelf +## Example 4 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / __init__.py**](https://github.com/cburmeister/flask-bones/blob/master/app/./__init__.py) + +```python +# __init__.py +import time + +~~from flask import Flask, g, render_template, request +import arrow +import requests + +from app import config +from app.assets import assets +from app.auth import auth +from app.commands import create_db, drop_db, populate_db, recreate_db +from app.database import db +from app.extensions import lm, travis, mail, migrate, bcrypt, babel, rq, limiter +from app.user import user +from app.utils import url_for_other_page + + +def create_app(config=config.base_config): + app = Flask(__name__) + app.config.from_object(config) + + register_extensions(app) + register_blueprints(app) + register_errorhandlers(app) + register_jinja_env(app) + register_commands(app) + + def get_locale(): + return request.accept_languages.best_match(config.SUPPORTED_LOCALES) + + if babel.locale_selector_func is None: + babel.locale_selector_func = get_locale + + @app.before_request + def before_request(): + g.request_start_time = time.time() + g.request_time = lambda: '%.5fs' % (time.time() - g.request_start_time) + g.pjax = 'X-PJAX' in request.headers + + @app.route('/', methods=['GET']) + def index(): +~~ return render_template('index.html') + + return app + + +def register_commands(app): + for command in [create_db, drop_db, populate_db, recreate_db]: + app.cli.command()(command) + + +def register_extensions(app): + travis.init_app(app) + db.init_app(app) + lm.init_app(app) + mail.init_app(app) + bcrypt.init_app(app) + assets.init_app(app) + babel.init_app(app) + rq.init_app(app) + migrate.init_app(app, db) + limiter.init_app(app) + + +def register_blueprints(app): + app.register_blueprint(user, url_prefix='/user') + app.register_blueprint(auth) + + +def register_errorhandlers(app): + + def render_error(e): +~~ return render_template('errors/%s.html' % e.code), e.code + + for e in [ + requests.codes.INTERNAL_SERVER_ERROR, + requests.codes.NOT_FOUND, + requests.codes.UNAUTHORIZED, + ]: + app.errorhandler(e)(render_error) + + +def register_jinja_env(app): + app.jinja_env.globals.update({ + 'timeago': lambda x: arrow.get(x).humanize(), + 'url_for_other_page': url_for_other_page, + }) + + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -347,7 +454,7 @@ app.register_blueprint(admin, url_prefix="//admin") ``` -## Example 5 from flaskex +## Example 6 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -442,7 +549,7 @@ if __name__ == "__main__": ``` -## Example 6 from flask_jsondash +## Example 7 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -585,7 +692,7 @@ def update(c_id): ``` -## Example 7 from flask-phone-input +## Example 8 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -643,7 +750,7 @@ def show_phone(): ``` -## Example 8 from flask-restx +## Example 9 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -698,7 +805,7 @@ def ui_for(api): ``` -## Example 9 from flaskSaaS +## Example 10 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -901,7 +1008,7 @@ def paySuccess(): ``` -## Example 10 from Flask-Security-Too +## Example 11 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -1011,7 +1118,7 @@ from .forms import ( ``` -## Example 11 from Flask-SocketIO +## Example 12 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -1087,7 +1194,7 @@ def get_session(): ``` -## Example 12 from Flask-User +## Example 13 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1179,7 +1286,7 @@ class EmailManager(object): ``` -## Example 13 from Flasky +## Example 14 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1219,7 +1326,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 14 from Datadog Flask Example App +## Example 15 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1321,7 +1428,7 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 15 from indico +## Example 16 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1351,7 +1458,7 @@ class MathjaxMixin(object): ``` -## Example 16 from keras-flask-deploy-webapp +## Example 17 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1442,7 +1549,7 @@ if __name__ == '__main__': ``` -## Example 17 from newspie +## Example 18 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1597,7 +1704,7 @@ if __name__ == '__main__': ``` -## Example 18 from Science Flask +## Example 19 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -1885,7 +1992,7 @@ def static_from_root(): ``` -## Example 19 from tedivms-flask +## Example 20 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1988,7 +2095,7 @@ def init_error_handlers(app): ``` -## Example 20 from trape +## Example 21 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 882f5e562..0a67d4938 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -15,7 +15,7 @@ which is useful for checking if an HTTP method is valid by comparing it against the items in this set. -These topics are also useful while reading the `http_method_funcs` examples: +These subjects go along with the `http_method_funcs` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 3bf523565..6e94fffc5 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -15,7 +15,7 @@ that determines the methods, such as GET, POST, PUT, etc, that a view defines. -These topics are also useful while reading the `MethodView` examples: +You should read up on these subjects along with these `MethodView` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/static/img/200721-django-material-admin/django-admin-login-material.jpg b/static/img/200721-django-material-admin/django-admin-login-material.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca68484b4f44038c6fca754366ce427022cd49c5 GIT binary patch literal 103718 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 Programming +Web development +Django +Web design +CSS \ No newline at end of file From f3536d2efa6061da6317ef53c51f6e23ab97b226 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 24 Jul 2020 07:01:48 -0400 Subject: [PATCH 197/302] adding new sqlalchemy examples --- .../django-extensions-plug-ins.markdown | 4 +- .../flask-example-projects-code.markdown | 10 ++ .../sqlalchemy-engine-engine.markdown | 115 +++++++++++- .../sqlalchemy-engine-url-make-url.markdown | 114 +++++++++++- .../sqlalchemy-example-projects-code.markdown | 10 ++ .../sqlalchemy-exc-integrityerror.markdown | 116 +++++++++++- .../sqlalchemy-extensions-plug-ins.markdown | 13 ++ ...-attributes-instrumentedattribute.markdown | 52 ++++++ ...emy-orm-properties-columnproperty.markdown | 165 ++++++++++++++++++ .../sqlalchemy-orm-util-identity-key.markdown | 120 +++++++++++++ .../sqlalchemy-pool-nullpool.markdown | 2 +- .../sqlalchemy-pool-staticpool.markdown | 2 +- ...sqlalchemy-schema-checkconstraint.markdown | 2 +- .../sqlalchemy-schema-column.markdown | 2 +- .../sqlalchemy-schema-createindex.markdown | 2 +- .../sqlalchemy-schema-createtable.markdown | 2 +- .../sqlalchemy-schema-ddlelement.markdown | 2 +- .../sqlalchemy-schema-foreignkey.markdown | 2 +- ...chemy-schema-foreignkeyconstraint.markdown | 2 +- ...chemy-schema-primarykeyconstraint.markdown | 2 +- .../sqlalchemy-schema-table.markdown | 2 +- .../sqlalchemy-sql-clauseelement.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-column.markdown | 2 +- ...lchemy-sql-elements-columnelement.markdown | 2 +- .../sqlalchemy-sql-elements-label.markdown | 2 +- ...hemy-sql-expression-clauseelement.markdown | 2 +- ...chemy-sql-expression-columnclause.markdown | 2 +- ...hemy-sql-expression-columnelement.markdown | 2 +- ...alchemy-sql-expression-executable.markdown | 2 +- ...my-sql-expression-functionelement.markdown | 2 +- ...my-sql-expression-unaryexpression.markdown | 2 +- .../sqlalchemy-sql-expression.markdown | 2 +- .../sqlalchemy-sql-extract.markdown | 2 +- ...emy-sql-functions-functionelement.markdown | 2 +- ...emy-sql-functions-genericfunction.markdown | 2 +- .../sqlalchemy-sql-functions.markdown | 2 +- .../sqlalchemy-sql-naming-conv.markdown | 2 +- .../sqlalchemy-sql-operators.markdown | 2 +- .../sqlalchemy-sql-schema-column.markdown | 2 +- .../sqlalchemy-sql-schema-schemaitem.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-schema.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-select.markdown | 2 +- .../sqlalchemy-sql-sqltypes-nulltype.markdown | 2 +- .../sqlalchemy-sql-sqltypes.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-table.markdown | 2 +- ...sqlalchemy-sql-util-clauseadapter.markdown | 2 +- .../sqlalchemy-sql-visitors-traverse.markdown | 2 +- .../sqlalchemy-types-boolean.markdown | 2 +- .../sqlalchemy/sqlalchemy-types-enum.markdown | 2 +- .../sqlalchemy-types-integer.markdown | 2 +- .../sqlalchemy-types-nulltype.markdown | 2 +- .../sqlalchemy-types-string.markdown | 2 +- .../sqlalchemy-types-to-instance.markdown | 2 +- .../sqlalchemy-types-typeengine.markdown | 2 +- .../sqlalchemy-types-userdefinedtype.markdown | 2 +- ...qlalchemy-util-langhelpers-symbol.markdown | 2 +- .../sqlalchemy-util-ordereddict.markdown | 2 +- .../sqlalchemy-util-orderedset.markdown | 2 +- ...qlalchemy-util-set-creation-order.markdown | 2 +- .../sqlalchemy-util-topological.markdown | 2 +- theme/templates/code-examples/sqlalchemy.html | 3 +- 61 files changed, 764 insertions(+), 58 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index da2f727e7..626e23cc5 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -80,14 +80,14 @@ Code from django-angular is shown on: [django-axes](https://github.com/jazzband/django-axes/) ([project documentation](https://django-axes.readthedocs.io/en/latest/) and -[PyPI package information](https://pypi.org/project/django-axes/) +[PyPI package information](https://pypi.org/project/django-axes/)) is a code library for [Django](/django.html) projects to track failed login attempts against a web application. The goal of the project is to make it easier for you to stop people and scripts from hacking your Django-powered website. The code for django-axes is -[open source under the MIT liense](https://github.com/jazzband/django-axes/blob/master/LICENSE) +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) and maintained by the group of developers known as [Jazzband](https://jazzband.co/). diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index 05d240c49..438fc76c6 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -22,6 +22,16 @@ The code is open sourced under the [MIT license](https://github.com/braintree/braintree_flask_example/blob/master/LICENSE). +### CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + + ### Datadog Flask example The [Datadog Flask app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown index d00076add..8c58d9f87 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown @@ -10,7 +10,120 @@ meta: Example code for understanding how to use the Engine class from the sqlalc Engine is a class within the sqlalchemy.engine module of the SQLAlchemy project. -## Example 1 from GINO +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [SQLAlchemy](/sqlalchemy.html) and [Flask](/flask.html). +The application can be used as-is to run CTF events, or the code can be +modified for custom rules on hacking scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / __init__.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/__init__.py) + +```python +# __init__.py +import datetime +import os +import sys +import weakref +from distutils.version import StrictVersion + +import jinja2 +from flask import Flask, Request +from flask_migrate import upgrade +from jinja2 import FileSystemLoader +from jinja2.sandbox import SandboxedEnvironment +from werkzeug.middleware.proxy_fix import ProxyFix +from werkzeug.utils import cached_property + +from CTFd import utils +from CTFd.plugins import init_plugins +from CTFd.utils.crypto import sha256 +from CTFd.utils.initialization import ( + init_events, + init_logs, + init_request_processors, + init_template_filters, + init_template_globals, +) +from CTFd.utils.migrations import create_database, migrations, stamp_latest_revision +from CTFd.utils.sessions import CachingSessionInterface +from CTFd.utils.updates import update_check + +__version__ = "3.0.0b2" + + +class CTFdRequest(Request): + @cached_property + def path(self): + return self.script_root + super(CTFdRequest, self).path + + +## ... source file abbreviated to get to Engine examples ... + + + } + ) + app.jinja_loader = jinja2.ChoiceLoader([app.theme_loader, app.plugin_loader]) + + from CTFd.models import ( # noqa: F401 + db, + Teams, + Solves, + Challenges, + Fails, + Flags, + Tags, + Files, + Tracking, + ) + + url = create_database() + + app.config["SQLALCHEMY_DATABASE_URI"] = str(url) + + db.init_app(app) + + migrations.init_app(app, db) + + if url.drivername.startswith("sqlite"): +~~ from sqlalchemy.engine import Engine + from sqlalchemy import event + +~~ @event.listens_for(Engine, "connect") + def set_sqlite_pragma(dbapi_connection, connection_record): + cursor = dbapi_connection.cursor() + cursor.execute("PRAGMA foreign_keys=ON") + cursor.close() + + db.create_all() + stamp_latest_revision() + else: + upgrade() + + from CTFd.models import ma + + ma.init_app(app) + + app.db = db + app.VERSION = __version__ + + from CTFd.cache import cache + + cache.init_app(app) + app.cache = cache + + reverse_proxy = app.config.get("REVERSE_PROXY") + if reverse_proxy: + + +## ... source file continues with no further Engine examples... + +``` + + +## Example 2 from GINO [GINO](https://github.com/fantix/gino) ([project documentation](https://python-gino.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown index 04551b10e..b01b0801d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown @@ -10,7 +10,117 @@ meta: Python example code that shows how to use the make_url callable from the s make_url is a callable within the sqlalchemy.engine.url module of the SQLAlchemy project. -## Example 1 from flask-sqlalchemy +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [SQLAlchemy](/sqlalchemy.html) and [Flask](/flask.html). +The application can be used as-is to run CTF events, or the code can be +modified for custom rules on hacking scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / tests / helpers.py**](https://github.com/CTFd/CTFd/blob/master/./tests/helpers.py) + +```python +# helpers.py +import datetime +import gc +import random +import string +import uuid +from collections import namedtuple +from unittest.mock import Mock, patch + +import requests +from flask.testing import FlaskClient +~~from sqlalchemy.engine.url import make_url +from sqlalchemy_utils import drop_database +from werkzeug.datastructures import Headers + +from CTFd import create_app +from CTFd.cache import cache, clear_standings +from CTFd.config import TestingConfig +from CTFd.models import ( + Awards, + ChallengeFiles, + Challenges, + Fails, + Files, + Flags, + Hints, + Notifications, + PageFiles, + Pages, + Solves, + Tags, + Teams, + Tokens, + Tracking, + Unlocks, + Users, + + +## ... source file abbreviated to get to make_url examples ... + + + if isinstance(headers, dict): + headers = Headers(headers) + headers.extend(api_key_headers) + kwargs["headers"] = headers + return super(CTFdTestClient, self).open(*args, **kwargs) + + +def create_ctfd( + ctf_name="CTFd", + ctf_description="CTF description", + name="admin", + email="admin@ctfd.io", + password="password", + user_mode="users", + setup=True, + enable_plugins=False, + application_root="/", + config=TestingConfig, +): + if enable_plugins: + config.SAFE_MODE = False + else: + config.SAFE_MODE = True + + config.APPLICATION_ROOT = application_root +~~ url = make_url(config.SQLALCHEMY_DATABASE_URI) + if url.database: + url.database = str(uuid.uuid4()) + config.SQLALCHEMY_DATABASE_URI = str(url) + + app = create_app(config) + app.test_client_class = CTFdTestClient + + if setup: + app = setup_ctfd( + app, + ctf_name=ctf_name, + ctf_description=ctf_description, + name=name, + email=email, + password=password, + user_mode=user_mode, + ) + return app + + +def setup_ctfd( + app, + ctf_name="CTFd", + ctf_description="CTF description", + + +## ... source file continues with no further make_url examples... + +``` + + +## Example 2 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) ([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) and @@ -133,7 +243,7 @@ class _EngineConnector: ``` -## Example 2 from GINO +## Example 3 from GINO [GINO](https://github.com/fantix/gino) ([project documentation](https://python-gino.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown index 1562f416b..3392cc1be 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown @@ -27,6 +27,16 @@ The project is open sourced under the [BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). +# CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [SQLAlchemy](/sqlalchemy.html) and [Flask](/flask.html). +The application can be used as-is to run CTF events, or the code can be +modified for custom rules on hacking scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + + ### indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown index 91984a2ad..46b862797 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown @@ -10,7 +10,119 @@ meta: Example code for understanding how to use the IntegrityError class from th IntegrityError is a class within the sqlalchemy.exc module of the SQLAlchemy project. -## Example 1 from flask-base +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [SQLAlchemy](/sqlalchemy.html) and [Flask](/flask.html). +The application can be used as-is to run CTF events, or the code can be +modified for custom rules on hacking scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / views.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/views.py) + +```python +# views.py +import os + +from flask import Blueprint, abort +from flask import current_app as app +from flask import redirect, render_template, request, send_file, session, url_for +from flask.helpers import safe_join +~~from sqlalchemy.exc import IntegrityError + +from CTFd.cache import cache +from CTFd.constants.config import ( + AccountVisibilityTypes, + ChallengeVisibilityTypes, + ConfigTypes, + RegistrationVisibilityTypes, + ScoreVisibilityTypes, +) +from CTFd.models import ( + Admins, + Files, + Notifications, + Pages, + Teams, + Users, + UserTokens, + db, +) +from CTFd.utils import config, get_config, set_config +from CTFd.utils import user as current_user +from CTFd.utils import validators +from CTFd.utils.config import is_setup +from CTFd.utils.config.pages import get_page + + +## ... source file abbreviated to get to IntegrityError examples ... + + + set_config( + "user_creation_email_subject", DEFAULT_USER_CREATION_EMAIL_SUBJECT + ) + set_config("user_creation_email_body", DEFAULT_USER_CREATION_EMAIL_BODY) + + set_config("password_reset_subject", DEFAULT_PASSWORD_RESET_SUBJECT) + set_config("password_reset_body", DEFAULT_PASSWORD_RESET_BODY) + + set_config( + "password_change_alert_subject", + "Password Change Confirmation for {ctf_name}", + ) + set_config( + "password_change_alert_body", + ( + "Your password for {ctf_name} has been changed.\n\n" + "If you didn't request a password change you can reset your password here: {url}" + ), + ) + + set_config("setup", True) + + try: + db.session.add(admin) + db.session.commit() +~~ except IntegrityError: + db.session.rollback() + + try: + db.session.add(page) + db.session.commit() +~~ except IntegrityError: + db.session.rollback() + + login_user(admin) + + db.session.close() + with app.app_context(): + cache.clear() + + return redirect(url_for("views.static_html")) + return render_template("setup.html", state=serialize(generate_nonce())) + return redirect(url_for("views.static_html")) + + +@views.route("/setup/integrations", methods=["GET", "POST"]) +def integrations(): + if is_admin() or is_setup() is False: + name = request.values.get("name") + state = request.values.get("state") + + try: + state = unserialize(state, max_age=3600) + except (BadSignature, BadTimeSignature): + state = False + except Exception: + + +## ... source file continues with no further IntegrityError examples... + +``` + + +## Example 2 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -144,7 +256,7 @@ def load_user(user_id): ``` -## Example 2 from sqlalchemy-utils +## Example 3 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index 1bf27f607..65d13d9a1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -191,3 +191,16 @@ The wide array of includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +### wtforms-alchemy +[wtforms-alchemy](git@github.com:kvesteri/wtforms-alchemy.git) +([documentation](https://wtforms-alchemy.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/WTForms-Alchemy/)) +is a [WTForms](https://wtforms.readthedocs.io/en/2.2.1/) extension toolkit +for easier creation of [SQLAlchemy](/sqlalchemy.html) model based forms. +While this project primarily focuses on proper form handling, it also +has many good examples of how to use various parts of SQLAlchemy in +its code base. The project is provided as open source under the +[MIT license](https://github.com/kvesteri/wtforms-alchemy/blob/master/LICENSE). + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown index 9cdfe7d04..46b22a0a2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown @@ -184,3 +184,55 @@ class AttrPath(object): ``` + +## Example 3 from WTForms-Alchemy +[wtforms-alchemy](git@github.com:kvesteri/wtforms-alchemy.git) +([documentation](https://wtforms-alchemy.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/WTForms-Alchemy/)) +is a [WTForms](https://wtforms.readthedocs.io/en/2.2.1/) extension toolkit +for easier creation of [SQLAlchemy](/sqlalchemy.html) model based forms. +While this project primarily focuses on proper form handling, it also +has many good examples of how to use various parts of SQLAlchemy in +its code base. The project is provided as open source under the +[MIT license](https://github.com/kvesteri/wtforms-alchemy/blob/master/LICENSE). + +[**WTForms-Alchemy / wtforms_alchemy / validators.py**](https://github.com/kvesteri/wtforms-alchemy/blob/master/wtforms_alchemy/./validators.py) + +```python +# validators.py +from collections.abc import Iterable, Mapping + +import six +from sqlalchemy import Column +~~from sqlalchemy.orm.attributes import InstrumentedAttribute +from wtforms import ValidationError + + +class Unique(object): + field_flags = ('unique', ) + + def __init__(self, column, get_session=None, message=None): + self.column = column + self.message = message + self.get_session = get_session + + @property + def query(self): + self._check_for_session(self.model) + if self.get_session: + return self.get_session().query(self.model) + elif hasattr(self.model, 'query'): + return getattr(self.model, 'query') + else: + raise Exception( + 'Validator requires either get_session or Flask-SQLAlchemy' + ' styled query parameter' + ) + + + +## ... source file continues with no further InstrumentedAttribute examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown index 69885f0a8..9974099bb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown @@ -228,3 +228,168 @@ def get_all_descriptors(expr): ``` + +## Example 2 from WTForms-Alchemy +[wtforms-alchemy](git@github.com:kvesteri/wtforms-alchemy.git) +([documentation](https://wtforms-alchemy.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/WTForms-Alchemy/)) +is a [WTForms](https://wtforms.readthedocs.io/en/2.2.1/) extension toolkit +for easier creation of [SQLAlchemy](/sqlalchemy.html) model based forms. +While this project primarily focuses on proper form handling, it also +has many good examples of how to use various parts of SQLAlchemy in +its code base. The project is provided as open source under the +[MIT license](https://github.com/kvesteri/wtforms-alchemy/blob/master/LICENSE). + +[**WTForms-Alchemy / wtforms_alchemy / generator.py**](https://github.com/kvesteri/wtforms-alchemy/blob/master/wtforms_alchemy/./generator.py) + +```python +# generator.py +import inspect +from collections import OrderedDict +from decimal import Decimal +from enum import Enum + +import six +import sqlalchemy as sa +~~from sqlalchemy.orm.properties import ColumnProperty +from sqlalchemy_utils import types +from wtforms import ( + BooleanField, + Field, + FloatField, + PasswordField, + TextAreaField +) +from wtforms.widgets import CheckboxInput, TextArea +from wtforms_components import ( + ColorField, + DateField, + DateIntervalField, + DateTimeField, + DateTimeIntervalField, + DateTimeLocalField, + DecimalField, + DecimalIntervalField, + EmailField, + IntegerField, + IntIntervalField, + SelectField, + StringField, + TimeField + + +## ... source file abbreviated to get to ColumnProperty examples ... + + + + WIDGET_MAP = OrderedDict(( + (BooleanField, CheckboxInput), + (ColorField, ColorInput), + (DateField, DateInput), + (DateTimeField, DateTimeInput), + (DateTimeLocalField, DateTimeLocalInput), + (DecimalField, NumberInput), + (EmailField, EmailInput), + (FloatField, NumberInput), + (IntegerField, NumberInput), + (TextAreaField, TextArea), + (TimeField, TimeInput), + (StringField, TextInput) + )) + + def __init__(self, form_class): + self.form_class = form_class + self.model_class = self.form_class.Meta.model + self.meta = self.form_class.Meta + self.TYPE_MAP.update(self.form_class.Meta.type_map) + + def create_form(self, form): + attrs = OrderedDict() + for key, property_ in sa.inspect(self.model_class).attrs.items(): +~~ if not isinstance(property_, ColumnProperty): + continue + if self.skip_column_property(property_): + continue + attrs[key] = property_ + + for attr in translated_attributes(self.model_class): + attrs[attr.key] = attr.property + + return self.create_fields(form, self.filter_attributes(attrs)) + + def filter_attributes(self, attrs): + if self.meta.only: + attrs = OrderedDict([ + (key, prop) + for key, prop in map(self.validate_attribute, self.meta.only) + if key + ]) + else: + if self.meta.include: + attrs.update([ + (key, prop) + for key, prop + in map(self.validate_attribute, self.meta.include) + if key + + +## ... source file abbreviated to get to ColumnProperty examples ... + + + + if self.meta.exclude: + for key in self.meta.exclude: + try: + del attrs[key] + except KeyError: + if self.meta.attr_errors: + raise InvalidAttributeException(key) + return attrs + + def validate_attribute(self, attr_name): + try: + attr = getattr(self.model_class, attr_name) + except AttributeError: + try: + translation_class = ( + self.model_class.__translatable__['class'] + ) + attr = getattr(translation_class, attr_name) + except AttributeError: + if self.meta.attr_errors: + raise InvalidAttributeException(attr_name) + else: + return None, None + try: +~~ if not isinstance(attr.property, ColumnProperty): + if self.meta.attr_errors: + raise InvalidAttributeException(attr_name) + else: + return None, None + except AttributeError: + raise AttributeTypeException(attr_name) + return attr_name, attr.property + + def create_fields(self, form, properties): + for key, prop in properties.items(): + column = prop.columns[0] + try: + field = self.create_field(prop, column) + except UnknownTypeException: + if not self.meta.skip_unknown_types: + raise + else: + continue + + if not hasattr(form, key): + setattr(form, key, field) + + def skip_column_property(self, column_property): + if column_property._is_polymorphic_discriminator: + + +## ... source file continues with no further ColumnProperty examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown new file mode 100644 index 000000000..5f73f741f --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown @@ -0,0 +1,120 @@ +title: sqlalchemy.orm.util identity_key Example Code +category: page +slug: sqlalchemy-orm-util-identity-key-examples +sortorder: 500031087 +toc: False +sidebartitle: sqlalchemy.orm.util identity_key +meta: Python example code that shows how to use the identity_key callable from the sqlalchemy.orm.util module of the SQLAlchemy project. + + +identity_key is a callable within the sqlalchemy.orm.util module of the SQLAlchemy project. + + +## Example 1 from WTForms-Alchemy +[wtforms-alchemy](git@github.com:kvesteri/wtforms-alchemy.git) +([documentation](https://wtforms-alchemy.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/WTForms-Alchemy/)) +is a [WTForms](https://wtforms.readthedocs.io/en/2.2.1/) extension toolkit +for easier creation of [SQLAlchemy](/sqlalchemy.html) model based forms. +While this project primarily focuses on proper form handling, it also +has many good examples of how to use various parts of SQLAlchemy in +its code base. The project is provided as open source under the +[MIT license](https://github.com/kvesteri/wtforms-alchemy/blob/master/LICENSE). + +[**WTForms-Alchemy / wtforms_alchemy / fields.py**](https://github.com/kvesteri/wtforms-alchemy/blob/master/wtforms_alchemy/./fields.py) + +```python +# fields.py +from __future__ import unicode_literals + +import operator +from itertools import groupby + +import six +~~from sqlalchemy.orm.util import identity_key +from sqlalchemy_utils import Country, i18n, PhoneNumber +from sqlalchemy_utils.primitives import WeekDay, WeekDays +from wtforms import widgets +from wtforms.compat import string_types, text_type +from wtforms.fields import FieldList, FormField, SelectFieldBase +from wtforms.validators import ValidationError +from wtforms.widgets import CheckboxInput, ListWidget +from wtforms_components import SelectField, SelectMultipleField +from wtforms_components.fields.html5 import StringField +from wtforms_components.widgets import SelectWidget, TelInput + +from .utils import find_entity + +try: + from wtforms.utils import unset_value as _unset_value +except ImportError: + from wtforms.fields import _unset_value + + +class SkipOperation(Exception): + pass + + +class ModelFormField(FormField): + + +## ... source file abbreviated to get to identity_key examples ... + + + + def _set_data(self, data): + self._data = data + self._formdata = None + + data = property(_get_data, _set_data) + + def iter_choices(self): + for pk, obj in self._get_object_list(): + yield (pk, self.get_label(obj), obj in self.data) + + def process_formdata(self, valuelist): + self._formdata = set(valuelist) + + def pre_validate(self, form): + if self._invalid_formdata: + raise ValidationError(self.gettext('Not a valid choice')) + elif self.data: + obj_list = list(x[1] for x in self._get_object_list()) + for v in self.data: + if v not in obj_list: + raise ValidationError(self.gettext('Not a valid choice')) + + +def get_pk_from_identity(obj): +~~ cls, key = identity_key(instance=obj)[0:2] + return ':'.join(text_type(x) for x in key) + + +class GroupedQuerySelectField(SelectField): + widget = SelectWidget() + + def __init__( + self, + label=None, + validators=None, + query_factory=None, + get_pk=None, + get_label=None, + get_group=None, + allow_blank=False, + blank_text='', + blank_value='__None', + **kwargs + ): + super(GroupedQuerySelectField, self).__init__( + label, + validators, + coerce=lambda x: x, + **kwargs + + +## ... source file continues with no further identity_key examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown index 00f63bc8f..dbc4392b1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.pool NullPool Example Code category: page slug: sqlalchemy-pool-nullpool-examples -sortorder: 500031087 +sortorder: 500031088 toc: False sidebartitle: sqlalchemy.pool NullPool meta: Example code for understanding how to use the NullPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown index a427fbcc7..a594f0af3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.pool StaticPool Example Code category: page slug: sqlalchemy-pool-staticpool-examples -sortorder: 500031088 +sortorder: 500031089 toc: False sidebartitle: sqlalchemy.pool StaticPool meta: Example code for understanding how to use the StaticPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown index 2f4f885a9..6c09906fe 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CheckConstraint Example Code category: page slug: sqlalchemy-schema-checkconstraint-examples -sortorder: 500031089 +sortorder: 500031090 toc: False sidebartitle: sqlalchemy.schema CheckConstraint meta: Example code for understanding how to use the CheckConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown index 4bface7d5..ab6a33c23 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Column Example Code category: page slug: sqlalchemy-schema-column-examples -sortorder: 500031090 +sortorder: 500031091 toc: False sidebartitle: sqlalchemy.schema Column meta: Example code for understanding how to use the Column class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown index 5029af79a..c115b2a13 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CreateIndex Example Code category: page slug: sqlalchemy-schema-createindex-examples -sortorder: 500031091 +sortorder: 500031092 toc: False sidebartitle: sqlalchemy.schema CreateIndex meta: Example code for understanding how to use the CreateIndex class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown index 458586fff..50c1b74c8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CreateTable Example Code category: page slug: sqlalchemy-schema-createtable-examples -sortorder: 500031092 +sortorder: 500031093 toc: False sidebartitle: sqlalchemy.schema CreateTable meta: Example code for understanding how to use the CreateTable class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown index 9ccfd1ea5..972bbca60 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema DDLElement Example Code category: page slug: sqlalchemy-schema-ddlelement-examples -sortorder: 500031093 +sortorder: 500031094 toc: False sidebartitle: sqlalchemy.schema DDLElement meta: Example code for understanding how to use the DDLElement class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown index 7d154cacf..85806f1a6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema ForeignKey Example Code category: page slug: sqlalchemy-schema-foreignkey-examples -sortorder: 500031094 +sortorder: 500031095 toc: False sidebartitle: sqlalchemy.schema ForeignKey meta: Example code for understanding how to use the ForeignKey class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown index 491711f24..9625b1e09 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema ForeignKeyConstraint Example Code category: page slug: sqlalchemy-schema-foreignkeyconstraint-examples -sortorder: 500031095 +sortorder: 500031096 toc: False sidebartitle: sqlalchemy.schema ForeignKeyConstraint meta: Example code for understanding how to use the ForeignKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown index 3108acf8b..384430ed7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema PrimaryKeyConstraint Example Code category: page slug: sqlalchemy-schema-primarykeyconstraint-examples -sortorder: 500031096 +sortorder: 500031097 toc: False sidebartitle: sqlalchemy.schema PrimaryKeyConstraint meta: Example code for understanding how to use the PrimaryKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown index 568c40f44..1fd03be8d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Table Example Code category: page slug: sqlalchemy-schema-table-examples -sortorder: 500031097 +sortorder: 500031098 toc: False sidebartitle: sqlalchemy.schema Table meta: Example code for understanding how to use the Table class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown index 65004a42d..22f1338b6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql ClauseElement Example Code category: page slug: sqlalchemy-sql-clauseelement-examples -sortorder: 500031098 +sortorder: 500031099 toc: False sidebartitle: sqlalchemy.sql ClauseElement meta: Example code for understanding how to use the ClauseElement class from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown index 9259fd646..36ee12c23 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql column Example Code category: page slug: sqlalchemy-sql-column-examples -sortorder: 500031099 +sortorder: 500031100 toc: False sidebartitle: sqlalchemy.sql column meta: Python example code that shows how to use the column callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown index 539f8420f..8872c90ec 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.elements ColumnElement Example Code category: page slug: sqlalchemy-sql-elements-columnelement-examples -sortorder: 500031108 +sortorder: 500031109 toc: False sidebartitle: sqlalchemy.sql.elements ColumnElement meta: Example code for understanding how to use the ColumnElement class from the sqlalchemy.sql.elements module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown index 112c524ed..b6ac898cd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.elements Label Example Code category: page slug: sqlalchemy-sql-elements-label-examples -sortorder: 500031109 +sortorder: 500031110 toc: False sidebartitle: sqlalchemy.sql.elements Label meta: Example code for understanding how to use the Label class from the sqlalchemy.sql.elements module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown index d63891ca3..02d9d0722 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ClauseElement Example Code category: page slug: sqlalchemy-sql-expression-clauseelement-examples -sortorder: 500031110 +sortorder: 500031111 toc: False sidebartitle: sqlalchemy.sql.expression ClauseElement meta: Example code for understanding how to use the ClauseElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown index 0a667ca2c..c6acaf636 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ColumnClause Example Code category: page slug: sqlalchemy-sql-expression-columnclause-examples -sortorder: 500031111 +sortorder: 500031112 toc: False sidebartitle: sqlalchemy.sql.expression ColumnClause meta: Example code for understanding how to use the ColumnClause class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown index e929e48c8..95e07659a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ColumnElement Example Code category: page slug: sqlalchemy-sql-expression-columnelement-examples -sortorder: 500031112 +sortorder: 500031113 toc: False sidebartitle: sqlalchemy.sql.expression ColumnElement meta: Example code for understanding how to use the ColumnElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown index 3d850fa5e..4b7af7e7d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression Executable Example Code category: page slug: sqlalchemy-sql-expression-executable-examples -sortorder: 500031113 +sortorder: 500031114 toc: False sidebartitle: sqlalchemy.sql.expression Executable meta: Example code for understanding how to use the Executable class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown index 6b26eb7c9..04b5e6cfd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression FunctionElement Example Code category: page slug: sqlalchemy-sql-expression-functionelement-examples -sortorder: 500031114 +sortorder: 500031115 toc: False sidebartitle: sqlalchemy.sql.expression FunctionElement meta: Example code for understanding how to use the FunctionElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown index da4c138a5..88a74b85d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression UnaryExpression Example Code category: page slug: sqlalchemy-sql-expression-unaryexpression-examples -sortorder: 500031115 +sortorder: 500031116 toc: False sidebartitle: sqlalchemy.sql.expression UnaryExpression meta: Example code for understanding how to use the UnaryExpression class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown index f1903b80b..bf0c05d1a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql expression Example Code category: page slug: sqlalchemy-sql-expression-examples -sortorder: 500031100 +sortorder: 500031101 toc: False sidebartitle: sqlalchemy.sql expression meta: Python example code that shows how to use the expression callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown index 86aae7818..6a2904d77 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql extract Example Code category: page slug: sqlalchemy-sql-extract-examples -sortorder: 500031101 +sortorder: 500031102 toc: False sidebartitle: sqlalchemy.sql extract meta: Python example code that shows how to use the extract callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown index a5c761948..75dd752bf 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.functions FunctionElement Example Code category: page slug: sqlalchemy-sql-functions-functionelement-examples -sortorder: 500031116 +sortorder: 500031117 toc: False sidebartitle: sqlalchemy.sql.functions FunctionElement meta: Example code for understanding how to use the FunctionElement class from the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown index cbbea2c6c..92ae4a8d4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.functions GenericFunction Example Code category: page slug: sqlalchemy-sql-functions-genericfunction-examples -sortorder: 500031117 +sortorder: 500031118 toc: False sidebartitle: sqlalchemy.sql.functions GenericFunction meta: Example code for understanding how to use the GenericFunction class from the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown index 8a475f5c5..8a2c3e2d8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql functions Example Code category: page slug: sqlalchemy-sql-functions-examples -sortorder: 500031102 +sortorder: 500031103 toc: False sidebartitle: sqlalchemy.sql functions meta: Python example code that shows how to use the functions callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown index cb85cee69..512c224b6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.naming conv Example Code category: page slug: sqlalchemy-sql-naming-conv-examples -sortorder: 500031118 +sortorder: 500031119 toc: False sidebartitle: sqlalchemy.sql.naming conv meta: Python example code that shows how to use the conv callable from the sqlalchemy.sql.naming module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown index ab6800f57..7b1b44e0a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql operators Example Code category: page slug: sqlalchemy-sql-operators-examples -sortorder: 500031103 +sortorder: 500031104 toc: False sidebartitle: sqlalchemy.sql operators meta: Python example code that shows how to use the operators callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown index a94259598..93df3b4f1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.schema Column Example Code category: page slug: sqlalchemy-sql-schema-column-examples -sortorder: 500031119 +sortorder: 500031120 toc: False sidebartitle: sqlalchemy.sql.schema Column meta: Example code for understanding how to use the Column class from the sqlalchemy.sql.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown index f42dc6700..78fbc3be7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.schema SchemaItem Example Code category: page slug: sqlalchemy-sql-schema-schemaitem-examples -sortorder: 500031120 +sortorder: 500031121 toc: False sidebartitle: sqlalchemy.sql.schema SchemaItem meta: Example code for understanding how to use the SchemaItem class from the sqlalchemy.sql.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown index 07c4f349a..d0869b2db 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql schema Example Code category: page slug: sqlalchemy-sql-schema-examples -sortorder: 500031104 +sortorder: 500031105 toc: False sidebartitle: sqlalchemy.sql schema meta: Python example code that shows how to use the schema callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown index f9ac7847d..1eb126b66 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql select Example Code category: page slug: sqlalchemy-sql-select-examples -sortorder: 500031105 +sortorder: 500031106 toc: False sidebartitle: sqlalchemy.sql select meta: Python example code that shows how to use the select callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown index 544dfc97b..027c06f82 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.sqltypes NullType Example Code category: page slug: sqlalchemy-sql-sqltypes-nulltype-examples -sortorder: 500031121 +sortorder: 500031122 toc: False sidebartitle: sqlalchemy.sql.sqltypes NullType meta: Example code for understanding how to use the NullType class from the sqlalchemy.sql.sqltypes module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown index 9e3d88eb2..63bf8ccb4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql sqltypes Example Code category: page slug: sqlalchemy-sql-sqltypes-examples -sortorder: 500031106 +sortorder: 500031107 toc: False sidebartitle: sqlalchemy.sql sqltypes meta: Python example code that shows how to use the sqltypes callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown index 5a1aa46a1..3336472a5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql table Example Code category: page slug: sqlalchemy-sql-table-examples -sortorder: 500031107 +sortorder: 500031108 toc: False sidebartitle: sqlalchemy.sql table meta: Python example code that shows how to use the table callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown index 9cbd0f5cc..461e0f66e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.util ClauseAdapter Example Code category: page slug: sqlalchemy-sql-util-clauseadapter-examples -sortorder: 500031122 +sortorder: 500031123 toc: False sidebartitle: sqlalchemy.sql.util ClauseAdapter meta: Example code for understanding how to use the ClauseAdapter class from the sqlalchemy.sql.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown index 37518cca5..cf9c98049 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.visitors traverse Example Code category: page slug: sqlalchemy-sql-visitors-traverse-examples -sortorder: 500031123 +sortorder: 500031124 toc: False sidebartitle: sqlalchemy.sql.visitors traverse meta: Python example code that shows how to use the traverse callable from the sqlalchemy.sql.visitors module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown index 381f9c45a..f55075ef1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Boolean Example Code category: page slug: sqlalchemy-types-boolean-examples -sortorder: 500031124 +sortorder: 500031125 toc: False sidebartitle: sqlalchemy.types Boolean meta: Example code for understanding how to use the Boolean class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown index b1330cdae..07cc1d513 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Enum Example Code category: page slug: sqlalchemy-types-enum-examples -sortorder: 500031125 +sortorder: 500031126 toc: False sidebartitle: sqlalchemy.types Enum meta: Example code for understanding how to use the Enum class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown index 5f2fab2e5..adcc73c33 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Integer Example Code category: page slug: sqlalchemy-types-integer-examples -sortorder: 500031126 +sortorder: 500031127 toc: False sidebartitle: sqlalchemy.types Integer meta: Example code for understanding how to use the Integer class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown index 19e93553a..9fe7e75f7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types NULLTYPE Example Code category: page slug: sqlalchemy-types-nulltype-examples -sortorder: 500031127 +sortorder: 500031128 toc: False sidebartitle: sqlalchemy.types NULLTYPE meta: Python example code that shows how to use the NULLTYPE constant from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown index a25f4bf25..bdc9c4146 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types String Example Code category: page slug: sqlalchemy-types-string-examples -sortorder: 500031128 +sortorder: 500031129 toc: False sidebartitle: sqlalchemy.types String meta: Example code for understanding how to use the String class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown index 7dc7adb28..53a32658e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types to_instance Example Code category: page slug: sqlalchemy-types-to-instance-examples -sortorder: 500031131 +sortorder: 500031132 toc: False sidebartitle: sqlalchemy.types to_instance meta: Python example code that shows how to use the to_instance callable from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown index fc10502c0..c28bd8cf5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types TypeEngine Example Code category: page slug: sqlalchemy-types-typeengine-examples -sortorder: 500031129 +sortorder: 500031130 toc: False sidebartitle: sqlalchemy.types TypeEngine meta: Example code for understanding how to use the TypeEngine class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown index 5ae70ea29..b82606737 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types UserDefinedType Example Code category: page slug: sqlalchemy-types-userdefinedtype-examples -sortorder: 500031130 +sortorder: 500031131 toc: False sidebartitle: sqlalchemy.types UserDefinedType meta: Example code for understanding how to use the UserDefinedType class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown index 24f3ce4e0..28cff0f06 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util.langhelpers symbol Example Code category: page slug: sqlalchemy-util-langhelpers-symbol-examples -sortorder: 500031136 +sortorder: 500031137 toc: False sidebartitle: sqlalchemy.util.langhelpers symbol meta: Python example code that shows how to use the symbol callable from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown index 93e4e5be6..11ef6357e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util OrderedDict Example Code category: page slug: sqlalchemy-util-ordereddict-examples -sortorder: 500031132 +sortorder: 500031133 toc: False sidebartitle: sqlalchemy.util OrderedDict meta: Example code for understanding how to use the OrderedDict class from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown index 703918750..955f213dd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util OrderedSet Example Code category: page slug: sqlalchemy-util-orderedset-examples -sortorder: 500031133 +sortorder: 500031134 toc: False sidebartitle: sqlalchemy.util OrderedSet meta: Example code for understanding how to use the OrderedSet class from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown index f4501ee76..92d1de89f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util set_creation_order Example Code category: page slug: sqlalchemy-util-set-creation-order-examples -sortorder: 500031134 +sortorder: 500031135 toc: False sidebartitle: sqlalchemy.util set_creation_order meta: Python example code that shows how to use the set_creation_order callable from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown index f2aee0996..8d8d4e589 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util topological Example Code category: page slug: sqlalchemy-util-topological-examples -sortorder: 500031135 +sortorder: 500031136 toc: False sidebartitle: sqlalchemy.util topological meta: Python example code that shows how to use the topological callable from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/theme/templates/code-examples/sqlalchemy.html b/theme/templates/code-examples/sqlalchemy.html index 450fb3242..cb3166f5e 100644 --- a/theme/templates/code-examples/sqlalchemy.html +++ b/theme/templates/code-examples/sqlalchemy.html @@ -155,7 +155,8 @@

    sqlalchemy.orm.session

    sqlalchemy.orm.util AliasedClass, - AliasedInsp + AliasedInsp, + identity_key

    sqlalchemy.pool NullPool, From 76dfd971e22557d354ad796b66ea9bda93646ea0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 24 Jul 2020 11:50:54 -0400 Subject: [PATCH 198/302] update webhooks with new resources and update changelog --- .../04-web-development/46-webhooks.markdown | 9 +++++++++ content/pages/meta/00-change-log.markdown | 1 + static/img/logos/grafana.jpg | Bin 0 -> 24875 bytes 3 files changed, 10 insertions(+) create mode 100644 static/img/logos/grafana.jpg diff --git a/content/pages/04-web-development/46-webhooks.markdown b/content/pages/04-web-development/46-webhooks.markdown index a50c9f558..06e3b1984 100644 --- a/content/pages/04-web-development/46-webhooks.markdown +++ b/content/pages/04-web-development/46-webhooks.markdown @@ -23,6 +23,15 @@ otherwise independent web applications. ### Webhook resources +* [What's a webhook?](https://sendgrid.com/blog/whats-webhook/) is a high-level + explanation of this concept that also contains some basic security + considerations when using them. + +* [How to Listen for Webhooks with Python](https://blog.bearer.sh/consume-webhooks-with-python/) + has code examples in both [Flask](/flask.html) and [Django](/django.html) + for how to receive an HTTP POST webhook request, as well as how to test + it locally with Ngrok. + * [Should you build a webhooks API?](https://brandur.org/webhooks) * [Webhooks do’s and dont’s: what we learned after integrating +100 APIs](https://restful.io/webhooks-dos-and-dont-s-what-we-learned-after-integrating-100-apis-d567405a3671) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index f21cc1bb8..34b82c08f 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,7 @@ on GitHub. ## 2020 ### July +* Updated [webhooks](/webhooks.html) page with additional resources. * New blog posts: * [Tracking Daily User Data in Django with django-user-visit](/blog/track-daily-user-data-django-user-visit.html) * [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html) diff --git a/static/img/logos/grafana.jpg b/static/img/logos/grafana.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1922fa665b3645cfdc75d56fd75b87a5babe80c GIT binary patch literal 24875 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 m0)G(rgTNmI{vhxNfj Date: Sat, 25 Jul 2020 17:47:00 -0400 Subject: [PATCH 199/302] new flask code examples and cross linking --- .../flask/flask-app-badrequest.markdown | 6 +- .../examples/flask/flask-app-flask.markdown | 89 +++- .../examples/flask/flask-app-headers.markdown | 102 ++++- .../flask/flask-app-immutabledict.markdown | 6 +- .../flask/flask-blueprints-blueprint.markdown | 98 ++++- .../flask/flask-cli-appgroup.markdown | 6 + .../flask/flask-cli-dispatchingapp.markdown | 6 + .../flask/flask-cli-flaskgroup.markdown | 6 + .../flask/flask-cli-pass-script-info.markdown | 6 + .../flask/flask-cli-scriptinfo.markdown | 6 + .../flask/flask-cli-with-appcontext.markdown | 6 + .../flask-ctx-after-this-request.markdown | 4 + .../flask/flask-ctx-has-app-context.markdown | 4 + .../flask-ctx-has-request-context.markdown | 4 + .../flask/flask-globals-current-app.markdown | 106 ++++- .../examples/flask/flask-globals-g.markdown | 4 + .../flask/flask-globals-request.markdown | 141 +++++- .../flask/flask-globals-session.markdown | 135 +++++- .../flask/flask-helpers-flash.markdown | 6 + .../flask-helpers-get-root-path.markdown | 6 + .../flask-helpers-make-response.markdown | 6 + .../flask/flask-helpers-safe-join.markdown | 103 +++++ .../flask/flask-helpers-send-file.markdown | 93 +++- .../flask/flask-helpers-url-for.markdown | 206 ++++++++- .../flask/flask-json-jsonencoder.markdown | 4 +- .../flask/flask-json-jsonify.markdown | 4 +- .../flask-sessions-badsignature.markdown | 6 +- .../flask-sessions-sessioninterface.markdown | 6 +- .../flask-sessions-sessionmixin.markdown | 6 +- ...ask-signals-got-request-exception.markdown | 4 +- .../flask/flask-signals-namespace.markdown | 4 +- ...templating-render-template-string.markdown | 4 +- .../flask-templating-render-template.markdown | 409 +++++++++++++++++- .../flask-views-http-method-funcs.markdown | 8 +- .../flask/flask-views-methodview.markdown | 8 +- .../examples/flask/flask-views-view.markdown | 6 +- theme/static/css/base.css | 2 +- theme/templates/code-examples/flask.html | 1 + 38 files changed, 1486 insertions(+), 141 deletions(-) create mode 100644 content/pages/examples/flask/flask-helpers-safe-join.markdown diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 3cd6aa5f3..656406cf3 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -15,8 +15,12 @@ at runtime when an [invalid POST request is sent to a URL route](https://stackoverflow.com/questions/14105452/what-is-the-cause-of-the-bad-request-error-when-submitting-form-in-flask-applica) that accepts POSTs. +Flask, +Headers, +and ImmutableDict +are several other callables with code examples from the same `flask.app` package. -These subjects go along with the `BadRequest` code examples: +These topics are also useful while reading the `BadRequest` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 2f9c9f4cb..333598654 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -14,8 +14,12 @@ This class acts as a central registry for a significant amount of a Flask application's functionality, including URL rounting, [template configurations](/template-engines.html), and handling view functions. +BadRequest, +Headers, +and ImmutableDict +are several other callables with code examples from the same `flask.app` package. -These subjects go along with the `Flask` code examples: +You should read up on these subjects along with these `Flask` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -75,7 +79,52 @@ def new_checkout(): ``` -## Example 2 from Flask AppBuilder +## Example 2 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / manage.py**](https://github.com/CTFd/CTFd/blob/master/././manage.py) + +```python +# manage.py +~~from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from flask_script import Manager +from flask_migrate import Migrate, MigrateCommand +from CTFd import create_app +from CTFd.utils import get_config as get_config_util, set_config as set_config_util +from CTFd.models import * + +app = create_app() + +manager = Manager(app) +manager.add_command("db", MigrateCommand) + + +def jsenums(): + from CTFd.constants import JS_ENUMS + import json + import os + + path = os.path.join(app.root_path, "themes/core/assets/js/constants.js") + + with open(path, "w+") as f: + for k, v in JS_ENUMS.items(): + f.write("const {} = Object.freeze({});".format(k, json.dumps(v))) + + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 3 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -138,7 +187,7 @@ class OAuthRegistrationRoleTestCase(unittest.TestCase): ``` -## Example 3 from FlaskBB +## Example 4 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -237,7 +286,7 @@ def configure_app(app, config): ``` -## Example 4 from flask-base +## Example 5 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -316,7 +365,7 @@ def create_app(config): ``` -## Example 5 from flask-bones +## Example 6 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -378,7 +427,7 @@ def create_app(config=config.base_config): ``` -## Example 6 from flask-bookshelf +## Example 7 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -430,7 +479,7 @@ def get_lang_code(endpoint, values): ``` -## Example 7 from flaskex +## Example 8 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -483,7 +532,7 @@ def logout(): ``` -## Example 8 from Flask-HTTPAuth +## Example 9 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -539,7 +588,7 @@ class HTTPAuthTestCase(unittest.TestCase): ``` -## Example 9 from flask-phone-input +## Example 10 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -591,7 +640,7 @@ def index(): ``` -## Example 10 from flaskSaaS +## Example 11 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -640,7 +689,7 @@ from app.models import User ``` -## Example 11 from Flask-SocketIO +## Example 12 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -751,7 +800,7 @@ if __name__ == '__main__': ``` -## Example 12 from Flask-User +## Example 13 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -834,7 +883,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 13 from Flask-VueJs-Template +## Example 14 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -875,7 +924,7 @@ def index_client(): ``` -## Example 14 from Flasky +## Example 15 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -939,7 +988,7 @@ def create_app(config_name): ``` -## Example 15 from Datadog Flask Example App +## Example 16 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1000,7 +1049,7 @@ def before_request(): ``` -## Example 16 from keras-flask-deploy-webapp +## Example 17 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1064,7 +1113,7 @@ def model_predict(img, model): ``` -## Example 17 from sandman2 +## Example 18 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1145,7 +1194,7 @@ def get_app( ``` -## Example 18 from Science Flask +## Example 19 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -1214,7 +1263,7 @@ def create_celery_app(): ``` -## Example 19 from tedivms-flask +## Example 20 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1343,7 +1392,7 @@ def create_app(extra_config_settings={}): ``` -## Example 20 from trape +## Example 21 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index db6a82c4e..79b73c775 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -17,6 +17,10 @@ Headers handles the from [requests](/flask-globals-request-examples.html) and responses for Flask web applications. +BadRequest, +Flask, +and ImmutableDict +are several other callables with code examples from the same `flask.app` package. You should read up on these subjects along with these `Headers` examples: @@ -24,7 +28,103 @@ You should read up on these subjects along with these `Headers` examples: * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts -## Example 1 from flask-restx +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / tests / helpers.py**](https://github.com/CTFd/CTFd/blob/master/./tests/helpers.py) + +```python +# helpers.py +import datetime +import gc +import random +import string +import uuid +from collections import namedtuple +from unittest.mock import Mock, patch + +import requests +from flask.testing import FlaskClient +from sqlalchemy.engine.url import make_url +from sqlalchemy_utils import drop_database +~~from werkzeug.datastructures import Headers + +from CTFd import create_app +from CTFd.cache import cache, clear_standings +from CTFd.config import TestingConfig +from CTFd.models import ( + Awards, + ChallengeFiles, + Challenges, + Fails, + Files, + Flags, + Hints, + Notifications, + PageFiles, + Pages, + Solves, + Tags, + Teams, + Tokens, + Tracking, + Unlocks, + Users, +) + +text_type = str +binary_type = bytes + + +FakeRequest = namedtuple("FakeRequest", ["form"]) + + +class CTFdTestClient(FlaskClient): + def open(self, *args, **kwargs): + if kwargs.get("json") is not None: + with self.session_transaction() as sess: +~~ api_key_headers = Headers({"CSRF-Token": sess.get("nonce")}) +~~ headers = kwargs.pop("headers", Headers()) + if isinstance(headers, dict): +~~ headers = Headers(headers) + headers.extend(api_key_headers) + kwargs["headers"] = headers + return super(CTFdTestClient, self).open(*args, **kwargs) + + +def create_ctfd( + ctf_name="CTFd", + ctf_description="CTF description", + name="admin", + email="admin@ctfd.io", + password="password", + user_mode="users", + setup=True, + enable_plugins=False, + application_root="/", + config=TestingConfig, +): + if enable_plugins: + config.SAFE_MODE = False + else: + config.SAFE_MODE = True + + config.APPLICATION_ROOT = application_root + url = make_url(config.SQLALCHEMY_DATABASE_URI) + + +## ... source file continues with no further Headers examples... + +``` + + +## Example 2 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 29ee3cd16..86bed27c1 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -15,8 +15,12 @@ The `ImmutableDict` class wraps a [standard Python dictionary](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) so that values cannot be modified after initially being set. +BadRequest, +Flask, +and Headers +are several other callables with code examples from the same `flask.app` package. -You should read up on these subjects along with these `ImmutableDict` examples: +These topics are also useful while reading the `ImmutableDict` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 875a45214..62a85d083 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -15,7 +15,79 @@ class within the `flask.blueprints` module implements that functionality for Flask [web apps](/web-development.html). -## Example 1 from Flask AppBuilder + +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / auth.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/auth.py) + +```python +# auth.py +import base64 + +import requests +~~from flask import Blueprint +from flask import current_app as app +from flask import redirect, render_template, request, session, url_for +from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired + +from CTFd.cache import clear_team_session, clear_user_session +from CTFd.models import Teams, Users, db +from CTFd.utils import config, email, get_app_config, get_config +from CTFd.utils import user as current_user +from CTFd.utils import validators +from CTFd.utils.config import is_teams_mode +from CTFd.utils.config.integrations import mlc_registration +from CTFd.utils.config.visibility import registration_visible +from CTFd.utils.crypto import verify_password +from CTFd.utils.decorators import ratelimit +from CTFd.utils.decorators.visibility import check_registration_visibility +from CTFd.utils.helpers import error_for, get_errors, markup +from CTFd.utils.logging import log +from CTFd.utils.modes import TEAMS_MODE +from CTFd.utils.security.auth import login_user, logout_user +from CTFd.utils.security.signing import unserialize +from CTFd.utils.validators import ValidationError + +~~auth = Blueprint("auth", __name__) + + +@auth.route("/confirm", methods=["POST", "GET"]) +@auth.route("/confirm/", methods=["POST", "GET"]) +@ratelimit(method="POST", limit=10, interval=60) +def confirm(data=None): + if not get_config("verify_emails"): + return redirect(url_for("challenges.listing")) + + if data and request.method == "GET": + try: + user_email = unserialize(data, max_age=1800) + except (BadTimeSignature, SignatureExpired): + return render_template( + "confirm.html", errors=["Your confirmation link has expired"] + ) + except (BadSignature, TypeError, base64.binascii.Error): + return render_template( + "confirm.html", errors=["Your confirmation token is invalid"] + ) + + user = Users.query.filter_by(email=user_email).first_or_404() + if user.verified: + return redirect(url_for("views.settings")) + + +## ... source file continues with no further Blueprint examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -123,7 +195,7 @@ def dynamic_class_import(class_path): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -227,7 +299,7 @@ def flaskbb_load_blueprints(app): ``` -## Example 3 from flask-base +## Example 4 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -272,7 +344,7 @@ def about(): ``` -## Example 4 from flask-bones +## Example 5 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -298,7 +370,7 @@ from . import views ``` -## Example 5 from flask-bookshelf +## Example 6 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -349,7 +421,7 @@ def create_author(): ``` -## Example 6 from Flask-Bootstrap +## Example 7 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -453,7 +525,7 @@ class Bootstrap(object): ``` -## Example 7 from flask-debugtoolbar +## Example 8 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -523,7 +595,7 @@ class DebugToolbarExtension(object): ``` -## Example 8 from flask-restx +## Example 9 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -575,7 +647,7 @@ def swagger_static(filename): ``` -## Example 9 from Flask-WTF +## Example 10 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -683,7 +755,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 10 from Flask-User +## Example 11 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -790,7 +862,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 11 from Flask-VueJs-Template +## Example 12 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -822,7 +894,7 @@ import os ``` -## Example 12 from Datadog Flask Example App +## Example 13 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -869,7 +941,7 @@ def bp_after_request(response): ``` -## Example 13 from tedivms-flask +## Example 14 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-cli-appgroup.markdown b/content/pages/examples/flask/flask-cli-appgroup.markdown index 36d9fe188..828b6c8e2 100644 --- a/content/pages/examples/flask/flask-cli-appgroup.markdown +++ b/content/pages/examples/flask/flask-cli-appgroup.markdown @@ -14,6 +14,12 @@ works like the class and automatically wraps the functions using [with_appcontext](/flask-cli-with-appcontext-examples.html). +DispatchingApp, +FlaskGroup, +ScriptInfo, +pass_script_info, +and with_appcontext +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown index 30ab2e594..6301decdf 100644 --- a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown +++ b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown @@ -12,6 +12,12 @@ is a class within the `flask.cli` module of the [Flask](/flask.html) project. DispatchingApp is a special application that dispatches to a Flask app if it is imported by name in a background thread. +AppGroup, +FlaskGroup, +ScriptInfo, +pass_script_info, +and with_appcontext +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 4528f6f91..f42799cb7 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -13,6 +13,12 @@ FlaskGroup is a subclass of [AppGroup](/flask-cli-appgroup-examples.html) that provides for loading more commands from a configured Flask app. Generally, only advanced use cases will need to use this class. +AppGroup, +DispatchingApp, +ScriptInfo, +pass_script_info, +and with_appcontext +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) diff --git a/content/pages/examples/flask/flask-cli-pass-script-info.markdown b/content/pages/examples/flask/flask-cli-pass-script-info.markdown index d976323d0..c8516a952 100644 --- a/content/pages/examples/flask/flask-cli-pass-script-info.markdown +++ b/content/pages/examples/flask/flask-cli-pass-script-info.markdown @@ -11,6 +11,12 @@ meta: Python example code that shows how to use the pass_script_info callable fr is simply a decorator around the [ScriptInfo](/flask-cli-scriptinfo-examples.html) class within this same `flask.cli` module. +AppGroup, +DispatchingApp, +FlaskGroup, +ScriptInfo, +and with_appcontext +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index d348c758f..97aae3a5a 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -13,6 +13,12 @@ framework. It is a helper object for Flask application and not usually dealt with directly by developers, instead it is created automatically by the [FlaskGroup](/flask-cli-flaskgroup-examples.html) object. +AppGroup, +DispatchingApp, +FlaskGroup, +pass_script_info, +and with_appcontext +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index c3daf2cc9..70e615275 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -13,6 +13,12 @@ wraps a callback to guarantee it will be called with a script's application context. Any callbacks registered with `app.cli` are wrapped with this function by default. +AppGroup, +DispatchingApp, +FlaskGroup, +ScriptInfo, +and pass_script_info +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index d662d8a8c..636546cb0 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -14,6 +14,10 @@ descriptive of what it does and it particularly useful for modifying response objects, especially when you want a function other than the view function to modify a response. +has_app_context +and +has_request_context +are a couple of other callables within the `flask.ctx` package that also have code examples. ## Example 1 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index ef7e5208a..4742fb9f9 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -14,6 +14,10 @@ but for the [application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/) rather than the request. +after_this_request +and +has_request_context +are a couple of other callables within the `flask.ctx` package that also have code examples. ## Example 1 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index d88ba4585..b639f67eb 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -17,6 +17,10 @@ function as well that works for the [application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/). +after_this_request +and +has_app_context +are a couple of other callables within the `flask.ctx` package that also have code examples. ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 6f7ad9d1d..6e9dd327b 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -19,8 +19,78 @@ You will often see `current_app` imported directly from `flask` instead of `flask.globals`. These imports are equivalent because `flask` is simply importing `current_app` from `flask.globals`. +g, +request, +and session +are several other callables with code examples from the same `flask.globals` package. + +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / migrations / env.py**](https://github.com/CTFd/CTFd/blob/master/./migrations/env.py) -## Example 1 from Flask AppBuilder +```python +# env.py +from __future__ import with_statement + +import logging +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +config = context.config + +fileConfig(config.config_file_name, disable_existing_loggers=False) +logger = logging.getLogger("alembic.env") + +~~from flask import current_app + +config.set_main_option( + "sqlalchemy.url", + str(current_app.extensions["migrate"].db.engine.url).replace("%", "%%"), +) +~~target_metadata = current_app.extensions["migrate"].db.metadata + + + +def run_migrations_offline(): + url = config.get_main_option("sqlalchemy.url") + context.configure(url=url, target_metadata=target_metadata, literal_binds=True) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, "autogenerate", False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info("No changes in schema detected.") + + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + + +## ... source file continues with no further current_app examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -164,7 +234,7 @@ class MenuApiManager(BaseManager): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -307,7 +377,7 @@ class ForgotPassword(MethodView): ``` -## Example 3 from flask-base +## Example 4 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -414,7 +484,7 @@ class User(UserMixin, db.Model): ``` -## Example 4 from flask-bookshelf +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -519,7 +589,7 @@ app.register_blueprint(admin, url_prefix="//admin") ``` -## Example 5 from Flask-Bootstrap +## Example 6 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -643,7 +713,7 @@ class Bootstrap(object): ``` -## Example 6 from flask-debugtoolbar +## Example 7 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -791,7 +861,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 7 from flask_jsondash +## Example 8 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -884,7 +954,7 @@ def local_static(chart_config, static_config): ``` -## Example 8 from flask-login +## Example 9 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -1131,7 +1201,7 @@ def _secret_key(key=None): ``` -## Example 9 from flask-restx +## Example 10 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1388,7 +1458,7 @@ def _clean_header(header): ``` -## Example 10 from flask-sqlalchemy +## Example 11 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) ([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) and @@ -1505,7 +1575,7 @@ def _make_table(db): ``` -## Example 11 from Flask-WTF +## Example 12 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1762,7 +1832,7 @@ def same_origin(current_uri, compare_uri): ``` -## Example 12 from Flask-Security-Too +## Example 13 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -2023,7 +2093,7 @@ _default_config = { ``` -## Example 13 from Flask-User +## Example 14 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -2130,7 +2200,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 14 from Flask-VueJs-Template +## Example 15 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -2171,7 +2241,7 @@ def index_client(): ``` -## Example 15 from Flasky +## Example 16 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -2226,7 +2296,7 @@ def run_migrations_online(): ``` -## Example 16 from indico +## Example 17 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -2287,7 +2357,7 @@ def run_migrations_offline(): ``` -## Example 17 from sandman2 +## Example 18 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2412,7 +2482,7 @@ def register_model(cls, admin=None): ``` -## Example 18 from tedivms-flask +## Example 19 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 0d5cd4002..c14142844 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -15,6 +15,10 @@ of a running [Flask](/flask.html) web app. `g` can also be imported directly from the `flask` module instead of `flask.globals`, so you will often see that shortcut in example code. +current_app, +request, +and session +are several other callables with code examples from the same `flask.globals` package. ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 0fb1acf7e..97cf9cda4 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -20,6 +20,10 @@ from `flask.globals`, even though it is defined within the `globals` module. It's the same import, just less characters to type when you import it from `flask`. +current_app, +g, +and session +are several other callables with code examples from the same `flask.globals` package. ## Example 1 from Braintree Flask app [Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) @@ -111,7 +115,100 @@ if __name__ == '__main__': ``` -## Example 2 from Flask AppBuilder +## Example 2 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / tests / test_themes.py**](https://github.com/CTFd/CTFd/blob/master/./tests/test_themes.py) + +```python +# test_themes.py + +~~from flask import request +from jinja2.sandbox import SecurityError +from werkzeug.test import Client + +from CTFd.utils import get_config +from tests.helpers import create_ctfd, destroy_ctfd, gen_user, login_as_user + + +def test_themes_run_in_sandbox(): + app = create_ctfd() + with app.app_context(): + try: + app.jinja_env.from_string( + "{{ ().__class__.__bases__[0].__subclasses__()[40]('./test_utils.py').read() }}" + ).render() + except SecurityError: + pass + except Exception as e: + raise e + destroy_ctfd(app) + + +def test_themes_cant_access_configpy_attributes(): + app = create_ctfd() + with app.app_context(): + + +## ... source file abbreviated to get to request examples ... + + + r = client.post("/setup", data=data) + assert r.status_code == 302 + assert r.location == "http://localhost/ctf/" + + c = Client(app) + app_iter, status, headers = c.get("/") + headers = dict(headers) + assert status == "302 FOUND" + assert headers["Location"] == "http://localhost/ctf/" + + r = client.get("/challenges") + assert r.status_code == 200 + assert "Challenges" in r.get_data(as_text=True) + + r = client.get("/scoreboard") + assert r.status_code == 200 + assert "Scoreboard" in r.get_data(as_text=True) + destroy_ctfd(app) + + +def test_that_request_path_hijacking_works_properly(): + app = create_ctfd(setup=False, application_root="/ctf") + assert app.request_class.__name__ == "CTFdRequest" + with app.app_context(): + with app.test_request_context("/challenges"): +~~ assert request.path == "/ctf/challenges" + destroy_ctfd(app) + + app = create_ctfd() + assert app.request_class.__name__ == "CTFdRequest" + with app.app_context(): + with app.test_request_context("/challenges"): +~~ assert request.path == "/challenges" + + from flask import Flask + + test_app = Flask("test") + assert test_app.request_class.__name__ == "Request" + with test_app.test_request_context("/challenges"): +~~ assert request.path == "/challenges" + destroy_ctfd(app) + + + +## ... source file continues with no further request examples... + +``` + + +## Example 3 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -209,7 +306,7 @@ def get_filter_args(filters): ``` -## Example 3 from FlaskBB +## Example 4 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -812,7 +909,7 @@ class DeleteReport(MethodView): ``` -## Example 4 from flask-bones +## Example 5 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -893,7 +990,7 @@ def register_extensions(app): ``` -## Example 5 from flask-bookshelf +## Example 6 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -952,7 +1049,7 @@ def create_author(): ``` -## Example 6 from flask-debugtoolbar +## Example 7 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -1099,7 +1196,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 7 from flaskex +## Example 8 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -1194,7 +1291,7 @@ if __name__ == "__main__": ``` -## Example 8 from Flask-HTTPAuth +## Example 9 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -1515,7 +1612,7 @@ class MultiAuth(object): ``` -## Example 9 from flask-login +## Example 10 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -1752,7 +1849,7 @@ def _secret_key(key=None): ``` -## Example 10 from flask-restx +## Example 11 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1860,7 +1957,7 @@ class marshal_with_field(object): ``` -## Example 11 from Flask-WTF +## Example 12 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -2018,7 +2115,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 12 from flaskSaaS +## Example 13 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -2069,7 +2166,7 @@ admin.add_view(FileAdmin(path, '/static/', name='Static')) ``` -## Example 13 from Flask-Security-Too +## Example 14 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -2289,7 +2386,7 @@ class ChangePasswordForm(Form, PasswordFormMixin): ``` -## Example 14 from Flask-SocketIO +## Example 15 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -2513,7 +2610,7 @@ class TestSocketIO(unittest.TestCase): ``` -## Example 15 from Flask-User +## Example 16 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -2577,7 +2674,7 @@ def init_translations(babel): ``` -## Example 16 from Flask-VueJs-Template +## Example 17 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -2612,7 +2709,7 @@ def require_auth(func): ``` -## Example 17 from indico +## Example 18 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -2701,7 +2798,7 @@ multipass = IndicoMultipass() ``` -## Example 18 from keras-flask-deploy-webapp +## Example 19 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -2794,7 +2891,7 @@ if __name__ == '__main__': ``` -## Example 19 from newspie +## Example 20 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -2975,7 +3072,7 @@ if __name__ == '__main__': ``` -## Example 20 from sandman2 +## Example 21 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -3176,7 +3273,7 @@ class Service(MethodView): ``` -## Example 21 from Science Flask +## Example 22 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -3283,7 +3380,7 @@ def security_context_processor(): ``` -## Example 22 from tedivms-flask +## Example 23 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -3341,7 +3438,7 @@ def roles_accepted_api(*role_names): ``` -## Example 23 from trape +## Example 24 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 6960f013f..9f8ee050c 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -20,8 +20,117 @@ from `flask.globals`, even though it is defined within the `globals` module. It's the same function that is imported, but it's less characters to type when you leave off the `.globals` part. +current_app, +g, +and request +are several other callables with code examples from the same `flask.globals` package. + +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / auth.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/auth.py) -## Example 1 from Flask AppBuilder +```python +# auth.py +import base64 + +import requests +from flask import Blueprint +from flask import current_app as app +~~from flask import redirect, render_template, request, session, url_for +from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired + +from CTFd.cache import clear_team_session, clear_user_session +from CTFd.models import Teams, Users, db +from CTFd.utils import config, email, get_app_config, get_config +from CTFd.utils import user as current_user +from CTFd.utils import validators +from CTFd.utils.config import is_teams_mode +from CTFd.utils.config.integrations import mlc_registration +from CTFd.utils.config.visibility import registration_visible +from CTFd.utils.crypto import verify_password +from CTFd.utils.decorators import ratelimit +from CTFd.utils.decorators.visibility import check_registration_visibility +from CTFd.utils.helpers import error_for, get_errors, markup +from CTFd.utils.logging import log +from CTFd.utils.modes import TEAMS_MODE +from CTFd.utils.security.auth import login_user, logout_user +from CTFd.utils.security.signing import unserialize +from CTFd.utils.validators import ValidationError + +auth = Blueprint("auth", __name__) + + +@auth.route("/confirm", methods=["POST", "GET"]) + + +## ... source file abbreviated to get to session examples ... + + + log("registrations", "[{date}] {ip} - {name} registered with {email}") + db.session.close() + + if is_teams_mode(): + return redirect(url_for("teams.private")) + + return redirect(url_for("challenges.listing")) + else: + return render_template("register.html", errors=errors) + + +@auth.route("/login", methods=["POST", "GET"]) +@ratelimit(method="POST", limit=10, interval=5) +def login(): + errors = get_errors() + if request.method == "POST": + name = request.form["name"] + + if validators.validate_email(name) is True: + user = Users.query.filter_by(email=name).first() + else: + user = Users.query.filter_by(name=name).first() + + if user: + if user and verify_password(request.form["password"], user.password): +~~ session.regenerate() + + login_user(user) + log("logins", "[{date}] {ip} - {name} logged in") + + db.session.close() + if request.args.get("next") and validators.is_safe_url( + request.args.get("next") + ): + return redirect(request.args.get("next")) + return redirect(url_for("challenges.listing")) + + else: + log("logins", "[{date}] {ip} - submitted invalid password for {name}") + errors.append("Your username or password is incorrect") + db.session.close() + return render_template("login.html", errors=errors) + else: + log("logins", "[{date}] {ip} - submitted invalid account information") + errors.append("Your username or password is incorrect") + db.session.close() + return render_template("login.html", errors=errors) + else: + db.session.close() + return render_template("login.html", errors=errors) + + +## ... source file continues with no further session examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -129,7 +238,7 @@ class RegisterUserOIDView(BaseRegisterUser): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -237,7 +346,7 @@ def do_topic_action(topics, user, action, reverse): # noqa: C901 ``` -## Example 3 from flaskex +## Example 4 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -332,7 +441,7 @@ if __name__ == "__main__": ``` -## Example 4 from Flask-HTTPAuth +## Example 5 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -450,7 +559,7 @@ class HTTPDigestAuth(HTTPAuth): ``` -## Example 5 from flask-login +## Example 6 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -607,7 +716,7 @@ def login_required(func): ``` -## Example 6 from Flask-WTF +## Example 7 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -718,7 +827,7 @@ def _get_config( ``` -## Example 7 from flaskSaaS +## Example 8 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -790,7 +899,7 @@ logger = wrap_logger( ``` -## Example 8 from Flask-Security-Too +## Example 9 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -876,7 +985,7 @@ def tf_send_security_token(user, method, totp_secret, phone_number): ``` -## Example 9 from Flask-SocketIO +## Example 10 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -972,7 +1081,7 @@ if __name__ == '__main__': ``` -## Example 10 from Flask-User +## Example 11 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1080,7 +1189,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 11 from indico +## Example 12 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1198,7 +1307,7 @@ def sentry_log_exception(): ``` -## Example 12 from tedivms-flask +## Example 13 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1315,7 +1424,7 @@ def init_error_handlers(app): ``` -## Example 13 from trape +## Example 14 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index e8a047b3b..0adf66d40 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -16,6 +16,12 @@ following request can access it in a template by using the `flash` can also be imported directly from the `flask` module instead of `flask.helpers` so you will often see that shortcut in example code. +get_root_path, +make_response, +safe_join, +send_file, +and url_for +are several other callables with code examples from the same `flask.helpers` package. ## Example 1 from Braintree Flask app [Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) diff --git a/content/pages/examples/flask/flask-helpers-get-root-path.markdown b/content/pages/examples/flask/flask-helpers-get-root-path.markdown index ca4551848..0284ba378 100644 --- a/content/pages/examples/flask/flask-helpers-get-root-path.markdown +++ b/content/pages/examples/flask/flask-helpers-get-root-path.markdown @@ -12,6 +12,12 @@ is a function within the `flask.helpers` module of the [Flask](/flask.html) framework. `get_root_path` returns the filesystem path to a package or the current working directly if the path cannot be found. +flash, +make_response, +safe_join, +send_file, +and url_for +are several other callables with code examples from the same `flask.helpers` package. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index bb62836a4..2dc887a82 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -19,6 +19,12 @@ problem. instead of `flask.helpers` so you will typically see that shortcut in example code. +flash, +get_root_path, +safe_join, +send_file, +and url_for +are several other callables with code examples from the same `flask.helpers` package. ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-helpers-safe-join.markdown b/content/pages/examples/flask/flask-helpers-safe-join.markdown new file mode 100644 index 000000000..7959e05d2 --- /dev/null +++ b/content/pages/examples/flask/flask-helpers-safe-join.markdown @@ -0,0 +1,103 @@ +title: flask.helpers safe_join Example Code +category: page +slug: flask-helpers-safe-join-examples +sortorder: 500021021 +toc: False +sidebartitle: flask.helpers safe_join +meta: Python example code that shows how to use the safe_join callable from the flask.helpers module of the Flask project. + + +`safe_join` is a callable within the `flask.helpers` module of the Flask project. + +flash, +get_root_path, +make_response, +send_file, +and url_for +are several other callables with code examples from the same `flask.helpers` package. + +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / views.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/views.py) + +```python +# views.py +import os + +from flask import Blueprint, abort +from flask import current_app as app +from flask import redirect, render_template, request, send_file, session, url_for +~~from flask.helpers import safe_join +from sqlalchemy.exc import IntegrityError + +from CTFd.cache import cache +from CTFd.constants.config import ( + AccountVisibilityTypes, + ChallengeVisibilityTypes, + ConfigTypes, + RegistrationVisibilityTypes, + ScoreVisibilityTypes, +) +from CTFd.models import ( + Admins, + Files, + Notifications, + Pages, + Teams, + Users, + UserTokens, + db, +) +from CTFd.utils import config, get_config, set_config +from CTFd.utils import user as current_user +from CTFd.utils import validators +from CTFd.utils.config import is_setup + + +## ... source file abbreviated to get to safe_join examples ... + + + abort(403) + else: + abort(403) + + if team: + if team.banned: + abort(403) + else: + pass + + if file_id != f.id: + abort(403) + + except (BadTimeSignature, SignatureExpired, BadSignature): + abort(403) + + uploader = get_uploader() + try: + return uploader.download(f.location) + except IOError: + abort(404) + + +@views.route("/themes//static/") +def themes(theme, path): +~~ filename = safe_join(app.root_path, "themes", theme, "static", path) + if os.path.isfile(filename): + return send_file(filename) + else: + abort(404) + + + +## ... source file continues with no further safe_join examples... + +``` + diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown index e707fb77d..3ae76de0e 100644 --- a/content/pages/examples/flask/flask-helpers-send-file.markdown +++ b/content/pages/examples/flask/flask-helpers-send-file.markdown @@ -1,7 +1,7 @@ title: flask.helpers send_file Example Code category: page slug: flask-helpers-send-file-examples -sortorder: 500021021 +sortorder: 500021022 toc: False sidebartitle: flask.helpers send_file meta: Python example code that shows how to use the send_file callable from the flask.helpers module of the Flask project. @@ -19,8 +19,97 @@ from `flask.helpers`, even though it is defined within the `helpers` module. It's the same function that is imported, but it's less characters to type when you leave off the `.helpers` part. +flash, +get_root_path, +make_response, +safe_join, +and url_for +are several other callables with code examples from the same `flask.helpers` package. -## Example 1 from Flask-VueJs-Template +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / views.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/views.py) + +```python +# views.py +import os + +from flask import Blueprint, abort +from flask import current_app as app +~~from flask import redirect, render_template, request, send_file, session, url_for +from flask.helpers import safe_join +from sqlalchemy.exc import IntegrityError + +from CTFd.cache import cache +from CTFd.constants.config import ( + AccountVisibilityTypes, + ChallengeVisibilityTypes, + ConfigTypes, + RegistrationVisibilityTypes, + ScoreVisibilityTypes, +) +from CTFd.models import ( + Admins, + Files, + Notifications, + Pages, + Teams, + Users, + UserTokens, + db, +) +from CTFd.utils import config, get_config, set_config +from CTFd.utils import user as current_user +from CTFd.utils import validators + + +## ... source file abbreviated to get to send_file examples ... + + + abort(403) + + if team: + if team.banned: + abort(403) + else: + pass + + if file_id != f.id: + abort(403) + + except (BadTimeSignature, SignatureExpired, BadSignature): + abort(403) + + uploader = get_uploader() + try: + return uploader.download(f.location) + except IOError: + abort(404) + + +@views.route("/themes//static/") +def themes(theme, path): + filename = safe_join(app.root_path, "themes", theme, "static", path) + if os.path.isfile(filename): +~~ return send_file(filename) + else: + abort(404) + + + +## ... source file continues with no further send_file examples... + +``` + + +## Example 2 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 21472d8dc..92e4fa985 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -1,7 +1,7 @@ title: flask.helpers url_for Example Code category: page slug: flask-helpers-url-for-examples -sortorder: 500021022 +sortorder: 500021023 toc: False sidebartitle: flask.helpers url_for meta: Python example code that shows how to use the url_for callable from the flask.helpers module of the Flask project. @@ -17,8 +17,186 @@ from `flask.helpers`, even though it is defined within the `helpers` module. It is the same function that is imported, but it's less characters to type when you leave off the `.helpers` part. +flash, +get_root_path, +make_response, +safe_join, +and send_file +are several other callables with code examples from the same `flask.helpers` package. -## Example 1 from Flask AppBuilder +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / tests / test_views.py**](https://github.com/CTFd/CTFd/blob/master/./tests/test_views.py) + +```python +# test_views.py + +import os + +~~from flask import url_for +from freezegun import freeze_time + +from CTFd.cache import clear_pages +from CTFd.utils import set_config +from CTFd.utils.config.pages import get_pages +from CTFd.utils.encoding import hexencode +from tests.helpers import ( + create_ctfd, + destroy_ctfd, + gen_challenge, + gen_file, + gen_page, + login_as_user, + register_user, +) + + +def test_index(): + app = create_ctfd() + with app.app_context(): + with app.test_client() as client: + r = client.get("/") + assert r.status_code == 200 + destroy_ctfd(app) + + +## ... source file abbreviated to get to url_for examples ... + + + register_user(app) + client = login_as_user(app) + r = client.get("/profile") + assert r.status_code == 200 + destroy_ctfd(app) + + +def test_user_can_access_files(): + app = create_ctfd() + with app.app_context(): + from CTFd.utils.uploads import rmdir + + chal = gen_challenge(app.db) + chal_id = chal.id + path = app.config.get("UPLOAD_FOLDER") + + location = os.path.join(path, "test_file_path", "test.txt") + directory = os.path.dirname(location) + model_path = os.path.join("test_file_path", "test.txt") + + try: + os.makedirs(directory) + with open(location, "wb") as obj: + obj.write("testing file load".encode()) + gen_file(app.db, location=model_path, challenge_id=chal_id) +~~ url = url_for("views.files", path=model_path) + + set_config("challenge_visibility", "public") + with app.test_client() as client: + r = client.get(url) + + assert r.status_code == 200 + assert r.get_data(as_text=True) == "testing file load" + + set_config("challenge_visibility", "private") + with app.test_client() as client: + r = client.get(url) + + assert r.status_code == 403 + assert r.get_data(as_text=True) != "testing file load" + + register_user(app) + client = login_as_user(app) + r = client.get(url) + assert r.status_code == 200 + assert r.get_data(as_text=True) == "testing file load" + + with freeze_time("2017-10-5"): + set_config("start", "1507262400") + for v in ("public", "private"): + + +## ... source file abbreviated to get to url_for examples ... + + + finally: + rmdir(directory) + destroy_ctfd(app) + + +def test_user_can_access_files_with_auth_token(): + app = create_ctfd() + with app.app_context(): + from CTFd.utils.uploads import rmdir + + chal = gen_challenge(app.db) + chal_id = chal.id + path = app.config.get("UPLOAD_FOLDER") + + md5hash = hexencode(os.urandom(16)) + + location = os.path.join(path, md5hash, "test.txt") + directory = os.path.dirname(location) + model_path = os.path.join(md5hash, "test.txt") + + try: + os.makedirs(directory) + with open(location, "wb") as obj: + obj.write("testing file load".encode()) + gen_file(app.db, location=model_path, challenge_id=chal_id) +~~ url = url_for("views.files", path=model_path) + + register_user(app) + with login_as_user(app) as client: + req = client.get("/api/v1/challenges/1") + data = req.get_json() + file_url = data["data"]["files"][0] + + with app.test_client() as client: + r = client.get(url) + assert r.status_code == 403 + assert r.get_data(as_text=True) != "testing file load" + + r = client.get( +~~ url_for( + "views.files", + path=model_path, + token="random_token_that_shouldnt_work", + ) + ) + assert r.status_code == 403 + assert r.get_data(as_text=True) != "testing file load" + + r = client.get(file_url) + assert r.status_code == 200 + assert r.get_data(as_text=True) == "testing file load" + + set_config("challenge_visibility", "admins") + r = client.get(file_url) + assert r.status_code == 403 + assert r.get_data(as_text=True) != "testing file load" + set_config("challenge_visibility", "private") + + with freeze_time("2017-10-5"): + set_config("start", "1507262400") + + r = client.get(file_url) + assert r.status_code == 403 + assert r.get_data(as_text=True) != "testing file load" + + +## ... source file continues with no further url_for examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -94,7 +272,7 @@ class Menu(object): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -162,7 +340,7 @@ class FlaskBBRenderer(mistune.Renderer): ``` -## Example 3 from flask-base +## Example 4 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -233,7 +411,7 @@ class CustomSelectField(Field): ``` -## Example 4 from flask-bones +## Example 5 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -264,7 +442,7 @@ def url_for_other_page(**kwargs): ``` -## Example 5 from Flask-Bootstrap +## Example 6 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -354,7 +532,7 @@ class ConditionalCDN(object): ``` -## Example 6 from flask-debugtoolbar +## Example 7 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -421,7 +599,7 @@ class DebugToolbar(object): ``` -## Example 7 from flask-login +## Example 8 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -521,7 +699,7 @@ def login_user(user, remember=False, duration=None, force=False, fresh=True): ``` -## Example 8 from flask-restx +## Example 9 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -576,7 +754,7 @@ def ui_for(api): ``` -## Example 9 from flaskSaaS +## Example 10 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -717,7 +895,7 @@ def reset(token): ``` -## Example 10 from Flask-Security-Too +## Example 11 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -837,7 +1015,7 @@ def get_post_action_redirect(config_key, declared=None): ``` -## Example 11 from Flask-User +## Example 12 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -986,7 +1164,7 @@ class EmailManager(object): ``` -## Example 12 from Flasky +## Example 13 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1186,7 +1364,7 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body) ``` -## Example 13 from Datadog Flask Example App +## Example 14 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index 96cf91c66..fd4d8ce5d 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -1,7 +1,7 @@ title: flask.json JSONEncoder Example Code category: page slug: flask-json-jsonencoder-examples -sortorder: 500021023 +sortorder: 500021024 toc: False sidebartitle: flask.json JSONEncoder meta: Example code for understanding how to use the JSONEncoder class from the flask.json module of the Flask project. @@ -14,6 +14,8 @@ encoder for Flask and was designed to handle more types than Python's standard library [json](https://docs.python.org/3/library/json.html) module. +jsonify +is another callable from the `flask.json` package with code examples. ## Example 1 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 7d782befc..53923a951 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -1,7 +1,7 @@ title: flask.json jsonify Example Code category: page slug: flask-json-jsonify-examples -sortorder: 500021024 +sortorder: 500021025 toc: False sidebartitle: flask.json jsonify meta: Python example code that shows how to use the jsonify callable from the flask.json module of the Flask project. @@ -19,6 +19,8 @@ Note that `jsonify` is sometimes imported directly from the `flask` module instead of from `flask.json`. It is the same function that is imported, but there are less characters to type when you leave off the `.json` part. +JSONEncoder +is another callable from the `flask.json` package with code examples. ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 7e01300e1..4428d6b6e 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -1,7 +1,7 @@ title: flask.sessions BadSignature Example Code category: page slug: flask-sessions-badsignature-examples -sortorder: 500021025 +sortorder: 500021026 toc: False sidebartitle: flask.sessions BadSignature meta: Example code for understanding how to use the BadSignature class from the flask.sessions module of the Flask project. @@ -13,6 +13,10 @@ the `flask.sessions` module. `BadSignature` is actually defined in the [itsdangerous](https://github.com/pallets/itsdangerous) project and imported into Flask sessions for applications to use. +SessionInterface +and +SessionMixin +are a couple of other callables within the `flask.sessions` package that also have code examples. ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 9ba9138fd..757772a3d 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionInterface Example Code category: page slug: flask-sessions-sessioninterface-examples -sortorder: 500021026 +sortorder: 500021027 toc: False sidebartitle: flask.sessions SessionInterface meta: Example code for understanding how to use the SessionInterface class from the flask.sessions module of the Flask project. @@ -12,6 +12,10 @@ is a class used with [Flask](/flask.html) projects that is defined in the `flask.sessions` module. `SessionInterface` is the basic interface that must be implemented to replace the default session interface. +BadSignature +and +SessionMixin +are a couple of other callables within the `flask.sessions` package that also have code examples. ## Example 1 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a diff --git a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown index 8cc0cafcd..57ac14477 100644 --- a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown +++ b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionMixin Example Code category: page slug: flask-sessions-sessionmixin-examples -sortorder: 500021027 +sortorder: 500021028 toc: False sidebartitle: flask.sessions SessionMixin meta: Example code for understanding how to use the SessionMixin class from the flask.sessions module of the Flask project. @@ -14,6 +14,10 @@ the `flask.sessions` module. `SessionMixin` expands a standard with [session](https://flask.palletsprojects.com/en/1.1.x/quickstart/#sessions) attributes. +BadSignature +and +SessionInterface +are a couple of other callables within the `flask.sessions` package that also have code examples. ## Example 1 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index 64bfb260a..4484cce5a 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -1,7 +1,7 @@ title: flask.signals got_request_exception Example Code category: page slug: flask-signals-got-request-exception-examples -sortorder: 500021029 +sortorder: 500021030 toc: False sidebartitle: flask.signals got_request_exception meta: Python example code that shows how to use the got_request_exception callable from the flask.signals module of the Flask project. @@ -13,6 +13,8 @@ is a signal defined in the [Flask](/flask.html) project's issue with the HTTP request. It can also be thrown by your own view functions if there is an error and you want to raise it via a signal. +Namespace +is another callable from the `flask.signals` package with code examples. ## Example 1 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index f2d968994..4faeecf05 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -1,7 +1,7 @@ title: flask.signals Namespace Example Code category: page slug: flask-signals-namespace-examples -sortorder: 500021028 +sortorder: 500021029 toc: False sidebartitle: flask.signals Namespace meta: Example code for understanding how to use the Namespace class from the flask.signals module of the Flask project. @@ -18,6 +18,8 @@ implementing its own event subscription signaling model. as a mapping of signal names to signals, and it serves the same purpose in the Flask project. +got_request_exception +is another callable from the `flask.signals` package with code examples. ## Example 1 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 7a3d30660..c785805cb 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template_string Example Code category: page slug: flask-templating-render-template-string-examples -sortorder: 500021031 +sortorder: 500021032 toc: False sidebartitle: flask.templating render_template_string meta: Python example code that shows how to use the render_template_string callable from the flask.templating module of the Flask project. @@ -17,6 +17,8 @@ package instead of from `flask.templating`. It is the same function that is imported, but there are less characters to type when you leave off the `.templating` part. +render_template +is another callable from the `flask.templating` package with code examples. These topics are also useful while reading the `render_template_string` examples: diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 017dd6631..da6a6da1a 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template Example Code category: page slug: flask-templating-render-template-examples -sortorder: 500021030 +sortorder: 500021031 toc: False sidebartitle: flask.templating render_template meta: Python example code that shows how to use the render_template callable from the flask.templating module of the Flask project. @@ -18,8 +18,10 @@ package instead of from `flask.templating`. It is the same function that is imported, but there are less characters to type when you leave off the `.templating` part. +render_template_string +is another callable from the `flask.templating` package with code examples. -These subjects go along with the `render_template` code examples: +You should read up on these subjects along with these `render_template` examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) @@ -117,7 +119,370 @@ if __name__ == '__main__': ``` -## Example 2 from FlaskBB +## Example 2 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / auth.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/auth.py) + +```python +# auth.py +import base64 + +import requests +from flask import Blueprint +from flask import current_app as app +~~from flask import redirect, render_template, request, session, url_for +from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired + +from CTFd.cache import clear_team_session, clear_user_session +from CTFd.models import Teams, Users, db +from CTFd.utils import config, email, get_app_config, get_config +from CTFd.utils import user as current_user +from CTFd.utils import validators +from CTFd.utils.config import is_teams_mode +from CTFd.utils.config.integrations import mlc_registration +from CTFd.utils.config.visibility import registration_visible +from CTFd.utils.crypto import verify_password +from CTFd.utils.decorators import ratelimit +from CTFd.utils.decorators.visibility import check_registration_visibility +from CTFd.utils.helpers import error_for, get_errors, markup +from CTFd.utils.logging import log +from CTFd.utils.modes import TEAMS_MODE +from CTFd.utils.security.auth import login_user, logout_user +from CTFd.utils.security.signing import unserialize +from CTFd.utils.validators import ValidationError + +auth = Blueprint("auth", __name__) + + +@auth.route("/confirm", methods=["POST", "GET"]) +@auth.route("/confirm/", methods=["POST", "GET"]) +@ratelimit(method="POST", limit=10, interval=60) +def confirm(data=None): + if not get_config("verify_emails"): + return redirect(url_for("challenges.listing")) + + if data and request.method == "GET": + try: + user_email = unserialize(data, max_age=1800) + except (BadTimeSignature, SignatureExpired): +~~ return render_template( + "confirm.html", errors=["Your confirmation link has expired"] + ) + except (BadSignature, TypeError, base64.binascii.Error): +~~ return render_template( + "confirm.html", errors=["Your confirmation token is invalid"] + ) + + user = Users.query.filter_by(email=user_email).first_or_404() + if user.verified: + return redirect(url_for("views.settings")) + + user.verified = True + log( + "registrations", + format="[{date}] {ip} - successful confirmation for {name}", + name=user.name, + ) + db.session.commit() + clear_user_session(user_id=user.id) + email.successful_registration_notification(user.email) + db.session.close() + if current_user.authed(): + return redirect(url_for("challenges.listing")) + return redirect(url_for("auth.login")) + + if current_user.authed() is False: + return redirect(url_for("auth.login")) + + user = Users.query.filter_by(id=session["id"]).first_or_404() + if user.verified: + return redirect(url_for("views.settings")) + + if data is None: + if request.method == "POST": + email.verify_email_address(user.email) + log( + "registrations", + format="[{date}] {ip} - {name} initiated a confirmation email resend", + ) +~~ return render_template( + "confirm.html", infos=[f"Confirmation email sent to {user.email}!"] + ) + elif request.method == "GET": +~~ return render_template("confirm.html") + + +@auth.route("/reset_password", methods=["POST", "GET"]) +@auth.route("/reset_password/", methods=["POST", "GET"]) +@ratelimit(method="POST", limit=10, interval=60) +def reset_password(data=None): + if config.can_send_mail() is False: +~~ return render_template( + "reset_password.html", + errors=[ + markup( + "This CTF is not configured to send email.
    Please contact an organizer to have your password reset." + ) + ], + ) + + if data is not None: + try: + email_address = unserialize(data, max_age=1800) + except (BadTimeSignature, SignatureExpired): +~~ return render_template( + "reset_password.html", errors=["Your link has expired"] + ) + except (BadSignature, TypeError, base64.binascii.Error): +~~ return render_template( + "reset_password.html", errors=["Your reset token is invalid"] + ) + + if request.method == "GET": +~~ return render_template("reset_password.html", mode="set") + if request.method == "POST": + password = request.form.get("password", "").strip() + user = Users.query.filter_by(email=email_address).first_or_404() + if user.oauth_id: +~~ return render_template( + "reset_password.html", + infos=[ + "Your account was registered via an authentication provider and does not have an associated password. Please login via your authentication provider." + ], + ) + + pass_short = len(password) == 0 + if pass_short: +~~ return render_template( + "reset_password.html", errors=["Please pick a longer password"] + ) + + user.password = password + db.session.commit() + clear_user_session(user_id=user.id) + log( + "logins", + format="[{date}] {ip} - successful password reset for {name}", + name=user.name, + ) + db.session.close() + email.password_change_alert(user.email) + return redirect(url_for("auth.login")) + + if request.method == "POST": + email_address = request.form["email"].strip() + user = Users.query.filter_by(email=email_address).first() + + get_errors() + + if not user: +~~ return render_template( + "reset_password.html", + infos=[ + "If that account exists you will receive an email, please check your inbox" + ], + ) + + if user.oauth_id: +~~ return render_template( + "reset_password.html", + infos=[ + "The email address associated with this account was registered via an authentication provider and does not have an associated password. Please login via your authentication provider." + ], + ) + + email.forgot_password(email_address) + +~~ return render_template( + "reset_password.html", + infos=[ + "If that account exists you will receive an email, please check your inbox" + ], + ) +~~ return render_template("reset_password.html") + + +@auth.route("/register", methods=["POST", "GET"]) +@check_registration_visibility +@ratelimit(method="POST", limit=10, interval=5) +def register(): + errors = get_errors() + if request.method == "POST": + name = request.form.get("name", "").strip() + email_address = request.form.get("email", "").strip().lower() + password = request.form.get("password", "").strip() + + website = request.form.get("website") + affiliation = request.form.get("affiliation") + country = request.form.get("country") + + name_len = len(name) == 0 + names = Users.query.add_columns("name", "id").filter_by(name=name).first() + emails = ( + Users.query.add_columns("email", "id") + .filter_by(email=email_address) + .first() + ) + pass_short = len(password) == 0 + + +## ... source file abbreviated to get to render_template examples ... + + + errors.append( + "Only email addresses under {domains} may register".format( + domains=get_config("domain_whitelist") + ) + ) + if names: + errors.append("That user name is already taken") + if team_name_email_check is True: + errors.append("Your user name cannot be an email address") + if emails: + errors.append("That email has already been used") + if pass_short: + errors.append("Pick a longer password") + if pass_long: + errors.append("Pick a shorter password") + if name_len: + errors.append("Pick a longer user name") + if valid_website is False: + errors.append("Websites must be a proper URL starting with http or https") + if valid_country is False: + errors.append("Invalid country") + if valid_affiliation is False: + errors.append("Please provide a shorter affiliation") + + if len(errors) > 0: +~~ return render_template( + "register.html", + errors=errors, + name=request.form["name"], + email=request.form["email"], + password=request.form["password"], + ) + else: + with app.app_context(): + user = Users(name=name, email=email_address, password=password) + + if website: + user.website = website + if affiliation: + user.affiliation = affiliation + if country: + user.country = country + + db.session.add(user) + db.session.commit() + db.session.flush() + + login_user(user) + + if config.can_send_mail() and get_config( + "verify_emails" + ): # Confirming users is enabled and we can send email. + log( + "registrations", + format="[{date}] {ip} - {name} registered (UNCONFIRMED) with {email}", + ) + email.verify_email_address(user.email) + db.session.close() + return redirect(url_for("auth.confirm")) + else: # Don't care about confirming users + if ( + config.can_send_mail() + ): # We want to notify the user that they have registered. + email.successful_registration_notification(user.email) + + log("registrations", "[{date}] {ip} - {name} registered with {email}") + db.session.close() + + if is_teams_mode(): + return redirect(url_for("teams.private")) + + return redirect(url_for("challenges.listing")) + else: +~~ return render_template("register.html", errors=errors) + + +@auth.route("/login", methods=["POST", "GET"]) +@ratelimit(method="POST", limit=10, interval=5) +def login(): + errors = get_errors() + if request.method == "POST": + name = request.form["name"] + + if validators.validate_email(name) is True: + user = Users.query.filter_by(email=name).first() + else: + user = Users.query.filter_by(name=name).first() + + if user: + if user and verify_password(request.form["password"], user.password): + session.regenerate() + + login_user(user) + log("logins", "[{date}] {ip} - {name} logged in") + + db.session.close() + if request.args.get("next") and validators.is_safe_url( + request.args.get("next") + ): + return redirect(request.args.get("next")) + return redirect(url_for("challenges.listing")) + + else: + log("logins", "[{date}] {ip} - submitted invalid password for {name}") + errors.append("Your username or password is incorrect") + db.session.close() +~~ return render_template("login.html", errors=errors) + else: + log("logins", "[{date}] {ip} - submitted invalid account information") + errors.append("Your username or password is incorrect") + db.session.close() +~~ return render_template("login.html", errors=errors) + else: + db.session.close() +~~ return render_template("login.html", errors=errors) + + +@auth.route("/oauth") +def oauth_login(): + endpoint = ( + get_app_config("OAUTH_AUTHORIZATION_ENDPOINT") + or get_config("oauth_authorization_endpoint") + or "https://auth.majorleaguecyber.org/oauth/authorize" + ) + + if get_config("user_mode") == "teams": + scope = "profile team" + else: + scope = "profile" + + client_id = get_app_config("OAUTH_CLIENT_ID") or get_config("oauth_client_id") + + if client_id is None: + error_for( + endpoint="auth.login", + message="OAuth Settings not configured. " + "Ask your CTF administrator to configure MajorLeagueCyber integration.", + ) + return redirect(url_for("auth.login")) + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -196,7 +561,7 @@ def send_email(subject, recipients, text_body, html_body, sender=None): ``` -## Example 3 from flask-base +## Example 4 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -243,7 +608,7 @@ def send_email(recipient, subject, template, **kwargs): ``` -## Example 4 from flask-bones +## Example 5 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -350,7 +715,7 @@ def register_jinja_env(app): ``` -## Example 5 from flask-bookshelf +## Example 6 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -454,7 +819,7 @@ app.register_blueprint(admin, url_prefix="//admin") ``` -## Example 6 from flaskex +## Example 7 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -549,7 +914,7 @@ if __name__ == "__main__": ``` -## Example 7 from flask_jsondash +## Example 8 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -692,7 +1057,7 @@ def update(c_id): ``` -## Example 8 from flask-phone-input +## Example 9 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -750,7 +1115,7 @@ def show_phone(): ``` -## Example 9 from flask-restx +## Example 10 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -805,7 +1170,7 @@ def ui_for(api): ``` -## Example 10 from flaskSaaS +## Example 11 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -1008,7 +1373,7 @@ def paySuccess(): ``` -## Example 11 from Flask-Security-Too +## Example 12 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -1118,7 +1483,7 @@ from .forms import ( ``` -## Example 12 from Flask-SocketIO +## Example 13 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -1194,7 +1559,7 @@ def get_session(): ``` -## Example 13 from Flask-User +## Example 14 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1286,7 +1651,7 @@ class EmailManager(object): ``` -## Example 14 from Flasky +## Example 15 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1326,7 +1691,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 15 from Datadog Flask Example App +## Example 16 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1428,7 +1793,7 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 16 from indico +## Example 17 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1458,7 +1823,7 @@ class MathjaxMixin(object): ``` -## Example 17 from keras-flask-deploy-webapp +## Example 18 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1549,7 +1914,7 @@ if __name__ == '__main__': ``` -## Example 18 from newspie +## Example 19 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1704,7 +2069,7 @@ if __name__ == '__main__': ``` -## Example 19 from Science Flask +## Example 20 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -1992,7 +2357,7 @@ def static_from_root(): ``` -## Example 20 from tedivms-flask +## Example 21 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -2095,7 +2460,7 @@ def init_error_handlers(app): ``` -## Example 21 from trape +## Example 22 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 0a67d4938..b2fec1e84 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -1,7 +1,7 @@ title: flask.views http_method_funcs Example Code category: page slug: flask-views-http-method-funcs-examples -sortorder: 500021034 +sortorder: 500021035 toc: False sidebartitle: flask.views http_method_funcs meta: Python example code that shows how to use the http_method_funcs callable from the flask.views module of the Flask project. @@ -14,8 +14,12 @@ of the [Flask](/flask.html) project. It contains strings of the HTTP methods which is useful for checking if an HTTP method is valid by comparing it against the items in this set. +MethodView +and +View +are a couple of other callables within the `flask.views` package that also have code examples. -These subjects go along with the `http_method_funcs` code examples: +You should read up on these subjects along with these `http_method_funcs` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 6e94fffc5..e048933c1 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -1,7 +1,7 @@ title: flask.views MethodView Example Code category: page slug: flask-views-methodview-examples -sortorder: 500021032 +sortorder: 500021033 toc: False sidebartitle: flask.views MethodView meta: Example code for understanding how to use the MethodView class from the flask.views module of the Flask project. @@ -14,8 +14,12 @@ project. `MethodView` is a that determines the methods, such as GET, POST, PUT, etc, that a view defines. +View +and +http_method_funcs +are a couple of other callables within the `flask.views` package that also have code examples. -You should read up on these subjects along with these `MethodView` examples: +These topics are also useful while reading the `MethodView` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index d966b24b8..1f8e51936 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -1,7 +1,7 @@ title: flask.views View Example Code category: page slug: flask-views-view-examples -sortorder: 500021033 +sortorder: 500021034 toc: False sidebartitle: flask.views View meta: Example code for understanding how to use the View class from the flask.views module of the Flask project. @@ -15,6 +15,10 @@ for the routing system. This is typically only used in more advanced situations such as extending the Flask source code, rather than a standard way of interacting with the framework. +MethodView +and +http_method_funcs +are a couple of other callables within the `flask.views` package that also have code examples. You should read up on these subjects along with these `View` examples: diff --git a/theme/static/css/base.css b/theme/static/css/base.css index 58c38b7cd..1afe4c68e 100644 --- a/theme/static/css/base.css +++ b/theme/static/css/base.css @@ -59,7 +59,7 @@ img.shot{width:100%;margin:6px 0 6px 0} } @page { @top {text-align:right;font-size:9pt; - content:"Full Stack Python: July 2019 Edition"} + content:"Full Stack Python: 2020 Supporter's Edition"} @bottom { text-align: right; font-size: 9pt; content: counter(page) } margin: 0.9in; size: A4; diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html index d2d99058f..984f266f1 100644 --- a/theme/templates/code-examples/flask.html +++ b/theme/templates/code-examples/flask.html @@ -36,6 +36,7 @@

    flask.helpers flash, get_root_path, make_response, + safe_join, send_file, url_for

    From 6dd83faa99014eba22c739e0d3944f923fa431ce Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 27 Jul 2020 14:07:07 -0400 Subject: [PATCH 200/302] fixing linking issue to author page from blog --- theme/templates/article.html | 6 +++--- theme/templates/blog.html | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/theme/templates/article.html b/theme/templates/article.html index 4fcea5f1c..5d7d00cdc 100644 --- a/theme/templates/article.html +++ b/theme/templates/article.html @@ -29,12 +29,12 @@

    {{ article.title }}

    {% if article.modified != article.date %} Post updated by - {% if article.author %}{{ article.author }}{% else %}Matt Makai{% endif %} + {% if article.author == "Matt Makai" %}Matt Makai{% else %}{{ article.author }}{% endif %} on {{ article.modified.strftime('%B %d, %Y') }}. Originally posted on {{ article.date.strftime('%B %d, %Y') }}. {% else %} - Posted by - {% if article.author %}{{ article.author }}{% else %}Matt Makai{% endif %} + Posted by + {% if article.author == "Matt Makai" %}Matt Makai{% else %}{{ article.author }}{% endif %} on {{ article.date.strftime('%B %d, %Y') }}. {% endif %}
    diff --git a/theme/templates/blog.html b/theme/templates/blog.html index 8a18cfed2..6a20daefb 100644 --- a/theme/templates/blog.html +++ b/theme/templates/blog.html @@ -25,12 +25,12 @@

    {{ a.ti
    {% if a.modified != a.date %} Post updated by - {% if a.author %}{{ a.author }}{% else %}Matt Makai{% endif %} + {% if a.author == "Matt Makai" %}Matt Makai{% else %}{{ a.author }}{% endif %} on {{ a.modified.strftime('%B %d, %Y') }}. Originally posted on {{ a.date.strftime('%B %d, %Y') }}. {% else %} - Posted by - {% if a.author %}{{ a.author }}{% else %}Matt Makai{% endif %} + Posted by + {% if a.author == "Matt Makai" %}Matt Makai{% else %}{{ a.author }}{% endif %} on {{ a.date.strftime('%B %d, %Y') }}. {% endif %}
    From 13eaa9d30f1517702b647b17ecc31f71d030b87d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 27 Jul 2020 21:36:24 -0400 Subject: [PATCH 201/302] working on fixing broken links --- transform_book.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/transform_book.py b/transform_book.py index 7b2bd01b5..80084900c 100644 --- a/transform_book.py +++ b/transform_book.py @@ -38,7 +38,7 @@ "(/development-environments.html)": "(#development-environments)", "(/text-editors-ides.html)": - "(#text-editors-and-ides)", + "(#text-editors-ides)", "(/vim.html)": "(#vim)", "(/emacs.html)": @@ -54,7 +54,7 @@ "(/bourne-again-shell-bash.html)": "(#bourne-again-shell-bash)", "(/zsh-shell.html)": - "(#zsh)", + "(#zsh-shell)", "(/powershell.html)": "(#powershell)", "(/terminal-multiplexers.html)": @@ -68,7 +68,7 @@ "(/application-dependencies.html)": "(#application-dependencies)", "(/virtual-environments-virtualenvs-venvs.html)": - "(#virtual-environments-virtualenvs)", + "(#virtual-environments-virtualenvs-venvs)", "(/localhost-tunnels.html)": "(#localhost-tunnels)", "(/source-control.html)": @@ -96,11 +96,11 @@ "(/peewee.html)": "(#peewee)", "(/django-orm.html)": - "(#django-object-relational-mapper)", + "(#django-orm)", "(/pony-orm.html)": "(#pony-orm)", "(/no-sql-datastore.html)": - "(#nosql-data-stores)", + "(#nosql-data-store)", "(/redis.html)": "(#redis)", "(/mongodb.html)": From 6878defe2dac565515106c89099f461d15333b45 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 28 Jul 2020 15:45:53 -0400 Subject: [PATCH 202/302] fix typos --- .../20-css-frameworks.markdown | 2 +- .../05-deployment/22-wsgi-servers.markdown | 2 +- .../sqlalchemy-example-projects-code.markdown | 2 +- theme/templates/book-toc.html | 38 +++++++++---------- theme/templates/epub-book.html | 1 + transform_book.py | 24 +++++++----- 6 files changed, 37 insertions(+), 32 deletions(-) diff --git a/content/pages/04-web-development/20-css-frameworks.markdown b/content/pages/04-web-development/20-css-frameworks.markdown index 01f12984b..de0dbe3b2 100644 --- a/content/pages/04-web-development/20-css-frameworks.markdown +++ b/content/pages/04-web-development/20-css-frameworks.markdown @@ -12,7 +12,7 @@ a code library that abstracts common web designs and makes the designs easier for a developer to implement in their web apps. -### CSS frameworks +### CSS framework implementations * [Bootstrap](/bootstrap-css.html) * [Foundation](/foundation-css.html) diff --git a/content/pages/05-deployment/22-wsgi-servers.markdown b/content/pages/05-deployment/22-wsgi-servers.markdown index 7a92941c8..35174df41 100644 --- a/content/pages/05-deployment/22-wsgi-servers.markdown +++ b/content/pages/05-deployment/22-wsgi-servers.markdown @@ -146,7 +146,7 @@ configuration. For real SSL and non-SSL templates, take a look at the [Underwear web server templates](https://github.com/mattmakai/underwear/tree/master/underwear/roles/web/templates) on GitHub. -## WSGI servers +## WSGI server implementations There is a comprehensive list of WSGI servers on the [WSGI Read the Docs](http://wsgi.readthedocs.org/en/latest/servers.html) page. The following are WSGI servers based on community recommendations. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown index 3392cc1be..13f311143 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown @@ -27,7 +27,7 @@ The project is open sourced under the [BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). -# CTFd +### CTFd [CTFd](https://github.com/CTFd/CTFd) ([homepage](https://ctfd.io/)) is a [capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) diff --git a/theme/templates/book-toc.html b/theme/templates/book-toc.html index 2e536802b..7d51ee73c 100644 --- a/theme/templates/book-toc.html +++ b/theme/templates/book-toc.html @@ -19,7 +19,7 @@
  • 2. Development Environments
  • *Vf?u;bNnFxktJ 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 Programming +Web development +Django \ No newline at end of file From 4049a451b6d974441fd02180882d242f1ed6decb Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 19 Jul 2020 13:14:29 -0400 Subject: [PATCH 193/302] update and fix change log --- content/pages/meta/00-change-log.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 4c81a8462..10f8993b5 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,10 +15,10 @@ on GitHub. ## 2020 ### July -* New blog post on how to - [Quickly Use Bootstrap 4 in a Django Template with a CDN](http://localhost:8002/blog/bootstrap-4-django-template.html). -* New blog post on - [How to report errors in Flask web apps with Sentry](/blog/report-errors-flask-web-apps-sentry.html). +* New blog posts: + * [Tracking Daily User Data in Django with django-user-visit](/blog/track-daily-user-data-django-user-visit.html) + * [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html). + * [How to report errors in Flask web apps with Sentry](/blog/report-errors-flask-web-apps-sentry.html) ### June * Added new example code for [Django](/django.html) modules: From ecdbbed6ddd5c643a9458c38ac9d30138affe6c0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 19 Jul 2020 13:24:14 -0400 Subject: [PATCH 194/302] fix typo in change log --- content/pages/meta/00-change-log.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 10f8993b5..f21cc1bb8 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -17,7 +17,7 @@ on GitHub. ### July * New blog posts: * [Tracking Daily User Data in Django with django-user-visit](/blog/track-daily-user-data-django-user-visit.html) - * [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html). + * [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html) * [How to report errors in Flask web apps with Sentry](/blog/report-errors-flask-web-apps-sentry.html) ### June From a6feea08a81753f6e90da642e6cacce59d4ba49c Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 20 Jul 2020 06:27:52 -0400 Subject: [PATCH 195/302] update some header images to minify them --- static/img/181031-okta-exist-flask/header.jpg | Bin 54433 -> 20103 bytes .../header.jpg | Bin 99566 -> 49833 bytes .../header.jpg | Bin 250662 -> 58041 bytes static/img/200330-pandas-sqlite/header.jpg | Bin 69037 -> 24951 bytes static/img/200525-sentry/header.jpg | Bin 51348 -> 21112 bytes static/img/headers/django-materialize.jpg | Bin 0 -> 23240 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/img/headers/django-materialize.jpg diff --git a/static/img/181031-okta-exist-flask/header.jpg b/static/img/181031-okta-exist-flask/header.jpg index 6da57b0102c1987a3759d019e4fecb802e3e382a..282152c09fe8eb50e06af0aa06902f91d8a417fc 100644 GIT binary patch delta 15729 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 literal 54433 zcmeFZc|278`#*l{MJ3tFHnLViStCpmk~Bpn>m*6YP9}zv6p>7*6lKa15|cgKj9p0f zeIHS_%vi=S+wXM0@Aq=QfA{T?u;UI77U_hVE0tt|w#??<@-oWCFY0{Z)FgU?gQ z?I*3SqOGC<0BT2$9@9OdqkB|M`iR!AhNc<-aJ*sr=k>f{|NEGnAK!5Nz0H2**Wj$F z?Ub7V0Y18_s$TvoPS?G!xu`gMd#a+Gd{mFB98m@I;3yv_XAhSE>1!^oZeIE_%asHf zX}9b8GS-?FM=X4dTyDCZ4)$}g3O;wyIoQKl=ei8sKw1x_i}LjGbO~^hMtR=y^4CS_ z%ltODF4X?@v8s&pZ(RaB^kuGCoR>E8_H&WeRMAj5A_E=mcm0O0dp%lv+k zK|w((LFy{rey*xVb#!!8kEp4tsVPG}l>P5`1vsIUz5HeWKEf#%e`h~8p8z*+FX>++ zI$iS)4A7T>&iuDa^7Q$~uzx!DzjwUu{EvP5%16~M{(W8k*2&1v<=6UM^!C1`FZ1u~`Rm%RJL~!f zUUPSG4)|RZC!JhXp{D8|zEJ%&rGJ^?uMWRHg5>tA`HuxKkp64?O9FpM;4caMC4s*r z@RtPs?~}kkA)JdBgxi83fCjLZfMe%xdIxy>-}Lr@pyUzY*hw=B&R^IQ+J0-x|JK~y zD;Yb40SYQJ&9U}xjtVCUrE;`((OwovGMfKz~L&;Fx^+=3UJcw~Hq)WYN6Zj(J( zP%CWNMUqp$=67#9uZZa0ePZ$oiU$rJ($Lh>KBl8Fw(u7#td&B2Issnf?A_Zl1idy0%W)pl)vcniqtl|28e?^=~u#w|NOb z^J3@ZypkEUg;N;qWlzWfi1s*3~K^e91Z9*sG-xkzvmsPhU319Q;;uVq8 zn35;|n%ZwO`=3qh-v6hW{bOSPoYx3o1cfudHg@QjgPk2(Dh_Dlb z0PxrTKav3ltMe~;{TI5z!Rq=;UjLQ6y8n{beibJx|CPM@ z|B}~#C9i@1B(KLA&1Zmwlxp`kcjSGAD@2`Zfa|l>M&?vea;0O5-I8G4aAvP^*K|pI zIQ_&Me%m?y>3hnlK!itt<)?vL+>3Y3S9l;#(h~6{tnoH3M2q@g6Ttp6IaEhr3I=)*Hjvp;Krx;b>nLa4!O_g=b`g9vxy?;l&QY zTh~d?!{2>T_L40)c_QJq;`bX%Ct#IGVfYP9I83ZKIsg%EAlkEjY{ukl3vZPD#tv>j zC2Be}4j!x(DFKJHj$<$r0Da87*6*`LUx9dL;f?Q#lIJPEfL|lD4-?U==PS>gNs%Yis8jlWk)+bk1V!omJ`#CQg$43k-nd76UiGf zA;iWgqMMQUqnHP&JXfgx#0)jJiltYj)@OEYk8wFPNZ$!2!RexWl(UQ~a59x3aI2Wc zw{#g6Nf9)IMFn~qSYO#+qW3}V!IZsV?>cTB0Xq~sumZ9G9t-9K3nSij6&#^%4Gq&s^H|d2J7K@w-(J& zWV%Fv!Wtd^d zveKR3mz`9id3He~W>1iOm07@IF3-}nt)RP0bS2Gbe5A*t7wM^|F9r%Eah8>;TikP{ zgpijhSEw8`i#erqx+|&g`6pS+0&~5qEh1pWm@#++M!LWPsM^@NaS_t4x8xAY@dPLT zEZNbqo2v!jQPJl|QwJq;$>Nl&kO3)%Pp0AJ8E?>vQ^*+G+tE2UZS%8sKI;|vc*k$) z8D&r2yb|MphU6KTFv@G-a)NSBs8_H6TMoatT{ zmt)cq%eF_)@XHWzFzUfFy7DUT7&$L4wq;(CX8a>I+m0@zkj(rcL?9(t|b^)Qy_zN_$Gc)0&R zG7B86KZ(*ZoWl*Jc{4Qzr_0}L8`W>Gv#sOPixocc)2tDES4Q8{Hfj0*&(3U2E0Qi@uXiccjK=wWXtWwN9z%%{2{Ft_<$Z z&PvGYCv<9`?9y1?Mp2)=gFQ``VJ6Q|tA4 zO2C{bx}-%K3I=KMy|buFE3%wONA|FT?P~)w-`U)x?`<7A&Gy!t?r0IJ&NK{z+fm9Ptm6{h=5iSF@gdKuYH#Vb3*+QXU&q_fM^1Iu)wq)E;#7Eq&q z(i5y7hdr&Su-|wfe01piE9-3ZUg(t0VGUAy`mXk{053RZ3wgifn7#OGS;S-9hH6^J zE~|Cic*md-YbD6t-Fkg=-xawQ^1YWIu*3?!W@L zQmPqAOyzlyg9Ui-OW1>Tg1HT8tro_^7fa%GxfG8ZzI{8&2!=#k3f694X8}=L?aj^b z!4dP2yj`K)$eUz8N_%gya|PD0n~?PQOwVOff1XwZk?)SOs`88G!)iH~FH0J76Z(%& znKtuBumGtlT|IMBVuNka!$ljDje^&Te3eBHu71SR<78zkw}#85Nks}0>{>V-22 z`)EROslVmnJLmCJl8Ea4*zbvwb@8wI-Ymp0JQ*2~bRs9pV2dn3{%2msP1A;C<^0=Y zHphZ|;B(kroCa0Iq-jYKgfRupupMD`XBq&YV#IcUP?ZUlb@Cjlp_VNH3sw0m2liFpaaW1 z1u_reP@>FJ)o{iD3+Q|tD9kXcw?FvQ=x}{2>dHCG``1U)GDh6Aa}oH@Of4c)vqSOK zwe%e>r%lwKUUbqimfxpQ{K$4LH~1Ce4})T;){Z+_02WSv2x;o2+r8G6%n#pKz#5l1 zqz?6TOfn0wTV3ATdl~ZoMJ(W3oFY?rAOif}!2)F9(EW79QJRWOYtJ$>xG%={@ae~s z=1S9La!)*Z=jQ0hpJgkWZI7oUlB@T1qt5tNj30@$UA2(=`h^hZPuG$Wey*GGf%0_b z06`&RILJU=IwGRi@?s(jXs%}3s6mI=6f&wPshztm0c-26GP!_>5I$pdsH~LSe#OuH33W_CUh^&YP#1 zu06_5pO<4djn*}@w zoSfKPg~r6NfJSRiWAGFU$kl-}*eoF#`LF=lO$5WcgYd)2jsM{Ze+;A7mc!$D{Q|E>rE^I1W|(_|ZSWo00X!=1N?%uOilc^XuvHgJK7{ z_nC2q#L&DZ41%3|t((QDO=Y)v=oIif5`)TmGU;Q^A6;j8-p|j%*ygxRmP=aj8XQG( zjrNzQC4PJ{-<|y?{Xn_axBOxE<;%r(i`Oq03sW~~AOB3u{|le7vHo9NoQD<{V62g1 z+D&kUPe#K&YCWU5FuSrEz};`vs8)3;D*4x(Rz}US&(u5PbZ||4A<9O!z5Bb?UO3Lq z&NTQM?>+o;sRr1UF|Z{I*6t=aFAIjX5(*em^uy-HC1lZu3LcwJV)cB@HUz3`-tZ52 zh{JdxE%{tp7&mdIyLb?Fso{M69{w5tz|Ce+Dk1ln0~wH1u;_VZE>)>!KvYVze=Rz7 z{K|)>{cf_y_Fw;D5)#8ufo$Jbx;i5*OckuvW$vf)P#l7!4p$e+$j2a*#|5xQFIArz z*tAFUK^;97!W4SF*WttdO}f@~3=Xq#)qLD5i{L_4C+{cii4z)~FV{NgBC<@rcyc9^ zx01+b!9L&26ad-XEbo*ipV3iSX3QZ>aLt$~BrpCj`g~;q|AS!etPky82L4%fKdlTh zO@-%KKnd(V=nCURy@zjOejS%hY3x5Dy;>6V=(9}lFf<8 zhNatxJ@k_UxROVkVQT||N4-14x2%OdxYn15wpXHO%b(p#Gx_?pfwFhmIPxX)Et~^% zB~WDs7Ncl})DY(OiM)w1>N{GaNOX?dd5_gc)e4?tdS!C&rU!2j-ta$kokT8rlC)?| zy6~tqhG2b#g#4_?N14M%!rLZy-Cl156Trn)8VtHCtyzFOTncrvXDaD_m1(xSlvsk! zn#a;P?MNlxeLLPOpwajt+#25i!4*S2h+7(i5EltvXuYJL>jvA2wnG=xX1jkpTV^sV zTytQzz`goB1r0FOlrCI3_03U`QKDxxJto`mJnV2+RiMun6Ps;QQTRe7ZpMUf!^W^y zcr(TYaryI4Hs&)X774l5$u93fZ3z7r7g76i=9%)nS1(jgVOt)S`Mrs(F?hBKS$M7z zMxp^fbma%v2@%0ji&3N-Fk!cy0n0e$_H^XF$yiMM%dmwbKYWeXgfY_{6jeqQ!DC`D ziMT^bgYi<&G<(>hN@EzMX6ES|*8wv^{z!tR1lg>JS799J+oZ_&Db?X5!#=d&^vUQQ zU-}C*^BV46{fvt}U=WEXbQuVtxAo(Bsj@`m;s{OirZrxgtogcRZ0vQfk~iZ;B3r_@ z*aGA^rFGGIurR7d9Jj*;CP?KmirIW?ruFp>gm_8=7V-YXP>|_BPOs$&wsey;Z z42OG>sB6z`Pw~)Ndad`9izv{=vVfZox*@7Dj=OtG_NmAoq(tyWC+YV^1v5?IlRrWc zQyYt#QwV^XMY)0pqf)ghQ*BOkAzQSM=D-%723{D6p}%KDf|EezA*E z$2!vp!DU*vzNE`jJLHXGd{p7vD_;!;Y^>fG{o{$V#z%L8HtVfbAn4jti<3pt# zs5%v&i^y<{-&t26ai3>-a?83KUW!@NB$-o&sK`5$s?o!@Ovvfp1@4F5AUst`PX=4; z*M%a%q_d)Y(wvuObcEMjmojOxbYsRt=J9zXH&eO^^h39q-!(9sbY3aMX4!704Li*5 z1RVZP$5t8o2i^G3+~og&-if82Tw?(nNEUE1Kdl_(06!-|K}ZD)*b>N3BNQA1nZ_u@ z)&@UA9#&gr1$n(!-i%Plgl2wBi%}ZT+ntp~1}i2$_Z<8k2dEDv@khgiAb$u`3x&M< zdpituGm$Y(pFhMrm`g5VY)>bdc5w+^ut|nqPW;)vEm&;Jd`guby}|+pI+$%pt<*?- z0u@3kGHAj&q}_!Ba|XhYV+KDRDR zZX&RN{cVIT2rqucHqt1mq3!JLn7Kj=kWR50;qp4Kq&XVF4jc(AvXZ z#l}E`al>sH9u?sseO=YS4T7Ichv8 zlKA$=^CjOv|AV~oO%d>(a7P4994+3>WDono+(mVJSM%gG+#=%Zfund+hcAenSpsH) zswYU<>Z?*F(M~d=>0CKx9t!V?%MQ`Ic9ec+*peas1(rBLx`LtVBu!^6IT4r4r$iU; zWZR=mYqS!I&2mmO9UmFXcsv!Ul^blmQclDOql%h`8<^7M)O7z`4@*$PpZqmydXnq*y0@+F)@1&Y4k1yYMHM2=~jpZJ8N_$#`s$DSbC? z`g_!}hWC*6RAX~=07K`Yr&Ysk$6J2F$2R4B472;fpWgmm0J0?A#KE-XkCDR<*<&{su}@GpHhG}}f$#NAzOjoA!g@=4OR zh4m0Vf=gY*3D^(Ey`M2Xn?Le_$E%MS&H_l@SxYUGh~WW> zY?q#ap0_^~gNjrAh6It?^`g65M*;sf{$S60rjV6|Vtj5tx&-N6)eT0LfxJQW9^+Xv z=Pc82g@BrwbE?w1DRVo6b`Y%HRVDe}1LTI^uuwN4N5!I5{pBp}+@}=qq5^@uR{}bM z*OsYD2*@55RPaAu3R8z%h~9F52Z8@)f2zyRNB+DiDb=q&tC`p-)d+Wkwc7dMH5Ras zE*{0?<(MW!+IrU^r9Q9NQe%E@vAG;_Y;3@-I?p(N)|53UArlsLh~Ai;9`FXZsJo+3 zk1~6TzGA(~;mZPJa)B^?6!t!R@)4Y?N|x-`LtKOHM*9W@y85W>>HmJowe;{VpO!e& z60{4=8m#Swkt|ri(1=wZL~QAwTxb#-Po7nmgb0fCN`5nLLtLBP1XbUEDxm@DHNmqy zlL(jAmS%?^0+{p8#^LO)cY*K2AJN8B1YXp;p2aZ5f>OeL|H4_#C*X9=z$S&-!`ww; zWwx`Z!{E9^_D z6$&}U{D{6YZGKOtr#MgJPPE<^pEsY6aVQY@AtOrFvSRYWY3DqW1F)sb&5zp6Ppx)` zvi+}a>oR2;m4vM7iLDs6a8e|72Urz{xZ4c{47P&NzCLfkk?zyEosJZX#Vu$+U z{09~6hQz!2Bh#*Q@pYOfSbKGSFL(<%TuDS5?CGsC+Wo1g>X@`!dXJ~Xjbk0h#xT{$ zNU)@tE>;g=3Q0yPZhfcqROT~W9QwGkz>~3&(|ay+=msYtyoGB?Jd|0gzHho)Mc=?sUX` z6y3@{haCUKcpRrd+CQ;WM4E1>Fo_%pa<0{VRdL;VL!dBk=Kay#tr8513s4}ru%=Ed zTkIn7O+PENMLUoppAipC)6%y3b$mBt=EL^VWvNJ#UA@N??18RuQq)?nj!6HJ4@bZM zcw@PbJ_FXaBiYb8MAadj5p|=$%BoW}p$7%1H^cWjkM8QDpK@DqIibmbR;u<3vXuY6 z_!KjmrigO^s7dsL?K z{y7V_bxb&hejypf0$iYY`_R17bCR|cUk?iy0~y-}tdN7RAgz$8Qe=cgF%vM8;|Ezl z{8w!zzLy1b4?_^Qzkqk2%%*gcZd$7J!7)l*1CI zkaUbFRdEZJNQFGQ+%yZoJz*eBA=kfkmTAg+AnmTgpLx{9kTAuQp&ru?zD0Qs*e!R+ z^%5k=QH+7@%!6U48Ot@`#usnu{>{&A&`2cbt&9J=Q#Y(XrtH~p8y?kEC4XUT6UaA) z*bux_tc*20G{9Xilbt!%^b*{ad81K2y#JKb(9?TxTL}Bvt8VKMo_L@!@^F`>`RRS9 z*A6JrXTiw@@ZNCJeF)m8<2k7;VEQv3%G8=BoLd~RaqHueRi2rCLMcC0UUbPko!JK~ zD0@J+cH5u80?veMj4+z92D{nd4{>qO@kH-IzB7zZ;3U>S##6WNI$1kHCe+&e#j9H@ zP1j)$h1jTuP)08gU-!}g9L9W? zknKryK?HM`79(~M?)DHZFi8j>R;@+yE*!DYD)~?^6Xh*$F7wJ+Iu*bXkwnbWuLO-( z*OK0Ga#XVzA-b3*m=Y3ta%MJ8eg19qhmQL&z~Bfytk)~RJ7SCL`$LsH(SVObCf&Lb zi&b4$XW?BK3Z$+PRd8qUf$rf7aIrGW9!0z2Nxq(I*C-grv8TrCe5mdK`2r0E)>^|S z-@?l>BdE>O+y(v_RP9U8i1+Hx8hJV$G-@p!<+-YxTC&1TpzUJzIqt0PnItcVmptYk zxKI`O*Il>objIU)>Y|yZoTT8 zp#(8o?(bxC+A;L5Ucya6tQfo&xpP#xGzWK9d2u5)>Se`2#dnBcW;y|K*Hn!W%3vQ0 zaFgU`ily@Di`SG|>Do;U7s3}wfb;0-lV$6X{EHgik8B&nD3zQ}Uf!NlE3(gOzTKBpcg!-DiG>NG zFh-=HD4gB};_>^%AA6=k9z|yyJ3Vdq{2Jl}SC}Ydl>N~`Q>sE?wd2CnM^m)V%KouovozR3#GH@}+#ZoCL5867kYYUSHTcXG61(`B@4wr1y&` z_9R&JrLxd6grxG;`ADYQm%p?tP^y9UtWN3P_%zhRiuvWf?e2^TN_262$$>W*k*M}mR zbNbNY92dL&JjGPF(=;oslN=#djsv0S-jXSQrMcfM?1r*%Ayb0PiLQQC1Ag+*wLAWKmtu4xW71goNZ{OpWr}0Y+wNwk z_j6}Hxcum$$E;m2_LnsL_j;4l!Is@pPdi~(sN(;iyK}Si?P?}g6x_Zuk|6dwHwU+P z4hFeHM?q#a1Z>PqN!~)>=kE}wigX9(Zb43Cy@T`jz*D0&7!;-D(I20sxYQF(8?|BN zRYh7eF5?FnHeYy3iVNE=E1ibVcWK(A;>5 z<%Jk)6rmR0Nr#-gke*g_A4>fe+G4ia1&pKq&M*h!yGt>RlLz|h4cmrV%H?y5>_!Sp zvlhqszF*N3adC`ONsB6ux!^gZm2$gsemU#yH;v0Ly8?at`;oNCZqOO>_`gq;fW>D* zIR~sC?IlB>@%91KEP&E}Nt-W=FDFs7a1cLU$O0yK=m(fhkgfavYXFFQhy5-?@Q*V5 zmx14W`iL(+KX9b#>V}K#W^V_dty1#EVaM2PXP?!C*h9tyg_x(1=Dptk@0w>U^v(1M zQB#g)WmbKE_{^fGaHh!P+^=wd52euE(5Y<<_K|n*qX|uH)aGZ;P;-=;ob9G5zAM4-&&?VlNoql&}A-g=6$tJ z){mY&F>LL^@etK+CZui;PhuDKHr}T(Ei#tSYnc#J^*UZsIFs=>7fJwqAZ$SCK3;f1 z3AnkQ#DtuP1N?V6%rHCapdNz|bTFrX8CEic`7cC&d@#c!z*tebFoNQQ|79M$2{5!+k4AHGkyvqi=85#AdnT=(lB=motM!)M z>-r*02UVN0gzkCn5jnN|0h2Z9HBCk)SUU!?sWA714dQn*J{W%tfeBnuerkYhwfs36 zO5cjx35pK?to%U5T4U|WT=fo)qvdyQfK`hj$;C!+dvNl3G7o)^cY~OAtnx1qxM7=z z&z1b}_^k@|)8T~hm54HYFz;9DP6m#)k8afsdbA%}zVwl*{b9jx*jOY!OnF`B>O=DE z!Oh677M?sbf~G^~VPsT=zPCeLQ+XyA2*TK%4)Q(9#oRLjL>;MXI}-3Eb#yOkJlU?< zK);_bbuHt$_JC-Iep9^I-nV7tUfWKCcd=(JIcN%ycZ>pS8wnf+aOP)gWMSE2-qZqi zkK=^x+eGUDcAmnOCORR27IyQ~lPEDc&Bw3JM>t9=PhniX! zRhVjZ#J*pWNL-jha-h#La#+B%4(h>;8l)gywJ&d=kqMNCCt4Mi`ZDr3yIdpO!+csz zjQycBGdKjFDqD1zk_?%G*TIDis;Al(qBZ%%J=#0RhfUSJ1kCvSc;nPhyDmTcs*?%T zlhLan!Ip!y@DeQbApc@w5X}IEbVTlSf5#l(8o1!1{H;n+G5jmSoeohL_aebsIlKVX zin;A&AW7Yp=FK`#sZq2d6W{{Hu_Ql4 zq+>mWEG46~GCp^Eo}YG)@L`!M>l&L^1x1^jQ&j5^uc=0SG*`Lw_ZLk{n>EmCLPbW5 z6mn%P^UzQ@c(bi?!08SDtSSOv!<-qZkyPS8H)EJL{J&U8SK+;rYJP=m+?J*=jlJiyBu8$ap7ki`r1KEMpU260aX&m+u>NxciR?(z|o4u32(p(=V-Xp{(zAYTq zFdY(hqx2@OxA3QE>&JtKwZsl?xGygUfzi~j9!)mm*G3wNvpqkshe6Wbp)k%|B@?X% zVThj!r{^@yeq#Y`CiHn;rE%Mvm}IY?i`XS?_-YqH*ZH#x*9|^t`1pA+)6{sUgUx-r zM-`(DcoHE}b3gN?lL%N9;lxl1?=ujX3)&YdHS@-+<-jQ6#ccJBm`!@~1HV^(;FWq~ z{G1=5+6Iew=9?dsq(S;ro>8IQ4y&+6`WaaD(*=q8JgRrtZZ^}45ih|r-xikMd`ahc zJAYhkvdW0Gd~(1D;m-BC<+~r|3B%O8j-b>*S9~Ry`?PnK`K@fz+;z1qhi1BiI&v-} z-RO8`8-waNL0Jp*=+pjzZZ!5rMbz68BE9hK?@wKXRZKr~n%{YKV4C_t`Ie^5g$BbW zkAS{pcu?*1fongS1tODQ$-j3SI|8AqS98C30bZl-=TFw&-Q8-g8G=ByDgw4hU_Nj# z_G5BG@I@WL0sY`w<9; zQ4J)-zx$mCad$0Jf$cFk_~{n`0w0HeP0RTw7ecqPo=(bP-tVHy{s>*=2djoN28Ni6$km`wE!!oT z4mFj*xJF4~6M)Wje90Qphxfcn8~2ye;K|tA2udz?^G9#!`|r$PO+(}3_{rZt8A!De z%E&mK_5Kqltfu#p(CWx=&4%?k*_fl{qiev$ukJ^^yw8;lH+J98)ZDAoQmtG~uj)u< z%Kf+;EE>)0wou4-f6x0}k1DgJhVt1fCd5&X(N_8Rx4erFfVd;UOO7u$G+V668v=cG zyd2E%N?C7??{wY z2#YLI$|Pse9}i;~LEv}$K5*acQ)knCwoeWAwweVibTKv)2VSGOrAkcioDuNuYt(|E zkdM^E-@+$EoQ}M&&>5Q-lWZ*t)rs|RUWI3uHyRe5j6OdA`vsQg9Q)1dsf+!%!dk29 zvJmW=9U_UZiz zB-y_9yvPFB=^ae=>bknRdb5bd3VS8auoxY5gV_tIQZ9Whbwbs^`iYB+n6gmn9r`oe9b#>(Y{0`d9knk z=0MIF``!#9EzA4!R0%9{d`~ai&9o5f@7!9SJ30qa7GT>;a*y2Tma}Vs)frgRF}7RW zF`GLE?iSknd0iBeAD3F7B~@;u|MWu&9*ap{W%q{Xqj1T4H`^QKJVPZY5tqg0NSIN7UZYt3 zj@x9$;8U6J`J$P3>=kP+v=prS?n%xO$>Z+Jlnm^-R8oR~a)V9d3g+;(15-{sXUc**(0X=x2*1;h5{Q+zJ^T?+Gz+FxEN^L zEx>rHEJ)g6F5N2alnz7feT)O_{M6&t6yI*95?FgYs&QzQg5_}h&^6s1#=nA_MAl)8 zV2f?j2&w{i3C(O6^;JnVCUsxGrTAlZSGJ#vF2}5+gA>#fkqe>_lX#ZO^ERv-`_Z}q z_h5^D<8)TnPZj42y)Epb$X;ve2J;KVnKpC`I}<~3^#uO9t>E!Ce-H0a-FS{M!zUlV zznhi4*%5s6EW;nNzx(IHguBo?$s9z7S+D_@7NcbY;KlhF#7rd0Nl%%!*> z)MtzopzkI((?w*yf+Lc}jN22A6_wl+YIae=Quttl)UN4`(1jJn#^B~=>`=uuJH5EZ9Sl*XADtyBUB%{RGcb_88PsFh4@Jk_`10E z&WyPrW`HBnYR4rkU?)D6#PwK|?v$*q%sI##rU|P29L<*6h~^f zM;5Bp(z&olbDz;%aBCy8u=n1HIH#V}a$NhwpfhtD1O~YPcwsTT82Q*h6BS`bZS=pH zRH6T%uinB{!o4zKd{!;&>KK1!*lqMJNG48UJs`;%7NzUjh`1+?)+C$P1}_eq#-fjH z7&ydgQx-XpBW!h>>73znmX|uJm=M!ltEPb)`Q9i-SPG{dcA%zHZc+POgH<&v4^H3c zURGIs-4)u0vX6@>z|Hkg1Uf-CxgM2e2)%Q=>6*rR!n?3`J$u217TL)&ZJ4Cn>T!L& zXff(>+8O#G#%sO(BnH~Z`%d1?igPJ0eyb+?QcrU$LeysCCm*G`YNKh>`qvzG6{LZO zfu|4WFP?HlJ-he5cyL&K-oKGU|60to&-s--PfR>8Wn|@P>T?!gn%b8z-o0PuYuG}9 z4#(UHN%^m@J^X!z7n@j=0Gg>X8 z!*X)ml8=KY=n^H9@&klxe4uz!xhL#mxY^pCWHwms`19{KH}W3_2)E8z`sgd=7(IK# z^IwsDe<-aC-l)g1ze|4%+S`vDWc0c+Z9hV!k|}7rUU)W1F!|c_{ko==5PWo?cMDi! zo2t0mms?Pw79kn?EUnbx`j)Xu9#gzpz^WF$Yo`C?e8u>+qWSm7?)c9A&|ml=j=EZ0 zYOZvwf3Nf2i;j?@2`*cyi|FXx27Ca?2U>(|l*faQcQpB34IRCSDNrd^!XlnljhIeV znLZl^MpItAv`wa7#qVVSuPR&UABrJRiGRBJXO9xF^R<~s_la*}jF39i zo*HWdNq;bF)+#-9-1txw^nirkJ$`4TQlo_8{jb@6efA~R^_mqc zp#w={H$tJQcKWJA=J$;;m{6DF%jsnft-CB>xZ;Yc%l=wPqVpgv zSZr07d9{5d_MBbJb3tKov(WYcj|#9qi=txsdP@D4#L-U&9rw_B=97O6(6z!LK>H$i z>d(kesMfdbU%1d;rN7Y->A9j*2M&A!=MFG;5;2<+)8N7qf}#9C=z?SU39KaC+Nr*c-^95pX)%Y#shJJx38j$WdF^?-vHh7RWfqtSv#)NlY3f$|4Qk zH5@?QUu6iVq`u=FY`C*{-TNoT+v;K!|71DcB8Zam#<}o5eVH-M=vt=d&Sji_`#?GG ziK&p0yUZG3JwFa3sW+d|i8FwgBX=N2Kza=Q_V9NiUJ(^rIB0&T&6U|XPz|9+m7X62 zJT#3<`4rI^-s~8Gi(Hp3+y#C>g+Iv79JvpenRg?e)paok-a(A)c|HkVz~Fr5=z~jK zFEIdHZ}Mhy^SHJyz1h6y+{l3x+?~Ck0A)=$m(16U_2Qpe5-9M>+VdGc^H!2D2FpV+ z!gz=vf|EGLt74^@_R`0))t@{5YTmMkDeDMiXUxe6*TFsvS9k=$JK*vubHpNR|TR$Nh zw*37Z+703rZ>O^Whl$MrO=Q#11U=RlK8bwe31_yj^^SW#l1icmmwZ+Y^yVrH)}&(KwluGu zlk-D;UTz`9GK{$(<|0%n%~kmW`+YQ|`BRuweRfk%gGETe5@YVpZM&8q6(!gy7}wmm z$V2-hg5&XDvYy~u;d!@DCHUP@NQhy+Xe%7mV!!V*c=|wX05aw0#O01}hX=G9XRo}x zMlO+adj!n^Z{w+%4rgbw%4z6IG@Q3%cXeX#B z3!*U3WyJ8ldGo8+F2yJ>&?-z9(c|2f!8TJOEYjZILsU8k>4>;gTz zNSj}!$(}i-*Mhw;hj|tn!vsI8DUCzr#W590weVpmJtm;hf=+bKIeGoo^v10kZTK0; zhFx58HY*qiNO>)KG1lBOP_X`x_Wt-<&M+B5#|Y&x30ALq4@SC3cnp%xc@Il{nS1Vd zxSu~-Z`<@Yk%8xhce-wcX+>|V<;eG-t&?11G;rc5%lby!!}sj$sC#Y>O1-_S$po>a z+d&Wwyf3UBS?UU<#12G-|CGO+aK&?If2(K0=V*f)lCO41tiR!pB}~ra22ay>P&cOt z!(}E#kxd=MofYzHM+2Ch7idjzt9DQuS!mrfA;tWPEJj2csG*PcD3`qUH?Fkt{P2?~ zXnL^2B10+^GKE6}bP0Jf#)?ryn0$idfs&3;a5r~!KG|W!*dRSnaGCj~Jl?+lCg?AG1}EbPC8kk?$;Zi&@nls>PFFx)Sljfi_np5(69GRXY>gwazQ&tIF-iUwy?MVtIi1 zo&{X@-iJn#akU^H`WCe@*Jx%TRjd#ibXfKZZeP&pq3MWJt}srp_9Pt2Z0w+)D2QsV zD8+UU}(rVV921Y&BGTV@f+sO=R*qLDehi%xxpI%k4p;F@fUT zeRR3`|#4dcG@+Hg(&G;Z}5t7#6_mcdJt>cJ7dIzlmSNhw6- zQ6|dY>SccW>lV8q`McP|-z19tc54SmAb-5(RNBF}TkbBY?!^?4+~YLB$gAHdr>Wq)x(6^r%+Ow3GC6-SYk2 ze4mTk>^uTi~Q2PEu`pCmO z(Y-tTnwPDAVjJKQ213*b|F#P25aEJ6%5k0^?V$Y@F{-4bnt^Ye*B$Mvb(NWKZZgPW@-D&9X# z51q7duC-0tdVRUu14_)?HkJvOrAM!o9^8+iWyCDX=-95Q4kM>V==&LIRW_u#^rI?C zIrb-FObjmh--Gk6hTLwA;kNrXOZI1A=TAOM9Ucy8ds?S?lr{}G`tny?z=Pz9OrHA3^<^to?)DB zbZ>6;Y&|tYA5^(llDn0D59PSefa@S`0%1d7ly$=&RW5>iQBh6m9Yvytycwyldqo5L z5nqw_3V%Y(NoYKY?QhvOi9;_X9$e_d0AU&_W)6=P#-3cTPklR$<8`~AQFhW=@|01~ zg8eswsGeTb#^oM(Z#YsvhB%tCQ;~P@lj6{ErnNyXSIs6<?KbDcZH{R)3`|A75S1*6MYfG;+{I+8;IzH2ND;>mqOr84bz_#4Qgw9 z8?L@fs~BE@o)#Kbj?}zeOzVWV3vT5w)9@eiJsQWQFb%`9Lsz#G+v>(+bumqN@i?lZ4xa04 z0)uh<)8+=IBMX}gHzf_kX2#DR63%3HT*}n!GDzGEWG<%}oK1W6qpSRJ)4p@t^dG(( zSXr<*u1?#p(bs7y^|UxDbDL|w0c0`aRsYG4`i*mS(Dw(2ffc{iWWW0#)MV$#(wcwa z!t@;3c@Qcbb9X85fpSQCP?Z>o1z6GNbrV1;70h7`5m>X{N?0Jfi1I9CB^yg(BE4V#XMv>;mlRjz)Vflr{o_Q8f#cbWIKK$x=X=$le z!QkMVn7xq#Jl_8E2!E?CWAL<9)?VY2ye&5qhGaKY@@#rjaxRo9{2b{k-SC8P@8uJ} z;+^-IFAl{fc3Q{MjmZNEu=)yF`o!%!5Scdp9(fbBT+q3??jBX3@09?^SPGWzAA*SKg_z=asH@#s_$9#ZtNuCXaH4arg zoE|@a(fS$o(XhZ?Er0%W-ro<=o;?7Sz!$={_%KWhrXdU1JrWK6;6|dsP1(LfSJ>3w zz{X);tCE-^vk_1xIT4&NqPxeXlkW+YDW%yydv%X9L1Ibq6GyeH9i~vsC(xkyb%oqW zShCm@{V374L>4jcr9D4t>FDi15NxZuZiFg2@1i3WvbHs#jYu$kZu0!3&5H!Hd9!!c zD?g75uE$!~Qpz+^%5rZpo7+ATF4uL{JJRE0y~kUmGl2r$bUBhi@v{XOANoke<5iE1 z+!xB*w(*-hS)*4B+%SE5`3t$2bTKHgkK$mrhWzG37P(`j*fu}A7Zb^6JXW2s4$cOf z-lZSFi}m2U{CGxGL{&o4AXM958DnXtqw$R4`E2H?8eLgWVV|u461+_xUt~&t^^ZO0 z7Ml~-*t(iR$huyY@at&>$M6|Q_n^lWF6}hB++F;1B4%F?quBQw4 zRjNW+22!6#yJb4hLHz^^Lb*FKt?K7@BKCpuV8%%sMz1FtmtQ2o}G`>TEMPvO-- z)QC)$ip{lYP>Il}fccO<^xgGIS@z zVXGi{{Nce3*q{8@3ASyY8?W2{j4{->9%=Q&bgxY5p$EMoPdjW8q7R1!k&5RyqH`l zaYnFjm)fED!}Q5Yd@pWkPZMR<#_18m_V}KhH3=f2$B4NNPDW08(}gh1ZCevXWlR3b z&vBv=mpzVWXSvuMUQB~kB>B$pu14Zk6>*EE%$@fc(7BzlBm8y9-7LTr6EhHue@0Bn z?(JY;vrFDom!R*ywO;o8dEklcYEM(xP7yoO8Xe_w~L`I^)Oga%5{4%R)-$$KjDh`SaBDN5igbW8EIHJLX$^ z&N~C%>fT6W;?>A?#uxh>iu}`8_zD$7s{vm$sespnk-8;{LFIp zp>B z1Y_sp57(zeO-T__B)Hv8G}-UvsDCH;gb2 zi>v{<9bsXxiuAFp0d@LbnYV|nD)|MeGrhF<)c6m1>_%sBNPW`mqpDAk3yod;(McJQ zy85Vq`pCS5--G#h0R!gn*jd@C3k86c{KF)_8eI#|rkLL5V#GhuJ{sOgEn42dq-{>{ zE!Lk-tfS!^o$$|?=dEdddY;k-s{Bt>#MX2bg^>!LN`h1C0hQ}shVvjVxsmgWAskN+ zXcQ5iek-ipscF*e`#uG>f+@y|EQ56)#urQht=;!)PUI3Ep*CrG%T|O8{qZbVHH3Eq z`kZE!O(~q9b8Y+Gk|%NhR5$MrDO+>BS6Wm3wMuV9@`zWfSANcclhic+sr)C#Mi<|I zxFu{q-a*A=t_?Ay*9+xI6Ea9@@)y5AVIN;5R-P6Dgyks<@*# zrrx&%(Cw2n52G-X2wT>yk54sxDA^eo-WJB*8uH|ro4{TD!_*8d2uKPxoT7`lFu31K z&FC4OHOSGzBrWbBn;$3LzZB4(S}H|d{6*7St=Vv5w36~(h&aX@Ki3XSgo&=}5s(y) zlrMIFQJP7l7xZ(xP2aFU!}*741V?tTgyTPO3A&gLwX0LUPs2M%@^q^0 zI?N7Aui98D8^|)+oe%9(5uw>}8?UjIV?>hYh82`h;EBVC3st+;*!4GYBS#mL7OI^^vQTWzHbwgCGhfiXa72^j-vNk%HO5xJ-$w<141fb zZ2w`(LU)QN&8~d95ND`Q{c64Thl!^YH71Cq`riVhWd}X<7c=>w&uVz2ZtVBVBXUP- zDww#)TOTd#!uYEyJ%v2Oe&Evg*E^6gF)IiIzu#AHKQV-i;T9QvLFnFky_fzaTnTpl zzpK7<5Ku^^Az9qRv0xlCNlW5|r`u6PsU5kiB4Jg6;zrfT1X3~H3x#_3D34E^nS12E z8N0!lqr=-~QsGfY@SHz!xef^~Qqns)DqZBEY)2~r!}^XTjAk*7ipE=T9hn|dJa}WD zu6E71(Yn_dL+|4rH5?PvU_4@DJ=88y7N6M z5yrm0MP%ji$j~dOx5#l}+@kF;il^xO){0o%wM1W)BkFm?uuCn05}~#3&`7s~vGcMH zk~?6>+Q%Ra*{oT}M9uom0 z*oaS;tOd~}H5CQKG?UK=oY>DgcP+uXYx7UkJ#6IjA4uRjfWZP1u%S#9P_=a+1xjr_AadHt-+!Z6M=aMQKjJdOp zmJzS&Ay91Jm$(BM;E?{Fl#t>lAo6>o)q^ zoXieD1cMShiFpCxL2!T%>=ZfY0~*IDU70Q3auuha1=i{@;)UMKF{);;0|qVQeBCrp zg6oY&5wTD=AG*=F9{kO_SL9pS_d>L=T~o~y#W~^i5Joqa7dsh=EPWMz8$|wbvnkDJ zwlZhj%HzV33-^yhYG#6a4=OZw5u)oS=&4wjD&zxcSJ5e!Z_*>N5MuH>&$Di8w>g*{ z4!6spTWeo#rPJSP$cD6`Pby+Uv4RS@J|7%)K1_|AAv}x`I{zXlkMmmL;@9R+0b_Sue?-9!&M(zx*quKlU(%d&*+<>_>VCxb)K z7YaZgE<5<9I+TLnFr?l>sM5j1H(3N>1F7tsEhqBxPZ?9l$hA)ugqyDj_ffnV^c#NlVT9j$p)RXW)bQnQ@ zB{khqk0n)h@{Ny*q73IYv;ZACLGt<7M76LE0U<~kE|mM5K4H#XW;6DV-mAHkCoepX zdB_Vt#i=jO$PPjnoG3Cf_79V*jNX<9h4#vZV%1{VTpj|!pAyusc++y<{6;@_%zOMK z(6;etGgzO4TN?9~{4;|*F@<`@-D(+8q@u)sl4aFWi$Og#pSHQvM3tgIw;V_|xY+YZ zxQ(|dNj6UH%10yzs|>BN`Wee)yO^HzO(>p!OOIZu#!jAUNjpQ4C>+)P`Y4Q+1NWTwTuh*o%cZRANQ`h1(2{X66|@| zRDB)37%^;|$h4u%lFInQ1f5KRRm?ucPG(?>VUZ!1D3)`&xr)V_U#^a-nd@9`W8E0# zl%8CrC^K&{Rnb3%?8|8d@T45rVi|WQGORoE^jt3u zTj%PE+UMtlu@*)sb@A*2(e(ccl?&Pm_x;Q*9KOf3<17`vu>fBZV7>5ULx?LK^Dczf za))tVw~O{Qc7ogrEeM9dy2p>-Pf{x{JUjgJ$&RM%uaX^i+>wU<&d+w-z3*k$U;ELH zgFO#x2Ibz{`lQDvM&>VbyHp?-mivoDa=y~^5utf5DV7777jpbZ(#*uDK_R@$6a2o$ z?w>5@iqae%r0M*jw)rYm2-rz_Ej373^qO>-H z-@R40;`b{+MC|BNfzI#W4o~~a2y~a(rrpvj*+tV_KcKZapD~5$m0@ec(j&&zlHFGz z4h&whP4H<_o~aT;Fh$=xr5J(Q2DwoT4C8N*b}RWpz(eg7eHHC?J!CyJ0eXa75@~0} zY@n0_33+Fj^8UdFHM@fHb{-(%5E@c$FV^AG=?xxO3m!7b*uB_-c$hmZ$e|T)p`M3m61OP;70 z?vM0(811x-ti?C|gT)QmkD6~<*R!sAXBzRsex-8(IV8Mz z!|d1N4gJeDW)#NC>Bj9xO9v5|m_$DReVj}%@i7Je#UkvP=oKi^#8r3(Zm@!x zL4I7=?t$+jBWMTDZ*yJq@FJ&y`x%e5wAF8=OD!{qq9ngX9|t$n-5< zv?edD(=31Cr>T_c_Zq;)qVc6peVKO@ay9o5u~UMTSlGV>xBmv5i4F|_Z2jBE<26P9 z|G~$@1w5Gl;p2gOf&8rwm|7e34t@~SoiFw+NKc^vv(Xl~&ZvQ|V{o3_Fo9|#;*0>5$3KaK{0ZuRABRv(5P-{Fwmx9Y%{F!;WE#2o-Nr4 zTPUIP%=KXS_tIhatTWj)Wxu}L48*pe8)@)2YHmR>%}TYuQ?g)Ee@&tKr#rxK#H-dL zqVnC!%}-jp=Q_{!ng?;pc{z*cP9gbfZ+44?@RvP4e&F@g2CS*TU*CE0O5$*9o@ee) zuRay`ZyWjT3{B$ug@D3`<~$QML7GpZM`#o89Jir|NOZM#l9^%A+X=N30d)`lFlqiZ zht_fZe~;NAS7}mYZkUBGVdT?~SD-d>EC@pwuCuMbNovKMjU=+$=yL5=2y7cS(4`l5 zu19hHG+EP#jED8s3pgg=9wN=ZtX`2#VT>WU#=h)`?ufQ>3P;$yKX1zGWPZms!BTIv zIwkLc512o3A-DI^C65--e@Piv|0!j3_~++;NgKl`O^j`@<{ZIjjH75&heLn&tmC4g2dLj{R(}J#YoV$EX4!y}%qb9_q}+NpmKR*5CbFX<99O z!>VfkHBd`^0Y2L+FK40j%1!V&6Ec6I0rpaan=(P_(4oAW%nS9+aT)08;znr;%#LFZ zA}5Ix6bbDps0(_iv1{u!g^#16dE!|yhr_K@A<^$bVhW*eysm$4<0Z?|1V4aH`vBYu z2S~!xqp_&^DXnC!4#(V=VjIHGk#-fy$*Hl4<>o#4-9KUyw5Gg@zcw5YVLkH{+Qq#U zM&f#goW!C@x8DG&6LUn{-GNM<>?|rF^QJd;1h_t~bQbc(9f)SAZNS1$O1#wIS{PUD z-E1?q=zb&_oYnR0Rfe+JvrX?;ew@GdyptL<>p3XEvP%>+Nv4cmTz~9d-E0FU8Y7N= zp-?7vRioEazBrEQuC6t{2|}`hP(-;JkrC)az$Qd;cIh-?ou)_*6JMVB@L|F(D6}$3 zlwuJzxzVEV-HFCoNiU^oVnTj8Q`P+YngaDVPI`-_n&t3Tw*)+H_qv(D`M`J%PUnM8 z4$6)Q>h59Rhmr`c075Kx)AqQqNtov+Uacz0r(y}Gdr(GjT3Kit$6{y55NPyKsOv;H zy2xPp2tt>vbg!Q#;~RWN+cn=pRlRz@$9FY>;r3u1Vs6G+WO@os=rr{vqZ?9!UP>I7 zpr_TkD}|Lw-pm!tdn6J4KzjRjj)pPPXB)HTK*mMW^rujKFiJ_QQo-kilywEXlDtr9 zvD|ktDxT^73ZS<#rA`GerD^0^uq|4h48~&-w z;b)V`sOyQh$^&DEE-Td-w9j!J(OoEG#GX8q^3myvdSMiSVqacd7Ud9j?&`f>#S{Ck zP98C*s5|+kT_)YhbtZzjp&yVvKJqnTd~L+X?U{FyZwpcfR_sUQ?PU){%Mu(8$^3k(QQ(29+{uPHbr#-vIk&)V-CcC4X6GvJ=XnU*w`ui)OUVj z+t1R?Tezmi!-nUn3V=?OcrZu}01^7Tpo{R!Y_iRm0~SiO(;CtaYRA*tn>_B=UdA0( zmnJ{@NqBG#wopJdW&D7FTDHfsVX0{Fi!TNi71J`f11{a?3p3KN;Gcuj2B2=TgB`%6 zM}|CQMA4n96kZm6Rrh>lRQ$&QT0Ylx&w-~JkIcsI0~!;oLrbi(m2pK+Y9XmQDnA_ zyA_Om{5$1f*$pP_?3sD&*YKiXRCS5vPt#6E@q}1l6o4;ER+fMJWZFXHI`3=}?PW_} zVoAP3GAP;$FNRiCiX4mNn&i2>b(d!3P6lAF-e))cpcZp4PsYF!42+DV+ zHlj|CaO5#V%2D_@8yhWeq4JDZTyVH2!>8Urn*tFa3W;h6;&PYUCOR!J&ATU~S(tgu zH{)qH0dfHpNdTqpgvdDy7V@`e`0iipt1W9RF9;&9#6x_E2?l49KnVymcNZJ3Unm-F zV+ZYCOZ}@<2s4w2v_{|iZ|1pW&{{a=zu^nXes{{vHt7?2~EA%g=Vwg`;e z_O9D9y0IRKDJqLS(`VZ|-7BkXamW-~Jq4JhlRHWlJ*%ZMTKYUA-;06wY+T0*RLzqweHY5>fV(s=XhTL*sa}Q z`0wCtk9U(Gz581g_g-ZU4dh4uH&xu~6*PoIzj-U;^nX!n4kG}z7<>jUKQ~$NtIQsV zS%xoVJBFS9n*A@Im07U$j=EF8o{@cNFaO-YHNWSK_D>0kVMC{4Wg2eiiph13v%S1? zU(@MQn`TAe^1)S*_3zMEd5ZL$XS#PkB@e*j8Nr}VBX>I` z(l35;y)K1p$4LiPp@g&^kZeEl7iWg(+nNQb+>mLxrTPW19=#UJ9;2daBP?u73w>C| zA=GP4nN!)Asc`Dx-$B{l`#aB0QYEzBkIk7W-S)CQAhDo~iAA|knVY1(6I>MqKZnA% zAS|=8h4z_!@z81*$%3LC*ZuO_{h4j!gdOF@9nnXiqvKsO_d!RQm8`)aBkzJya)u@$ zJg%ft1#OhOWdU)e0W_^s@%{M8`ip;<>Ildt*&mEI05jqQ8Oi`Np6LPhsPoise~VK< zs)A?Ve_FTwYcxMUysD|M$>d5?prD9d;gDmcs3-<&Wsr@YR+Zixn-jV1LX%TPU>Cgv zo%{eThdqb7Vuvy{DFvB7BaQF1)aSZ!b#k;HxhUGbrO2>TIvRPvd_IzPyo7OBd)4z(y>T;Oa!E&VyTM=8QLa3fA4p3!EEL6 zwCDOYpY$C!F2nEvY%G)_RtmO>TBI;?G7QigL+}q4=L;jB+xJI3Kt~Mr9GW~gStw2I zqy$WLanNp)9=!u~w>IK4=r31Oj&=yTnVAb~_x$z0O>+x(sH z0g=dP#%@^`MO1dF2dw6!6wg0Q95|A+t^0n2URCIFtyP9X5I@yxUz8HYbhN2Z1w*{F zl|=u*5Dn>o2y6mbAJ60QF0<~!tnybEzj;LN>)$r+KUwDm*t%$IGx(M zFwB=auuI^du~0rE-|SEj0_qVPctQjb;=nfdo;LLg&5`^Y*nXjTwTo5f1lyA>`c`fh zlS@3O1ZJ>B?n2<(`N?L;!?o8YWrx;@&y4OZUd!?6moWMkc~n!Z?bLANK$8hldUkq_@V+NxptqMSV}2)~br8SDW5JOJWEc4HVk{_rMX z*Og2;OirC~`dD_d;JxAO%&QBmH{uKece;q?wByjN%7G1O*^$02SpVq(1y_AyW&cRy zHq*jM>lGwIg!Lz7%kKm+6g{9s6J!CGU7=TD?|+aW@xM1?X6>LqMUOmjr>vKu=#-k$h&`q^-MAGZ`eG6YEeVqLX7L6)y5LF~ zdboh{L_acMqaqwn&vc=iM5{jBL0ki-p6OCPKa=OA}*1As$i!^|R?8hK6KDI*FHYc+y*TD)UE}wZ|oTZ(ua-47lJQCS-$# z0y>O{XB_@c6f%&+zQ%z(moR;>W0hJ;fgYYCTHn2?8IrTC@qWcRJ>lrkg9M{4SytCxp0GI#i^D1)?^AR?+z@hNX$5xH}+N*nBU*918Yd_d~#duPb z9+*>an7M`W@oFr2A#agL*)L25B%*imjaTHl)fC-xDw{FXA>_DQIEi;x`}vMZkxFB8 z*@}@q)+|4TIMD_yUDRey+>Rn}Z!aqH)V?-)O*_8xffppCdn5lccLAscM{I6{@qa%$ z&*KEr^I4NN>rzyF+qhgkqlc`%JgCAU?J%bdQi_%>=N_7T-h7WA<5}Iw+(I#v+&=kQ z9dkXcPhU%@n0(s_?0A3z5viKFn+}S$ag1~SWkL_AD<~<#d4~aHlyj#2_$>+W+_z!C zjj<(wxIUAj6pj4t4JIw747#xgRRd?kz)vO~A)3kcU&ze6{v4?#C3;Dt z!~0p0G#tXd@ox%W{9U$!kvbl-gw>wG3gb?M7t4DS|D`O91EdW zs}mU;8^MAgO=aGK4*9D$phqle(sKsk>+apM1?$^qwQxlzFlmcJ8XV)U{q8$b@L)5GGV$K!AGYqH5|=51wAq%&qL?P-G@Gdo+3H(B1J>mO9+}-3hT0 z+*9vM-S_nMNHVWG1S(up`x%t)>sKt|4#!;yuXWK>TptU}$=pMtm0UW1N0138(uh74 zsN`4AA;vAi*}TO=R!tAEYpn_fZRS6b>>J!)D9_zz1j0JDW9O{C(iZ2o?0;BPr|F0M zVIrJ0mAZFja2`WcNXc^d+pa;NW}rgepUrS~Yr}4g?<#r&X2m<=$bTe^ZJ_LXH}0Iv z{EU-d+m&~I3{&#wRT#WI%{8Bdnu@}&AF7u+l`A!-ZAp`DJ?TDTCowI)4WQ*)y6B|3 z35l{0Y?98{6yM#uLB!cr!hg6FvHXXF;ooK7`|@j^JB(Yg2tIc;F*+rxu#XO`LmI$- zJelW8^0SWIx=kT}hAeShzpL=FBZ4??Hq~)HP;wbI((E-dVU=IRo1kKHR9mXOY4d>j z&f!}Xd?{=JkCugsEw<&>msXW)qtxqLeJyya#BtIr25 zLeW;15bF?%EW3D>2kV9n2YF!ZWE`vvfh8Fm3~3vn%_yeCyl1c%<9rndUg!x0m-7nC zC0H?+AwVMjU=Y~hjA#IMhfN`*NZZQ*{2ll`pirmXfYY5olXM|s+=J#D z65wmc!Pop5T`-dM>X6q6^&~QaXB=Njq1b##LX>8$puJ`hr$0b(*3V1Prf|f|& zutVtPC<50oOXEq@bIk7!ZQ%_~=Fl;#3`ndQagY%cA_s2i&;-d4b;93rv4J5_-n$Vs zZ5{?kNj@^y60~B9duBeZv;?S}gQw_#*l`!Jp?Ogxrv#O!$)#Psx${N#aA)@SmHr0p zH6^eV#f^$a^bpFFl1;)iL;21lbTj5XC_!*N2c++`t#!oW?@ydW$)Uqbj7+GrdkmyZ zcDafw%oT?&!91sle}rHDTCkM?%-3}+T^6p6GJ=a;y9$sp$YW4AY&e|wF!3Y=Xc`0- zQggO^G6+h>a;X9i>Ngxug-LJaO)Am2MF9zfGZ^~96$KoEu)`;n)sVgbmU1K67Py7w zXS5BeZBsihULpMkuxB)+DYBCW4ba$KzIgGOOrnm$yGkTMvbZL)?bWSVDkVNtHPTus zP{$QgjwI>0Q&d#9Q1llx(@%&?^ejb5nk#8Q_khvP>Wr;Lo`}u8-{tDkbY-lg`|u?K z*RlaA^A@Fxq-_yy)vf4ncF!@iiFfo;(YK!iw$DU1X=V)YFp~7J6mg}N3CdXx+%l4S z5TS%_85c`!6*%2jT2pkMd~0z%5>NjU;q&Hn3>x>>6AxtbAlgw=?5c2h&3mXMb2K4;KYhoTx zK3!z=rfDLRVaov|_!MT(?AjC`j*un@c0yWS!LR>eYD&9O@qy79V271vmKc*L*$=0i zG1zJLBnccQV%WR|7J>f=YNUTnT1+NN8b=5;u)NX?Fkkir1bP>`9N)Nze)fl{lrz-5 zzldJMt$fMYEx&$QhNRQ5wMvnv+)MMXCMr?(%&V-Cci^DSVK8LF4@fC;$(uL=9cp46 zHvY6=o_aRT?ANC1i}$eMgOhALG0>_`rr^DjDv+%S57sz`I2tq&4Jm&0y18D+s8{2S zJU)4G$OL(Umo^2zV(Ky1U)2Q znuJC@uGP$%&?=T5(aHZ_=?MSib;9RNy)nHQJDCJ2MlL61cX|?+IfbQd2ODLKz8~OU!6O)#|Ez9x@2cxhu?XVX*hGfHJ{_TToqLDd^rmr!xA0F%b^1)U3HLKoi#|E0 z4%B&-2a4xc7*&1Kxm)8nC%uJdumRcQ0VhfZ)o}q7#2>Gh(pHM3u?t3UUm?Qty`LG! zaTOq)vHO4<7q%F>G@q`WK~p0=3`=ZXeEBBX`EAXIAFACfJLwCM{UOTEfdRkVX)?Jj zkNN%H4E#K#9%!C)Yn$)&i3>fMp1-W`qrMTb1BJ7Mil&!~?n@&D#~bezg$rJN<}e>k zGXY%&eriGtRz}YRn=cB25bB=nuJ!&jQVOzj_E+P_9t)gnzbGH<#7tp}yW4ao-|SIt z&O+J=`~{j)p;ou8#VwM)poeMqWONbFg0>}7h2}+_Pbq=j%%3w)ZT$C2(X-_rmfakx zVhEY{n-)0XOC9jaO?Dk$);nfC=8zYdm+(1&r~)hd)u3nJiiT`;7ViTjqbuVO)`Ij- z(ZutY$E83Ma~Kf-RE3Gr5b-HD9kPI{P;2Ty45*lBQk8Ag4W7*cln?z7^1@zTjdRZ) z(S4x)F>ovuO<&NyTLjxsO#ra%>llzB+}hR3vmLT@0X3Ph^aO!JCm=KGEr<#}Qs?=_ z19M6)@dL+~s8ETL9gWB#5|n>{Kx?o!n#q=t5Lv8Vx5A_@AnY{#fT&RhR@UL-6vJUS4p#HzDU)T&BO`@-<{nL020Wxec1W3cGfR&%U$2-&6Bott8wfO!=dr zA%FUQG^~GArYX_u@$n|(0Rsy?5PFIOmD6RUfG3*Iylb7!e&NDBnbVMI)K1;V>Zk8u zC}BDXkn`u+r)S#Ft=qG*sXg^Qs)(`fAwA{jEm|52oXp6WU`j;+yQ@6Me(v?3h#}}0 z#3uxSe|nhVOSZavFQ)y3vbv-UvPA|qnvYt*9`w?F-Y(_vMfz50DM+IDz=CE%lK){g zh3SZ=N^VB}Ww(u_V*W5?m>XMHgkpc+2HXR1+x~yby1#!}Rn$k5ET!yL?74}aT`Dv& z9YejP!KMm~&HKeFijvaHVxvE1G$^m=thmS?rfi#ZV|Z-awlBwckc+FDx zR(u%lNAQdOo3^&S+Y<(Qu5QW0xNXG?$J#|Kgvtn+OI1cgFxOSAlCA4Xa37zEWH9BiRc*4zNWD*LA4nu1oI<{%%;HC!JED|N#?l+4{iGBTno6WMO<{cSK!q{U*~M2rsBspaBjamq?{_FmQc zeZ;9fhSOYz*u^$PDgL2(`q-Ej)K`|#K0eW2ohprjJk5x0>f(rsR1nXE4RrbhbJ8%E znx`pm94>l$=JNaCr)ScD^q8EMku&b>2j)YoL-M5vW0S>&E`EwuUrVw-QME1N%xgS7 zd22&)ZF4hr{N0l+r5+Hq5fbr07r;-7MZ7-d9vxFJ5P~X!#VvMF1w$)mIhvKN^0aD0 zl)(uMtNavoh@TOlbx|5idthI>fOO%r0*cqtMx~K|a6+3{C3W}Kt9B3Vz@-lI>qdKL zd*@X)N!iy`O>ZadVjImG`YA4&Ewo>#a+@bA1~;Nz?I@1sHhx#j`$IdDh9szq4F&Ct zwnqD0qSK9Iy5sV?7_CC&0SA()$D7nQmJ5C1o*}tI&v^`OSWcOk^9|t3d+&{3n0sUt zr;b8?UNq`4G&=U)`fOoZtl#ZwU-3IGS;AQ#`m8>cJGL<-NXxSkip~ln8A(4KLViYO z@OI(xA;5A36|J!P)s|NHzU9>K48Z)2n*Y!^MViSaWD`*J)`u^b(0_rthcVXUWZgzJk0V!rc7?z@Eg)s4bod*<@$E)Si91XEI;Em%sdyn zw`o*+8lS;<*6<&uiicllZuQ!0elbJmzrO8lZ3#;Hh^E&Gi&MO?Z-#+R<2LlvUMQr3 z=BK!-8D|QLf2)d=Wro-;Za{z58>O)oJc0*3KR0))IF0p8eP1C7#C{%c^QIzN2qq_WdC+$>;?;+>uPfu|YgQYEu>L_c@$)jQcAvGnql;~I7?*y?ZIUZf z-_+i&%DFre;=bEg3`Vm04q%hc?Z2mEVN!8>eFGCm)3o1ps|#>A)evVU6zC|rfx#@c z)SvfvaTbH|41Joue|!qk*pvyemtL3UDUN4!%PiofO(O68T}`t09`c_SuzQTwzy77ikin8}doT3F z7c=u}Or-BU#pOeOWwm9#2?7qPHo^f1j#*|oMq|!jjk(LRRRHjc8vqM~POuZDow8d_ z^z4;^juyVTulHPxzTR8;rN!ihMD5@=I*CvYiUTf9sEV{2<$9`rV}ugpeN8^z-~~eS1`!bdR*~hvQt!w$!hLsbdf)v% z-ywr`&&I6rNP6MMJ`7b8u;oCF0sOF(miK*TjKfHJgJO6!j$BoJ;>5n=I)isC^-LjY za^?tEfHI{)o1w@ChY;39*gm9-C;!u0qvQg1JBjD`dSN#HP357O%?V=E|7WDU@JbC*_F-)x?PxJEff z8fkzq18e-#2&+SxMD>6-<*y(62|j@B%+DEQ-)Hn-i&K{OQNfjG-8>#uN0(YnbAViNSRoLE;}I8bckSNufi(#X_1={6sErt5?r=a>dK7QB;gWuyTf@IDpPx1U!N9k*7@~s{nb(~sU*-XLuBv95ny9}c71H+W2AOf1nKLI@3!#|_c zURmGE&n{qRj`$HEbxmVD#;;MX2wu zMOXP>GCOTx=78WNhry-+KzoKQya6 ziu;H%3Oc-FHKk4CG1yY2e^BVK0xI$PD}4wVncvr)3fv#Et4hv4XQ^X`rb0%P7_9DO z(2-w+youp12J1Sp(_FJ3p%xK9lN2jZFKcFgD{%Kczi?$C%N8#P(W)4b+YS^{FqQU^ zIwzjfG@Zyp??xW9>z-1z$Tn;J8HnG25!A%OuL-VDL+afogWsRukvuNJ zX8EwQ#L1jj=oL>@2N{(jNkj5y6?6`#&qIvG#ycr9>pb>q`1+zie;dyN6?jH-sz z!UPi(-g%`9S1~T+>C&TvbsQ=|)u+4dcJo6&gOP-iTq~APU$Gh>ZFVtCt4l`7-ljRVScUL6zA>G}S{uXOb>9Zt% z0C~^>$UC^w%26aY=jL8UEeJXJ+u#UIs1Hd<{ljD@?8f2H{F>L*z_Q|up1)|9-03-8 zVSOYByF@}1{F}BiDL7BED6F`=;@2iFnwvMvUM%1azbA7{(R8fBvmrWISAqUv5(5ZB zuHnqB&!p|f5$Mrzc-pCfGODxt2fGQ^LkXjdwuVJ@*!--vS*`-+WAEwylGu1U!MmbAgb(GHQj8#GvkvbO_svmd#9_iw) z*fwo|zEX%lo`3kDm>WGIw$ zSCWu+BXdM{s6pA8(@NyM`R>_=mQ~ne{#}jZ+?O+(D@ga~<%S1Dyq~R$sq=dGgV_2$ z&0$Zh2zxqA8;5`hQs#Om(f*@>c(k%`e`p(qOXDOt2BDWdc2?aUSOC-EVE(fBLtBbI z`e)uQ?Kjn!t9mZp8mz=@Esk5Fl0@cjSyNOsUn$)kI0m67KZSm0_$x|_z8n;LN#8t^ z8MmY)fB`!tK=ud9=#dN+%MMo}0F*;bGv3v0!EYiq1?6DhQ8Zp4=Ry)uLxNgW6f)@y zQ6JvWQ>B#r0~&14HaSaq4H~{qD`qw_Q_TM68E)C;b#C9rKh;gV1OC#@EKRnjB6j{T z^%o7D+tgaz@h!X)z3^>HiXg{BR}^4eoeBxg*iDWPMFfJ=2!Z6i4+tSYdBn|g)Lk=KNII1mJ^e{k?`wDu<-`X z6m3j#h>|~|rT@nCn>}AqAan+$D{H!~S{Mo#^Fse?du|M~)91d)e{C?5XWizV0a&$> z&TVpbN*7sl8yT4o#Ika>@tOevg?eE>a)ZvhiYxY2Z@^9097__&oDPWtTRXvyECVA@ zlMSTe9O8Q}kVv|{OSVFmo|@|sZlb}H-rXFK`8l-w(3nBM6opE8)f&@=xXds=JwuK? zTu&lx&K?}fmR&=>gqnY&%)af5j+5qKtDmm~Zf81_abYftD%Y=;?YJQh-)cwD^95yR zJH8$?F>z{R5vIRW{6u-zm`&{Wx&aG8#D>k=Uiv4zxYT?Btnm&suTCjV9DC$*rLl1X zP-FrNSKGcyaZY#oQK5ue?u+wiItKLr$demqbX$XtFex(y85zPdr{8L@U&vnaFi8}h zuGtL2zJp5qytLG$SOCmue|pUar+hTi`%67MFLHG+>@yZiWp_%OnJ>p3Pw}2Rs8Q=q zL`Rzeghb#ka(_c8WTo@d;7!EyYjMV*xiNXwz0$R59W+{DFyyeuG-6dgCp5EUz+lI| z0{L-eSUb@_#p+%2mHyqVI^lZ5xy*E0-r;EJ9YNlx+!qB`Ha|?C1qjy+>2;r!__b7$ z05EWvpu8#E&llqriJDK0cFQc2h>Cqc+&p&|5Z{MI#Gs-sdy>6)KdOs%WWC_OOu1oKt zo-1RxKG;5uw$~J*fsIV)s#z0<8eB;KpJDm)! z8Bq_bDXl813eqc;`!3KVxxk8cXCIKmOTdI=aT~z71VtycPqlS(V@;sS`upM> z4K;&0seH?%=vdc9^0tIie}(Sj?0NB=FE&5pz*r5U8p8I(1bO2_LoQEZ?Q(CHG)^>* z)io@+wD9seU(XW05`RZlD=l|7^OoWlqtx76cjPTUeMk-Nvl5XhM4agmpeZS<%(lM^ z(}?ZHzjYBgPClF1Y-`cRv~oy$MtadDu;z1Pn!2j_tN`YD)g7rjpM z>NUnFD<5&}mqovWS4E*ZSK!W1tSm83I5%M`?YP&BnZ9}BEd&ye3#iWE*<&fJH zKh|pKw&gOSej(Ml;ONO+2SUY*LnY}PSDtjXpgL9@)VU`8F>e=xnk+ZFA~yZYR70+l z7KaiydGQU1>uWLXyt6cwppuQ?5Cd3KE)GXKUo!g1-(PkdHy+Mdo1Yi=-PVZ2o0!5? zNA$INRjGUvJegi-a2)F+Y@TF)tWIvjn7XlzAIWF71O@rfn-Je}ay#1hiR`2-|Y7I&`xg97y<6VEWecik( zI(rqcyFMus_?fp`LaMlcpSP+m`eOZP3EP=#Hqhk(R02j#ln6g0?fvi^&WK-hBOkL= zr>7dybrv}aCBPmd4r#xysq=tioD>XeDA70V%Nt|G+} z_IAxQB^+V+`JxqEGGIlkXBVG72aMp{#*%FU3HG-0kRKE1Yqm2sT}Jws>#QppYcsjT zudJBD9xc^RV~GB5D`Ev^q%NeLy!a7)FRx=Y8NDOMuS<>z~cX2`H>osG)5r`gTF5tGXZYwN$rANNGe?Oj*m|8Zjqs8YCUR#p2@u zpO;c!oGgKG6yLTU(`3=d{(b`U)|X8}^~q!SD3J&CjeJFoq}_b|wm-ewDep?op#)8_ z`=^>0d+|J&I#k)qs%#e~y`1D{b|foIdK&rSXbVe>tP$_wtjzm99p@xA6?ag=9v1}9 zHukj;Ty%3Tm}NUwyDIeByrptQFvRRB;R5CdW3o@QU!1+8WO?>upFVcR3}4j>){dP3 z>RyrXU$UM5^t%2R9r3r<{k28R14Sz`hrcGsn})WDf>OJ%kNyoj`>5Uk9|1@gMxZ&; zQH3%ZCusJmFm4JYFnv8L=%qrJIF}JiHqsMYBD?HNGT1659f2IJ=U5=STuzWm(X^Yn z+3X0Hy{m~#lIcvXoVTTdNMisEfjX=TH%wu}sz-+rMas@H-_NpXd(3zL_5*sWtcm3$ z@JF}kNlT~xIUq}mtWF!Mw z76ERJg3gV4fd4;-d_?&&PN-B(*Ds_Rc&T8TWJmZJ9PRWhn!0B`IAtY8ae`u*EO*Q^ zh;w z)XolIr4f=;1rSU)f!?O1<}=PvZsdaZA_y)Acj^dyFd2U@N&AUU)2+$C*ZTVy-s4L2 zXryyj#Ke(J$jh`Vq@=C48T01Q2i28nXRq-zPdT?OrtUb}wJr$-60!a6ICKRF2uik= zNCNaX;7?>hIejtD;Gd7Fk6QlVvU{kA|MDY~qw6|+#sE|TG*rWi)Sf75NKu#rvS`*M zw=$1nODBBFcc#*)I6bkshQZM8lZfWQKTJvs^9aEyu46O}@{_kySe7xxgRbRhSotG@R)mhNz20Sb^4V@9N}^=MpN3`~iWRWnt1^7U+n z^a1`7a)rdRSlub%ylG?<7NQ|ZS;ehUGI9Ek6ya99J;Dy5$M{$^?p_X!ZGr?9_sO;-hNE(ua5+;>|5M?PbN%oK> z#x}RCQB0On6qPMmrm_{2$sR)1LBiN~GnR2POW)P=JpYL+Jdd-1P4x;R5k5ij`bF}_lGT{JF!zFIZYxBdES7mfkR;#DRHdS? z$ZA@To+!z=dV`Aoob`-;hT+w&jvQ9tuz>N#2B_M1a%EL1k>4>59nCk#BH!Z6z1?A1 zg_=PgkfE8)e6aleNaMs@>G3qniiA1yrp=g$ookB;Vu9~7?Ey}Xm<72hoM=o))6hy< z4fL&$T=F8_(R_nz-pbsO%@~FK#u2nlX?p7+bQ(A@6i7k7UALDcWz zNEyUBG%T%xqpLPh5ylklx%!%qXZw36S%{)%!^Q1S)V>o&#vN=wn_ym6daYk#=7Y)8 z?GDQv^*@wJ^(Cj(Rt^Pib?viwQT9xtN9=}O!=ww0g7YcUtz=Z4h7oxpqBteUOkQnu zme!Y__#xtw{GEO8k4-gX!I2{lbqHRkcatLZ(JS|!9XbVlogl=Y3!#~0zBwt;HFjs0 z`SoDV=UER_AONbc6Nkbe%K0>bK=C%LRNyUUj-2-#+O#BkczTOWOt-8QTcVti@l)U) z07%MJhQVt&td>7mh3|_v(LfrHia!V2d=23d!Vhzf9}Y?^_q*Jh^nR|jy-c2`mZeCk zmk{Yz@Fw?IwzT2Cwq5(coX1SCwhRKiLIXw**^mc&3uzfR6AF`HudEiEl`~eO287|+ z%$KY(7$6}lB!cw?RVsyMUq;|!G>gRtAFNkT+fV4}jK+Vl$l4&Jyr!>EkBU|5Qw|$A z+C8vY$gz30{M@=5UOwr_yi>#V2|0_=_<)2{CwrM!1A&bVEr5nHh-}3{wx5W6((M&{ zHNtBiwGGT}iy3?BW8N zpvn&eKS6TmKnJ5fui=IJycel_$pO934t1g0MijbASB}l0+s)@LQxmFxu(3f7t^9!| zRJk1Silpq8A8g0Be`tKb)@q_Vb2(hKD$fsD z7-9_&5Eh>vkhyE)UNH95p{*y`n|*6ETk0PYhqtTvCaDE=`j*6+oJ;Y1GpikRnT+23 z4U?-+zhQBC_*1H47m(tn@2}9y58|=xRM*JSdF_OIcZTs;;(6>4sqdD9Kxc!8HS_yc zhCUb>YZvMjAD1Bz4Bwfga`W^TdF+IN3t!UIz~Zr)#-%_8!WgjKH+kKERk8t{o;NgpSFq>a2cdnJ#t$5iF&vhPB^Y zbTxF9T}(O`Zr__y7T5X`-{=X_w^ARTB__SEj-GMA6hIM)-eHjWIH<_L&0;x*UW;jj z(ERlXD^I}`dI;V2o?i)=1m60hOn>;^DgAT)7f%M+47soIg6(}3{e$gPLDmN}JM=jP zI0j`vx0L_3>Hl21rKy?yH){63Mej?uCi;K2w$4anX(FbfXFBLwe(Z7ov`GVn5Y4;5 z{r&P4*{;5Ime6zzN zo24C~)z_<~Q|L(ha^<$vRHLWY7YSEEBZ0+E+{kz3F3neP$?(8%i*IrHX|cHYpTRpn zSCH0-JBQYAu9vUlM(16)#O2+0dg$vSYmbHp0(1xZru1|{we8t0`-n-$@ZpNWhh%zN z2Qn2RtVj;M1-auzsCO7-%;Be}!)QfJkUl`}(wzATMfg7ePraDk$Kj0?po)_slue1H zYi$*mc?A2Hybq03ydr5$et*p&J=($oxE`*7t@ z2+y8aEzTDbT~uZNg<#fR@#7aylOCsFplqg$1O>c|yDViab>qmJ&yo+c<+01j&XX($ zr)-D!AQ-Co;~V~dY@)a=ygxWSM}3>eCNU9nOYRoZ?*Htn@SnsjJ_)-IB<+v+fg)I- zc*lW%l{+?gm$-P`8v2G}Zg5!~6hw_0>9Z>8f3Tf9P#bPJyih&+0+E zZJsN}g%?lVcHJz)wLitbcEnEnVXPkMlYx-3o~5Z<=LY5|s~)1<8l3$|?YRuQj|c<` z7U;1(=!ZbIO}id*hGJBM*c7PKwvQ@v2NWQiHF_i_f3MC#+`%s@rx|cQP(v?2Xi)fs8~d+f}RbI*BJ1mG7G{fKplz z=oy!^X=+TC4D2hFk}HjSmat)_R7jcrfr4alZ(xRC52;^q`;d1P;>_jZB77fY)0 zoFW3Q%^uo-V7guMIW^zh&JP0QYpCz4y9Sy0jkM(@{Ub`_W{;yX=(mvfq5=opA!n z3VdM>AmdNnHg`>=B4-5T+`Z1`1{M8h?guykR>(jwRz=7rZXVf6FroyI&0{Xq54Z9- zt>1Mg$du}|jvruWFtC8?tK0_-4I1nQ=ZRq3jGf81S~=R4%Wc1on&M-Kl+!49AHEL9 zD{cvVlZ>KPF3yv2J?F@6kA3_7#))NMbMEn_o$Oq6XNkgClkfT#wV=S96ay3|wwlw~ zF3G9dzkRVmcM7g6z$$pw z*3I||_lRBRtDm(S&O#T@?M5}DXe?$Fb`z^<09jPROs$Z2LhyRKWLq%k!m9ehGQxK3 z!N@T*4%&3oJ+!ajVFtzpT}nNTzFhBhG}*r>u4-OsES_^fycQ~OuO5W=f&$Q0a`FbU zd$|AgYZI&Yh^SN-Ko0=hQ;CAEw{H2iJ&2v06iF8Mdl!Qn*LpoJD9e&ZaS`oXaf5;j zyQ|4*Vaf*f4wEIcd0i%Q-aQgbt}~#myliWYex-{ICBgFDsq(PW3u}%#oh14W*m6j< z(w)8WP@pu~RpI>Y$!=PMFyaB;Y*$^V^NtOZvR*uiKiH%|Gsi*7%{0*8VL0_wpD$w{ zW%31TEbGOdD3luO4s_ieR!XSyKR8u!m|3W9O{YG{_?*S+76Krb9hXiyQQEbrA&&M_}>a7!& zr0`U`2wPtj3?S1&&i!EXFRW05Dz~GCo}i2Ne{dL95ND_q#*R0KzIdm3>Zw=6_D=H} zNPsvrw$LkDtybs+amy)-+u1xw|I&8zZ2j#O{ySMKU$)-!o_nj_GVDm{awkY zQ7=*9X&hMoz+IH)(lAYaN0loAX->OOis*CVZbGq@+7Ry`#S{U{ zp=;c~(Tx$@fjoT4Ji&Qma*ujzl5X-eF8V{|=$I>E>#cVcL@$us?8=|5DIf)H;p9Ts z?AJcew=C1GqLDAO?ilOrG`?f@yOsXUa&H`qc;T02B|R4w!}rQl*bq61-WGVaqxfUV zm1_C?-XXd-@bUG3K1PS$0oRec8-CAo%+3OwBM?unj9_MDSKF-MU4NEyTYNuRM^ zy8l+&y@{(Afvo>cuu(GRvYr7b`L}&iS5iuM{Cp*!*P~;I{NIInUKI^x;xX*g zE@9nRN!V70L%wI=3o1f$C&CAGKcO1!h8L`;dk;6V42X{DWC(Eu1~GGu9R85u&a~oO z##>+X@tYOqSe+?#C9<1Wa-&i%kFCyHR^A-5XL7Km>B|a2An^RVj?)$x@2Gh-;j))Z z4I`o+MKm`zBdow zRBpi(IEy74xUL|b-Fg9Fz7ssJe`ehM-eR>HD6IY}xEgL{;90?OZD2l*9x6 zY$koN&u{eLp z{kPzN$zv(i^48Dnh)_S@ngilPK~6!=3Oa{+^=p&6l4VP#IJfY*%1xJUPeB4E9MrHF z0ab!yyDh!O%i0P3d94M#B6d3vp{gqN)P3L!Yvi+%(VSc<56)wZ7H3lGf}gGg4+gq| zS;<5YjC0`Y3$1Tm+e+6zf17{vgAL(7K3VW||B(`bA{X-b$g$b(iTx+oBkL}tit=-) zd73#*r>($XW_s0LK}GLFTnkDPT6^v$6r`aIl6AQP&G|YkKNniQ)w%dUt8(+lfa*a3 zch@f0KpjNigIm(pQtX4>L~k;lkFt{JXx|hMwIr1>&8TZu{)iTJtD%GE3-ehbX9cB0~YB$Xda@7&LzLSQFgSh5?hl~gk11^m&1(8Qm7MWCaUyzpdW(^@oKFpWAmeU4Z*i;_gUob*r& z(hl?;mX1-Lsl7XPrWN;vG@^O9-7sP|{?cg0GU%xQ@DvT7w?fkzV%Jy`((8{qfh^T- z=v=tCeF>Z6YxnoTbWE?RJ@=pFarb6B@jZ!2tO0E>UR51XGc-L{r&)o7@(p_=Cv{`(^K zK$Ft3?C`v&#D`PTi%=%%34@e&%icYqInQ--I-|(~MfY=^oMqfwHhGAw6w1Iq*ZeQ7 zGSCI#lW<gn9~ptR$~qn7CetarAVb{({3srqRb%c#}u0mT)gx_ zIa{hiu$y@!lU6Xl`mtTJ<0T=jipV>=AZdx%owncR(^H;@!~t>KM}LB=SXrG(bLq=-T^hQ77l0^hfw@&;7H{4H1W(IZMoPFJ0Iy zSF)|D(5}7mxVTH+Ck>}?zOS2oLWhk+FxrgP?armi9y6?%6Sb|3P0{N!WQf5RO8XA0 zNTN5x3&z`bHAampd4rHrc`@#e!Kv=Mj_kAqG7uycQ>H_(X$Na}3f;i<($cv0*eI5t z<{J){))dcunqoa?Gz($Tf2UfPZ#ECwh+GSIk#g4yFB;Wgd(Ja!S%s!}ql4Y}pen1O zlw7a6z$C8Lk?2)}?JRCDX554p^CM7n6hJLC?;<|IlRp;K&K^X~zMVRW7&wZicnQuP z9E1!>q?wHn)$}JUn*@+bg*6I^xKIWD!w`BV8>Fbqd|Z*ZfjMXmRW_sEFixgeNum>J z%tnx4_QD(oXS2BPz??U6V7X_9tso;N+@BRg4HN8!L|iU?|S>@L-E$ zATMS5dt$7_xaVPPuz3xF4>bfbq`sBcmDh))HdVjCNtpP(N5mp2wca)L8?!ApZ4B1L z!B{f`;^3sT$Kf_tgR(9GbNPkskESNuf4vN8FOuF-Go$8geQJ z^DIs4a_9Yz*NFOvy_QwnBCi%iOmG=v>m@-#g93p^HlGpXT+D02-B&@zIb3g^`bcGj zW0d)FF)3*Vmrd^nNg}#OUXVGtF8V$c*6;RYifEjo57*zF-(Yz(x*vLX1X8-XKfS<3 zq;R3rO#*!#!zeQ|r;{D*+J1HBFQ(?50N;+!w}wpHKoY-!XRhF zT5;iL=EyIQ*{`4CApT(Oah4DYrE9#jym$RuNGXTzOz48uSGd+@ppv*iWEEqS`By&p ziaA(_?5ehzp~v+q3)=Onq?E={h4GPBQIChE@73B6{p2l865Z%U$>vKMGb};=NCu2z zuKr-_PG<=Ur2Sw!363iOcG)#lWbVs2le*^zTiOi3u_MOI176T4NtRA6RI`_ywzj0e;6{%J0E;2d6lDd1XsO~6 z4z^rJG1frT6eN$~;Dc%mzyM6lLX<5)IO=aMTZ4(|w89kD`W3tfHKJ{wyzTWmGw zl-EnhQ8jT}^e!e@W=P=c^Q3>YvZp}0H-A3ri98tol|Ngn=A}y zG^}Q^mA@g5lhUxnLrNZTEa(@oyI0wow%zOk^xYM!llIu|n4Gsps>*$59eM+*)wXYz zb@=mUWu&y%jHoM<%liVug7PKUugyr9v4x48IEb7*Tp>NtY5L3*Mb*YSe}T_Cgas8obH(50+HL|@7vs?O z`x4US>o_@lPAr{!`j)erY@OkuscBhlUC#z9@wz8e-r6gUTWPrCI!>FXXY(}`&$9{A z4h&4zLWVB2j`-|P)YRKydPhA>N*xvy7|9c#?bSC_!{cLUPSJ|Dt7w+K?W6_v&?Gks za#2HE-;xVJwD9_K*{ERrQ%Ag~=7EWv%Pk75e)Nl_1d3P0=zLDIzX7XMGc;{@J}gv) zmT-J^&$em;Tpg@3(MDdW2&+K`DW? zobiKgdnPQNnhBsNe&=f$N&AnYsu7JSLzh@zKOw?>i`0n(gO?ThqM##b{6wv3;^1lu z^n})ny%_STx_4-@E}1oJ!T?LHK=SJ^0aaf+K|9~^zUcY)nEF+(hYTG5J#F{Mnyweh zW?}s|%Cb7>ZLQH&7iv1ZJ$7CU{jR&eVmyE&vUbi;dTWlQ4vMb7m^?WIm%n)5T$}M3 z>fIB)wirzpQ@HzKWy>NRYsZ|-{^cDgn89uDU3SSR4@OSBM!vH?Fp+=R5Xt(E&TrX*IbQAIdn;ung~?;yttsas7+0ir zN#8L$rg|J|EgiGIG{1N}{*=CAgG{_`RvTI}dE)VGqjQ!@Zi=Okb(ACSeFMfzzEQU9 z@@aQ(Bx`WHTr{lAmc`wPGGzcLrt|A8>f zzjEKd>b30usF3mBbL{V85cYo}%kr-}SN<>W_0KY)|Cf9J6|Z6cUt%GD#WDEbyc7Gs i;*R}4v~TSH_P_qlrvIb)_HX~|55flj#Cl=>(fc3pw#L!` diff --git a/static/img/191018-python-basic-data-types-strings/header.jpg b/static/img/191018-python-basic-data-types-strings/header.jpg index 7696f44b4b570d4071dd20a934268f704da3500c..e9874c18f3d489c1eb534b6379a46297c9a4ee55 100644 GIT binary patch literal 49833 zcmce-2UHVX*DpQ@ilBgqfPxSekS;1!T2vGS9z>BMH6kJ<(p!X(SV5XRQWb%yG?5ai zks2Ws1rg~2LJAKeJrM{aX?J|y@B7|+zx&>`{_B75dM7KHotaZ+pR>>2`~3DE-d7$4 z*kfgGX%6u50l)?51MsN8o%1Nan*d;A1E>K2uoKwMw-?}tC_d-|@W}w%|E2-Jicj{x zXgfZY|0uH!0OI`sf&VDu0-b*!P|Lq-|HpaTi*5f|f^Yo=|9{fJ*6*UcWx(K)Z%}wp zm~T+vsX(>B{2igEOW;`ykG4(6(##BT$Gqp|8GdTFx@5%vz;h}aGXAfO*=%FAw_c!hH5BlwI`uacUj=#&;+nGUSzC!dNFJDin4L%T}HLm|p z*M0sc`ak-GiU7OL`Gp1F^1OZMlJ@Vv|8I|QZxqA_0GI^@-wyTj@eMz81{x*rLzaPF z$21O|JbpqS0Dh18KYCre{P$S$Nqzd~wfkfMFd_1IyrzF%vmydO6;xBW;h)!33;;lU z7XW-{2=)y1{JXv1a=Gm$B&|P706@eU03^OZbzH-4YM=c3KHu)M0I+?U$6GrJ0D|cN z!1I0XQ}{|x}%2lCzn;yZyYzIA>+abTM`AHO&suLFQV!@HgD@8cg24*lQ8 zFR*=w;7%doT~L9#J-{|Te*SF&{M)zx7EZoc=sqAIzJ2fE6K8fvT=o<^60+~)-6t=1 zDx9rqle8P4D{5a4y(c6rCB6TEjM7nM6;(AIT|Iq+Q-)^e&YN3Yu(Y~j@8IYJvFmli z`=*btpMO|*L}V1|cJ%!R598t=B_yV$XJlq&KYf<-s-Uo_xa4)|o9dd{x_ZL9hQ@YM zM`u^}hmSpjL&GDZV_(N7sI-~CX1~w7NFX^DM*>Yc@w~Hem+Q; z_{9M@z_tAWyx4X}7*P55oZ!4K|Nbrq{{3AJ{`C5*Hnrh)(T>DUIQs-G_HR=xyQZnPYI_7^lPac44$>Cf#R7v|)d?C1}ey#?+%CxO;;3UM<5mP88#=6&|FY>AsT2 z=goZEe5&K>hX&7gF{ZE63B(L9I$^-5bH>**Bde*?O5Y~T-5}oqy{bsE&T5UwI5Tc! zq22C84%+mu;{h zogRzWjc>`Rt+~)^qt!ScD{~4vTDc#wc4;=seIG-Man)I~d213;^W-&K2%IeJ`ndq# ziBX(1zpv3t6>((oKfZ67bV=hjchB^Ae_vjpH0_qIzLPkqVM?Xb!^%MTU1=eq_PDyV zs%~BB+Ej~Hb7WD+sqME_20#BSCDbu$Un}!~pzE>sT#&0qlQC2BKBZsDKSDJOS8%02 z_BQ?UlYSIlVNF^y&MSB<7dYDPyq_svaD(xuMK9IydwXqF24laVD$Bs)WIHW%+`bg~ z)9$gS#V)n#A%B0{SFO#hEvjc5(@FLPNy%P)s@E9%PE=i9RrOSJOtxFRZ9&W}+hcLb z{PqC>AJhB-vN7xWa~qfWMe>;`lLv)-r?&(9fJ^`HPFUXPf0x7`#_CkW9+2GO0)N0( zEpkU z|Nh$XjT2WtxjR^hoy}}0xm==r+d6Ac$xibKwUOKm)w6qZ8_HiEyLD50*PZsUE-!U6 zv4^B9%*@4$%m+a|d6~1PdO}kS!zm4KE?!Qw`uT*li;m<9QR$l`N5^PFmr*KsHD59O zu`}DqFC@Z~qIuGMx67x=_G`mv=h?DHfyW|By@rnEYt_2^$ntNK-h#!k4}PQvmn6_! zQVqL}PEiiqg;!f0?6C^Z+kZCGt$!-l%dXheR!ns$<(8hUik^}Y^6VJZf2x58=Fw!LMYRA5&d@419Tn` zr?VI#J~{3yV~#62BXg+zRYk@g+@GS$I6KtjR;w6aws*Ma!`|Zt#-cJ06fWjzNXa~w z$uuxGt}3~>uRu~(D?+Kz>F2z}+NX=!2U2q1%!FJ`_V!Qvp67NxIW#i9rXJab4 z8~DEl93IV$<-arN$I|7ta(e83)Q_(>{*0XLgKGw@B-t3DiT!J=6-U3FA9g#*xf(@_ zM)UppD^}1YsfiqzW15c`ZHX5BxDE;AEC&;(S6brNI8vLH(~9$aGu~5lqi%SqqHd?s zl{TlupQmQ7k&?xSewHII7d%RO7_C#*ZdoEcOmz{_4e-(#okm2KI0y}sEbR*%i`4Rz ztilRs>T*KTq8eLUvY4huU;#@Ey`M2G?c^ajWJ?kgCq7q{=1L}O#eaVnxhBTMKgd5* z)OT?3nwy&+Zag}_ohCc1nZuqjp%dc5R4x{8OJ$0lYPhHy`t>zs!9F9Ska6k;aoj(~ zV&9vQ!q?Xu+-9uBg{+^la!Wc6viR)8yGFQU?Uh%1^7U+J4hEI>uf6Ods4C_wd4_2f z@!zd;9t{2kS7_B>A7K#Mu#%Qkgv{6OebwEX(+TBQYx-WH(ybp~79XxnDn1wVt%)R6 zRN__`9hV-V5jDC1fb};p&p!+P?rBWWDG-j3$#auGlHMwDyxlxFsgtU#g&Cf; z%hPa_!LPn`DA{Qrp)%4=3&Ga@_3JagNn3f~wt|f7Gq&Pqi?S4iTrM{jJSwitKABu% zUW=&ixMG)SYT4c*kyDysJkUF=@? zl#^r9nZZ@|Wg4>c?Vx6aTp;S0=b(mnLkP3N$~xv@&D|Rru5JbwlmJccDC;QQlT^) zu}HiN7f0(ea96*Cml;gNS~!iMqH`bJR-mdsC`8~#b(^t7NB_PrHWKA;`y`s}x_T9FedzJ!Tjz`UV@OvH zd1Y|j24>qjQkNIzFj%W8Z8^AnOjqQJ)9A*O)sXpsPOO$~O=3)og~OLY%BKC8*!k?yiQDgT28TFD!!KAoI}LO5CDSeYC!cpnM)QhDApTA-7>8KxMQur5Lb;Y&B+PWM)-Se^co7wZb9 zgR3*d-p;y$7K4^aUyPgUN3>QVpVW(@ zmi;f|MuHbY8k4R@EYI1jN|!rI~j|P5IHrgDY(H06*nqW1mWEYQNZ&zg|0& zbl%$itgo_LIAOHt#bUp@X1A^lP#A#2{I)~*1PK(p9SGcY?!YHrl=K<3PN zAnulV$d8G{g|s_$Idu%bDzO;}|KT|+qtjCEWw=)O=H1}jGe)i$$=)F8WX0|qB?m?M zMXONnhHy0%kHRW!#Vo`w7L_c`sAb+>`24LW(=flE9BeU5yn_uCOO+R4m{c~(EU~;;w2xCH{MfY1{zY+_ z9VhApMfBjO;33kr(1}wXdY3YSQRPZ*SL%;i4SOcUX-j(KxkxJeN4PK}{7PBAHY~W8 z*0jN~S55WxO$6-8UGEMx-TlypjCqD%|(DnI4PTBy@jmHm}uZ#hqcvwlmn z2fFi39sSB`ryJGX3x0K73eG6~sH7H}p_uh;An>I7L}Sd>hRo_1xpbZbcS{XozFOXL z`G`rXMx=f?Z;qZbRyp*zF#j7}kos%pRouYCy2bgDk8ALcmV2f+U<_h?6 z2{pGp!*3`H&Tm!em1+N)82`9^pj4$Y;=skcgEq=eLJ5Cumc-*7Pqd6_jReO97#End z*?-Rne)p!9e)WgNGPP_t*{vZ+QZ2(j^t$RPw65RzAJ6UByPPb=6_ZyU+gp0wnhOtA zL4A%LxVySxg8XH!{qRD2(W$U2r916Qw7!=Zl%Cm`)`Xj8edQ*mg=7?HDjhKR7@6Uo z^Gm1u%ASAimI{7D(ElL*xui@)>19lF zhW-+P5jjUaTE>u_vFLycgEXd?C`!7+vJ!>00MF2DCFZjvx@T}AsK?Wt0lLekpMM<- zAFgVAQozy}JL%G|+5AEtvOGIxux&2zTS1enG{W*>dJyvoBmN=x1S*E=L<-^uH_gDz z0@M{!D~uubkZneTNrBmtrIz&2o|%!Fj`#MDMN#omghz8MYSB{|Ky1%eFmdjnKD_3S(pb-sFt3-W^m7bu6@>@v2j6UU2I;V#_lu&ONYncnwjEiu zGI80rE5R%0u4)98<2S5Nsqk;z2ECyn`HUp;6aD+|s?zYFN_?A81bG{3h#Ivliav_< zA?`z2J1|7=(hFvS?rcnI%99*MiN2ic6YZ;=F5eS%jEw3AHtz4}9dlKky>Q?TJb*}P zBGdo)MWnpS7XXD!h|8+9+NRyvo4Vp|b7zS;+z0&e~lP6XGObguyjtGPEpQjrr;P)Yz2zGKTbw?UFP@kcz#h zv3l&`W1Ln(bL6xdo%=XK{k!G%$Jqh5Uw509#>`&4wREVl;i~cp4Gq3u&wjJ|1jKiE z2n_3L8gYepQPlgBnFF76ZAJZX+p+Z+(Rr7@s%2A`l6n_y6ZWtzExl}*TIKzv&IRwd zV+cW#OrGQ&c-E>krUzRqcpvUBf@NwGL1g(NthV?r!wtQU2R!tmN+)&ba}R;{Lqv)T z3a^6JSF%|Owxc@mJz$vKkTJ3lEVvXPXjMg5+GH!`YnzI`9Yov8-{Irvv9%#CFQVOA zcYe{uPNXuI>C$ala>y_5N4Yy8!>g&>X?XE@na%D{OKKBY9&OGrO*9S)@zW^V-naVD zSb-{b9KUr$GW=Zz|Ia9{FcvcBmpCO@$}@3aQ$xnZ25Nr_u4XfFqc>>xJXY42|Aqgw z41rEe+)%zTV64C}Ycs5`q8arIlEHMJCsg=8XE4cyo}H-s=d?^3b{Ckl***bFd~f=I zlR>0R!&0&J`b#iM(4;LDw#-jo-oPc8$}x6SQC9D`5Zkd5N9$tW_~z@4G)oG`Z@`nP z(2h2{&fm9xH>flmh`wZcz<+dFb|_HBSw}N={ny?f{Hq*ku81tdw2E@z`+cskB*hh< zA`|fDOgRdB9z3X<`oPem*0nG8B=Z9I=y}FTy{~D`Sbv)eKT0DH@J|(9vKV;E|H~5O z(6wlYrEW$IEqiH$k$$d@zS*gDKmSA%-8QAR0&Zu6w6eLVY4pcfc%SXr(X@$PmKO=5 zOmA(X@&GB&$3BZ>)7(VowiNRKq@RrZyPV?qqB{}f>U~(?2B#EKQ|T;+Y0cE7kpPAd zDF@$e2|F`td|8A{!i!EUv?@1$!5bUBxVq5T)ldjFb;xMNu_bAm^4*prFgtpGLS2(} zlD4$*hEwW> zmbhhQ_bV{!eJ>RTLrXJ?z9-RH<^zYaRxh;_G~^ZdgDWpQOzbt=OTW-TP*DjYLr z4>SzrzI0LTIatyaoV~X{u11ySu6q6L(?*zm_vHsKWvYvoRYyzgQY_6cJG>r!pr$x% zPbo3CQA_Dwd;T6qw}mCT#3yRJ1oL94BD>lm3731zabn=TxsK@87SG);O9pj*$etU# zHZ(JG#If$(h?cjui>o#K$+a=_0~EH8Dn03u`b_B%O~`xyA4QhNPQz6jVHy`tCPw88 zXR1956yA3@At}@FYw2)q>0qGF54D<EwR}h9) z4*B$-YTt_H-p^(JYAsL>(@EZ26WuzA(Z^=zXU`tG`H{KI0~X)+&;A;5M8CL3Tk%;gSS&J*1= zYl$qUpF;tw>Re(4`CIE+3S)8RJy%C9a;Du>`B%I${A(1)VE<>qFm~DJPlY_7W^Kn5 z@oPw4IAUqT#ISN=wdnJbaJ~Kx0#YKb(b{&VZ8NfQZS4yesR92BR>A|mnv!^cu_qM2KQXGd?5H#h25Ss#%@KUql*qc{FFHpjOq&6d#O z+G(dOr^s&R2t0m^l$t7hFzd?c{c2L_k$McM2|mm_fv&qh@gXz%XiEGFGVh zFyp3;V5f}J{Z(VL3io0ht*I=eP2!1%iSeZ2KLUxCwy*!tj>0s28J|=oNRjZ zr)GGQH9n~d>xWvSJT7lUx?Ao@r7mw@Crh%G=_ASd(J9R5#i*J#Q~9)2C)WcTjsQ0W z1H-l*yFuS%AGBp4nP0J@ZPIP4ppTsLO#H)@zyO7J_3t>P7&Q|7JzUD|s@1Wt&Iptj zb&TY0?Ub8$QZ>gmNqWeY{AtW3V>ch00KpCC;QqZ@lW^`XB83RMY8_M#ic!XvD_BP{ zpJ9T>d?j8_*OXv;gOD3T_HinyFam2-5)EVsk>`Y+dqc~#E0WVE=bMU zxLPN@5c|3c8tZkDF4N=L5{*NbhIINIC+28#-M&ZbM|7G*?4%!|PgFMvA12l}q=ba{ z1Q>Wb1f87L`=+<;10rLY@Usb%9&k!=iO9|^V(l|{qgzj8J7g9-E5hHO8&4N*)@x>g%b z1g%WRB?JUSwD6O-QVg+s6>Rr%WWLQC%-ljD27f9qUbZ zr8#sp-TrR#8d>%V)NadHeLH$1a}_h4wW%4V+f)0Q56{|-zRV!D5kXy?8`wsPDWIl4 z!io~F6DMW6P4_oFs9zNW%TAAQPcAfue=%v!TB-JnPFDHS8>F#Up*`)4V&Ll@K2Qtt zC~J|8{qaP~8=1Lyod7#-w>fy1rHQ`Xz*x@EkJ=^uI3j2#YL4Q*8rOV&Mr&G%;gqNo z(}L{?y9(kE0Tzh6Y#W+QV*+<-#B`W%21gI=!udfPq3!p<@60E+;S+EH9&ppdkzxO5 zjlaIU45JcfGH%yj3DMP$f1zO@f0_Cu?DbU zrb4^3kq{rij-idSMW{)SjHL_YVq6Ff3|(S8+Ci!E)x>pcy=+hUgebj2=B7&A&We>| zd-&J0sZJfMlkr@UK~5b;(YN(5c!jPGAwc`lx9JkpqE^Doh1OGy)TCCJEq$zGT8B}L zr}kN&Wnkl*jVM#sCp#)=VmndzKSmC}qmRBUo^YLXe(o2zqWJE@9e62jLca|s1gA73 z=;pf+6T~i4foAX&lt$`o)Tv~s$9qm5r|7uEC9h1{U|V)>zz1cz8a^p@nrr%Fw2-ZnAW!JV*fZ$4@oM zi~>DMPm!fAOYkAu=1K4h%rq|S>6Q2W2OhVLlGOez(?VX%7v86=I6w3{{Q-?OoaL_9@J6X#pNS(~fB7gw+3MKde5KDqZ!#77`b4fI{&bA)UFB!_aX-x| zqV0x$#)cy#l4C8Hhx^}tnE8R+@S#}Qs-a`T2h+T z{+!6NxS=1o z$J^eZm3L)d;N`;CrLuQ^jScE3!0 z`qJ!#@N}GWmz!=bZIoZV&+j@Tt;n%f#XQf~%Kmj|jNf#)YG(}G&-R)7qCsKa=Ub$Q zHEjGYjhpaerE#RQMQU~xY8gr}KUds%*YLt;C!AtMac)IRs{hSh5a4M%mn&9+xOKB- zts^<0a`oq0%WP!Dg#Jp!^@0Yk4o{kkipf!mZNXN~ zMqvtGto9qn1jser-~le3P4!I3fvsKpIiVM;d%mc*2(PKL1Pwa|AN0^;?!e6V{=3b- zJC36jXdyV(U2=>Moge4eHLCIg+;+HJj znwD7^ty>(LjA2Gax@+CQ>dQo5U`ok~lcl5%EuRgxDYVE9|7=1$D+}TU2H#(EO>=7V zl&^3ni`lvd#6}I7FBd=J7M0@&_y8={H2^ycJr#WMW!MKC7uCxHFq3R9F*AIv``657 zM}L+(?wk1;L4iFM*LNx`h$*nQMs`~LtLzI?94Dbw71XChEk9&wvc18C+pqnm`9LSe zDwUARM!xoQ(JP{9UhE~w%Zwdq9a*X6@Sm@59*rpb5RjQKr)5>!Fs!xzw&R~RCoX*D z-z0KHWg%@*#_b}~FC*gM)g=#jfHzJWeVTExj*g#^PHpy{F<>L;NLp$;%N|cW>WmSZ@jt1sBswfou;N>Kq+{ICUrLgitJHWJ7A9_P_~_|vJ54{qgL6)t#!Cqvo6iLMdm$B8DOBusQ2Pp@F7shsR|h+WDYj=lQ73?3#%Q=WpLm^Kso^ zyPE@EqgBBqI*DffOpL7*O=!m_V1>Cyzn;O9`)+ZMjkHRl&FJ_JYm_d>LmfGpgv9M% zFqLwR4Rd!@XC=9&T;FuoGt6bg=1}-q$(+|%N)4QTng@U?wr#09NGxX%PGi2LtqNR4 z=4;XQ@1ng~CYUc{6JsRYqek+>z}i>~+xuNu!P;1-ww(2&mOJvIB8tHpCwf+$NJ||( z2kD(K%uf-E$I_j&zQ&Va^dKo{Yb~%mg7#*}!zQv8nJ^GXH`Nj{qr+*Ps}E&qh$J1N zgp2QlC79w4)|}Cbm-;iwITZLVVF)f|vTWH(RrJ1+HmxMXl81rKv5bq@gdplJAyZ{%lpP|T;p`7# zTxN*HO^?I(EeBFM`*MWDh0NmZ9XF1!POgU6`@1Pei3? zHd_QJ#~CAweOndk;|6WKF8`Oq#)gYGZ8KO=yJ8>G7l#2;mc?Pj`fboY4|MjxlpECDL)n&^AGOrF-tPV%i!Vt9BF>PuxL6Ud?u6 zNSHzHCmHh6-QTbw)X6;r6o-|5z!eA6sceLB^BIQe+Ity%ThI=aI#r~@wq%hkiV=g> zkVtDhLwKe`Ugb;Dk4=pB2-}F-$4{DYtSa^2(kr1Mq|R{i_6Ytwx#B+l;gWMg`-caoU;KhzF{~~FHkN3|6Ga+E_1z?+{G60;sntn&}w8p24l4q0w8NHDo z6)`P)-CbjxHC-bu{UU>#nip7!zLw`mt1(&G%{I%&pl+;>p zPPfx&`21?K8Euyy-^1y<)PBPcZJq{-&WkR8(c40=e6Ag=lNHijndK-vM4#w?mz8N8 zal2cg$3N8SvAXoxh$?Ww2{VW~$j=nclp@|u>9Xl6EKnu!BSh337TEfG7%P{b*yoET zE9HE@bWxi`UFgb^-gV{IiK|WabEUGFHL-^ea&I^IB))XMm|;3IM5H|D0sPAvGfDOg zt&TqbrQMd8iRskBY|N5IZHn;3$i5liWRu#A#?mgrf{w8?HQIjogu&9Ltex~6-q`z~ zB2K%}>an0m+>0fghHG-+tAajd^&Tv4lwkqSyXbH5M~R4Fo#ewZ54}m3r@80-pD!X` zHw5&?SPek49Es-RhfTotYEN?2e)Mx`p%#H1GYSSr@!Uh3JF$A9d61Ly&}9N|?Tlz4 zTPu#trn1kiC`QK^*F$j_vq^2LH908O=F^fw$Oj znC_Wl8p>RuO}e5F2Ts$QF5s$tjlI(47AGlIo69~pm(20xjF~!nLoSYzcYyRi# z8h53vqw+{(i*bd~dYk!lMFYa4%++^js!I!untNZv15SuND&qlRZiq1}lO|EhPhZSl zdSO&)ZYvpTg)y{RV_R7dvE#I7c_|cfh`#Q%U73Tbz0WTAx(<8D1FD_c$@jS@YZzk> zgN(iO2;RjDTW+f5iwrVkEpCn~5EAJv)n6x9GBj(=4@7-eXadR_;bl*PMbD7NleLWn zY6KHX&bG>HNhfDU`)4VSvw}jcqn2L!gbzK=v2y!%fN znFyrWM2wOBT!7ZJ6@#EriI3X>;z-NuKNSnQeQZ`}R(ngFFYgG|Sm4dQ%&R%;VX zr3s6`Z?q89Ykcnhg2tvB_Kb7!n`>)JtBdr_^6ZYO+R?FJ(>y@8_{~IS-quDpJhfyq zIAjw3h^vxO@ycVPvTnc#$|*$JRBm8*eJLskNy)8<9PMqL4_}U$(3-wHgGTWH#yM1f zdMbFX+2-!XfL8pA&)Ve0uE?>xr|uMOu^8?(M$A0+n?uxK&oWzW%yGo1Hp-iEx!Y57 zOfsH$(P#N(^|(p6%W|xi*Dmf(WtJ$W2T`wo7whM4#>@s!Kz7y%CyMr?6VB1ywl=04 zd?$8fRm*YnxxI)Ce!<> zxAxC_hV2|A_0-bpqJK{X+olN^a8ga>pLAhq$eD{F zL->Txr0so1x z9y`QRhJ>tEpDjDfl3-hY33^Vs(W=jR#*UI}?mjmR`5880G%?csP|YdLTkP}n?yjx+ z0^e}+29`0QpOWX()_N3m-FGR1rDb@H2L!Z{{|J)!Y3!}knensIs7J|8UD{0UUi*#l ziTgPb{uETa8fmbyDiLR_qCpmU?p>8Jyhu@xF;EHlZYuNF{+wf{qVbtdiI~2DQbW-3 zmz$UHQWWTR|(z??$Tz-Ml2^U}zswI~TXbh%{j-WT&8#A7UrYz?M|^y~ zLNFomppk8Y!IcAs?@+^W(kFXE(0}$-AMCQ9bz9&$?< zTBI;4l|IvffirgCUi%TaFuHPw_?y;p$V zZBWqCuOC#~LwAZZRRCk!;5$u4(Iz8v4E^|4F}D6l9eJTiKANIxAIKsr$A#2EO%x541zWWa5JP*LFaj}_zoc1c4gQ*3u zzyId_=9543Sy1~rwp8U8C#g|MB zU-QSteztAcFkSyY5t^)RChGYg3&C`9`{FkP?gsTZ|B{jUg>##*=Q z^WP8TT~Gtjl8BgR)VCSl)^bVrk{xc_x7jhP3#(Ak#O>YRteq5kORv4P3;wj`J8ZvD zwnm}v$tZQ~yaL))JSsatJ-)H8@CVD-!D8p|)#xXj@z8z1@oldiF6{%}0GD23?1f*b zoIm|$+w1rH5exZ9WuI3AbtUSq<|iDTtk0#*-a{f`{m+ebZ@W*sk}IbBBSxKqZX4C9 zefs*>PunwJy|~+AYu@)G{JZRkug3N3SiO;}ql>Y1&Be>pqhn6TDmfLCuHouNxm!5A zEy-_dMqz6-&~js_sC9(kv@t+lS5>T6Yub=&%H;t}cs!(ug+DHGFtCyO4Ljjv%G%f1 z+pACh6damW&TrYiqbj8i=`lGu2U*KPeE#6w=kOsm#pmbDbg>-)AGE+^<*}0#B83g- z*17TXlcvp%n&d5Rx&O<6O*T<_a~z|jcfH#L1?^*(PR)OYpSPJ0$XvI*xk3J@n9of# zTytT=@itNO_$U0t%adbpPSBV#Jhe9|V1e8>U$VjR_n1(eTxpDQ)eP7)YSBya2|lwv z2ltr9-Q(UC)XgYCR+ic4Cw*+4C)*gW;+t%o-&Ne0uKrQEbvvSE=0|IvV-VuK4-Xjo zwKl&NQBGKVWf{1#MJOgjxrhHu>9Oh|;!wS0em;?!9QpK{phxS4S zR3lr&oU>e=H6vtQ)teAw=-mw415^u`_xMtYONrR`V+Smxylej&?7Csl_|^e=*0@LP zL=RHUx!%d{O{O90n-YXcRtSxhzy%Ylh274ikF|#uCBAB{y7Oi|oMAsQBQ+Q_eqHj1 z6CyBUHqdF+g1u7s7*&`hTL#Vg&*_*X>t(G=$!4W~hAEjH_0d_WZ%%771Dq^|HCJjY z9Ea0J8#D7pYN)is*a@Sy3Hyb?4!hF*4h4@$1PxPVF&FW&xK3*EM(M*Y&pB(!hovR8 zB*!AV-aLh0(U*fW3RHUbCWT}uR;XM&HdLas>^GDaoKv5cpEZ_CBXXJV8r~jdoc}AWO`Uxti(Bn zM?vMpd=|l_X!_ZXydd2k0CoN!_D0;zR-~e(Z>l3nq%NOc_MO&m8-wvWYs+BYA zFx<%N<0idwwWRjTq8{@Amf4k>>Xvu4&b6$VNNdZ2G@APT-P(81*}q|NzD4M541Tsh zr;vO2DqER@<4U2rXOufytj~`%TY6Kl{AREE@NPfkrMZ33B8+!RM%{O%Gcz>S@0ZW3 zM=B1_G$>!Hm-^zimwQQY0#5(F3aYJg6uOyEJng;M!vkz0^%iXI*Ui+$EiUnpsT(-Y zQoxL0YXs`6xP!17MAz!w6ASu|SuP$$46XMraoN-qm!F*GCRsWC?woUto21DKkFDTQ zrUxvwGrl7#wD{2A0eR_Qv3%d(FMDZq7Ws#{w5%K6EYnRBa$fZujIdmC@KpSxKUSnL z%lB>Ok(;+OJ=M-ldx!v+AVhNxvT}yMk;+|qj#1H>OkA-a^XIg`VSP!_k4E=oS&^=n zWsA`%l}`%h>)S0J>opB;xGtKQ_Q{RhXl#f(+1nI)2lFSE^qfd3Bd({yCLr|%VD@3x z#^C*HFQAxin=EvvfEzN)`U7$q1lv=&G4K-X<+f{L8AM;LaRf7+lg>7y;)S?FaDLOn zXdwoaq@iiuF)cY@dbo}HPOJIM3*W8G{3mY~wu0CS@<$maWzO?k`2{6kzi}$R4^nJz z3ufP9z;mEPw|^DX;5!ZD{pSl!yIPi2(6pWA84@o}7+;z5nv%+orwB#eX zC8|a$?P_ZQOBJ$B1j%C7!{^nB&Ch2OSCtE$+$RxqefUfAS7;8QBot;O80M*2RX5UX zR)lR2qX~rWCQr(rz%C~odh*LhCN^W#FyP%O@ky8SG65IbouKVuyt8YMfxcpqU20Y5 zbvk+C9ax`BP5v~y(O7$M>}2*xfn&aWe)Z)dEAfj~s<=LM&@-%Gh^e2Wgo6sT4C_Nx z+LwVTyMu5nxvbRNvuKsO*z0FiWT6_jNTt-DA3hhIl07PWqE{3;qMOL0QyM!`|{`1UUuEcOQr(t^KCM7KCFCs@l9Q_J%) zne|CqY+@x#a{P{fSjR>`%yx14aa?r(0h_k1;KZqq?OPFS+o}FrqTKOL2zn&YxQnvp z2b&h4R4xyq;^|M8%q94TgIxJMCHQnlA zU1HnYZ=KVrwD=3L1(|gf^7QM^uJaoo*};MrzvXVsNbU_lP6n+aDnIwW8Cn^xZZhZ+ zyf{~~KC=eL_ofF-wckjzPE1vsaO?C+vD-nNq#rPg4D_R#@Iq0gjZ_tudu6MKNImw!j%Ds5tATV=t>!82+2u$O3Q z`UqztuFY=1b+O*)&MbQP^O?g$D5az1*pamUX06_r5yr3`H|xCd?8eg0+x0T(*5@*c z?!O*vB&v^0e&cfJ)q7DID@`qBH+7=smF^elWpUKhe>F9E%&k*w1@iBwgFGO05z(HO z9ivFx#REvUCj)dW783NJ03ry>Z#{q8?SA*grzRG}sZ$1~1si>ys_t7xuc3+8FL9_F zY;+vZ3%XIeOxVCD~}N5_dv_2kZ?e zKN=e>$M|**+v&Xg>%@8PXO5gfPKgvs^L<0ykqWD?OEue*smASf&S9S`wc<`7oJdA% zmhbGSO9(M4g?!{<#>@RGofom6&|!DDpJ~a18P{G~h}&g(nq`(5q9)KoZly{GV*T^g z>@0h<@=Se{71oN0NYe`{{48f^e&F!$JV+@nt}+8SIy@jr5ks6gEpGvtSwZOT6Jn6o zcn}2sa7u_bg8+AKcYP}W>N1MZd{j++Xm@KXxsY!>Qp-&E2l4ahYOQn}NgNoz53^AHm68r4*9w=(Q%5wX7EWLPA(YztG{XHGF@1#-eq{PH_i?as^vkDUnXQ>N+DZGn{)yAqAvHwYm<)#Vp)a#w zn4x@8PKgpHxo-8oyjCjn1w!^J+N2tU7pG|3jp;%;ehU*Jqw5IJT-OsDM9uRdxsc-> zZ6*DtbpvkpwvSHlBMe87#TPu}KZW((Yi6Le|g> zOUWbF&aowM9b-5#xWBD{i(jKt5?Xdf4$;OnrSE`rkx&$g{0JjAa7#u^qMHhraQBNA znaxgEN4l~U-hhZsL#g|3zSfs|M_p_D{%3Y{IRI;g(OsvYj3k&ROBAj3jzdKIvBXgE zOl(jJO!!KBB&-Je5Od@QR{RxX5xmk-(k?AiG?%y`J9UDsE1IQ?+GvV7=RDgSYeEaT znJR&U0!r|Y9q^+>3Jy*;$4w%+!siPYFnS=AoFE8FQ>N3){7q$>Kr#bL^3u`Tu^@kR zaGWw+ivWJO$fv#mQ)%Ahczi*uerNi81$A}z55rgAd_`!Jcu7Bx!*pgM-^SRoD-`i#Q%PNHFPotGMui3g(8@*LGhQ|}S1y@2-f`-X{^>wmvj4&bC&I6>K7t+yZ zxc$lQ9^`rM0Y*4REvtPzo#Y|TFt7aLrw_pT?d>{^kAFL(;Uu-Wr!xe4Gb%|#T57GU zx-CSYG$ZT4tMDw5m4hR#is<$Y|EWiy*^2qQz*Eo)rHhS4ODE*S-VdVYx+a!u6*{HrQLjD;qv z5ZiVZ?Lc)E3F^klz`f!3S`~-O2QQ$vmy^+Fz?Y?Mv4?ioOLGU@2-h`#!nh?cMh;_VMwsOm|Z9d8uKnCAc%ym73&P*XG?;fjO_RF zO2fLTaWe58a2Qx(L9e_|U6scA{xHNsc{dByePyi;N||%<8;e55`h||ki%0%cj)63d-Fo!YUaBpGDr=aJggH=Ur z1x_(qy4cqRm$0tBDglah$?stZqlnc04usge{-|Lf;Wd;%6jc1fusqxJV9Ut5wXMXD zdH@%vU>P0<$YEUiZgD6;|R)%}PYhs_4+NmQiVwWfyLs z3V#j?orWTelx8g50ha=&{}0OEJ)X(`{~y;&B`GUHh;>jxD2IsII!TB{4mqxpoI*l| z**ZAnxN>~uv?P|}a?Wu%haBe+VzwpcYz}j=L*MKD`5yoH+-|?y@1Jg>UAC_0^?W`a z_tV3qKZ;O6jE9S&p)|MnM?gJ;{2F_dbrT>;#X6V`Y!LQvVNI;=#cI_V&XV`#Z$Lu#ht@72P51_fD*9-5kcLD^ZhF@32CL4RTG%&w9*&vF{hYZ za(Pr6s7cpwXcS_{85H{NU%gccT*wF1*4z0ffLuE2FdEr9s#X`k;H|#l+#*DSa9bT}%HLVoY zqTw{%{sC1J7l1tMzVgvfG(BzX9u$cIE2LK-KQxm|J=`SefjA5^X5hzrX2{W1CE)eS z08PeMjOt$M}_tm{UdPI;( zW)pa6a6N1XRT^W)6lcdVPj|NVM>k1USC05p)@th?bTb^qTqty0Oq~!)0A)U2d(HIQ zviGo*1_NyeHks*xL)96d7Me~DHe8|`sMrq#e1;5De}E!AkVSg=f`- z18&#Hs-joURT?PL5fLzB;#~kwtLlu_HvLwK+rOycjIM7zk}QD!htm!gBwR1dId2~|-(r{oCSYPN0*0hZAMkTnu$L#%k-H{Q zKaHcSCNC<n<7uNlD^`&N;Eh$;E_oWhM9Tjcky$T_66*C=Z?1 zmT77+X(Vmp*sD6mU>y6i(c{Mx5x(U#NRV5ZfKoiY)sasXe1$WAn!TLxQZV z&G8EfP2^S{)kHZ<+3G{>eUmIbi^y)}%p+1aH}JlRX4m=fB8!nC8}DgrWvfi$+@)^c z4~>&kB^PacekJhgcQ(0vXXJ2Pz?^iRl9M~%2B@F(I=x6L_jSIWQq3om00TQ~!m$I- z^|HwWE^-$L{I(Ze+jTjL((OY58x%A;AQ z1V+;2`;Dz-P2fQ2aJO;DBv@|j9pcwdv&!O{!NvduB?wJYmU^ z{=Wi6akxfGwV&N3XC7&mIJ-`9t_D9+*7StJW|(SI_57?`{fIbe33m}yIr?)FEm8W z{LgA>Nh3cj(94J8;U$^dT})O%@%M~Q891ouuP=s%LcZ+;FqV21y@F5Y*X>Zv0>faH z&`nTd|Mp!N&VxAd6NPe`ygP1xeSM1RjFhO#D!!n$aQaJaR^mPjD=}wVLwVxSQqQWK zedc*~9a(1;m8=SMTQX19B;n#{O72cn*djwu?J2 z+8kQ6J#X~hVbTFaFk-l-{`qI#ig#3t6ygx9E$RCeBS^Jw))ChvnkURhMcU?eUS#J; z%MEmlHLuaDCBY)CL;Sm9Lc#I^xu`g_{8qpXrO7(RQ|c&wz$l;aHU8rJ-784}1~N^ma#9(2xW3jYj{?&LT1;MtJlxEKO*i;Sm)QH#3Sxum8}fLh7HO?D$5^58B6&w^ zlt*lb5&c&i9SSSZe@a|-=`qx==NL>kP;-WELgX$C1kMd_%rSRd(z!P*$;5Fp%p7N)7?>6pk zdPQ8)0mCR>XRFr??h<VqTAK^0<`>1y5=*;#4&QnBC-Y9o zX=t+y|0_aczW{#}G1K3Npv?#kEwR1-3Q&UD@uW5Gyx=(Q@hWgh@j5RBwAE235N!Wi z-pdAY#x{R1#;%Sjj^;Dy?b)%PfZ7tS%FJJZBUxC6NfJ%8bix|6yJV>ksLZDju2^kDP_7;KHXu&dHw&d}0FYZFFl+xHA_l>Gk3HlWk{#vF z*JP3-Vb^?T)Z^enGQSC4!9=-`L2VJIGkjIA);s7^9iz|EQ&T}r_XenKIK-6)7npzt zlxc@M#FYl{Gx#6n>f^{6on<;)5skM1a#cA$%69 z@RGP@6y^lSo)0E3FmY|YQg;9m=2n|b3J9#nVaFtsO3*bOP|5c!p$=4>^I6u#yctff zh8IuAW<<7ibmC%eNspV%$Fx-To#&Wn5JWk}D{DG}YewK^e)~oes&qOsWb6AQ_)uOF z90Evnc;|l%vInJ;SOvvS-a+_r_Yf&5d1aPjI00E5A8=4RqYboe3^&+9qExHA{Q{;0 ztps=nd4-6FR6voyl~SZDz5<19NKm-CA3QJr;kq)@!YfI_^RL)p0EK2|tyPgfjU>(6 zmSc2Bd^V_{wSw#9?O&wtS(7b1(r~!g>rgcT`r42?;rv$njSwBhJr>IZNiNC^^o8@j z&%A253T7`a7ZmXJO5J5ithN&3aQoo*0f=9L0LZPO1?N!$CriL%BRk=pP)L?^!i=SlGdvsK19rjfq z?Jd1TnGF$ZFF+TD@-*+1kN!D6QgRuQh6K*6a-~GrbG-0?)oAQtW?BT-mh%umbUX!u z9IBZ??W@PQSO6c!taqe*98s+Ty~Hjy16*xZXh&)YDt`G-z~n(Uqv6sGvhX++aBjUl z=$&Ri8n{(2z>Nn688$!?D~jIV7L0}3Vb0b9u`HcV!eR9$>4jXBnanKE_LBYypB1j!7qO<$X?FAqcBd$i!^G*T6b^$?xhv;9rd=#WdJ&DgTP9Thf4q+oHJarGFHMHcwX&FVS z@khR{JrDB(SGPJVXyr~Q7!jZdXdnSaVgyzW4RYee%%J5oW<8Dn;y&wIYXv%&78Onk zJj>Vi%GP6T#W(er0vG^{FGC4nE;DDd=HibJyA5*@dFVf?BDV$_t`q~4H<|pxT?>dB z(Ab4zbap^uoP~fb@He`Fw|xlPO(=;!ctu(e1jeVoDHH%BY6ZOuM2 zx|xB7>+?H82$7hlb=kT3z=s_KV7?)qhps;8j|@}4OMzVp^H5&AW<&W!snR!{OslO9 zHBGU(Eb7J=c41KE&?NrBR?y|AE(XkXIv;0cA|QyFoZHtJW}%(%^J5slqfBbsYJ8pf zD?NZ=H@eEb&t8EdDUVev8?P^c%(uCzzHgc1ru>a z2?F=51{^D+1GO6_oP&7)G;{8QASVM7376uY{>(D$Bj$@UR9)z@XzJCpwz`$k8s8kW ztue?6ra~pA05B6QfFx??9y0g(fdH?Wh2x6XTQcXkNA$nqs%*JOZ22NCOw$%J)Tc=u zbB3js!n`x{QT_zrOCR5yQgLKDXU$Nm}PIpKh4LHyXudLL0r2i94M6Ds-fw^&yYUwO|wW{mfNNWYht zhup6HtG?p$79hrTP;1u~i7Qsaw*=SM?j3MxmjV8N1@ful145f%Au9AjCyklQ7v^)U zt1+R#*GZ>qxhufwQn|!an9}&}x{KDyZ>|U(*#&}~OyfphQ*gNyf@^&@Tov2Ozcfm{ z4ZL6yzdFNsZ>kQOB{!83Cq1%dU$vtu)Z^vBge*jqZMO zd30#}@~%Eyv-+Mfu9zl&ADErP{ti^p{so_X68#}c3=2o0_10K3!)gsdC0!m&fA(X* zNyc%~@LWjMvYz7ejq4QE6?wbBUV9!ra*e%an(_G{0?-|)&Gq*cZ-Am1YAj5ggn7V1wVDO{9wH za&ydQvj-VXKESmIqNzuw*67$f!jDo))f!aKl+l+CnmSi!SPV62R6jqq^);0Gqk^`& zECjkQkMcf}XFd@?`R7U!4b;Wop$ENG<=$r@=&R3jSq@x%R#Qr#T-wX3MpG-`Eq%qI zt%RmhU!TI9d#x>J>Ev_pQb5L~{Mz~aW1(rh4#AQ+Oq0 zcN~O!04Ta&%Jr*kWc{gUNW+iLQzc*qtp4_iKaD|jlo0p!kZ(!SSFAqe56mU-qy1ga zI$|XEI-)|0DhAm3Y88~s)d+BM+2GFk@+x)+RlXMw!oJaD=1p}#+2<|8TazvoCt`ZYIuIGN;<{ad63{X&H(ZQmjiG)OFzTr6AOxet0oGusQZ_n4zlb zbpdEAX(b7=A|$lp!7=XS+;z8CjKq1kuwH@t`qKffdam8Pym$o=6$Zj{5u0=2l~eHb z+mx|Z_?f}d4TOyQR<-Te;iYGMkSqv)`NsfZGg75`3MsH%{y)=PA^#_!PzR=71Nu0G zd<8l|%7FZ$;cM_-b>LQjx|Y1rUW4(jnTP8!lOjEv%Oz&c>iV>e)xQERKkF$wt6oRx zq)k{@3YGoHtGl{^TyX(I-qx0m zoGa|FA3pobZRb^jKZP_bwnzOx#r~4YBF*8(;egCwg)Ux@q%L)#lo!$ zAE@XB%vrP?POHch9x3QC5zjP;Bb@G>)6EP2YQY|{3d=J#UbAQ&vb0F?-2C`ci4vRa z68yB*{C4;$rS1!e3k?q7Q@aZw(48Jp3<0N^c&Y1Q4_L(*1EQzBPXSA$gMTW^!mfCu z{~#JmAMw==zaa{q2$Mi|AbxJ|!xKf!pK~1teh09$%fFwoPMmpCDB;QQk1l?Y6P4&; z^?i}&tJb|%xj3zy=h%8U5>w6Yw%o!w^k6i5l=QsLw=?{Y8Jdz@UQ|nF5VQ#+vwFIj zkCYGUPQeWJ7gV9!)k7ChdoiG`=H(FAkfOTTFAN^!5`Q+lzCEZdZyaqp%GCry*+s#* z#;4F5_!zM47pHrDuOn_xL}a zJ~Ah4B4#S__MU&-?h*P=&-<)@3(ZAU&26`^W00BN{meVLt?znbotFym5yD;YhA&Z3 zpPB;RkF6C=IE7++piIZyW?nMPZ{e?iJfT9p)Er0O!CCi{{%Pn3vYZ8~n=U-DwIQ|q zd{A87NFJG7%5T&Iqg26GrR}gOYST-r3Dl)|&TJsVu%B13joc=&i@X%_%oj!^s3!66 z7vhPtT~|5~zv_1_WgBmSXJhm*bK938w5NNe2K4iir9C#%^{Cm}mn9@Tllo{h9r2V8vtwZjU8aidNYAi~kaBGw(Zj~;U&IuDCJrH}MkJXSAzF?KNa{f}PQ;W0#2Dz3pN`S`(IRYWFiBr4V`C7|N(>8VW zE(@37eInb-0V)MVuM}5?2bW@0X<_@<*gJF_9U;w6xit40eZWoRNvY7`mQ2M2e0i^m zZF{G9+aVDTql7*F5)3?^`!3zC2N4Ela$yT}XQexQC zpJQtZ#84Ei=`ESQkq~R>lO=<=VXwZ#7uuvgEqMIY9J$RPQ*^nDIMR}DbJ&=Y3W)GA zsh~Q-SYfGuX-8D(H)KZhO1X^unuc-Ib*8adj7QFis!ofTYaqkQ(( zjJ!Io%P?6X(exClIvQ7FIW$3Sq--`t%^bu%gr@Ehz}b+QkE2$qI4Aj?*Vz4tD#VH` zGj;~TJ*R?yp*|A`Q{%#pOV*W9Z+QtZq(u^WRQM>akV-#XX(cp{$gZ;qSM zJqSqd;&BH+GGT-;Vaq_aktYP{{VQ*oUe-Vw%fHA<8${_4}QFoH6=K(n*c@3d_gfy34mhSvfn3A?8h{5po(Jb zSXpV2FjFwgDDpN2R>2C2fs1kxEM%(%hx``7?sZ3BVrmX zSUMebBb%8!l@st-9FATB6P&{X$HBV1f-S-H1#N;IU|H1~aDQ&jOn7J*I`3n_JNt&FRor0VTE_b>A(2E~Pzj=gSSK{;A3`p!beZp+Vy6ZbY;35?pKe=}|4x0msrD zw=kAEtvC^^QLAON+icRaNi+T8Xo5Mjp=SC-Q`Hbr0PF`RNNjy@;XNb!lH#gyRchWQDdon}z|xjNdT^Cn>kX z&J6X*Ld6#@)@_zXxzW1!5U2wdQUyj4IY}pM+*`Kmw>k{?q_t6l0LTAOo+-by_+E z)HqTS2L$JlfG+4A6y)sZkAiy+G6E$8@_rM!GrpZD`MX?Sz^o7;d_^2=I^h97$vP%4 zQptqIRjNyP+S-Iz_c+@vq`tC^LN*RdR>vO^^kRd@|4Z;}Y1RW*`9~_# zycfzB-Uds8dq9l`7|G=p(QskL7vhAu$BL{KYDMh_{t7q%)`1_VxVpg93?hc|3edI^!g#CzhSn5nroS8Ms)DXopT|jNXROHR&~NWC^YZKm?V-I`~ImQUWal zAe4iRZv9uXB-x!5Gc5$DGrN0c5G%s89Ygnrv3Q4_UcR~5UK>gQ?S zJ-<`2Q0;p>ouxHN`A6r?#x9-{e-tW(n;FMV;^^>qEH{u%1nW$f)o4C^utAZCmNg&! zgYf7LYHgWp*>Nr?T9UNCOW`UqyhUyW##)SNn?}|q_Wt?Jxf$aX6?62k04%MI%(TM; zCxf_RlQYn0K8SlZYjJg$_4LlTz{!ji2NNKeqw8V+hN;%bn4>%>uLN-;b-d<6T3x_1 z_UM3J{EeMeTNVyas`PTXPg585k}{S{5x`xdGEE?WvSb8P6U>02qb7scKUfM|&k&WU zNVqy0R0FiDA`I)&d%oI(Ma+r|&AH}1(1^M8a3VV|kE_N^scDHn_0`tK{_#XdE)BJZ z7#Zkfy%~!TMHAZm1hCDx<{LP-Rd9n^3F6#D6WB}uEM)eenHU*FJXhy^J4aPG->{$1?+cUsdc&=;95e!LHeLv{rnoWLMYI(+Yk@BC-3Ra|z&?%yoc84&QDMIT_ApWG z=%EHf&T&itaF}yxFc&dbMor zz>35n$TN~Y0ORJ`3BC|XWJ zEzWY~gMohq4lA~<$Sfh>i#qT{y?M3d2dk6NnbqYW7mg}_n7kVf1ABJ}To2qutXV;k zO-F%sW7ebkoO$_EfD)aj(cc!5nvoBq*v-2*Ms{Ayu>5k^;aZWGz2S>9q4Oh`5pQAy zIN$~~&RE^eRpOCx56ID=AhN+a2au&vTd5P*zD}#M`r~0{IMFm371TGGmyOZMV^zI3 zp4~03>`|<%kpG(IJ=2HnA6Cf9s_>lA0ZVrI$`wvuVhnzG3T(&n4?f`K zZ~B7y2o~f+nB5d@eecj_aErq?_ltYTD}&+K-?T%?BIu==l9A3hE`(lUilmTS30KOz zPuT%rcH?1B`^J|YTU*)thT5l!7kqs~cI|-2mCz&XsHBVzxII21{7`SUt*$<0Q~!mR z2R}ETZabb^Q_UQU@bQHyF&CfzruC!<@sC&C8FkhIJA(X! z$Lk!_f81fWHo7;=R`RO2*8=VzDEJ+V8~0*+{@W(~!g~FmBR`vyeR@<5ln7u*pkPd$ zD|?A0!pM*2pgTEF-KioaQk|nz`BL!a#{U(N<{#rK3}WTEHdUrC6B7{wGswYs z)edZsqh&Eh`M@QNUkO)h^h|0;&y|`{7)0%D{%xVJIHsdIpt?7UrJ`nxn#sUp-wA{<55!D82oYsd#d>Zr zO(!r2Acz4G@swBPcgA*PLz&n{me=Jmz7+QnV9hWvy*#v989jDuI8a2Nr)ct}mI6D) zh!pojglwjT6)Lry>tOv+LmjRil0E_i8WFRE0N z0UF8QKQ=>6s3Wu?1dZPR;Oa8*cLDE4S|ktQ#Ik3R}3|1 z(!Cw7k{bp~6h{IGB1RwV0eqWM!G9t>us0#U{MlSy;X__E`7vqY6gv+k>ICSU0ZwPt`Umsrv3szXL!F22V?@$12gZI16`zJqlg(S8% zG`e>3fbFx?8uyvGr;d}IPr{Eq-ETsKh1_G+aI(eOZz4>mtisQfR1qakdv63a@j?jS zG-KoD_JZD~CtiITeqnVbP4<7ZsRr12SSX=q-pDaXP%u#H=%g(=W>QWRGhAJVeFFaoPPnO~z zF8Op(eNEyYthQI3P&;yRi`~f_`??x_yR~2ugco9bo1hq2_3**&dHG|^j#p26{{s{{ zpX8i6H!v^bXd@F99k}#uuEyJ>rKg22MOjr1Eb+Z54(j!Q9=fw_(h%K8i+;?^#8JB? zd1>aemit=qjgz;FHbd^7JLYxABGs!cxLxRK_z=nD=>8*`O84g?dRT*mjj>%%8trw@ z)u^^w#(uBRHU(#1klgDAtlt+_{`m|XIDP%6x3u!6%AL97C5t#jEfO?X3fFM7`OVHE zm6RqK;1RVAWaUVeoV%Dn)?_>TVjU=8lSX~mP80UPDVRZDHk_9DS)(!EB*e@NF^|eK zf|YC8>P7UftaJkPbV3~0jo#!6yAd3pDsn2WetTFuFDLEh8E_Pf83xfUa~ zw?g>Ag@1|WuuT_}EafNs+%8>zwQrx+XddeiPM17(eMo#=pgIeVv2iikdXi&!<4|L+ zw9cv3=(`niRQ;ew+x?|F7mb&?R)4(e#a>f#C#QY1PDYv5+jlt_`WirT<19zGsKmvZ z(1k(!QQLZzL$3f^_`lG8A?RyvkqY%`H@*r#g=)6t3L!BYeZfb-gL!ki!oB@;A!cl8 z5M*#h$EVxQ9r3FYsuk&^fu8-*H0>(0BKSnjIHJ{1{b~s=n=pp#9Bnr`tEbHPH1pKR zzj!NJZ`VUf}Xt1v~4V^P3q{nfv-=sEvE`UM@-?(XVpVGxs3H+ zF3jzuFl{n!7Fme$XnH%eQ(yFRT*Vy+?(a-LwSxPh9Cxnb&`POG+U)_vqbxNi`*GuS z)l)2;HeZRK?%x51_b+GYh@6H$KmOJ8CDfw&03KqW7LjQdopq@gu8%M56t=YWD>+wl z@@uC|>f4IEbDbigPl+q%NIhsUDGaDR+aIm*t-WZlOQEo|fPSH5(90C=8dW@96aQgi zD+#fCiF1fsdG;UoQnlk#zmPEfvih#{n>8-^D{=K@NpTxp9h&O`V4Bfifo(phy!l!S z!bP(JR}{*>Pv)l@JLE4s43?G8$SmXG5Hx{PsdsCFExY7dRc!q;oBX8}&Jw@pAA@*- zn?9w{alCxS1zaI-<5d?!sC)Z)?5X41_n(T2YFraAI!C$HoS$m<@4=kBx3l*epG7`x z6EN28(=e9au6}OJt|ukwXcAQ9Z63YZzB>~f>^n8%A`9wr4c;F%R!A%hei-aj*O1UR zckJnRQ~3*^Nk~gzTg~Uu?Ig#ax1PTgv-|aS*Rg*j#*+^T3%q!vE8R6A@FPD}QuRRj z)i!Tc@rK8?oR2w{R$IHlv?E!NR}ugA@{(c-<4#KSM}HZDHD3S7de{DsTPv3j4G1z) zZ{CGz7>hr@jLyn^0=X@B^BzQ6dami|*?&4GL4<#92W->-nfoiiNZxgz!tBC9t)cH< z?`f68iiO_0JRc;I5nf_)$ao)w}u{B z#67r^`Rzi7g6c{_oWN*pt$UlQ|C52|@2^t64GNG0_Vpau_2lC7^Iwj3oZWRY8!dbu zskNu7u|IXh{osZ}IOP^KDWi5-i5wrk3_$LFN&W8A^+4)veSAFky^-ktK1@&r}S&VdT-5a>^eq zhD+g(c8S*ME5ZLf$LT}8Yh|zB`FZ`5V_T6vUOiOuj7I%cG1-G))L1dmn7e*iOkuqv{+PeXTQW8NVPHH5GcP*Iz`t`yI4h7EoIg2db}nb{ z@VY|KKJwJ%?~_J?5sU;)eDW^vsdT_-bcrxz>2Dbr`P`=xkB>dwH8+VkFWB4LWqZx< zVwZ;Nl~WN(2AKBU!oq)0ew+P!pCA9mv zFu5IZvpeg0mfqVGz3AnI;n?soCx#-JP9u{PYnhN3YZ<$8ww_3Nl!p4ke~oxVk^v!? zFea21_1ZQ45-BR8IKa%e$D3{t+Uihw@PQ;uY;by^FIZs374{occAnA-?%emrTJ;y6&#Wk8O`2MfJaU7~7?0R0$5--?vjl=JMej&qsAu$A(2}S)Ca6Uio z)9WJZxy2~~$X!@PCC0%UPC6}3io-O;UP{9y66*RDfoN~7jIIx-Ud8FD1onjq_xiak z=^Z`i6c{?x^1$=Plm12-QVw3LTZ3n97v>@OMsz}_Td>_R-uiqNR9-m&4*94w3yO(}npZJ|bTNNNkJF9)OFn`1pJ_ZO4yTU)x^ zJ_s&94E;&Vgv}@SuW`B)+Ur@_P2~5Cfrq~WI}YwGizuGv*N2pZ;IcCgYYISMpqJ9W zc_mwOwf)T4W(l{Zk&moFJ&SpIQ$K+3#^2TzX2=i>{j~3*tWu8rAv1M zb#od;pt8Nhvyt0;R1Y<#4@op6fxc1P3lE(Se+3Y0Lwuay?nJ*1gT{Uyt8-ERAx=^Q z6bDA-*L9EUae;i!$pQo89WV`n$yGjAI^|-pMiCct$g32EF78 zr#?_JkG%iR706cYJ!@rblByF^26b#Tw7=k~N&BfII`S*IaIG)T!Ccfb*L2%9VO`=K z%iPO8Gx^i)0;GEDBtLBC#B!ld<1dg%D4MTz+5Mq5cy4Znd{zazN*?qa|DCZ{VdCUhCQuz@{HkkDdEhwW7+12 z;^MCmk~x}hv>n4^)q}Apgt4&xP8V5U^6cyw3eoc*w@gv4VyqN*1$c@(U{zh>!_$M; zZDU&!AeqGZDQ=!pR)5EG+z_C3G)G3Bz zC4E0@_&1Kq;s%^${|X@QfON~kj_EuJ(C#V&4e=B?Fiheh7wqB}-%M^Ey|kJT_QVK; zIz`|aJ7dfj)tj_qvsF~S#(s8nok~ey&}1Hi{}Ondlz?5%D%&WT4N>&~_h^KfG|x)Y zWf2FN|1meY-r2*2@^B7(T=0&c#m~eWVRhK-A9Li{n1lC^lqfDX)cY*263t*6vk@7` zf(#I;A<%gte`CG_h_h2?M|bA!ERFZ-fpuuo_PqmJ+ZAI2R_yuI#&e{KP^aY~o9!hf z@1x^RjVRmc2#-R2@hhLv@LmA%aRJ;@1G{s-~kZ}?Fio5ZZ|LE1t&I}3| z{l*Cha1u{tt^2oe(9s5|ic08$zhr)q!99 zQ=7$;LsN*1qOgg&DG%R}>5$LhNB}b83m3G2y!^aXxD! zg!xLAJ|;`ciESNoly3bJcjkWkc=(+>6RRUcTcJ1i{Y1s0*yKY<2<)O{db}Nt`K0qv zV1dz|7i}Z>E*445f|mK=BTctQtAkQtq?)UW(#Nabas;WA5oV#uos<&g(v+iJ=EWy* zf;Wpl6>dodCGL7h3KZ@g%?*1p7uJzeFnt~pTIeZWnO2vw@!T{NXVCt0GVk34dEBGP zQT#izmQhF^QejhbhhgSW(|Sr0(t1blO3JY@*+9+8VNg<^km65#Vf(L$I zY7$ENk%!Y}?GnVy8^V63Mfrop+g-ie2{OsGo-Sn)E~X;V?NyeU_VFeuo|Fpza1V~| zWMUxAl8K+jo&|}#P*9j|Y9?Yij6H%00w>(Ko8gRN?5ZIDprP&dW3MnKmb=}u4b)a0 z8(7ZKxKC-qz8=IS9cQuf^xz|oOQR|^K@7VfidU=NkM1M7v9B;jGntZSEaDF^w3}xt z;tu{EB5tPZ-hv}zTL(j`}w92tH zWS>U(3Y(@6vI7lXrs?QZMX8@7i#C|ie8mBkHvS1FGOpoL3EH$HTWm}ngw9C&fQ0sq z{zHIoTgc;B34T=Z4}HWqY2_U~a4qjkMPo%a#d?UOeGqCvsgflv6_d~RtUs<7%$U8) zJ>!=A=wH1{k#_0#RFr`Ot-GAntjfNa{QR6^B0ig`K-_OVZ;c< z+uge0YSpEo5)+>+`#X45lfaWJXU)|;)ay)!;%R5Qozmi(ghAjta0V5L66YVssImwz zv2qyCG8s|}L7+m|(eJ`uqR;)0Aas}S&>(Ier@SO zwj9fepXK5$ZhyC3wI*uwVusC#R)!Lo3d>sc=4-Zz!fE6KXruD zWB}4v`QweuraZr5z=zQW-#R4Ts3vW=m1zf9r@I?f3zQ^)`sYzrak%@UOoEtcFxm_eQSN_Ki=x9YA01x8%OfK zTR1u(#m~Lz7rPnt^o6ywZnt<`o-n1rq)MszOJA0!#0mQdPk%EL3HK4={>s8D1(c$F zeX6?oN`@vH;fcv^(v(bvE~nfF%rDS%HWM91cd7o zxr!X|9@T%y`i&==;qpD_>n-*1hZbZoPf_kWZ}-H{{vmh;efW9AtJ6t|C~1M6ZFN3J zj%f_IxkQP?dYROH4GZ)JX z?ufrJ$ubdZm`1%Wk+J@~8f+xuTv9+UK$!$AS`%aN8u=+$YfF?(CkM&zTkl9z>>x+Z zm#fVrp|iUu?&(LL$n4a581V4z;pQ2J#Fj{#s8A|-2`8G@NKB`lINMZcVr`Y9GC7q} zyn!KIV^H_`-Eu%it%u3jChP}6)LxVG$zbVH)8y;&FRNxniYaTs^o@Od4t@cnSKrXc z>>zu%d3)2t^c-S~ib_tdiFmo6G7d7;TKo34T}I%~pBT-Q(sQi|fLgVX^wlWIC!3xl z%rAvn9z(sKEekA*=lc#v=oTiX7Dz;?qMyoWJvbF$alAghzf}!h3M! zgr1I>cdmoS)?NN5xh=o3u|<7Ia)1Hu+_B%}aL6zXTFFO&u(~0U*eH1Hi5^>!3-&P! zk!B^B8h-r__EY)CL>Jhvpi4^|+qh16=9}{ADfxQ#{4Ci?dvP_tV=%r7JZGGJoi>Mf zmGBT=9?paGid>Ft=>a85P&w|kLNto@JEIivZM6+4#nX^t=pkMpLCVu37r^#GAYfSi zNZ@1#dH7?@pv+K<#j(VWhZFI&*ov3Bve6AU=rYIDTXdDBBmG~uFv==FJ@7v!YHLU< zU)F4Q@v`dp9moWfl_TZFixlmvv~q;CRYlMBYc)Rvj9n`BSL8)Tm{`r~S`;}uZW6o9 zlmqTxYVy#Q6CYV-BlN&L4N!%%yZbm8*Ej{_Jl8M+v(#1&iTY)_@g)WY9tL&}$OmD& z)IUh!#XO9nbOVjTFjr?xn;OwkW;>HbqtmN>>W2Ue^{r)V5ShE$(6hc%5eDav9!D^p z@xYn;mq0U5Ez4+q>%OLZ2L&m#Ma!>dd|36+At*?1;HRQy^1WI+J|E;B3C>Vu?p-X4m#|4Cq(c zLjwyOj|&WXfBP|znoe@%XIr5y-EBhQF5{F8ElKctt;VQfEbkg5M$DUE0pB zQlF1tv}b+sjY9E$!3Dv8Cnn07Z$h~R(vd=WuKzw*`77`sv-hvSpYnQYPw(<|+)O=z zX?FQ2sT~({;Kw&X_9O7^b$)i_!mUr^1^v%%`b6gO4#7gb_{M#5Cj52m38suQ_^FB^ z*XxyZ#%unNfoK>M9KmtGdPjXZvv0KvS6)wU?Onw9ajxN-+X(x#;?*sOaIWO=CS4$& z?s4zJ4{%D+bQ+=+8a3hlJ#O&bWXqUl7l@PVNZz#hBWF;FIOsm{cHBcfdfD_A6PwnI zx+;3MeXNy^xki6XIN38|I@+!4C60XUU&o9ri}`-Gljqd4Fyb+kWsUD-oK^E2>`_s> zIkvq#*4|JZ=Xs~=$epu`3G^%l2h>3$ z14b{hhn!HJbt$72bSDQV*4`ri%O?b3=A7UYzEH#$q)Kkmui&7ntOKW&^s0*JW&6|H zf7@kiSP&gFds)-nX=DD!u3IhMh(DkvlL}F7nJMS0)8CbPC-nJMRUGJOU>z+Sjm@kK zSL)y5takH;TVTk`Hs>& z9w@6x@Qlfv?jtI8Ec9OEnyaVPI0SMcO9I16Nn1+*&Ym#LuVJP!ApezsA;`mX1v$d@ zy$oTPv_W3l%6(=mja`zrAb%csQM^!xN;t8a%3|W z93^$tH1;dZ!WR~DriveQADt1YE4VPI1hIYUJlcxCnJlcf(L${VjlSng9F8dcUObl=T?RYSG;9FAR!k6NHk*LfQ zmX*2tS?!kTN%=&b*kms&;-%BCBc=+8J?e7~v@`W!D!(M}BVQ6@B)^A+Z$?JrATS)Q zH;k)a0I1vnbU>kwG}`4dOY)sROR)K3DqL}(;XGe?fNM+B8sX}Ey7p^H{;09GgPhGm zqJtcqKgPjFKM9tK!w9woi}yWkQvIeGmn8S{?v8Y?s7m)5reE%P8|9mS$jH-WA2(h~ zT#vu;{R0=p9kU;#3N4~jw;$_OXjPb`u^lcT2$Np3r9mXelM8EeNOSRjJO;2 z;AP-_V;gIwP!r4eEUj5-a|;s*$e?d@lO8XXJX1nu-lmEJOP$%UVZ;ofX%CpF5Y^0= z20eA{Zq3f?} z5h6sIbO=Neic+Olfg~VZ5|9`miEqz+@11+^y62qr-dp#{asivHu)odz_V@q(zm}b? zud^A2r2pD2Hu=rO^ry$xH>aDkCE(G$QFf(=>7CF^PCeum)5O?G{^_?f$fPx4qZFiJ z5DQsY-#mwa@f{77kR1ur$vs$z9CglJ!-!_#jnw*QfDZ%KES&p0f4oZXY@()dt)ms{ zBJuT-{H+Q_BWx-xR!j?bFiN z8zE+p)ea;lZ{5aDvwmTO2I!2I@`?l%xuSa$1sJva1K1x5Q}Op62t1(PrTnY^ZF;!IrsKMv2pFBywE>Vm0N!4|)dcxxXMd0B!o3 zN7j9h}BhTK0d-E51 zsAYji>f08k6o`jn>Q~ZH`D+e$^(87VcL6T_;KxyU!H$pFCgH_~uqWiIU})3(^|tN# zf~hye`W2^Pzx(dSe8GGuQ#1M83O-ay=<`g7FXMTJukmZ|A$IFYng*~$@6%X_`&p7r zqwS{>08cJfrH>pzwPh3lTQHMeNHZ%gedWSDJlUBNlv$^L*_^nasAH6-FYXK%88Ri; zWF?XZZcl0Sc!n#thEy#(_dSjZP<;DL8(ue{e`B!C=t*#?EDeNvM?~;|e;bA)&Ji~F z+z-=Ua7w%8T6`eng(%C&k5RO{ukgH_?xRTPB(d8P#5k{g+tyJRcWO&DaS;Tq`gy3y zc?vV-+(U<3N-x*CCzeP=+Vq<6>|LW&-L%ZOSC*7e;k6yswDdefJJtbMCjn(`k6KIs zun>#U%unyo9U5p)>)^V52=)NF4*2>jXivrG1-dzHh&0COO8?u8x@3xkI>ogcT}=zR z-IU|-sTm{)UsxWnq3|LCY4J`SO+b$5CDFPG%tOkl99bq6&XI(E@Pczzi6}?HHia~K zrY4$65Wq#M$)J0bb^+Tw;x&i6k5nz+ld3#l-gat>=`uR^1ZP!cz-1R!u@?NDYlg@v z?U`n~V~tL@GF3%6 zw)VeuLQ+HgIue_+%0uoILZ1ihL6nHt*AZDuy17G{+mA&(b7_%grJ|xoU!_MHKT!C= zC_yJaSuf!PRl1#X!h1Zg&QukFqM;SC>N8q%!R}!?vg_{{K%o~Aj6 z2{(BgWBXYrw2J**ak*rag)O5zE!2)?{_%4(Rh71dik*wS%1EMXmN~`zM%((6ZabyV zH@^rEb=(E(*19>t9(BvMQep~|{%rNeEpsD&@)bd3Y3%G-9zZft0s z#l9xT$_IxdILHzzq=vjuGw%N2b%`rza1;tEnSiq9cUG**yOk(t>J?c%T2ISBo&`>A zN3Bl8;iHjKk4>-n*@I?P7yq!dmr}Cwv=8@7#Y3Z;Hoh8GSFbIV$h-B2pe;w4A2mg1 z3XKtO{*sf$xgmPAm}j=FV#FD50mky%DDNi#p{qzCKrhCFfII`2>B#{!K```Ae#>{A z8!w5cbv&DHN)&-qj>XSTZsuV`tT4^^)Vi_QPv9gXxoHQmTQuLu08I!ExT)dsX<&^L zb)s4}Xve1Z;O&6!aN_`SW6p)kIG56v(R!*Ynd><>-(Mp?<-yr1Gb~H+opf-TZkS84 zMcZ%rlE*;zl;TI=m3(Rnw=`_o9m12#tloO;PUZRBmofVq5@L%swC>vDn{p>XTU6+m zWb7F!0PlPy71C7KHg0I zOz{V6RKbyso#c_c<%%HBFaqm4k(L^FT|axQEx~&t2t?dZje!8AFK2Mj^tE{;hu8da zbmnNI*x$mwijIYLz&DjeZD1xW&xxdz;cN4;?D_6)iR^hWue5h~cXXdS5D!3?K5#+v zz92T#hE=3j7=hT;5h1Dg>4z&bf)oYms==W7{?PALj$txk<1v3dyDAukK-)-}1|HPu6hWiqYx5Lh&3a-2N`X?eXmo(x?Ja`InEFpUG+ZSJ#%5vYEppv`*b&HE^eV zFNwH4kRyvEy-Uue>pJX472VfLlIxaDtJ8n`VxbMBcA& zIRx0OSSiTR6=JcqvCvh3lZf9!)vYXkonqLZ?9&kT$NX1w>SUI_ zT|EI60DJcczPjkBtrp~RbkqVP>W1Hin&ndfFxlU%sjRTN17=FB05G-Q^$g{JZ(Gxw zbtld(pHJNE>$VuNtfSaw(Cz>^p4v?_MUc%&NqMz9`e&vvHwj4I&yMi0KBuwxW{nkOnvBO~854{FNar z>~l-!1=aDG8y?AUmjL0_hK8!dw`lhb9cx>6tphV4=kU1g@GkOP@#^}M;VV|~$f*iD z%L==P4>k;AzAY3>4c92>Nr~rtnU-Y&JZXF!WVPst7)^l`!3u1&lU~q1z`sE#mURbX zfsl0S3auC_)(mXG&3K{T?~(HXfpmxWk26vm(~_zfErQqHkw1bdMnTfM_P%r)##ykK=XiHpSX>A`cm_Y(Nk}UBsGv2Rz@5Q9L=m)dmJKHsgh}(o# zb~K`qgaME-b1^K)7eHHm91wc6b1ECTti@0kp z7CY*Pi*{!I&V32Eg}5SGhU~v@jf9XV6P=;Ew6(gLM)0GOA7|DXi?I!hBgLA%W3*rY zQY_&BgR(h<^AH0t6TA*P#|jjqQn39#JoZi;Lo;N-Ny2QVVoW7hQ1$kLsIR zT6ykp4d3fiRSzU~DHd!+klZwNKGr*AOeT67h!%Oy8B>zal1t<|go*>$`P+T*N}0x1 z4*`IrLR+rir0`P4t4eQRPA0-uDPc*H5-4*nx7Sc=t#*a1Rq(XSzrX8j5C5C(@6)K#ThIPvPq`&~<{b1WLfn||I_-pS zR!K*Q{zxJ>a4{3CuiPvG8#Em>y;W#t?ijd_!4`SM8b<`0&rb%LeQcFAv;f(S%poVsu%v zVwGt)5DU#PNYGDHLXwP$S|81>@e2lmWE&@%7e8y7KVQ7n8NYYKNunW~`myHMtp1y7 zIx#=a2!!0Q?{QJ;b@3>98}lw!aBw-O&`1GiApT;ARVsTw~i@it2lJwUai^+h9*lykJ79{9AF5+3Utqf#K^y z#tt7>DHb-2)~TInf4$o}Atl_Qgd3bHNvA9C$cLdFe|Lo%JP5MoS>mZoMBn{`~dS*b??s<*vV zl=q?Q~|(h;tU~f zS&P$fTS=7YRz-Szv*v5XsnMb|HqrI+#a9f?@qOhoLhBO=NssGVwzn!xdfHJb$IT+8 z6UE!JRg8xITI)Pp>$xFuJX|p=4sFO@R3--A{jwo@5TfMhRc!JCms>=g>k#%7_92$D znw-yjwI^lHW6h(WDHy3S+>{Y}1i+Rl-6~5TDI2Tyy8&g(FS8ZPomjzKK@md3Y zVz$zUUm?We6{#$DWzUpk(7M987hm8PreN*vhs7if|Cy zPCiQF6*kt|EdYE->a_+8yR?bdX!^h4Jpn)!eqYWu@%O_|B&JmPp3hADpA-vf;I~>= zotz=~xha&~t(NeYHfdD?<#Gg+^RqY2L*a_&`72~mvJ>BPy4F>mK~|GjIM!%L;PIfw zD02TvRy{i*AIZbigyQ}%R9u~mIk)PJ{b?)z29*Mo+(|30G&Er+9U?E;xOlUo==aMh zU}uQgiAxAOP=TI-9|V=wDx_T(gW&kK2VZwJQG{p0%=LQj%bVHfU#_?-!{Jdild-<% zYtDxrHP6GvnxAv8NF#z-@j~t%DgAexcR!WM^JF}-FowUlqw5$N`nnFz1Z zv*MKNbCaUY2cV$Sh415!4v_5nsrp<)JkG3nl=JSn_!Rj&#(5$~JD!;9MYr-I_N3Ts z2gA4_L}&fqM|tYZ!t8@HRZxUo^OjMqA>B1w1^231xKEYz)UWpZhIbrYqm3OO2@etN z&Dfp7Ope`hdP{$qk-|_AY0Y{Dz1=di${G-H+L+yn1`utV%};y&h1937HnVtENJa?XQDn%)z}>=n3MkHh%nJg+`Oa5ID`j?y6{&559X ze=Pr#AzB1aA9j9TSy!!h_24bPyyJ?{{kE1Y1^(22;+uQ2lU3$P!Bf?@98QcYVjgqq z$xY=s{Efkp{;OM-5w2aVYP43)U9Z{4Ist97Q5KiQ(|<8hdn&hJrrPn%odav2O;yn8 z`r}L>c21K@qeTM}B|uBb?@ajKyYd9mB#DD^-zM(>OJ8#~ZqfYW)^!+VfU4l=McGI) zEO<iEu0)W#`E@^1+m6>kUexqY2}-w62N6kG}!18 zsiM>)Mw2M=@{w}*B(?chbHLorD~m-JEuyjGd2ASj7Y2G-LfibF=Aft9V6p7IrEI-2 z1J>R-e?w?CuFswDl8{UI=qDpT)h=!6u)c4y9ae=##gfi;kQa9li`c!GT&R) zln|~>R4Bew6bQFxO&cWlo{oeBB9C<7tL4O@3a1wd z%MpV$RSf~CI_R~GHl(>34JX8pYQJecUsKf zU-56dwVc0pYjnhj9ZfImJ(6Y{LMeXqRhv}LR5{$=n%R3vv%qe@Bq}c;`c2bjX6GxS z=Ue@*HfLZTkXsqEx`-qG1e4kAL1v-kRQkt^!`Z5jB)z0F3{V4$2L0k^=HnS^D~9^+ z$Su_|lnK-!&#^hs?7oiW8N117hspt&#n$8ZOlYaR=y7))wz4y(dnbC~V&@YrJxcM> z2`A^{2uT!>uhyNqFoS7bbhD{#?T83+b?SQAbibhJ8@+1_;mRDb3cUjcjS10NNdp^c zV+VKYa#r?tRss|GAN&!Lf%IphIQBQ^c1nHzaI zN>wyQ8=YQ6q}L=2d8Ae)_k6;8wjt0a>H`2}81DE*J6v8%@h-X*lt7ZWfx@enCEy8V z8N=v_ym0nBR~;c=vE@;IzXQW?Px(pfO!nZ+$|~F3>YKMFj{&T73>Z!~FeVr_GggvO zitq_aVsepH(qk{XxNRXhz~SV5i&-eXV?Rw%J;12<5**U!COn(?c{XXkS?`L`^agpk z6}59RTJXjd76vQq*qr@-BIZ=EL?e8&EPF2|mqiL>8&d<5ls{~Z_l9s=mk`JgDQ${a zp7gRONw9)1LfW`e4+BtoA3@H8+#KuxHWj)Ln+5tB$z_>U$%kzQy^h`vCysXB31vyW z_lwIDdfmOPY_?}IwQU|MSXJ#?h9yXE*<@_rGUL9qo)cH_)w@3o8IKic|A9w2$zJn!{aW?aXj}hg4;ubIr-?ys^pa3#%ddJMn$7>N1Rg zie)NfSQn_k59Dd)%svPQVq35B$C*+lGoAUDdiFqlBnZGv{bx4-BXg~~9iJ1QY|;ff zACPAZ?!2~dr7?jLZBG+Zd@S}%-6DEX-b=vi1{#qcFJrRIX{#k&-_#_k*BrDr^tm@mX?fXJ*@g}WQ+mJTn24qiSdc?G zPqe)rHr{;P_-iHLCLiC!DMHG+}JeOk8;Xndr1Hc z1H5+!PEF{5HU1v2AK3_x5X3}KHmJx}zz~Ku@=i`5w1Tb-mD!)XfdH&j!jO7R)VR70wKkxKPzM_f_ZvO&4Fa=0Hzp zE4X){qaJ*07O8w?jLf&yUn$*fkn9-CcE8#_*T=91Azx zl5)51b?T=&ot)Z5^vzFYme_E6WK&7`x$2yzG8jOR2xE?mK=)ivAH;r=Y%PY{ zOgK-u%zIkguCzWMa-F1e{0Y~@>4QG`Yj7!jm2s8cdqrOVf>tgNTMP(nj->CpehhU! zlDq)F!b`v=7W2QKYmLu`;g6LsCk0rawc@W2Z!8WBDg4q_{Vn8LhJNeM4YU~f-nNg^ zsD#S05#tgz3F+_`)+1ptkKE5$TK3Mwzp9qI^$I^(Zk&5X9_X&?;zA#OPtRM(SRy{= zJ^hUdWU^o!fl2*=k&3t<6yGAD-bz{NG3WP%08APm4kQoU7s>%w>0RLo2httBp4fg0 z_bK(EJ9>su3_DFnAXrc_Q*;T!=gTSPuZ!#>TyC0^7KZjL``hevp#bUQH$_uiAwj9dpp6) zrq2miT{^<2L#}8K5J*WgmBj9P|%g9BnmLlI3 zytkoj(@dy_G+0Ch{WmOSBf*oL+22LE1v*djdruXqe1h~XRq`+_GQ-lIMLd2pzGfNYKlmW7*kHajK`HA zK~6i#x)pp>DH!xbdxncqRJ)=thGGIdo4zH#g(BjGGhX@7l-vG%6sq~vDM|gFB zNx#!TN+8&>>T&hV5H8B|Xr30qzHQZ%87c5GYVxvl(HSJ@H8cTZPvV9WmW}?f`$(Qw zzSIAr^cND_m&iQMbH42n)9+%Wp`6_bd3OzADP?BDyUP-}kTAvD$|e|_V@Zw;pyd!* z5_8vYhzEL(Q=emQBJcO=;v-K8Ov+~>J@-xY#G@v!MdKSFnzZDA`GPL>=WJ_6{R6&atjq61DX$wYBqVVMaH@f+QLU?ktisv9RKj*}Dt&s(#h5L&I)YQ{My$J|4)R<_ik zjjTR~2iMachMS|Zu2j!DZTPmo#1-Bb>-8Ul+c4OlR~vG#gOVuo`FF;OhFGBdxicBT zTE{3;>naV)TdIl1&qKrAox(4dYgs4WvCs82(@eWlpV}2S7g$=v+B9 z2e6UeQ=sq?k;ygP;xT%(p0~6t{HkD2^w8s5dLAyc(q(pvN|uHS_coJ{_Uo&;ZT;&L z>MNWu=9P(u&I}Mf$~$>KMo$B1s~=r}2$6uku~9sEBW)XAK^!={Rw}s$^bSkIOM_=b z6?#LE{FCV0glk}JMope4UnBU2cfU}_w@{3&|1AHLULtw!?GWz^198q9o`!DB^Q~+) zBiH<72h~K5ldkZC(4YD`{^+^)d1)h+YU?*xT(!Dd;dC7(+|PY6Q~T!NrEH)L-UHy} z0V_N-RwjoWVJrj6v9G>=$&HDxB9HYHN@P|qnFp0^$EsxiMhWbq#NWhry=!jAOzr_p znV|F;Hv#N)(=@ioaQfS3o%7wP%1<)mN1*7Q*JG6*aTDw~SuI()@AH=hJB^_s+2q<<9*_hF700f|A)BGSt_bRLS`PuV zh+duT2Z?P9l*-Xw0x=!@3{!OzNuDGuG|N3N?4huDM_ODkhY&b&rkN2SJjdvfFmZZD7ZNAd8jX}kqDy6&hC9)#V!m&o?ux4{7)WBQvpD!!C3xwfa?Qg*_mz8 zNlvRP4Uos<5#(HW;;u?~^kXG|j7DV%2w!+r=W9(kRovNO8eFTRU&4Q)woNnBjZXM`o)lPPqeRtBe4RiS|b+do>|JuVZI{- zmKIfn0`O3+W*-quP4YVulV;^ol(x^Ccu0QetuU1noC$$h8d5Sm?t}uEpXUBxxRT{< zqeE$Itp0<4DEa^ng8rUi^6z^?z%qI%dqDvY>8OzZ4R{0GB~bn~BUAomi}mehd2;GW zc9L+O2!NP4IvInmq0CxDU!u)<6EpIhjHwt@(pr@nk15vO4eHr=DyG!=Y_e6G9tGMt zB4S76Zq#-h0pQoX-^zabDFVphFgXlOU11T|UITihOH9`67*3~}5?nSGY5dmP@KKkvWvrsgWLU{*5w^C+a? ze$*R3p+z@rK|$});k(7rJ{fw>WO@m7ekb6wtzmCXWD#Q9(p_m^b}N@Y+Yq2+MNh==?& z=!GFB^sUR`T?tm!;&q25H;E*vRZ6v^nPckU&iyLFyX_`K)7JfvCIur__8(`S!E(YdQD5wOuEMDMf?2_wVt8 z&#S{5r$MZRURq*?(D)$*u<^;dhH_!iikZ}>hJM${ud7~hgcSx9 zb6oviP+;lYBl_V~fxbZ|{W9E!>gDDn&?|G$*(2~GX*_{M{Uu*N(|3CNV;f*F#C0pr z#ZbEWj$w(2`nuKYa{l31Qi+GG=e#~FtIuS99Pdf1&Ix!8AOy1g@>_0U#pObV-@oK~ zpmQCW{yMjF7rZiGZ52qXg;i`8-Y5ulN2v0KRc<}X*E}zG!TPGHM(2yASAn;<#{n`k zoRUXK?e_?=$<0%=(-clajYv42g3aV>qGBkW>qx2Js|>$RbaXb4krE0m)0eL$h}U3# z73!)jt=f4UG4mxc>|Y8!?nz)t04!PYKl84E$my@k-%s}$2-hcaXDnDZH+F9V?TIV2 z#8Xk42hqNV5k!FEgBF~rKD3c5E-}B;&Qcz)wUF2Q(fTC;<-R&!pQ3A@5R`-*(&s`FiFP0?UP*tH2pb$1cP5!RhE&5UUKPKQ68 zYn)wY>h_Nw+ikfgDu;6{Ry`N8oVd!wlqKWcuhIM^Kp-R5xE}Z5HZg7x7ppnP)A#p+ zr|RKi+yX@Gq!CCbJr=n#noovGIGFwot)y&8#;McH?&8# zB1c1W*LDlkOLA?W8L?1K>}F#h9sL5_FaH$OM*Q6>{O_yP^rz;%Xk5pabRv>{r(+MCno?MkFeZeZEp@;~@r0QjE>6v zX%)A+l;mvDw`z30dCS|r8P$NV%H;UB7VS4(gk&Je_-)QpI_m;RbVe)e2 zpB>cHkf;-`o?k zgH@e68Uk>TPgwj)8eko&LW?k`AaF<^L6m5p*zD&}_i*eY;HP?`nbuUac!%WZUdquW za6sVt1TDr&4z4^I=SRskTb2m)!G5u-rszrraydskO!G} zP?16^v-nMnvNIc~Flc=0w^e(JaMk&m^`U=pr!_#|KIqk~X_Sv8?Cj_T@Ilz@T=;<5 z$YQtJ?a~zp&;XoW@@anLOvN5CqW(}%fux2;g+j(wA>7}5J2blr?1M~pSAvxM1Is-< zx9LC5=ojo%o-Da@#Y=y@aOP5vr0*(kTm3m3PTsb?&8UZOi_6K&;E{zy1Cril+wYTnsnLs6@oZgnP;6~ucUp~Crc=^RfZfYFQ zb{pfSTBn}-cvxB7rsnGFS#U9*T>p{0F&{~8;P@w?f%XTY$Ey2s>~di~a`iLEt?5|4 z*wIp<>3cKZ%#&tkPabcif&GZi0v?sLF=9(u*)r58XKB-aL^D1HROYLLOa`mPAP92U zY0ORHv$EEB$Yl0UvDw0c@iu;6UJQE)rouO_;m6q0iR^qKe4$Gy+?#Jwql~qX?DDOx2;BVWjs)e?CuY+@P#bZnzT0f@r zj~10cK4YUni4}5I^phH?`_H|~9 z@pz@~;}feh|J$tPAHEgn$1Kx)^FP1ltnJI+|8no~ln*xGPT+~VuzQoVsO~dqDqWhX z5gs_=Dvk6)4!$pGc7j|n!8={1P=F4sib3;O=TM(yZD&6X}U!0+9vl$6whKJU3UI9#8?IwbJ?De!VF-9*Gz5K3>2Y zBF}DryaR{jS}^xGH!{j4JL-6+qq?G$KPqw0QN9cIQ%83?TVwr|oj#YmEvff2T|q?d z`SfcoAnE)$Om=g0WO~S{C*8I=>o=pk*EGM?z}zcB{Z|TSSIHf27|jL8o=tq(R{6J3 z^5tZOS>2}7E8&DczZsGIpP$U>EB!c{)uia zY#-Ms{n_HTgStN!5%cM4K;)xclRM!Lz1p6odOv%S9|ZVv=RJOowyFtoH&d@?&eRx} z;&N@vjpK@6znL((ZC03YxhccODkCO(N9IBC=k*6UIr}o0!hp`fuP2{d=9PYn`#+qV z|9N`-i|_t!r}X!t;GgYw|KVi*e>e#F4_+$&zkk>N8WiNm#D96@{EKVy-*Hxu|I7;h qf4ENn*MAVmkN*Ny|96b!U!BLlr?~#BSN*sC4Dw&g*#G~doc|wN2?6>5 literal 99566 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

  • {% endif %} {% if page.slug != "change-log" and page.slug != "page-statuses" and page.slug != "future-directions" %} +

    {{ page.title }}

    {{ page.content }} {% endif %} {% endfor %} diff --git a/transform_book.py b/transform_book.py index 80084900c..742c51eeb 100644 --- a/transform_book.py +++ b/transform_book.py @@ -100,7 +100,7 @@ "(/pony-orm.html)": "(#pony-orm)", "(/no-sql-datastore.html)": - "(#nosql-data-store)", + "(#no-sql-datastore)", "(/redis.html)": "(#redis)", "(/mongodb.html)": @@ -114,13 +114,13 @@ "(/pandas.html)": "(#pandas)", "(/scipy-numpy.html)": - "(#scipy-and-numpy)", + "(#scipy-numpy)", "(/data-visualization.html)": "(#data-visualization)", "(/bokeh.html)": "(#bokeh)", "(/d3-js.html)": - "(#data-driven-documents-d3js)", + "(#d3-js)", "(/matplotlib.html)": "(#matplotlib)", "(/markup-languages.html)": @@ -166,7 +166,7 @@ "(/hypertext-markup-language-html.html)": "(#hypertext-markup-language-html)", "(/cascading-style-sheets.html)": - "(#cascading-style-sheets-css)", + "(#cascading-style-sheets)", "(/responsive-design.html)": "(#responsive-design)", "(/minification.html)": @@ -174,9 +174,9 @@ "(/css-frameworks.html)": "(#css-frameworks)", "(/bootstrap-css.html)": - "(#bootstrap)", + "(#bootstrap-css)", "(/foundation-css.html)": - "(#foundation)", + "(#foundation-css)", "(/javascript.html)": "(#javascript)", "(/react.html)": @@ -232,7 +232,7 @@ "(/api-frameworks.html)": "(#api-frameworks)", "(/django-rest-framework-drf.html)": - "(#django-rest-framework)", + "(#django-rest-framework-drf)", "(/api-integration.html)": "(#api-integration)", "(/twilio.html)": @@ -283,10 +283,10 @@ "(#ubuntu)", "(/macos.html)": "(#macos)", + "(/microsoft-windows.html)": + "(#microsoft-windows)", "(/freebsd.html)": "(#freebsd)", - "(/windows.html)": - "(#windows)", "(/web-servers.html)": "(#web-servers)", "(/apache-http-server.html)": @@ -356,12 +356,16 @@ "(/what-full-stack-means.html)": "(#what-full-stack-means)", "(/about-author.html)": - "(#about-the-author)", + "(#about-author)", "(/change-log.html)": "(" + BASE_FSP + "change-log.html)", "(/future-directions.html)": "(" + BASE_FSP + "future-directions.html)", + # code examples + "(/django-code-examples.html)": + "(" + BASE_FSP + "django-code-examples.html)", + "(/email.html)": "(" + BASE_FSP + "email.html)", "\"Full": From a45f4b7225cdcf99e72bf2429810650694e2ff3d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 29 Jul 2020 13:49:43 -0400 Subject: [PATCH 203/302] update link conversion in transform script --- transform_book.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/transform_book.py b/transform_book.py index 742c51eeb..1b5f80fcf 100644 --- a/transform_book.py +++ b/transform_book.py @@ -365,6 +365,8 @@ # code examples "(/django-code-examples.html)": "(" + BASE_FSP + "django-code-examples.html)", + "(/sqlalchemy-extensions-plug-ins-related-libraries.html)": + "(" + BASE_FSP + "sqlalchemy-extensions-plug-ins-related-libraries.html)", "(/email.html)": "(" + BASE_FSP + "email.html)", From ba6206d588a57d0baa5d7adb0ca98b7b12a31b6c Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 29 Jul 2020 15:14:06 -0400 Subject: [PATCH 204/302] working on sqlalchemy examples --- .../sqlalchemy-databases-mysql.markdown | 83 ++++++++ .../sqlalchemy-dialects-mssql.markdown | 9 +- ...sqlalchemy-dialects-mysql-pymysql.markdown | 5 +- .../sqlalchemy-dialects-mysql.markdown | 9 +- .../sqlalchemy-dialects-oracle.markdown | 9 +- ...alchemy-dialects-postgresql-array.markdown | 15 +- ...alects-postgresql-base-pgcompiler.markdown | 8 +- ...tgresql-base-pgidentifierpreparer.markdown | 8 +- ...ts-postgresql-base-pgtypecompiler.markdown | 8 +- ...lchemy-dialects-postgresql-bigint.markdown | 15 +- ...qlalchemy-dialects-postgresql-bit.markdown | 15 +- ...lects-postgresql-double-precision.markdown | 15 +- ...ects-postgresql-excludeconstraint.markdown | 15 +- ...chemy-dialects-postgresql-integer.markdown | 15 +- ...lalchemy-dialects-postgresql-json.markdown | 15 +- ...resql-psycopg2-pgdialect-psycopg2.markdown | 5 +- ...-dialects-postgresql-pypostgresql.markdown | 15 +- ...hemy-dialects-postgresql-tsvector.markdown | 15 +- .../sqlalchemy-dialects-postgresql.markdown | 9 +- ...lalchemy-dialects-sqlite-pysqlite.markdown | 5 +- .../sqlalchemy-dialects-sqlite.markdown | 9 +- .../sqlalchemy-engine-connection.markdown | 9 +- .../sqlalchemy-engine-create-engine.markdown | 158 ++++++++++++++- ...emy-engine-default-defaultdialect.markdown | 5 +- .../sqlalchemy-engine-default.markdown | 9 +- .../sqlalchemy-engine-engine.markdown | 9 +- ...ngine-interfaces-executioncontext.markdown | 5 +- ...hemy-engine-result-resultmetadata.markdown | 6 +- ...sqlalchemy-engine-result-rowproxy.markdown | 6 +- ...-engine-strategies-enginestrategy.markdown | 6 +- ...ine-strategies-mockenginestrategy.markdown | 6 +- .../sqlalchemy-engine-url-make-url.markdown | 5 +- .../sqlalchemy/sqlalchemy-engine-url.markdown | 9 +- ...lalchemy-events-schemaeventtarget.markdown | 5 +- .../sqlalchemy-exc-argumenterror.markdown | 13 +- .../sqlalchemy-exc-databaseerror.markdown | 13 +- .../sqlalchemy-exc-dataerror.markdown | 13 +- .../sqlalchemy-exc-integrityerror.markdown | 13 +- ...qlalchemy-exc-invalidrequesterror.markdown | 13 +- ...alchemy-exc-noinspectionavailable.markdown | 13 +- .../sqlalchemy-exc-nosuchtableerror.markdown | 79 ++++++++ .../sqlalchemy-exc-operationalerror.markdown | 13 +- .../sqlalchemy-exc-programmingerror.markdown | 13 +- ...lalchemy-ext-automap-automap-base.markdown | 5 +- .../sqlalchemy-ext-compiler-compiles.markdown | 5 +- .../sqlalchemy-ext-compiler.markdown | 5 +- ...-ext-declarative-declarative-base.markdown | 6 +- ...y-ext-declarative-declarativemeta.markdown | 6 +- ...lalchemy-ext-hybrid-hybrid-method.markdown | 8 +- ...lchemy-ext-hybrid-hybrid-property.markdown | 8 +- .../sqlalchemy-ext-mutable-mutable.markdown | 5 +- .../sqlalchemy-extensions-plug-ins.markdown | 13 ++ .../sqlalchemy-inspection-inspect.markdown | 5 +- .../sqlalchemy-orm-aliased.markdown | 29 ++- ...hemy-orm-attributes-flag-modified.markdown | 6 +- ...-attributes-instrumentedattribute.markdown | 6 +- .../sqlalchemy-orm-attributes.markdown | 29 ++- .../sqlalchemy-orm-backref.markdown | 29 ++- .../sqlalchemy-orm-class-mapper.markdown | 29 ++- ...-orm-collections-instrumentedlist.markdown | 5 +- .../sqlalchemy-orm-column-property.markdown | 29 ++- .../sqlalchemy-orm-columnproperty.markdown | 29 ++- .../sqlalchemy-orm-composite.markdown | 29 ++- .../sqlalchemy-orm-compositeproperty.markdown | 29 ++- .../sqlalchemy-orm-exc-noresultfound.markdown | 8 +- ...lchemy-orm-exc-unmappedclasserror.markdown | 8 +- ...emy-orm-exc-unmappedinstanceerror.markdown | 8 +- ...emy-orm-interfaces-mapperproperty.markdown | 6 +- ...emy-orm-interfaces-propcomparator.markdown | 6 +- .../sqlalchemy-orm-interfaces.markdown | 29 ++- .../sqlalchemy/sqlalchemy-orm-mapper.markdown | 29 ++- .../sqlalchemy-orm-mapperlib.markdown | 29 ++- .../sqlalchemy-orm-object-mapper.markdown | 29 ++- .../sqlalchemy-orm-object-session.markdown | 29 ++- ...emy-orm-properties-columnproperty.markdown | 6 +- ...m-properties-relationshipproperty.markdown | 6 +- .../sqlalchemy-orm-query-query.markdown | 6 +- ...sqlalchemy-orm-query-querycontext.markdown | 6 +- .../sqlalchemy/sqlalchemy-orm-query.markdown | 29 ++- .../sqlalchemy-orm-relationship.markdown | 29 ++- ...lalchemy-orm-relationshipproperty.markdown | 29 ++- ...lchemy-orm-session-object-session.markdown | 6 +- .../sqlalchemy-orm-session-session.markdown | 6 +- .../sqlalchemy-orm-session.markdown | 29 ++- .../sqlalchemy-orm-sessionmaker.markdown | 29 ++- .../sqlalchemy-orm-strategies.markdown | 29 ++- .../sqlalchemy-orm-synonymproperty.markdown | 29 ++- .../sqlalchemy-orm-util-aliasedclass.markdown | 8 +- .../sqlalchemy-orm-util-aliasedinsp.markdown | 8 +- .../sqlalchemy-orm-util-identity-key.markdown | 8 +- .../sqlalchemy-pool-nullpool.markdown | 6 +- .../sqlalchemy-pool-staticpool.markdown | 6 +- ...sqlalchemy-schema-checkconstraint.markdown | 14 +- .../sqlalchemy-schema-column.markdown | 127 +++++++++++- .../sqlalchemy-schema-createindex.markdown | 14 +- .../sqlalchemy-schema-createtable.markdown | 14 +- .../sqlalchemy-schema-ddlelement.markdown | 14 +- .../sqlalchemy-schema-foreignkey.markdown | 14 +- ...chemy-schema-foreignkeyconstraint.markdown | 14 +- .../sqlalchemy-schema-index.markdown | 81 ++++++++ ...chemy-schema-primarykeyconstraint.markdown | 14 +- .../sqlalchemy-schema-table.markdown | 190 +++++++++++++++++- .../sqlalchemy-sql-clauseelement.markdown | 15 +- .../sqlalchemy/sqlalchemy-sql-column.markdown | 15 +- ...lalchemy-sql-compiler-sqlcompiler.markdown | 96 +++++++++ ...lchemy-sql-elements-columnelement.markdown | 6 +- .../sqlalchemy-sql-elements-label.markdown | 6 +- ...hemy-sql-expression-clauseelement.markdown | 10 +- ...chemy-sql-expression-columnclause.markdown | 10 +- ...hemy-sql-expression-columnelement.markdown | 10 +- ...alchemy-sql-expression-executable.markdown | 10 +- ...my-sql-expression-functionelement.markdown | 10 +- ...my-sql-expression-unaryexpression.markdown | 10 +- .../sqlalchemy-sql-expression.markdown | 15 +- .../sqlalchemy-sql-extract.markdown | 15 +- ...emy-sql-functions-functionelement.markdown | 6 +- ...emy-sql-functions-genericfunction.markdown | 6 +- .../sqlalchemy-sql-functions.markdown | 15 +- .../sqlalchemy-sql-naming-conv.markdown | 5 +- .../sqlalchemy-sql-operators.markdown | 15 +- .../sqlalchemy-sql-schema-column.markdown | 6 +- .../sqlalchemy-sql-schema-schemaitem.markdown | 6 +- .../sqlalchemy/sqlalchemy-sql-schema.markdown | 15 +- .../sqlalchemy/sqlalchemy-sql-select.markdown | 15 +- .../sqlalchemy-sql-sqltypes-nulltype.markdown | 6 +- .../sqlalchemy-sql-sqltypes.markdown | 15 +- .../sqlalchemy/sqlalchemy-sql-table.markdown | 15 +- ...sqlalchemy-sql-util-clauseadapter.markdown | 5 +- .../sqlalchemy-sql-visitors-traverse.markdown | 5 +- .../sqlalchemy-types-boolean.markdown | 15 +- .../sqlalchemy/sqlalchemy-types-enum.markdown | 15 +- .../sqlalchemy-types-integer.markdown | 15 +- .../sqlalchemy-types-nulltype.markdown | 15 +- .../sqlalchemy-types-string.markdown | 75 ++++++- .../sqlalchemy-types-to-instance.markdown | 15 +- .../sqlalchemy-types-typeengine.markdown | 15 +- .../sqlalchemy-types-userdefinedtype.markdown | 15 +- ...qlalchemy-util-langhelpers-symbol.markdown | 5 +- .../sqlalchemy-util-ordereddict.markdown | 8 +- .../sqlalchemy-util-orderedset.markdown | 8 +- ...qlalchemy-util-set-creation-order.markdown | 8 +- .../sqlalchemy-util-topological.markdown | 8 +- theme/templates/code-examples/sqlalchemy.html | 8 + 143 files changed, 2281 insertions(+), 297 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-databases-mysql.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-exc-nosuchtableerror.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-schema-index.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-sql-compiler-sqlcompiler.markdown diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-databases-mysql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-databases-mysql.markdown new file mode 100644 index 000000000..4ae90ea25 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-databases-mysql.markdown @@ -0,0 +1,83 @@ +title: sqlalchemy.databases mysql Example Code +category: page +slug: sqlalchemy-databases-mysql-examples +sortorder: 500031000 +toc: False +sidebartitle: sqlalchemy.databases mysql +meta: Python example code that shows how to use the mysql callable from the sqlalchemy.databases module of the SQLAlchemy project. + + +`mysql` is a callable within the `sqlalchemy.databases` module of the SQLAlchemy project. + + + +## Example 1 from PyHive +[PyHive](https://github.com/dropbox/PyHive) +([PyPI package information](https://pypi.org/project/PyHive/)) +is a set of [DB-API](https://www.python.org/dev/peps/pep-0249/) +and +[SQLAlchemy](/sqlalchemy.html) +interfaces that make it easier to use [Presto](https://prestodb.io/) +and [Apache Hive](http://hive.apache.org/) with Python. +[Dropbox's engineering team](https://www.dropbox.com/jobs/teams/engineering) +created this code library, open sourced it and put it out under +the [Apache 2.0 license](https://github.com/dropbox/PyHive/blob/master/LICENSE). + +[**PyHive / pyhive / sqlalchemy_presto.py**](https://github.com/dropbox/PyHive/blob/master/pyhive/./sqlalchemy_presto.py) + +```python +# sqlalchemy_presto.py + +from __future__ import absolute_import +from __future__ import unicode_literals + +import re +from sqlalchemy import exc +from sqlalchemy import types +from sqlalchemy import util +~~from sqlalchemy.databases import mysql +from sqlalchemy.engine import default +from sqlalchemy.sql import compiler +from sqlalchemy.sql.compiler import SQLCompiler + +from pyhive import presto +from pyhive.common import UniversalSet + + +class PrestoIdentifierPreparer(compiler.IdentifierPreparer): + reserved_words = UniversalSet() + + +_type_map = { + 'boolean': types.Boolean, +~~ 'tinyint': mysql.MSTinyInteger, + 'smallint': types.SmallInteger, + 'integer': types.Integer, + 'bigint': types.BigInteger, + 'real': types.Float, + 'double': types.Float, + 'varchar': types.String, + 'timestamp': types.TIMESTAMP, + 'date': types.DATE, + 'varbinary': types.VARBINARY, +} + + +class PrestoCompiler(SQLCompiler): + def visit_char_length_func(self, fn, **kw): + return 'length{}'.format(self.function_argspec(fn, **kw)) + + +class PrestoTypeCompiler(compiler.GenericTypeCompiler): + def visit_CLOB(self, type_, **kw): + raise ValueError("Presto does not support the CLOB column type.") + + def visit_NCLOB(self, type_, **kw): + raise ValueError("Presto does not support the NCLOB column type.") + + + +## ... source file continues with no further mysql examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown index 6ff8127fe..64753b3d9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mssql.markdown @@ -1,14 +1,19 @@ title: sqlalchemy.dialects mssql Example Code category: page slug: sqlalchemy-dialects-mssql-examples -sortorder: 500031000 +sortorder: 500031001 toc: False sidebartitle: sqlalchemy.dialects mssql meta: Python example code that shows how to use the mssql callable from the sqlalchemy.dialects module of the SQLAlchemy project. -mssql is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. +`mssql` is a callable within the `sqlalchemy.dialects` module of the SQLAlchemy project. +mysql, +oracle, +postgresql, +and sqlite +are several other callables with code examples from the same `sqlalchemy.dialects` package. ## Example 1 from marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown index 6b78e54e7..1994a2809 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql-pymysql.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.dialects.mysql pymysql Example Code category: page slug: sqlalchemy-dialects-mysql-pymysql-examples -sortorder: 500031005 +sortorder: 500031006 toc: False sidebartitle: sqlalchemy.dialects.mysql pymysql meta: Python example code that shows how to use the pymysql callable from the sqlalchemy.dialects.mysql module of the SQLAlchemy project. -pymysql is a callable within the sqlalchemy.dialects.mysql module of the SQLAlchemy project. +`pymysql` is a callable within the `sqlalchemy.dialects.mysql` module of the SQLAlchemy project. + ## Example 1 from databases diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown index e10050910..2508a798d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-mysql.markdown @@ -1,14 +1,19 @@ title: sqlalchemy.dialects mysql Example Code category: page slug: sqlalchemy-dialects-mysql-examples -sortorder: 500031001 +sortorder: 500031002 toc: False sidebartitle: sqlalchemy.dialects mysql meta: Python example code that shows how to use the mysql callable from the sqlalchemy.dialects module of the SQLAlchemy project. -mysql is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. +`mysql` is a callable within the `sqlalchemy.dialects` module of the SQLAlchemy project. +mssql, +oracle, +postgresql, +and sqlite +are several other callables with code examples from the same `sqlalchemy.dialects` package. ## Example 1 from marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown index 6e3dc5be1..9786f3422 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-oracle.markdown @@ -1,14 +1,19 @@ title: sqlalchemy.dialects oracle Example Code category: page slug: sqlalchemy-dialects-oracle-examples -sortorder: 500031002 +sortorder: 500031003 toc: False sidebartitle: sqlalchemy.dialects oracle meta: Python example code that shows how to use the oracle callable from the sqlalchemy.dialects module of the SQLAlchemy project. -oracle is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. +`oracle` is a callable within the `sqlalchemy.dialects` module of the SQLAlchemy project. +mssql, +mysql, +postgresql, +and sqlite +are several other callables with code examples from the same `sqlalchemy.dialects` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown index 01224ebec..1772e23a0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-array.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.dialects.postgresql ARRAY Example Code category: page slug: sqlalchemy-dialects-postgresql-array-examples -sortorder: 500031006 +sortorder: 500031007 toc: False sidebartitle: sqlalchemy.dialects.postgresql ARRAY meta: Python example code that shows how to use the ARRAY constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -ARRAY is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +`ARRAY` is a constant within the `sqlalchemy.dialects.postgresql` module of the SQLAlchemy project. +BIGINT, +BIT, +DOUBLE_PRECISION, +ExcludeConstraint, +INTEGER, +JSON, +TSVECTOR, +array, +json, +and pypostgresql +are several other callables with code examples from the same `sqlalchemy.dialects.postgresql` package. ## Example 1 from sqlacodegen [sqlacodegen](https://github.com/agronholm/sqlacodegen) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgcompiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgcompiler.markdown index 1e56dc2b5..5d36ff625 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgcompiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgcompiler.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.dialects.postgresql.base PGCompiler Example Code category: page slug: sqlalchemy-dialects-postgresql-base-pgcompiler-examples -sortorder: 500031015 +sortorder: 500031016 toc: False sidebartitle: sqlalchemy.dialects.postgresql.base PGCompiler meta: Example code for understanding how to use the PGCompiler class from the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. -PGCompiler is a class within the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. +`PGCompiler` is a class within the `sqlalchemy.dialects.postgresql.base` module of the SQLAlchemy project. +PGIdentifierPreparer +and +PGTypeCompiler +are a couple of other callables within the `sqlalchemy.dialects.postgresql.base` package that also have code examples. ## Example 1 from sqlalchemy-clickhouse [sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgidentifierpreparer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgidentifierpreparer.markdown index 9891bf628..80d538b96 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgidentifierpreparer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgidentifierpreparer.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.dialects.postgresql.base PGIdentifierPreparer Example Code category: page slug: sqlalchemy-dialects-postgresql-base-pgidentifierpreparer-examples -sortorder: 500031016 +sortorder: 500031017 toc: False sidebartitle: sqlalchemy.dialects.postgresql.base PGIdentifierPreparer meta: Example code for understanding how to use the PGIdentifierPreparer class from the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. -PGIdentifierPreparer is a class within the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. +`PGIdentifierPreparer` is a class within the `sqlalchemy.dialects.postgresql.base` module of the SQLAlchemy project. +PGCompiler +and +PGTypeCompiler +are a couple of other callables within the `sqlalchemy.dialects.postgresql.base` package that also have code examples. ## Example 1 from sqlalchemy-clickhouse [sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown index a86f52af2..406989729 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-base-pgtypecompiler.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.dialects.postgresql.base PGTypeCompiler Example Code category: page slug: sqlalchemy-dialects-postgresql-base-pgtypecompiler-examples -sortorder: 500031017 +sortorder: 500031018 toc: False sidebartitle: sqlalchemy.dialects.postgresql.base PGTypeCompiler meta: Example code for understanding how to use the PGTypeCompiler class from the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. -PGTypeCompiler is a class within the sqlalchemy.dialects.postgresql.base module of the SQLAlchemy project. +`PGTypeCompiler` is a class within the `sqlalchemy.dialects.postgresql.base` module of the SQLAlchemy project. +PGCompiler +and +PGIdentifierPreparer +are a couple of other callables within the `sqlalchemy.dialects.postgresql.base` package that also have code examples. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown index f6ca406f7..58ca37105 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bigint.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.dialects.postgresql BIGINT Example Code category: page slug: sqlalchemy-dialects-postgresql-bigint-examples -sortorder: 500031007 +sortorder: 500031008 toc: False sidebartitle: sqlalchemy.dialects.postgresql BIGINT meta: Python example code that shows how to use the BIGINT constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -BIGINT is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +`BIGINT` is a constant within the `sqlalchemy.dialects.postgresql` module of the SQLAlchemy project. +ARRAY, +BIT, +DOUBLE_PRECISION, +ExcludeConstraint, +INTEGER, +JSON, +TSVECTOR, +array, +json, +and pypostgresql +are several other callables with code examples from the same `sqlalchemy.dialects.postgresql` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown index c24bb7f98..b8181d37b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-bit.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.dialects.postgresql BIT Example Code category: page slug: sqlalchemy-dialects-postgresql-bit-examples -sortorder: 500031008 +sortorder: 500031009 toc: False sidebartitle: sqlalchemy.dialects.postgresql BIT meta: Python example code that shows how to use the BIT constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -BIT is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +`BIT` is a constant within the `sqlalchemy.dialects.postgresql` module of the SQLAlchemy project. +ARRAY, +BIGINT, +DOUBLE_PRECISION, +ExcludeConstraint, +INTEGER, +JSON, +TSVECTOR, +array, +json, +and pypostgresql +are several other callables with code examples from the same `sqlalchemy.dialects.postgresql` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown index 6d5a121e1..ce7288b95 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-double-precision.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.dialects.postgresql DOUBLE_PRECISION Example Code category: page slug: sqlalchemy-dialects-postgresql-double-precision-examples -sortorder: 500031009 +sortorder: 500031010 toc: False sidebartitle: sqlalchemy.dialects.postgresql DOUBLE_PRECISION meta: Python example code that shows how to use the DOUBLE_PRECISION constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -DOUBLE_PRECISION is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +`DOUBLE_PRECISION` is a constant within the `sqlalchemy.dialects.postgresql` module of the SQLAlchemy project. +ARRAY, +BIGINT, +BIT, +ExcludeConstraint, +INTEGER, +JSON, +TSVECTOR, +array, +json, +and pypostgresql +are several other callables with code examples from the same `sqlalchemy.dialects.postgresql` package. ## Example 1 from Amazon Redshift SQLAlchemy Dialect [Amazon Redshift SQLAlchemy Dialect](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown index b6237a3da..89b02571f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-excludeconstraint.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.dialects.postgresql ExcludeConstraint Example Code category: page slug: sqlalchemy-dialects-postgresql-excludeconstraint-examples -sortorder: 500031010 +sortorder: 500031011 toc: False sidebartitle: sqlalchemy.dialects.postgresql ExcludeConstraint meta: Example code for understanding how to use the ExcludeConstraint class from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -ExcludeConstraint is a class within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +`ExcludeConstraint` is a class within the `sqlalchemy.dialects.postgresql` module of the SQLAlchemy project. +ARRAY, +BIGINT, +BIT, +DOUBLE_PRECISION, +INTEGER, +JSON, +TSVECTOR, +array, +json, +and pypostgresql +are several other callables with code examples from the same `sqlalchemy.dialects.postgresql` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown index 244c0f4d8..0f16bc6c3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-integer.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.dialects.postgresql INTEGER Example Code category: page slug: sqlalchemy-dialects-postgresql-integer-examples -sortorder: 500031011 +sortorder: 500031012 toc: False sidebartitle: sqlalchemy.dialects.postgresql INTEGER meta: Python example code that shows how to use the INTEGER constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -INTEGER is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +`INTEGER` is a constant within the `sqlalchemy.dialects.postgresql` module of the SQLAlchemy project. +ARRAY, +BIGINT, +BIT, +DOUBLE_PRECISION, +ExcludeConstraint, +JSON, +TSVECTOR, +array, +json, +and pypostgresql +are several other callables with code examples from the same `sqlalchemy.dialects.postgresql` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown index 6baa29581..e171fe189 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-json.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.dialects.postgresql JSON Example Code category: page slug: sqlalchemy-dialects-postgresql-json-examples -sortorder: 500031012 +sortorder: 500031013 toc: False sidebartitle: sqlalchemy.dialects.postgresql JSON meta: Python example code that shows how to use the JSON constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -JSON is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +`JSON` is a constant within the `sqlalchemy.dialects.postgresql` module of the SQLAlchemy project. +ARRAY, +BIGINT, +BIT, +DOUBLE_PRECISION, +ExcludeConstraint, +INTEGER, +TSVECTOR, +array, +json, +and pypostgresql +are several other callables with code examples from the same `sqlalchemy.dialects.postgresql` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown index 5f9f7bb86..c7b88b433 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 Example Code category: page slug: sqlalchemy-dialects-postgresql-psycopg2-pgdialect-psycopg2-examples -sortorder: 500031018 +sortorder: 500031019 toc: False sidebartitle: sqlalchemy.dialects.postgresql.psycopg2 PGDialect_psycopg2 meta: Example code for understanding how to use the PGDialect_psycopg2 class from the sqlalchemy.dialects.postgresql.psycopg2 module of the SQLAlchemy project. -PGDialect_psycopg2 is a class within the sqlalchemy.dialects.postgresql.psycopg2 module of the SQLAlchemy project. +`PGDialect_psycopg2` is a class within the `sqlalchemy.dialects.postgresql.psycopg2` module of the SQLAlchemy project. + ## Example 1 from Amazon Redshift SQLAlchemy Dialect diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown index b87369a27..71afdb182 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-pypostgresql.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.dialects.postgresql pypostgresql Example Code category: page slug: sqlalchemy-dialects-postgresql-pypostgresql-examples -sortorder: 500031014 +sortorder: 500031015 toc: False sidebartitle: sqlalchemy.dialects.postgresql pypostgresql meta: Python example code that shows how to use the pypostgresql callable from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -pypostgresql is a callable within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +`pypostgresql` is a callable within the `sqlalchemy.dialects.postgresql` module of the SQLAlchemy project. +ARRAY, +BIGINT, +BIT, +DOUBLE_PRECISION, +ExcludeConstraint, +INTEGER, +JSON, +TSVECTOR, +array, +and json +are several other callables with code examples from the same `sqlalchemy.dialects.postgresql` package. ## Example 1 from databases [databases](https://github.com/encode/databases) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown index 568ea8a21..2dc2df510 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql-tsvector.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.dialects.postgresql TSVECTOR Example Code category: page slug: sqlalchemy-dialects-postgresql-tsvector-examples -sortorder: 500031013 +sortorder: 500031014 toc: False sidebartitle: sqlalchemy.dialects.postgresql TSVECTOR meta: Python example code that shows how to use the TSVECTOR constant from the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. -TSVECTOR is a constant within the sqlalchemy.dialects.postgresql module of the SQLAlchemy project. +`TSVECTOR` is a constant within the `sqlalchemy.dialects.postgresql` module of the SQLAlchemy project. +ARRAY, +BIGINT, +BIT, +DOUBLE_PRECISION, +ExcludeConstraint, +INTEGER, +JSON, +array, +json, +and pypostgresql +are several other callables with code examples from the same `sqlalchemy.dialects.postgresql` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown index 9b2103d1d..d6c77152a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-postgresql.markdown @@ -1,14 +1,19 @@ title: sqlalchemy.dialects postgresql Example Code category: page slug: sqlalchemy-dialects-postgresql-examples -sortorder: 500031003 +sortorder: 500031004 toc: False sidebartitle: sqlalchemy.dialects postgresql meta: Python example code that shows how to use the postgresql callable from the sqlalchemy.dialects module of the SQLAlchemy project. -postgresql is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. +`postgresql` is a callable within the `sqlalchemy.dialects` module of the SQLAlchemy project. +mssql, +mysql, +oracle, +and sqlite +are several other callables with code examples from the same `sqlalchemy.dialects` package. ## Example 1 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown index ca6a76ac7..409d3af6f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite-pysqlite.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.dialects.sqlite pysqlite Example Code category: page slug: sqlalchemy-dialects-sqlite-pysqlite-examples -sortorder: 500031019 +sortorder: 500031020 toc: False sidebartitle: sqlalchemy.dialects.sqlite pysqlite meta: Python example code that shows how to use the pysqlite callable from the sqlalchemy.dialects.sqlite module of the SQLAlchemy project. -pysqlite is a callable within the sqlalchemy.dialects.sqlite module of the SQLAlchemy project. +`pysqlite` is a callable within the `sqlalchemy.dialects.sqlite` module of the SQLAlchemy project. + ## Example 1 from databases diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown index 2f385a5b7..fc8b66dfa 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-dialects-sqlite.markdown @@ -1,14 +1,19 @@ title: sqlalchemy.dialects sqlite Example Code category: page slug: sqlalchemy-dialects-sqlite-examples -sortorder: 500031004 +sortorder: 500031005 toc: False sidebartitle: sqlalchemy.dialects sqlite meta: Python example code that shows how to use the sqlite callable from the sqlalchemy.dialects module of the SQLAlchemy project. -sqlite is a callable within the sqlalchemy.dialects module of the SQLAlchemy project. +`sqlite` is a callable within the `sqlalchemy.dialects` module of the SQLAlchemy project. +mssql, +mysql, +oracle, +and postgresql +are several other callables with code examples from the same `sqlalchemy.dialects` package. ## Example 1 from sqlalchemy-datatables [sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown index de0c2247f..16a6f8717 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-connection.markdown @@ -1,14 +1,19 @@ title: sqlalchemy.engine Connection Example Code category: page slug: sqlalchemy-engine-connection-examples -sortorder: 500031020 +sortorder: 500031021 toc: False sidebartitle: sqlalchemy.engine Connection meta: Example code for understanding how to use the Connection class from the sqlalchemy.engine module of the SQLAlchemy project. -Connection is a class within the sqlalchemy.engine module of the SQLAlchemy project. +`Connection` is a class within the `sqlalchemy.engine` module of the SQLAlchemy project. +Engine, +create_engine, +default, +and url +are several other callables with code examples from the same `sqlalchemy.engine` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown index e396cb4a0..e9c01dc95 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-create-engine.markdown @@ -1,16 +1,166 @@ title: sqlalchemy.engine create_engine Example Code category: page slug: sqlalchemy-engine-create-engine-examples -sortorder: 500031022 +sortorder: 500031023 toc: False sidebartitle: sqlalchemy.engine create_engine meta: Python example code that shows how to use the create_engine callable from the sqlalchemy.engine module of the SQLAlchemy project. -create_engine is a callable within the sqlalchemy.engine module of the SQLAlchemy project. +`create_engine` is a callable within the `sqlalchemy.engine` module of the SQLAlchemy project. +Connection, +Engine, +default, +and url +are several other callables with code examples from the same `sqlalchemy.engine` package. -## Example 1 from sqlacodegen +## Example 1 from PyHive +[PyHive](https://github.com/dropbox/PyHive) +([PyPI package information](https://pypi.org/project/PyHive/)) +is a set of [DB-API](https://www.python.org/dev/peps/pep-0249/) +and +[SQLAlchemy](/sqlalchemy.html) +interfaces that make it easier to use [Presto](https://prestodb.io/) +and [Apache Hive](http://hive.apache.org/) with Python. +[Dropbox's engineering team](https://www.dropbox.com/jobs/teams/engineering) +created this code library, open sourced it and put it out under +the [Apache 2.0 license](https://github.com/dropbox/PyHive/blob/master/LICENSE). + +[**PyHive / pyhive / tests / test_sqlalchemy_hive.py**](https://github.com/dropbox/PyHive/blob/master/pyhive/tests/test_sqlalchemy_hive.py) + +```python +# test_sqlalchemy_hive.py +from __future__ import absolute_import +from __future__ import unicode_literals +from builtins import str +from pyhive.sqlalchemy_hive import HiveDate +from pyhive.sqlalchemy_hive import HiveDecimal +from pyhive.sqlalchemy_hive import HiveTimestamp +from pyhive.tests.sqlalchemy_test_case import SqlAlchemyTestCase +from pyhive.tests.sqlalchemy_test_case import with_engine_connection +from sqlalchemy import types +~~from sqlalchemy.engine import create_engine +from sqlalchemy.schema import Column +from sqlalchemy.schema import MetaData +from sqlalchemy.schema import Table +import contextlib +import datetime +import decimal +import sqlalchemy.types +import unittest + +_ONE_ROW_COMPLEX_CONTENTS = [ + True, + 127, + 32767, + 2147483647, + 9223372036854775807, + 0.5, + 0.25, + 'a string', + datetime.datetime(1970, 1, 1), + b'123', + '[1,2]', + '{1:2,3:4}', + '{"a":1,"b":2}', + '{0:1}', + decimal.Decimal('0.1'), +] + + + + +class TestSqlAlchemyHive(unittest.TestCase, SqlAlchemyTestCase): +~~ def create_engine(self): +~~ return create_engine('hive://localhost:10000/default') + + @with_engine_connection + def test_dotted_column_names(self, engine, connection): + row = connection.execute('SELECT * FROM one_row').fetchone() + assert row.keys() == ['number_of_rows'] + assert 'number_of_rows' in row + assert row.number_of_rows == 1 + assert row['number_of_rows'] == 1 + assert getattr(row, 'one_row.number_of_rows') == 1 + assert row['one_row.number_of_rows'] == 1 + + @with_engine_connection + def test_dotted_column_names_raw(self, engine, connection): + row = connection.execution_options(hive_raw_colnames=True) \ + .execute('SELECT * FROM one_row').fetchone() + assert row.keys() == ['one_row.number_of_rows'] + assert 'number_of_rows' not in row + assert getattr(row, 'one_row.number_of_rows') == 1 + assert row['one_row.number_of_rows'] == 1 + + @with_engine_connection + def test_reflect_select(self, engine, connection): + one_row_complex = Table('one_row_complex', MetaData(bind=engine), autoload=True) + self.assertEqual(len(one_row_complex.c), 15) + + +## ... source file abbreviated to get to create_engine examples ... + + + self.assertIsInstance(one_row_complex.c.double.type, types.Float) + self.assertIsInstance(one_row_complex.c.string.type, types.String) + self.assertIsInstance(one_row_complex.c.timestamp.type, HiveTimestamp) + self.assertIsInstance(one_row_complex.c.binary.type, types.String) + self.assertIsInstance(one_row_complex.c.array.type, types.String) + self.assertIsInstance(one_row_complex.c.map.type, types.String) + self.assertIsInstance(one_row_complex.c.struct.type, types.String) + self.assertIsInstance(one_row_complex.c.union.type, types.String) + self.assertIsInstance(one_row_complex.c.decimal.type, HiveDecimal) + + @with_engine_connection + def test_type_map(self, engine, connection): + row = connection.execute('SELECT * FROM one_row_complex').fetchone() + self.assertListEqual(list(row), _ONE_ROW_COMPLEX_CONTENTS) + + @with_engine_connection + def test_reserved_words(self, engine, connection): + fake_table = Table('select', MetaData(bind=engine), Column('map', sqlalchemy.types.String)) + query = str(fake_table.select(fake_table.c.map == 'a')) + self.assertIn('`select`', query) + self.assertIn('`map`', query) + self.assertNotIn('"select"', query) + self.assertNotIn('"map"', query) + + def test_switch_database(self): +~~ engine = create_engine('hive://localhost:10000/pyhive_test_database') + try: + with contextlib.closing(engine.connect()) as connection: + self.assertIn( + ('dummy_table',), + connection.execute('SHOW TABLES').fetchall() + ) + connection.execute('USE default') + self.assertIn( + ('one_row',), + connection.execute('SHOW TABLES').fetchall() + ) + finally: + engine.dispose() + + @with_engine_connection + def test_lots_of_types(self, engine, connection): + types = [ + 'INT', 'CHAR', 'VARCHAR', 'NCHAR', 'TEXT', 'Text', 'FLOAT', + 'NUMERIC', 'DECIMAL', 'TIMESTAMP', 'DATETIME', 'CLOB', 'BLOB', + 'BOOLEAN', 'SMALLINT', 'DATE', 'TIME', + 'String', 'Integer', 'SmallInteger', + 'Numeric', 'Float', 'DateTime', 'Date', 'Time', 'LargeBinary', + 'Boolean', 'Unicode', 'UnicodeText', + ] + + +## ... source file continues with no further create_engine examples... + +``` + + +## Example 2 from sqlacodegen [sqlacodegen](https://github.com/agronholm/sqlacodegen) ([PyPI package information](https://pypi.org/project/sqlacodegen/)) is a tool for @@ -84,7 +234,7 @@ def main(): ``` -## Example 2 from sqlalchemy-clickhouse +## Example 3 from sqlalchemy-clickhouse [sqlalchemy-clickhouse](https://github.com/cloudflare/sqlalchemy-clickhouse) is a [SQLAlchemy Dialect](https://docs.sqlalchemy.org/en/13/dialects/) for communicating with the open source [ClickHouse](https://clickhouse.tech/) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown index 9bcc448f8..c34744b19 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default-defaultdialect.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.engine.default DefaultDialect Example Code category: page slug: sqlalchemy-engine-default-defaultdialect-examples -sortorder: 500031025 +sortorder: 500031026 toc: False sidebartitle: sqlalchemy.engine.default DefaultDialect meta: Example code for understanding how to use the DefaultDialect class from the sqlalchemy.engine.default module of the SQLAlchemy project. -DefaultDialect is a class within the sqlalchemy.engine.default module of the SQLAlchemy project. +`DefaultDialect` is a class within the `sqlalchemy.engine.default` module of the SQLAlchemy project. + ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown index 54fbae7d4..ad195a668 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-default.markdown @@ -1,14 +1,19 @@ title: sqlalchemy.engine default Example Code category: page slug: sqlalchemy-engine-default-examples -sortorder: 500031023 +sortorder: 500031024 toc: False sidebartitle: sqlalchemy.engine default meta: Python example code that shows how to use the default callable from the sqlalchemy.engine module of the SQLAlchemy project. -default is a callable within the sqlalchemy.engine module of the SQLAlchemy project. +`default` is a callable within the `sqlalchemy.engine` module of the SQLAlchemy project. +Connection, +Engine, +create_engine, +and url +are several other callables with code examples from the same `sqlalchemy.engine` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown index 8c58d9f87..67ded2f74 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown @@ -1,14 +1,19 @@ title: sqlalchemy.engine Engine Example Code category: page slug: sqlalchemy-engine-engine-examples -sortorder: 500031021 +sortorder: 500031022 toc: False sidebartitle: sqlalchemy.engine Engine meta: Example code for understanding how to use the Engine class from the sqlalchemy.engine module of the SQLAlchemy project. -Engine is a class within the sqlalchemy.engine module of the SQLAlchemy project. +`Engine` is a class within the `sqlalchemy.engine` module of the SQLAlchemy project. +Connection, +create_engine, +default, +and url +are several other callables with code examples from the same `sqlalchemy.engine` package. ## Example 1 from CTFd [CTFd](https://github.com/CTFd/CTFd) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown index a72ddfe2e..ac853930f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-interfaces-executioncontext.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.engine.interfaces ExecutionContext Example Code category: page slug: sqlalchemy-engine-interfaces-executioncontext-examples -sortorder: 500031026 +sortorder: 500031027 toc: False sidebartitle: sqlalchemy.engine.interfaces ExecutionContext meta: Example code for understanding how to use the ExecutionContext class from the sqlalchemy.engine.interfaces module of the SQLAlchemy project. -ExecutionContext is a class within the sqlalchemy.engine.interfaces module of the SQLAlchemy project. +`ExecutionContext` is a class within the `sqlalchemy.engine.interfaces` module of the SQLAlchemy project. + ## Example 1 from databases diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown index b9c859170..891d771ec 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-resultmetadata.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.engine.result ResultMetaData Example Code category: page slug: sqlalchemy-engine-result-resultmetadata-examples -sortorder: 500031027 +sortorder: 500031028 toc: False sidebartitle: sqlalchemy.engine.result ResultMetaData meta: Example code for understanding how to use the ResultMetaData class from the sqlalchemy.engine.result module of the SQLAlchemy project. -ResultMetaData is a class within the sqlalchemy.engine.result module of the SQLAlchemy project. +`ResultMetaData` is a class within the `sqlalchemy.engine.result` module of the SQLAlchemy project. +RowProxy +is another callable from the `sqlalchemy.engine.result` package with code examples. ## Example 1 from databases [databases](https://github.com/encode/databases) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown index e793308a3..03c84372a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-result-rowproxy.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.engine.result RowProxy Example Code category: page slug: sqlalchemy-engine-result-rowproxy-examples -sortorder: 500031028 +sortorder: 500031029 toc: False sidebartitle: sqlalchemy.engine.result RowProxy meta: Example code for understanding how to use the RowProxy class from the sqlalchemy.engine.result module of the SQLAlchemy project. -RowProxy is a class within the sqlalchemy.engine.result module of the SQLAlchemy project. +`RowProxy` is a class within the `sqlalchemy.engine.result` module of the SQLAlchemy project. +ResultMetaData +is another callable from the `sqlalchemy.engine.result` package with code examples. ## Example 1 from databases [databases](https://github.com/encode/databases) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown index 30e3bc748..5453f8ae0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-enginestrategy.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.engine.strategies EngineStrategy Example Code category: page slug: sqlalchemy-engine-strategies-enginestrategy-examples -sortorder: 500031029 +sortorder: 500031030 toc: False sidebartitle: sqlalchemy.engine.strategies EngineStrategy meta: Example code for understanding how to use the EngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. -EngineStrategy is a class within the sqlalchemy.engine.strategies module of the SQLAlchemy project. +`EngineStrategy` is a class within the `sqlalchemy.engine.strategies` module of the SQLAlchemy project. +MockEngineStrategy +is another callable from the `sqlalchemy.engine.strategies` package with code examples. ## Example 1 from GINO [GINO](https://github.com/fantix/gino) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown index 264cea593..c77a9c45a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-strategies-mockenginestrategy.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.engine.strategies MockEngineStrategy Example Code category: page slug: sqlalchemy-engine-strategies-mockenginestrategy-examples -sortorder: 500031030 +sortorder: 500031031 toc: False sidebartitle: sqlalchemy.engine.strategies MockEngineStrategy meta: Example code for understanding how to use the MockEngineStrategy class from the sqlalchemy.engine.strategies module of the SQLAlchemy project. -MockEngineStrategy is a class within the sqlalchemy.engine.strategies module of the SQLAlchemy project. +`MockEngineStrategy` is a class within the `sqlalchemy.engine.strategies` module of the SQLAlchemy project. +EngineStrategy +is another callable from the `sqlalchemy.engine.strategies` package with code examples. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown index b01b0801d..b6f1e3f2e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.engine.url make_url Example Code category: page slug: sqlalchemy-engine-url-make-url-examples -sortorder: 500031031 +sortorder: 500031032 toc: False sidebartitle: sqlalchemy.engine.url make_url meta: Python example code that shows how to use the make_url callable from the sqlalchemy.engine.url module of the SQLAlchemy project. -make_url is a callable within the sqlalchemy.engine.url module of the SQLAlchemy project. +`make_url` is a callable within the `sqlalchemy.engine.url` module of the SQLAlchemy project. + ## Example 1 from CTFd diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown index c20f68c59..01147201f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url.markdown @@ -1,14 +1,19 @@ title: sqlalchemy.engine url Example Code category: page slug: sqlalchemy-engine-url-examples -sortorder: 500031024 +sortorder: 500031025 toc: False sidebartitle: sqlalchemy.engine url meta: Python example code that shows how to use the url callable from the sqlalchemy.engine module of the SQLAlchemy project. -url is a callable within the sqlalchemy.engine module of the SQLAlchemy project. +`url` is a callable within the `sqlalchemy.engine` module of the SQLAlchemy project. +Connection, +Engine, +create_engine, +and default +are several other callables with code examples from the same `sqlalchemy.engine` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown index 75a4f2bb9..89499101a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-events-schemaeventtarget.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.events SchemaEventTarget Example Code category: page slug: sqlalchemy-events-schemaeventtarget-examples -sortorder: 500031032 +sortorder: 500031033 toc: False sidebartitle: sqlalchemy.events SchemaEventTarget meta: Example code for understanding how to use the SchemaEventTarget class from the sqlalchemy.events module of the SQLAlchemy project. -SchemaEventTarget is a class within the sqlalchemy.events module of the SQLAlchemy project. +`SchemaEventTarget` is a class within the `sqlalchemy.events` module of the SQLAlchemy project. + ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown index 564720f99..878c1654a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown @@ -1,14 +1,23 @@ title: sqlalchemy.exc ArgumentError Example Code category: page slug: sqlalchemy-exc-argumenterror-examples -sortorder: 500031033 +sortorder: 500031034 toc: False sidebartitle: sqlalchemy.exc ArgumentError meta: Example code for understanding how to use the ArgumentError class from the sqlalchemy.exc module of the SQLAlchemy project. -ArgumentError is a class within the sqlalchemy.exc module of the SQLAlchemy project. +`ArgumentError` is a class within the `sqlalchemy.exc` module of the SQLAlchemy project. +DataError, +DatabaseError, +IntegrityError, +InvalidRequestError, +NoInspectionAvailable, +NoSuchTableError, +OperationalError, +and ProgrammingError +are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown index 034e275dc..9bd73bae9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown @@ -1,14 +1,23 @@ title: sqlalchemy.exc DatabaseError Example Code category: page slug: sqlalchemy-exc-databaseerror-examples -sortorder: 500031035 +sortorder: 500031036 toc: False sidebartitle: sqlalchemy.exc DatabaseError meta: Example code for understanding how to use the DatabaseError class from the sqlalchemy.exc module of the SQLAlchemy project. -DatabaseError is a class within the sqlalchemy.exc module of the SQLAlchemy project. +`DatabaseError` is a class within the `sqlalchemy.exc` module of the SQLAlchemy project. +ArgumentError, +DataError, +IntegrityError, +InvalidRequestError, +NoInspectionAvailable, +NoSuchTableError, +OperationalError, +and ProgrammingError +are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown index 692819820..6e55600e6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown @@ -1,14 +1,23 @@ title: sqlalchemy.exc DataError Example Code category: page slug: sqlalchemy-exc-dataerror-examples -sortorder: 500031034 +sortorder: 500031035 toc: False sidebartitle: sqlalchemy.exc DataError meta: Example code for understanding how to use the DataError class from the sqlalchemy.exc module of the SQLAlchemy project. -DataError is a class within the sqlalchemy.exc module of the SQLAlchemy project. +`DataError` is a class within the `sqlalchemy.exc` module of the SQLAlchemy project. +ArgumentError, +DatabaseError, +IntegrityError, +InvalidRequestError, +NoInspectionAvailable, +NoSuchTableError, +OperationalError, +and ProgrammingError +are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown index 46b862797..c30ab4837 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown @@ -1,14 +1,23 @@ title: sqlalchemy.exc IntegrityError Example Code category: page slug: sqlalchemy-exc-integrityerror-examples -sortorder: 500031036 +sortorder: 500031037 toc: False sidebartitle: sqlalchemy.exc IntegrityError meta: Example code for understanding how to use the IntegrityError class from the sqlalchemy.exc module of the SQLAlchemy project. -IntegrityError is a class within the sqlalchemy.exc module of the SQLAlchemy project. +`IntegrityError` is a class within the `sqlalchemy.exc` module of the SQLAlchemy project. +ArgumentError, +DataError, +DatabaseError, +InvalidRequestError, +NoInspectionAvailable, +NoSuchTableError, +OperationalError, +and ProgrammingError +are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from CTFd [CTFd](https://github.com/CTFd/CTFd) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown index 5b779f838..bb5022035 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown @@ -1,14 +1,23 @@ title: sqlalchemy.exc InvalidRequestError Example Code category: page slug: sqlalchemy-exc-invalidrequesterror-examples -sortorder: 500031037 +sortorder: 500031038 toc: False sidebartitle: sqlalchemy.exc InvalidRequestError meta: Example code for understanding how to use the InvalidRequestError class from the sqlalchemy.exc module of the SQLAlchemy project. -InvalidRequestError is a class within the sqlalchemy.exc module of the SQLAlchemy project. +`InvalidRequestError` is a class within the `sqlalchemy.exc` module of the SQLAlchemy project. +ArgumentError, +DataError, +DatabaseError, +IntegrityError, +NoInspectionAvailable, +NoSuchTableError, +OperationalError, +and ProgrammingError +are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from GINO [GINO](https://github.com/fantix/gino) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown index 83ad32b6b..64036057b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown @@ -1,14 +1,23 @@ title: sqlalchemy.exc NoInspectionAvailable Example Code category: page slug: sqlalchemy-exc-noinspectionavailable-examples -sortorder: 500031038 +sortorder: 500031039 toc: False sidebartitle: sqlalchemy.exc NoInspectionAvailable meta: Example code for understanding how to use the NoInspectionAvailable class from the sqlalchemy.exc module of the SQLAlchemy project. -NoInspectionAvailable is a class within the sqlalchemy.exc module of the SQLAlchemy project. +`NoInspectionAvailable` is a class within the `sqlalchemy.exc` module of the SQLAlchemy project. +ArgumentError, +DataError, +DatabaseError, +IntegrityError, +InvalidRequestError, +NoSuchTableError, +OperationalError, +and ProgrammingError +are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-nosuchtableerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-nosuchtableerror.markdown new file mode 100644 index 000000000..7b8831bf1 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-nosuchtableerror.markdown @@ -0,0 +1,79 @@ +title: sqlalchemy.exc NoSuchTableError Example Code +category: page +slug: sqlalchemy-exc-nosuchtableerror-examples +sortorder: 500031040 +toc: False +sidebartitle: sqlalchemy.exc NoSuchTableError +meta: Example code for understanding how to use the NoSuchTableError class from the sqlalchemy.exc module of the SQLAlchemy project. + + +`NoSuchTableError` is a class within the `sqlalchemy.exc` module of the SQLAlchemy project. + +ArgumentError, +DataError, +DatabaseError, +IntegrityError, +InvalidRequestError, +NoInspectionAvailable, +OperationalError, +and ProgrammingError +are several other callables with code examples from the same `sqlalchemy.exc` package. + +## Example 1 from PyHive +[PyHive](https://github.com/dropbox/PyHive) +([PyPI package information](https://pypi.org/project/PyHive/)) +is a set of [DB-API](https://www.python.org/dev/peps/pep-0249/) +and +[SQLAlchemy](/sqlalchemy.html) +interfaces that make it easier to use [Presto](https://prestodb.io/) +and [Apache Hive](http://hive.apache.org/) with Python. +[Dropbox's engineering team](https://www.dropbox.com/jobs/teams/engineering) +created this code library, open sourced it and put it out under +the [Apache 2.0 license](https://github.com/dropbox/PyHive/blob/master/LICENSE). + +[**PyHive / pyhive / tests / sqlalchemy_test_case.py**](https://github.com/dropbox/PyHive/blob/master/pyhive/tests/sqlalchemy_test_case.py) + +```python +# sqlalchemy_test_case.py +from __future__ import absolute_import +from __future__ import unicode_literals + +import abc +import contextlib +import functools + +import pytest +import sqlalchemy +from builtins import object +from future.utils import with_metaclass +~~from sqlalchemy.exc import NoSuchTableError +from sqlalchemy.schema import Index +from sqlalchemy.schema import MetaData +from sqlalchemy.schema import Table +from sqlalchemy.sql import expression + + +def with_engine_connection(fn): + @functools.wraps(fn) + def wrapped_fn(self, *args, **kwargs): + engine = self.create_engine() + try: + with contextlib.closing(engine.connect()) as connection: + fn(self, engine, connection, *args, **kwargs) + finally: + engine.dispose() + return wrapped_fn + + +class SqlAlchemyTestCase(with_metaclass(abc.ABCMeta, object)): + @with_engine_connection + def test_basic_query(self, engine, connection): + rows = connection.execute('SELECT * FROM one_row').fetchall() + self.assertEqual(len(rows), 1) + self.assertEqual(rows[0].number_of_rows, 1) # number_of_rows is the column name + + +## ... source file continues with no further NoSuchTableError examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown index 1f008e756..45f349919 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown @@ -1,14 +1,23 @@ title: sqlalchemy.exc OperationalError Example Code category: page slug: sqlalchemy-exc-operationalerror-examples -sortorder: 500031039 +sortorder: 500031041 toc: False sidebartitle: sqlalchemy.exc OperationalError meta: Example code for understanding how to use the OperationalError class from the sqlalchemy.exc module of the SQLAlchemy project. -OperationalError is a class within the sqlalchemy.exc module of the SQLAlchemy project. +`OperationalError` is a class within the `sqlalchemy.exc` module of the SQLAlchemy project. +ArgumentError, +DataError, +DatabaseError, +IntegrityError, +InvalidRequestError, +NoInspectionAvailable, +NoSuchTableError, +and ProgrammingError +are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown index b3e07262a..a35802227 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown @@ -1,14 +1,23 @@ title: sqlalchemy.exc ProgrammingError Example Code category: page slug: sqlalchemy-exc-programmingerror-examples -sortorder: 500031040 +sortorder: 500031042 toc: False sidebartitle: sqlalchemy.exc ProgrammingError meta: Example code for understanding how to use the ProgrammingError class from the sqlalchemy.exc module of the SQLAlchemy project. -ProgrammingError is a class within the sqlalchemy.exc module of the SQLAlchemy project. +`ProgrammingError` is a class within the `sqlalchemy.exc` module of the SQLAlchemy project. +ArgumentError, +DataError, +DatabaseError, +IntegrityError, +InvalidRequestError, +NoInspectionAvailable, +NoSuchTableError, +and OperationalError +are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown index 78c9da3ae..0be48def5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.ext.automap automap_base Example Code category: page slug: sqlalchemy-ext-automap-automap-base-examples -sortorder: 500031042 +sortorder: 500031044 toc: False sidebartitle: sqlalchemy.ext.automap automap_base meta: Python example code that shows how to use the automap_base callable from the sqlalchemy.ext.automap module of the SQLAlchemy project. -automap_base is a callable within the sqlalchemy.ext.automap module of the SQLAlchemy project. +`automap_base` is a callable within the `sqlalchemy.ext.automap` module of the SQLAlchemy project. + ## Example 1 from sandman2 diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown index 61c7a8c77..442398079 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.ext.compiler compiles Example Code category: page slug: sqlalchemy-ext-compiler-compiles-examples -sortorder: 500031043 +sortorder: 500031045 toc: False sidebartitle: sqlalchemy.ext.compiler compiles meta: Python example code that shows how to use the compiles callable from the sqlalchemy.ext.compiler module of the SQLAlchemy project. -compiles is a callable within the sqlalchemy.ext.compiler module of the SQLAlchemy project. +`compiles` is a callable within the `sqlalchemy.ext.compiler` module of the SQLAlchemy project. + ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown index 4c19129ba..79cdf7cb5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.ext compiler Example Code category: page slug: sqlalchemy-ext-compiler-examples -sortorder: 500031041 +sortorder: 500031043 toc: False sidebartitle: sqlalchemy.ext compiler meta: Python example code that shows how to use the compiler callable from the sqlalchemy.ext module of the SQLAlchemy project. -compiler is a callable within the sqlalchemy.ext module of the SQLAlchemy project. +`compiler` is a callable within the `sqlalchemy.ext` module of the SQLAlchemy project. + ## Example 1 from Amazon Redshift SQLAlchemy Dialect diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown index f5a2dd30e..d1c530f9f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.ext.declarative declarative_base Example Code category: page slug: sqlalchemy-ext-declarative-declarative-base-examples -sortorder: 500031045 +sortorder: 500031047 toc: False sidebartitle: sqlalchemy.ext.declarative declarative_base meta: Python example code that shows how to use the declarative_base callable from the sqlalchemy.ext.declarative module of the SQLAlchemy project. -declarative_base is a callable within the sqlalchemy.ext.declarative module of the SQLAlchemy project. +`declarative_base` is a callable within the `sqlalchemy.ext.declarative` module of the SQLAlchemy project. +DeclarativeMeta +is another callable from the `sqlalchemy.ext.declarative` package with code examples. ## Example 1 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown index 11fa38036..b6c497d37 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.ext.declarative DeclarativeMeta Example Code category: page slug: sqlalchemy-ext-declarative-declarativemeta-examples -sortorder: 500031044 +sortorder: 500031046 toc: False sidebartitle: sqlalchemy.ext.declarative DeclarativeMeta meta: Example code for understanding how to use the DeclarativeMeta class from the sqlalchemy.ext.declarative module of the SQLAlchemy project. -DeclarativeMeta is a class within the sqlalchemy.ext.declarative module of the SQLAlchemy project. +`DeclarativeMeta` is a class within the `sqlalchemy.ext.declarative` module of the SQLAlchemy project. +declarative_base +is another callable from the `sqlalchemy.ext.declarative` package with code examples. ## Example 1 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown index 217aa5483..393952673 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.ext.hybrid hybrid_method Example Code category: page slug: sqlalchemy-ext-hybrid-hybrid-method-examples -sortorder: 500031046 +sortorder: 500031048 toc: False sidebartitle: sqlalchemy.ext.hybrid hybrid_method meta: Python example code that shows how to use the hybrid_method callable from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. -hybrid_method is a callable within the sqlalchemy.ext.hybrid module of the SQLAlchemy project. +`hybrid_method` is a callable within the `sqlalchemy.ext.hybrid` module of the SQLAlchemy project. +HYBRID_PROPERTY, +hybrid_method, +and hybrid_property +are several other callables with code examples from the same `sqlalchemy.ext.hybrid` package. ## Example 1 from SQLAlchemy Mixins [SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown index fd0dc1afc..3c3e6a59a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.ext.hybrid hybrid_property Example Code category: page slug: sqlalchemy-ext-hybrid-hybrid-property-examples -sortorder: 500031047 +sortorder: 500031049 toc: False sidebartitle: sqlalchemy.ext.hybrid hybrid_property meta: Python example code that shows how to use the hybrid_property callable from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. -hybrid_property is a callable within the sqlalchemy.ext.hybrid module of the SQLAlchemy project. +`hybrid_property` is a callable within the `sqlalchemy.ext.hybrid` module of the SQLAlchemy project. +HYBRID_METHOD, +hybrid_method, +and hybrid_property +are several other callables with code examples from the same `sqlalchemy.ext.hybrid` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown index 6ecfaf214..6e5ed8c1e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.ext.mutable Mutable Example Code category: page slug: sqlalchemy-ext-mutable-mutable-examples -sortorder: 500031048 +sortorder: 500031050 toc: False sidebartitle: sqlalchemy.ext.mutable Mutable meta: Example code for understanding how to use the Mutable class from the sqlalchemy.ext.mutable module of the SQLAlchemy project. -Mutable is a class within the sqlalchemy.ext.mutable module of the SQLAlchemy project. +`Mutable` is a class within the `sqlalchemy.ext.mutable` module of the SQLAlchemy project. + ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index 65d13d9a1..e0de6d880 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -125,6 +125,19 @@ The marshmallow-sqlalchemy project is provided as open source under the [MIT license](https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/dev/LICENSE). +### PyHive +[PyHive](https://github.com/dropbox/PyHive) +([PyPI package information](https://pypi.org/project/PyHive/)) +is a set of [DB-API](https://www.python.org/dev/peps/pep-0249/) +and +[SQLAlchemy](/sqlalchemy.html) +interfaces that make it easier to use [Presto](https://prestodb.io/) +and [Apache Hive](http://hive.apache.org/) with Python. +[Dropbox's engineering team](https://www.dropbox.com/jobs/teams/engineering) +created this code library, open sourced it and put it out under +the [Apache 2.0 license](https://github.com/dropbox/PyHive/blob/master/LICENSE). + + ### sqlacodegen [sqlacodegen](https://github.com/agronholm/sqlacodegen) ([PyPI package information](https://pypi.org/project/sqlacodegen/)) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown index 75b4f84c8..2b197ae44 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.inspection inspect Example Code category: page slug: sqlalchemy-inspection-inspect-examples -sortorder: 500031049 +sortorder: 500031051 toc: False sidebartitle: sqlalchemy.inspection inspect meta: Python example code that shows how to use the inspect callable from the sqlalchemy.inspection module of the SQLAlchemy project. -inspect is a callable within the sqlalchemy.inspection module of the SQLAlchemy project. +`inspect` is a callable within the `sqlalchemy.inspection` module of the SQLAlchemy project. + ## Example 1 from graphene-sqlalchemy diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown index d8349fdee..a3d42007b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm aliased Example Code category: page slug: sqlalchemy-orm-aliased-examples -sortorder: 500031056 +sortorder: 500031058 toc: False sidebartitle: sqlalchemy.orm aliased meta: Python example code that shows how to use the aliased callable from the sqlalchemy.orm module of the SQLAlchemy project. -aliased is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`aliased` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from SQLAlchemy Mixins [SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown index 11dfa0af4..2f4448de6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.orm.attributes flag_modified Example Code category: page slug: sqlalchemy-orm-attributes-flag-modified-examples -sortorder: 500031072 +sortorder: 500031074 toc: False sidebartitle: sqlalchemy.orm.attributes flag_modified meta: Python example code that shows how to use the flag_modified callable from the sqlalchemy.orm.attributes module of the SQLAlchemy project. -flag_modified is a callable within the sqlalchemy.orm.attributes module of the SQLAlchemy project. +`flag_modified` is a callable within the `sqlalchemy.orm.attributes` module of the SQLAlchemy project. +InstrumentedAttribute +is another callable from the `sqlalchemy.orm.attributes` package with code examples. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown index 46b22a0a2..989d5ceba 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.orm.attributes InstrumentedAttribute Example Code category: page slug: sqlalchemy-orm-attributes-instrumentedattribute-examples -sortorder: 500031071 +sortorder: 500031073 toc: False sidebartitle: sqlalchemy.orm.attributes InstrumentedAttribute meta: Example code for understanding how to use the InstrumentedAttribute class from the sqlalchemy.orm.attributes module of the SQLAlchemy project. -InstrumentedAttribute is a class within the sqlalchemy.orm.attributes module of the SQLAlchemy project. +`InstrumentedAttribute` is a class within the `sqlalchemy.orm.attributes` module of the SQLAlchemy project. +flag_modified +is another callable from the `sqlalchemy.orm.attributes` package with code examples. ## Example 1 from SQLAlchemy Mixins [SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown index 19ca41d81..2fd008e1b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm attributes Example Code category: page slug: sqlalchemy-orm-attributes-examples -sortorder: 500031057 +sortorder: 500031059 toc: False sidebartitle: sqlalchemy.orm attributes meta: Python example code that shows how to use the attributes callable from the sqlalchemy.orm module of the SQLAlchemy project. -attributes is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`attributes` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown index cc45d0e5c..b13863457 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm backref Example Code category: page slug: sqlalchemy-orm-backref-examples -sortorder: 500031058 +sortorder: 500031060 toc: False sidebartitle: sqlalchemy.orm backref meta: Python example code that shows how to use the backref callable from the sqlalchemy.orm module of the SQLAlchemy project. -backref is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`backref` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from sqlalchemy-datatables [sqlalchemy-datatables](https://github.com/Pegase745/sqlalchemy-datatables) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown index db6910814..5f31b5474 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm class_mapper Example Code category: page slug: sqlalchemy-orm-class-mapper-examples -sortorder: 500031059 +sortorder: 500031061 toc: False sidebartitle: sqlalchemy.orm class_mapper meta: Python example code that shows how to use the class_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. -class_mapper is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`class_mapper` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown index 0a09dbc6b..4c5dd2a8a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.orm.collections InstrumentedList Example Code category: page slug: sqlalchemy-orm-collections-instrumentedlist-examples -sortorder: 500031073 +sortorder: 500031075 toc: False sidebartitle: sqlalchemy.orm.collections InstrumentedList meta: Example code for understanding how to use the InstrumentedList class from the sqlalchemy.orm.collections module of the SQLAlchemy project. -InstrumentedList is a class within the sqlalchemy.orm.collections module of the SQLAlchemy project. +`InstrumentedList` is a class within the `sqlalchemy.orm.collections` module of the SQLAlchemy project. + ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown index 2bb0f42f9..8057afd94 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm column_property Example Code category: page slug: sqlalchemy-orm-column-property-examples -sortorder: 500031060 +sortorder: 500031062 toc: False sidebartitle: sqlalchemy.orm column_property meta: Python example code that shows how to use the column_property callable from the sqlalchemy.orm module of the SQLAlchemy project. -column_property is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`column_property` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown index 26e5478c8..e4a0c98df 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm ColumnProperty Example Code category: page slug: sqlalchemy-orm-columnproperty-examples -sortorder: 500031050 +sortorder: 500031052 toc: False sidebartitle: sqlalchemy.orm ColumnProperty meta: Example code for understanding how to use the ColumnProperty class from the sqlalchemy.orm module of the SQLAlchemy project. -ColumnProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. - +`ColumnProperty` is a class within the `sqlalchemy.orm` module of the SQLAlchemy project. + +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown index e3364b07f..3a9cf6a7d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm composite Example Code category: page slug: sqlalchemy-orm-composite-examples -sortorder: 500031061 +sortorder: 500031063 toc: False sidebartitle: sqlalchemy.orm composite meta: Python example code that shows how to use the composite callable from the sqlalchemy.orm module of the SQLAlchemy project. -composite is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`composite` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown index f52b468b4..896e7b00e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm CompositeProperty Example Code category: page slug: sqlalchemy-orm-compositeproperty-examples -sortorder: 500031051 +sortorder: 500031053 toc: False sidebartitle: sqlalchemy.orm CompositeProperty meta: Example code for understanding how to use the CompositeProperty class from the sqlalchemy.orm module of the SQLAlchemy project. -CompositeProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. - +`CompositeProperty` is a class within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown index 83693c201..3a0633a1d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.orm.exc NoResultFound Example Code category: page slug: sqlalchemy-orm-exc-noresultfound-examples -sortorder: 500031074 +sortorder: 500031076 toc: False sidebartitle: sqlalchemy.orm.exc NoResultFound meta: Example code for understanding how to use the NoResultFound class from the sqlalchemy.orm.exc module of the SQLAlchemy project. -NoResultFound is a class within the sqlalchemy.orm.exc module of the SQLAlchemy project. +`NoResultFound` is a class within the `sqlalchemy.orm.exc` module of the SQLAlchemy project. +UnmappedClassError +and +UnmappedInstanceError +are a couple of other callables within the `sqlalchemy.orm.exc` package that also have code examples. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown index 7e6ee5610..df4f4889e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.orm.exc UnmappedClassError Example Code category: page slug: sqlalchemy-orm-exc-unmappedclasserror-examples -sortorder: 500031075 +sortorder: 500031077 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedClassError meta: Example code for understanding how to use the UnmappedClassError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. -UnmappedClassError is a class within the sqlalchemy.orm.exc module of the SQLAlchemy project. +`UnmappedClassError` is a class within the `sqlalchemy.orm.exc` module of the SQLAlchemy project. +NoResultFound +and +UnmappedInstanceError +are a couple of other callables within the `sqlalchemy.orm.exc` package that also have code examples. ## Example 1 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown index 4d6ac716e..d5cadf45f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.orm.exc UnmappedInstanceError Example Code category: page slug: sqlalchemy-orm-exc-unmappedinstanceerror-examples -sortorder: 500031076 +sortorder: 500031078 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedInstanceError meta: Example code for understanding how to use the UnmappedInstanceError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. -UnmappedInstanceError is a class within the sqlalchemy.orm.exc module of the SQLAlchemy project. +`UnmappedInstanceError` is a class within the `sqlalchemy.orm.exc` module of the SQLAlchemy project. +NoResultFound +and +UnmappedClassError +are a couple of other callables within the `sqlalchemy.orm.exc` package that also have code examples. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown index e9cb958c7..bab3cdad8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.orm.interfaces MapperProperty Example Code category: page slug: sqlalchemy-orm-interfaces-mapperproperty-examples -sortorder: 500031077 +sortorder: 500031079 toc: False sidebartitle: sqlalchemy.orm.interfaces MapperProperty meta: Example code for understanding how to use the MapperProperty class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. -MapperProperty is a class within the sqlalchemy.orm.interfaces module of the SQLAlchemy project. +`MapperProperty` is a class within the `sqlalchemy.orm.interfaces` module of the SQLAlchemy project. +PropComparator +is another callable from the `sqlalchemy.orm.interfaces` package with code examples. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown index c1cc40dfa..540e90bb3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.orm.interfaces PropComparator Example Code category: page slug: sqlalchemy-orm-interfaces-propcomparator-examples -sortorder: 500031078 +sortorder: 500031080 toc: False sidebartitle: sqlalchemy.orm.interfaces PropComparator meta: Example code for understanding how to use the PropComparator class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. -PropComparator is a class within the sqlalchemy.orm.interfaces module of the SQLAlchemy project. +`PropComparator` is a class within the `sqlalchemy.orm.interfaces` module of the SQLAlchemy project. +MapperProperty +is another callable from the `sqlalchemy.orm.interfaces` package with code examples. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown index 7873e2895..9d2fe6d85 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm interfaces Example Code category: page slug: sqlalchemy-orm-interfaces-examples -sortorder: 500031062 +sortorder: 500031064 toc: False sidebartitle: sqlalchemy.orm interfaces meta: Python example code that shows how to use the interfaces callable from the sqlalchemy.orm module of the SQLAlchemy project. -interfaces is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`interfaces` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown index 9057c59aa..08770b09a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm mapper Example Code category: page slug: sqlalchemy-orm-mapper-examples -sortorder: 500031063 +sortorder: 500031065 toc: False sidebartitle: sqlalchemy.orm mapper meta: Python example code that shows how to use the mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. -mapper is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`mapper` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown index 2b1359469..70597d69a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm mapperlib Example Code category: page slug: sqlalchemy-orm-mapperlib-examples -sortorder: 500031064 +sortorder: 500031066 toc: False sidebartitle: sqlalchemy.orm mapperlib meta: Python example code that shows how to use the mapperlib callable from the sqlalchemy.orm module of the SQLAlchemy project. -mapperlib is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`mapperlib` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown index 029efb31d..29e854885 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm object_mapper Example Code category: page slug: sqlalchemy-orm-object-mapper-examples -sortorder: 500031065 +sortorder: 500031067 toc: False sidebartitle: sqlalchemy.orm object_mapper meta: Python example code that shows how to use the object_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. -object_mapper is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`object_mapper` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown index ff20dee9a..eeb1d69c7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm object_session Example Code category: page slug: sqlalchemy-orm-object-session-examples -sortorder: 500031066 +sortorder: 500031068 toc: False sidebartitle: sqlalchemy.orm object_session meta: Python example code that shows how to use the object_session callable from the sqlalchemy.orm module of the SQLAlchemy project. -object_session is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`object_session` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown index 9974099bb..dc989d992 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.orm.properties ColumnProperty Example Code category: page slug: sqlalchemy-orm-properties-columnproperty-examples -sortorder: 500031079 +sortorder: 500031081 toc: False sidebartitle: sqlalchemy.orm.properties ColumnProperty meta: Example code for understanding how to use the ColumnProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. -ColumnProperty is a class within the sqlalchemy.orm.properties module of the SQLAlchemy project. +`ColumnProperty` is a class within the `sqlalchemy.orm.properties` module of the SQLAlchemy project. +RelationshipProperty +is another callable from the `sqlalchemy.orm.properties` package with code examples. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown index 9f508bf10..b1220efe5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.orm.properties RelationshipProperty Example Code category: page slug: sqlalchemy-orm-properties-relationshipproperty-examples -sortorder: 500031080 +sortorder: 500031082 toc: False sidebartitle: sqlalchemy.orm.properties RelationshipProperty meta: Example code for understanding how to use the RelationshipProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. -RelationshipProperty is a class within the sqlalchemy.orm.properties module of the SQLAlchemy project. +`RelationshipProperty` is a class within the `sqlalchemy.orm.properties` module of the SQLAlchemy project. +ColumnProperty +is another callable from the `sqlalchemy.orm.properties` package with code examples. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown index 1e3987973..342889cea 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.orm.query Query Example Code category: page slug: sqlalchemy-orm-query-query-examples -sortorder: 500031081 +sortorder: 500031083 toc: False sidebartitle: sqlalchemy.orm.query Query meta: Example code for understanding how to use the Query class from the sqlalchemy.orm.query module of the SQLAlchemy project. -Query is a class within the sqlalchemy.orm.query module of the SQLAlchemy project. +`Query` is a class within the `sqlalchemy.orm.query` module of the SQLAlchemy project. +QueryContext +is another callable from the `sqlalchemy.orm.query` package with code examples. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown index ab9834b01..06476bcd8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.orm.query QueryContext Example Code category: page slug: sqlalchemy-orm-query-querycontext-examples -sortorder: 500031082 +sortorder: 500031084 toc: False sidebartitle: sqlalchemy.orm.query QueryContext meta: Example code for understanding how to use the QueryContext class from the sqlalchemy.orm.query module of the SQLAlchemy project. -QueryContext is a class within the sqlalchemy.orm.query module of the SQLAlchemy project. +`QueryContext` is a class within the `sqlalchemy.orm.query` module of the SQLAlchemy project. +Query +is another callable from the `sqlalchemy.orm.query` package with code examples. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown index 1628bd037..dac8a7696 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm Query Example Code category: page slug: sqlalchemy-orm-query-examples -sortorder: 500031052 +sortorder: 500031054 toc: False sidebartitle: sqlalchemy.orm Query meta: Example code for understanding how to use the Query class from the sqlalchemy.orm module of the SQLAlchemy project. -Query is a class within the sqlalchemy.orm module of the SQLAlchemy project. - +`Query` is a class within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from SQLAlchemy Mixins [SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown index 29a36c9fe..da8e8c5a0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm relationship Example Code category: page slug: sqlalchemy-orm-relationship-examples -sortorder: 500031067 +sortorder: 500031069 toc: False sidebartitle: sqlalchemy.orm relationship meta: Python example code that shows how to use the relationship callable from the sqlalchemy.orm module of the SQLAlchemy project. -relationship is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`relationship` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown index eb087dd30..62a1e052c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm RelationshipProperty Example Code category: page slug: sqlalchemy-orm-relationshipproperty-examples -sortorder: 500031053 +sortorder: 500031055 toc: False sidebartitle: sqlalchemy.orm RelationshipProperty meta: Example code for understanding how to use the RelationshipProperty class from the sqlalchemy.orm module of the SQLAlchemy project. -RelationshipProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. - +`RelationshipProperty` is a class within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from SQLAlchemy Mixins [SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown index d25ec3cfa..76c389590 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.orm.session object_session Example Code category: page slug: sqlalchemy-orm-session-object-session-examples -sortorder: 500031084 +sortorder: 500031086 toc: False sidebartitle: sqlalchemy.orm.session object_session meta: Python example code that shows how to use the object_session callable from the sqlalchemy.orm.session module of the SQLAlchemy project. -object_session is a callable within the sqlalchemy.orm.session module of the SQLAlchemy project. +`object_session` is a callable within the `sqlalchemy.orm.session` module of the SQLAlchemy project. +Session +is another callable from the `sqlalchemy.orm.session` package with code examples. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown index 8073560b0..0a195ade1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.orm.session Session Example Code category: page slug: sqlalchemy-orm-session-session-examples -sortorder: 500031083 +sortorder: 500031085 toc: False sidebartitle: sqlalchemy.orm.session Session meta: Example code for understanding how to use the Session class from the sqlalchemy.orm.session module of the SQLAlchemy project. -Session is a class within the sqlalchemy.orm.session module of the SQLAlchemy project. +`Session` is a class within the `sqlalchemy.orm.session` module of the SQLAlchemy project. +object_session +is another callable from the `sqlalchemy.orm.session` package with code examples. ## Example 1 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown index ef0cd18f6..0c49626c2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm session Example Code category: page slug: sqlalchemy-orm-session-examples -sortorder: 500031068 +sortorder: 500031070 toc: False sidebartitle: sqlalchemy.orm session meta: Python example code that shows how to use the session callable from the sqlalchemy.orm module of the SQLAlchemy project. -session is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`session` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown index 86ab95aaa..d7e6b0079 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm sessionmaker Example Code category: page slug: sqlalchemy-orm-sessionmaker-examples -sortorder: 500031069 +sortorder: 500031071 toc: False sidebartitle: sqlalchemy.orm sessionmaker meta: Python example code that shows how to use the sessionmaker callable from the sqlalchemy.orm module of the SQLAlchemy project. -sessionmaker is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`sessionmaker` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown index a3656ed22..2f9630cd1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm strategies Example Code category: page slug: sqlalchemy-orm-strategies-examples -sortorder: 500031070 +sortorder: 500031072 toc: False sidebartitle: sqlalchemy.orm strategies meta: Python example code that shows how to use the strategies callable from the sqlalchemy.orm module of the SQLAlchemy project. -strategies is a callable within the sqlalchemy.orm module of the SQLAlchemy project. - +`strategies` is a callable within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +and sessionmaker +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown index 00e76e0c9..45c841d40 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown @@ -1,14 +1,37 @@ title: sqlalchemy.orm SynonymProperty Example Code category: page slug: sqlalchemy-orm-synonymproperty-examples -sortorder: 500031055 +sortorder: 500031057 toc: False sidebartitle: sqlalchemy.orm SynonymProperty meta: Example code for understanding how to use the SynonymProperty class from the sqlalchemy.orm module of the SQLAlchemy project. -SynonymProperty is a class within the sqlalchemy.orm module of the SQLAlchemy project. - +`SynonymProperty` is a class within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. ## Example 1 from marshmallow-sqlalchemy [marshmallow-sqlalchemy](https://github.com/marshmallow-code/marshmallow-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown index 5819716d4..27381751f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.orm.util AliasedClass Example Code category: page slug: sqlalchemy-orm-util-aliasedclass-examples -sortorder: 500031085 +sortorder: 500031087 toc: False sidebartitle: sqlalchemy.orm.util AliasedClass meta: Example code for understanding how to use the AliasedClass class from the sqlalchemy.orm.util module of the SQLAlchemy project. -AliasedClass is a class within the sqlalchemy.orm.util module of the SQLAlchemy project. +`AliasedClass` is a class within the `sqlalchemy.orm.util` module of the SQLAlchemy project. +AliasedInsp +and +identity_key +are a couple of other callables within the `sqlalchemy.orm.util` package that also have code examples. ## Example 1 from SQLAlchemy Mixins [SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown index 2123d3858..4a53be8b3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.orm.util AliasedInsp Example Code category: page slug: sqlalchemy-orm-util-aliasedinsp-examples -sortorder: 500031086 +sortorder: 500031088 toc: False sidebartitle: sqlalchemy.orm.util AliasedInsp meta: Example code for understanding how to use the AliasedInsp class from the sqlalchemy.orm.util module of the SQLAlchemy project. -AliasedInsp is a class within the sqlalchemy.orm.util module of the SQLAlchemy project. +`AliasedInsp` is a class within the `sqlalchemy.orm.util` module of the SQLAlchemy project. +AliasedClass +and +identity_key +are a couple of other callables within the `sqlalchemy.orm.util` package that also have code examples. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown index 5f73f741f..f0b125c68 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.orm.util identity_key Example Code category: page slug: sqlalchemy-orm-util-identity-key-examples -sortorder: 500031087 +sortorder: 500031089 toc: False sidebartitle: sqlalchemy.orm.util identity_key meta: Python example code that shows how to use the identity_key callable from the sqlalchemy.orm.util module of the SQLAlchemy project. -identity_key is a callable within the sqlalchemy.orm.util module of the SQLAlchemy project. +`identity_key` is a callable within the `sqlalchemy.orm.util` module of the SQLAlchemy project. +AliasedClass +and +AliasedInsp +are a couple of other callables within the `sqlalchemy.orm.util` package that also have code examples. ## Example 1 from WTForms-Alchemy [wtforms-alchemy](git@github.com:kvesteri/wtforms-alchemy.git) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown index dbc4392b1..808964a24 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.pool NullPool Example Code category: page slug: sqlalchemy-pool-nullpool-examples -sortorder: 500031088 +sortorder: 500031090 toc: False sidebartitle: sqlalchemy.pool NullPool meta: Example code for understanding how to use the NullPool class from the sqlalchemy.pool module of the SQLAlchemy project. -NullPool is a class within the sqlalchemy.pool module of the SQLAlchemy project. +`NullPool` is a class within the `sqlalchemy.pool` module of the SQLAlchemy project. +StaticPool +is another callable from the `sqlalchemy.pool` package with code examples. ## Example 1 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown index a594f0af3..3b5cf9e49 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.pool StaticPool Example Code category: page slug: sqlalchemy-pool-staticpool-examples -sortorder: 500031089 +sortorder: 500031091 toc: False sidebartitle: sqlalchemy.pool StaticPool meta: Example code for understanding how to use the StaticPool class from the sqlalchemy.pool module of the SQLAlchemy project. -StaticPool is a class within the sqlalchemy.pool module of the SQLAlchemy project. +`StaticPool` is a class within the `sqlalchemy.pool` module of the SQLAlchemy project. +NullPool +is another callable from the `sqlalchemy.pool` package with code examples. ## Example 1 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown index 6c09906fe..d05459be8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown @@ -1,14 +1,24 @@ title: sqlalchemy.schema CheckConstraint Example Code category: page slug: sqlalchemy-schema-checkconstraint-examples -sortorder: 500031090 +sortorder: 500031092 toc: False sidebartitle: sqlalchemy.schema CheckConstraint meta: Example code for understanding how to use the CheckConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. -CheckConstraint is a class within the sqlalchemy.schema module of the SQLAlchemy project. +`CheckConstraint` is a class within the `sqlalchemy.schema` module of the SQLAlchemy project. +Column, +CreateIndex, +CreateTable, +DDLElement, +ForeignKey, +ForeignKeyConstraint, +Index, +PrimaryKeyConstraint, +and Table +are several other callables with code examples from the same `sqlalchemy.schema` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown index ab6a33c23..c6994daee 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown @@ -1,14 +1,24 @@ title: sqlalchemy.schema Column Example Code category: page slug: sqlalchemy-schema-column-examples -sortorder: 500031091 +sortorder: 500031093 toc: False sidebartitle: sqlalchemy.schema Column meta: Example code for understanding how to use the Column class from the sqlalchemy.schema module of the SQLAlchemy project. -Column is a class within the sqlalchemy.schema module of the SQLAlchemy project. +`Column` is a class within the `sqlalchemy.schema` module of the SQLAlchemy project. +CheckConstraint, +CreateIndex, +CreateTable, +DDLElement, +ForeignKey, +ForeignKeyConstraint, +Index, +PrimaryKeyConstraint, +and Table +are several other callables with code examples from the same `sqlalchemy.schema` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) @@ -227,3 +237,116 @@ class ModelLoader(Loader): ``` + +## Example 3 from PyHive +[PyHive](https://github.com/dropbox/PyHive) +([PyPI package information](https://pypi.org/project/PyHive/)) +is a set of [DB-API](https://www.python.org/dev/peps/pep-0249/) +and +[SQLAlchemy](/sqlalchemy.html) +interfaces that make it easier to use [Presto](https://prestodb.io/) +and [Apache Hive](http://hive.apache.org/) with Python. +[Dropbox's engineering team](https://www.dropbox.com/jobs/teams/engineering) +created this code library, open sourced it and put it out under +the [Apache 2.0 license](https://github.com/dropbox/PyHive/blob/master/LICENSE). + +[**PyHive / pyhive / tests / test_sqlalchemy_hive.py**](https://github.com/dropbox/PyHive/blob/master/pyhive/tests/test_sqlalchemy_hive.py) + +```python +# test_sqlalchemy_hive.py +from __future__ import absolute_import +from __future__ import unicode_literals +from builtins import str +from pyhive.sqlalchemy_hive import HiveDate +from pyhive.sqlalchemy_hive import HiveDecimal +from pyhive.sqlalchemy_hive import HiveTimestamp +from pyhive.tests.sqlalchemy_test_case import SqlAlchemyTestCase +from pyhive.tests.sqlalchemy_test_case import with_engine_connection +from sqlalchemy import types +from sqlalchemy.engine import create_engine +~~from sqlalchemy.schema import Column +from sqlalchemy.schema import MetaData +from sqlalchemy.schema import Table +import contextlib +import datetime +import decimal +import sqlalchemy.types +import unittest + +_ONE_ROW_COMPLEX_CONTENTS = [ + True, + 127, + 32767, + 2147483647, + 9223372036854775807, + 0.5, + 0.25, + 'a string', + datetime.datetime(1970, 1, 1), + b'123', + '[1,2]', + '{1:2,3:4}', + '{"a":1,"b":2}', + '{0:1}', + decimal.Decimal('0.1'), + + +## ... source file abbreviated to get to Column examples ... + + + self.assertEqual(list(row), _ONE_ROW_COMPLEX_CONTENTS) + + self.assertIsInstance(one_row_complex.c.boolean.type, types.Boolean) + self.assertIsInstance(one_row_complex.c.tinyint.type, types.Integer) + self.assertIsInstance(one_row_complex.c.smallint.type, types.Integer) + self.assertIsInstance(one_row_complex.c.int.type, types.Integer) + self.assertIsInstance(one_row_complex.c.bigint.type, types.BigInteger) + self.assertIsInstance(one_row_complex.c.float.type, types.Float) + self.assertIsInstance(one_row_complex.c.double.type, types.Float) + self.assertIsInstance(one_row_complex.c.string.type, types.String) + self.assertIsInstance(one_row_complex.c.timestamp.type, HiveTimestamp) + self.assertIsInstance(one_row_complex.c.binary.type, types.String) + self.assertIsInstance(one_row_complex.c.array.type, types.String) + self.assertIsInstance(one_row_complex.c.map.type, types.String) + self.assertIsInstance(one_row_complex.c.struct.type, types.String) + self.assertIsInstance(one_row_complex.c.union.type, types.String) + self.assertIsInstance(one_row_complex.c.decimal.type, HiveDecimal) + + @with_engine_connection + def test_type_map(self, engine, connection): + row = connection.execute('SELECT * FROM one_row_complex').fetchone() + self.assertListEqual(list(row), _ONE_ROW_COMPLEX_CONTENTS) + + @with_engine_connection + def test_reserved_words(self, engine, connection): +~~ fake_table = Table('select', MetaData(bind=engine), Column('map', sqlalchemy.types.String)) + query = str(fake_table.select(fake_table.c.map == 'a')) + self.assertIn('`select`', query) + self.assertIn('`map`', query) + self.assertNotIn('"select"', query) + self.assertNotIn('"map"', query) + + def test_switch_database(self): + engine = create_engine('hive://localhost:10000/pyhive_test_database') + try: + with contextlib.closing(engine.connect()) as connection: + self.assertIn( + ('dummy_table',), + connection.execute('SHOW TABLES').fetchall() + ) + connection.execute('USE default') + self.assertIn( + ('one_row',), + connection.execute('SHOW TABLES').fetchall() + ) + finally: + engine.dispose() + + @with_engine_connection + def test_lots_of_types(self, engine, connection): + + +## ... source file continues with no further Column examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown index c115b2a13..758608425 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown @@ -1,14 +1,24 @@ title: sqlalchemy.schema CreateIndex Example Code category: page slug: sqlalchemy-schema-createindex-examples -sortorder: 500031092 +sortorder: 500031094 toc: False sidebartitle: sqlalchemy.schema CreateIndex meta: Example code for understanding how to use the CreateIndex class from the sqlalchemy.schema module of the SQLAlchemy project. -CreateIndex is a class within the sqlalchemy.schema module of the SQLAlchemy project. +`CreateIndex` is a class within the `sqlalchemy.schema` module of the SQLAlchemy project. +CheckConstraint, +Column, +CreateTable, +DDLElement, +ForeignKey, +ForeignKeyConstraint, +Index, +PrimaryKeyConstraint, +and Table +are several other callables with code examples from the same `sqlalchemy.schema` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown index 50c1b74c8..d10ce17ba 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown @@ -1,14 +1,24 @@ title: sqlalchemy.schema CreateTable Example Code category: page slug: sqlalchemy-schema-createtable-examples -sortorder: 500031093 +sortorder: 500031095 toc: False sidebartitle: sqlalchemy.schema CreateTable meta: Example code for understanding how to use the CreateTable class from the sqlalchemy.schema module of the SQLAlchemy project. -CreateTable is a class within the sqlalchemy.schema module of the SQLAlchemy project. +`CreateTable` is a class within the `sqlalchemy.schema` module of the SQLAlchemy project. +CheckConstraint, +Column, +CreateIndex, +DDLElement, +ForeignKey, +ForeignKeyConstraint, +Index, +PrimaryKeyConstraint, +and Table +are several other callables with code examples from the same `sqlalchemy.schema` package. ## Example 1 from Amazon Redshift SQLAlchemy Dialect [Amazon Redshift SQLAlchemy Dialect](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown index 972bbca60..d332a7c71 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown @@ -1,14 +1,24 @@ title: sqlalchemy.schema DDLElement Example Code category: page slug: sqlalchemy-schema-ddlelement-examples -sortorder: 500031094 +sortorder: 500031096 toc: False sidebartitle: sqlalchemy.schema DDLElement meta: Example code for understanding how to use the DDLElement class from the sqlalchemy.schema module of the SQLAlchemy project. -DDLElement is a class within the sqlalchemy.schema module of the SQLAlchemy project. +`DDLElement` is a class within the `sqlalchemy.schema` module of the SQLAlchemy project. +CheckConstraint, +Column, +CreateIndex, +CreateTable, +ForeignKey, +ForeignKeyConstraint, +Index, +PrimaryKeyConstraint, +and Table +are several other callables with code examples from the same `sqlalchemy.schema` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown index 85806f1a6..339885008 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown @@ -1,14 +1,24 @@ title: sqlalchemy.schema ForeignKey Example Code category: page slug: sqlalchemy-schema-foreignkey-examples -sortorder: 500031095 +sortorder: 500031097 toc: False sidebartitle: sqlalchemy.schema ForeignKey meta: Example code for understanding how to use the ForeignKey class from the sqlalchemy.schema module of the SQLAlchemy project. -ForeignKey is a class within the sqlalchemy.schema module of the SQLAlchemy project. +`ForeignKey` is a class within the `sqlalchemy.schema` module of the SQLAlchemy project. +CheckConstraint, +Column, +CreateIndex, +CreateTable, +DDLElement, +ForeignKeyConstraint, +Index, +PrimaryKeyConstraint, +and Table +are several other callables with code examples from the same `sqlalchemy.schema` package. ## Example 1 from sqlacodegen [sqlacodegen](https://github.com/agronholm/sqlacodegen) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown index 9625b1e09..9b2d3532f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown @@ -1,14 +1,24 @@ title: sqlalchemy.schema ForeignKeyConstraint Example Code category: page slug: sqlalchemy-schema-foreignkeyconstraint-examples -sortorder: 500031096 +sortorder: 500031098 toc: False sidebartitle: sqlalchemy.schema ForeignKeyConstraint meta: Example code for understanding how to use the ForeignKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. -ForeignKeyConstraint is a class within the sqlalchemy.schema module of the SQLAlchemy project. +`ForeignKeyConstraint` is a class within the `sqlalchemy.schema` module of the SQLAlchemy project. +CheckConstraint, +Column, +CreateIndex, +CreateTable, +DDLElement, +ForeignKey, +Index, +PrimaryKeyConstraint, +and Table +are several other callables with code examples from the same `sqlalchemy.schema` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-index.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-index.markdown new file mode 100644 index 000000000..938cc7d61 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-index.markdown @@ -0,0 +1,81 @@ +title: sqlalchemy.schema Index Example Code +category: page +slug: sqlalchemy-schema-index-examples +sortorder: 500031099 +toc: False +sidebartitle: sqlalchemy.schema Index +meta: Example code for understanding how to use the Index class from the sqlalchemy.schema module of the SQLAlchemy project. + + +`Index` is a class within the `sqlalchemy.schema` module of the SQLAlchemy project. + +CheckConstraint, +Column, +CreateIndex, +CreateTable, +DDLElement, +ForeignKey, +ForeignKeyConstraint, +PrimaryKeyConstraint, +and Table +are several other callables with code examples from the same `sqlalchemy.schema` package. + +## Example 1 from PyHive +[PyHive](https://github.com/dropbox/PyHive) +([PyPI package information](https://pypi.org/project/PyHive/)) +is a set of [DB-API](https://www.python.org/dev/peps/pep-0249/) +and +[SQLAlchemy](/sqlalchemy.html) +interfaces that make it easier to use [Presto](https://prestodb.io/) +and [Apache Hive](http://hive.apache.org/) with Python. +[Dropbox's engineering team](https://www.dropbox.com/jobs/teams/engineering) +created this code library, open sourced it and put it out under +the [Apache 2.0 license](https://github.com/dropbox/PyHive/blob/master/LICENSE). + +[**PyHive / pyhive / tests / sqlalchemy_test_case.py**](https://github.com/dropbox/PyHive/blob/master/pyhive/tests/sqlalchemy_test_case.py) + +```python +# sqlalchemy_test_case.py +from __future__ import absolute_import +from __future__ import unicode_literals + +import abc +import contextlib +import functools + +import pytest +import sqlalchemy +from builtins import object +from future.utils import with_metaclass +from sqlalchemy.exc import NoSuchTableError +~~from sqlalchemy.schema import Index +from sqlalchemy.schema import MetaData +from sqlalchemy.schema import Table +from sqlalchemy.sql import expression + + +def with_engine_connection(fn): + @functools.wraps(fn) + def wrapped_fn(self, *args, **kwargs): + engine = self.create_engine() + try: + with contextlib.closing(engine.connect()) as connection: + fn(self, engine, connection, *args, **kwargs) + finally: + engine.dispose() + return wrapped_fn + + +class SqlAlchemyTestCase(with_metaclass(abc.ABCMeta, object)): + @with_engine_connection + def test_basic_query(self, engine, connection): + rows = connection.execute('SELECT * FROM one_row').fetchall() + self.assertEqual(len(rows), 1) + self.assertEqual(rows[0].number_of_rows, 1) # number_of_rows is the column name + self.assertEqual(len(rows[0]), 1) + + +## ... source file continues with no further Index examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown index 384430ed7..d4bf1cba8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown @@ -1,14 +1,24 @@ title: sqlalchemy.schema PrimaryKeyConstraint Example Code category: page slug: sqlalchemy-schema-primarykeyconstraint-examples -sortorder: 500031097 +sortorder: 500031100 toc: False sidebartitle: sqlalchemy.schema PrimaryKeyConstraint meta: Example code for understanding how to use the PrimaryKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. -PrimaryKeyConstraint is a class within the sqlalchemy.schema module of the SQLAlchemy project. +`PrimaryKeyConstraint` is a class within the `sqlalchemy.schema` module of the SQLAlchemy project. +CheckConstraint, +Column, +CreateIndex, +CreateTable, +DDLElement, +ForeignKey, +ForeignKeyConstraint, +Index, +and Table +are several other callables with code examples from the same `sqlalchemy.schema` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown index 1fd03be8d..0ee107243 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Table Example Code category: page slug: sqlalchemy-schema-table-examples -sortorder: 500031098 +sortorder: 500031101 toc: False sidebartitle: sqlalchemy.schema Table meta: Example code for understanding how to use the Table class from the sqlalchemy.schema module of the SQLAlchemy project. @@ -9,8 +9,194 @@ meta: Example code for understanding how to use the Table class from the sqlalch Table is a class within the sqlalchemy.schema module of the SQLAlchemy project. +CheckConstraint, +Column, +CreateIndex, +CreateTable, +DDLElement, +ForeignKey, +ForeignKeyConstraint, +Index, +and PrimaryKeyConstraint +are several other callables with code examples from the same `sqlalchemy.schema` package. -## Example 1 from sqlalchemy-utils +## Example 1 from PyHive +[PyHive](https://github.com/dropbox/PyHive) +([PyPI package information](https://pypi.org/project/PyHive/)) +is a set of [DB-API](https://www.python.org/dev/peps/pep-0249/) +and +[SQLAlchemy](/sqlalchemy.html) +interfaces that make it easier to use [Presto](https://prestodb.io/) +and [Apache Hive](http://hive.apache.org/) with Python. +[Dropbox's engineering team](https://www.dropbox.com/jobs/teams/engineering) +created this code library, open sourced it and put it out under +the [Apache 2.0 license](https://github.com/dropbox/PyHive/blob/master/LICENSE). + +[**PyHive / pyhive / tests / test_sqlalchemy_hive.py**](https://github.com/dropbox/PyHive/blob/master/pyhive/tests/test_sqlalchemy_hive.py) + +```python +# test_sqlalchemy_hive.py +from __future__ import absolute_import +from __future__ import unicode_literals +from builtins import str +from pyhive.sqlalchemy_hive import HiveDate +from pyhive.sqlalchemy_hive import HiveDecimal +from pyhive.sqlalchemy_hive import HiveTimestamp +from pyhive.tests.sqlalchemy_test_case import SqlAlchemyTestCase +from pyhive.tests.sqlalchemy_test_case import with_engine_connection +from sqlalchemy import types +from sqlalchemy.engine import create_engine +from sqlalchemy.schema import Column +from sqlalchemy.schema import MetaData +~~from sqlalchemy.schema import Table +import contextlib +import datetime +import decimal +import sqlalchemy.types +import unittest + +_ONE_ROW_COMPLEX_CONTENTS = [ + True, + 127, + 32767, + 2147483647, + 9223372036854775807, + 0.5, + 0.25, + 'a string', + datetime.datetime(1970, 1, 1), + b'123', + '[1,2]', + '{1:2,3:4}', + '{"a":1,"b":2}', + '{0:1}', + decimal.Decimal('0.1'), +] + + + +## ... source file abbreviated to get to Table examples ... + + +class TestSqlAlchemyHive(unittest.TestCase, SqlAlchemyTestCase): + def create_engine(self): + return create_engine('hive://localhost:10000/default') + + @with_engine_connection + def test_dotted_column_names(self, engine, connection): + row = connection.execute('SELECT * FROM one_row').fetchone() + assert row.keys() == ['number_of_rows'] + assert 'number_of_rows' in row + assert row.number_of_rows == 1 + assert row['number_of_rows'] == 1 + assert getattr(row, 'one_row.number_of_rows') == 1 + assert row['one_row.number_of_rows'] == 1 + + @with_engine_connection + def test_dotted_column_names_raw(self, engine, connection): + row = connection.execution_options(hive_raw_colnames=True) \ + .execute('SELECT * FROM one_row').fetchone() + assert row.keys() == ['one_row.number_of_rows'] + assert 'number_of_rows' not in row + assert getattr(row, 'one_row.number_of_rows') == 1 + assert row['one_row.number_of_rows'] == 1 + + @with_engine_connection + def test_reflect_select(self, engine, connection): +~~ one_row_complex = Table('one_row_complex', MetaData(bind=engine), autoload=True) + self.assertEqual(len(one_row_complex.c), 15) + self.assertIsInstance(one_row_complex.c.string, Column) + row = one_row_complex.select().execute().fetchone() + self.assertEqual(list(row), _ONE_ROW_COMPLEX_CONTENTS) + + self.assertIsInstance(one_row_complex.c.boolean.type, types.Boolean) + self.assertIsInstance(one_row_complex.c.tinyint.type, types.Integer) + self.assertIsInstance(one_row_complex.c.smallint.type, types.Integer) + self.assertIsInstance(one_row_complex.c.int.type, types.Integer) + self.assertIsInstance(one_row_complex.c.bigint.type, types.BigInteger) + self.assertIsInstance(one_row_complex.c.float.type, types.Float) + self.assertIsInstance(one_row_complex.c.double.type, types.Float) + self.assertIsInstance(one_row_complex.c.string.type, types.String) + self.assertIsInstance(one_row_complex.c.timestamp.type, HiveTimestamp) + self.assertIsInstance(one_row_complex.c.binary.type, types.String) + self.assertIsInstance(one_row_complex.c.array.type, types.String) + self.assertIsInstance(one_row_complex.c.map.type, types.String) + self.assertIsInstance(one_row_complex.c.struct.type, types.String) + self.assertIsInstance(one_row_complex.c.union.type, types.String) + self.assertIsInstance(one_row_complex.c.decimal.type, HiveDecimal) + + @with_engine_connection + def test_type_map(self, engine, connection): + row = connection.execute('SELECT * FROM one_row_complex').fetchone() + self.assertListEqual(list(row), _ONE_ROW_COMPLEX_CONTENTS) + + @with_engine_connection + def test_reserved_words(self, engine, connection): +~~ fake_table = Table('select', MetaData(bind=engine), Column('map', sqlalchemy.types.String)) + query = str(fake_table.select(fake_table.c.map == 'a')) + self.assertIn('`select`', query) + self.assertIn('`map`', query) + self.assertNotIn('"select"', query) + self.assertNotIn('"map"', query) + + def test_switch_database(self): + engine = create_engine('hive://localhost:10000/pyhive_test_database') + try: + with contextlib.closing(engine.connect()) as connection: + self.assertIn( + ('dummy_table',), + connection.execute('SHOW TABLES').fetchall() + ) + connection.execute('USE default') + self.assertIn( + ('one_row',), + connection.execute('SHOW TABLES').fetchall() + ) + finally: + engine.dispose() + + @with_engine_connection + def test_lots_of_types(self, engine, connection): + types = [ + 'INT', 'CHAR', 'VARCHAR', 'NCHAR', 'TEXT', 'Text', 'FLOAT', + 'NUMERIC', 'DECIMAL', 'TIMESTAMP', 'DATETIME', 'CLOB', 'BLOB', + 'BOOLEAN', 'SMALLINT', 'DATE', 'TIME', + 'String', 'Integer', 'SmallInteger', + 'Numeric', 'Float', 'DateTime', 'Date', 'Time', 'LargeBinary', + 'Boolean', 'Unicode', 'UnicodeText', + ] + cols = [] + for i, t in enumerate(types): + cols.append(Column(str(i), getattr(sqlalchemy.types, t))) + cols.append(Column('hive_date', HiveDate)) + cols.append(Column('hive_decimal', HiveDecimal)) + cols.append(Column('hive_timestamp', HiveTimestamp)) +~~ table = Table('test_table', MetaData(bind=engine), *cols, schema='pyhive_test_database') + table.drop(checkfirst=True) + table.create() + connection.execute('SET mapred.job.tracker=local') + connection.execute('USE pyhive_test_database') + big_number = 10 ** 10 - 1 + connection.execute(""" + INSERT OVERWRITE TABLE test_table + SELECT + 1, "a", "a", "a", "a", "a", 0.1, + 0.1, 0.1, 0, 0, "a", "a", + false, 1, 0, 0, + "a", 1, 1, + 0.1, 0.1, 0, 0, 0, "a", + false, "a", "a", + 0, %d, 123 + 2000 + FROM default.one_row + + + +## ... source file continues with no further Table examples... + +``` + + +## Example 2 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown index 22f1338b6..5dfc8fef5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.sql ClauseElement Example Code category: page slug: sqlalchemy-sql-clauseelement-examples -sortorder: 500031099 +sortorder: 500031102 toc: False sidebartitle: sqlalchemy.sql ClauseElement meta: Example code for understanding how to use the ClauseElement class from the sqlalchemy.sql module of the SQLAlchemy project. -ClauseElement is a class within the sqlalchemy.sql module of the SQLAlchemy project. +`ClauseElement` is a class within the `sqlalchemy.sql` module of the SQLAlchemy project. +Select, +column, +expression, +extract, +functions, +operators, +schema, +select, +sqltypes, +and table +are several other callables with code examples from the same `sqlalchemy.sql` package. ## Example 1 from databases [databases](https://github.com/encode/databases) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown index 36ee12c23..29865743b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.sql column Example Code category: page slug: sqlalchemy-sql-column-examples -sortorder: 500031100 +sortorder: 500031103 toc: False sidebartitle: sqlalchemy.sql column meta: Python example code that shows how to use the column callable from the sqlalchemy.sql module of the SQLAlchemy project. -column is a callable within the sqlalchemy.sql module of the SQLAlchemy project. +`column` is a callable within the `sqlalchemy.sql` module of the SQLAlchemy project. +ClauseElement, +Select, +expression, +extract, +functions, +operators, +schema, +select, +sqltypes, +and table +are several other callables with code examples from the same `sqlalchemy.sql` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-compiler-sqlcompiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-compiler-sqlcompiler.markdown new file mode 100644 index 000000000..d31e2daea --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-compiler-sqlcompiler.markdown @@ -0,0 +1,96 @@ +title: sqlalchemy.sql.compiler SQLCompiler Example Code +category: page +slug: sqlalchemy-sql-compiler-sqlcompiler-examples +sortorder: 500031112 +toc: False +sidebartitle: sqlalchemy.sql.compiler SQLCompiler +meta: Example code for understanding how to use the SQLCompiler class from the sqlalchemy.sql.compiler module of the SQLAlchemy project. + + +`SQLCompiler` is a class within the `sqlalchemy.sql.compiler` module of the SQLAlchemy project. + + + +## Example 1 from PyHive +[PyHive](https://github.com/dropbox/PyHive) +([PyPI package information](https://pypi.org/project/PyHive/)) +is a set of [DB-API](https://www.python.org/dev/peps/pep-0249/) +and +[SQLAlchemy](/sqlalchemy.html) +interfaces that make it easier to use [Presto](https://prestodb.io/) +and [Apache Hive](http://hive.apache.org/) with Python. +[Dropbox's engineering team](https://www.dropbox.com/jobs/teams/engineering) +created this code library, open sourced it and put it out under +the [Apache 2.0 license](https://github.com/dropbox/PyHive/blob/master/LICENSE). + +[**PyHive / pyhive / sqlalchemy_presto.py**](https://github.com/dropbox/PyHive/blob/master/pyhive/./sqlalchemy_presto.py) + +```python +# sqlalchemy_presto.py + +from __future__ import absolute_import +from __future__ import unicode_literals + +import re +from sqlalchemy import exc +from sqlalchemy import types +from sqlalchemy import util +from sqlalchemy.databases import mysql +from sqlalchemy.engine import default +from sqlalchemy.sql import compiler +~~from sqlalchemy.sql.compiler import SQLCompiler + +from pyhive import presto +from pyhive.common import UniversalSet + + +class PrestoIdentifierPreparer(compiler.IdentifierPreparer): + reserved_words = UniversalSet() + + +_type_map = { + 'boolean': types.Boolean, + 'tinyint': mysql.MSTinyInteger, + 'smallint': types.SmallInteger, + 'integer': types.Integer, + 'bigint': types.BigInteger, + 'real': types.Float, + 'double': types.Float, + 'varchar': types.String, + 'timestamp': types.TIMESTAMP, + 'date': types.DATE, + 'varbinary': types.VARBINARY, +} + + +~~class PrestoCompiler(SQLCompiler): + def visit_char_length_func(self, fn, **kw): + return 'length{}'.format(self.function_argspec(fn, **kw)) + + +class PrestoTypeCompiler(compiler.GenericTypeCompiler): + def visit_CLOB(self, type_, **kw): + raise ValueError("Presto does not support the CLOB column type.") + + def visit_NCLOB(self, type_, **kw): + raise ValueError("Presto does not support the NCLOB column type.") + + def visit_DATETIME(self, type_, **kw): + raise ValueError("Presto does not support the DATETIME column type.") + + def visit_FLOAT(self, type_, **kw): + return 'DOUBLE' + + def visit_TEXT(self, type_, **kw): + if type_.length: + return 'VARCHAR({:d})'.format(type_.length) + else: + return 'VARCHAR' + + + + +## ... source file continues with no further SQLCompiler examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown index 8872c90ec..b7af7cc08 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.sql.elements ColumnElement Example Code category: page slug: sqlalchemy-sql-elements-columnelement-examples -sortorder: 500031109 +sortorder: 500031113 toc: False sidebartitle: sqlalchemy.sql.elements ColumnElement meta: Example code for understanding how to use the ColumnElement class from the sqlalchemy.sql.elements module of the SQLAlchemy project. -ColumnElement is a class within the sqlalchemy.sql.elements module of the SQLAlchemy project. +`ColumnElement` is a class within the `sqlalchemy.sql.elements` module of the SQLAlchemy project. +Label +is another callable from the `sqlalchemy.sql.elements` package with code examples. ## Example 1 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown index b6ac898cd..ec89ca0ae 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.sql.elements Label Example Code category: page slug: sqlalchemy-sql-elements-label-examples -sortorder: 500031110 +sortorder: 500031114 toc: False sidebartitle: sqlalchemy.sql.elements Label meta: Example code for understanding how to use the Label class from the sqlalchemy.sql.elements module of the SQLAlchemy project. -Label is a class within the sqlalchemy.sql.elements module of the SQLAlchemy project. +`Label` is a class within the `sqlalchemy.sql.elements` module of the SQLAlchemy project. +ColumnElement +is another callable from the `sqlalchemy.sql.elements` package with code examples. ## Example 1 from GINO [GINO](https://github.com/fantix/gino) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown index 02d9d0722..5dc049a3a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown @@ -1,14 +1,20 @@ title: sqlalchemy.sql.expression ClauseElement Example Code category: page slug: sqlalchemy-sql-expression-clauseelement-examples -sortorder: 500031111 +sortorder: 500031115 toc: False sidebartitle: sqlalchemy.sql.expression ClauseElement meta: Example code for understanding how to use the ClauseElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. -ClauseElement is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. +`ClauseElement` is a class within the `sqlalchemy.sql.expression` module of the SQLAlchemy project. +ColumnClause, +ColumnElement, +Executable, +FunctionElement, +and UnaryExpression +are several other callables with code examples from the same `sqlalchemy.sql.expression` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown index c6acaf636..793890933 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown @@ -1,14 +1,20 @@ title: sqlalchemy.sql.expression ColumnClause Example Code category: page slug: sqlalchemy-sql-expression-columnclause-examples -sortorder: 500031112 +sortorder: 500031116 toc: False sidebartitle: sqlalchemy.sql.expression ColumnClause meta: Example code for understanding how to use the ColumnClause class from the sqlalchemy.sql.expression module of the SQLAlchemy project. -ColumnClause is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. +`ColumnClause` is a class within the `sqlalchemy.sql.expression` module of the SQLAlchemy project. +ClauseElement, +ColumnElement, +Executable, +FunctionElement, +and UnaryExpression +are several other callables with code examples from the same `sqlalchemy.sql.expression` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown index 95e07659a..a2bb147f9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown @@ -1,14 +1,20 @@ title: sqlalchemy.sql.expression ColumnElement Example Code category: page slug: sqlalchemy-sql-expression-columnelement-examples -sortorder: 500031113 +sortorder: 500031117 toc: False sidebartitle: sqlalchemy.sql.expression ColumnElement meta: Example code for understanding how to use the ColumnElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. -ColumnElement is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. +`ColumnElement` is a class within the `sqlalchemy.sql.expression` module of the SQLAlchemy project. +ClauseElement, +ColumnClause, +Executable, +FunctionElement, +and UnaryExpression +are several other callables with code examples from the same `sqlalchemy.sql.expression` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown index 4b7af7e7d..6af537d04 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown @@ -1,14 +1,20 @@ title: sqlalchemy.sql.expression Executable Example Code category: page slug: sqlalchemy-sql-expression-executable-examples -sortorder: 500031114 +sortorder: 500031118 toc: False sidebartitle: sqlalchemy.sql.expression Executable meta: Example code for understanding how to use the Executable class from the sqlalchemy.sql.expression module of the SQLAlchemy project. -Executable is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. +`Executable` is a class within the `sqlalchemy.sql.expression` module of the SQLAlchemy project. +ClauseElement, +ColumnClause, +ColumnElement, +FunctionElement, +and UnaryExpression +are several other callables with code examples from the same `sqlalchemy.sql.expression` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown index 04b5e6cfd..f589bb024 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown @@ -1,14 +1,20 @@ title: sqlalchemy.sql.expression FunctionElement Example Code category: page slug: sqlalchemy-sql-expression-functionelement-examples -sortorder: 500031115 +sortorder: 500031119 toc: False sidebartitle: sqlalchemy.sql.expression FunctionElement meta: Example code for understanding how to use the FunctionElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. -FunctionElement is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. +`FunctionElement` is a class within the `sqlalchemy.sql.expression` module of the SQLAlchemy project. +ClauseElement, +ColumnClause, +ColumnElement, +Executable, +and UnaryExpression +are several other callables with code examples from the same `sqlalchemy.sql.expression` package. ## Example 1 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown index 88a74b85d..6eae35644 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown @@ -1,14 +1,20 @@ title: sqlalchemy.sql.expression UnaryExpression Example Code category: page slug: sqlalchemy-sql-expression-unaryexpression-examples -sortorder: 500031116 +sortorder: 500031120 toc: False sidebartitle: sqlalchemy.sql.expression UnaryExpression meta: Example code for understanding how to use the UnaryExpression class from the sqlalchemy.sql.expression module of the SQLAlchemy project. -UnaryExpression is a class within the sqlalchemy.sql.expression module of the SQLAlchemy project. +`UnaryExpression` is a class within the `sqlalchemy.sql.expression` module of the SQLAlchemy project. +ClauseElement, +ColumnClause, +ColumnElement, +Executable, +and FunctionElement +are several other callables with code examples from the same `sqlalchemy.sql.expression` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown index bf0c05d1a..5b5b6c259 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.sql expression Example Code category: page slug: sqlalchemy-sql-expression-examples -sortorder: 500031101 +sortorder: 500031104 toc: False sidebartitle: sqlalchemy.sql expression meta: Python example code that shows how to use the expression callable from the sqlalchemy.sql module of the SQLAlchemy project. -expression is a callable within the sqlalchemy.sql module of the SQLAlchemy project. +`expression` is a callable within the `sqlalchemy.sql` module of the SQLAlchemy project. +ClauseElement, +Select, +column, +extract, +functions, +operators, +schema, +select, +sqltypes, +and table +are several other callables with code examples from the same `sqlalchemy.sql` package. ## Example 1 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown index 6a2904d77..235342e73 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.sql extract Example Code category: page slug: sqlalchemy-sql-extract-examples -sortorder: 500031102 +sortorder: 500031105 toc: False sidebartitle: sqlalchemy.sql extract meta: Python example code that shows how to use the extract callable from the sqlalchemy.sql module of the SQLAlchemy project. -extract is a callable within the sqlalchemy.sql module of the SQLAlchemy project. +`extract` is a callable within the `sqlalchemy.sql` module of the SQLAlchemy project. +ClauseElement, +Select, +column, +expression, +functions, +operators, +schema, +select, +sqltypes, +and table +are several other callables with code examples from the same `sqlalchemy.sql` package. ## Example 1 from SQLAlchemy Mixins [SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown index 75dd752bf..7452010c3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.sql.functions FunctionElement Example Code category: page slug: sqlalchemy-sql-functions-functionelement-examples -sortorder: 500031117 +sortorder: 500031121 toc: False sidebartitle: sqlalchemy.sql.functions FunctionElement meta: Example code for understanding how to use the FunctionElement class from the sqlalchemy.sql.functions module of the SQLAlchemy project. -FunctionElement is a class within the sqlalchemy.sql.functions module of the SQLAlchemy project. +`FunctionElement` is a class within the `sqlalchemy.sql.functions` module of the SQLAlchemy project. +GenericFunction +is another callable from the `sqlalchemy.sql.functions` package with code examples. ## Example 1 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown index 92ae4a8d4..3db638438 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.sql.functions GenericFunction Example Code category: page slug: sqlalchemy-sql-functions-genericfunction-examples -sortorder: 500031118 +sortorder: 500031122 toc: False sidebartitle: sqlalchemy.sql.functions GenericFunction meta: Example code for understanding how to use the GenericFunction class from the sqlalchemy.sql.functions module of the SQLAlchemy project. -GenericFunction is a class within the sqlalchemy.sql.functions module of the SQLAlchemy project. +`GenericFunction` is a class within the `sqlalchemy.sql.functions` module of the SQLAlchemy project. +FunctionElement +is another callable from the `sqlalchemy.sql.functions` package with code examples. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown index 8a2c3e2d8..4b51c9f08 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.sql functions Example Code category: page slug: sqlalchemy-sql-functions-examples -sortorder: 500031103 +sortorder: 500031106 toc: False sidebartitle: sqlalchemy.sql functions meta: Python example code that shows how to use the functions callable from the sqlalchemy.sql module of the SQLAlchemy project. -functions is a callable within the sqlalchemy.sql module of the SQLAlchemy project. +`functions` is a callable within the `sqlalchemy.sql` module of the SQLAlchemy project. +ClauseElement, +Select, +column, +expression, +extract, +operators, +schema, +select, +sqltypes, +and table +are several other callables with code examples from the same `sqlalchemy.sql` package. ## Example 1 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown index 512c224b6..61b3d773c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.sql.naming conv Example Code category: page slug: sqlalchemy-sql-naming-conv-examples -sortorder: 500031119 +sortorder: 500031123 toc: False sidebartitle: sqlalchemy.sql.naming conv meta: Python example code that shows how to use the conv callable from the sqlalchemy.sql.naming module of the SQLAlchemy project. -conv is a callable within the sqlalchemy.sql.naming module of the SQLAlchemy project. +`conv` is a callable within the `sqlalchemy.sql.naming` module of the SQLAlchemy project. + ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown index 7b1b44e0a..93fbc68e1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.sql operators Example Code category: page slug: sqlalchemy-sql-operators-examples -sortorder: 500031104 +sortorder: 500031107 toc: False sidebartitle: sqlalchemy.sql operators meta: Python example code that shows how to use the operators callable from the sqlalchemy.sql module of the SQLAlchemy project. -operators is a callable within the sqlalchemy.sql module of the SQLAlchemy project. +`operators` is a callable within the `sqlalchemy.sql` module of the SQLAlchemy project. +ClauseElement, +Select, +column, +expression, +extract, +functions, +schema, +select, +sqltypes, +and table +are several other callables with code examples from the same `sqlalchemy.sql` package. ## Example 1 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown index 93df3b4f1..2fa118840 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.sql.schema Column Example Code category: page slug: sqlalchemy-sql-schema-column-examples -sortorder: 500031120 +sortorder: 500031124 toc: False sidebartitle: sqlalchemy.sql.schema Column meta: Example code for understanding how to use the Column class from the sqlalchemy.sql.schema module of the SQLAlchemy project. -Column is a class within the sqlalchemy.sql.schema module of the SQLAlchemy project. +`Column` is a class within the `sqlalchemy.sql.schema` module of the SQLAlchemy project. +SchemaItem +is another callable from the `sqlalchemy.sql.schema` package with code examples. ## Example 1 from databases [databases](https://github.com/encode/databases) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown index 78fbc3be7..c80626840 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.sql.schema SchemaItem Example Code category: page slug: sqlalchemy-sql-schema-schemaitem-examples -sortorder: 500031121 +sortorder: 500031125 toc: False sidebartitle: sqlalchemy.sql.schema SchemaItem meta: Example code for understanding how to use the SchemaItem class from the sqlalchemy.sql.schema module of the SQLAlchemy project. -SchemaItem is a class within the sqlalchemy.sql.schema module of the SQLAlchemy project. +`SchemaItem` is a class within the `sqlalchemy.sql.schema` module of the SQLAlchemy project. +Column +is another callable from the `sqlalchemy.sql.schema` package with code examples. ## Example 1 from GINO [GINO](https://github.com/fantix/gino) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown index d0869b2db..8ad866d11 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.sql schema Example Code category: page slug: sqlalchemy-sql-schema-examples -sortorder: 500031105 +sortorder: 500031108 toc: False sidebartitle: sqlalchemy.sql schema meta: Python example code that shows how to use the schema callable from the sqlalchemy.sql module of the SQLAlchemy project. -schema is a callable within the sqlalchemy.sql module of the SQLAlchemy project. +`schema` is a callable within the `sqlalchemy.sql` module of the SQLAlchemy project. +ClauseElement, +Select, +column, +expression, +extract, +functions, +operators, +select, +sqltypes, +and table +are several other callables with code examples from the same `sqlalchemy.sql` package. ## Example 1 from GINO [GINO](https://github.com/fantix/gino) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown index 1eb126b66..88909de21 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.sql select Example Code category: page slug: sqlalchemy-sql-select-examples -sortorder: 500031106 +sortorder: 500031109 toc: False sidebartitle: sqlalchemy.sql select meta: Python example code that shows how to use the select callable from the sqlalchemy.sql module of the SQLAlchemy project. -select is a callable within the sqlalchemy.sql module of the SQLAlchemy project. +`select` is a callable within the `sqlalchemy.sql` module of the SQLAlchemy project. +ClauseElement, +column, +expression, +extract, +functions, +operators, +schema, +select, +sqltypes, +and table +are several other callables with code examples from the same `sqlalchemy.sql` package. ## Example 1 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown index 027c06f82..467ece6a9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown @@ -1,14 +1,16 @@ title: sqlalchemy.sql.sqltypes NullType Example Code category: page slug: sqlalchemy-sql-sqltypes-nulltype-examples -sortorder: 500031122 +sortorder: 500031126 toc: False sidebartitle: sqlalchemy.sql.sqltypes NullType meta: Example code for understanding how to use the NullType class from the sqlalchemy.sql.sqltypes module of the SQLAlchemy project. -NullType is a class within the sqlalchemy.sql.sqltypes module of the SQLAlchemy project. +`NullType` is a class within the `sqlalchemy.sql.sqltypes` module of the SQLAlchemy project. +NullType +is another callable from the `sqlalchemy.sql.sqltypes` package with code examples. ## Example 1 from sqlacodegen [sqlacodegen](https://github.com/agronholm/sqlacodegen) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown index 63bf8ccb4..5235cce35 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.sql sqltypes Example Code category: page slug: sqlalchemy-sql-sqltypes-examples -sortorder: 500031107 +sortorder: 500031110 toc: False sidebartitle: sqlalchemy.sql sqltypes meta: Python example code that shows how to use the sqltypes callable from the sqlalchemy.sql module of the SQLAlchemy project. -sqltypes is a callable within the sqlalchemy.sql module of the SQLAlchemy project. +`sqltypes` is a callable within the `sqlalchemy.sql` module of the SQLAlchemy project. +ClauseElement, +Select, +column, +expression, +extract, +functions, +operators, +schema, +select, +and table +are several other callables with code examples from the same `sqlalchemy.sql` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown index 3336472a5..15e36fa9c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.sql table Example Code category: page slug: sqlalchemy-sql-table-examples -sortorder: 500031108 +sortorder: 500031111 toc: False sidebartitle: sqlalchemy.sql table meta: Python example code that shows how to use the table callable from the sqlalchemy.sql module of the SQLAlchemy project. -table is a callable within the sqlalchemy.sql module of the SQLAlchemy project. +`table` is a callable within the `sqlalchemy.sql` module of the SQLAlchemy project. +ClauseElement, +Select, +column, +expression, +extract, +functions, +operators, +schema, +select, +and sqltypes +are several other callables with code examples from the same `sqlalchemy.sql` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown index 461e0f66e..4fcd38d81 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.sql.util ClauseAdapter Example Code category: page slug: sqlalchemy-sql-util-clauseadapter-examples -sortorder: 500031123 +sortorder: 500031127 toc: False sidebartitle: sqlalchemy.sql.util ClauseAdapter meta: Example code for understanding how to use the ClauseAdapter class from the sqlalchemy.sql.util module of the SQLAlchemy project. -ClauseAdapter is a class within the sqlalchemy.sql.util module of the SQLAlchemy project. +`ClauseAdapter` is a class within the `sqlalchemy.sql.util` module of the SQLAlchemy project. + ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown index cf9c98049..6c2e99112 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.sql.visitors traverse Example Code category: page slug: sqlalchemy-sql-visitors-traverse-examples -sortorder: 500031124 +sortorder: 500031128 toc: False sidebartitle: sqlalchemy.sql.visitors traverse meta: Python example code that shows how to use the traverse callable from the sqlalchemy.sql.visitors module of the SQLAlchemy project. -traverse is a callable within the sqlalchemy.sql.visitors module of the SQLAlchemy project. +`traverse` is a callable within the `sqlalchemy.sql.visitors` module of the SQLAlchemy project. + ## Example 1 from alembic diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown index f55075ef1..ba1846ec6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.types Boolean Example Code category: page slug: sqlalchemy-types-boolean-examples -sortorder: 500031125 +sortorder: 500031129 toc: False sidebartitle: sqlalchemy.types Boolean meta: Example code for understanding how to use the Boolean class from the sqlalchemy.types module of the SQLAlchemy project. -Boolean is a class within the sqlalchemy.types module of the SQLAlchemy project. +`Boolean` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. +Boolean, +Enum, +INTEGER, +Integer, +NULLTYPE, +NullType, +String, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. ## Example 1 from sqlacodegen [sqlacodegen](https://github.com/agronholm/sqlacodegen) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown index 07cc1d513..49a1a4c7a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.types Enum Example Code category: page slug: sqlalchemy-types-enum-examples -sortorder: 500031126 +sortorder: 500031130 toc: False sidebartitle: sqlalchemy.types Enum meta: Example code for understanding how to use the Enum class from the sqlalchemy.types module of the SQLAlchemy project. -Enum is a class within the sqlalchemy.types module of the SQLAlchemy project. +`Enum` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. +BOOLEAN, +Boolean, +INTEGER, +Integer, +NULLTYPE, +NullType, +String, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. ## Example 1 from graphene-sqlalchemy [graphene-sqlalchemy](https://github.com/graphql-python/graphene-sqlalchemy) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown index adcc73c33..76e460432 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.types Integer Example Code category: page slug: sqlalchemy-types-integer-examples -sortorder: 500031127 +sortorder: 500031131 toc: False sidebartitle: sqlalchemy.types Integer meta: Example code for understanding how to use the Integer class from the sqlalchemy.types module of the SQLAlchemy project. -Integer is a class within the sqlalchemy.types module of the SQLAlchemy project. +`Integer` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. +BOOLEAN, +Boolean, +Enum, +Integer, +NULLTYPE, +NullType, +String, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown index 9fe7e75f7..14a1cc48e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.types NULLTYPE Example Code category: page slug: sqlalchemy-types-nulltype-examples -sortorder: 500031128 +sortorder: 500031132 toc: False sidebartitle: sqlalchemy.types NULLTYPE meta: Python example code that shows how to use the NULLTYPE constant from the sqlalchemy.types module of the SQLAlchemy project. -NULLTYPE is a constant within the sqlalchemy.types module of the SQLAlchemy project. +`NULLTYPE` is a constant within the `sqlalchemy.types` module of the SQLAlchemy project. +BOOLEAN, +Boolean, +Enum, +INTEGER, +Integer, +NullType, +String, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown index bdc9c4146..f5455d3b7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown @@ -1,16 +1,85 @@ title: sqlalchemy.types String Example Code category: page slug: sqlalchemy-types-string-examples -sortorder: 500031129 +sortorder: 500031133 toc: False sidebartitle: sqlalchemy.types String meta: Example code for understanding how to use the String class from the sqlalchemy.types module of the SQLAlchemy project. -String is a class within the sqlalchemy.types module of the SQLAlchemy project. +`String` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. + +BOOLEAN, +Boolean, +Enum, +INTEGER, +Integer, +NULLTYPE, +NullType, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. + +## Example 1 from PyHive +[PyHive](https://github.com/dropbox/PyHive) +([PyPI package information](https://pypi.org/project/PyHive/)) +is a set of [DB-API](https://www.python.org/dev/peps/pep-0249/) +and +[SQLAlchemy](/sqlalchemy.html) +interfaces that make it easier to use [Presto](https://prestodb.io/) +and [Apache Hive](http://hive.apache.org/) with Python. +[Dropbox's engineering team](https://www.dropbox.com/jobs/teams/engineering) +created this code library, open sourced it and put it out under +the [Apache 2.0 license](https://github.com/dropbox/PyHive/blob/master/LICENSE). + +[**PyHive / pyhive / tests / test_sqlalchemy_presto.py**](https://github.com/dropbox/PyHive/blob/master/pyhive/tests/test_sqlalchemy_presto.py) + +```python +# test_sqlalchemy_presto.py +from __future__ import absolute_import +from __future__ import unicode_literals +from builtins import str +from pyhive.tests.sqlalchemy_test_case import SqlAlchemyTestCase +from pyhive.tests.sqlalchemy_test_case import with_engine_connection +from sqlalchemy import types +from sqlalchemy.engine import create_engine +from sqlalchemy.schema import Column +from sqlalchemy.schema import MetaData +from sqlalchemy.schema import Table +~~from sqlalchemy.types import String + +import contextlib +import unittest + + +class TestSqlAlchemyPresto(unittest.TestCase, SqlAlchemyTestCase): + def create_engine(self): + return create_engine('presto://localhost:8080/hive/default?source={}'.format(self.id())) + + def test_bad_format(self): + self.assertRaises( + ValueError, + lambda: create_engine('presto://localhost:8080/hive/default/what'), + ) + + @with_engine_connection + def test_reflect_select(self, engine, connection): + one_row_complex = Table('one_row_complex', MetaData(bind=engine), autoload=True) + self.assertEqual(len(one_row_complex.c), 15 - 1) + self.assertIsInstance(one_row_complex.c.string, Column) + rows = one_row_complex.select().execute().fetchall() + self.assertEqual(len(rows), 1) + self.assertEqual(list(rows[0]), [ + True, + + +## ... source file continues with no further String examples... + +``` -## Example 1 from sqlacodegen +## Example 2 from sqlacodegen [sqlacodegen](https://github.com/agronholm/sqlacodegen) ([PyPI package information](https://pypi.org/project/sqlacodegen/)) is a tool for diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown index 53a32658e..f6317b706 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.types to_instance Example Code category: page slug: sqlalchemy-types-to-instance-examples -sortorder: 500031132 +sortorder: 500031136 toc: False sidebartitle: sqlalchemy.types to_instance meta: Python example code that shows how to use the to_instance callable from the sqlalchemy.types module of the SQLAlchemy project. -to_instance is a callable within the sqlalchemy.types module of the SQLAlchemy project. +`to_instance` is a callable within the `sqlalchemy.types` module of the SQLAlchemy project. +BOOLEAN, +Boolean, +Enum, +INTEGER, +Integer, +NULLTYPE, +NullType, +String, +TypeEngine, +and UserDefinedType +are several other callables with code examples from the same `sqlalchemy.types` package. ## Example 1 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown index c28bd8cf5..bad53d698 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.types TypeEngine Example Code category: page slug: sqlalchemy-types-typeengine-examples -sortorder: 500031130 +sortorder: 500031134 toc: False sidebartitle: sqlalchemy.types TypeEngine meta: Example code for understanding how to use the TypeEngine class from the sqlalchemy.types module of the SQLAlchemy project. -TypeEngine is a class within the sqlalchemy.types module of the SQLAlchemy project. +`TypeEngine` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. +BOOLEAN, +Boolean, +Enum, +INTEGER, +Integer, +NULLTYPE, +NullType, +String, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. ## Example 1 from databases [databases](https://github.com/encode/databases) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown index b82606737..4c1c1565a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown @@ -1,14 +1,25 @@ title: sqlalchemy.types UserDefinedType Example Code category: page slug: sqlalchemy-types-userdefinedtype-examples -sortorder: 500031131 +sortorder: 500031135 toc: False sidebartitle: sqlalchemy.types UserDefinedType meta: Example code for understanding how to use the UserDefinedType class from the sqlalchemy.types module of the SQLAlchemy project. -UserDefinedType is a class within the sqlalchemy.types module of the SQLAlchemy project. +`UserDefinedType` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. +BOOLEAN, +Boolean, +Enum, +INTEGER, +Integer, +NULLTYPE, +NullType, +String, +TypeEngine, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. ## Example 1 from GeoAlchemy2 [GeoAlchemy2](https://github.com/geoalchemy/geoalchemy2) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown index 28cff0f06..b6e98951e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown @@ -1,13 +1,14 @@ title: sqlalchemy.util.langhelpers symbol Example Code category: page slug: sqlalchemy-util-langhelpers-symbol-examples -sortorder: 500031137 +sortorder: 500031141 toc: False sidebartitle: sqlalchemy.util.langhelpers symbol meta: Python example code that shows how to use the symbol callable from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. -symbol is a callable within the sqlalchemy.util.langhelpers module of the SQLAlchemy project. +`symbol` is a callable within the `sqlalchemy.util.langhelpers` module of the SQLAlchemy project. + ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown index 11ef6357e..d2656c918 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.util OrderedDict Example Code category: page slug: sqlalchemy-util-ordereddict-examples -sortorder: 500031133 +sortorder: 500031137 toc: False sidebartitle: sqlalchemy.util OrderedDict meta: Example code for understanding how to use the OrderedDict class from the sqlalchemy.util module of the SQLAlchemy project. -OrderedDict is a class within the sqlalchemy.util module of the SQLAlchemy project. +`OrderedDict` is a class within the `sqlalchemy.util` module of the SQLAlchemy project. +OrderedSet, +set_creation_order, +and topological +are several other callables with code examples from the same `sqlalchemy.util` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown index 955f213dd..757056c54 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.util OrderedSet Example Code category: page slug: sqlalchemy-util-orderedset-examples -sortorder: 500031134 +sortorder: 500031138 toc: False sidebartitle: sqlalchemy.util OrderedSet meta: Example code for understanding how to use the OrderedSet class from the sqlalchemy.util module of the SQLAlchemy project. -OrderedSet is a class within the sqlalchemy.util module of the SQLAlchemy project. +`OrderedSet` is a class within the `sqlalchemy.util` module of the SQLAlchemy project. +OrderedDict, +set_creation_order, +and topological +are several other callables with code examples from the same `sqlalchemy.util` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown index 92d1de89f..0ffab43ed 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.util set_creation_order Example Code category: page slug: sqlalchemy-util-set-creation-order-examples -sortorder: 500031135 +sortorder: 500031139 toc: False sidebartitle: sqlalchemy.util set_creation_order meta: Python example code that shows how to use the set_creation_order callable from the sqlalchemy.util module of the SQLAlchemy project. -set_creation_order is a callable within the sqlalchemy.util module of the SQLAlchemy project. +`set_creation_order` is a callable within the `sqlalchemy.util` module of the SQLAlchemy project. +OrderedDict, +OrderedSet, +and topological +are several other callables with code examples from the same `sqlalchemy.util` package. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown index 8d8d4e589..2b1707561 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown @@ -1,14 +1,18 @@ title: sqlalchemy.util topological Example Code category: page slug: sqlalchemy-util-topological-examples -sortorder: 500031136 +sortorder: 500031140 toc: False sidebartitle: sqlalchemy.util topological meta: Python example code that shows how to use the topological callable from the sqlalchemy.util module of the SQLAlchemy project. -topological is a callable within the sqlalchemy.util module of the SQLAlchemy project. +`topological` is a callable within the `sqlalchemy.util` module of the SQLAlchemy project. +OrderedDict, +OrderedSet, +and set_creation_order +are several other callables with code examples from the same `sqlalchemy.util` package. ## Example 1 from alembic [Alembic](https://github.com/sqlalchemy/alembic) diff --git a/theme/templates/code-examples/sqlalchemy.html b/theme/templates/code-examples/sqlalchemy.html index cb3166f5e..502a477c4 100644 --- a/theme/templates/code-examples/sqlalchemy.html +++ b/theme/templates/code-examples/sqlalchemy.html @@ -4,6 +4,9 @@

    SQLAlchemy: Extensions, Plug-ins and Related Libraries & Example Projects and Code

    +

    sqlalchemy.databases + mysql +

    sqlalchemy.dialects mssql, mysql, @@ -72,6 +75,7 @@

    sqlalchemy.exc IntegrityError, InvalidRequestError, NoInspectionAvailable, + NoSuchTableError, OperationalError, ProgrammingError

    @@ -170,6 +174,7 @@

    sqlalchemy.schema DDLElement, ForeignKey, ForeignKeyConstraint, + Index, PrimaryKeyConstraint, Table

    @@ -186,6 +191,9 @@

    sqlalchemy.sql sqltypes, table

    +

    sqlalchemy.sql.compiler + SQLCompiler +

    sqlalchemy.sql.elements ColumnElement, Label From 7ee77d20197e57e7bf29504c03c9519997a76180 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 31 Jul 2020 11:46:33 -0400 Subject: [PATCH 205/302] add new sqlalchemy examples --- .../sqlalchemy-exc-argumenterror.markdown | 3 +- .../sqlalchemy-exc-databaseerror.markdown | 3 +- .../sqlalchemy-exc-dataerror.markdown | 3 +- .../sqlalchemy-exc-integrityerror.markdown | 3 +- ...qlalchemy-exc-invalidrequesterror.markdown | 141 ++++++++++++- ...alchemy-exc-noinspectionavailable.markdown | 3 +- .../sqlalchemy-exc-nosuchtableerror.markdown | 3 +- .../sqlalchemy-exc-operationalerror.markdown | 3 +- .../sqlalchemy-exc-programmingerror.markdown | 3 +- ...y-exc-unsupportedcompilationerror.markdown | 82 ++++++++ ...associationproxy-associationproxy.markdown | 71 +++++++ ...lalchemy-ext-automap-automap-base.markdown | 73 ++++++- .../sqlalchemy-ext-compiler-compiles.markdown | 2 +- .../sqlalchemy-ext-compiler.markdown | 2 +- ...-ext-declarative-declarative-base.markdown | 60 +++++- ...y-ext-declarative-declarativemeta.markdown | 2 +- ...lalchemy-ext-hybrid-hybrid-method.markdown | 2 +- ...lchemy-ext-hybrid-hybrid-property.markdown | 2 +- .../sqlalchemy-ext-mutable-mutable.markdown | 2 +- .../sqlalchemy-extensions-plug-ins.markdown | 26 +++ .../sqlalchemy-inspection-inspect.markdown | 134 ++++++++++++- .../sqlalchemy-orm-aliased.markdown | 3 +- ...hemy-orm-attributes-flag-modified.markdown | 6 +- ...-attributes-instrumentedattribute.markdown | 6 +- ...orm-attributes-queryableattribute.markdown | 69 +++++++ .../sqlalchemy-orm-attributes.markdown | 3 +- .../sqlalchemy-orm-backref.markdown | 3 +- .../sqlalchemy-orm-class-mapper.markdown | 3 +- ...-orm-collections-instrumentedlist.markdown | 61 +++++- .../sqlalchemy-orm-column-property.markdown | 3 +- .../sqlalchemy-orm-columnproperty.markdown | 3 +- .../sqlalchemy-orm-composite.markdown | 3 +- .../sqlalchemy-orm-compositeproperty.markdown | 3 +- .../sqlalchemy-orm-exc-noresultfound.markdown | 2 +- ...lchemy-orm-exc-unmappedclasserror.markdown | 2 +- ...emy-orm-exc-unmappedinstanceerror.markdown | 2 +- ...emy-orm-interfaces-mapperproperty.markdown | 2 +- ...emy-orm-interfaces-propcomparator.markdown | 2 +- .../sqlalchemy-orm-interfaces.markdown | 3 +- .../sqlalchemy/sqlalchemy-orm-load.markdown | 113 +++++++++++ .../sqlalchemy-orm-mapper-mapper.markdown | 58 ++++++ .../sqlalchemy/sqlalchemy-orm-mapper.markdown | 3 +- .../sqlalchemy-orm-mapperlib.markdown | 3 +- .../sqlalchemy-orm-object-mapper.markdown | 3 +- .../sqlalchemy-orm-object-session.markdown | 3 +- ...emy-orm-properties-columnproperty.markdown | 2 +- ...m-properties-relationshipproperty.markdown | 2 +- .../sqlalchemy-orm-query-query.markdown | 2 +- ...sqlalchemy-orm-query-querycontext.markdown | 2 +- .../sqlalchemy/sqlalchemy-orm-query.markdown | 3 +- .../sqlalchemy-orm-relationship.markdown | 3 +- ...lalchemy-orm-relationshipproperty.markdown | 3 +- ...elationships-relationshipproperty.markdown | 186 ++++++++++++++++++ ...lchemy-orm-session-object-session.markdown | 2 +- .../sqlalchemy-orm-session-session.markdown | 2 +- .../sqlalchemy-orm-session.markdown | 3 +- .../sqlalchemy-orm-sessionmaker.markdown | 3 +- .../sqlalchemy-orm-strategies.markdown | 3 +- .../sqlalchemy-orm-synonymproperty.markdown | 3 +- .../sqlalchemy-orm-util-aliasedclass.markdown | 2 +- .../sqlalchemy-orm-util-aliasedinsp.markdown | 2 +- .../sqlalchemy-orm-util-identity-key.markdown | 2 +- .../sqlalchemy-pool-nullpool.markdown | 2 +- .../sqlalchemy-pool-staticpool.markdown | 2 +- ...sqlalchemy-schema-checkconstraint.markdown | 2 +- .../sqlalchemy-schema-column.markdown | 2 +- .../sqlalchemy-schema-createindex.markdown | 2 +- .../sqlalchemy-schema-createtable.markdown | 2 +- .../sqlalchemy-schema-ddlelement.markdown | 2 +- .../sqlalchemy-schema-foreignkey.markdown | 2 +- ...chemy-schema-foreignkeyconstraint.markdown | 2 +- .../sqlalchemy-schema-index.markdown | 2 +- ...chemy-schema-primarykeyconstraint.markdown | 2 +- .../sqlalchemy-schema-table.markdown | 2 +- .../sqlalchemy-sql-clauseelement.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-column.markdown | 2 +- ...lalchemy-sql-compiler-sqlcompiler.markdown | 2 +- ...lchemy-sql-elements-columnelement.markdown | 2 +- .../sqlalchemy-sql-elements-label.markdown | 2 +- ...hemy-sql-expression-clauseelement.markdown | 2 +- ...chemy-sql-expression-columnclause.markdown | 2 +- ...hemy-sql-expression-columnelement.markdown | 2 +- ...alchemy-sql-expression-executable.markdown | 2 +- ...my-sql-expression-functionelement.markdown | 2 +- ...my-sql-expression-unaryexpression.markdown | 2 +- .../sqlalchemy-sql-expression.markdown | 2 +- .../sqlalchemy-sql-extract.markdown | 2 +- ...emy-sql-functions-functionelement.markdown | 2 +- ...emy-sql-functions-genericfunction.markdown | 2 +- .../sqlalchemy-sql-functions.markdown | 2 +- .../sqlalchemy-sql-naming-conv.markdown | 2 +- .../sqlalchemy-sql-operators.markdown | 2 +- .../sqlalchemy-sql-schema-column.markdown | 2 +- .../sqlalchemy-sql-schema-schemaitem.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-schema.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-select.markdown | 2 +- .../sqlalchemy-sql-sqltypes-nulltype.markdown | 2 +- .../sqlalchemy-sql-sqltypes.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-table.markdown | 2 +- ...sqlalchemy-sql-util-clauseadapter.markdown | 2 +- .../sqlalchemy-sql-visitors-traverse.markdown | 2 +- .../sqlalchemy-types-boolean.markdown | 77 +++++++- .../sqlalchemy/sqlalchemy-types-date.markdown | 97 +++++++++ .../sqlalchemy-types-datetime.markdown | 97 +++++++++ .../sqlalchemy/sqlalchemy-types-enum.markdown | 13 +- .../sqlalchemy-types-float.markdown | 97 +++++++++ .../sqlalchemy-types-integer.markdown | 77 +++++++- .../sqlalchemy-types-interval.markdown | 97 +++++++++ .../sqlalchemy-types-nulltype.markdown | 13 +- .../sqlalchemy-types-string.markdown | 13 +- .../sqlalchemy/sqlalchemy-types-text.markdown | 97 +++++++++ .../sqlalchemy/sqlalchemy-types-time.markdown | 97 +++++++++ .../sqlalchemy-types-to-instance.markdown | 13 +- .../sqlalchemy-types-typeengine.markdown | 13 +- .../sqlalchemy-types-userdefinedtype.markdown | 13 +- ...y-util-langhelpers-public-factory.markdown | 129 ++++++++++++ ...qlalchemy-util-langhelpers-symbol.markdown | 5 +- .../sqlalchemy-util-ordereddict.markdown | 3 +- .../sqlalchemy-util-orderedset.markdown | 3 +- ...qlalchemy-util-set-creation-order.markdown | 3 +- .../sqlalchemy-util-symbol.markdown | 108 ++++++++++ .../sqlalchemy-util-topological.markdown | 5 +- static/img/logos/assemblyai.jpg | Bin 0 -> 31673 bytes theme/templates/code-examples/sqlalchemy.html | 27 ++- 124 files changed, 2270 insertions(+), 115 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-exc-unsupportedcompilationerror.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-ext-associationproxy-associationproxy.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-queryableattribute.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-load.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper-mapper.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-relationships-relationshipproperty.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-date.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-datetime.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-float.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-interval.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-text.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-types-time.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-public-factory.markdown create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-util-symbol.markdown create mode 100644 static/img/logos/assemblyai.jpg diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown index 878c1654a..12e57d3a7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-argumenterror.markdown @@ -16,7 +16,8 @@ meta: Example code for understanding how to use the ArgumentError class from the NoInspectionAvailable, NoSuchTableError, OperationalError, -and ProgrammingError +ProgrammingError, +and UnsupportedCompilationError are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from graphene-sqlalchemy diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown index 9bd73bae9..843f67e78 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-databaseerror.markdown @@ -16,7 +16,8 @@ meta: Example code for understanding how to use the DatabaseError class from the NoInspectionAvailable, NoSuchTableError, OperationalError, -and ProgrammingError +ProgrammingError, +and UnsupportedCompilationError are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from indico diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown index 6e55600e6..9e9ba71dd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-dataerror.markdown @@ -16,7 +16,8 @@ meta: Example code for understanding how to use the DataError class from the sql NoInspectionAvailable, NoSuchTableError, OperationalError, -and ProgrammingError +ProgrammingError, +and UnsupportedCompilationError are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown index c30ab4837..615febd9c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown @@ -16,7 +16,8 @@ meta: Example code for understanding how to use the IntegrityError class from th NoInspectionAvailable, NoSuchTableError, OperationalError, -and ProgrammingError +ProgrammingError, +and UnsupportedCompilationError are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from CTFd diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown index bb5022035..e83fb9b45 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-invalidrequesterror.markdown @@ -16,7 +16,8 @@ meta: Example code for understanding how to use the InvalidRequestError class fr NoInspectionAvailable, NoSuchTableError, OperationalError, -and ProgrammingError +ProgrammingError, +and UnsupportedCompilationError are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from GINO @@ -124,3 +125,141 @@ class ColumnAttribute: ``` + +## Example 2 from SQLAlchemy filters +[SQLAlchemy filters](https://github.com/juliotrigo/sqlalchemy-filters) + provides filtering, sorting and pagination for [SQLAlchemy](/sqlalchemy.html) + query objects, which is particularly useful when building + [web APIs](/application-programming-interfaces.html). SQLAlchemy filters + is open sourced under the + [Apache License version 2.0](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/LICENSE). + +[**SQLAlchemy filters / sqlalchemy_filters / models.py**](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/sqlalchemy_filters/./models.py) + +```python +# models.py +~~from sqlalchemy.exc import InvalidRequestError +from sqlalchemy.inspection import inspect +from sqlalchemy.orm.mapper import Mapper +from sqlalchemy.util import symbol +import types + +from .exceptions import BadQuery, FieldNotFound, BadSpec + + +class Field(object): + + def __init__(self, model, field_name): + self.model = model + self.field_name = field_name + + def get_sqlalchemy_field(self): + if self.field_name not in self._get_valid_field_names(): + raise FieldNotFound( + 'Model {} has no column `{}`.'.format( + self.model, self.field_name + ) + ) + sqlalchemy_field = getattr(self.model, self.field_name) + + if isinstance(sqlalchemy_field, types.MethodType): + + +## ... source file abbreviated to get to InvalidRequestError examples ... + + + +def get_model_class_by_name(registry, name): + for cls in registry.values(): + if getattr(cls, '__name__', None) == name: + return cls + + +def get_default_model(query): + query_models = get_query_models(query).values() + if len(query_models) == 1: + default_model, = iter(query_models) + else: + default_model = None + return default_model + + +def auto_join(query, *model_names): + query_models = get_query_models(query).values() + model_registry = list(query_models)[-1]._decl_class_registry + + for name in model_names: + model = get_model_class_by_name(model_registry, name) + if model not in get_query_models(query).values(): + try: + query = query.join(model) +~~ except InvalidRequestError: + pass # can't be autojoined + return query + + + +## ... source file continues with no further InvalidRequestError examples... + +``` + + +## Example 3 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / utilities.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./utilities.py) + +```python +# utilities.py + +import csv +import linecache +import warnings +import yaml +from collections import OrderedDict + +from sqlalchemy.orm.collections import InstrumentedList +~~from sqlalchemy.exc import InvalidRequestError as SA_InvalidRequestError +from sqlalchemy.exc import UnsupportedCompilationError as SA_UnsupportedCompilationError + +from validator_collection import validators, checkers +from validator_collection.errors import NotAnIterableError + +from sqlathanor._compat import json, is_py2, is_py36, is_py35, dict as dict_ +from sqlathanor.errors import InvalidFormatError, UnsupportedSerializationError, \ + UnsupportedDeserializationError, MaximumNestingExceededError, \ + MaximumNestingExceededWarning, DeserializationError, CSVStructureError + +UTILITY_COLUMNS = [ + 'metadata', + 'primary_key_value', + '_decl_class_registry', + '_sa_instance_state', + '_sa_class_manager' +] + +def bool_to_tuple(input): + + if input is True: + input = (True, True) + elif not input: + input = (False, False) + + +## ... source file continues with no further InvalidRequestError examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown index 64036057b..f4aeef522 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-noinspectionavailable.markdown @@ -16,7 +16,8 @@ meta: Example code for understanding how to use the NoInspectionAvailable class InvalidRequestError, NoSuchTableError, OperationalError, -and ProgrammingError +ProgrammingError, +and UnsupportedCompilationError are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-nosuchtableerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-nosuchtableerror.markdown index 7b8831bf1..78b91dcc6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-nosuchtableerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-nosuchtableerror.markdown @@ -16,7 +16,8 @@ meta: Example code for understanding how to use the NoSuchTableError class from InvalidRequestError, NoInspectionAvailable, OperationalError, -and ProgrammingError +ProgrammingError, +and UnsupportedCompilationError are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from PyHive diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown index 45f349919..2e41ec0f7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-operationalerror.markdown @@ -16,7 +16,8 @@ meta: Example code for understanding how to use the OperationalError class from InvalidRequestError, NoInspectionAvailable, NoSuchTableError, -and ProgrammingError +ProgrammingError, +and UnsupportedCompilationError are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from indico diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown index a35802227..bed152bfa 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-programmingerror.markdown @@ -16,7 +16,8 @@ meta: Example code for understanding how to use the ProgrammingError class from InvalidRequestError, NoInspectionAvailable, NoSuchTableError, -and OperationalError +OperationalError, +and UnsupportedCompilationError are several other callables with code examples from the same `sqlalchemy.exc` package. ## Example 1 from sqlalchemy-utils diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-unsupportedcompilationerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-unsupportedcompilationerror.markdown new file mode 100644 index 000000000..0ba77b319 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-unsupportedcompilationerror.markdown @@ -0,0 +1,82 @@ +title: sqlalchemy.exc UnsupportedCompilationError Example Code +category: page +slug: sqlalchemy-exc-unsupportedcompilationerror-examples +sortorder: 500031043 +toc: False +sidebartitle: sqlalchemy.exc UnsupportedCompilationError +meta: Example code for understanding how to use the UnsupportedCompilationError class from the sqlalchemy.exc module of the SQLAlchemy project. + + +`UnsupportedCompilationError` is a class within the `sqlalchemy.exc` module of the SQLAlchemy project. + +ArgumentError, +DataError, +DatabaseError, +IntegrityError, +InvalidRequestError, +NoInspectionAvailable, +NoSuchTableError, +OperationalError, +and ProgrammingError +are several other callables with code examples from the same `sqlalchemy.exc` package. + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / utilities.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./utilities.py) + +```python +# utilities.py + +import csv +import linecache +import warnings +import yaml +from collections import OrderedDict + +from sqlalchemy.orm.collections import InstrumentedList +from sqlalchemy.exc import InvalidRequestError as SA_InvalidRequestError +~~from sqlalchemy.exc import UnsupportedCompilationError as SA_UnsupportedCompilationError + +from validator_collection import validators, checkers +from validator_collection.errors import NotAnIterableError + +from sqlathanor._compat import json, is_py2, is_py36, is_py35, dict as dict_ +from sqlathanor.errors import InvalidFormatError, UnsupportedSerializationError, \ + UnsupportedDeserializationError, MaximumNestingExceededError, \ + MaximumNestingExceededWarning, DeserializationError, CSVStructureError + +UTILITY_COLUMNS = [ + 'metadata', + 'primary_key_value', + '_decl_class_registry', + '_sa_instance_state', + '_sa_class_manager' +] + +def bool_to_tuple(input): + + if input is True: + input = (True, True) + elif not input: + input = (False, False) + elif not isinstance(input, tuple) or len(input) > 2: + + +## ... source file continues with no further UnsupportedCompilationError examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-associationproxy-associationproxy.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-associationproxy-associationproxy.markdown new file mode 100644 index 000000000..9d9345d54 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-associationproxy-associationproxy.markdown @@ -0,0 +1,71 @@ +title: sqlalchemy.ext.associationproxy AssociationProxy Example Code +category: page +slug: sqlalchemy-ext-associationproxy-associationproxy-examples +sortorder: 500031045 +toc: False +sidebartitle: sqlalchemy.ext.associationproxy AssociationProxy +meta: Example code for understanding how to use the AssociationProxy class from the sqlalchemy.ext.associationproxy module of the SQLAlchemy project. + + +`AssociationProxy` is a class within the `sqlalchemy.ext.associationproxy` module of the SQLAlchemy project. + + + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / declarative / _base_configuration_mixin.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/declarative/_base_configuration_mixin.py) + +```python +# _base_configuration_mixin.py + + +import inspect as inspect_ +from collections import OrderedDict + +from sqlalchemy.inspection import inspect +from sqlalchemy.exc import InvalidRequestError +~~from sqlalchemy.ext.associationproxy import AssociationProxy +from validator_collection import checkers + +from sqlathanor._compat import dict as dict_ +from sqlathanor.attributes import AttributeConfiguration, validate_serialization_config, \ + BLANK_ON_SERIALIZE +from sqlathanor.errors import ConfigurationError, UnsupportedSerializationError + + +class ConfigurationMixin(object): + + @classmethod + def _get_instance_attributes(cls, + include_private = False, + exclude_methods = True): + base_attributes = dir(cls) + instance_attributes = [] + for key in base_attributes: + if key.startswith('__'): + continue + + if key.startswith('_') and not key.startswith('__') and not include_private: + continue + + try: + + +## ... source file continues with no further AssociationProxy examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown index 0be48def5..9de2f69eb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-automap-automap-base.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.automap automap_base Example Code category: page slug: sqlalchemy-ext-automap-automap-base-examples -sortorder: 500031044 +sortorder: 500031046 toc: False sidebartitle: sqlalchemy.ext.automap automap_base meta: Python example code that shows how to use the automap_base callable from the sqlalchemy.ext.automap module of the SQLAlchemy project. @@ -11,7 +11,76 @@ meta: Python example code that shows how to use the automap_base callable from t -## Example 1 from sandman2 +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / automap.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./automap.py) + +```python +# automap.py + + +import sqlalchemy + +try: +~~ from sqlalchemy.ext.automap import automap_base as SA_automap_base + SUPPORTS_AUTOMAP = True +except ImportError: + SUPPORTS_AUTOMAP = False + SA_automap_base = bool + +from validator_collection import checkers + +from sqlathanor import BaseModel +from sqlathanor.errors import SQLAlchemySupportError + + +~~def automap_base(declarative_base = None, + **kwargs): + + if not SUPPORTS_AUTOMAP: + raise SQLAlchemySupportError( + 'automap is only available in SQLAlchemy v.0.9.1 and higher, ' + \ + 'but you are using %s. Please upgrade.' % sqlalchemy.__version__ + ) + + if declarative_base is None: + cls = BaseModel + elif isinstance(declarative_base, BaseModel) or declarative_base == BaseModel: + cls = declarative_base + elif isinstance(declarative_base, tuple): + for item in declarative_base: + if item == BaseModel or isinstance(item, BaseModel): + cls = declarative_base + break + else: + cls = kwargs.pop('cls', None) + if cls is None and checkers.is_iterable(declarative_base): + class_list = [BaseModel] + class_list.extend([x for x in declarative_base]) + elif cls is None and not checkers.is_iterable(declarative_base): + class_list = [BaseModel, declarative_base] + + +## ... source file continues with no further automap_base examples... + +``` + + +## Example 2 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown index 442398079..b4ea0a99b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler-compiles.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.compiler compiles Example Code category: page slug: sqlalchemy-ext-compiler-compiles-examples -sortorder: 500031045 +sortorder: 500031047 toc: False sidebartitle: sqlalchemy.ext.compiler compiles meta: Python example code that shows how to use the compiles callable from the sqlalchemy.ext.compiler module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown index 79cdf7cb5..5891c82d8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-compiler.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext compiler Example Code category: page slug: sqlalchemy-ext-compiler-examples -sortorder: 500031043 +sortorder: 500031044 toc: False sidebartitle: sqlalchemy.ext compiler meta: Python example code that shows how to use the compiler callable from the sqlalchemy.ext module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown index d1c530f9f..d072faea6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarative-base.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.declarative declarative_base Example Code category: page slug: sqlalchemy-ext-declarative-declarative-base-examples -sortorder: 500031047 +sortorder: 500031049 toc: False sidebartitle: sqlalchemy.ext.declarative declarative_base meta: Python example code that shows how to use the declarative_base callable from the sqlalchemy.ext.declarative module of the SQLAlchemy project. @@ -315,7 +315,63 @@ class InspectionMixin(Base): ``` -## Example 5 from sandman2 +## Example 5 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / declarative / declarative_base.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/declarative/declarative_base.py) + +```python +# declarative_base.py + + +~~from sqlalchemy.ext.declarative import declarative_base as SA_declarative_base +from validator_collection import checkers + +from sqlathanor.declarative.base_model import BaseModel + + +~~def declarative_base(cls = BaseModel, **kwargs): + if isinstance(cls, tuple): + class_list = [x for x in cls] + class_list.insert(0, BaseModel) + cls = (x for x in class_list) + elif checkers.is_iterable(cls): + class_list = [BaseModel] + class_list.extend(cls) + cls = (x for x in class_list) + + return SA_declarative_base(cls = cls, **kwargs) + + +def as_declarative(**kw): + def decorate(cls): + kw['cls'] = cls + kw['name'] = cls.__name__ +~~ return declarative_base(**kw) + + return decorate + + + +## ... source file continues with no further declarative_base examples... + +``` + + +## Example 6 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown index b6c497d37..f71998164 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-declarative-declarativemeta.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.declarative DeclarativeMeta Example Code category: page slug: sqlalchemy-ext-declarative-declarativemeta-examples -sortorder: 500031046 +sortorder: 500031048 toc: False sidebartitle: sqlalchemy.ext.declarative DeclarativeMeta meta: Example code for understanding how to use the DeclarativeMeta class from the sqlalchemy.ext.declarative module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown index 393952673..5d5a0b2fb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-method.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.hybrid hybrid_method Example Code category: page slug: sqlalchemy-ext-hybrid-hybrid-method-examples -sortorder: 500031048 +sortorder: 500031050 toc: False sidebartitle: sqlalchemy.ext.hybrid hybrid_method meta: Python example code that shows how to use the hybrid_method callable from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown index 3c3e6a59a..4d0a62b1c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-hybrid-hybrid-property.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.hybrid hybrid_property Example Code category: page slug: sqlalchemy-ext-hybrid-hybrid-property-examples -sortorder: 500031049 +sortorder: 500031051 toc: False sidebartitle: sqlalchemy.ext.hybrid hybrid_property meta: Python example code that shows how to use the hybrid_property callable from the sqlalchemy.ext.hybrid module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown index 6e5ed8c1e..f2e7c2607 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-ext-mutable-mutable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.ext.mutable Mutable Example Code category: page slug: sqlalchemy-ext-mutable-mutable-examples -sortorder: 500031050 +sortorder: 500031052 toc: False sidebartitle: sqlalchemy.ext.mutable Mutable meta: Example code for understanding how to use the Mutable class from the sqlalchemy.ext.mutable module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index e0de6d880..0ff095a54 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -179,6 +179,15 @@ sourced under the [MIT license](https://github.com/Pegase745/sqlalchemy-datatables/blob/master/LICENSE). +### SQLAlchemy filters +[SQLAlchemy filters](https://github.com/juliotrigo/sqlalchemy-filters) +provides filtering, sorting and pagination for [SQLAlchemy](/sqlalchemy.html) +query objects, which is particularly useful when building +[web APIs](/application-programming-interfaces.html). SQLAlchemy filters +is open sourced under the +[Apache License version 2.0](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/LICENSE). + + ### SQLAlchemy Mixins [SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) ([PyPI package information](https://pypi.org/project/sqlalchemy-mixins/)) @@ -205,6 +214,23 @@ includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). +### SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + + ### wtforms-alchemy [wtforms-alchemy](git@github.com:kvesteri/wtforms-alchemy.git) ([documentation](https://wtforms-alchemy.readthedocs.io/en/latest/) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown index 2b197ae44..38d636930 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-inspection-inspect.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.inspection inspect Example Code category: page slug: sqlalchemy-inspection-inspect-examples -sortorder: 500031051 +sortorder: 500031053 toc: False sidebartitle: sqlalchemy.inspection inspect meta: Python example code that shows how to use the inspect callable from the sqlalchemy.inspection module of the SQLAlchemy project. @@ -106,7 +106,137 @@ def test_should_string_convert_string(): ``` -## Example 2 from sandman2 +## Example 2 from SQLAlchemy filters +[SQLAlchemy filters](https://github.com/juliotrigo/sqlalchemy-filters) + provides filtering, sorting and pagination for [SQLAlchemy](/sqlalchemy.html) + query objects, which is particularly useful when building + [web APIs](/application-programming-interfaces.html). SQLAlchemy filters + is open sourced under the + [Apache License version 2.0](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/LICENSE). + +[**SQLAlchemy filters / sqlalchemy_filters / models.py**](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/sqlalchemy_filters/./models.py) + +```python +# models.py +from sqlalchemy.exc import InvalidRequestError +~~from sqlalchemy.inspection import inspect +from sqlalchemy.orm.mapper import Mapper +from sqlalchemy.util import symbol +import types + +from .exceptions import BadQuery, FieldNotFound, BadSpec + + +class Field(object): + + def __init__(self, model, field_name): + self.model = model + self.field_name = field_name + + def get_sqlalchemy_field(self): + if self.field_name not in self._get_valid_field_names(): + raise FieldNotFound( + 'Model {} has no column `{}`.'.format( + self.model, self.field_name + ) + ) + sqlalchemy_field = getattr(self.model, self.field_name) + + if isinstance(sqlalchemy_field, types.MethodType): + sqlalchemy_field = sqlalchemy_field() + + return sqlalchemy_field + + def _get_valid_field_names(self): +~~ inspect_mapper = inspect(self.model) + columns = inspect_mapper.columns + orm_descriptors = inspect_mapper.all_orm_descriptors + + column_names = columns.keys() + hybrid_names = [ + key for key, item in orm_descriptors.items() + if _is_hybrid_property(item) or _is_hybrid_method(item) + ] + + return set(column_names) | set(hybrid_names) + + +def _is_hybrid_property(orm_descriptor): + return orm_descriptor.extension_type == symbol('HYBRID_PROPERTY') + + +def _is_hybrid_method(orm_descriptor): + return orm_descriptor.extension_type == symbol('HYBRID_METHOD') + + +def get_query_models(query): + models = [col_desc['entity'] for col_desc in query.column_descriptions] + models.extend(mapper.class_ for mapper in query._join_entities) + + + +## ... source file continues with no further inspect examples... + +``` + + +## Example 3 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / declarative / _primary_key_mixin.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/declarative/_primary_key_mixin.py) + +```python +# _primary_key_mixin.py + + +~~from sqlalchemy.inspection import inspect + +class PrimaryKeyMixin(object): + + def _check_is_model_instance(self): + return True + + @classmethod + def get_primary_key_columns(cls): +~~ return inspect(cls).primary_key + + @classmethod + def get_primary_key_column_names(cls): + return [str(x.name) for x in cls.get_primary_key_columns()] + + @property + def primary_key_value(self): +~~ if not inspect(self).has_identity or not inspect(self).identity: + return None + +~~ primary_keys = inspect(self).identity + + if len(primary_keys) == 1: + return primary_keys[0] + + return primary_keys + + + +## ... source file continues with no further inspect examples... + +``` + + +## Example 4 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown index a3d42007b..23fc7388e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-aliased.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm aliased Example Code category: page slug: sqlalchemy-orm-aliased-examples -sortorder: 500031058 +sortorder: 500031061 toc: False sidebartitle: sqlalchemy.orm aliased meta: Python example code that shows how to use the aliased callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the aliased callable from the sq ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown index 2f4448de6..3c9860072 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-flag-modified.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.attributes flag_modified Example Code category: page slug: sqlalchemy-orm-attributes-flag-modified-examples -sortorder: 500031074 +sortorder: 500031078 toc: False sidebartitle: sqlalchemy.orm.attributes flag_modified meta: Python example code that shows how to use the flag_modified callable from the sqlalchemy.orm.attributes module of the SQLAlchemy project. @@ -10,7 +10,9 @@ meta: Python example code that shows how to use the flag_modified callable from `flag_modified` is a callable within the `sqlalchemy.orm.attributes` module of the SQLAlchemy project. InstrumentedAttribute -is another callable from the `sqlalchemy.orm.attributes` package with code examples. +and +QueryableAttribute +are a couple of other callables within the `sqlalchemy.orm.attributes` package that also have code examples. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown index 989d5ceba..1283d4c51 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.attributes InstrumentedAttribute Example Code category: page slug: sqlalchemy-orm-attributes-instrumentedattribute-examples -sortorder: 500031073 +sortorder: 500031076 toc: False sidebartitle: sqlalchemy.orm.attributes InstrumentedAttribute meta: Example code for understanding how to use the InstrumentedAttribute class from the sqlalchemy.orm.attributes module of the SQLAlchemy project. @@ -9,8 +9,10 @@ meta: Example code for understanding how to use the InstrumentedAttribute class `InstrumentedAttribute` is a class within the `sqlalchemy.orm.attributes` module of the SQLAlchemy project. +QueryableAttribute +and flag_modified -is another callable from the `sqlalchemy.orm.attributes` package with code examples. +are a couple of other callables within the `sqlalchemy.orm.attributes` package that also have code examples. ## Example 1 from SQLAlchemy Mixins [SQLAlchemy Mixins](https://github.com/absent1706/sqlalchemy-mixins) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-queryableattribute.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-queryableattribute.markdown new file mode 100644 index 000000000..6cddccc55 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-queryableattribute.markdown @@ -0,0 +1,69 @@ +title: sqlalchemy.orm.attributes QueryableAttribute Example Code +category: page +slug: sqlalchemy-orm-attributes-queryableattribute-examples +sortorder: 500031077 +toc: False +sidebartitle: sqlalchemy.orm.attributes QueryableAttribute +meta: Example code for understanding how to use the QueryableAttribute class from the sqlalchemy.orm.attributes module of the SQLAlchemy project. + + +`QueryableAttribute` is a class within the `sqlalchemy.orm.attributes` module of the SQLAlchemy project. + +InstrumentedAttribute +and +flag_modified +are a couple of other callables within the `sqlalchemy.orm.attributes` package that also have code examples. + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / attributes.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./attributes.py) + +```python +# attributes.py + + +~~from sqlalchemy.orm.attributes import QueryableAttribute as SA_QueryableAttribute +from sqlalchemy import util + +from validator_collection import validators, checkers + +from sqlathanor._serialization_support import SerializationMixin +from sqlathanor.utilities import bool_to_tuple, callable_to_dict + + +BLANK_ON_SERIALIZE = { + 'csv': None, + 'json': None, + 'yaml': None, + 'dict': None +} + + +class AttributeConfiguration(SerializationMixin): + + def __init__(self, + *args, + **kwargs): + object.__setattr__(self, '_dict_proxy', {}) + self._current = -1 + self._name = None + + +## ... source file continues with no further QueryableAttribute examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown index 2fd008e1b..a03177b3f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm attributes Example Code category: page slug: sqlalchemy-orm-attributes-examples -sortorder: 500031059 +sortorder: 500031062 toc: False sidebartitle: sqlalchemy.orm attributes meta: Python example code that shows how to use the attributes callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the attributes callable from the ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown index b13863457..976a36212 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-backref.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm backref Example Code category: page slug: sqlalchemy-orm-backref-examples -sortorder: 500031060 +sortorder: 500031063 toc: False sidebartitle: sqlalchemy.orm backref meta: Python example code that shows how to use the backref callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the backref callable from the sq ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown index 5f31b5474..052598f8b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-class-mapper.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm class_mapper Example Code category: page slug: sqlalchemy-orm-class-mapper-examples -sortorder: 500031061 +sortorder: 500031064 toc: False sidebartitle: sqlalchemy.orm class_mapper meta: Python example code that shows how to use the class_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the class_mapper callable from t ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown index 4c5dd2a8a..cc3017f82 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-collections-instrumentedlist.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.collections InstrumentedList Example Code category: page slug: sqlalchemy-orm-collections-instrumentedlist-examples -sortorder: 500031075 +sortorder: 500031079 toc: False sidebartitle: sqlalchemy.orm.collections InstrumentedList meta: Example code for understanding how to use the InstrumentedList class from the sqlalchemy.orm.collections module of the SQLAlchemy project. @@ -95,3 +95,62 @@ def instrumented_list(f): ``` + +## Example 2 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / utilities.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./utilities.py) + +```python +# utilities.py + +import csv +import linecache +import warnings +import yaml +from collections import OrderedDict + +~~from sqlalchemy.orm.collections import InstrumentedList +from sqlalchemy.exc import InvalidRequestError as SA_InvalidRequestError +from sqlalchemy.exc import UnsupportedCompilationError as SA_UnsupportedCompilationError + +from validator_collection import validators, checkers +from validator_collection.errors import NotAnIterableError + +from sqlathanor._compat import json, is_py2, is_py36, is_py35, dict as dict_ +from sqlathanor.errors import InvalidFormatError, UnsupportedSerializationError, \ + UnsupportedDeserializationError, MaximumNestingExceededError, \ + MaximumNestingExceededWarning, DeserializationError, CSVStructureError + +UTILITY_COLUMNS = [ + 'metadata', + 'primary_key_value', + '_decl_class_registry', + '_sa_instance_state', + '_sa_class_manager' +] + +def bool_to_tuple(input): + + if input is True: + input = (True, True) + elif not input: + + +## ... source file continues with no further InstrumentedList examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown index 8057afd94..c8b6ef253 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-column-property.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm column_property Example Code category: page slug: sqlalchemy-orm-column-property-examples -sortorder: 500031062 +sortorder: 500031065 toc: False sidebartitle: sqlalchemy.orm column_property meta: Python example code that shows how to use the column_property callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the column_property callable fro ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown index e4a0c98df..b96af0043 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-columnproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm ColumnProperty Example Code category: page slug: sqlalchemy-orm-columnproperty-examples -sortorder: 500031052 +sortorder: 500031054 toc: False sidebartitle: sqlalchemy.orm ColumnProperty meta: Example code for understanding how to use the ColumnProperty class from the sqlalchemy.orm module of the SQLAlchemy project. @@ -10,6 +10,7 @@ meta: Example code for understanding how to use the ColumnProperty class from th `ColumnProperty` is a class within the `sqlalchemy.orm` module of the SQLAlchemy project. CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown index 3a9cf6a7d..3848c031f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-composite.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm composite Example Code category: page slug: sqlalchemy-orm-composite-examples -sortorder: 500031063 +sortorder: 500031066 toc: False sidebartitle: sqlalchemy.orm composite meta: Python example code that shows how to use the composite callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the composite callable from the ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown index 896e7b00e..a1843a7bd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-compositeproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm CompositeProperty Example Code category: page slug: sqlalchemy-orm-compositeproperty-examples -sortorder: 500031053 +sortorder: 500031055 toc: False sidebartitle: sqlalchemy.orm CompositeProperty meta: Example code for understanding how to use the CompositeProperty class from the sqlalchemy.orm module of the SQLAlchemy project. @@ -10,6 +10,7 @@ meta: Example code for understanding how to use the CompositeProperty class from `CompositeProperty` is a class within the `sqlalchemy.orm` module of the SQLAlchemy project. ColumnProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown index 3a0633a1d..ecfd4dc6c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-noresultfound.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc NoResultFound Example Code category: page slug: sqlalchemy-orm-exc-noresultfound-examples -sortorder: 500031076 +sortorder: 500031080 toc: False sidebartitle: sqlalchemy.orm.exc NoResultFound meta: Example code for understanding how to use the NoResultFound class from the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown index df4f4889e..8e565fa42 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedclasserror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc UnmappedClassError Example Code category: page slug: sqlalchemy-orm-exc-unmappedclasserror-examples -sortorder: 500031077 +sortorder: 500031081 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedClassError meta: Example code for understanding how to use the UnmappedClassError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown index d5cadf45f..dd9ae4940 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-exc-unmappedinstanceerror.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.exc UnmappedInstanceError Example Code category: page slug: sqlalchemy-orm-exc-unmappedinstanceerror-examples -sortorder: 500031078 +sortorder: 500031082 toc: False sidebartitle: sqlalchemy.orm.exc UnmappedInstanceError meta: Example code for understanding how to use the UnmappedInstanceError class from the sqlalchemy.orm.exc module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown index bab3cdad8..fdae687dd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-mapperproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.interfaces MapperProperty Example Code category: page slug: sqlalchemy-orm-interfaces-mapperproperty-examples -sortorder: 500031079 +sortorder: 500031083 toc: False sidebartitle: sqlalchemy.orm.interfaces MapperProperty meta: Example code for understanding how to use the MapperProperty class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown index 540e90bb3..22c3e587f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces-propcomparator.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.interfaces PropComparator Example Code category: page slug: sqlalchemy-orm-interfaces-propcomparator-examples -sortorder: 500031080 +sortorder: 500031084 toc: False sidebartitle: sqlalchemy.orm.interfaces PropComparator meta: Example code for understanding how to use the PropComparator class from the sqlalchemy.orm.interfaces module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown index 9d2fe6d85..7d4e310ce 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-interfaces.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm interfaces Example Code category: page slug: sqlalchemy-orm-interfaces-examples -sortorder: 500031064 +sortorder: 500031067 toc: False sidebartitle: sqlalchemy.orm interfaces meta: Python example code that shows how to use the interfaces callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the interfaces callable from the ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-load.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-load.markdown new file mode 100644 index 000000000..658b1699e --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-load.markdown @@ -0,0 +1,113 @@ +title: sqlalchemy.orm Load Example Code +category: page +slug: sqlalchemy-orm-load-examples +sortorder: 500031056 +toc: False +sidebartitle: sqlalchemy.orm Load +meta: Example code for understanding how to use the Load class from the sqlalchemy.orm module of the SQLAlchemy project. + + +`Load` is a class within the `sqlalchemy.orm` module of the SQLAlchemy project. + +ColumnProperty, +CompositeProperty, +Mapper, +Query, +RelationshipProperty, +Session, +SynonymProperty, +aliased, +attributes, +backref, +class_mapper, +column_property, +composite, +interfaces, +mapper, +mapperlib, +object_mapper, +object_session, +query, +relationship, +session, +sessionmaker, +and strategies +are several other callables with code examples from the same `sqlalchemy.orm` package. + +## Example 1 from SQLAlchemy filters +[SQLAlchemy filters](https://github.com/juliotrigo/sqlalchemy-filters) + provides filtering, sorting and pagination for [SQLAlchemy](/sqlalchemy.html) + query objects, which is particularly useful when building + [web APIs](/application-programming-interfaces.html). SQLAlchemy filters + is open sourced under the + [Apache License version 2.0](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/LICENSE). + +[**SQLAlchemy filters / sqlalchemy_filters / loads.py**](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/sqlalchemy_filters/./loads.py) + +```python +# loads.py +~~from sqlalchemy.orm import Load + +from .exceptions import BadLoadFormat +from .models import Field, auto_join, get_model_from_spec, get_default_model + + +class LoadOnly(object): + + def __init__(self, load_spec): + self.load_spec = load_spec + + try: + field_names = load_spec['fields'] + except KeyError: + raise BadLoadFormat('`fields` is a mandatory attribute.') + except TypeError: + raise BadLoadFormat( + 'Load spec `{}` should be a dictionary.'.format(load_spec) + ) + + self.field_names = field_names + + def get_named_models(self): + if "model" in self.load_spec: + return {self.load_spec['model']} + return set() + + def format_for_sqlalchemy(self, query, default_model): + load_spec = self.load_spec + field_names = self.field_names + + model = get_model_from_spec(load_spec, query, default_model) + fields = [Field(model, field_name) for field_name in field_names] + +~~ return Load(model).load_only( + *[field.get_sqlalchemy_field() for field in fields] + ) + + +def get_named_models(loads): + models = set() + for load in loads: + models.update(load.get_named_models()) + return models + + +def apply_loads(query, load_spec): + if ( + isinstance(load_spec, list) and + all(map(lambda item: isinstance(item, str), load_spec)) + ): + load_spec = {'fields': load_spec} + + if isinstance(load_spec, dict): + load_spec = [load_spec] + + loads = [LoadOnly(item) for item in load_spec] + + default_model = get_default_model(query) + + +## ... source file continues with no further Load examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper-mapper.markdown new file mode 100644 index 000000000..6da851f1f --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper-mapper.markdown @@ -0,0 +1,58 @@ +title: sqlalchemy.orm.mapper Mapper Example Code +category: page +slug: sqlalchemy-orm-mapper-mapper-examples +sortorder: 500031085 +toc: False +sidebartitle: sqlalchemy.orm.mapper Mapper +meta: Example code for understanding how to use the Mapper class from the sqlalchemy.orm.mapper module of the SQLAlchemy project. + + +`Mapper` is a class within the `sqlalchemy.orm.mapper` module of the SQLAlchemy project. + + + +## Example 1 from SQLAlchemy filters +[SQLAlchemy filters](https://github.com/juliotrigo/sqlalchemy-filters) + provides filtering, sorting and pagination for [SQLAlchemy](/sqlalchemy.html) + query objects, which is particularly useful when building + [web APIs](/application-programming-interfaces.html). SQLAlchemy filters + is open sourced under the + [Apache License version 2.0](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/LICENSE). + +[**SQLAlchemy filters / sqlalchemy_filters / models.py**](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/sqlalchemy_filters/./models.py) + +```python +# models.py +from sqlalchemy.exc import InvalidRequestError +from sqlalchemy.inspection import inspect +~~from sqlalchemy.orm.mapper import Mapper +from sqlalchemy.util import symbol +import types + +from .exceptions import BadQuery, FieldNotFound, BadSpec + + +class Field(object): + + def __init__(self, model, field_name): + self.model = model + self.field_name = field_name + + def get_sqlalchemy_field(self): + if self.field_name not in self._get_valid_field_names(): + raise FieldNotFound( + 'Model {} has no column `{}`.'.format( + self.model, self.field_name + ) + ) + sqlalchemy_field = getattr(self.model, self.field_name) + + if isinstance(sqlalchemy_field, types.MethodType): + sqlalchemy_field = sqlalchemy_field() + + + +## ... source file continues with no further Mapper examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown index 08770b09a..6b04b11cd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapper.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm mapper Example Code category: page slug: sqlalchemy-orm-mapper-examples -sortorder: 500031065 +sortorder: 500031068 toc: False sidebartitle: sqlalchemy.orm mapper meta: Python example code that shows how to use the mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the mapper callable from the sql ColumnProperty, CompositeProperty, +Load, Query, RelationshipProperty, Session, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown index 70597d69a..7b567fffa 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-mapperlib.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm mapperlib Example Code category: page slug: sqlalchemy-orm-mapperlib-examples -sortorder: 500031066 +sortorder: 500031069 toc: False sidebartitle: sqlalchemy.orm mapperlib meta: Python example code that shows how to use the mapperlib callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the mapperlib callable from the ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown index 29e854885..198598aa2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-mapper.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm object_mapper Example Code category: page slug: sqlalchemy-orm-object-mapper-examples -sortorder: 500031067 +sortorder: 500031070 toc: False sidebartitle: sqlalchemy.orm object_mapper meta: Python example code that shows how to use the object_mapper callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the object_mapper callable from ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown index eeb1d69c7..39fe0cb34 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-object-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm object_session Example Code category: page slug: sqlalchemy-orm-object-session-examples -sortorder: 500031068 +sortorder: 500031071 toc: False sidebartitle: sqlalchemy.orm object_session meta: Python example code that shows how to use the object_session callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the object_session callable from ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown index dc989d992..5023c939e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.properties ColumnProperty Example Code category: page slug: sqlalchemy-orm-properties-columnproperty-examples -sortorder: 500031081 +sortorder: 500031086 toc: False sidebartitle: sqlalchemy.orm.properties ColumnProperty meta: Example code for understanding how to use the ColumnProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown index b1220efe5..a0f42a173 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-relationshipproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.properties RelationshipProperty Example Code category: page slug: sqlalchemy-orm-properties-relationshipproperty-examples -sortorder: 500031082 +sortorder: 500031087 toc: False sidebartitle: sqlalchemy.orm.properties RelationshipProperty meta: Example code for understanding how to use the RelationshipProperty class from the sqlalchemy.orm.properties module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown index 342889cea..4963c60c4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-query.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.query Query Example Code category: page slug: sqlalchemy-orm-query-query-examples -sortorder: 500031083 +sortorder: 500031088 toc: False sidebartitle: sqlalchemy.orm.query Query meta: Example code for understanding how to use the Query class from the sqlalchemy.orm.query module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown index 06476bcd8..3e8a4f02b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query-querycontext.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.query QueryContext Example Code category: page slug: sqlalchemy-orm-query-querycontext-examples -sortorder: 500031084 +sortorder: 500031089 toc: False sidebartitle: sqlalchemy.orm.query QueryContext meta: Example code for understanding how to use the QueryContext class from the sqlalchemy.orm.query module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown index dac8a7696..55773f5e6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-query.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm Query Example Code category: page slug: sqlalchemy-orm-query-examples -sortorder: 500031054 +sortorder: 500031057 toc: False sidebartitle: sqlalchemy.orm Query meta: Example code for understanding how to use the Query class from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Example code for understanding how to use the Query class from the sqlalch ColumnProperty, CompositeProperty, +Load, Mapper, RelationshipProperty, Session, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown index da8e8c5a0..046e5cc97 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationship.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm relationship Example Code category: page slug: sqlalchemy-orm-relationship-examples -sortorder: 500031069 +sortorder: 500031072 toc: False sidebartitle: sqlalchemy.orm relationship meta: Python example code that shows how to use the relationship callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the relationship callable from t ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown index 62a1e052c..5466fa762 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationshipproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm RelationshipProperty Example Code category: page slug: sqlalchemy-orm-relationshipproperty-examples -sortorder: 500031055 +sortorder: 500031058 toc: False sidebartitle: sqlalchemy.orm RelationshipProperty meta: Example code for understanding how to use the RelationshipProperty class from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Example code for understanding how to use the RelationshipProperty class f ColumnProperty, CompositeProperty, +Load, Mapper, Query, Session, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationships-relationshipproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationships-relationshipproperty.markdown new file mode 100644 index 000000000..8812fdf8f --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-relationships-relationshipproperty.markdown @@ -0,0 +1,186 @@ +title: sqlalchemy.orm.relationships RelationshipProperty Example Code +category: page +slug: sqlalchemy-orm-relationships-relationshipproperty-examples +sortorder: 500031090 +toc: False +sidebartitle: sqlalchemy.orm.relationships RelationshipProperty +meta: Example code for understanding how to use the RelationshipProperty class from the sqlalchemy.orm.relationships module of the SQLAlchemy project. + + +`RelationshipProperty` is a class within the `sqlalchemy.orm.relationships` module of the SQLAlchemy project. + + + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / schema.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./schema.py) + +```python +# schema.py + + +import functools +import operator + +from sqlalchemy import Column as SA_Column +from sqlalchemy import Table as SA_Table +from sqlalchemy.orm import class_mapper +~~from sqlalchemy.orm.relationships import RelationshipProperty as SA_RelationshipProperty +from sqlalchemy.util.langhelpers import public_factory +from sqlalchemy.ext.hybrid import hybrid_property as SA_hybrid_property + +from sqlalchemy import exc, orm, util, inspect + + +from validator_collection import checkers, validators + +from sqlathanor import attributes +from sqlathanor._serialization_support import SerializationMixin +from sqlathanor.default_deserializers import get_type_mapping +from sqlathanor.utilities import parse_json, parse_yaml, parse_csv, read_csv_data +from sqlathanor.errors import SQLAthanorError + + +class Column(SerializationMixin, SA_Column): + + + def __init__(self, *args, **kwargs): + super(Column, self).__init__(*args, **kwargs) + + +~~class RelationshipProperty(SA_RelationshipProperty): + + def __init__(self, + argument, + supports_json = False, + supports_yaml = False, + supports_dict = False, + on_serialize = None, + on_deserialize = None, + **kwargs): + if on_serialize is not None and not isinstance(on_serialize, dict): + on_serialize = { + 'csv': on_serialize, + 'json': on_serialize, + 'yaml': on_serialize, + 'dict': on_serialize + } + elif on_serialize is not None: + if 'csv' not in on_serialize: + on_serialize['csv'] = None + if 'json' not in on_serialize: + on_serialize['json'] = None + if 'yaml' not in on_serialize: + on_serialize['yaml'] = None + if 'dict' not in on_serialize: + + +## ... source file abbreviated to get to RelationshipProperty examples ... + + + raise SQLAthanorError('on_deserialize for %s must be callable' % key) + + if supports_json is True: + supports_json = (True, True) + elif not supports_json: + supports_json = (False, False) + + if supports_yaml is True: + supports_yaml = (True, True) + elif not supports_yaml: + supports_yaml = (False, False) + + if supports_dict is True: + supports_dict = (True, True) + elif not supports_dict: + supports_dict = (False, False) + + self.supports_csv = (False, False) + self.csv_sequence = None + self.supports_json = supports_json + self.supports_yaml = supports_yaml + self.supports_dict = supports_dict + self.on_serialize = on_serialize + self.on_deserialize = on_deserialize + +~~ comparator_factory = kwargs.pop('comparator_factory', RelationshipProperty.Comparator) + +~~ super(RelationshipProperty, self).__init__(argument, + comparator_factory = comparator_factory, + **kwargs) + + class Comparator(SA_RelationshipProperty.Comparator): + @property + def supports_csv(self): + return self.prop.supports_csv + + @property + def csv_sequence(self): + return self.prop.csv_sequence + + @property + def supports_json(self): + return self.prop.supports_json + + @property + def supports_yaml(self): + return self.prop.supports_yaml + + @property + def supports_dict(self): + return self.prop.supports_dict + + @property + def on_serialize(self): + return self.prop.on_serialize + + @property + def on_deserialize(self): + return self.prop.on_deserialize + + +~~relationship = public_factory(RelationshipProperty, ".orm.relationship") + + +class Table(SA_Table): + + + def __init__(self, *args, **kwargs): + super(Table, self).__init__(*args, **kwargs) + + @classmethod + def from_dict(cls, + serialized, + tablename, + metadata, + primary_key, + column_kwargs = None, + skip_nested = True, + default_to_str = False, + type_mapping = None, + **kwargs): + if not isinstance(serialized, dict): + raise ValueError('serialized must be a dict') + + if not serialized: + raise ValueError('serialized cannot be empty') + + +## ... source file continues with no further RelationshipProperty examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown index 76c389590..719d25f15 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-object-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.session object_session Example Code category: page slug: sqlalchemy-orm-session-object-session-examples -sortorder: 500031086 +sortorder: 500031092 toc: False sidebartitle: sqlalchemy.orm.session object_session meta: Python example code that shows how to use the object_session callable from the sqlalchemy.orm.session module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown index 0a195ade1..d2c37bda9 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.session Session Example Code category: page slug: sqlalchemy-orm-session-session-examples -sortorder: 500031085 +sortorder: 500031091 toc: False sidebartitle: sqlalchemy.orm.session Session meta: Example code for understanding how to use the Session class from the sqlalchemy.orm.session module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown index 0c49626c2..6145c36ab 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-session.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm session Example Code category: page slug: sqlalchemy-orm-session-examples -sortorder: 500031070 +sortorder: 500031073 toc: False sidebartitle: sqlalchemy.orm session meta: Python example code that shows how to use the session callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the session callable from the sq ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown index d7e6b0079..b0c85e19f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-sessionmaker.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm sessionmaker Example Code category: page slug: sqlalchemy-orm-sessionmaker-examples -sortorder: 500031071 +sortorder: 500031074 toc: False sidebartitle: sqlalchemy.orm sessionmaker meta: Python example code that shows how to use the sessionmaker callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the sessionmaker callable from t ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown index 2f9630cd1..6d6bf87e3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-strategies.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm strategies Example Code category: page slug: sqlalchemy-orm-strategies-examples -sortorder: 500031072 +sortorder: 500031075 toc: False sidebartitle: sqlalchemy.orm strategies meta: Python example code that shows how to use the strategies callable from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the strategies callable from the ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown index 45c841d40..2fa640302 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-synonymproperty.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm SynonymProperty Example Code category: page slug: sqlalchemy-orm-synonymproperty-examples -sortorder: 500031057 +sortorder: 500031060 toc: False sidebartitle: sqlalchemy.orm SynonymProperty meta: Example code for understanding how to use the SynonymProperty class from the sqlalchemy.orm module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Example code for understanding how to use the SynonymProperty class from t ColumnProperty, CompositeProperty, +Load, Mapper, Query, RelationshipProperty, diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown index 27381751f..d971263db 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedclass.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.util AliasedClass Example Code category: page slug: sqlalchemy-orm-util-aliasedclass-examples -sortorder: 500031087 +sortorder: 500031093 toc: False sidebartitle: sqlalchemy.orm.util AliasedClass meta: Example code for understanding how to use the AliasedClass class from the sqlalchemy.orm.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown index 4a53be8b3..041837312 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-aliasedinsp.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.util AliasedInsp Example Code category: page slug: sqlalchemy-orm-util-aliasedinsp-examples -sortorder: 500031088 +sortorder: 500031094 toc: False sidebartitle: sqlalchemy.orm.util AliasedInsp meta: Example code for understanding how to use the AliasedInsp class from the sqlalchemy.orm.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown index f0b125c68..abd9ec301 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.orm.util identity_key Example Code category: page slug: sqlalchemy-orm-util-identity-key-examples -sortorder: 500031089 +sortorder: 500031095 toc: False sidebartitle: sqlalchemy.orm.util identity_key meta: Python example code that shows how to use the identity_key callable from the sqlalchemy.orm.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown index 808964a24..be8bb61d5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.pool NullPool Example Code category: page slug: sqlalchemy-pool-nullpool-examples -sortorder: 500031090 +sortorder: 500031096 toc: False sidebartitle: sqlalchemy.pool NullPool meta: Example code for understanding how to use the NullPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown index 3b5cf9e49..89e7bcaf5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.pool StaticPool Example Code category: page slug: sqlalchemy-pool-staticpool-examples -sortorder: 500031091 +sortorder: 500031097 toc: False sidebartitle: sqlalchemy.pool StaticPool meta: Example code for understanding how to use the StaticPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown index d05459be8..7f6cf9824 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CheckConstraint Example Code category: page slug: sqlalchemy-schema-checkconstraint-examples -sortorder: 500031092 +sortorder: 500031098 toc: False sidebartitle: sqlalchemy.schema CheckConstraint meta: Example code for understanding how to use the CheckConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown index c6994daee..3a2d9d096 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Column Example Code category: page slug: sqlalchemy-schema-column-examples -sortorder: 500031093 +sortorder: 500031099 toc: False sidebartitle: sqlalchemy.schema Column meta: Example code for understanding how to use the Column class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown index 758608425..9da2134c0 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CreateIndex Example Code category: page slug: sqlalchemy-schema-createindex-examples -sortorder: 500031094 +sortorder: 500031100 toc: False sidebartitle: sqlalchemy.schema CreateIndex meta: Example code for understanding how to use the CreateIndex class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown index d10ce17ba..9b7c802d7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CreateTable Example Code category: page slug: sqlalchemy-schema-createtable-examples -sortorder: 500031095 +sortorder: 500031101 toc: False sidebartitle: sqlalchemy.schema CreateTable meta: Example code for understanding how to use the CreateTable class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown index d332a7c71..b848e2e8b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema DDLElement Example Code category: page slug: sqlalchemy-schema-ddlelement-examples -sortorder: 500031096 +sortorder: 500031102 toc: False sidebartitle: sqlalchemy.schema DDLElement meta: Example code for understanding how to use the DDLElement class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown index 339885008..da732a5cc 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema ForeignKey Example Code category: page slug: sqlalchemy-schema-foreignkey-examples -sortorder: 500031097 +sortorder: 500031103 toc: False sidebartitle: sqlalchemy.schema ForeignKey meta: Example code for understanding how to use the ForeignKey class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown index 9b2d3532f..813e5add4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema ForeignKeyConstraint Example Code category: page slug: sqlalchemy-schema-foreignkeyconstraint-examples -sortorder: 500031098 +sortorder: 500031104 toc: False sidebartitle: sqlalchemy.schema ForeignKeyConstraint meta: Example code for understanding how to use the ForeignKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-index.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-index.markdown index 938cc7d61..b7807b814 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-index.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-index.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Index Example Code category: page slug: sqlalchemy-schema-index-examples -sortorder: 500031099 +sortorder: 500031105 toc: False sidebartitle: sqlalchemy.schema Index meta: Example code for understanding how to use the Index class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown index d4bf1cba8..99ddc1e37 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema PrimaryKeyConstraint Example Code category: page slug: sqlalchemy-schema-primarykeyconstraint-examples -sortorder: 500031100 +sortorder: 500031106 toc: False sidebartitle: sqlalchemy.schema PrimaryKeyConstraint meta: Example code for understanding how to use the PrimaryKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown index 0ee107243..8640cb326 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Table Example Code category: page slug: sqlalchemy-schema-table-examples -sortorder: 500031101 +sortorder: 500031107 toc: False sidebartitle: sqlalchemy.schema Table meta: Example code for understanding how to use the Table class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown index 5dfc8fef5..cfcb294f2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql ClauseElement Example Code category: page slug: sqlalchemy-sql-clauseelement-examples -sortorder: 500031102 +sortorder: 500031108 toc: False sidebartitle: sqlalchemy.sql ClauseElement meta: Example code for understanding how to use the ClauseElement class from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown index 29865743b..4f9f90aff 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql column Example Code category: page slug: sqlalchemy-sql-column-examples -sortorder: 500031103 +sortorder: 500031109 toc: False sidebartitle: sqlalchemy.sql column meta: Python example code that shows how to use the column callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-compiler-sqlcompiler.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-compiler-sqlcompiler.markdown index d31e2daea..24aa0e08d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-compiler-sqlcompiler.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-compiler-sqlcompiler.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.compiler SQLCompiler Example Code category: page slug: sqlalchemy-sql-compiler-sqlcompiler-examples -sortorder: 500031112 +sortorder: 500031118 toc: False sidebartitle: sqlalchemy.sql.compiler SQLCompiler meta: Example code for understanding how to use the SQLCompiler class from the sqlalchemy.sql.compiler module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown index b7af7cc08..a65b10493 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.elements ColumnElement Example Code category: page slug: sqlalchemy-sql-elements-columnelement-examples -sortorder: 500031113 +sortorder: 500031119 toc: False sidebartitle: sqlalchemy.sql.elements ColumnElement meta: Example code for understanding how to use the ColumnElement class from the sqlalchemy.sql.elements module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown index ec89ca0ae..fe52fa492 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.elements Label Example Code category: page slug: sqlalchemy-sql-elements-label-examples -sortorder: 500031114 +sortorder: 500031120 toc: False sidebartitle: sqlalchemy.sql.elements Label meta: Example code for understanding how to use the Label class from the sqlalchemy.sql.elements module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown index 5dc049a3a..0c2a31279 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ClauseElement Example Code category: page slug: sqlalchemy-sql-expression-clauseelement-examples -sortorder: 500031115 +sortorder: 500031121 toc: False sidebartitle: sqlalchemy.sql.expression ClauseElement meta: Example code for understanding how to use the ClauseElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown index 793890933..6684cd644 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ColumnClause Example Code category: page slug: sqlalchemy-sql-expression-columnclause-examples -sortorder: 500031116 +sortorder: 500031122 toc: False sidebartitle: sqlalchemy.sql.expression ColumnClause meta: Example code for understanding how to use the ColumnClause class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown index a2bb147f9..ea587137d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ColumnElement Example Code category: page slug: sqlalchemy-sql-expression-columnelement-examples -sortorder: 500031117 +sortorder: 500031123 toc: False sidebartitle: sqlalchemy.sql.expression ColumnElement meta: Example code for understanding how to use the ColumnElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown index 6af537d04..f12f928a2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression Executable Example Code category: page slug: sqlalchemy-sql-expression-executable-examples -sortorder: 500031118 +sortorder: 500031124 toc: False sidebartitle: sqlalchemy.sql.expression Executable meta: Example code for understanding how to use the Executable class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown index f589bb024..4a9d94c0e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression FunctionElement Example Code category: page slug: sqlalchemy-sql-expression-functionelement-examples -sortorder: 500031119 +sortorder: 500031125 toc: False sidebartitle: sqlalchemy.sql.expression FunctionElement meta: Example code for understanding how to use the FunctionElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown index 6eae35644..3eabb755d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression UnaryExpression Example Code category: page slug: sqlalchemy-sql-expression-unaryexpression-examples -sortorder: 500031120 +sortorder: 500031126 toc: False sidebartitle: sqlalchemy.sql.expression UnaryExpression meta: Example code for understanding how to use the UnaryExpression class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown index 5b5b6c259..ea70ede10 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql expression Example Code category: page slug: sqlalchemy-sql-expression-examples -sortorder: 500031104 +sortorder: 500031110 toc: False sidebartitle: sqlalchemy.sql expression meta: Python example code that shows how to use the expression callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown index 235342e73..8a8bae618 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql extract Example Code category: page slug: sqlalchemy-sql-extract-examples -sortorder: 500031105 +sortorder: 500031111 toc: False sidebartitle: sqlalchemy.sql extract meta: Python example code that shows how to use the extract callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown index 7452010c3..f372489d3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.functions FunctionElement Example Code category: page slug: sqlalchemy-sql-functions-functionelement-examples -sortorder: 500031121 +sortorder: 500031127 toc: False sidebartitle: sqlalchemy.sql.functions FunctionElement meta: Example code for understanding how to use the FunctionElement class from the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown index 3db638438..fb73febd8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.functions GenericFunction Example Code category: page slug: sqlalchemy-sql-functions-genericfunction-examples -sortorder: 500031122 +sortorder: 500031128 toc: False sidebartitle: sqlalchemy.sql.functions GenericFunction meta: Example code for understanding how to use the GenericFunction class from the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown index 4b51c9f08..45c8d808e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql functions Example Code category: page slug: sqlalchemy-sql-functions-examples -sortorder: 500031106 +sortorder: 500031112 toc: False sidebartitle: sqlalchemy.sql functions meta: Python example code that shows how to use the functions callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown index 61b3d773c..bcb154186 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.naming conv Example Code category: page slug: sqlalchemy-sql-naming-conv-examples -sortorder: 500031123 +sortorder: 500031129 toc: False sidebartitle: sqlalchemy.sql.naming conv meta: Python example code that shows how to use the conv callable from the sqlalchemy.sql.naming module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown index 93fbc68e1..9af0e7212 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql operators Example Code category: page slug: sqlalchemy-sql-operators-examples -sortorder: 500031107 +sortorder: 500031113 toc: False sidebartitle: sqlalchemy.sql operators meta: Python example code that shows how to use the operators callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown index 2fa118840..da5ef47ef 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.schema Column Example Code category: page slug: sqlalchemy-sql-schema-column-examples -sortorder: 500031124 +sortorder: 500031130 toc: False sidebartitle: sqlalchemy.sql.schema Column meta: Example code for understanding how to use the Column class from the sqlalchemy.sql.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown index c80626840..870442e75 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.schema SchemaItem Example Code category: page slug: sqlalchemy-sql-schema-schemaitem-examples -sortorder: 500031125 +sortorder: 500031131 toc: False sidebartitle: sqlalchemy.sql.schema SchemaItem meta: Example code for understanding how to use the SchemaItem class from the sqlalchemy.sql.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown index 8ad866d11..93157e8b5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql schema Example Code category: page slug: sqlalchemy-sql-schema-examples -sortorder: 500031108 +sortorder: 500031114 toc: False sidebartitle: sqlalchemy.sql schema meta: Python example code that shows how to use the schema callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown index 88909de21..93a7cde3c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql select Example Code category: page slug: sqlalchemy-sql-select-examples -sortorder: 500031109 +sortorder: 500031115 toc: False sidebartitle: sqlalchemy.sql select meta: Python example code that shows how to use the select callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown index 467ece6a9..65e3dc2f4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.sqltypes NullType Example Code category: page slug: sqlalchemy-sql-sqltypes-nulltype-examples -sortorder: 500031126 +sortorder: 500031132 toc: False sidebartitle: sqlalchemy.sql.sqltypes NullType meta: Example code for understanding how to use the NullType class from the sqlalchemy.sql.sqltypes module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown index 5235cce35..57ca3c501 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql sqltypes Example Code category: page slug: sqlalchemy-sql-sqltypes-examples -sortorder: 500031110 +sortorder: 500031116 toc: False sidebartitle: sqlalchemy.sql sqltypes meta: Python example code that shows how to use the sqltypes callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown index 15e36fa9c..aa1b77129 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql table Example Code category: page slug: sqlalchemy-sql-table-examples -sortorder: 500031111 +sortorder: 500031117 toc: False sidebartitle: sqlalchemy.sql table meta: Python example code that shows how to use the table callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown index 4fcd38d81..3e109aa04 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.util ClauseAdapter Example Code category: page slug: sqlalchemy-sql-util-clauseadapter-examples -sortorder: 500031127 +sortorder: 500031133 toc: False sidebartitle: sqlalchemy.sql.util ClauseAdapter meta: Example code for understanding how to use the ClauseAdapter class from the sqlalchemy.sql.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown index 6c2e99112..383be298e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.visitors traverse Example Code category: page slug: sqlalchemy-sql-visitors-traverse-examples -sortorder: 500031128 +sortorder: 500031134 toc: False sidebartitle: sqlalchemy.sql.visitors traverse meta: Python example code that shows how to use the traverse callable from the sqlalchemy.sql.visitors module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown index ba1846ec6..947dfc426 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Boolean Example Code category: page slug: sqlalchemy-types-boolean-examples -sortorder: 500031129 +sortorder: 500031135 toc: False sidebartitle: sqlalchemy.types Boolean meta: Example code for understanding how to use the Boolean class from the sqlalchemy.types module of the SQLAlchemy project. @@ -10,12 +10,23 @@ meta: Example code for understanding how to use the Boolean class from the sqlal `Boolean` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. Boolean, +DATE, +DATETIME, +Date, +DateTime, Enum, +FLOAT, +Float, INTEGER, Integer, +Interval, NULLTYPE, NullType, String, +TEXT, +TIME, +Text, +Time, TypeEngine, UserDefinedType, and to_instance @@ -139,3 +150,67 @@ _re_invalid_identifier = re.compile(r'[^a-zA-Z0-9_]' if sys.version_info[0] < 3 ``` + +## Example 2 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / default_deserializers.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./default_deserializers.py) + +```python +# default_deserializers.py + + +import datetime +import io + +from validator_collection import validators, checkers + +from sqlathanor._compat import json +from sqlathanor.utilities import format_to_tuple, get_class_type_key, \ + raise_UnsupportedSerializationError, raise_UnsupportedDeserializationError +from sqlathanor.errors import UnsupportedValueTypeError + +~~from sqlalchemy.types import Boolean, Date, DateTime, Float, Integer, Text, Time, Interval + +DEFAULT_PYTHON_SQL_TYPE_MAPPING = { + 'bool': Boolean, + 'str': Text, + 'int': Integer, + 'float': Float, + 'datetime': DateTime, + 'date': Date, + 'time': Time, + 'timedelta': Interval +} + +def get_default_deserializer(class_attribute = None, + format = None): + format_to_tuple(format) + format = format.lower() + + class_type_key = get_class_type_key(class_attribute, None) + + deserializer_dict = DEFAULT_DESERIALIZERS.get(class_type_key, None) + + if deserializer_dict is None: + return None + + + +## ... source file continues with no further Boolean examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-date.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-date.markdown new file mode 100644 index 000000000..491ed3e0f --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-date.markdown @@ -0,0 +1,97 @@ +title: sqlalchemy.types Date Example Code +category: page +slug: sqlalchemy-types-date-examples +sortorder: 500031136 +toc: False +sidebartitle: sqlalchemy.types Date +meta: Example code for understanding how to use the Date class from the sqlalchemy.types module of the SQLAlchemy project. + + +`Date` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. + +BOOLEAN, +Boolean, +DATETIME, +Date, +DateTime, +Enum, +FLOAT, +Float, +INTEGER, +Integer, +Interval, +NULLTYPE, +NullType, +String, +TEXT, +TIME, +Text, +Time, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / default_deserializers.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./default_deserializers.py) + +```python +# default_deserializers.py + + +import datetime +import io + +from validator_collection import validators, checkers + +from sqlathanor._compat import json +from sqlathanor.utilities import format_to_tuple, get_class_type_key, \ + raise_UnsupportedSerializationError, raise_UnsupportedDeserializationError +from sqlathanor.errors import UnsupportedValueTypeError + +~~from sqlalchemy.types import Boolean, Date, DateTime, Float, Integer, Text, Time, Interval + +DEFAULT_PYTHON_SQL_TYPE_MAPPING = { + 'bool': Boolean, + 'str': Text, + 'int': Integer, + 'float': Float, + 'datetime': DateTime, + 'date': Date, + 'time': Time, + 'timedelta': Interval +} + +def get_default_deserializer(class_attribute = None, + format = None): + format_to_tuple(format) + format = format.lower() + + class_type_key = get_class_type_key(class_attribute, None) + + deserializer_dict = DEFAULT_DESERIALIZERS.get(class_type_key, None) + + if deserializer_dict is None: + return None + + + +## ... source file continues with no further Date examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-datetime.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-datetime.markdown new file mode 100644 index 000000000..f588bfb5e --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-datetime.markdown @@ -0,0 +1,97 @@ +title: sqlalchemy.types DateTime Example Code +category: page +slug: sqlalchemy-types-datetime-examples +sortorder: 500031137 +toc: False +sidebartitle: sqlalchemy.types DateTime +meta: Example code for understanding how to use the DateTime class from the sqlalchemy.types module of the SQLAlchemy project. + + +`DateTime` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. + +BOOLEAN, +Boolean, +DATE, +Date, +DateTime, +Enum, +FLOAT, +Float, +INTEGER, +Integer, +Interval, +NULLTYPE, +NullType, +String, +TEXT, +TIME, +Text, +Time, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / default_deserializers.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./default_deserializers.py) + +```python +# default_deserializers.py + + +import datetime +import io + +from validator_collection import validators, checkers + +from sqlathanor._compat import json +from sqlathanor.utilities import format_to_tuple, get_class_type_key, \ + raise_UnsupportedSerializationError, raise_UnsupportedDeserializationError +from sqlathanor.errors import UnsupportedValueTypeError + +~~from sqlalchemy.types import Boolean, Date, DateTime, Float, Integer, Text, Time, Interval + +DEFAULT_PYTHON_SQL_TYPE_MAPPING = { + 'bool': Boolean, + 'str': Text, + 'int': Integer, + 'float': Float, + 'datetime': DateTime, + 'date': Date, + 'time': Time, + 'timedelta': Interval +} + +def get_default_deserializer(class_attribute = None, + format = None): + format_to_tuple(format) + format = format.lower() + + class_type_key = get_class_type_key(class_attribute, None) + + deserializer_dict = DEFAULT_DESERIALIZERS.get(class_type_key, None) + + if deserializer_dict is None: + return None + + + +## ... source file continues with no further DateTime examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown index 49a1a4c7a..9799bde6b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Enum Example Code category: page slug: sqlalchemy-types-enum-examples -sortorder: 500031130 +sortorder: 500031138 toc: False sidebartitle: sqlalchemy.types Enum meta: Example code for understanding how to use the Enum class from the sqlalchemy.types module of the SQLAlchemy project. @@ -11,11 +11,22 @@ meta: Example code for understanding how to use the Enum class from the sqlalche BOOLEAN, Boolean, +DATE, +DATETIME, +Date, +DateTime, +FLOAT, +Float, INTEGER, Integer, +Interval, NULLTYPE, NullType, String, +TEXT, +TIME, +Text, +Time, TypeEngine, UserDefinedType, and to_instance diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-float.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-float.markdown new file mode 100644 index 000000000..6ae56700a --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-float.markdown @@ -0,0 +1,97 @@ +title: sqlalchemy.types Float Example Code +category: page +slug: sqlalchemy-types-float-examples +sortorder: 500031139 +toc: False +sidebartitle: sqlalchemy.types Float +meta: Example code for understanding how to use the Float class from the sqlalchemy.types module of the SQLAlchemy project. + + +`Float` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. + +BOOLEAN, +Boolean, +DATE, +DATETIME, +Date, +DateTime, +Enum, +Float, +INTEGER, +Integer, +Interval, +NULLTYPE, +NullType, +String, +TEXT, +TIME, +Text, +Time, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / default_deserializers.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./default_deserializers.py) + +```python +# default_deserializers.py + + +import datetime +import io + +from validator_collection import validators, checkers + +from sqlathanor._compat import json +from sqlathanor.utilities import format_to_tuple, get_class_type_key, \ + raise_UnsupportedSerializationError, raise_UnsupportedDeserializationError +from sqlathanor.errors import UnsupportedValueTypeError + +~~from sqlalchemy.types import Boolean, Date, DateTime, Float, Integer, Text, Time, Interval + +DEFAULT_PYTHON_SQL_TYPE_MAPPING = { + 'bool': Boolean, + 'str': Text, + 'int': Integer, + 'float': Float, + 'datetime': DateTime, + 'date': Date, + 'time': Time, + 'timedelta': Interval +} + +def get_default_deserializer(class_attribute = None, + format = None): + format_to_tuple(format) + format = format.lower() + + class_type_key = get_class_type_key(class_attribute, None) + + deserializer_dict = DEFAULT_DESERIALIZERS.get(class_type_key, None) + + if deserializer_dict is None: + return None + + + +## ... source file continues with no further Float examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown index 76e460432..3d72e2a57 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Integer Example Code category: page slug: sqlalchemy-types-integer-examples -sortorder: 500031131 +sortorder: 500031140 toc: False sidebartitle: sqlalchemy.types Integer meta: Example code for understanding how to use the Integer class from the sqlalchemy.types module of the SQLAlchemy project. @@ -11,11 +11,22 @@ meta: Example code for understanding how to use the Integer class from the sqlal BOOLEAN, Boolean, +DATE, +DATETIME, +Date, +DateTime, Enum, +FLOAT, +Float, Integer, +Interval, NULLTYPE, NullType, String, +TEXT, +TIME, +Text, +Time, TypeEngine, UserDefinedType, and to_instance @@ -147,6 +158,70 @@ ischema_names['raster'] = Raster +## ... source file continues with no further Integer examples... + +``` + + +## Example 3 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / default_deserializers.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./default_deserializers.py) + +```python +# default_deserializers.py + + +import datetime +import io + +from validator_collection import validators, checkers + +from sqlathanor._compat import json +from sqlathanor.utilities import format_to_tuple, get_class_type_key, \ + raise_UnsupportedSerializationError, raise_UnsupportedDeserializationError +from sqlathanor.errors import UnsupportedValueTypeError + +~~from sqlalchemy.types import Boolean, Date, DateTime, Float, Integer, Text, Time, Interval + +DEFAULT_PYTHON_SQL_TYPE_MAPPING = { + 'bool': Boolean, + 'str': Text, + 'int': Integer, + 'float': Float, + 'datetime': DateTime, + 'date': Date, + 'time': Time, + 'timedelta': Interval +} + +def get_default_deserializer(class_attribute = None, + format = None): + format_to_tuple(format) + format = format.lower() + + class_type_key = get_class_type_key(class_attribute, None) + + deserializer_dict = DEFAULT_DESERIALIZERS.get(class_type_key, None) + + if deserializer_dict is None: + return None + + + ## ... source file continues with no further Integer examples... ``` diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-interval.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-interval.markdown new file mode 100644 index 000000000..80a350118 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-interval.markdown @@ -0,0 +1,97 @@ +title: sqlalchemy.types Interval Example Code +category: page +slug: sqlalchemy-types-interval-examples +sortorder: 500031141 +toc: False +sidebartitle: sqlalchemy.types Interval +meta: Example code for understanding how to use the Interval class from the sqlalchemy.types module of the SQLAlchemy project. + + +`Interval` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. + +BOOLEAN, +Boolean, +DATE, +DATETIME, +Date, +DateTime, +Enum, +FLOAT, +Float, +INTEGER, +Integer, +NULLTYPE, +NullType, +String, +TEXT, +TIME, +Text, +Time, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / default_deserializers.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./default_deserializers.py) + +```python +# default_deserializers.py + + +import datetime +import io + +from validator_collection import validators, checkers + +from sqlathanor._compat import json +from sqlathanor.utilities import format_to_tuple, get_class_type_key, \ + raise_UnsupportedSerializationError, raise_UnsupportedDeserializationError +from sqlathanor.errors import UnsupportedValueTypeError + +~~from sqlalchemy.types import Boolean, Date, DateTime, Float, Integer, Text, Time, Interval + +DEFAULT_PYTHON_SQL_TYPE_MAPPING = { + 'bool': Boolean, + 'str': Text, + 'int': Integer, + 'float': Float, + 'datetime': DateTime, + 'date': Date, + 'time': Time, + 'timedelta': Interval +} + +def get_default_deserializer(class_attribute = None, + format = None): + format_to_tuple(format) + format = format.lower() + + class_type_key = get_class_type_key(class_attribute, None) + + deserializer_dict = DEFAULT_DESERIALIZERS.get(class_type_key, None) + + if deserializer_dict is None: + return None + + + +## ... source file continues with no further Interval examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown index 14a1cc48e..605e44fda 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types NULLTYPE Example Code category: page slug: sqlalchemy-types-nulltype-examples -sortorder: 500031132 +sortorder: 500031142 toc: False sidebartitle: sqlalchemy.types NULLTYPE meta: Python example code that shows how to use the NULLTYPE constant from the sqlalchemy.types module of the SQLAlchemy project. @@ -11,11 +11,22 @@ meta: Python example code that shows how to use the NULLTYPE constant from the s BOOLEAN, Boolean, +DATE, +DATETIME, +Date, +DateTime, Enum, +FLOAT, +Float, INTEGER, Integer, +Interval, NullType, String, +TEXT, +TIME, +Text, +Time, TypeEngine, UserDefinedType, and to_instance diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown index f5455d3b7..49783e79b 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types String Example Code category: page slug: sqlalchemy-types-string-examples -sortorder: 500031133 +sortorder: 500031143 toc: False sidebartitle: sqlalchemy.types String meta: Example code for understanding how to use the String class from the sqlalchemy.types module of the SQLAlchemy project. @@ -11,11 +11,22 @@ meta: Example code for understanding how to use the String class from the sqlalc BOOLEAN, Boolean, +DATE, +DATETIME, +Date, +DateTime, Enum, +FLOAT, +Float, INTEGER, Integer, +Interval, NULLTYPE, NullType, +TEXT, +TIME, +Text, +Time, TypeEngine, UserDefinedType, and to_instance diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-text.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-text.markdown new file mode 100644 index 000000000..445f4cc24 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-text.markdown @@ -0,0 +1,97 @@ +title: sqlalchemy.types Text Example Code +category: page +slug: sqlalchemy-types-text-examples +sortorder: 500031144 +toc: False +sidebartitle: sqlalchemy.types Text +meta: Example code for understanding how to use the Text class from the sqlalchemy.types module of the SQLAlchemy project. + + +`Text` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. + +BOOLEAN, +Boolean, +DATE, +DATETIME, +Date, +DateTime, +Enum, +FLOAT, +Float, +INTEGER, +Integer, +Interval, +NULLTYPE, +NullType, +String, +TIME, +Text, +Time, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / default_deserializers.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./default_deserializers.py) + +```python +# default_deserializers.py + + +import datetime +import io + +from validator_collection import validators, checkers + +from sqlathanor._compat import json +from sqlathanor.utilities import format_to_tuple, get_class_type_key, \ + raise_UnsupportedSerializationError, raise_UnsupportedDeserializationError +from sqlathanor.errors import UnsupportedValueTypeError + +~~from sqlalchemy.types import Boolean, Date, DateTime, Float, Integer, Text, Time, Interval + +DEFAULT_PYTHON_SQL_TYPE_MAPPING = { + 'bool': Boolean, + 'str': Text, + 'int': Integer, + 'float': Float, + 'datetime': DateTime, + 'date': Date, + 'time': Time, + 'timedelta': Interval +} + +def get_default_deserializer(class_attribute = None, + format = None): + format_to_tuple(format) + format = format.lower() + + class_type_key = get_class_type_key(class_attribute, None) + + deserializer_dict = DEFAULT_DESERIALIZERS.get(class_type_key, None) + + if deserializer_dict is None: + return None + + + +## ... source file continues with no further Text examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-time.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-time.markdown new file mode 100644 index 000000000..473c3478d --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-time.markdown @@ -0,0 +1,97 @@ +title: sqlalchemy.types Time Example Code +category: page +slug: sqlalchemy-types-time-examples +sortorder: 500031145 +toc: False +sidebartitle: sqlalchemy.types Time +meta: Example code for understanding how to use the Time class from the sqlalchemy.types module of the SQLAlchemy project. + + +`Time` is a class within the `sqlalchemy.types` module of the SQLAlchemy project. + +BOOLEAN, +Boolean, +DATE, +DATETIME, +Date, +DateTime, +Enum, +FLOAT, +Float, +INTEGER, +Integer, +Interval, +NULLTYPE, +NullType, +String, +TEXT, +Text, +Time, +TypeEngine, +UserDefinedType, +and to_instance +are several other callables with code examples from the same `sqlalchemy.types` package. + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / default_deserializers.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./default_deserializers.py) + +```python +# default_deserializers.py + + +import datetime +import io + +from validator_collection import validators, checkers + +from sqlathanor._compat import json +from sqlathanor.utilities import format_to_tuple, get_class_type_key, \ + raise_UnsupportedSerializationError, raise_UnsupportedDeserializationError +from sqlathanor.errors import UnsupportedValueTypeError + +~~from sqlalchemy.types import Boolean, Date, DateTime, Float, Integer, Text, Time, Interval + +DEFAULT_PYTHON_SQL_TYPE_MAPPING = { + 'bool': Boolean, + 'str': Text, + 'int': Integer, + 'float': Float, + 'datetime': DateTime, + 'date': Date, + 'time': Time, + 'timedelta': Interval +} + +def get_default_deserializer(class_attribute = None, + format = None): + format_to_tuple(format) + format = format.lower() + + class_type_key = get_class_type_key(class_attribute, None) + + deserializer_dict = DEFAULT_DESERIALIZERS.get(class_type_key, None) + + if deserializer_dict is None: + return None + + + +## ... source file continues with no further Time examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown index f6317b706..5f3085270 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types to_instance Example Code category: page slug: sqlalchemy-types-to-instance-examples -sortorder: 500031136 +sortorder: 500031148 toc: False sidebartitle: sqlalchemy.types to_instance meta: Python example code that shows how to use the to_instance callable from the sqlalchemy.types module of the SQLAlchemy project. @@ -11,12 +11,23 @@ meta: Python example code that shows how to use the to_instance callable from th BOOLEAN, Boolean, +DATE, +DATETIME, +Date, +DateTime, Enum, +FLOAT, +Float, INTEGER, Integer, +Interval, NULLTYPE, NullType, String, +TEXT, +TIME, +Text, +Time, TypeEngine, and UserDefinedType are several other callables with code examples from the same `sqlalchemy.types` package. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown index bad53d698..7ad16f983 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types TypeEngine Example Code category: page slug: sqlalchemy-types-typeengine-examples -sortorder: 500031134 +sortorder: 500031146 toc: False sidebartitle: sqlalchemy.types TypeEngine meta: Example code for understanding how to use the TypeEngine class from the sqlalchemy.types module of the SQLAlchemy project. @@ -11,12 +11,23 @@ meta: Example code for understanding how to use the TypeEngine class from the sq BOOLEAN, Boolean, +DATE, +DATETIME, +Date, +DateTime, Enum, +FLOAT, +Float, INTEGER, Integer, +Interval, NULLTYPE, NullType, String, +TEXT, +TIME, +Text, +Time, UserDefinedType, and to_instance are several other callables with code examples from the same `sqlalchemy.types` package. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown index 4c1c1565a..31eadc7ad 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types UserDefinedType Example Code category: page slug: sqlalchemy-types-userdefinedtype-examples -sortorder: 500031135 +sortorder: 500031147 toc: False sidebartitle: sqlalchemy.types UserDefinedType meta: Example code for understanding how to use the UserDefinedType class from the sqlalchemy.types module of the SQLAlchemy project. @@ -11,12 +11,23 @@ meta: Example code for understanding how to use the UserDefinedType class from t BOOLEAN, Boolean, +DATE, +DATETIME, +Date, +DateTime, Enum, +FLOAT, +Float, INTEGER, Integer, +Interval, NULLTYPE, NullType, String, +TEXT, +TIME, +Text, +Time, TypeEngine, and to_instance are several other callables with code examples from the same `sqlalchemy.types` package. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-public-factory.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-public-factory.markdown new file mode 100644 index 000000000..67b4b2580 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-public-factory.markdown @@ -0,0 +1,129 @@ +title: sqlalchemy.util.langhelpers public_factory Example Code +category: page +slug: sqlalchemy-util-langhelpers-public-factory-examples +sortorder: 500031154 +toc: False +sidebartitle: sqlalchemy.util.langhelpers public_factory +meta: Python example code that shows how to use the public_factory callable from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. + + +`public_factory` is a callable within the `sqlalchemy.util.langhelpers` module of the SQLAlchemy project. + +symbol +is another callable from the `sqlalchemy.util.langhelpers` package with code examples. + +## Example 1 from SQLAthanor +[SQLAthanor](https://github.com/insightindustry/sqlathanor) +([PyPI package information](https://pypi.org/project/sqlathanor/) +and +[project documentation](https://sqlathanor.readthedocs.io/en/latest/index.html)) +is a [SQLAlchemy](/sqlalchemy.html) extension that provides serialization and +deserialization support for JSON, CSV, YAML and Python dictionaries. +This project is similar to [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) +with one major difference: SQLAthanor works through SQLAlchemy models +while Marshmallow is less coupled to SQLAlchemy because it requires +separate representations of the serialization objects. Both libraries +have their uses depending on whether the project plans to use SQLAlchemy +for object representations or would prefer to avoid that couping. +SQLAthanor is open sourced under the +[MIT license](https://github.com/insightindustry/sqlathanor/blob/master/LICENSE). + +[**SQLAthanor / sqlathanor / schema.py**](https://github.com/insightindustry/sqlathanor/blob/master/sqlathanor/./schema.py) + +```python +# schema.py + + +import functools +import operator + +from sqlalchemy import Column as SA_Column +from sqlalchemy import Table as SA_Table +from sqlalchemy.orm import class_mapper +from sqlalchemy.orm.relationships import RelationshipProperty as SA_RelationshipProperty +~~from sqlalchemy.util.langhelpers import public_factory +from sqlalchemy.ext.hybrid import hybrid_property as SA_hybrid_property + +from sqlalchemy import exc, orm, util, inspect + + +from validator_collection import checkers, validators + +from sqlathanor import attributes +from sqlathanor._serialization_support import SerializationMixin +from sqlathanor.default_deserializers import get_type_mapping +from sqlathanor.utilities import parse_json, parse_yaml, parse_csv, read_csv_data +from sqlathanor.errors import SQLAthanorError + + +class Column(SerializationMixin, SA_Column): + + + def __init__(self, *args, **kwargs): + super(Column, self).__init__(*args, **kwargs) + + +class RelationshipProperty(SA_RelationshipProperty): + + def __init__(self, + + +## ... source file abbreviated to get to public_factory examples ... + + + @property + def csv_sequence(self): + return self.prop.csv_sequence + + @property + def supports_json(self): + return self.prop.supports_json + + @property + def supports_yaml(self): + return self.prop.supports_yaml + + @property + def supports_dict(self): + return self.prop.supports_dict + + @property + def on_serialize(self): + return self.prop.on_serialize + + @property + def on_deserialize(self): + return self.prop.on_deserialize + + +~~relationship = public_factory(RelationshipProperty, ".orm.relationship") + + +class Table(SA_Table): + + + def __init__(self, *args, **kwargs): + super(Table, self).__init__(*args, **kwargs) + + @classmethod + def from_dict(cls, + serialized, + tablename, + metadata, + primary_key, + column_kwargs = None, + skip_nested = True, + default_to_str = False, + type_mapping = None, + **kwargs): + if not isinstance(serialized, dict): + raise ValueError('serialized must be a dict') + + if not serialized: + raise ValueError('serialized cannot be empty') + + +## ... source file continues with no further public_factory examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown index b6e98951e..004c78e6f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util.langhelpers symbol Example Code category: page slug: sqlalchemy-util-langhelpers-symbol-examples -sortorder: 500031141 +sortorder: 500031155 toc: False sidebartitle: sqlalchemy.util.langhelpers symbol meta: Python example code that shows how to use the symbol callable from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. @@ -9,7 +9,8 @@ meta: Python example code that shows how to use the symbol callable from the sql `symbol` is a callable within the `sqlalchemy.util.langhelpers` module of the SQLAlchemy project. - +public_factory +is another callable from the `sqlalchemy.util.langhelpers` package with code examples. ## Example 1 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown index d2656c918..1b3acc263 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util OrderedDict Example Code category: page slug: sqlalchemy-util-ordereddict-examples -sortorder: 500031137 +sortorder: 500031149 toc: False sidebartitle: sqlalchemy.util OrderedDict meta: Example code for understanding how to use the OrderedDict class from the sqlalchemy.util module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Example code for understanding how to use the OrderedDict class from the s OrderedSet, set_creation_order, +symbol, and topological are several other callables with code examples from the same `sqlalchemy.util` package. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown index 757056c54..54244784a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util OrderedSet Example Code category: page slug: sqlalchemy-util-orderedset-examples -sortorder: 500031138 +sortorder: 500031150 toc: False sidebartitle: sqlalchemy.util OrderedSet meta: Example code for understanding how to use the OrderedSet class from the sqlalchemy.util module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Example code for understanding how to use the OrderedSet class from the sq OrderedDict, set_creation_order, +symbol, and topological are several other callables with code examples from the same `sqlalchemy.util` package. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown index 0ffab43ed..49b464d4d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util set_creation_order Example Code category: page slug: sqlalchemy-util-set-creation-order-examples -sortorder: 500031139 +sortorder: 500031151 toc: False sidebartitle: sqlalchemy.util set_creation_order meta: Python example code that shows how to use the set_creation_order callable from the sqlalchemy.util module of the SQLAlchemy project. @@ -11,6 +11,7 @@ meta: Python example code that shows how to use the set_creation_order callable OrderedDict, OrderedSet, +symbol, and topological are several other callables with code examples from the same `sqlalchemy.util` package. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-symbol.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-symbol.markdown new file mode 100644 index 000000000..c3978b6c2 --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-symbol.markdown @@ -0,0 +1,108 @@ +title: sqlalchemy.util symbol Example Code +category: page +slug: sqlalchemy-util-symbol-examples +sortorder: 500031152 +toc: False +sidebartitle: sqlalchemy.util symbol +meta: Python example code that shows how to use the symbol callable from the sqlalchemy.util module of the SQLAlchemy project. + + +`symbol` is a callable within the `sqlalchemy.util` module of the SQLAlchemy project. + +OrderedDict, +OrderedSet, +set_creation_order, +and topological +are several other callables with code examples from the same `sqlalchemy.util` package. + +## Example 1 from SQLAlchemy filters +[SQLAlchemy filters](https://github.com/juliotrigo/sqlalchemy-filters) + provides filtering, sorting and pagination for [SQLAlchemy](/sqlalchemy.html) + query objects, which is particularly useful when building + [web APIs](/application-programming-interfaces.html). SQLAlchemy filters + is open sourced under the + [Apache License version 2.0](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/LICENSE). + +[**SQLAlchemy filters / sqlalchemy_filters / models.py**](https://github.com/juliotrigo/sqlalchemy-filters/blob/master/sqlalchemy_filters/./models.py) + +```python +# models.py +from sqlalchemy.exc import InvalidRequestError +from sqlalchemy.inspection import inspect +from sqlalchemy.orm.mapper import Mapper +~~from sqlalchemy.util import symbol +import types + +from .exceptions import BadQuery, FieldNotFound, BadSpec + + +class Field(object): + + def __init__(self, model, field_name): + self.model = model + self.field_name = field_name + + def get_sqlalchemy_field(self): + if self.field_name not in self._get_valid_field_names(): + raise FieldNotFound( + 'Model {} has no column `{}`.'.format( + self.model, self.field_name + ) + ) + sqlalchemy_field = getattr(self.model, self.field_name) + + if isinstance(sqlalchemy_field, types.MethodType): + sqlalchemy_field = sqlalchemy_field() + + return sqlalchemy_field + + def _get_valid_field_names(self): + inspect_mapper = inspect(self.model) + columns = inspect_mapper.columns + orm_descriptors = inspect_mapper.all_orm_descriptors + + column_names = columns.keys() + hybrid_names = [ + key for key, item in orm_descriptors.items() + if _is_hybrid_property(item) or _is_hybrid_method(item) + ] + + return set(column_names) | set(hybrid_names) + + +def _is_hybrid_property(orm_descriptor): +~~ return orm_descriptor.extension_type == symbol('HYBRID_PROPERTY') + + +def _is_hybrid_method(orm_descriptor): +~~ return orm_descriptor.extension_type == symbol('HYBRID_METHOD') + + +def get_query_models(query): + models = [col_desc['entity'] for col_desc in query.column_descriptions] + models.extend(mapper.class_ for mapper in query._join_entities) + + if ( + hasattr(query, '_select_from_entity') and + (query._select_from_entity is not None) + ): + model_class = ( + query._select_from_entity.class_ + if isinstance(query._select_from_entity, Mapper) # sqlalchemy>=1.1 + else query._select_from_entity # sqlalchemy==1.0 + ) + if model_class not in models: + models.append(model_class) + + return {model.__name__: model for model in models} + + +def get_model_from_spec(spec, query, default_model=None): + models = get_query_models(query) + if not models: + + +## ... source file continues with no further symbol examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown index 2b1707561..1aafda00c 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util topological Example Code category: page slug: sqlalchemy-util-topological-examples -sortorder: 500031140 +sortorder: 500031153 toc: False sidebartitle: sqlalchemy.util topological meta: Python example code that shows how to use the topological callable from the sqlalchemy.util module of the SQLAlchemy project. @@ -11,7 +11,8 @@ meta: Python example code that shows how to use the topological callable from th OrderedDict, OrderedSet, -and set_creation_order +set_creation_order, +and symbol are several other callables with code examples from the same `sqlalchemy.util` package. ## Example 1 from alembic diff --git a/static/img/logos/assemblyai.jpg b/static/img/logos/assemblyai.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c6b3cda8d49c2039e42a13483b82ef185f0be22 GIT binary patch literal 31673 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 literal 0 HcmV?d00001 diff --git a/theme/templates/code-examples/sqlalchemy.html b/theme/templates/code-examples/sqlalchemy.html index 502a477c4..1626163ca 100644 --- a/theme/templates/code-examples/sqlalchemy.html +++ b/theme/templates/code-examples/sqlalchemy.html @@ -77,11 +77,15 @@

    sqlalchemy.exc NoInspectionAvailable, NoSuchTableError, OperationalError, - ProgrammingError + ProgrammingError, + UnsupportedCompilationError

    sqlalchemy.ext compiler

    +

    sqlalchemy.ext.associationproxy + AssociationProxy +

    sqlalchemy.ext.automap automap_base

    @@ -107,6 +111,7 @@

    sqlalchemy.inspection

    sqlalchemy.orm ColumnProperty, CompositeProperty, + Load, Mapper, Query, RelationshipProperty, @@ -131,6 +136,7 @@

    sqlalchemy.orm

    sqlalchemy.orm.attributes InstrumentedAttribute, + QueryableAttribute, flag_modified

    sqlalchemy.orm.collections @@ -145,6 +151,9 @@

    sqlalchemy.orm.interfaces MapperProperty, PropComparator

    +

    sqlalchemy.orm.mapper + Mapper +

    sqlalchemy.orm.properties ColumnProperty, RelationshipProperty @@ -153,6 +162,9 @@

    sqlalchemy.orm.query Query, QueryContext

    +

    sqlalchemy.orm.relationships + RelationshipProperty +

    sqlalchemy.orm.session Session, object_session @@ -230,12 +242,23 @@

    sqlalchemy.sql.visitors

    sqlalchemy.types BOOLEAN, Boolean, + DATE, + DATETIME, + Date, + DateTime, Enum, + FLOAT, + Float, INTEGER, Integer, + Interval, NULLTYPE, NullType, String, + TEXT, + TIME, + Text, + Time, TypeEngine, UserDefinedType, to_instance @@ -244,9 +267,11 @@

    sqlalchemy.util OrderedDict, OrderedSet, set_creation_order, + symbol, topological

    sqlalchemy.util.langhelpers + public_factory, symbol

    From 88a9b248c907a431220d738afc1bc540be91d277 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 31 Jul 2020 17:49:09 -0400 Subject: [PATCH 206/302] optimizing book build process --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index a7371bed8..5919324c5 100644 --- a/Makefile +++ b/Makefile @@ -16,9 +16,9 @@ prod: run bookbuild: - mkdir tempcontent - cp -R content/pages tempcontent/pages - rm -rf tempcontent/pages/examples + mkdir -p tempcontent/pages + cp -R content/pages/0* tempcontent/pages + cp -R content/pages/meta tempcontent/pages python transform_book.py pdf pelican -t theme -s book_settings.py -o generated/book tempcontent cp -R static-html/* generated/book/ From 1a310e818ee6332910e4cfd9a8b0d45cfe5441ae Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 1 Aug 2020 16:04:05 -0400 Subject: [PATCH 207/302] fix typo on orms page --- .../05-object-relational-mappers.markdown | 2 +- content/pages/10-working/00-gpt-3.markdown | 10 ++++++++++ static/img/headers/django-assemblyai.jpg | Bin 0 -> 21307 bytes static/img/headers/django-sentry.jpg | Bin 0 -> 27374 bytes static/img/logos/assemblyai-white-logo.png | Bin 0 -> 1890 bytes static/img/logos/openai.jpg | Bin 0 -> 83808 bytes theme/templates/choices/gpt-3.html | 18 ++++++++++++++++++ 7 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 content/pages/10-working/00-gpt-3.markdown create mode 100644 static/img/headers/django-assemblyai.jpg create mode 100644 static/img/headers/django-sentry.jpg create mode 100644 static/img/logos/assemblyai-white-logo.png create mode 100644 static/img/logos/openai.jpg create mode 100644 theme/templates/choices/gpt-3.html diff --git a/content/pages/03-data/05-object-relational-mappers.markdown b/content/pages/03-data/05-object-relational-mappers.markdown index 98f24d782..df5ce8bb0 100644 --- a/content/pages/03-data/05-object-relational-mappers.markdown +++ b/content/pages/03-data/05-object-relational-mappers.markdown @@ -8,7 +8,7 @@ meta: Object-relational mappers (ORMs) bridge relational databases and data repr An object-relational mapper (ORM) is a code library that automates the -transfer of data stored in relational databases tables into objects that +transfer of data stored in relational database tables into objects that are more commonly used in application code. Diagram showing how object-relational mappers bridge the database and Python objects. diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown new file mode 100644 index 000000000..f2130165e --- /dev/null +++ b/content/pages/10-working/00-gpt-3.markdown @@ -0,0 +1,10 @@ +title: GPT-3 +category: page +slug: gpt-3 +sortorder: 1001 +toc: False +sidebartitle: GPT-3 +meta: GPT-3 is a trained neural network with 175 billion parameters that allows it to be significantly better at text generation than previous models. + + +GPT-3 is a trained neural network with 175 billion parameters that allows it to be significantly better at text generation than previous models. diff --git a/static/img/headers/django-assemblyai.jpg b/static/img/headers/django-assemblyai.jpg new file mode 100644 index 0000000000000000000000000000000000000000..58506804323b97254c5f7a573d378e8df0a3ffbc GIT binary patch literal 21307 zcmeFZ2{@E*`!_zaizZt_mQX~VM!PsD|3_LJK=!^mSfiVcdnEyP7!JHU` z|9=ZEm?HsoM`_gng z`;L2H;5{uxMV|nL+b+INt_se+-ijf&?3ahSjBwXiGKox{AG&$>t;bj5W-v_ib^dAkPQ77y{h>l2_A za!%sUi)%sWzu#7r5dX7Fpw~Hxn`Rc``o8|I;%W-23TGssZ~MF4(Ykuk@UP#6{yQh} zS0aOhgB5~R6ny>N6qU}NJ*#*|Sy5S89_k?<5b6_nJ4D_mK=N-_xab<-?C)_e(8Je9 z{Pz`aJNX6$o|Ay?{1=kE@BRI<|3lvY*3rfJ@BQut`QQEX<}S{Pu6JF%U3~%rAUP@h zX2<)UmcGC1Z^c~q^}Tye;y)|uFCEN$T|DlDUc4RXdQRfE;^fb0%AZlX{x`+_rrgC@ zDa!|%5ssr^3vyZCj*|K0vAfqzTj-xBz@ z1pY07e@o#1e-ijd0O#rhMQy=Qcm|`l!MNFA`wTmb3=*&d+zgD|4D>FT7!+kPGyK_p zhlal!!vRJnW)@a9c8-Hkhq}YC0}PCe2bdU{nVFyQ!=w2XXoVp@g(nM;j5zJlGmkgs%vWN z>KooSHg$A%b@%l4^?w{48=sh*nx4Vo2}@tUEw6lET_gSYxwA{&1AguQ<_n62|H2mZ z`ak508{+E#6B8p7>uHJn9=)h)XO~pDO5}I) zAK^G6rHVg6`pw#(oc-@H7W*%8_IJkq!PhKIA4*7mw*%1cpN;YNDRF)?z(5HRZT;Lv0J z$4`GURZ;4f`e7oSX|m=~YpKV~_uq2}$nSDp7~#C1D{#0}JEdE$K)TrYD$6}qH3WIS zjt)aKU;%DLI*i}uu>~vrGga(miVW<(@nEEn{C|Lk(f`XdJW9H#e3s$5>yr$a=vSg# z27((rmRk7^!wm!v|J13Jq}&+(wD8P(W_fEUq(?+NjUvrOUK?L`F# zQe^(82b@0kU+90m7TjO#(IE7=AiE)c<(AgN=qk{P#s#Q=Tv%F-jxU}|uE*9btyRRx zyUc@(OK&nIZ?21c@{%aK<$RATE@Ov*`pXhIf~M*#QM^%~*NL+~TInzjB#?k4Pt##9 zX7LT*P#_-zb$R5kz3$Rszq=vGbQs8o>QWJ_AEq6`a$)7@Fk%6GMJokNLl6Wpvu>Jn z*n=s2187c%#iP!Np8Q;?BTe|=+`gaMEkBf8zVJO*xgB$AdF-uA-J`5vZNa4z0Ygf9 zN5?G%HO1l0gA;R$S(rhw|tKB*H<^N!u|ZDFQ%iELqumW zRVy38q+Ie8(CJD{U8KdColdJ>3w!n^s<#;D#^ra924mbR4nDi+mx=gHhmkpH(I973 z8zdVEqF85mP~(Kph!hE)^p-EO((*lHrrn#a5^c$240>YBVDAD^4>e6$Jd*BK9^q6i zc9?oS_1NgbT6FJi?|X&I6p`wDKFqK0_LQmhTeLsuFt97t29mZyzpxd7oik!*$ zqJ;kNZEJPg(VH|t251?mJA>x~G3g83Ix6_}Vmd6>YoJJ(@!9R1bKT}u?Qd%qtv68= zWpM1sU=UHdr-?N=Hpoo7V52kxDhx19ds#&+aSL zW`|z9iY04kaOxuKZL5Ag6#KPo`C%P+LMubL45wkMu-&P{50FBtQ`M~vCrwRXF<1Cj z{EW|^zkK^M=oz90zUC*=VVkoQ7V1&j2VL$#;yS_meVj$T^;10(a}&C5wc+A1WsMtY z`66&m8AfXR_sR;?-OA~)CFu~w|rI|G4j~<@x`yV zFqyCaXC8}@KK>s^LWakShUAj>K^HA^g2fqjPez}m!vyKDKFk|BY+8MV4l}4jm5Xhx z1rXuw;_zSDsuOaQq6^G@7`qF1;x{)_tP7Vff7N{IJ}h_ImGRW?mkF0n^g zQN$vC8#rmSu|z_5VHsLwLgKnV1L%&h@;rqG77YHJBgpo)@cR9W?;B#4P}$?(?A}*8 z(NeIBwRG4!H!2_N5+C*e>dvNfSHrwSqJ9&Jx4k?h;M(YI^&6Q6eC0Ls`p53JFY6r^ z>6MC!_5=N~L~DN|D!&*xS`r#~@tE)h@Y!9jU44-2@)tS`u7hQw!v>E}VR!JiuYP%s zPD1mI@BirV53=2#9T;w;RfAA3;`N0YR*)SVfG;!0p|4E^?vb1vO$rrKUo3d(I!zz# z0^O!xKI}y+`85l!h#b;AID%SSQ3RxhuoX7}lsQQ;y>;w0(r$Hf9u=qd-dV-r(z~t- zshoB`fgnNW46h%;Ae^b8@jZ#P&F^leu6)Z?^PGduh&$^kpr)?K>V78Ggjf}#Z~!d; z1ZG-Bi;*;IcKHH)91+Q$qdhdM3u~*$$$4ZcIQrS%DAZeIT+II>&v6}|at%iGi^?DI zKqnn`qL*+8@%?2;869RWUB?@%yXhg%a~~#TCcuui@$kn!SK|TzK$$y?Zemsi8(jZ6ZXY4Z+dgDsKj-Ky7mPQ+wSG$}ue%VeS2DdQteW!c;PK_BFQu)!G`Qr>XQlLRkhix!Y0wW^p(UyP-5#6ix z{P6?tai0xD^`^0O0{nGdqwAhtC;#q6Xng2n09ltK6(LaqiB=Bt*KOzX$Bx}+UuM8~ zk2Cx_ZxAU$LX$OUl~}hwa4SoR9dwv5;4@+J<+c54MUYbgir2wLILR3qD&n;~U6c|s z>2Bk2)aS;vhv&E03fN^{rojH|A-CZ>okf-c`YC}_mpZ_b_;S4b($yvV$(0)v(Oj1+ zLLPqvIVnq~i429^W3RwYBgmYVJ5_P$3sd9jct4Qr(X`EW535$+#ARm=oBL5CZx1LUd-Pf&c)r$zs*{ctEMQpJ9L{)_SGoVi?3sEd=$^xkQcx4HPPzeymk| zZT_O}sZk6?xcmOSXR-?y3RNU9PY0eDyGq^4^g|Y9gZB|c1F_k7I?Q<(x7>M&WVMjB zxP9zs3xWVwitYAQQ9u25IzLwW&IQ;&Xq@x`?1=0s=X|w19>JR|H;%=!^+~SDFfP$y zvq(tiN{~^CHv(29&(G|9syOuqpErtu11%9XdS3&F7xc6J+L^3>%}33l-c9wGPa7@q z_jYWj6NtnOoI#ws6XE&(6!Fgh^_PN#guE^1Q1~61k5dWUrCW&%@>P(9P6-|jh38%S& ziyQ-i_9wz~6ki)Tq6NI98C?KfYfM|nv3W?PRxgzqUquIwk| zK{%rZ7pjLaw@JL@=!O~qO=4qy@0EV__{r2)pNy2IZCb6KoMj<64E1W_-dlcKAo`#; zR7xTwXwQVnEu`gqEHO92_?mjE{P-=i62Rk-d|~Q6&V-FP9cIE#Z>mv4?5ov-1% za+2@X+V%U!v*quPTXDg_$-UYgq|5m%Mtx*8OG0?)_p%9UkJs< zi_a~*;yP8R-hfjB=-DNY!i(4P_zo$h?}AsbwXB=Gq+xP7>G?1k>!EnWtM%-JLa~Z! z>xo7U3&Y-M`3*fg?R%^Yw_?ui9m~RN2sjGAlP^ZvyWjYPk;B=WxN+N)-DibEHuPRE zN224)dPbi$-mA5*_&Sd{8I^!)zoE7X?}p}(g^bn{#O`lz3rmnxqn4&BZ1tl%4e#U2 z%cC<-@yf1UddQ~PCs`L&4Ut^>gbqv0M`HG0LCzd}c3SRNPQ#G_4*8^L{o2qAv%c9i z^@A9N1+y0Goe4UOrPvJ=4Mw5&rT)^}J!|@xeGSk09ltjdZ>N?Y(Hg-yu_|dQ?;aWZ zw6i8^PE>^0)3nbQ?15hZj4NBazgA2R*Cxf}oSRKKx%IxSGNBd$NQzMpyXjBf-A!k0 zLvU?wd;1hL*5q;BV>Q7)a!G!in*UlxzK%<=lj^XAiuYYX5a^ENv z-{IE7T)O)FIoecn*!jUXv}9JUGtH&t8Xd;04Ba;rP~M}+b)$q@1#jB>>y)KO4ccX3 zdvPC{@#dQv6m6=X#R5x203OM^C0zeqtLVe{gRqVC0kMzRo(wVgQ~5J%>NmLcT?%R( z^h>I3nOV05A4nX=ZVL2%FvUCgS`h`3H(NXw?VhF|w5@$;=2hX&Q~%`kg(aY{xmM{@ z3CJAxIac$fN^9>&1?|UoXhn#i&4r(c=|lo@;~Yhl>I`JLkx+z^P9zHu*G1<3!@I8H z+T{eV?8__6DOBLx!2<@7tcBloxrj$HPS*;b(=d1!uXl5Ukn)kqa`qcrAwPhJyaOYx zN%wfvyx2RI+$F`dz0T{T+y}dq1*VYH>$0T^1(Tc=UZKhbY&G__Exs~V95*uy7*jwF zXaJTYYKJ$)mWF2wmssPd&Lq}ep$zn^2%{<0bQQzM`}-ogxSo0AE{hXIweQ+28QSL4 z{KoTq>_Rctf4J?u+mTGF8w0T_G=z>X1sU}b!!?7&--<9M8fIS8PIysaYdCp> z4I1mQub=^>5#(SH_*`WP-Ld-CA%*Q)*OB;vLu@_Z1gJOakuOvifb#PwY)_cmvpzFx z^iyfg_3nfcmz@~Cl+z8Ppz&lYXVaKsVg}TC!gpP{?ro|5J;f#`~5W`RJbqUym*hMIhBwoP8Vrv%? zcFj{!)mzVt0Xf25_r2wVOm^OqUCJ`c2dA&!O$mi{1uI4CJBPUTAy(ulS|F4V3nN@A z#bzU}(DHQ5-h@cn);+$Y5XjDXvk`No!S7MKNuiFLm*nl<{Q`(kvDT1_sfiL2go3)@}n;x*FZfIzBo+f+3UE` zDiAx0;HR3CxSr)YiVy<>LeI?3mJE<-Hv%~)C!Z2uAE>QSzvw>ggcuehH$e)05%mRA zzmohm2$g~2(J@fRsFr(E74frAcFrBZsp}ZehIKb?xAJ13TqpY4icsS&E2ArD~MPVX`PHR`nRk zX{jePxk3_aG?kI?i|~P@o?5u(e_nRjSB>^efa_TDN3EK|!{@)BuOxNRG7)ZQK5!IS z+Yk$38I^HLy~RLQj~1;y*({fCJ!o=Zj)Rzc z_Z>+z#zsf+(~_{RsSn0MX$T8B<>ujrDmOh@5OMD11?(NOE5wgOdjeAm8Qz6Zlm(Zp zANP!y&EGlenPE?xSQAuWy`!sm88iT9esEED$TZEP0QGRI*c&Yt(c6e70Xc2 z6{q@4si6edrvg-ect%M#MqatM=O-pxXPh|sMM%SRAFMT^ScY8d72|3>4Fs+^a!%BuxIHx3 z>x#zS-on;Dva7kP@Jj5098nJBu!9Ia1O?uD-}g(p>9Cn2Lj&z%hhqmKPoh1UgpOd( zFsEJ9W3aPJhMOiu4>*6~WRaupVDE_GFyv@jx(>>VBu#cAT`67sa%tW*&v+-9!(-~! z;mg5I_YEpO-DR0N6hkIv8s6)qX<--92;y~Lw%<_+_6{8eT=qR)J3>X_pE!?3gyNgs z+%gUpJA9tU<#wKXPKf$(Qc^b9a60goyvjnqW=@7W$<`zgG0fW~Dn=5EqZ+&p(de;_ zoX;v>6{ucqs?UzfcNi?1>L{%-g5CAl z0dNb!3jFNTOO>jQ4IEhYn;2lcJ2=r$Z2nR1mr-%#QA-0p*xwH8?*dfbC6IlUgd&4L zoj@#=moG<%`EjyhvW}Um%j`|Nl@r$=)vfq}Z*?PYdcREt*&!)1eE}LF>tg_3H9&_kVx1IYC+RTGR(_n_YSy==i2diS=v0GDUNIOUfBWjx3LoHY?c0X)4YqYng7<4^EeFc|PzFg?0N?5plEcD?n{i0QCD+aBv9t%bf-_I+UDOi21%RkdVHo@rH+!^td&js*j2v5|E-QwP695Dl$n74Z()f8(fb&B5p zh29hCeM~31YoA{=AZy-!2qBLl7@`GarqaIM!_%yUPx-v0z^k63$FPsS5*LzRrlp2Y zD;pb$dz*ZY1fW%rqpRQ(tHp)d#Elsunp_T8y@uf7!6N-P9$F9Fgrj-wF6(|JnoLOP z_eqip;6DmpVlN{WUo8;Ld{Y*P<_jriMQc@qZ$h-MKbh@xJb95e*FV+wzL$GWeC@+g z{|{}{;eP_{;q=MBq&;Q(i1@FhNo*0oB2Q`2FIxpgKe=(Tlmv;C9X7gG%_AEh*3fqD z%CI4=pjBk8Ddr%P*x?q{A6e5Vk6HAxJ0s1aj z;p~OdXzg34Dt{?^PE}f`ZwG3>mJjvtzH@y~QJ9%#hJunrbnW`4ST86sva5C~z>VPGKZLh? zowsnkDFp(#+Q!FC)*caCLM_WxdDey@GY5`OQF)yq?2UL8H7fuf_D%Nn&u1du&&WST zdTDc+yr>vPvaoAUGFD@vJNE14$JrIkyJAQu}Dhkq_cP62v}vzB=>yAHwaIF^c{!iS;+ z5#_Zlx!N>QyME=KAy#uGlQlWY%(0j@$$P!WCXD(v@yEE1-j-D3a-^ZkwtZEo36OQY z0gru-kc9leX48zCiS} z>80}hpx%e(41FlQSncS*o<=ObrNe$aM&n?p3G-G6gK|_?+s8n`N>SFIz^gQvdiJ0v&c z41y{ukX1=#p~EUs{3tn3P+j-f3U~w=U-S1)X7YB55ZwLf6RKORUu;8>VgL?D3DU~x zFjsRva8OjabzF5&x>uJcx6?Kod~D&+?j6q2E7|69QeUIIj021dWtSTnz1uF(T?{2mG<)7$D2ZQ z*qMbi2&LCmj2c7mmH?%s&Mu*;bRF}^drIXY3Fh_lzS*(m_epP(HanF#-r>51T%up! z{90F&()E%`=^a@$vpFr~xd;t`9i!L18TIic==*pLfAF06DZ{^C}{QWzK9 z=rD$_73Gl{hw!B>oYzt&6#K;p>F#^VHg^3Xe3!{2RXmHppp4F7;kz%-!man5p)rOI zX;tI`2eGyMB+8YZM1O!-H4`~`RQVI}g%US!8(={;`Ld&HB;L<)j9L~U*w!ec?i-qbI6 zNyO9p>Y%GMP1u;TzsOdiO4nB3_1p6}*rgx!%F9?ANFuQqqVWP3#O0+{Wv}@&z}(&= zstS>HMsjjv=hyt`%FT&NXMrR8VRMETAL%{h&-?Z;;kJatJJDN+Ve7;nIvT}cDAyTh z#O}7J9AyKtXuTFI{Aw$V>P^%M=n8U=lJp4sn$sxiUe)rsd@;d3Xl8l#WAx74t00y) zvjUIstAqfp)-UseINIIe`R$~Icf%W@L>00z2^$N-Bb14V#6XHKvzNrYyozCM`lFnW z_L~0jsc}PufcyYxQkU>%-U|sZd-TJmwpraNEYtgQ7685Nfxw9#eH+CPf}6L0jAC2o z=qzCwa@+;w9Yql&GmnsUTDB`4_KGxCwNBcV=}Fg?^V(OT9YQQlARb^?gUqKdAk+6N z<9AL)APXZ5Nj^{92#w`0y>A>mby66gu~C^_vls%l zSH#gq3Y;NLmigYQR=R!U>8r~)hsP%QkAB@RwkV7qt=cjHXP_IgU9)x6yKoI8~19dO?WFf6rN9Z~h>0sN^m?!~8+Jf$w*$MDC?o zp(zAxORzX6XTB1qqg2eK;}0QIW`TZ^Zw*-42qI8KOWzrF^XXLb1dvKmel<2X4Y(mC z^_v@=M(5n8NEP$>TfHZqI|ndUoehqE_G4lniuhPYqCVU9wqpTVWIUBwq_ek(YC583 z&f=-Qv^D7G#kkfK&b=;>6&wf7pOcG$tTByxy8svfIo3(KzVQBIWkokbygGBs6N`4! zA7>3Ee!04(IL!YIK|H_B<(dB*?P`kPh`VGM;7a(QZ`}mhNY4HGypsi)XUT9?uie|% zyy2-Y*er(5p3;`1!%VjkBibOxH)89;5-Su?ED6NTT%S{ntqk(ky`b{V(c_~+!9&I` z4h;OD=ZO7@xl_SnU$T!_?Q1fjv>;%6cy`^PiZ~3dDZ3%Z*>1|Wih5=C-GqkTv7pKy z%OfwtBZY?M&nIMz^4;Bk1M?i7nqN+b>ULs(7h7O0p`rT(MZD~rf*@KTlR1vtrAxLo znSDfc7!mGV5O6=MUjKk}qBBETGtK`BK4lfVm;;47m$s8pL<@M5(t6nI_ajlqRt5CD zz~i%t?_JJ%$;o$esRRapHPoVZIa7vfYG}_8w@@=v9}_7m?ei?ejAu48Nf)o5&%8-n zb$d*6nBF@XeFBIi?vcZ2@gPh(vE{7jbG$ig2-4hR>urf^`h}jx%+RkoEgAkMXHT0$ z2nDL$7O_|rrAn*WEyKnkSX~=OS_N@eEFbcU480%8KhfAL#}aDXyz6`ECmfJPQTb~K z8k^gM#t2?KOVj68A!uEGHBW(%xh608%V#@!&3ryXvV)WN=T~^o+J9b$I)0P?o}h8( zsqg34;FBpbjFchB7NY1dA0ygJlpA|1LkIzw3n{}By1j+3P>P#JTnUqRhWC!DYVKU# ztNbpD9ry{d?@{d67pjalP4L4RLSCP6LAA>RUFv>Yw*!ji4mWTdzBelKtFTW~e5nFe zyb#-hEC_*609)Vm2zfvL`R8wDx+C5E4ze1hxN^Qav$)$k8LgE9tu*KaFZH$|jFnWmFNFtXchUhKPIwDD;^EHU^H?aKWuQ;}C0%$E{L^!?z5-RCe6rB9KfJhK z`itqn9bUVtUQM2tS=KW9pIP^FqIxj30`ZWaM9=uPE!48c74zakvO06DyX_>5-|E!a z5FTCO(D5&mJJrq_hg=ba!dz(PkBtZ^Bg@m8T1=L>Bu(?7nl`fug$N{`>x$~hX~+4T z_Y*rEZHH?*{g&2 zrl~J{T|=MuynpWjZPO{?2Z>wuN^^b^F|>SeWTD2WO>tIwadW%95{+YdPN+P%MtZf3 zTUkCOfnRK@d#~RrSg09NoE&!w7H3k}H&p${l1!6tRN^mY5VEsc^B%<+^Ci(l(%zzI zgKi7~10VY7fqNi(B0baU;JFW7Qt|n?K!!W{UbuT>_QwOICi4okUw(7R0R|pjk$E5CO z!r>7{)j8ow3_2I{ic)(V^cGc#{m0jau6X^lh7k2QJJe$NeT{T)w_>V7YnuA_`$Q9AhS0>;ZQtce2wX(v`K!cY!7)ZuPLT*K1*3(B>qQBa%qsxDHQOK7E6R0`8& zEo4@{8N^jM$a&_M<)>9)B0vz>{E7FC*HR_if&3d~1NTRIg9I`pcGKsgk%&}=u-+%QxN&P8^;c9M z$khrYQ>>|SMA2OCyhuAj@Po~(;>tGHtn2daQO%rJmB_Z%HFuYWr1Apgg%bW=)w4goJWdbI9PJJESsXU7G*iV(sI;J6jQysWF%H1~q(aC=I&cX2%PzHoi z%^QGIq_K9SphDnxwLe-;5H=;dwqMOHeQYsPUzK(@@qMhqd{SNKbj(pA7pfAoX+}8} zAxx`og{@<1P`!~V6r;|(FHHurUCVM$?NaZ4&~C=el=bMcl9tncYTM`&1f_|~Ip2v9;&3} z(R|`SE+|KhZML_MeBL6mm=rC&mkBi94;pBAAxJ2He#_D zil`D3BK%pwl;I?-qB1mNUt9nrSgAY|f-jY4YEdH<6pXk*GK?dnn|3>@pu6v&;I?zN zvvv~Gb~d4!jhTk`X+4{5F+*pRhJOxHZll_(78=kHbc?Gb81*c$0%iF0`YgisG0)Z$ zV->pxpOOOj>mYXTaCg^g9{dUO+qM`RnRT8Rs(!P3hR^+ihC2xbs0KQd*MWydG@evN zn%3OZ-Y*iX7%^rYMP_YXDxo&_BR`?3hnqpRY|1rMyDAD=f2H06R^9?~*T?D>n9t(} zj9XOBjb{~gX;j;91?5XIsQ0HONS}*GS?J1)mP}HWUauZ0e`z;x@TvQgAAG7K%AEO~ zQg`Yu?{lKzS|OTac{P_7{EdKTophKeDPU5G=0z!j#{I>>aQI;=E3KfG%Z4eZVP1ap z?puotp;J5BA#+i(J=n8jAeTI(w&XW#y=hTA598c@>pbljAx!%kagkbNqP)?~(3!+P?Op|!0sHa6Keb5abB zJqdDg79 zY;De%T*tTbau3-+tte$wdl9n1_rY#*V!NU+Rh^Wd@8Vk{;;!D{wQ}Is7gQR-Lo>s5)cQi zq@Br&9Knux2Z=Q6j(KrSe%hK{F|76;7VOz@V_dx=o!S-f>BLbTr)um{C6$+U7z$!W z&!F%zEq-Zk;E~A}Q@9}J^?BC5;b!b&fAs5M1d{?bCW z_tid)FFz}`H9oDk&)hqDfIkT=!!C|_AFvYxPLe;o?JF;|0xAgXe9!RlPfYF6J-QQ= z=M;~qE^N)p<|gsRPpHO}_tkTK(>%-Ik_B7r%&v&+FNPo6rxmPM5?qGZ#pF)OE|y9> z7HC2@mu9wHvEdLl@!rFH7w~#m$16q+Tv-w@MNQJZIimICzRc?Cbxy~B; zlqxy2l1r61DAB(_tB(?1pVEN5&~_44nk1>`aTGV}`BNh? zsLyHmd$?i^$;zAy+*Hji<)7yp+`eV)a3%Pu80n^Ws%0Gk!fbOFX*g zlmvChhyUofI{3~qB;>;CW^=L+o%w_!1&jRCluVWP~2}{Y20~qQPTRHYHDek!Bb%S5mt;zh5f5d?8pyaqtFaZI`7-gugBpOtW`9$y&!R6a= zp`og6>(&qBCXZ5IduN&x0&{&op7%yg+ksr_q`OfvRU{}wX6+HWIa(m$5y861?iTv? z5ALM5yH74&ewQCyQOj){7W&j5PWCGCK(Qk3D8^ZMgt>$%#zk;1e&I9VG?uIyQ>{?` zsKY=#bN{3Ll8gn;cEO-KNtz z>?L+(8`+!Ey7!ADoH1W)dXM*Q$K-nfg3eiwdJ8H?h5=a&l}{9^3gJ+rSPm?09@0)V zX9&5ZozB>H#cUlxaUQw0;Whnjo z@jkw1{G`4HvVOY~&7}_{8 zr8ab_iL{Znek$-!%L~8v2{1FoJsP(rL-PmAx2QQrf?|i=_VjkIb;>?AZb@TafTv+w zdgNyGh&Z@e_z-KzPrWh)dE9DqsM-NOqd|T^?CnJ}e_Yp%f8DD#@%|2bkjskqCmvba zu6zG+bLI(iPiW!#dY;^;R;~zZXr)*z9w*RU$#|tf=mxg(J34 zmJjNGR(@&1QxFFu7)ga~wwO-EWSm2B&5QLTm2R&+_Fjvga`uaB|88W_`7q3y2nDLl z5DpQ08CWMDCcVnnB=T8@4R@Md{hF>})t>3CZgloY?yEq_SN{3O?%kUn-aj@a0>#C! z5N$$kTpb(+C0tkPCTb&Z%xo&|P^P;cnenC_ZUb-avOdxi`&xaTl_e8v4Y`oFSfY70 zEf(R9-SA~MQR|J1Fy&p#7s|hz+aQd7;wp)0A^Bh5Lo@wgul&gI_uThCY?(Rm;Y-nn z&1T#eiGJZyBO`{Gt7p!$#*0nv)MM5TOgc&g;kIzp zhy*7`kTS4~Up$qcZta+63E97LdBi`?DI}cKh>&{S=JF^m4ms+!;Rg+FosiBBk_{kD zrV{TqJ-gjf48#!knLEUhySX@>Ou=e%!CH^xHA`lO0E)_Nv^63@jtJG{Mnc+}r)6Om zG4o>MRBpV()y`fl|5c5KYT}LLz|3Nd|G*Ek^10p*r|}o``OfC)arC5xRF0d^V9B+# z=LoOi0|q2vvOmcuolv2C;fCRu+l~Br15NiWam^e-zF0wr^Gr_Ivj|`K?_?9I@LkhN zOxZO*1i=6Ym%{hLlXZL-ty-4 z3qZETl0v;DCTiQcWYjGNM|66fy%9LxqU5UMC^1g>f~g4=;3Si;@G(d&4m|H2Fz(|* z&Ma(fQqEG@XlWqpDvBwJ*?m%1keHizdbU5tu0Sw!>+P1yiRFC5FH&P4KW%l@@OWCy zkOWydtuu}js_aT=5m>VfM)E4HMpq=N4O4Tcj&dpDN`3SA-JR0%jf&cIHN5GUOJp#x zp`or`rO9ZyZ?I?CYFFH4YDKYA5zt(KLc^sB&AE`m9^1;;68&nzY>$?~my|;1XXfuZ z)(|Zj*U4&BJgVIfyZ8!++?*w?T!E@+JZW1|f)Uz{&(25k61Y%~ce~YoFeA>@wS>QD zxPu?ij)@T#>ng5~0e_^_?AT$xSNwKw&`^!lZD)H%MFAnddU)jUl0V13S?2xR=0&x4 zA|M|Rx2^kD(v=((8ONY1B5d)y=pgvx0|>1cA#0UqkC$?Y= zh13rbi`g(#-xosE!cRF*EY;~5YVoTgaN@!b9S1^Gq>fw}ij)E}>kczODEvMA%&Iy>O_;RlKNq#|Iey3L<*};E47*=zb z#s7*NIrn-?IG5})D9)ZRZxh?_<)rFq2C|g(FYBnmcO4iAs&e9k1Ml;NpwRajKUmr{ z(XwaD|E;2FE7V&$oiF%KdbC)wMD$(I8g*wFfHEaAg5)oD2%MPbhZbi(IL>d`o!S*q zU?H(2s_3h9jJ~Rmp6hsW8KcYBMy?zkKmv+T4gK1liB=Oelz8!yfL|;jIOVJJ>mN4y zE3<-?KMiR`SXU(O8u>1%r>HO@kSLI*b4oRMs^-aVf7MP43QIdMBRz zGp>*S$4j8s_+U)M&80EQh2#67*@v^jG0*i=NVTt4hvKrEr9mSyl!`G!#cgq^AX7vD z?YYi*%896sG0%N0_2iM^LZGBK_(+XMeGcw&BDDT->kp|Z-Y<$JRu;gnt5p@-ocl3B zkrUea_Rwv|D=BLOn%6#@?kjBMr$I}v?ZSw~S&UGG29RDD1>sjj3sW=Q`N%^AE@TIm zlaQ_WL=k`c#E0buWw`i<=4c}BqQem@9-U0(;*OO^8-9&-Ax%}^Qb5e^ubRCTknK4| z-U}*o*rW2Q;Db95!Z8>r*O>Z?0Pgiq-U>sSN82g~D`x}1gL?$u z>9XIkxOsF9pg!9x23O^hHm;e#R!N&WL=D)!x6a$>8GB!!rxw3C`|*ByZstKB4umh( z2Q@2($8JbN%W8?_cp#z2bxgjcLf9z&p@S!`d_leIh^h&jG33O@mWOb^T-68o}wANybdQJj^Ml(|)-Z{E!_*+$=J?Abaoy zZI^liQdk0N@iCTXXL^fjMiLccm{XD^BMy6?9IPpcbwKh`ShuA*(*_t7}R;p*21UaNY)VwKC48Vv4RJ&X#KI^6qF zhF>10#%*~)rj2jyFMBBA>((HbJ82<)Csg-Lgd8?seM&9e_X^4CfqeRU@$Bj(nMZcz zd27VoUJ+a~G#?9)kJ4%o?x-|fegH#sHk{CL#;3}2?X(wqC@!1dj&MEwBl2-|DUURZ z{T3+tVCqLdMI&ki%ZGI}Pu(}~seGW(GjMbC&isq&&vO^%Oqjm2EeL0@og;>&fL*#w zsP>Pj>g|*kMK7^l2gWW@!KsV49JzG4!%I{Sv1i<~N(kF@J-Sx_|5gb8#(kKfx$mXM z(lC_)s`|-*?E6p~%=2TM3^ z4oD}`n1dFm48Ej7P=XJ-X9()EwLMh(afA*Nf`MmIcxWe~#lpU1)H&$QqYym2DMs9Y z12VoeZY&i3FLI)&_pw!#|3t}upcVC-)@Vcq61dMw<8INcG$YQSCaY@2B3P7TF<%LW1-Kq|r2HHHdh`lAc)OxHTS4y$B&pOeE-r z#f{JnrKu32oD`2;%t!3-L52pUF6pqS6-#6Sf^@h6N{_(UycH0JAys0cwEwj8mG}t7 zAhEVV$j+swF1y%NP$hcJZs^>x>A$n|cH*je9V`MOj@1-c?-Z)Vu;~ii97?TN)fy@y zJOy%vXU#C?`5kILl!#yaiA_^KEFE_#m%vdmK9uKnnpQ&(Hg&4!r}f00IVM1R;7qAz<#oooA$m%1)iarL}Djl z9vrumzauro_{F0;O+ZRffvBZ|X=WRe`&Iu+oI6fW>^pJ^0Vp<5c~&}*Ox{uI9t%9> zYWRpA+;B%8-&Kc@?6*_Go8Lw!A}GO0?|4-|mWo-6bAT48#g{0e?KUnB>n{7pAcTf^LPTa%Ktdg5HW^5Y!A5tsDwUCweg$>|g*#k2*a zi6t4T?P_JKxbCdiIOj9-9i1XoAMSZ2VHR22X3Jhg1}$PZOwbDMW4I$fd7{%#TV7? zjlGSUuDskhq7Y%~wS*QveQ^fhZNFyl8YytRUbxZOnd|ZC>uB|0%SSO;(Wv1m0=&l@ zCqN*NkbDW&U5Y%08Z7nWRQ)LLXBrmd5z}J|=bjwW=J-(|&>03#Je_;x^WDwz&CfYE zy`797^7vmFhq>gJe1K)6Yf(O8vnAwc$Ok7CvgC)rm< zxKBPVAm}6_)PGIbw=X5d4%M$}sn_vepCXX4y1#tTR?Po0fub*SV_)pJC_+NkLZ%*U?t-t?e zhx&iZvo{$3vGeY~<^I2A$@pg(Y^_?zQtFN7loK4K!CJDf+pKJk!eHNFi#HdKX~E6tfDoc%Rd(E?1l#JTiUu$^daRBG29C2KiP~045`|5nC=ne O9svP8-s1n+|C<0Syi)i8 literal 0 HcmV?d00001 diff --git a/static/img/headers/django-sentry.jpg b/static/img/headers/django-sentry.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2256bb88513200d9d15e6c8d54df0089c7334ced GIT binary patch literal 27374 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 N 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%0Awag{mKrg|E#R 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 rWn9|&eQ%fzUHXG!|CKnYgk=U1njUr8mQWhat else would you like to learn about in Python?

    +
    +
    +
    + {% include "choices/buttons/databases.html" %} +
    +
    +
    +
    + {% include "choices/buttons/data.html" %} +
    +
    +
    +
    + {% include "choices/buttons/why-use-python.html" %} +
    +
    +
    From 60e25df84cc71c59b76f6a7834579708054cb054 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 1 Aug 2020 22:16:23 -0400 Subject: [PATCH 208/302] working on page about gpt-3 --- content/pages/03-data/02-postgresql.markdown | 2 +- content/pages/10-working/00-gpt-3.markdown | 86 +++++++++++++++++++- 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/content/pages/03-data/02-postgresql.markdown b/content/pages/03-data/02-postgresql.markdown index 60ee8b4b2..26954a7f8 100644 --- a/content/pages/03-data/02-postgresql.markdown +++ b/content/pages/03-data/02-postgresql.markdown @@ -12,7 +12,7 @@ pronounced "Poss-gres", is an open source [relational database](/databases.html) implementation frequently used by Python applications as a backend for data storage and retrieval. -PostgreSQL logo. +PostgreSQL logo. ## How does PostgreSQL fit within the Python stack? diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown index f2130165e..f62b18ac0 100644 --- a/content/pages/10-working/00-gpt-3.markdown +++ b/content/pages/10-working/00-gpt-3.markdown @@ -7,4 +7,88 @@ sidebartitle: GPT-3 meta: GPT-3 is a trained neural network with 175 billion parameters that allows it to be significantly better at text generation than previous models. -GPT-3 is a trained neural network with 175 billion parameters that allows it to be significantly better at text generation than previous models. +[GPT-3](https://arxiv.org/abs/2005.14165) is a neural network that was +trained by the [OpenAI](https://openai.com/) organization with 175 billion +parameters, which allows the model to be significantly better at natural +language processing and text generation than the prior model, +[GPT-2](https://openai.com/blog/gpt-2-1-5b-release/), which only had +1.5 billion parameters. + +OpenAI logo. + + +## What's so special about GPT-3? +The GPT-3 model can generate texts of up to 50,000 characters, with no +supervision. It can even generate creative Shakespearean-style fiction +stories in addition to fact-based writing. This is the first time that a +neural network model has been able to generate texts at an acceptable +quality that makes it difficult, if not impossible, for a typical +person to whether the output was written by a human or GPT-3. + + +## How does GPT-3 work? +To generate output, GPT-3 has a very large vocabulary, consisting of 2,500 +words, which it can combine to generate sentences. These words are sorted +into different categories (nouns, verbs, adjectives, etc.), and for each +category, there is a “production rule”, which can be used to generate a +sentence. The production rules can be modified with different parameters. + +A few examples: + +* noun + verb = subject + verb +* noun + verb + adjective = subject + verb + adjective +* verb + noun = subject + verb +* noun + verb + noun = subject + verb + noun +* noun + noun = subject + noun +* noun + verb + noun + noun = subject + verb + noun + noun + +In addition, GPT-3 is able to understand negations, as well as the use +of tenses, which allows the model to generate sentences in the past, +present and future. + + +## Does GPT-3 matter to Python developers? +GPT-3 is not that useful right now for programmers other than as an +experiment. If you get access to [OpenAI's API](https://openai.com/blog/openai-api/) +then Python is an easy language to use for interacting with it and +you could use its text generation as inputs into your applications. +Although there have been some initial impressive experiments in +generating code for +[the layout of the Google homepage](https://twitter.com/sharifshameem/status/1283322990625607681), +[JSX output](https://twitter.com/sharifshameem/status/1282676454690451457), +and [other technical demos](https://twitter.com/__MLT__/status/1287357881675853825), +the model will otherwise not (yet) put any developers out of a job +who are coding real-world applications. + + +## How was GPT-3 trained? +At a high level, training the GPT-3 neural network consists of two steps. + +The first step requires creating the vocabulary, the different +categories and the production rules. This is done by feeding +GPT-3 with books. For each word, the model must predict the category +to which the word belongs, and then, a production rule must be created. + +The second step consists of creating a vocabulary and production rules +for each category. This is done by feeding the model with sentences. +For each sentence, the model must predict the category to which each +word belongs, and then, a production rule must be created. + +The result of the training is a vocabulary, and production rules for each +category. + +The model also has a few tricks that allow it to improve its ability to +generate texts. For example, it is able to guess the beginning of a word +by observing the context of the word. It can also predict the next word +by looking at the last word of a sentence. It is also able to predict the +length of a sentence. + +While those two steps and the related tricks may sound simple in theory, +in practice they require massive amounts of computation. Training +175 billion parameters in mid-2020 cost in the ballpark of +[$4.6 million dollars](https://lambdalabs.com/blog/demystifying-gpt-3/#:~:text=But%20to%20put%20things%20into,for%20a%20single%20training%20run.), +although some other estimates calculated it could take up +to $12 million depending on how the hardware was provisioned. + + + From 6b61d5933d037f56aea7cd73bb69fc3215e83735 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 2 Aug 2020 09:03:20 -0400 Subject: [PATCH 209/302] working on gpt-3 page --- content/pages/10-working/00-gpt-3.markdown | 29 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown index f62b18ac0..12d894d01 100644 --- a/content/pages/10-working/00-gpt-3.markdown +++ b/content/pages/10-working/00-gpt-3.markdown @@ -7,15 +7,25 @@ sidebartitle: GPT-3 meta: GPT-3 is a trained neural network with 175 billion parameters that allows it to be significantly better at text generation than previous models. -[GPT-3](https://arxiv.org/abs/2005.14165) is a neural network that was -trained by the [OpenAI](https://openai.com/) organization with 175 billion -parameters, which allows the model to be significantly better at natural +[GPT-3](https://arxiv.org/abs/2005.14165) is a neural network +trained by the [OpenAI](https://openai.com/) organization with +significantly more parameters than previous generation models. + +There are several variations of GPT-3, which range from 125 to 175 billion +parameters. The different variations allow the model to better respond to +different types of input, such as a question & answer format, long-form +writing, human language translations (e.g. English to French). The large +numbers of parameters make GPT-3 significantly better at natural language processing and text generation than the prior model, [GPT-2](https://openai.com/blog/gpt-2-1-5b-release/), which only had 1.5 billion parameters. OpenAI logo. +GPT-3 can only currently be access by an +[API provided by OpenAI](https://openai.com/blog/openai-api/), which is +in private beta. + ## What's so special about GPT-3? The GPT-3 model can generate texts of up to 50,000 characters, with no @@ -91,4 +101,17 @@ although some other estimates calculated it could take up to $12 million depending on how the hardware was provisioned. +## GPT-3 resources +These resources range from broad philosophy of what GPT-3 means +for machine learning to specific technical details for how the model +is trained. + +* [OpenAI's GPT-3 Language Model: A Technical Overview](https://lambdalabs.com/blog/demystifying-gpt-3/) + and + [GPT-3: A Hitchhiker's Guide](https://lambdalabs.com/blog/gpt-3/) + are two long-format guides that analyze how GPT-3's technical + specifications fit in the larger machine learning ecosystem, quotes by + researchers on its usage, and some initial resources to get a + better understanding of what this model is capable of performing. + From 9d100753a9173786852c8a4b496d5f64023be078 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 2 Aug 2020 12:29:22 -0400 Subject: [PATCH 210/302] adding new gpt-3 resources --- content/pages/10-working/00-gpt-3.markdown | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown index 12d894d01..5478c0fcd 100644 --- a/content/pages/10-working/00-gpt-3.markdown +++ b/content/pages/10-working/00-gpt-3.markdown @@ -67,7 +67,8 @@ generating code for [the layout of the Google homepage](https://twitter.com/sharifshameem/status/1283322990625607681), [JSX output](https://twitter.com/sharifshameem/status/1282676454690451457), and [other technical demos](https://twitter.com/__MLT__/status/1287357881675853825), -the model will otherwise not (yet) put any developers out of a job +the +[model will otherwise not (yet) put any developers out of a job](https://www.youtube.com/watch?v=Yg3C38P5EkA) who are coding real-world applications. @@ -114,4 +115,12 @@ is trained. researchers on its usage, and some initial resources to get a better understanding of what this model is capable of performing. +* [GPT 3 Demo and Explanation](https://www.youtube.com/watch?v=8psgEDhT1MM) + is a video that gives a brief overview of GPT-3 and shows a bunch + of live demos for what has so far been created with this technology. + +* [How GPT3 Works - Visualizations and Animations](https://jalammar.github.io/how-gpt3-works-visualizations-animations/) + contains some wonderful animated visuals to show how the model is + trained and what happens in various scenarios such as text output + and code generation. From 6771baca7f6c0bb5ba2b760c9f92e66a19163f95 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 2 Aug 2020 13:56:38 -0400 Subject: [PATCH 211/302] add new gpt-3 resources --- content/pages/10-working/00-gpt-3.markdown | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown index 5478c0fcd..70ec8e5e9 100644 --- a/content/pages/10-working/00-gpt-3.markdown +++ b/content/pages/10-working/00-gpt-3.markdown @@ -124,3 +124,15 @@ is trained. trained and what happens in various scenarios such as text output and code generation. +* [Tempering expectations for GPT-3](https://minimaxir.com/2020/07/gpt3-expectations/) + points out that many of the good examples on social media have been + cherry picked to impress readers. + +* [gpt-3-experiments](https://github.com/minimaxir/gpt-3-experiments) + contains Python code open sourced under the MIT license that + shows how to interact with the API. + +* [Why GPT-3 matters](https://leogao.dev/2020/05/29/GPT-3-A-Brief-Summary/) + compares and contrasts this model with similar models that have been + developed and tries to give an overview of where each one stands + with its strengths and weaknesses. From bc8729cafa72c5970eba1231d2c52191c0387cc4 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 2 Aug 2020 21:24:38 -0400 Subject: [PATCH 212/302] working on debugging page --- .../04-web-development/38-debugging.markdown | 25 ++++++++++++++++++ static/img/logos/assemblyai-white-bg.png | Bin 0 -> 22494 bytes theme/templates/article-sidebar.html | 1 + theme/templates/index-sidebar.html | 3 +-- theme/templates/index.html | 2 +- theme/templates/sponsor.html | 2 +- .../templates/sponsor/sentry-assemblyai.html | 10 +++++++ 7 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 static/img/logos/assemblyai-white-bg.png create mode 100644 theme/templates/sponsor/sentry-assemblyai.html diff --git a/content/pages/04-web-development/38-debugging.markdown b/content/pages/04-web-development/38-debugging.markdown index 88f4999e1..e2936c6ae 100644 --- a/content/pages/04-web-development/38-debugging.markdown +++ b/content/pages/04-web-development/38-debugging.markdown @@ -19,6 +19,31 @@ There are bugs in every modest sized or larger application. Every developer has to learn how to debug code in order to write programs that work as correctly as time and budget allow. +In addition to fixing bugs, debugging is an important skill for improving +the efficiency of an application by optimizing performance and improving +the logic. Debugging is a complex skill that takes time and practice +for a developer to gain as a capability. + + +## What are some common debugging techniques? +Some common debugging techniques include: + +* Printing out or displaying values of variables and state + at certain times during the execution of an application + +* Changing the state of a program to make it do different + things. This is called altering the "path" of the program + +* Stepping through the execution of a program line by line + +* Breakpoints + +* Trace Points + +* Stopping the program at certain events + +* Viewing the output of a program in a debugger window + ### Debugging tools There are many debugging tools, some of which are built into diff --git a/static/img/logos/assemblyai-white-bg.png b/static/img/logos/assemblyai-white-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..319d09ede12a0967b0d37fd5258cf7c88a8b52e3 GIT binary patch literal 22494 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 Bb<+R< literal 0 HcmV?d00001 diff --git a/theme/templates/article-sidebar.html b/theme/templates/article-sidebar.html index e25cfab10..35e141c2c 100644 --- a/theme/templates/article-sidebar.html +++ b/theme/templates/article-sidebar.html @@ -1,6 +1,7 @@ {% if article.author == "Kevin Whinnery" %} {% include "sponsor/twilioquest.html" %} {% endif %} +{% include "sponsor/sentry-assemblyai.html" %} {% include "sponsor/carbon.html" %} From efc7e4fa7579751743eb550dc2a0dc6028358ce9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 4 Aug 2020 08:50:31 -0400 Subject: [PATCH 215/302] add new gpt-3 resource --- content/pages/10-working/00-gpt-3.markdown | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown index 70ec8e5e9..d6f201ae3 100644 --- a/content/pages/10-working/00-gpt-3.markdown +++ b/content/pages/10-working/00-gpt-3.markdown @@ -115,15 +115,19 @@ is trained. researchers on its usage, and some initial resources to get a better understanding of what this model is capable of performing. -* [GPT 3 Demo and Explanation](https://www.youtube.com/watch?v=8psgEDhT1MM) - is a video that gives a brief overview of GPT-3 and shows a bunch - of live demos for what has so far been created with this technology. - * [How GPT3 Works - Visualizations and Animations](https://jalammar.github.io/how-gpt3-works-visualizations-animations/) contains some wonderful animated visuals to show how the model is trained and what happens in various scenarios such as text output and code generation. +* [Building a Chatbot with OpenAI's GPT-3 engine, Twilio SMS and Python](https://www.twilio.com/blog/openai-gpt-3-chatbot-python-twilio-sms) + is a step-by-step tutorial for using GPT-3 as a smart backend + for an SMS-based chatbot powered by the [Twilio API](/twilio.html). + +* [GPT 3 Demo and Explanation](https://www.youtube.com/watch?v=8psgEDhT1MM) + is a video that gives a brief overview of GPT-3 and shows a bunch + of live demos for what has so far been created with this technology. + * [Tempering expectations for GPT-3](https://minimaxir.com/2020/07/gpt3-expectations/) points out that many of the good examples on social media have been cherry picked to impress readers. From cb703830420b3a3d07f0308400ec44e630d5580e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 4 Aug 2020 15:53:05 -0400 Subject: [PATCH 216/302] fix typo in gpt-3 page --- content/pages/10-working/00-gpt-3.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown index d6f201ae3..1e54ef4ea 100644 --- a/content/pages/10-working/00-gpt-3.markdown +++ b/content/pages/10-working/00-gpt-3.markdown @@ -37,8 +37,8 @@ person to whether the output was written by a human or GPT-3. ## How does GPT-3 work? -To generate output, GPT-3 has a very large vocabulary, consisting of 2,500 -words, which it can combine to generate sentences. These words are sorted +To generate output, GPT-3 has a very large vocabulary, which it can +combine to generate sentences. These words are sorted into different categories (nouns, verbs, adjectives, etc.), and for each category, there is a “production rule”, which can be used to generate a sentence. The production rules can be modified with different parameters. From 8354fa7820e8fa224bfb8407a4fde0eaef1d9513 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 5 Aug 2020 06:38:25 -0400 Subject: [PATCH 217/302] tweaking a couple of links --- content/posts/160511-send-sms-text-message-python.markdown | 6 +++--- .../160530-respond-sms-text-messages-python-flask.markdown | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/posts/160511-send-sms-text-message-python.markdown b/content/posts/160511-send-sms-text-message-python.markdown index 1159e7114..4cbb10078 100644 --- a/content/posts/160511-send-sms-text-message-python.markdown +++ b/content/posts/160511-send-sms-text-message-python.markdown @@ -3,7 +3,7 @@ slug: send-sms-text-messages-python meta: A how-to guide for sending SMS (text messages) using the Python programming language. category: post date: 2016-05-11 -modified: 2017-04-28 +modified: 2020-08-05 newsletter: False headerimage: /img/160511-send-sms-python/header.jpg headeralt: Twilio and Python logos. Copyright their respective owners. @@ -25,7 +25,7 @@ those two versions installed. * [pip](https://pip.pypa.io/en/stable/) and [virtualenv](https://virtualenv.pypa.io/en/latest/) to handle [application dependencies](/application-dependencies.html) -* A free [Twilio account](https://www.twilio.com/try-twilio) to use their +* A free [Twilio account](www.twilio.com/referral/w9pugq) to use their [SMS web API](https://www.twilio.com/docs/api/rest/sending-messages) * Open source [Twilio Python helper library](https://pypi.org/project/twilio), @@ -41,7 +41,7 @@ guide that'll show how to install system packages for those tools. ## Using a Web API We're going to use a web API to make sending SMS easier and more reliable. Head to the -[Twilio website and sign up for a free trial account](https://www.twilio.com/try-twilio). If you already have a Twilio account (and you should - it's +[Twilio website and sign up for a free trial account](www.twilio.com/referral/w9pugq) awesome for more than just sending text messages!) then sign into your existing account. diff --git a/content/posts/160530-respond-sms-text-messages-python-flask.markdown b/content/posts/160530-respond-sms-text-messages-python-flask.markdown index 2da56f22a..0d0f0e10e 100644 --- a/content/posts/160530-respond-sms-text-messages-python-flask.markdown +++ b/content/posts/160530-respond-sms-text-messages-python-flask.markdown @@ -3,7 +3,7 @@ slug: respond-sms-text-messages-python-flask meta: A quick tutorial on receiving and responding to SMS text messages in a Flask application built with Python. category: post date: 2016-05-30 -modified: 2017-05-11 +modified: 2020-08-05 newsletter: False headerimage: /img/160530-respond-sms-python-flask/header.jpg headeralt: Twilio, Python and Flask logos. Copyright their respective owners. @@ -26,7 +26,7 @@ those two versions installed on your system. [virtualenv](https://virtualenv.pypa.io/en/latest/) to handle [application dependencies](/application-dependencies.html) * The [Flask](/flask.html) micro web framework -* A free [Twilio account](https://www.twilio.com/try-twilio) to use their +* A free [Twilio account](www.twilio.com/referral/w9pugq) to use their [SMS web API](https://www.twilio.com/docs/api/rest/sending-messages) * Open source [Twilio Python helper library](https://pypi.org/project/twilio) @@ -158,7 +158,7 @@ to respond to text messages. ## Obtaining Our Phone Number We can use our Flask application's route to respond to incoming web API requests based on incoming SMS messages to a Twilio phone number. Go to the -[Twilio website and sign up for a free trial account](https://www.twilio.com/try-twilio) +[Twilio website and sign up for a free trial account](www.twilio.com/referral/w9pugq) to use their API. If you already have a Twilio account then sign into your existing account. From abb506653f086dfbe946427675b3ad85c5b70d28 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 9 Aug 2020 10:49:10 -0400 Subject: [PATCH 218/302] adding latest blog post --- ...recordings-speech-text-assemblyai.markdown | 485 ++++++++++++++++++ .../audio/fsp-object-relational-mappers.mp3 | Bin 0 -> 4113684 bytes .../assemblyai-dashboard.png | Bin 0 -> 197635 bytes static/img/headers/python-assemblyai.jpg | Bin 0 -> 42144 bytes theme/templates/article-sidebar.html | 1 - ...ibe-recordings-speech-text-assemblyai.html | 6 + 6 files changed, 491 insertions(+), 1 deletion(-) create mode 100644 content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown create mode 100644 static/audio/fsp-object-relational-mappers.mp3 create mode 100644 static/img/200809-transcription-assemblyai/assemblyai-dashboard.png create mode 100644 static/img/headers/python-assemblyai.jpg create mode 100644 theme/templates/blog/transcribe-recordings-speech-text-assemblyai.html diff --git a/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown b/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown new file mode 100644 index 000000000..775de816f --- /dev/null +++ b/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown @@ -0,0 +1,485 @@ +title: How to Transcribe Speech Recordings into Text with Python +slug: transcribe-recordings-speech-text-assemblyai +meta: Learn to transcribe speech in recordings like MP3s into text with Python and AssemblyAI's API. +category: post +date: 2020-08-09 +modified: 2020-08-09 +newsletter: False +headerimage: /img/headers/python-assemblyai.jpg +headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. + + +When you have a recording where one or more people are talking, it's useful +to have a highly accurate and automated way to extract the spoken words into +text. Once you have the text, you can use it for further analysis or +as an accessibility feature. + +In this tutorial, we'll use a high accuracy speech-to-text web application +programming interface called [AssemblyAI](https://www.assemblyai.com/) to +extract text from an MP3 recording (many other formats are supported as well). + +With the code from this tutorial, you will be able to take an audio file +that contains speech +[such as this example one I recorded](https://www.fullstackpython.com/audio/fsp-object-relational-mappers.mp3) +and output a highly accurate text transcription like this: + +``` +An object relational mapper is a code library that automates the transfer of +data stored in relational, databases into objects that are more commonly used +in application code or EMS are useful because they provide a high level +abstraction upon a relational database that allows developers to write Python +code instead of sequel to create read update and delete, data and schemas in +their database. Developers can use the programming language. They are +comfortable with to work with a database instead of writing SQL... + +(the text goes on from here but I abbreviated it at this point) +``` + +## Tutorial requirements +Throughout this tutorial we are going to use the following dependencies, +which we will install in just a moment. Make sure you also have Python 3, +[preferrably 3.6 or newer installed](https://www.python.org/downloads/), +in your environment: + +We will use the following dependencies to complete this +tutorial: + +* [requests](https://requests.readthedocs.io/) + [version 2.24.0](https://pypi.org/project/requests/) to make HTTP requests to + the [AssemblyAI](https://www.assemblyai.com/) speech-to-text + [API](/application-programming-interfaces.html) +* An [AssemblyAI](https://www.assemblyai.com/) account, + which you can sign up for a + [free API access key here](https://app.assemblyai.com/login/) + +All code in this blog post is available open source under the MIT license +on GitHub under the +[transcribe-speech-text-script directory of the blog-code-examples repository](https://github.com/fullstackpython/blog-code-examples). +Use the source code as you desire for your own projects. + + +## Setting up the development environment +Change into the directory where you keep your Python +[virtual environments](/virtual-environments-virtualenvs-venvs.html). +I keep mine in a subdirectory named `venvs` within my user's home +directory. Create a new virtualenv for this project using the following +command. + +```bash +python3 -m venv ~/venvs/pytranscribe +``` + +Activate the virtualenv with the `activate` shell script: + +```bash +source ~/venvs/pytranscribe/bin/activate +``` + +After the above command is executed, the command prompt will +change so that the name of the virtualenv is prepended to the +original command prompt format, so if your prompt is simply +`$`, it will now look like the following: + +```bash +(pytranscribe) $ +``` + +Remember, you have to activate your virtualenv in every new terminal +window where you want to use dependencies in the virtualenv. + +We can now install the `requests` package into the activated +but otherwise empty virtualenv. + +``` +pip install requests==2.24.0 +``` + +Look for output similar to the following to confirm the appropriate +packages were installed correctly from PyPI. + +``` +(pytranscribe) $ pip install requests==2.24.0 +Collecting requests==2.24.0 + Using cached https://files.pythonhosted.org/packages/45/1e/0c169c6a5381e241ba7404532c16a21d86ab872c9bed8bdcd4c423954103/requests-2.24.0-py2.py3-none-any.whl +Collecting certifi>=2017.4.17 (from requests==2.24.0) + Using cached https://files.pythonhosted.org/packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl +Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests==2.24.0) + Using cached https://files.pythonhosted.org/packages/9f/f0/a391d1463ebb1b233795cabfc0ef38d3db4442339de68f847026199e69d7/urllib3-1.25.10-py2.py3-none-any.whl +Collecting chardet<4,>=3.0.2 (from requests==2.24.0) + Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl +Collecting idna<3,>=2.5 (from requests==2.24.0) + Using cached https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl +Installing collected packages: certifi, urllib3, chardet, idna, requests +Successfully installed certifi-2020.6.20 chardet-3.0.4 idna-2.10 requests-2.24.0 urllib3-1.25.10 +``` + +We have all of our required dependencies installed so we can get started +coding the application. + + +## Uploading, initiating and transcribing audio +We have everything we need to start building our application that +will transcribe audio into text. We're going to build this +application in three files: + +1. [upload_audio_file.py](https://github.com/fullstackpython/blog-code-examples/blob/master/transcribe-speech-text-script/upload_audio_file.py): + uploads your audio file to a secure place on AssemblyAI's service so + it can be access for processing. If your audio file is already accessible + with a public URL, you don't need to do this step, you can just follow + [this quickstart](https://docs.assemblyai.com/overview/getting-started) +1. [initiate_transcription.py](https://github.com/fullstackpython/blog-code-examples/blob/master/transcribe-speech-text-script/initiate_transcription.py): + tells the API which file to transcribe and to start immediately +1. [get_transcription.py](https://github.com/fullstackpython/blog-code-examples/blob/master/transcribe-speech-text-script/get_transcription.py): + prints the status of the transcription if it is still processing, or + displays the results of the transcription when the process is complete + +Create a new directory named `pytranscribe` to store these files as +we write them. Then change into the new project directory. + +``` +mkdir pytranscibe +cd pytranscribe +``` + +We also need to export our AssemblyAI API key as an environment variable. +[Sign up for an AssemblyAI account](https://app.assemblyai.com/login/) +and log in to the +[AssemblyAI dashboard](https://app.assemblyai.com/dashboard/), then +copy "Your API token" as shown in this screenshot: + +AssemblyAI dashboard. + + +```bash +export ASSEMBLYAI_KEY=your-api-key-here +``` + +Note that you must use the `export` command in every command line window +that you want this key to be accessible. The scripts we are writing will +not be able to access the API if you do not have the token exported as +`ASSEMBLYAI_KEY` in the environment you are running the script. + +Now that we have our project directory created and the API key set as an +environment variable, let's move on to writing the code for the first file +that will upload audio files to the AssemblyAI service. + + +## Uploading the audio file for transcription +Create a new file named `upload_audio_file.py` and place the following +code in it: + +```python +import argparse +import os +import requests + + +API_URL = "https://api.assemblyai.com/v2/" + + +def upload_file_to_api(filename): + """Checks for a valid file and then uploads it to AssemblyAI + so it can be saved to a secure URL that only that service can access. + When the upload is complete we can then initiate the transcription + API call. + Returns the API JSON if successful, or None if file does not exist. + """ + if not os.path.exists(filename): + return None + + def read_file(filename, chunk_size=5242880): + with open(filename, 'rb') as _file: + while True: + data = _file.read(chunk_size) + if not data: + break + yield data + + headers = {'authorization': os.getenv("ASSEMBLYAI_KEY")} + response = requests.post("".join([API_URL, "upload"]), headers=headers, + data=read_file(filename)) + return response.json() + +``` + +The above code imports the `argparse`, `os` and `requests` packages +so that we can use them in this script. The `API_URL` is a constant +that has the base URL of the AssemblyAI service. We define the +`upload_file_to_api` function with a single argument, `filename` +that should be a string with the absolute path to a file and its +filename. + +Within the function, we check that the file exists, then use Request's +[chunked transfer encoding](https://requests.readthedocs.io/en/master/user/advanced/#chunk-encoded-requests) +to stream large files to the AssemblyAI API. + +The `os` module's `getenv` function reads the API that was set on the +command line using the `export` command with the `getenv`. Make sure +that you use that `export` command in the terminal where you are +running this script otherwise that `ASSEMBLYAI_KEY` value will be +blank. When in doubt, use `echo $ASSEMBLY_AI` to see if the value +matches your API key. + +To use the `upload_file_to_api` function, append the following lines of +code in the `upload_audio_file.py` file so that we can properly +execute this code as a script called with the `python` command: + +```python + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("filename") + args = parser.parse_args() + upload_filename = args.filename + response_json = upload_file_to_api(upload_filename) + if not response_json: + print("file does not exist") + else: + print("File uploaded to URL: {}".format(response_json['upload_url'])) +``` + +The code above creates an `ArgumentParser` object that allows the +application to obtain a single argument from the command line +to specify the file we want to access, read and upload to the +AssmeblyAI service. + +If the file does not exist, the script will print a message that +the file couldn't be found. In the happy path where we do find the +correct file at that path, then the file is uploaded using +the code in `upload_file_to_api` function. + +Execute the completed `upload_audio_file.py` script by running it on +the command line with the `python` command. Replace `FULL_PATH_TO_FILE` +with an absolute path to the file you want to upload, such as +`/Users/matt/devel/audio.mp3`. + +```bash +python upload_audio_file.py FULL_PATH_TO_FILE +``` + +Assuming the file is found at the location that you specified, when the +script finishes uploading the file, it will print a message like this one +with a unique URL: + +``` +File uploaded to URL: https://cdn.assemblyai.com/upload/463ce27f-0922-4ea9-9ce4-3353d84b5638 +``` + +This URL is not public, it can only be used by the AssemblyAI service, so no +one else will be able to access your file and its contents except for you +and their transcription API. + +The part that is important is the last section of the URL, in this example +it is `463ce27f-0922-4ea9-9ce4-3353d84b5638`. Save that unique identifier +because we need to pass it into the next script that initiates the +transcription service. + + +## Initiate transcription +Next, we'll write some code to kick off the transcription. Create a +new file named `initiate_transcription.py`. Add the following +code to the new file. + +```python +import argparse +import os +import requests + + +API_URL = "https://api.assemblyai.com/v2/" +CDN_URL = "https://cdn.assemblyai.com/" + + +def initiate_transcription(file_id): + """Sends a request to the API to transcribe a specific + file that was previously uploaded to the API. This will + not immediately return the transcription because it takes + a moment for the service to analyze and perform the + transcription, so there is a different function to retrieve + the results. + """ + endpoint = "".join([API_URL, "transcript"]) + json = {"audio_url": "".join([CDN_URL, "upload/{}".format(file_id)])} + headers = { + "authorization": os.getenv("ASSEMBLYAI_KEY"), + "content-type": "application/json" + } + response = requests.post(endpoint, json=json, headers=headers) + return response.json() +``` + +We have the same imports as the previous script and we've added a +new constant, `CDN_URL` that matches the separate URL where AssemblyAI +stores the uploaded audio files. + +The `initiate_transcription` function essentially just sets up +a single HTTP request to the AssemblyAI API to start the transcription +process on the audio file at the specific URL passed in. This is why +passing in the `file_id` is important: that completes the URL of the +audio file that we are telling AssemblyAI to retrieve. + +Finish the file by appending this code so that it can be easily +invoked from the command line with arguments. + +```python + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("file_id") + args = parser.parse_args() + file_id = args.file_id + response_json = initiate_transcription(file_id) + print(response_json) +``` + +Start the script by running the `python` command on the +`initiate_transcription` file and pass in the unique file identifier +you saved from the previous step. + +```bash +# the FILE_IDENTIFIER is returned in the previous step and will +# look something like this: 463ce27f-0922-4ea9-9ce4-3353d84b5638 +python initiate_transcription.py FILE_IDENTIFIER +``` + +The API will send back a JSON response that this script prints to +the command line. + +```bash +{'audio_end_at': None, 'acoustic_model': 'assemblyai_default', 'text': None, + 'audio_url': 'https://cdn.assemblyai.com/upload/463ce27f-0922-4ea9-9ce4-3353d84b5638', + 'speed_boost': False, 'language_model': 'assemblyai_default', 'redact_pii': False, + 'confidence': None, 'webhook_status_code': None, + 'id': 'gkuu2krb1-8c7f-4fe3-bb69-6b14a2cac067', 'status': 'queued', 'boost_param': None, + 'words': None, 'format_text': True, 'webhook_url': None, 'punctuate': True, + 'utterances': None, 'audio_duration': None, 'auto_highlights': False, + 'word_boost': [], 'dual_channel': None, 'audio_start_from': None} +``` + +Take note of the value of the `id` key in the JSON response. This is the +transcription identifier we need to use to retrieve the transcription result. +In this example, it is `gkuu2krb1-8c7f-4fe3-bb69-6b14a2cac067`. Copy the +transcription identifier in your own response because we will need it to +check when the transcription process has completed in the next step. + + +## Retrieving the transcription result +We have uploaded and begun the transcription process, so let's get the +result as soon as it is ready. + +How long it takes to get the results back can depend on the size of the file, +so this next script will send an HTTP request to the API and report back +the status of the transcription, or print the output if it's complete. + +Create a third Python file named `get_transcription.py` and put the following +code into it. + +```python +import argparse +import os +import requests + + +API_URL = "https://api.assemblyai.com/v2/" + + +def get_transcription(transcription_id): + """Requests the transcription from the API and returns the JSON + response.""" + endpoint = "".join([API_URL, "transcript/{}".format(transcription_id)]) + headers = {"authorization": os.getenv('ASSEMBLYAI_KEY')} + response = requests.get(endpoint, headers=headers) + return response.json() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("transcription_id") + args = parser.parse_args() + transcription_id = args.transcription_id + response_json = get_transcription(transcription_id) + if response_json['status'] == "completed": + for word in response_json['words']: + print(word['text'], end=" ") + else: + print("current status of transcription request: {}".format( + response_json['status'])) +``` + +The code above has the same imports as the other scripts. In this +new `get_transcription` function, we simply call the AssemblyAI API +with our API key and the *transcription identifier* from the previous +step (not the file identifier). We retrieve the JSON response and +return it. + +In the main function we handle the transcription identifier that +is passed in as a command line argument and pass it into the +`get_transcription` function. If the response JSON from the +`get_transcription` function contains a `completed` status then we +print the results of the transcription. Otherwise, print the +current status which is either `queued` or `processing` before +it is `completed`. + +Call the script using the command line and the transcription identifier +from the previous section: + +```bash +python get_transcription.py TRANSCRIPTION_ID +``` + +If the service has not yet started working on the transcript then it +will return `queued` like this: + +```bash +current status of transcription request: queued +``` + +When the service is currently working on the audio file it will +return `processing`: + +```bash +current status of transcription request: processing +``` + +When the process is completed, our script will return the text of +the transcription, like you see here: + +```bash +An object relational mapper is a code library that automates the transfer of +data stored in relational, databases into objects that are more commonly used +in application code or EMS are useful because they provide a high level + +...(output abbreviated) +``` + +That's it, we've got our transcription! + +You may be wondering what to do if the accuracy isn't where you need +it to be for your situation. That is where +[boosting accuracy for keywords or phrases](https://docs.assemblyai.com/guides/boosting-accuracy-for-keywords-or-phrases) +and +[selecting a model that better matches your data](https://docs.assemblyai.com/guides/transcribing-with-a-different-acoustic-or-custom-language-model) +come in. You can use either of those two methods to boost the accuracy +of your recordings to an acceptable level for your situation. + + +## What's next? +We just finished writing some scripts that call the AssemblyAI API to +transcribe recordings with speech into text output. + +Next, take a look at some of their more advanced documentation that goes +beyond the basics in this tutorial: + +* [Supported file formats](https://docs.assemblyai.com/overview/supported-file-formats) +* [Transcribing dual channel/stereo recordings](https://docs.assemblyai.com/guides/transcribing-dual-channel-stereo-recordings) +* [Getting speaker labels (speaker diarization)](https://docs.assemblyai.com/guides/getting-speaker-labels-speaker-diarization) + +Questions? Let me know via an issue ticket on +[the Full Stack Python repository](https://github.com/mattmakai/fullstackpython.com/issues), +on Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). +See something wrong with this post? Fork +[this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown) +and submit a pull request. + diff --git a/static/audio/fsp-object-relational-mappers.mp3 b/static/audio/fsp-object-relational-mappers.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0259af39023629c356e786cfda993618982dbc08 GIT binary patch literal 4113684 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

    ?9;YnFdN}rnRp&aX@ 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

    kLD{0_;8)fYRgAZ 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

    #E!6W^3#Q z32K-Aw*i$`a2Gp>n>7T@YJ>&=^o=RI=Va?zSL5fVS(!95u)r%}P&QIC1FS}$Nf}AQ zt^8(}=gt5($c~xWi5HsyFT*ohA-D`HJV|Yowp_%y|Xrzhx2yn6A{uA>{+aF?3 zPZ2WNhln$%b!A`-#`CDLg*5$M%v>(K*l!l~49IS#m0nJP-$ZLnSM^l*?6z3?-`C%( zl~K9>hZ#97^WxWc}yCg<m4WQ9}{pbGdo_v-J7H**Z2q`+5odZhAQ+{uNs2h`kz(p;X z-gYcI_vnUEgqaf;TD$w;;B%rzt2!09Z0Dkc7B9t6#1=W6yXEK zO&$;{KzqPaG!UT5B}N~@Zm0A-cLbl74=1AxA0x6T}DLl8vnpEF{>}_r2xqW3I$EH)8VpMoU z1nB^O2>qlyui+jLN7##z8Xly$kecgQYaky2#)MiXE>}?U^$Z3j)30jH>&U{P{A^4n zxjmTNGLM|p_}VD26sXSnsDji#ekwviFy01YAVeJlMK(DNu~C6Sc`G%Lb(ggGxN3K; zsBfYIIYx{dB$o!&FLpok5(RO$(>11|a+P!W1=Az@*Z_v&sp=&Gzh7?&vMmN{eMM96 zhi#S{eBzz$Ga|SpFSfm#NTA68r$&N?@z>?jV>P*jvQ=e~T z<@;&Uf^8xCHFTSZX|FgF7db3t>A(Ar1twRWJ^A(T^6%--Xp`wm4lp)L5{TP7_@jHq zeSF?lKXkmY5h!|<^ICEE=gft_zsRqnst*repFg^Av%mS?@cM7ovyyM`ZsJWF&u`kR zYGgTX7H)KKsoxyb8J1`GzwZb!0&*6ie~!2IszcoUDs#n>R5@Yv(X0*+@rcL-#Co+r zY6)e2CVL9F;?ZHGwgsi&@->KUob3G>J%_fSJ^?d6kunK{^YD{7SGxj1t%ah+XeCkb z*P>3pYgLw1uEe_=y(Ln(+#Ew8k_=2PgW( z`zO_U9po>`wFwJ5Jbn2*FP0ulHI&<*+A*gfPR9>iZn8^~tzY#YsP~N@rv2iNQE}Xq z{HkWRwOV}6mOUROeA_6xxtYVhOF3veTp!$gQ|32L#g1eGmjo6lyqH*;0f32; z`|&|ku(3>fG(RCsc@>c-AwqfVSo%i5nmAF99h@529ky;V`T(Wr$ABx%?FCA-6$mgd zZXf}>?A)HY8UR=24l_5-05CfSY`TuEfKT$U!qCw}|3K-}@oS2-oz4?22z^mzY-3#H zftJ7fgkGk4TeT)@J=Y(F7uS$llUho_k6W$4b3GEe@#V6q`nZsNXj5Y(@0a{LWHH>-;=cPEp>Jk z@>NfM6Vb?3k;+1C?}F{`vjr@1WP5a-tKE)pq#Q-LTBkh*n|x4L`cWuoGJP>#kd**C z!;TGIKpCtSj?Po8q{d>cMP1B9iQ zQkQi+S%M{IzNr^*zm<@*Rm{)G11|;udgBop-~z9FkF%}4&F3d+T3{ur;J2`6#`mv3 z<-J|44>&Y>v$Zac+UPCd|GHpQ5jD|1E2r_}?jgL*;D91YE8C>8JKKm^P?4-BNL0ha zpL)9~Hv5i$@Xs#4GTiI4)Mb9kYEKI@AIeL){_29!c88|WWRtdh$cv*s%EYy|or-(= zalkE!omfVLImzH{)}8?e2i~$;GFqv53|m5Ib|k?o-PF@%@06n1u5^xlgb$l)0>CpG zj|+UD-6X~kdTja-9OV%f2-C@U(`Y)p&LK!I& z-u)!HZmEI^l|R~j%FM>*zqMI=tn)zfIT2wYFMRI|m%f{a6&p&Mu zbq|$ocog){7QLsO=vM{-+R$}9lb2^_IO(2aTE8!fnSI)4;Fpg+yZAz10rA`0ZPbgK zv@jgE>H8Dl@~ea1uQ&gv6^|95#iYWe29 z03ewvpK^pL1jHBZw%d%~m80#Grtwr+?_#Mz$o4CI^x*!0e7G`Mt{t=87>y$pry8Y_Div&&F$HVU{zmQUJ`mi0j1jm7J|KF9j+?=DsnW&gkC*snj)n*8M!25Dp77x z&i>IZ%WV}}NUjI3Nsg+9o{JBTEgyoP%Xa4d*idfV*glcuMiH$oVqEX^p6fR8L*kz4 z($eW#!AcrcTkfdp(RdA`?bGHv4Wt@M6cTuEBMCRZJ2Jtb#Fq>4NvOoL4y^uPkOBRP@WK!9~4cFCnAgip3z$4TY1t9 z09v8+bwv1cE;&5@*h7vkUd_3VV($-t_$hh3mHdpgdP=cW&pA|Z4B?_91<-i<#GVYl zCHaJq?2PnuR`;pAk5|8!1|z=7!Eiu=o|$6JxKF^gwJld!*&3+`(eTmgZ0K*}V1_{Hp9*5f+KcWMtH&pC_&R&IiX)G9rv zo7A@Ex+b_#&narw^(N-=S5fBT%%A>R_a^=_j`@=g{Q85*R0j}fPV;7zvz*Tgs!tLR zFz zLKv1Oi5Y_z*wAaEO@BC~=NnrDTTPAQF9XFMLZPlyA3axFv_RO!TsGZN8?z9Lfk;oA@+)=$De zq)gJyDad!EJjpxtu{w)FYngJJm;&fse|0HJs{UBjG^cXk){ZB_(PX^nKo#P#+%siFA4CHQs9&sXAd;_F0pKb;Hsi@?rY3U0No|a{w_{6X z)A~RsIp6EeHvZI?ijkwI&pj*ixy)2><8ghKf>EIgQ@oC??Gjs}P;I-RLq~BftK8j~ zYo4fy>xs0W&eg2<7f&i1y5p3qGZ2N6_sk4FBFpCxlVq1eI+<`v<=f=22Ke#GVe;@{ zpZ`B+J0`9-Do1j%=zk91N~M{Gj1pOCA?Y-Vt(Z~vazm9+cI1yp%0DDWLV9W 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�nFkhztIxWOO1g8FO)yeq0At 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%0AdZ_VM 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%0D4rCXh7iBqth)}}@zKo7Lf|81!$)B$uK^aKR7 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%0A~y8BtSVRt zk>qmJ?^acXe%<637VYf%wZmqCSN`y(sPUn>smc-?LXqLCQ-#P4>>uSfUF%k2A4wJ; zrL~s6Xc}32R~o6DfnpqD`6PbPkRW>CL^~C*s6mH3kuuS~8n%jCxooM9RYWb^xe>%; z6yzmxAm>+mLr%`#xG$F&w3;>F!&MN4WONU77P@@bEQ0q^tG(^XD|J0A*R9o~Z!LIT>3o7J$y6k?NfK zSE+)Tb+eU3Ni4j#6lev+N8+Ps)gnaFrb{65WCD%}N%6c%lw9`>nam5ZyTZZHGif`; z0Q0+O*!%?@rKbo-qZ~`S>nv?zY6n_>>p}somdiX%rI^+f=eX7{bD0T!$R02q% z_>H0_l5(<7scOD{XDJs&-_N4*G=Y*$+zd((nBxMlQZHMN^;p^vy{cx683LIuvPwl% zUdhaL+*+bU7& zm|Kqnw3WAe`}%1nA+89heIJfEL2e(7j5Y|J1aR7^!~3$rOAUD50R}{@bQ7nP5G;sm zD}Yp;ri(8>G?Wa}yS+~tmc&h3MH+dc*xZc0plJ%8&b0?OIpbalTD(u1pA!{)&hnZ( z24m`SbIs^JM^*}^ZiUrHSV@w*oyYLS?skZlo7i-zbLhbDw-l>~PB_cQZ!bdc4&#-O z?OGSZDH&g$nClMn{P@XS5O=@BDmM?$+cY33c~Y^sduQ!Kr?H5EWTsD#r0}$7$1tb3 zb))mH+^@_ZmaB8-*MGl$+*=6VQ73|fh+ii%m)a>XkzA9Tfsk8^i|K}Q&fF_xG#_Dr zN5X{k?Z}+1oA}z*Zpv7A+zX{^q}OnFr*US|Q`i=qXfAh_@NI0|f~LFv(k$v62yIsP zkSWsbpDfUBGU?Oaps=EyQMm0GXk(P@=jnw?unO+Bc4gs9hdI+OZj648NcIJ?&`-Fiz`QE9Vq}C(|Ez;RGH>BCEA_okY}2u zV{WM$iW)6P0Nh`iojM`%@`=sx5Q)LeIu%`INGtUtv)>!(bNM;{4KExw zC*30%_KqCi-BA)wM1`I8SExkYNO zzqj2C;Ixg<9jmQNfO!3<<&Nn`!R-V&@%4W;NYh|1I_yy^b^rL&<->$YJ}yag{FLpt zf}+VaEon&M(tzZZHuDTa#1N(h|4<`I6`W@6-3t~X>blG8`d(cz$+6>y`~tkfXm!uh zrfBK5?tlz+vCxoq#g`B=<`?yLmQ;&If@}58^;~ww&y@@2>+M2A`HRo+uwr*%aFRzHwgI_7dXcI*$-L$9aNn2{# z&O8oEF`Bg%94iO<)+F|%5G%dP=AF@7wYoVv2nKdL4A2{m1RrnK)>&=XVjM!UO zz2`is?gu2j&ve~k>K`9JzS8Ry*7-2k;^Q4&XsY>sp1KEKq?e_lU?=?C1X^R!cGlzi zyPoJ)c;%jp3TsqOOvj(YGanZG6b4gOaii1_Q~cQgLF}xbtE{T6#af|yH|QF8bYOgm zn@11MQTc*VhcCHS(@SlJSNlTs!^=Of)BRmj9{iONuyS}3GbsTSKd!XBw6**;3C4(~#267&9bq84 zeRnOSa+u5XdCCY5ICNc&YGUHBzE*8+ zVxrD}&;RLXifE_S3h=H=)awry^`~O1PEG<`Eth0j>TQ;W7EOxFtL3$4lZQ;3!xS+U zR6NsB8>4S3bT6p^03=yWL2teejY-b1KAsiKx)ADo;xii7o3zh^r@*HiO#RO@A(n@yCujg3`1{HY}zl` zfKva-kOlq{cU^e|_UQ)UQo;M7VB5HN7=hw}h&qZap-X;~E-MM2P z)j8E&V-;5R{+F-4@0c6+ed(9U*Kf=Cl>P{LSR_tEReph>BIi3W5$oEjh|Zbad)9~Y z@a)$7SeBLPG;N{OHfcliLoO{UPLRM22cUoce7jX@pQDHnJqH?Ot%EEyfDjVdIruM^r<(w)Da<4nGyYqf7bhu^+ zP0}0Z4v-nk7N;Zfkr;t|GKB|MQ>Gvy$(hDVl)D{)o( zPRaaCA9|NlG$7J{Dl_qFXjc3$Dit{OE_g zR4`kN8T#&uUS?&N8l2)#c|1lvtct7#03O*DFH(JJ?iihTLOy=1zGGJzy|&(=w09y$F87Zk0yMXO4}Q-p<( zvBegLFN0^rsj1~K8(?X39mM6`1;G+e)>kqyT147{nb8K0fqVo&8D*J3tUf^rS{q1G zdTL5PF_n|zj*aoSmlmU6U=wI1bg5@*Chq*hN7`4r=e*3$Zb1A`=fubFGW;el-zn$4 zQc|<3GCpW>Ej{;{o4Rx2m;B;ksD*^SZ+Lc$vY8dFh5-R5u$3>cDBPv-2|^U+ZK%O& z)}H{WTzb{s0->$FPY@bQ=&QB35C9OF_(><+IBB;wy3Z_5!cF#$#5?<|LfF$n2&+F- zOAJl+;Ew3J5dh!=!N$WCD9F`IsET?29@QV%(<|rMU)iAq6{`Ps%qJA6)%7H}{$mNU z--XXFZjAeC7kBMSn1rf+f_UJddmXI%OSHvRVG8_qHYqbhj=oRuWF}wCSr1BLR6}Tm z=j@DECU@kyOPTt2 zI{lP(H%8XqVy{`A z007$K_}TnFybb2CrKtFP*I~hFGs_iY><#C=Up~WqVVvp z$uw9JVM%Iv`B;kpQQ3;1ThjW&CX{>*_6^ubR;Q;*;vz)umQ7nFd2XwZxb6jJ@OH1{ z?3;UIgr^} zlcX+(p@h2JW(ralmuPoAPKM$iv3Yj4YCZDJX!>!#Y5et3B7tSbNW z567<`!ynWCxs$%)T^di3DS-!lUM)`>SV;MJF>n>v3N*UJv-P{ZkA1u7wPE(fFTXRr z8hSQd_3HeA&`T?au5qwO{3~^@;ry|4)InW`3KO^Zy|3eE3ssLrwv{BjYQ0j-6s|V| z`|j-MoAu}PL{Ht2s@8W1tjiO*`fasO2&IseSYVi>D|0Mo1UzY8Y9WY*Z0m`*rL>Ze zXt>mr;Q+c=?(b1O2b{ifnI~{3{Ld2DsY~=)33VlcCHy6472_aMqG@mv6{d{fFXBXZ zfe3rGi!KImgS|7+j6fp5x{Q-;Jy z(R)kyLu#gW_Lo~*8a`u<_pkq3gSb3c87WBocY3w_xm%K;Cf(~ei=`08>v%ngBozMt z%Yl_$qSsS_{kuUCgbkXvo&gHX%0>KWI|0nw!uBF>>`>6A`e7)D^}DK>vAdlLG17Kp zS%7llftShwl24OM-`nVfEs2mOQEgogUMFS0PS>d&ByV?z_n0~Twf@G1Gs6v&`Hr@5 zFR2QfMzO(DZ=Zy&FBc{eB1Qb0AGApl$mC)4Mpa|R-9Co8<5B2AzZgnZUZ$d>`;Sx? z=yt5+kJ9ZAq!;cr6f@1dNoqSkm?JzqTR*Sb7;!Ect-f~61b6G~XCk@&oxW#mwm~N} zxbq&(P*%ZmC&5@Yy3Lp_mK9M|J43y^8&fRQTw^pQ0Ir4pBoW_f0g3wqAA|Eeh}G_B z(@XK$iRphMXwD+wG3mtGd=kbO0T>quLPjVD)_L|R+;tLgsxl`7CZQFPG9QM|0k!_5 zdcbe?Z_lJT0W-_;!h*QP@nLu_>$Tg)6SQvQ=uhK2aZvoHyXnVW%y8mVqb(;dxp?s^ zIv%6LSLxC+HXp__hFr!=X$Bkb#KlDM7r(q`Ce}JsE7<)1n7YcaD7$Vw149omq_jgf z4Bbk1H$wb)UVE*3t$p8c z;}yFUqwgajl-tA6ckYg)YDvyTiXpAkncU2-*L3bP6fvKrtMaG{#93GV2q%(Nz8P@| zx#4@FH!_RqDerbeiP^U41q3FO)A=~(=H?d1yvECBBngYnhK`GCg@&h2E5gKsFw?$5 zNb4<2K56^$A?qGTri(DiuE8^<<`Nq6b36sqRVGcJ&e^8uix_Cryf2_=w6lqdTEDVX zenxcp(enZaTrF8f6Ln$BUUINt^EA9YQ7R6bxsa-6(AL+M`DR)ZWf*eNMaj#U$hGE6 zEnvELebtJ3z9o+EbBA@}xb=i|XXLH#e|nd^4ttVM;L!r#pA_AeIqmj)HEHUjz3X{V zC*^*>@sm*RU2e4tREr=~)<5%{QC(P&d4yePet*PDXr3994+9hBT*Vcwq!tk#sWGqn zH};$&Z?@4Hy<5n?89j|zu~uzw%FaKx5H1K4A58vNL-5kDhK)z&u zE$<{C;-h6X-knnqxAGmH>a~@Bj%$iMg3GL4L~$p*4uv4_j!_)zEZ{k99~uhr>qrq} zp(at*(>BkBw)eQce7IK!W)p?v9FBp93d|5ODQWAF3c{GzXzI`64OEX>7CF?pMU6qt zaNzmM_|tl5%Z@eBSXDWc)H6m?sLVUW|TvT!qPg~8L6d`0~u`@d@wO0xv{xG!p9! z$o4v(^AQ;zt;RM(@akg>yX-fcytUHYg0N#)F=GHtdmO0FIYS>~E8sE@$+k2J0c z(}8dC>|19%SBqQR&n;V5V$3K`?TaV4U42CA246O7JyUX)r!{nokN+kx_L2dcSvG8W zw$k!p4eJjYZ_>2rCNG7N`G`0Bp9h8UDZIWRfok$gFRkSbkSn| zfTK2{I+Q}p*QK_uubpM3EDNAkU9*xQ2d_Az9Y@0O2-XE(DWa$@oQfRfL$PbULJ3&a z!T^d^w=~jK{P76=zIl7*^Op4o54SDLkO1!oJ@c!sQd^6h&D6|@^WI*o?oe`QGO zcFxw8eaZ{?o*2=#`juPSC^*IYT6sP>;^3Sh_gR+?2DjAS04TlrDEn?>+ zArZ?x%((cC=%W=l7Y$#H$+<~-v-q#3PgXHrZq^#bwebu0a zUerW*omWUqV_%Y6TC*gr?)zy8($#S+Jxvvko!*w&O!R3RWBPHk^JG4qSNy6ISfDv4 z6w**OVPni6kv#W6_Jy=T`;bYOXPTF3dP-W7VRWi;9v@RrwfNpx@Ey7MnO*k1ZLzpMtSna-5A?zudK5n&F9Fi*AEHs@QCwg$B4sIz zSvytWW4cgd>3vB`lOmjj-OJ~r8MnW67C)~_~H zr)0i564JJgh%9LblU3#$l*jp0bC+cY$oMHYAuMK~zZBGbM@;SY&bx6s6C zRTyM#?5UyazcE}TYJBd8 zr__>MYe&TblZk3yy~CY+K?mgH3#o#`CMht_o!EF&41#s56!GU)8iyqQ7e7gCtfX~y zrk1L0Qk=gD2Y4>Uj$HehCJ5u(yKmAYqbjwqOVjeV+;!BhwrSAnQA)obFJ|b?~$L-|g$IRu&nl z)qFSt52K-LevFhVk(1la9s4@j=?@gGkTu=yJarF0Zp0kHyS_}ftbP-VO9wn@`$`bd zWCgX75NGK`qKoeWyG`UxoulDT9lL)sdK%6*24^y9|01TrlX9`7@wMA+2njb(g1utV4!Ob3;O$vrcgf z=bT>?5&!iJKGBqI-0F1-dDuy9%TIRVHHY}BaO~?x%fb-SBYxL9l>}mhkWmLY{r*nJ znVzH_r>xd0Vi6=4xN@jLnB%|^(jLqr-Ol5GPyL%d0&w0v%=c$Ah=Amk5_h~p%9no8 zaO1ceUz;`dZ$z3iOzSmrtRRt>!iQgolnOU>PQj(+MZVPEqe0Qp%qR1@Q9NQ?#30)e zN9MRz3L@*T8zq<-gFrj#1Y%M(-fR|T(~_n`1J;Pr^6$>oPkgoO8S-i$v32`A5at$T zURTtSU97lRnaP_UnT1a-FC&Z?RxP=GTn%qm++ekuoxxmYi+e{CBPzv`79n}Q9K}3i zvDFSeX~qZR0X~{KIq;S$9`&iI;FN6ohuaw@axw0w6xnXN*iSp81H=wL-2b{?x}Q3z zUueI-{aYAZJ{P_J{p9yg-8Y{HM#`Qr{-(bP-WGnz*IfzVuD`~6v}t812V+6-7t=iv zM01Q5*!=`#o;xkM>e&A89FZJ4zp{B%FeAK!0>p}k3d*yUiU~4df(Zom*fQ;8L5c%m zP!g=k4W=9sxoKc#kM=h&J!wZ9mT^}vZq`@uwGp<-wQ2RkW7vA)a@g-&)LBWB7V2V2 zQec!oo(5S89eSF$b_1@yVDqq(j5ieTtDrWj9AP3Nrw}13OA(Gve|*$JR`YwyWR`!^ z>IBTuNJ6bApwB@VraFKWr69|;E@a~xAl9Ua)%_-aTTVP8g28A?zQVbND`F-V>*XG&-z8@gfIK@4-&1u$v7v{9Bt4agS@cidLpnSFO0#`GAjh#$0rbI zDB*$uY?z?B6&0lYW00KWsUsP}?rm>&%SWo6HE%$9!&}w^=(|ly ztSRb{`#R<1o3XL#>QLbWIaq;UjGlr}L@{nl8hNZ*)n@W%Z`b}tOD69F5@Ni))D1Q+ zq#?cT5{P>cCEp)Hng*(_Gim}1o;KrcY(BMCc(SV%L&V?xBS4eC}i*LwWhF$P(EM5Gpdi}e(w{wSo(7Sd0pZ)st z=Kg-cbP(?Mlx%^P{i2;7c?RjCdo4>-6k*SQ2@OPi^E^0h@$j8 z-Wpzjgp~{($l8RD$;#{JWs`KnI(TrxUy;L5>a zO*3=ajCwgy8~2nuy~?oZh{7y|p!!pQ;F~LkjE!m}H!(XkboI=|D1__{f77K~BfFzx484AN z$YN*lnaGLMnnvZu`^oopO#lEnAF|&K*h?a%1RZHUbX?v^v| zQ4BUboP<AX@-{E0#hpz9V_?rQr*ux-e^G{2)X{L2dwYd@SFPoea#+hyoZ~ zy>p4TW*GvkQcuH@5!O4Q`rB>CT?GV@8?Gk~i=jB%EM~3~ftykkL?q&(?7!Vd<;b;3S1BK5L z*5neJ@5@T+a_&yxntLK-ukslC4LRiO`-Q>pCDH_9e9eaZpV({u?3uxMg4Gk3NxJ>e z@yD)PRmtU-L=l1ylrJ=SLSWzmpm_G@m^{`R{ISBf5o5HeQAPM6!qG&sEpNtn(zQTu!lp2PNGyV%KtpmWKQQGGLcK-rP^t@A%R|Utr13nQW4L z1_gSI3-=iEb*o(@y-)X!E^h^{UK1alPfSDyx3Q=C%STDv^b-d1!O3&xQWNdu_8I_dccu z;5v<@6zDm9!WH3|g453<40dG{V#hD}R9D*drAo!Jcur5?M3qnUSawcRJyD4_d8vo^ zZiPXnNW7&Mc$a0CL12bO0<4t|m{{rHd&7E48br(08BW_9!$2M%oM^|rGA#nP&j`K3 zII2kQ7=OXF`!=p(&NNLW7t`an^kKvEI7aGrwI6B4at*<-HQT4aR77RkdM0NE}T z@d3dE>sF-0jduxR}n!c>E=@>P6uR*@w(qAB5ldaISs8&@}o;@H*c!6c_g^%8x0Tp8o{ z=ofHJ6LD2&HjJ!7-_6hXjq1L8M*huB)L7wo<@4C7kiEmwh}LX;h3xTJ1b>e3!e`^V z!7C(B`aU_W@`J}wYE4WWmSXwJeL$ji3zaKjSm)82nOb* z#;RGTw`(NsOlWrYkvvHmWhjz`0_Mx3NdZC`%|RD6%q_#jHDwyPF&R_T+1Pd*INwQGNk#{w6;B+T;J!DAem{+`=XX4JV3X zCMJp44qhQcFMe*j&()sSsW`+FpI_6j8Lv}Je_yaF3T*meQKYK=!mydJtD?WIs%Ka< zI|}oVQ#*+?GeQ;zl7Q!kqy47Uy*n<+qT0>=#@JhUwA^WHI@CkF8oZD^{i>ghh)Iqu zudnE0IKXj{)<;x0t*BZlkO=QY;`qI!CK5yj_~PK>$4;Hc{}jGaf3MQ|g{>G22*HKkj0z2mh9u}eYQ9Iru4D#%}lGG z_fNF?Hjcg$vMve3B6r+iEYZ`r(Xo-)K<8kZP%77?_Jvj7l091Amnb_WwXZ6FA5QgJ zaGvYnVy{NK^FQ*~2LS9hPD?*c5rKSAT-Cp~kQ}<}fWC#^i!&aDK>>ckji2Y9n#}Dn zE_{qDwWB#{8glE-E;54fG?|`%TiiCdU4LeK7*|JfsAfh95+h;awKcMOLNIo!5?EBA z*!$wiwf|E7-cqSL>1wf+YNQunj)&_6!J98-K-GNWGQCbSAk>QEqFEUv6oFaY*0Wpk z42M4zSl`7}5V|0$*Z>hc)eFG#nal`tIH)2IkJC-Z|05VMNdLTBd&(xer7qOsHs-FL zBsAwLwD`U2Bq-mliy=1cF;^4Rle z?KvN@asmX$ulAcCqVMY4)Lj?v;lEqo^*&Z) zzcxFL{^aBC_tRa+^`@;N`*W|bB!QT^`PIujTkN5n=9|;E^NFF3HaR@6nqN6)@dTEb1d^AJ9I2hCF_buPt`=jBO%h64EfHn!;!})Y(kKd_* z@hfg|g5I&;KT4^$5#*bheHir&+;o?J!{0JHp$Jd0SAAceHsXaAz}W0m6Jha4y-oU< zgwodvocRpa-BlT?_{yXZbu)*MfBF)Gxk5zeQ_5@A2D67%%gOeexpAYbYY)p7)-@gZ*b#-rl`Lvo@pG%bUO7`B6P*IuWC4^hh}u z0K>?|8b9IwY($ARq*`}O61E>JMw41yK?BI%@or+YR!~D)UY+{MjdEt2xo>gQ*bf>w zm)XRQY=eo|IaPk2nPc~i6El~D+Gu`E2LH7HEn5t0oS zKOZ2S9A|jeY}T9OWUMZf3L;3>Bb@M|9eF^_(>C~>5J#X)8Gy8h}A4wj1M;4t-(Z%30 z00;a98$NUME?SOO`g}LDhoZ$v4N#dx3Bx4Z3*$I>gk6|2NQ#obEXGt1Na=i+Ar0>J z6vDOf#vMite6%4HsWaH8nRWOzL+6li>T63S?Migsl}f89=oJ49z+NLfmDI8FV2Yh@ zZ`D@PtxiK(oQEgB*y6x7Z|#FV3Muu-yQO7-i>p|3;AL3_&ToTWEeqofp~%QpOEtQS zCpNVvohFSlE;l!bRGRg^(;5*S2et>n>@q&*R&?otmacB@Z6=0)Q~F~7VL`vH^^C=-7J1Eq}&y**vZKe5M}=1Q&lqm}pcpZY7pk-2ddbKXKH# zkLK z00gXrj_;XGL{?{|pu_R(_A!Oc2eFf?NxhO^IsvOn<|t$BC?9fySxqD0ekg=0!({8% z*ZDqmVPR)GC*L0?7j%?54;A83EyLfl#-cF9UnUDs?3XgF8YQvu3m($TASx4yO$zfY zfwW%wPb7IvZ{I@^5-3jMUQ^2;=0HK}uqC{vX-W5@7`4=qXfvTS79SvoMCr4f(BW?- za^=K1m;$2WD1GJgp_guV=5_!~{#?@VTeehwHvg?&rcKpy6BnnepO5eFvd~P&nL)+0 z^>>?tg;5@(4}h==1ukVFjBs&dfd;7T&etI1E6hYN*o_KMilxh{XQV%$`MFQEH0_aq zv|*+0{1++Xv0;^^b;88us$pq*ZvnDfEdtIxj}mViW8N$gGi$?UFvUA_xgEpH6Q%6jMW;QtX_V>+rqfCuBH}O1vASg^=M=tw0uc)s zeAH?cTsbM?eNCN}Eguo%ufk*lR1dUy%xChj+0gpe3HfYW-d|5xM`9bH34Gi{j+v}+ z(dxo~^^(wI9Vt60NR|-vZ%3sYPJAjghiKH`&qpU4iUX?G77QmRa>!kxIY?vQl{J=V z>3-zMlw_kaZ}6+SgiSLYZj(Q+Z};x+G%EohC8sj}`af!u;n*&Vx(v2@%ERey3d+%7 z77!Q$gIEvgLY$K#GJ86r!8mw@a0m#dm^SpQn+ey=2~UE+Xg|M^YU9O&%cE(m!G@>N z&sHQUUGpLrX^-rQCF~>@I=IaltIZJ;cGaYX0~#smmSOt#I8hJil?mgjm{7^h*l{UE z@WR05MSUl?C1p`X%$8L9MHwG$)d>*FKQ%p?FIV5~NndkO(KM?dNgju4m-+_Q)Sw^| zWuUjQ%vDh^ur6G<#-on^=4Y%6uI5w>ub(GAs0GhH8320gwDS7Gov+%d`1&1&Yw+qD zbck?J1h7&S8QMPie#i(GHr3T7$uy%a-5XuE3J$VKkQlw78@9))7mpflhCyJaM0;(s+u7ywi=Xwy^k zW~rPtiXU46nEpN->#-s57N5~J{j{VVS2S+-Ez})DgEbjJ5f%J^Bc1VSWi>rzz`4;= zbpSWd*XEb2(u|}crc0z$g3ipj)?z6zL9!zZV@eq!Zs$=L4N!s(lY_tn>{n4Jb85MO zqcrP5z`i%&P|QbK6(3=yt~2&S5g${a^@VtI<^`RwMprA1Thi4hW(-}%%m#0 zN(40n&>|E%DLi9sjT(rr=)WLX~hDWr}p!MIx0eO(S9 zh+#quQ0P|_f~FZ4t3bmy$CM86;0c<3{-9`M=L#0&nh4vMocp3+^7}Mjy{$Z4Ir8vIEE3I($P1`r=Gb^Mv}FHI7uxsN6Fva2H=Gtu(a;}LKh-wc^mL49 zDyPGbPz2KUuP4;aoHTHl&a?=C!>(^c|A<0|%33Y-`JTDw>>rMv1uREn?E1g^XIwPx)rJ)e zLIOp(9v7cET1uD8e(EhcaUs}j`NirG9NemNuU%;A*Vfju89O`st3ppBzpw<-h_ef< zS_L$}=d*E$uQFDtNwdEbKQMS}hwk+~3*N0{D+wSjp@4x`+n_;DC;8l~T8N=tQoA_*lo z1YroTyeN#j;94#a7n$9n9p|I!By19n({LJE_kW>h9Vkn7j1f1fyVc+u#H~>#M2p4j zGkEeUwV-c6jr-$BQAZHP!LfD}>m049ZpM%3Ksb-M!gEG83Wa1A2RSH*g2iU?jdLD) zzQ@^y=UJ13H)qhs=_WzYWTHx>odHwJpF+dBzn-uPxW#f@I7J1WP#|$@(Wa-BDORbo z|KF zFs(Fs2yCxnJRifgo#z8K_Ig#|2} zww|(S9n3s|(Vvo+vx0YqQOsJrUrgq&TJW@oyBJ4U4%+%7`+OXN`_7G+yRB%~S+yA; zMR_N$Qoh!za2F4ckT!8O>AvPXzIH?yDaH%1V4cFcyj(zgWm498zd~{hsN8L9cHyKl?RPN1p-rnmKiSy4&;&uZIBD?qKjm zs^+>GmhcsTmdzf-{bB2n3nkz;MjHEuN!VYGHdi?h$)(FrlE&qrK_!T}FwaIuqB$>v zWMle50*sfM*$x{b9`X;!S#rB;GjWd};MyA6YipQF-}Eb~wcM-q3tLZMwh_ehE+5*v z9yTUWbyO{BIJw}SPE=7TGIz51Gj%a@bKQaFkM8j1<&jil;p2^l;(ACIP$~j7V&}d@ zBzN{{gui6O?k*a&FjhxoPAt26NjjlYcw}!#rYJ{1gsMu^1=2aa^Sm4r4@0IOsgJyx z&HxJ>frn}mAZ(R2wqjx%n`5G&`M;j93%I3pntz50LiYs!JD)3umZ}ht-1%p&<7ta( zc1v`QJVF5A;)su_kdKd*ub`Mlrv$*g=e9YeXIRUdiSl3H{J7n{C>VumAt$3z)5zPR zB<0R6C(g%VYO5&d|J)XVgVXRUCmt0TU85;PiX(s$=IJ{nUycmxIG-o80MVP%6H`V< zRUj_6nR^Kulto3IKoDYVOk@{d=km;O&z|hZRR-RLbrMZwJ=S^A);6ox?98jGWN|z3 zC#Py4I)}i#3f)UXO!w3oV;1ey2!~C5EJL@`Kq$h;j7<;9+PYo@5qXy7EARcGwu45O z2Kf#tI6z4KO<8=T0ulwrcb$%)z+{r&@njP)Y;`^B5@ksX=FANAgNU%9j8@&POyfWfmfpm>?gQR~==0fCY0?}wePTuwz}j@rS*JqN zLmDWD)qE1)dt)YB5T@~X<$l~nJy8>n1(Bq%<-V4fQ~Asq|1#7114F2)gx=wrCogS8 zqhgg|`F>lz$Na6b{9jM_fxM|f=LtO8;{SL8>ko9sXn$+{k0=Rul zj~=~R$q;^g?9YsGvLUd`3}qCsUaZ&+gC;DEm;aK!HZKf_!Hbn3Oehm=hEz zOBlQ3cBd&%5HT9Uli6Pc)WlSD(3EK^`6`GRV@E+`x&>J#!9%iY4n|m~M)hiw8;4dl zPRKrsg4lh+;mF1uFSOAmahiUo?LmkEspTI6BDG01e7kXogouTWV9zDh7-j#cZrbrl zJtXx+MXq8q(BYD}cYSWsT&;t~C}=_YOo{aKzRQnAuc&5W+Gs|-c77*DYNa+|hHghj zo$#F5iDTtocv^Cq>B|p7yuWkDrPxA-MHWBju?{n0ROvG+Iz6VaXEOZAg0Eh+A$%e* z1peslZQR`1z$1|r;2v`u6keyYV(vdnRC*5XM~_!WsE);GmUxbjg6v9$qUfwu8EnJk zN51VrzT$qZkO08Jux}Wc!SD3*dWDEi1{zciw^+GfH?3AG3Am$BA*UpHiGOGRdc>Hcw;X*CwFv3OExSQipp4Xx&V!;rSts`0fZ zlNXq;&mQVAVo&#e-a1uWj{dOK)VwoWAAn|SQe=R7PH?Klg(1Rn6qRd26U1SfPCFhCf)(Jcj7mN$t2cWzrtgA1D{gO-P!-@pSiVi3F2M)5;)1I&-R{zH0ZQcUx0-w?RV2b+C3vJn;&u7afX3?m&r(3a7S(LLrWN(ZLBPYtKu@u=$;p9P5&SD(W?lTPM7EO#kKizwudnWuNTxYbp)~smkwH|8H$c3IJL(x zF$SKillqnz9LGNpshywi$o9s!8<`T}{2fI&Q$H>b!zq0hH(90P25|tifLJwme7})j zD1mu^$=JBKG+$wBtR$KGmcZob8nd#;%Ih?kn$PujqlNQq>&;_$(j94nSs=%kyBFd` zQvAA&R0nQSS#w&6Cv2shp!q7Ul%*$NP9)}z~us#X@9+onK!Ij{o*uyuYa$sUK zwS5@vy5>TTNR>>UbbP#)r#oC!s9azvHbLDf>06Z%MQi&?!PnO;5fg)Q-cL5(smDl2 z`KdUaxs^i-S+j5I1(%+V#=?O|Po0NH0DhfO#NOl-MxSYgn?I|RUC7475eL4>oDZ*` z^NyO%n~F0p3;!Y;uae}QksNn*?;4jnFJ~HVv#uZ6&xOtZ)0Cb^-h6e^N0VS({^JR> za&I)Qvygvd&)-J~L>S%lRS!4UI=XpGGoP`AxGgT|X{BreC~#ZD6@w54teJye?RIN( z%4iCLg_5OKY}|YmfofWoBS^fUDF8*|N-bA2J~}9hf>t5qI>RFzlo_Zkd~L%OmCDK_ z2}lH)eemdoVQF-fq#PLCR2-Fs`q@xDFOUt_hAI^izWFFF510tXoXlYpfm7fu!s|;3 zgHlZxk`%VuPzjp1Q?evalt8FBAa7W2`Mev%l-MpFL<|CLRu8@woHmuKn{wc*1CmdJ zVNo@N^}=l4*#R4iPTk-}Icz|FD{jX7^r`|RRUk)!(X9=!t9r6zHSQA*b4TlCt%U|d z|11(1v!0o2W5rOAY;)p)d?(lIfPT{8VbH$D zK!)NGJ$BP&zlJ5sBrj2DEp>>!Mk%y8BZ5CobG8R}Io~l%41@Q^V#$=NiDSd??R4ww zfn+zSOw-dJj%euPpY>-#_T#;-AUe2SBcZBn@;RBJn;zSr1{%s=^<-~{1k2-94Pe)% z)9|p_!%{|MnE|%uky(wUZ^|aHb9+H<*8^{q*>reu^hGk__m^U7_@I;=mmne8nXTmE z*@5aDAO$AX#ooIirR+V`I)}*Uu=c-A>5oVPcHg-_KIr`8zpov*{fZy|_zPg5Upt^b zW{lBP)|gOm2jIAj*Q_2tV_cmS0{~Xkqcg>Az>?I77*rCx5xEx7W8V(tD5l^6dRbd@ z7ze&dZ3W75`)LKl(imrQT(RpL3blbzlha-LbyT5Sj@!`#ac4+O3=VbK){ZU9jvDXF ztWu*~yA{FuJ4*7@WNI0>l1IY&qOvoTkaTg5bjAf|x?NBNU@K%K5?IVUCumo*b7%BL+mAtCR zdb7KeO`e=OSt1;jhRFAh#O=nz=F|B?;ZCT(*JkUOxYg$^I%V{ITwhJHFr>_LktR_A z#rW8`gIE2>^xIZ!5+RE+cuMrUlMzhJwNA&&4VF2Fq}ryoMk&6cMeTIG^<5V;#G}O8 zVgepYr?0$SUta3fZA^B*n>tQ0v!-pAsab86>~g03FlwTb8A}+5)KC=EWoQQyD z@cC^_afuB7B15FNfmw_FCal{YAnu;1*|ZVLh=Ew_*aG11gKRpNvzpA!}Y~93V@SW z= z^t#zE!Q)|kTpd{=TxE2wnOhsdl31;sCEdNB;O4!@Mo}MRR8;`;U&Fxo&@N%PkVN!S zWfz!;1KXpZ1E#03@hNx{V7#^sElh#3<~^b97pAal@uG^7c%jQ-^?;3)(!8$QUSbMh zlWhB&e6(Dcc0SWSd#}%fl8kyF+afV!o5v3|R&uT-5>yWFp(J&i*js|PRhx{_IVT?r zzb3`FEHvB=3ZhkMedXozMG7xPxaAqfucv!f4Q-Fewpr5_C>Jaiq^;g}1&gPUv{Zd_ zRaw_rhqq@gT*~gWlz89NxLwFUG{(|;bV)BVYO91lGUmzd#XXZ=lL?~k0YYvkLMYjs z^yv`0cnP|DQA5`2Ux7``1EG;4b|cWxFu0-u`;fSM+BUa^;L_vC406jA(l?}a^i5*r z1`dp?2lQaRJubY>zvBttkvFfMmVfFvQ2le=(a06+)$}G6{NoAXcz6AihmxPc22!a! z*&bU{y4fKhRzjB~!NgBOg^}h@_{w@ruwLX{_^}#r_%H1Xh@ihvYZsRCd%Qs7r zW*Ve)s^;C_8+iJ33?7Ym6kc`;SKOP(B=itG=-XRrRab4d6u;Icf3nop@UirAFRiE$ zcJR_`v(Bm`1<$>Bq;ekrG%|VYqE?gTLuxA6N*dZ?%z`pskU=mf@_Eh|s53&-=OW69 zH~iFcT}k+KColS?=%$9kUj?eN+Ds+$nwFetuK=*T*%oh$EWmWYHfQz7XzIwQV_DT` zC|zCpUjrQgZW_@9d}cvw{~BnZSnK~8hzekeYT8?*8k~VCV=1iRJ%8s4cTCt2BC5tv zU|c)KNlM~#0=$cn_q+=vKsGqw5RW~pVPR2p)umyInR%<;iCt7&%ftI1Ns|c2@qyZ9 z&WF{3H&KdcX=0*CJR?W;u8X()`EM~4aO3tnVFSpZ^7jl&oYpW-;+994{hs0JSsr#?^G+oasvk63y0#etJRiQr>Sr6d?$gkl72G$9GhdV z&?SX`9gsMwb%zy}PsM+GdF?Ec7z=>j3es*K~g}W2vc|k3}h&J10I5p$aLaxDdqq&&O9d3WxjbjwO1LTUN>aD*Fp5?Lvm zFST2W6%ByR$gg}vG+9lM&5@jj#PiUElGylG>W^i_TvvA_t-mVG3t_~+o_6hW?<>oO z9wtVr)8pq-a9}bjt`qRukt#&V5AxbI$j~l1twDnYNcE^79HNZgdtTO>`EktUe12sg zmB_U}sAenA|~=| z%W|v3Q;xQ>g!$UoNcEvSW$&JKe`!IIdhJ6F#p>u4OMd=s|J{XbRs|EMM&+zBj!pVn zLtxQ9Q%PV;wWyE*X^)B#suEG-+tWL$8)vs2B)i?f17{D_BMCfVPd{I0y^geHId&|K zmi{%b&NgNYZAbf%rYL(|XTG{=aPHz8_){}`np2wlGkM5QUypWf#j;=q%IT}Tsq`bB zbHn!?{pL_-`IW>n>}^~l8s8%TjbMZ)mcGBb&bPlu^%QUug?^&Ok5()H2g=MZma3IW z*!d@xGK%vkwk)w@+l~o$b-N0d$1OZ%DaS9IPy%O^&8^T}_{nlnQt3K*hmkB^eJ)}+ zqD1nfXB8bl#p&tW>(#(=aqq z5<|s6?l7%8QK2Cv&-7F{fdgCDd;FCO%nq&_0R0R-47HtBvH?$F;u>XQjR0e!h*hp= zu|!2z)(to_N1Zk)j^h_691*#&F-3@Px79 zfZV(Fa?G&8i;x|R)e7=n%EI5=%01D6m8)Sw-Kg+Ka3a@Hn0qD?T$e$knUv9$=w+zBKe{pp${Y8B_ZIn7hu3SP-b;vTn zCdSprw2lR|zKlWa$(DCpPD`}`vf0ze2115*%B4r^W) z0s?_=dByR_ca@nb9?pRbh475&M1TGo81dnLg=7(;O45F1BjM6Br?do&i&uXr;8k;g zFT0QXExI4EPf9VMOr{bl%S48es_EeiLupM3c&;p30}9q-F#30jA7el?XH8)ZEPqG6 zE&v1}5vu1tvVgxwwI2Wwdru+uV-|w`|4(fKEKv4UyK`ZXyb{C%Vr1oDhuhi zX5|y`v`c3r!eo^|B1Z{uz)0xV3PQ(Y-{aE?_hqX!mMP4diJ%MKOd2p6bfHaX()<~G;i6HxKE*psfOE0)RPQ^-1y zVW7sPZJ=b2@k1A;#r-V`AgI1s{n69{h%5!)rD8X}{>(w?S6GAifUKe-7^_zBIx}=c z)dvj1LK0s%#rcj=(IS7!UVT2?K!nL%?p0bh(9r?u07CEF6ACS&K_H#DGBC!2!Ag6Q z!G|yigdD^_*d;ezg!g@HKz5laM$7?Dhpl5u0@R!l&;uZ`w@KQ>!N6kpa|lx7i@Iv{SUjMkq7^0-us_W1b=th%M8V+OaPQ+yMi=cM{X-meaLap#s>4L zNKSJ2XK;(wcpkPY87mG^5jP37X_nwC%7{~)gpO}8Mg1N)RcYqq@%4vpe55Wy*RPk% zA}jVk!xcj@d3rw^krZSd#*{@^W{9T>pSo(9O-1V$eo`)7nU%7k!I3| zSlMu&-W-+isPp>HkjluIZWK3q8O1m$;Z|iJ22f^(Db93^WFdTLDaAIL^)~`b_?~)q z%1k7fH!i~NO5TBW3h>t&oNQ}Cbq$dFOU+O z<!Zd zFhVVc`B%+ORDM=O>EywHE1J9T_s{%tK8E6ul`(n0DG#q^;5)K;qAV*eH%njj;Wixu zBlux_(bH8eZ>J`FvHPdBW-(RfwrdjoyFR9qMt_6pC%~<%{lZH}^a=WJ4N3RBR4Kj} z_4f!N(Syw&fuJ18wQKa>7<1!)%2|~Ns1O`dL(srZSREmp(P^@r_ zJgo7UM{?pYaq(_hpRqXEc$*TAOH9+;G~fVvy^nNp`skp6InZgk^byykHEk=>GXMUieRWvb)RHk0`W#*bIZsOL43mF-Zic-qzw7g`kDWG*#+u#DKkflz;*OiFYi?pEcuscvn2zspTvQ6V0A|7<1RCO@F`TUb`Fny~#Z%i%E%`B}Zcx z01K6ceguRjNIJely;3fd$i>IU1~IU#we0-Od%gi~NgNhzb?mJF$$MxQ(Cr!-6xs{^ z;|aUinoJ@BO2cJLuZr2fsdZ&^_2zxhS#VDO6z|Vau1V&g^(Z>HiBW*Unf)|MaW}mS z`5NiRO;o0&|36H<%0wU!wfwhWuDk6W ztaa6HFG$XcpPjOe)~75a{hUx-t%C^pA}of26fszXT#|#}<=(kgxdxHCJ;wE0Mya_u zI}H>y_3yY4+o#w9RZ%#MRymou{HJa?7eX4>8x8g^O$UcljEp_D8LO9m_@qOK9w}YS zq0NGeZ?rrk5Ta;tk(u^(cp!xcdK<39Vf1vu6kHE`KI`Fr{(XF0u##yMcnk`wq8`bf z7u_((?TV4j)i#c$dlQD0-iolatODqn8Rbz^laR`z(%1<_(rd31t}_IdH8AA1BVf{T zsly2Y{S)zV;Rn+B^Vb&2jO;X$SB(Kt%u` zPYDH5rWYBX|7E)cGL&ul2-NZeSRU5rQvpQl-jOL*HdPW_Gmor`5Iw8Uwfdsa82rl6 zOJ~A7Q0@H9cO%_T`u8vQW2Y5X3*xIJd+l&XNm^{NM89-uZILDN>|w%Vqav|V7L3m= z1&K*M>V>Kv*+hI@sH%!5G)Ol{O1%8`IE1x6!<=E$kg z<3gaeTy}U|2of~we$NzTxZY_Y7RZZFG+-PJiV+zyN`?=C*IDjpnN8WqoHo?6ICCRB zChR=NL&N(C8uiHRu1@0y?X;+@J*RF!0^%uSVY`5x8ZO=9U54OI1J|a^NTR(4szr32 zr_x#idn5CQ+{?z>yjvycdNrdQ0B5e)l%85UOY5N`1%h2pk|%OCEC7&jKyA-0nfZ5@ zX?i81na}W~1>(kN6X)9clgwLvs|KAJ+r*cDMr3{NKc$Z%s05AtDp6tWc$0_IcAi6* zGguiyS!t7|%c6z0t~7!~=AoK`|oOZr@wRm|0?mfO&{C-i_hcTzM=V~pTiFT>J{%x*OOd&c~Rt0 zML$wB6 zjNCa;vs9LCh}@hK`$!T#`~C2>EF^$N?4RabfAGbjGRXVXqJLDtX|-Z> ze)gkrDH;0eHvgM%>wV*!Qvs)WI+f9rWlI1`OiIUw2DQCyD5@(92_k5yybXX#s;bsy z6d*aC9ASmQxXq%@K#xJ02M!6K_^ta{ZtF9RhlWClS?2Q`Q?l{|KcVO~1iK!&^#r<{ zu{!Rrb(&%k&J|LPq_}x59}b?Rx~oX07Op39!piQ5^r`4ud;I0|KK}wI@k~Wj2EZ#} z`c4PVIXsBm`1Na!!Sj!sS~78z8c!WqD_mxI>nEYhX9}LJ*PkMTKP{*mh40Jk(@9Yp zrmNiR$`uFURR{zY$aLRm6c48EF)~l)D1GLaqVqZTzH!qgkg=s;h(-K1E`jv}z z(j{rgFff_P4#tN2;UIijeN7f$WGDAs8djds1&V~*wPHsoDicZ*k;aFw&-;Xnj_i#_ zI{SE8mzkr$q9YGCv8|F9W-Q&O{@6Kzc%1hWHTis47vl@gN~6*r)lyZUC9xh}Ez*)Z z655Cq3i7!->+AQg8X$;R@t0kx9nHf)Ywh0-99_BRE>Gh1aSpXVvpOGtz{}Zp(SQH* z@qv8p=CYoZu78SHa!yo3~m2#Z5|_vSwRm|eax9x9Zqrfp)DNo#=-{xz_TAX1A6rr^dB zg~c@-HOy}^*TTHax+2cbE;gzHt+{4$FBf8&Y-dxqt`=4ov3{&Ha&5k>)V9JFjsUaD zCS-n#$U@SbDxcITEp$O`y@}AwraBD0@v0&wd)b>ZFL2dBNLfV)HnorqhoNg{d72FW zoD3rFOqbMosj+(I&#NxU%?( z{t>g9KR$1D*yvUK5vP&Z@A=bEHYjnM`Zbov*5ZcleNij?1+GRMsl~+wxynFCSacDi z5ouUhsKjss=5QTpZ#@+@SaU@6NPwoPhKJ*jDJt8p^HhNeU}-oPe!!c-$VLYk4vUxU zG!ll95Qk00$R6dO%F@^3k(9=Aj#DX61}RY=oOvD#`~{|KfIG*(QUm{2hM_twRjlh3 z_N4>I=9)rPN3Tw2wd-=t2K zaJwzpt{z{mCIVByucU}$z)pp(j3RgkPY~GxgW7Ctt`i9)m``81c|){&_qlbwE2K(TFlLkBVMR&i!kyH2$%j z%d^DHFbOHd-jm?l`-0RrkS&IgLwP6`d!w2#kZ_GQAXb32|0Z-BP%C7IPd#Z#1nkCn zYB(LsXvA3tb^XS}n9%&yvZIoeVWGR6QF+#5+^JQkI5! z;;OxZv&peHF>60w^@=xZkL$HQtx|LM_np3~UN}K5f8sl)ti?6i5X<$tO4(+C@6D-| zWXakalP9>-=F;Yhq^7GPb?-3pWxm(la3FdX+d^BqP2)Ao%w;ar8=Ra`N^V#&Du-j# zW7Fue)+PJ!$)<$5{s|A1*^xkO!WDst!k159CA z@G!5GOqG}w`l_Y9g9GujvE?n%{&haTdRgll&BYNthjarrxAPLj5fKZzKv8wB^i7lAk3Tt#Q9}Ls6e1#c(Y z6SGX#Fb6jy>c`ByHytfcP)-HF1$8#{|1P%saOIz9NYhIfGB8imd;jnPUfss zp{ZGtMyPVD=qLbwrlCnt2&96goF0M&V31X0rA~0=u&K3HLkEGG`giLfqNgiquD0}C zf!s^WIZOxCQ8rP$jTLjD>7_1cC^w}OmJJ~xF9xdl^4d-_81cA8DI#INJ@~NTVvyMd zxLIV=&!v?(Xu^n67kMO?u?Yfw%QqtUhXF;Z<}#s>e$v1TvrjEgJVZX?e(QO`Xf{S! zepO{jarna-Vnt^{?qw*kFxqLr%Gu+lU|*FW|HFjz`q{^ZrvyW=PjV&H>H^=K4^@BW z_(Nqs>ptMbjWyoFdWyKHn6VWow83%yS2X3%WS>7zYQbwop7Tk^2U!*?1gth5B z>t>$klrRK8FSShY>i^nDk?Hb%+wJ96tp%~Ri0-9?Ru*yQWV40(WS6UkT%it8zJz7U zi-CjJR4-DHG*^-BR{+S&ar)fo#WmUvL>>SDJ}ds~E|l8u2ekc72tqR^9QKwLyrops zG`Rj&{G-3kYCPr?r&4XLF_B5}{AW-sro5rP2M~Zy@a_Fw2+#_tY$utrBagns9L zEo7*9pUcQ;fJ#V0tS*wNH>snZIlQ$tohUc~pHZV9O^K47vQ!$zMuTJ1Vga#35D=oK z@}2lhyS4Wz)mIQAv?brzX~Q1zL`{+;*nT+ZxoVp zdoyWI`)932>?a&FlM4C*nLAbHg<}UUR5&k+Dz^O@|K5pW<1Lud51lm zJ9NaU5L{ozDhi%G&Au|W;?{JSEcYI3qDcK-Q04Qb=GOI#0V~Pk;HyIpf><5$>x(R{ z3XQDDTfyiay`O=lFCgV+!=czz;pygwI_%}jGT~M3!+`DL-NJ`@0N!yVX4n@gzc!w4 zuEw43e-FN?_>Fy}Cj8-9AQpgt0DzU@Z+H7};woNBL}1HTfxAVN5OCcOAqxU3`<&DG;8{FIXM(yfp}mv z76u_ijJ}^C3NLrZNK4ci)IYoMvmzNIm8jYh4UJmZ+Ol?uzH!n{2A<$SfB?W?K5#bB zb+*w6N}9IR|3pSHbsXm(+;%|Feka~i01zflEY@`yqEv$7@CZW-)$d9{KnB8MrB?cj zZ3h+bh_VltWRFCVa*EaB@%9!sXKIm*P?on#zF$M1rG@ZsK5<;D@bc&+{;{Y%U0k)l zL=N;XNq4hrvrAUR(msso+{j=wMDOC{>UFt(w{f@gxfec%85lf%h&v(8mU?;^E8!-r z&2BXwG*rOlgdN2ipwmU z;Cx>bSF^7MBelk7oPq@Ox%|bcytopa7=I?xR0R=Vx$)=_U7b(Q_T71+J#nxLrS$PFmfC{jet4S zO&HH)o;lXqTf(8j>3br&MijD)R+jV-BWh7}^D2h8lp<-7@Q|>6djcXgOKXN5xRz2i z>_wmN;4W{87O0=83JU|3T%pDAB~D%&y-=hP01m36tTa{X;uADU1zAQY*`iCCDqZ7- zgzGLFEqA?Y&_9?$AW~fJ>y`ZDdK(8JIZ90gSpK$P$|$98LvH30*?xopLZ3qPhpy=T zxWw!7deX7dx*^4(EH-jw$PlH965oVFP z1YvwTS%eIpB|f!{ojAU9I=}k|$WuM!0M4nGqP?k$T#G+An!8R!2+?r~3$ zcwX)Ge=q(t`1FMQjR@p*V-gYaH#q(;>wvr!$3&>Q2U#M`USi~t5;p>5#JpXf0mv?# ze^`en$?~t7TF2l_u;C3pE#hySgd>7guDZmjP5kEuLl~CTd>N#r93IE8J4^wNMm-o3 z7-G;*!ctMc3B!Rfe;ip0bENyY(K?vVj1)9>&(ru%}3E{ISF!gx4aw@hM_aDfei=pu^N zNH6QM6ErSKbd54%g~G!UY(TwV3y+=uN1qOhvo_v&^fKIN{SRiQX(}dV0a{f z+6TFnrC8<)0@wz|ImerlDMv90lNvth&)?{oI*w>oxa0Wi+QgPTs>_ zR&8k8D6-s&%1yJ#p7zzp;}>?G+1eHXY1=fyKHGju7q9OY=)n{nG6D zf};ubVRw>Kmnpe>>xpS^hJ*AsxoCQO?c-)?ZkXB*gk;iC1l@7kNt-c+Kn|M$5sYHHE0!(?hfl~0A7P+1t9ZP`>RjTUE+b5ZGWwAH zRuap2wgdAj_fo}_uu#6$5eDJtAM>TEAmWBRTW&&_mde`~aN$bXT>N~sOltD;uvV%m zkXL<`@Gnjn3AsCPTzrnq4u28j4gg3!T`H^p;csE-AI+$O6=NH*#%8wVdc}KEAlJlI z1=`|U1uNrBP;ka1F$pin%kBwLXVT>yiskc!N%1(tD$~QkG*=zu9z7%sg<~=6K>N|s zO)E?I&J<*o=05Z5PZP7GTM2rEhf@ND1w8>@keGT4rYp=vnDY@dJFab7ZT2dH*K16OdLVBj(sC77;0&Lqq0F*rJo*1uEccHE1X!A^=Cr$JDEf3SMu?llOV=C=^Az*6$==N z)XAn_hTHp~9pUbS1$k!wUlcq;X8MjThiJ!?k2yYeFix3Q7O8N-I6uRS3z;lM0eOr; zWAOQpUxxq{g9qAzt`i=%-+dWcOZZ;S7OGwG|DBIFqAKoI`Op4)(f4DL#l=1qkbn(E z0SqF8fwFxu zh9u-1PvtmaI{F*V5qVYMeVps2#G&`C#{Lu8ol{YrD)Fj>Oxjr zwWaOicD|L3^wq_KE$uFbygLBqTw1y>-2lw5ZVBOp9Li$y=(%#yFB7hX)XJZ(tyV7s z0HhZw?;9l9y!rS*D>kx>0#k2vgf08=xag&G4gAsxO}VSt@5_O*X6i0mGa6>uXcVjstomnZ5Cc~_sUC*4rP+Smg zYa1s8`QvL^3N*Z-e22r)_MSZEv!hyqYm7mu;+ZX9Pd(F!%I0RxDQVoCapAzL{(FX= ze5eX3W7qW47%zLY1kI;CWWE&lqG0P|c_BVQv`JN6fo)S>y~g#@XJA8Zdnte1`gZ>X z`J`(cJetF^dc3HqWsJo159Qc9Ghe^pyqp7|zLz8pFSR$bTP;g4SB&N@rX(mNeUMh9 z_W+w*fV1l@%?9j9hmo`)t8Xz>NOcCm1ALm~p6`VKOB=r<25U;y5IIeP=I zH7@BV*x=e_TPDt=KxEGh=f}K!CF~2z?rT2#0^B55jDQ=Pl2XUwLF%4S7ge)n5+tLY zc6EpAD5Iy#3Qd!*q+?qX;;L+O$~}X=e@VkjG5thO_>&GR+D<65wP?MDAEw=CAziUC zkbdl?jJ(asTqds*9{C>fwni5M`auQG(=c116Xkd3vbLq9+(kaAy;nK* zh=AyTUyka6#)Qt!TV?#DcJda;P-F)6oh=}_StCEuw;SULw8k*cug0J4!?3C?SzN*B zq&Ox1F_sBLF=H5^%+oK^nd49sA%lqsD=>93hEODDJHMBw(dVeKjc%R_ZEjkXW$$~2 zsUrxIVizqj(Eg*^5~-qh?0i`6zf7;Lt?G->-Y+1RX@O%=RD6O^^-;Wwc=_-(-H`fj(i zwGn{D?-$0H;7)4v!JI}LgTT$}@&1XeDgY2FD9QCY$aOHr$_bT^R6q$;GoL7)NM9Nj z(?%Q-${muZ(<>875A?`@kPi5eqXzqRQOA4`1vxjJxgkAT;tHL4?0(*pLL<;5S(?Nqge3ksR z<=RM*@>`h7wqmMJu(vs<3$F0rPDEv3A?cfOufe^L>l4|kdj zok)Im3V?bw@zRMW@0r$`O|$4`+(aHTO44YJ=vOqr{lMJkPgR%eXY)O^6E-@COTjm3 z*nv}rA{I)+REm5xDvsFBJsM%mI<4BxGn?58-fwl1%4-q-fy@V$;9prHegBsU{~U{W z{k~BWYM+qAhiQ4rFqG`06UkV{$cyQ~IRH6sqP0vmdOyi*tVsm+B!C=*S^6r$OWrRD zReW%q?&=bv8kz5|?TCE;uDFK~Fjd6ltDq1RMmXr9AGzX`OQj!>D=sd?_7OS%Zd*;%89=iftGagr?f2TfhOTB;-PqSD%+smA1EbJMP0 z2N9=@3+L$-;x0Vsi+|h)a-FABtTYRb-=4htqB`?4l<1(P4z_-gkY-+iHgi|LloRi# zAo|@i^^k4X{;Y9*A5GLl#| zGidx$j4k6;?#|lQGKbLNV6Jai>b0an4vCw2^ty!J)%v(r^EWpHG~}8{+b2eo8k4xQ z)b0h-wgk0ETPA+7T&Y|E6Z&qv74|EIOf9!iSMJmo| zLqC?Yf4Yw;#0LOEm}F{*H>sj<*mE*ToQlR%`zys`sf-e=V2Ckpb@>C^#&6a>m z-6xmtomz33CZdiL;-QN?V} zB(J|QfGf0hu9OZL9M@h&mc;}Kaq}GE>6Qx3re8N53oq&UoF>}wsYfR3?Njj*oA|WF zXvi;jO_A0S^5P|%mi}FFivWxcN3CD3!bZGsEIMStgVMKH`ZH|Pvi^U@;vfGM!n!{* znJsF9@oCN9^2+Vmo!n<9|4F4b7seIkBXc_z@wXb$~+a&Co$~W~_)UHw6#Ev7fuRjw^Rp z&*(^?ti(hi+&W!b?Yw09uIjK-ylrYZ7Ud=E9OA&lR|DTj&kl2MS2v)M8I*f3vm5!-A%Koc4Pa#i{2BGI_` z5s3nT+|&{Nr$ys0zWNUM&VVjbWx-7;5kc1LDXLVOtg;J* zUJ86Ul~*@*$zf+N(}tg%s%1t@e8AAh*y}P#VU#at+-Ny_VpQ6$;)GF@k?&bFi5gfh zLPYWLa!?X-HdY&vDoFUP%9L8~JX*b_x+-jf;KE18tXH3W{4$FxYq8Bu@ry-C_%(+C zBm-oxN)@fCnXKwc(?GL;3EdliIl2TjF{w=!pDZg2x>tHoa`9`Q zC@`o}WSM9;a}~j)2AYG_Q#KP3c|qsP>TwuX8*2`te(S}1!J8zLwW`xrg(;qY(5Zo| zJ}NPOKQ}|;_f!pShNSPaCk%%Z^U0zq>p@G^UhGLC4`UNdTgz_J)nq}-3X_X(p z#a3{|zYN9fd|;_C@G~*5m(2UecB+C*B=`lN86PK=+}VM{iD*Fbc6$f* z0Qdx<>6#-uSs7d1H)2@r+q8|Byue=WrtaPkbPoaGUCGM>)X}C^K?y=!Xzq6N7<$|q zRzvVK#&A@8Fab8Yw1PAtu!on*RIB7C?@HFLyisndt1;ujf@Qy-+i7W5J+b?*{7HO`q|b8mZKsTtu1m}jZk}~dU(o`D8}tpxnsl! z#i>4jMh$2_lrOkb`dQCq*bWbPr9SDxufe0i)spBsK+9Wi2b&SJY=!rt!H=%%nHv--Ff9m0XV^(5$6wOT_ldpAaeWF$$Pm zL^6uuiyBe4Q7WCXLcGML*69HBtN}iJa<57Ab1AYdhcR+2ffUgdR>b|g9`*!HDE#yz zV@L_On+6>e81oJd|FdkGNi8hroJEy0$+Zn`cu|~XDJGN zQOC_IkbS?j^1c?jy4_jD;#l;a>mjK>?~=b;Sb%HS`s|%YiE>{47`CpLx|%iVr5a6J zdQMSgZJ)$`KN$DAL&(oUMA6xl&l|f5TRd>=FgDlC>NN)d9lS$Npu+Beoig&IVP;?7;%e7n1N7$-~z6qI~5RC;ZCu0s0h{nk@8KMwn*^0R{vWr8+zY4?-Ws7X{)#7y-3Eeu9LGmf|q2Bu8@L1`qJ;0zrU93sUw zP)wK}19Ke=0_Z0E0>nXw@0`JKqP_^r6D1dzk;mryKdfr5A!^MtTl^7-&HJO65CUgy zBF{Y+Qm-cAA3WHLnW3gb$UZ1s(eESy=EubgP9;F-z9ksbMS1n5$&Yy#4%s-NEN$I0 z{+|4-l_`707irp9Y5c4%x+$jT@&|6>ce%Q;GRgxhd_!My0wL()q z^3nd>ot^)5B%M^AN{_=GY!)Nt)T2R_F`XGlYdH!fL*eFKYg7g}4<5fqYUucr{`PIMr2RHvkMUN|43(lrkMgRQ$&yQb$>I(oiUm1S+7jZsp{iq3LT9Smz zL;`Xf6d-Jf+zWcx-+~-c#62%u<8zQLviSDTOa--mw&Ft_0Lfwf;|_Qg4Z$FTa9e-? ztk&%*0ICQqmQq4T4Z+IPP8MkiaNF2J;7=Y{!%96^WyfEe&SHan`!RVzLv`ziwaMj_ zs@-*vr)X=51?OXBb;cnVY?UtH_rt5@^0F?S!;kI-1=eLOnfpFu%*6Jk$+NQxOg{4; z(g4vyVs(5STMP*tv!m>Es%aWuEGC18jIOtXua|oo3y+UABi?|pXZ!pw_PwUn{P|bu zCh^^ZzSi+S4C&ppaZEZJtbBEZy1?)CIdUqa=~)AJ z{c~Sw_6Q$zz6IO=2A$1LR@!);$~nvIcAm2Vu5)e*do~nhW@J&w^D69sOwMTiItdPTlICJM9!qG&L;UU zm?GyS#_cob%m*CCnbA3_qje|m{S2Ir&MZ^%n$|qMvN_tAYJ&)m1+VTa)_TT2gb_>V zmQXo0=N09GTSG?+@!x1taOT|?S;h{rH8x`WhzeqJ^a26UY8a8G--o4Ji4_tad-I9? z+TDuM`>xtb(@!{AU%7m6D4+R#(7@+RWixwYij}W_aVc3~kC{E?+X=h*LQ0vv=5Vzx z7aLe^&B$D5KEu5BU_~zpqm|}wi2(anr(6(t4TtUa4+yicFeGCWmq~<1rl88s)8Kl* zEQB!*h<~*QD2ciApY|G=1>=G>@(jc=9qv`t#ImRxsWGe}N1B!i_9l$6wlJxPGFp5P zQ}?lv%9ueS%d$e$WSaRRT0!FJd^(a}Y|+ z$DmcTxKk~Kd)Q)xQH{CoD$GMCC;>?R|x$Nw}ES?;ERl|4h^N#jebQDYos zbif=W!W7cu&P|cZ-WN;EGY&U%hmz0UM?KXlH)*V8R$?aI`*lm(-tE;*oO*;dOI;!6 zSCSIN0G0NuR_@dnG}FW}OgDHp&GVkWqBpLtv#uR8Ef0Zw8UmuAbwsJ%?Jgz)m$n{_ z?h)T6le1?xH~IW9tA80}7xZhG=1*ont5hzsbD9L#Pw+hP<;RAWsND3vvHN7i4joX78C&qULhKI&Q3^ouQiuuKP zd{sVczpn1xnNdQK$^%vr9y$5K$U(yDO_3F6=vFYNKSv`YTX>jB_6G;!x~yKnNn;`H z>}aeeD`IrGMUkAq+?Xo9{xh~*=b4u?B5&VL#PIo`YaojM3Xl0*8Mkb_L0xF?QfdXv z!a#C2+iqmGMxSHXmz%T;)g_1L+B!X2owfW~z2k~l>fAu9_y|s$Otj0d-xq4m(|%~I z|Cq{5hupb2&If7QAgi1BUy*l6it%Exi{5njuSR+R0S?^ojmYoNR_{8JdSd}Q2j)@*4?F4BiUsKRHK&eVT3sLJoq=D_w&?WP94(ND$pmxpAVhkzn_0`JwpmO?cF?!TVY4`C^!2Bn9zn^vjAg<~Iy}G@H$%BbO*f zB34UDRO!##1hVe#-6pGPRMxs%rutHscbDH|M-e**7J$D89lOOd-uscvQE-j@QV_vO z8D?e!K(L<&FIC(%~3r zkR|prJZxiZxMM%|x8}yZVJ6swd?YM`pu?L5@uZhgY7ckVx;2>91+DecaSdI;!-Zv zcf3{AUrV^^mYi8avVVxAA$$@{zbCAICaPgK7PjguvJy;P=pE{UN4S8|O*CUmdWWuZ z$t3T#D2h*qzkmLhj8#b!H60RXUjN^lF7U@zETRk2?Z}OId2-hVYh-~R00=xE$4P3v z%-9B&cI7D|Jj?epeL#*5PI0TWZ0FlNx)Wl^*7~9ILi*?)?+O-~G zO$7m#?KBRdn{r8j-?JEi#v@A(ZEjK1vG*|3vvz+&7K8JV98=!x4k64;ag7M$-wvj)DRhn9UDKd5WHuqEy6=?v$J4If zYj~sJPDF;wHb9XQ0{hCMZbqB+H>1&(@~tN`)r(dkCfBKXu^giw@3gjyJI?0L8!?~Q z3JhLVcDFZHM81FgFFKEpKMP)b3|#xaa6LA;Z`XD{qoF4NB9|ioEd=R~L4*cC`(uH0 zh=_dk{!FH#aAn)~(J52S;_;qzYVhH`BQMwgmNrgbc@&PjX{lsJbMkluY#G!ep$U?L*pg5=JaoR) z5hVtc=fL7bM-mj&MmEAw;d+eRq2{iA5$HAB1wMv+@yRz+zjt`@>-V2xpU%e%n~{|b zx(k+)FwfdZHk}Xij>0q!OIIdo2t2u+eG_{Ni{e9WFQog9e9@9=% z|2wU$1~ZfgmaUuS=ExND;m`+UyIhE;>Or4rZI)4EeMBSGc}kgQT|;nE*;Y3qPfFMM zUeZ3rPtz7^6Zq}3ZRU3HcG{ya^N>Ta`^A!n+BKk&`HlFt-jeP)y#4nk7Sa%ay4 z;UNd3AtDXIh!Q4*Ku{P^Yq}Zm0p$(j3VCv@%gzB43yx<3$CIBkk0l7TnIeLDaw;6$ zdE(G>jPX6a4H#H|E*yC^wsH+6>;l6a+wC<<$!8C-F3$PI*oyMmuJbCAGNWn5yRPMw zLI-`Niv>+w3#s+-lH&M4942VuUd0l^Zee4qres!`DY>K!K>l%ZZ|3L{U>^8a4*S3~Xw9TtPQULo`M|Md6xN|hU)@b&)- zu*9J5jH*t=H-i&hxUEZVDQ-!Uq=4}BqaVx^ZdqR5r;&K0Dwv@DC=38ZiA04MBO*bI z2n{F~t^hz|%zYygBR;X2Hd%Aex@oOUB)DEOu}gC$r2(ooa7MhfR#o~+FRx^ZD`R3K&-ZOw&UOm?rZP>epB~=i z1w8#F*g`|2!}Ow|IK6))`kFmG+8+N&N3O+PqnpW_?d+LuvbY~DcRBi1s=ZWwHbcJU zZ8-Ze4Fi$In$y2V+m@?bA=EuauS@}`{Dw|?`P=IQVJsS8^&-2PqgJTG3tuup`o(?n zc)d#s8^m)EDk0iEdv1yObQX2Ur_qCVJF0kU_d9m7waFTaUw5!0j>4YlM0yWWLPE-^ zMzpoODoD$2vp9JY`3W!Qvfgr$;>|QXN0Dbi)3?jY%F9;v@hxSpUxAPqH%u!fQLE0A z>s7?Pe_`sGc75NZuNpz>g#Ss(E5jvOOv;Yldb!Ro>_OdZOVKy-*HhIMTnUGixz!i8 zXLMpvuduDt;&rXxXBGbD)5VGtn!RlR6hWmZrOHpn6Xg|BAuh63p5AvFB8&puD9S4t z_6JO3CGap<)Qj4+QVZ-b5NMg;FVwyaxtl}U118&!{kswIDJ#xTlF|AGbtqkcQlBR4F9!vAEwxw?Fd9K&T7s@>J1l!!zEaCQcRjJF^JSf)4 zm#AfMEa7!zRR%tEZ%FW|Nv~o&1)bR5Y0k^%^%Ue;lJ96`kGXm~R$inUKR>^trfn;?}@o%%(nnm9!r(DZlQs8#6*Rm?E8@hO^$F&obOv?ogR^MKa-e!NW$TxqoxrS)|m=kiRkjYKv{s~*W z2F-zULs8u%oHKaIs?sy|#Yhf0bhfH}(yywl2FP?T-Om1r4BGcuARN>v@{TGX0 zPJbRB00>)5Y0O%M$4AAcN5z}ADgZ!=iZiNI)%B;D9UdwMzYo6`C(V`Hd127~gNf*x@;|szB>LQ%bs4>LpfmmQF z05BSj(=#L?7CkHWMGh8ZcOVkcd19T-;eLFJv{2?@K+h^`elb2dm01ov%On~suE4;H ztiy#H7Tc$CN0;4y_D_ivU6ZIv#=#|(Wxd95N`-KLveY_H`rUug7RymPk?7`!bQJ&P z;nLvE?Pe@7Q;;I(iSXxW=%FKZ@d(Dz7Bu$$d?0?kLCJEvlq&GyGi7%76@{D_ulM;# zohsA(sW?Px(mAGtWK*I;Z+S-iH7qpV?D#es8yA zh>aYhbQDW@M*SdG5k)ahkqgYJ>h_Od0m7#Uz(@s(G9r{C`l|F?>c6<>0f6&4QVrSZ zMWhrz7K_9^H0Y&@4?O_-?hpnhWU&c!^IqlQ{^hp+>9&z=aJ=Ti$cZ_^>D(hPS3>AL z(;ABx&dXAm$OOHk(^^Hk%5`o*K@-r0)2sWI-HFZdpvjctU1noFbx`%CyoK@DVW7F> zlnoWRo#fYUAPBig0}L4P5cHO~q_GeH+?u|{83k2NA@m$9hwjR?Cq%B91sGmJ zx9)-KtK;ChW1*&e(V{sdzB~FY?PbN49yyM3)APoO`1i3oe5%kql#RgTuWYz;hJ-u47Xxn}O? zcW)|ON?!Vyli*2BnA_%F;P^e;j^o`lrK%Rx_hr>APEu8iSkAUDC>vg>^dL^z5S0s< zsMU`X+(iH&>5>fNQtcZ0daE`X;E=#2KnzZ zRSJC8Y*!?p*V|nT@+OezcBXPGzljPq{STb0m}Jx)T`N?P8a~XLlwyA(2jppDOv=rP zsMaQxz{a1;3#eJi&qlmb%{rZ9@q#-(y#K|em^Ln9l372~9o6O2tyxPpSLP1YlMiJn z9Wbb3+P>x{@NUY-#q}i5+3OXn#~Q)X>uHH2+4&iHAku1Kg*-F4E+YTpo-@GRE%Go; zwng$!|I{sLE=y%^|7mCaM{QQ07s}llDwl2%O)sKD;jJ()ArdgB%RoFSqS&`ji-HQ9 zq7IjDiseJ&{w6iY!ADNJkF%oy!ePP!2vMT!5JW?O0H-L$OQEEg=Sm-parJhH>+(^hr-@7#+pPI zvD_*t6Pex3Ms;NECK)`=?CW})-DH@u&0_G3X+|3VTved}V(!W(=qoid6sGjW*5A!A zSe@M-Lus<^jd8_2Ha&t*NwCmns8)W-QT5Q_w?_ZGNq**8o-rNz`_<*BC8l+~5_WvY zrwQYA+*K9U|4zHRB37jEHTGYx;eVf>x}WJT9sA$_Pz?7QiZ){^`BoyO)%k7QS|Wl4 zGq*&yOV=?wk*VkiwDEo|Fj}bNF#St40mXo+42&`0+Q1sI8XB-pNka`q8Z_X;FcQW! z0plYB#?R1bODon^-?}>%5)xvK;aOw+oej7HfOVpj|F*OKTRrE)pkVE~M1K0;Yyems z_AP}V1kMmk=B$zD!{VA6=jUBS^Z!xxl~HYN-P%bA76OD|!9#FufS|SD7AWrS?xjF2 z!M(VZ;!wOu@zUZBMN6?3r&wEBN} zCsXP3^l=v*^lYkergk7mRrDFgBe|IvK=}u&(b1w3UeGE#e6OED$&aiCWZJ3icv7Fm zCbIHNOo>v#C@LN)A19sh(ejuZa4}e3R$}EQZK==q&a+lETq??Me^%UeqrPcA&mD!= z&OfRTdY~H|P~nxjk%X=DHnS4oc4%Q}b^FvejT2bPdoeCl2qK8@4vQ8iskploZy)(P zdQ!a3)1kV3hb#KALSzg|sgH?AF?jWi9=XEa=#81J>y0kexxMfpZ*JK9o9}+nZC2g( zt)rfgjU%CDJ$_eb=eCzyTpZq67ye7>_sc@tz}Te4_J1UGd0EB!xW+)=vl>8(^VoYh ztBblW=}2FwKtdP(M%Rg9mMp_<5}R%|tkF*h-z4-=UF26g^WTP;DPR@2%HqT|HQsm9op1ul`8%{2%ak_8r z2yZ*b4p~w2Y1L(gUIDQ-rSiPAYPf3B6A(6X;AH?&f<(nRdW~ti8tOjNMVV@RXBs)q z>hf_1?%F)-E)(d8$+!O4?3RM8$@V;=e;Ip`)C%w4<0(6`vp4rijoXZ(T~+=glJU&h zH-VH8_kiJ8bofXnzt|TGpa%EyTJ``=Yadm1us#YyY`^>U0yz_vV&~d7UP+CH7{}T{bt$?-7a5?aTY4l`5LCg z2|Zo1TxRA8?I=gMdwkT0I{L9pv)9jp-DiX3G@464T7Jq+$To*kJxw^)9>2nOO^i~M zY2~HDZTlhaeIb}IeVm?Hn5>YQ5T#HB=eKudRDJ+j7g~+k!i}i0uo|_%Wg7thDEzaEF93{5gA(lByc6hzF;;sDu+VZg=)pCJ{G zGIvS?jE9(bQ`sQ!T6z(?ScILGi?U3vjATBa6-wG5R=e@X3Mh@GslEs=F-XVmD%o)B zM1LO8Dxet5emTv;Dc0{mk+rm9m4_nHJ<2zF5;-%v<;Ki@diCY}SG^MJ=^}wEF~(%5 zFYXSk=5x`Nqi^AU zPIbEr;5j7<=%!_%7`i`|M|)iNQC6)@sOT%17}m)VpD*A2jVE;7x;|CTHLRs^ER(y) z4tdwJ9k=vM10>6;GI?{{Lg>n@L$j5C*HZ=Ab6t8a0svA##wYy0+prP*iEr8`l8QzR zrvP~ESO%!QGO~ExPM$#V%z#k5&9rSP%}s(lz2!>+%HGt`ee$@B4ma_jp>S9$Pugd? zPHI62qv9SvR~4w{y8XiCIiIw29h1(I^~!>gkBb|=I;7?yN1V+CAx>kLkm}3%Xtn-; zshRUSed0)_=6$s)(i2&-IKA1IFB+l{+Qv-OX#O-NY1PUfep<9)5?~b?+BP1-Hf@kl zoU5(gfUyVtOUgzjvm2&DoH9+JyejSes`HC5RLXR%qQ_zS5{L}L8UQvK(Y zZ((awIg&nus#{gj^84ILZx^52A}VTP8lLzD;xWKk!jYJN5Xor@Q;4 z>ST`fymOf70Ay}0JD1yJ^O#J8LyDp^fEM~kDaU+uJi@YCNN@cU(3HjLd|@%@kY zmuoYZm)p1=_l$+T<6miZYOpWS4RMd4xco&3lOWP8!8*^Da^(fWx6W-d56N^R0$e5Tco)P@PhJ~&=PuN zaq08$n@UXgY%U)?Jik$9`tsMa@!E%ni?7cfy!`z-bMO7v%k8PL576t2YnLXkEwU2d zuMJQdWi8!y7vxD<`cSGz?SPCsrj)M9-KT=EBN+V=WK<$7vQLzDd5rvjdy-C+3eIgU zH0#IV9k|u|^sfjv{E?m=ixL)Fo10RH@c7Tqc-3=jF^0{~K0kDvkujuH4!@nn7``{? z9mh87pjLJV!EG;3BYo~%pfpZJdVC?t9A#jzan1U%x64yj!I(9==B$}{DxH?OG}+cN zX_>6dJs#y}+ye!nd`=IvO1xcca&i3j#dIPLnR+mP{oHZ$8#^)Ci4=Jm^vI5cS;yLD zH@w$%Iw{Es#@wK%4A-svJo_GIf4h14M>RY9*W+2 zM{4^lA61B(Ul0Q?OHT<%{rJkcj3SHEc5c5E_ZIcc2*KF(tr>Zp=+*v|4D!zfkJ>0V z5)=-G5u_5*r`_jg|fHEs=ye#&!0+IXbwnm}K@QL6k}{;;~vS z^N-ijUuJk5sM(MHxV`PJ9qqgk<1v^9_ON;Uu!4eqsWn7mU(2JDkl+2X1{i5pp-vG= ziUQEj%4NOB46`ZG8Ge|LCN7eP-4FlTp05BhQ@7WiS8!$+PmNG8&r6o>Qu&r_JaPcQ z&5s8F#%lh&|1((;2ZJv?xNQA&@TdEg`HhLJ3}GZNAGe5IIPT*O@v7YL9y|Fss-x#KZgVeAz!OH)?XYIcKssqV zl*+W=i(Qg%h8{&^k``7hh0H`txpsLIq!#N;x@=)jR`H>#2)iQqp$Hk9O)9xe+Na@f z$BW(6pj6-1H!-M`((bnBdF>Eb5f0-%pHAX9GPBb>RDtr8bZ15tOW(eiC`?lqH~YH_ zR~P#{Cdx?2R7FS-;-x8vCo$1KaRbr2{fvDBvue@yFHeQ zHPH4&!K+(6)Cx|NlQHsie)->1bM@sueNE-^ffhW8l^2Wuz0~$)>!7PNjjY(j#hf|R zUJ|E0BdiqDq6XXBIhJWDEusCfS!KcCTb>*iOy zQ2Q6#?N4BSM`s7oNdv$Dz_YNM#6O+A<*tlgBshEJY?21!;x{?om* zc|i;WtrfvTFZNX=XuWLDZl}ovA!IA-?p4?Aenba8s)x9Wz1eDA#P(914yfWH*`Z`G zGYZfZCE5g%R|#>J+=E|Y^@Dk6y5>^u79DnaHkNmIAl_Q%qE@kXAL5-UKzUd}fEzoW zRJ6C(dBV=!p22hO)A)C#14WrEmUqUcJ4fBtbM7CvXp8S4@?M#cahcaket&nJx(m~;8MgEAvdS35pkm@?>D$o} z3Dg;z%Zl{ZuW)iDrPf!L;KtAGJf=${zbP?*S6t*KKrAzZd7~;->`E8lJ$%OIY_T5( z1-OEjB?JRmuC7x4DZ=kpJvRP9GMUt z{MRO4kMNyan<2NAI$=eEkbohabc=mj3wzaIY+`A51$Ab zd6>FP-Vh%Uw+tKn8T4p-uwdLSE-vpg7KjO2_H9j?BjJ!(h`2_FHspynK=aV6)1lE4 zfE0`!6vWL*4$FB9#q}u70l`6|Jf!XM`x4b!yae> zZRdo^&!(;1D0=5H#ohbmMvd`T;rZ*LqROql+B~6(OS1!o7smA6K9BS!MO%%jRUGHO z5ZTs_Idbw#(ynBRPHma+wUmGPJ?LPt+|pF>hNC%)v8nN9=w(iXhjNR^+w!qD*Xr(e zzorhT%dhzE+P*xV{ybpRTIUlLBRa22hh=T->V>mrqNBXZ6y06sV}tp>#&jS5J<4tR z((`W;`ak{H98XGBTZpk)V%Xv@T@pd6@G|v|k-Syo;9rG6$Vr;gH+X-nd%KdzdP7af zp2h+5XqPk2%f3@!h(|lk-iK<43R~+0qjmul**IxXyO6A>*ojm0AOoQYdRje8v@47R z-r$BVQpTb&?GX^;8+>+bMc^ZDYZ$c3uV)5~by3rR6p_UwMzD;=J%S@B1K&C(RO|}V z@S5nkhbH7eK!jwdA6AYVxjdT3`uMGTJ(LzqN!}>MNe2h|eR1Ul#Oo~BRx5!us055|q`i0<6vjXd_6 zw1}2gMdkUOJ7wqnO>KX)=AHH0e$Rz(NXQ6CP>=1gx6S5q&DLdLHBOsmnuvjMI-goh zGH1#Tc$`;fmUqr;O6+M99V%!e;oP*%Fzeq1d3mxMEMNHV^-le}?#Lnl2mct-r{+|FA(iFkB5y)!h zW#3rU3@_T;?^qnt5vP)wq%lSl0K+H}k~%OjWn?2AJtT{IL;?=y;fBv5D#`4(FCt6H z1jTYEgRC+z1K;BL%Z4QeDzs54L|af{Y**v`!57I?6t!W+FqMu(MM+m1E%< zFKYI4D=%4rIuR_m&3zhg@I%dfJQJEV=&U*o3D?65HbC?WrE42iMgke< ztZ%nn*7^_sE6`)(XF4{9SO2~7ks*M8+(8y4Cky}q2t`EXBr$4o<>G#ks7^H8od}4s zFO5_n0m2+GJUoHq8~*5h8YvpPM6@xml)i@q3Q{K1Q$m}OeFZddqUpiuBuEXk3fWhW zoGEfy%s>H4$zVT=B+$qnNSVGi0i4qG~>1}ra@XI6}NJ#iKhcG(`m zr&$~itSff3Sz4gOwj&dHBEkPk066Z2zzCi{)Sc=W;4r!`NG*SU*MF5&TC{kj$6ANrH{+c)ax6lSE?U5*1H&O z)CReoxUIk9IaNH1!bnvbc|mTYp1D?Y@NxB9A8S4DP-j<-noPTzoqW>7dMG5A?C(o| zca^=*#Y(QL)|KKD|7X{jN`vnEtRa%x(TC3QsX00MZJ6pO%`!c!UTyC4%xpJeDg}uZ zCH?&u0x_gxS22jQyBymghb^Q_#Y0~gNWh`DT{ND(F^@F~_htiCZ0m^%?@4K7ruefK za^^9hc=2utC~jDBxSFVQ`~2BN)w`!;5)Z~DlV`5U?0(=)mmIwpmTb%x%o1_CC}LHs zQTVx0R3O|kzSY>gMB%K4q{SFs#+^G*aN{R6cEM04Fp>9#>eu)fP^c9(s)XG7oq?T8 zN?w(=R*NV5{ZqoV{gX9=W_N9~`bHjb`{OZ#qzBSr_e%y63o7jQbU)s5B>#FwNkS-% zaT*p6u5zEHPtvLWHLM%-1=ChmlkW!LIAC0JdgUHWCL$#fTf`#m3ZpB4c#k3QLm`df zaM7TVcy@3GN~vgiT?74*`{1tdV~WH!SH36gA$cmufTj&-U=7dRfZ8uJZ*Lc%Fm=|v z<})du7wGI!{sm(>8G*4&WKHIW(r)`NI@$McYg?=szImHseZ%yLNB^&F@ygQ3SwCs) zAKz<6;+q2RWX1I%#^(3*#dE*i-T(RBYUjPJW0ujlsY@ZJ(&j*|JV)bRt1CeR!SGm-p@)ZaV&0WAq6YrOti0@tn^S%nG=gYSx+@CDtTQ}`-h;P`OGCt@aT0w zf|F4=x96%kUIjZs%)|A*hSMjFhu7ZsP@DI>N^*Y7F`xXNf!e5oeHOddhDxGXDGMYs zD%WbL%9^`e7cTB>FR_k2orM29v)_{I=Fw#w>(h2D-7LBWqMYVj&^o8dxPhTX7jpl2 zs>@i1b)jgIddlqSZ|*$1CdrW|?)0;~wZvVd%YkxZwXT~>v@i5sTcojCxB)Ew3HB5x zmO@wk|lZ~)# ze@MP>$ZQVZ5ib6@*k(5^I&S0}+qt+9FWvQ9=wctbiol>H8n3QU2wazqJWGuMQ>Sj< zGB0+VT8^2GEbwF-r}C?#Lp0S6tesQxxfqwRj`sz*j~cHgx95MDbU5Rrt~GegL_=<#`#2GY|8fRjj^k(X`9>nxHmY&IJ83B; z$9_Gh!{wdC_aY)AMv>D8z*(2;?9W?{L?p5QYJxp6BKNN*D1YX51NH*AG-o~lw<-_{ zXZhx{r*f2$qjk}M&+Dj!7gjHOPB8aHIN?L=#@{X+WQq9R1I6giI@e6E9p_{hi*G7* zg!e5ZcwJO~^yaRvxq9jx7(e{mO}PV79@wPy7PV>mwI=oAHW9mS>p3<+#8P>=YeMxlw0mkA2qh>ich|e8bGaN z?K;zsf1}lPS2p^OP|4D)6RGb;l1v16r3iojcN%DXA7_W(|D8L3aeW%(SM z^IB<&4ZI$3iZuD}(PfT?RHTW!KD>An?_%+TynB;};fH8jY%qw*fp(f_At09gI&~{41bu zfHM;!D99DS+5wSm@lV>juC>xhIdepeYK|S7&G!V_zK`zH2vOS`E0U ztPZ$d=h4!wy9XZTd;Zy*N%x)YzwX!N#KXe>b9FiXn|7LnI6=fxCOozX@OQ92`1J9x zjXv)`fBXIZG8V!REiG$%c@cQ)^2DHEa%c<*PTZ4u3%CX$M9@yOw~vfLS1ave`&A}z z8X@_w6#HV8V9-yDip&ZlW=5Y}_5KztZQ`l;B5@A_c|oGgjuiR~kPS1P}pF|fmWV=#@_UV_qKVv+xSgxd$1CD_c;tSA@?E5T)9X7W7VYsH{h zNpUEo5-`9H*dJ{%tCQPL`ED(b#Kvp(+V{dkw%=Xn@2g^NJTuOE`1HN6_(G05EH6TN zl-xY0S(V1%d`y-i3(R?qT@Q~vdw>Mk_qF#9s$h+UKfd5WtMT?HNpBE(7{QPtJb~}j zifZ0cT7n%uz_dO~%E^fYJfSPOIpS6n)sW^6fph3f^Q||CuO5_K=_q*iMK&B<&vc&6 z9>A?JK9;_oSsE+sbc<|YQCbF)#0BNaS7toQ1s5ydMgS#5sm{U^8Si5g&xxA^72w5K zvT2%r@~x~9FVH5ja(I7p~=S%Z484VX6D#`ue37=HKu+ejkfmjI*zt3Wc z;Y>FmEkTnW-z@o`#lLkH*`;kY8D=7B8bp-l=i%%HYmP>K!f8<{ncWRKa#a0PdI@-TID;}3^@`8uE zGrN=^0lkYVQnC@F8MoAjm971C6E*-Bf}VPZX7@J#u{|9BN!(?v|Fb!K={5T}Zk3VP zbz4;i;d$S8vXoHUoRjN!)>=Jt{_Ec1R%Oals$XN@70A+O0+VTsn#ClL8pju^Dw9GDD4NM}Gxo+xud zuT+{0tKbV9Btcs=er8b84lN#!{RB~-qe&LaVo>i#dbzlM;UteMtwD1P^%@aLDH=3X z107OHOFQ9Cx3A)KgtAL;eGiP4n#!jO8Z49rBBKHs&F{%Y^U*o^$mHU}6hqo03=Z?! z!;LC`;cj`()mV&=o3;mQaL2h9TG=)BN6dYrJ@y3$f`hGXbz4??z@*4~Dhg)b9+xDf z#s}zh-oK7@j`AD&B;mNzUjFsKMgB;k#Zv;)HvrsqDVkcB9!L7bod@?BvFfci@T(H{QknE*|=9m|Q2Mr0)k3`Yosu1q9<`{Vzs2rdjeUGU; z!7@1TFuNV=%QN#?a=YZ2{$Ctf?&O1P<5mBQ`sKKDK+*Vrx4gjLhZm`+IFWqpqs zaK91oW!fU?g3m}hqsHl88T(_zPCDd*n+jZ+Ud{7n?}u+}t)rtd*EruD4X@OzuBipg zhS@U7L%s<&O^m}B18YRvU-D$|d>8aOq^sX`rqEOik}zTrrQEbDghymdHhWo)X9v6~ zyj@k^)SRl1#A~-0#ev$IZn8;xPa^vaU7m%^`?KoLZtFoQVFBb&gq+(51Yst{ZSY|Q z7Qj^3F-gsX8d2Dw;@VT3;gdSv3@YCk^viq@dk+{vm9uBk@kc**I$ znDknNY)6T~^d`Wg#Y>$()uQ2A+0@j~hh9>2hB9k@IpP(6hTeR-e=AdQPBAQ`{OZ>cGGIQA*p)6+&t`h6APV+2wG6Z7%d2ml_5#BR$~ zwD-XO`XhTpT16L=ySJP@{>LBD{QuabGx|S?R440g_2JLmrMY(N$a_*v@Bgxb{Zd>k zd&u3+F&)D#gzsW+r_54uY_{&S{0Vs81KnV9^MU-2jP-26!ws19u z>JiQKxp#`j0W&(~PeF>kltVa)q4S)j07;CdhDrj}ytI{Z^~smoBV|d6)a7fd{9mly z>Cxre`V@&A;&ePHXDOxf_<~Ao$)1L`2bsS!YyV7sJeza+aPXs7l_}uAOLYN2w%|5@ z*Xse%Vf=4*taRzE@hT5dzSRqJ&(X4^!RL%z~I?-HV}jy=4LJ1bT}WSuH35AB{5Jo*GG7&7<-RP|QTyb`(#JK0;_7v?x(}k za_i@9t=u&GRi!n#+#+wP+fzIAey~gx-KI&s@!d`K`KJP{n3sGcC!zryu$9vw9>G!T zk1`@JCKJ^k42`V+hPvv%)N>5zFF0Mb?49GirgPW3U;hQdmq^vt;IsxH8*?L`@|{L7 z6CrV6)JrzHV$E;F2;*L({VuV2LoRf=WYhKdB#SXkRD4eCB;V3VYwJq;b;IE#lN|2` zwhgK7_$^lNrK5(r3erx;P$R%zFt5A$d#h)!OdV>vg0+d=8>c^JyDVODwn^diH@)V0iZ|h)7I=kf>;=OjDl%EIgx|=9WP);oC}>c&lncpwJzwZ`l+0Lg(vgm}n%G%t&{ z!-=pAYo3?`If46!xr@~M|48CLAE=}Qde|`Szc)Tw9}iFv1pG9$sEf*8i9%zx@3K!~dbY2!Q^wj^y}JBlkffz9#n^Se4I;S$fHp z3y7VriY4UuBhVpzBxD-Iey#?muXrdSa`M65NW8e#h%vEwgU!8AorotW_|I8LLy%6+ z7SrFYuf#5-IF3%|$zhs+Z7?%i>C(2|EVi_P3~O&gN)M4V&RPez zxM1;yHL}H2O%VN6fk&AbE+hm%mR%vi|LJ5Yl8zvhBv&e$g3VB%96{kCk@ES%k1MR? z(6NXOydapuu2Mvh!cuH3s};cJcBY)$2mV9D?Z$+iZvAx0*_T z$0iJc=?RWkxxBR`=|2o9Dz!SkP}bXXKM->9$+Dl6Pu~6JJ$s@dCh)w)zItaMCQpPr zdwRa}U483JaQdxUI+C8N;Pesnv}31==+cg|W8=Ge&n7 zKHo^Lc8oKOugWr4buqH=r1G4Q_}QcrMm(iX;K_fvL!P*kBx+Y1H#Aq7>wdc2Au38g zZN|fk5xjHdvpYN2FNx(sRyhEvYh5hk59)FDh`K4Ab}tI^OAI z8u6-BcO@64qWjDn%vGLwj^cZ2B_p+k z$$WCSCo?IF_4Rwm)cW|Z#!ceMYKY;HTaM>qSPD&|X0t{Sdn$-FE)mZYj0XT@9HMAG zZQlo;a+$s^9wLz4n>%Rg8{+QuY-X5Wz3V_C+^xqo1wDA}Gg zHKnL8m?#?<+&p~mUvqWw)3P!7;@|5_=*-uHF%lF=q^cLsN=XzqaoCIR0q#PoMT#@# zFK3n#U#0RDr@a67nPlLfjLSc-8uTxYLP&O;HKqbgbY${YoLh3NGIMvKxmq!ZM9qAa zMZ`1*m9pCX*j>fsiYp0f=5f0WWJ7$>YV-gXT2KWne4Ph8_&4?a9ZywEOnu+M0~8W+ zZF^$j5@hsJ9cy?>((2+x5OJHs&!r}=e|WQL$P3O3r`Hgb?kAyBm2Ksrj+V!ylLFED zQp`ZOk~m97LwH7l!FVKa1J8{&=v^l>p^1j0(G4jQ^08E4IR90Ts5qD%l5dU?XgfM@ zS60NQ*DLutg1iT*88X50ligVhLQ1Zq4rjF*)PuoFY{H`_kZ5s+>RNLzd0h{V!Ytm; z&!weRF$x09->#G>i-@wbi$b6VU;aFgRx8=>JQm7V6@1d}z8UfaJfSDIawS3W*(uZB zv*$AmU_ojF2+c?a!DsUei_%YTBi1ghkYc@S=&!F**cG;wB`Z=2gtT5QHdIn6)9_qz z7|d3nl?>?l^0Y$jG@EY6Q_Q=*YV3ojflyG=C-=t8`f|t;jaK0Z+*Z+ou>P~D%6U}v zkjejF5&ho!cGdU)>{2zZN6VHJ#9{*Ii0$#+hqn7I53(gMfBt^;p)yJL@^YbW(f9IY zM-<@xe#z_0$#KC((&f*28E&jAmm(_Ozm>jAuS}QQWC{ZS+-5}J1rSni#XBj(4Dj~( z16{?(xalW$y0Rbac9*qi(kYR7WQj<^>eTZv;%Y2f9EnYoQgIrg5Sx(cJsK#oo&ZLa z^_M}0BISDc=k}POYOS(}oP`t~XGLmMlN6SnR9l)@Fa{`PN~C_EF8eihJs|=Nnc%dP z(rXy7<6)wVh#k@Zl4R`$@USqToWY8X)X|)PaH?oSaazh5r=blg78;ej5mA+Um{90Y zNi#zN&J6_u!O|#rL5jt_>+3KC1F?>V;+j1m@Pl0sWgH0G#~nkuZr4ZvROOJ8#seo% zq!Ml^J)1mK1SpP5Ob{t(1W!`HF;Su0ab_8IJ?(aO!bnDPN;)V&7(h!HRGdbm0rmi) zaC`*-)HbzZc*~I*ukVkWU?MRFR05yhg*y#yNRdTr;K#h|k$Nd8jSCS_PmTt?35oX8 z{ikB!5i~4Pg;du7OJ9t9)IiD@wrs={v(Z;%rvd?@0BHF9Q%O%+8a0w3NjQJnijqbO zaMd{llSS$1X`Vm+xU})|=epAvp4KaB_|IKDarM%E?g0QKvgoc{5UEl6vdS(&NB}N5 zp?oGd_p6OpkZ)%;HsE{9cMTGXa2$#aN*WD9Ky|@3S&|8|QxX1V^L}4@N#y({i3a(f zaZYpN*d)3Nz4t#iE`NU4y3}gZ!6o+qkb<{~?*x*AbLGt?S`%NWjl5oC$61cO7>@PA zeR`BKCb$h%Agtm+P}e>NqW=QDrqmEZohXB!@4-TGLIk^>92zLI;=LX_YN!mGq}Xjn z-1DpGk=l7TdJA$Dmr@`J4#6f#(axSMy(Bs=kd7(VJ9k1mr8N{=zqk^L#7yvzh$c?> zA<^=faa1}fDA6cg5QET=nuA3{$uR1MbQI}U!-|po(c}a8)W#k~SmU)Oe8P2I6i^Pb z2x`L@FPoH%hP~miaXHSG9*I>Y2TU$S@fdb4))tRCqIdmeB!TV|;2xx31Jn#r>p}({ zGL7%&`HD2!e-kBS%KS(k2C^r`$-Ha1f&=w*JJ*m;^ycRF~&ovv13jDL1|lvTS})WEtb&-+q|+G#G>z9ossh zn}2S7n($y#x0|P!e@*;n6#v8jo&U?rZvvN1{|Ch8^80Q60RTW550C@MkwA&HD@2+6 zk-GBha<}d0%GbXS{$#hm>H7D_uN|7-T*Tv8j|qST@YD|l0HDQR&&4xr$Bx`ng}$D~ z^ke*R;oyw1q9Ld&C2}BAp+`~FQI~2H>wv@VlH&n(I7knEj+Ct3FAJeakO==Ep9A1@ zQD?yqDFG_+7A|z56V}QQdM9dXIf#UR?aUB84Y>}PDq0TQTeJm%;kF4X(SS#|B`oc&HrDy}2o zX_Qk1x2wLA&1zvy1r?~Ldc%0(C+NX;lfg+RW%cMPr4#YQ^^E61^&b;{p|@$OR=01Q zwmuJVcM!1R!uAPl!#umGv6>mB#aL8KxgLgS1BHyx+2g9=TQ-t^nksZS@3Fm8@OCD= z%w)OS7%VGJ0QN+X<87-PD`%N_ZH>i;YS8jFx22_D|CPW$yD35sA88<9| ztCN^t(J;q5VJN}F8BEZCX@)Ur=1Ix~ztQP|MEQ7)!F$Y_0J}FT)D!HW2K19eHoRM} zC@YivsA~&zpC*cx+GxF5uV+S zUta<|*aX+-&JK4?5Xp(m@TO}lXb0?^#1{_bVe6#`M`}bg2Vc&N zu-klNIJSbDF~^GE0jU`~($|XtBMH}%{OV}@h{g4cRDk$sW$IE2IfVq=k^zEOFT768 z%C?z?gp$0Zr^k;^YgkbT2jV9Ou=WST0XC1rY%Sc}oETP~hQc^vS`#NA7=mNmsB>WH zQqYoqXzGg|B$)pBuv+{N8)o^!Xi&m1?Mm(S_ zfIwhK#aC84^Bj%6#0P${(S*bTtk2qqU3YEsuF}J)f`ni;~1s? zBhuwA)11XM;slRn@&T}L>i62N%G#AnsrQC;uT4lfjcVbS4`6*3fE8Ej1OnoKPRkI6`Eht^ z7|!@2Fvu=VLW7hh70eRV6Lv|XbDLpKRi|58kGrNmzw%juyQDU_u?Sm;2x+%n zyi2j~UPzo%uQ7X7aPjP4$+Rg(BYX@0y$+aSeSZZ8x;7~Y03B>@!>M_($AD7)@TFKg zw_z#q9s9ni?s^fwc^1%P%$O+Fxcrhh}TJpcfQSm`YyoB;Cg z5+Y_IQ_(0V3L{4g$#TQzZ}Qk^ozU5vgw9vBtzEx%WX8j|a;gMkR$QLwXxzToQ{;j&jro)Ws(>)={Ity!L&`QR2AGS8Wr;k@VSFg)! zXYGIaJ^QI+d2FQvC_DYLlrhr0xPvpVWhHd&{pIB+(W@@ewhtbN3Fp@c)m)YLF&58O zYoonsxTH7rGI^lYQYtdq(xg!2$D5DVQ#)WOp$_p>+rHYT!p>OI&@L=M=a1%)H^+X2 z2>?7vD#g^k%*2Thq8Q6o1vJr7e3ppT%D}H@`V18CV>UFW)p&t{=$!HJU$ha8GJ~1G zQ5QAFtCmXmm)Q*5)bgYwPj7X*Fo|nz2ughDYkc-<)mZxEQItnZ6kIb$+w;w=(cF`U zIw=F!W{INdLHCciH-cZO#w$$tf-|bEy-zvTvOL-h=KVoeXkIV#mVG@BX6epr^S#>f zy7iVc1s6zV^Zv-*aFtui+Q%C~$(9}00w5e#x2}qEcDe`M`9`OnWp!ED;MZXk940sb z$SZjZB?Nc+o6O{OSUkx&lQC*2Y7t4Btu$8trK3VXg$q5}8a4AbxF&bUYXOOk zVgfbZ%H={?j_7Fd(NpbtruFHIyiI&FGvECE&6@I$ zaXlW8mTX6iA(|dQQ-l`4@$XWJ>E2_=JcRCd!tC&d0E+KIJl=u z3F$P#G+w)AgI4dwf=L(vtXlExI^RYT9LBz75n`;g4Gi$-_i+HA1k*d}Fr(gJ<+%9R zxPV-}fEwnL>|zOv={;&7L@H7vV^MLi^CPmet>Wr8g-r?B`)DE7l`An@i5uJZQC`Q# zb@J+h+0x_M6r)5)^w5Qv0_HTqUFoi-IE6lukw}X}bToUcvPe=jY0(@@4Vx?cP0$My zzF2R(GEVi?UrqQN8fYvy5KWew^pCUz&5l)*&*q zh1(Tnw2{&l-%R9OgOLERsl4VyT!eVJg`##+k<GS5Q_kkuIm7Mo;lqv z!j1K9Aoy=mc!RaK>ZVS&SF8;`S07Y1mL#RxGxyOijH_5E;`!5WZ~$UqWk~Kw)hewu z&&q-qDaf&mDp_0+JGMQoj64pqkp0tN7p|Xx4cC=1a9ppk>?SD$!g&;YTtc=y^?(j-AE6+ z943mCmX41)A{namjz?@vTL+}(cI_0k6WkNo949`jJQ86zgxsDw3F=5%Jsi?RT(3E| zm?r38oNraP{d~Vg+E^=s^&d@*HbsxA*}w)iSMDk<5lz8Eth>sdjgzB0Iqd# z*KOE*0KfutBPeij&{A>``mG@b$sL3y{~@JH5WuPqxjrBr!`3voXsFLc)Ylhr#|&>N z7p-ef)IDn&^T@&nWUDPbHWrDpsny#HWiR@?k$n7{6U)tdkHuFKNikNzrz8FyD`MqX z`D7G>36$#k+I7F;DXkL^*_B2L1{{~SFt#fCN6c68YeNjVfx=Hb**J(Q50}ylGHGKOJvKz4`St-{x@{ApoSbT?SHY$Yyik4w~|2r1hjtao%;t zW{Z-cxq0a*NCCWw4kMGOj;gbWjR%#ZXW?|?`tYZRG%7hAZAB)Fedn3o*I&F11*hus zrdvR32p&SMGSj4poc1q|`8~YvxpS`)K1Q|VCJ#$$q_k$1gYAR!ebuye_FQl)Mfb&S zI&{5XS^6mxOuK{=t=FJ|KFfcgwMCos3_orwcB^e2X;U=xZbE1;0P%^ukHZjeT2~>V zQjSQ2_2bkBb^^VPiV`v^iGW_gZ2K$3OtOWmzalGPb4uRYg5^@y80imzwZNnSb^}#- zPTvb3)x+;ukb7U=&n$bmwew&hYyu(-N!H`Ng35f7XIgd{_uDE)Ni*np4PvGmY z4X?6U%{#9Oglf7_CSZW=rt^4bs}Dyi>0#*NP6_Wu)aUCoXkF1o3vkdTGbxy@!AQiG z42$iSkl^wq^Ji#q3O`wB`|djNP&Rp?)eFur$zxq#>d-(!qhh9t^C-JSP9OSsWKxPL zPe|{cxO8lnsbuVDom(oNeV=E_={Ih}K9N;3cd_3X^<24Z^Z1)Iha4U0V%qcwK%_oe zD!s_3St{vUFATN#d-q%bFXz3@gTf6y{ipWLWmsZ7eYqGTf_0lBa_Ir2WPGxGFfF($ zGxTyVhw~iXwI-803wb$Je@Mf8>%ALEv!jHloQvo(N5&&r5$P36gUSN)K=P-TxvJu; z{HGwAxtt6p9!)K<+i09rSastQvCa%;D8a^A9Wk*~!s04V{Zvd9EWBq+KYbCiWiBl8YqjAu&__<7Wo4LA#m<)?pa?qBBwx;8Ub3xTfo`G&&22-V0 z8K2HvixiWDkcmu^*Mx6A;9Xo5)G+s@M2vIsj(K*Z!*wslL)3ySW$l2?E^OUB;Tu#E z=hSU|ftjP-{CM`f8w=cty(Oq&2}{eVQt=6}cZJsaiMCfAyY3%;5OK`M0BNlnW8^F4 zQPc<*Tvh@ua|$DdgpPs-2+r;==0MSN(8Mn<0?tdhx1939W}Rm7W?MaR(DquW#1Y zbBqUOwi+gMTV12_Yy4K=%iZ~FeCwrvLUd6eB)hN~Pti!~Ho{P17yN{=mNB&P+mTX6 z`(&H&&HdzSe>LF?Kql(B7-VA*h};yGgaIHf5D|cLE0d4{RIB&{&?CRK<)}cfN$UOn zZPk6Q(u*!EuzqmrOJyHUt7=y;W04&3%FZxMxHR&E^P1)3#&>mbIsgDnnMV6lu?~4n zbw)GOk)#Zm2d@Z?%cLN7pK4`8WsBmAQgaR--IZ}UlVm@!dJ_1@kQ z@V}HFr|ReMOQSS&^|j5ztgZNJ_|V|X>-Y{~{TsPLPp}JIthMzHs)nA+$hq?yI*Y~{ znHV936uoWFIME5Rw?3i*B7!i@#8^FdqdQscd({bXCXcT=7U;NYVmEr_Go(nax$Yj@ z$9si{GnQAGePUb8KvgvyaAiDuB9J|L&(#|BAZ;WFDrh9?5ZXIj5e9$3Ssl_ZY_;)X zo=UBvA19#f*~l5?O+GI6mDk2LSt+s)j1S92|#9vJzo0uhyR5`>^}v z%r9_%y9#6!#IkboP%<&m)yo`TH9{y$fWZnF4>Cw;Eu-itExNQaten+IXo%oEEqd6HR|4@yPI1(Ccece5haS~~??l>?O1fT8IqJ_Q z@Yrv{_h}X9XnhxpJoy``>uy*^$0tzKI|nXP!(oQvG39)H?-wq|mhp#4vp6};amj1t z{tDuz5e0?upS!R<6z&Ms7V+zxf7zaAUwgRsYH9CshF1NnVxPy^vRbyE$ZLI;sqnP} z-5otz9We(b%Ws8rbwe+kg3XsSd3-*RA8FK1rcmVcM_fWwU5(Y3c;;tzX?DURNER2DbWucnIJ9~>(!XJn@vWx)iqBcV9D_g^Iq#2^(Ezpv!$}Ip za*gs55h9&m8&0^^&Mx)k$Bl@@n!311yu>T49Il#b+#KDC@`pRaKfyG-0SYS$)@x`@*?F6sXUt75v0HbM0F4$}Bdw+Rz3 zLV5(bE0}7e_#Db>>SZFk4Ckn zi<*jJ(nxLW{dZ<3xQ`8Og!w)4rtySK+MT^pBRoxOpfDX)dR};m2)jYLDH?%Ozjaqj zWPY(imr5y4cqV5XwR^Rg*C1ZdQctZ~uRh`2sXbP}SnFuE*ptz!GV$mg%@o9wD>q)} zNmEPk`fq^;-YJ!~9?qWXAHxT=Ix1vA-a)|vCm*J*5UJUYXVNl?eMP}2cuVlpLPj0T zXTI1}9*x926Kod||oEa#h?PvR2vbm+cH* zWGyuOeH@msUsilf?id^V>zJ~hRH`2LN&oAZ+WqXFwo;W4x|I+r7A6ze=_UiKn!*lb zD&b@yY&2qv$nNn)UJ`buG0PGS9i5C@;{gWl!shkzxaF$|gBoy>5-#Vpp2ppj$a;&p z!dLXup=mX7pF9y_A9CRS$rjXa$-M0{A7wO4kq$}2OJd{J_c)I5TGQIN*)mw9UAGuw z{QY`wN!>Y>O5}`$jep5q!-2=iR~E>$lKj5bJk3k^qp&QIEo;aw+TVfZZ)M@D`GDoo z?PbYWkXgsP9fJ$W^4?x-lqE%%fH)C0(dsyD0TGk&Ova~-Rp&awjh>um$VGGZG0O(0 z1^!3R^LZ|mzqYre%lPP3yfTo_DSDp>-W;T@#!%3@wt@eo;K__PpEhP^S`^3Z1#CTX z)0?KD&(O|6j~`k_C%RVi^`A``U2`x~4uQ>(z003?Dz`@(V~AUG`K z?fW*?DY<)nK}+KgL|98XYWcI7Z0^V}Q(EMbCT2V#@XHl2fd<7k zxyOQqEiR9adzTGWUd4^Ps1nqEO|tQOQ(0YYi1((ikH`T&i?49ssBo2yUEv0Tkq;rp zQyUNk2+>NxaasrvDar$@I?Oi80RV~AtlgB}x{0C=R#qz0tIBq81Rm$COTq*wR3M!b z$P1<8NL!5ZBIwY6&WCEb+q6-&(tJ7u)C?wR@h-F}G6v0~pPVQxDnnOAXdH~J)=BnLIOtxshZc6W{pTKXZC zJyW( zjUkyT)!*+O{d<=dDdq|nYpgA?*E$uhbcWV=!l*;cM8w{wTau_~%4=v^Bz9rSb+gJ( zXQM$y73BF|+}RqYdEnd8+ilSj%mN(m2ux(kNIod3p~H?0h@{9IL=gV`+$jvrR(0F{ zGscXHDo{GpBw*A*l)Qj3P|e!1T_@=)pL?KpYvoN(6>1r7t?u%usrm`}QD7ovo-Wbu z(;ti7yCY9HvNUq88&>nGd1aeeYqn}%DkW{1(e~SL6E|#oBi_~Z;@G!nzQh)Gu`oun zcr&>>{9D0scai_cA51QWj<$OEGtdDb3EZ!J6=@15*> zZ_PXEWZK@TAg9t~N9~D)zx9rqO!A72A}$e3ru#3>Gc z|NA`>nLg$#$r;IFNN*WA>38?NkX)Mv`ucnzPI zXZ*a;O{!OtEz`!`C&0zm^;r6f>!38lLfoD9lSJyt+L@y}t66Ec+8)*4E*-w_c?UBU z?hJ_PKMC9u(MN|)@^&^}W0PtuK_3*zxgmm)P;mi9+z#e631^#*B*&I*vObY=uO?v~ zxlFEgm#Ky)fs`wkREa_h9B82;< z9-LJaTYGoJL^shurV|E_djA-yg2omnV;^zxyP^ng@qF@SEK~EK6evlH;PoB1!<8W> zM~=-{3Dt?c=aLcpjHJ9pVn!HewxD>RRycv$AV1Q`>S>rkh@uW^3+sP7mV#K>2dY2O zrbD6!bh=a$KpN zF8=5D>=1i$*vbpT-0=_n60c5a{(AIZv80t=3z0sX@V|FL88PMgn(pfNjSPUO3DLwq zjUT;X3P70{hk)b21YU?82?6EfWGIejoc4YV*uI!G&Y#iPS8r9JAKn<@4x<6uDiGxXufL+ zifnGe>i|$`o8fGEEy9FB0?u7qoW8waP(Wx+I2x8MZ0>o3_BPjxl2(C=cMchY)kbrt z*#zoWw(+hf$Cqpq5XdyFN)j-Kh=b29S4|%a2MhebbyfVjnJz6HVMzy1+B%r1+)-!DXz0Jld>3~5}& zIO@&SCh|}ALJUSBrP`_tKByp3$1$O&uS3|cw+KGtPJ9rO zr*E-=w{TBmhvW}lFJuiXbXZ%nP2(l}csA{72pK%D4(hVg;LUt|SM3NIU8?)&GFICu zJQ8@nfJ1~zK27`GGs2Z;I6e3)^kguw=OQyPvgd{Mr)j_1BY4i2V~c&xjc3G|h1L4{ z>M8?P&Ur#RJ_%keeG*&1_8H_XgyQrTaUP-8{LIM+LreLgrm79a#6auTO(KzcmMV57 z2T7~d@f-Uivz#x%KZBE$3$>d@#Q|%o%T2z`}gkQv{ACjI`%mrEH4@K5^Qcgs{d^0d<+LAy z4vfcSTmC}MyqpgjJl!@k1xgjVHB%PXpC+8U{HX3Dy{%C5X(ruw!fH+*t^nYv4P$mnHA+R*xr{R3N0rVE13iU2>>xapWEA5JQx&lGU27bR zaWRWK0c2U0o|Wb)$?s*O>-X9DyF|+JOgoc9oC;4~3d@vlL~a;7m7=SP;?DQGl-Q&! zeE%BEp`^%M`W&AXMYkAeRw!aKQ0ZlbrW>`bahR{AQxZ0Brn66s^+MdMW?3{Tq#6p3 zk20MA()PCV5FRgHE#G@sGn|%ZhZgSfIC3Yn#eQA*mTVZAXa6;YqUeaO@s4DOk0wur z?{%3*{f9n@x*@Y4td!A@CS+fQl>|vl-qB&};{W`*g|`D;y(R+ym6@293h!7dseK4F z6|pYD$ogy^sJQ_hi;dN*h-Lq>)Pl-srPN8V+8j;7`duyfvKPx&7aVS|fZ}!2)UC2L z3Z&1tY-K!jf^T`;i>6kdtI$glNl=*4MwNJ}uJH|hRsncq$A#-Q9kQ#+%p8+Un_SYN z;zqiN+Pk-bvaPcE_LUz18Skq9=Mb8FpWt_!3H5e4&%zpu?j4_U?v8vhs*&$tlirK8iM{dc%hn=6*=+V7QkJs6Ky|UAqq10h*&o{5FO2c_Mht31BiXUJ~! z6K5MoQ3scpE~nr~ZFpVZa4I`Nt#+k~*Y@||K5yUsjg>olZY{G_O4(62Pq8(=0)ExY zd_-{{hL7_=?9<6}q`5U>Skb(M5sk_N91X#PtSh$`>L_f zaF4ldiP0CH@^PN`Y?;%M1xk(Dm!>PfpWR_FOMG?5uJcLpjR7M=a$4CU^0AkEB0w%n zSwG_^e(zYDaU0`;gv}ELgB`wS>1WOU;j)ienYA@zk2RbGR61ks8cS7MbaozesAzeg zS|5Z!yjYrQFU>Pl$*8HxMuCp3VoqdAIu#}Oxv#W-8{xn9;n|U?Bi{No)BI%0W2u>{ zf}=^M$b#38z2xj4zk#JnJpCy=$y0*-z_&&KmR_M0qP{qQz9y=_T0|9`fT*_lHX$L5J?JyY z@Nh=J`B%S%nW>7>IWK5y?~u*S1uN4RW4V=6obq%kXZA9iGJ7!|#4n&rwu9YANbJ%6h~bw`bRP z=`eEWOTqqbwoMd6RgSncgEYF~1^^AWWzEs5lFDOq9xR&k)Pny>VrLNW<}t@n=YsiO zD6u#^nix7zp~$_mwDUuSTz$P?z+U35n~6L4+l<+jkLCtA{)K=8hhxqDDC_HczU^!u z&RQ2r4#`%{6qsLS*|onLIC<)^=45!=w-pFjM2b~^Db#gz84q{xtXqDGgKZg%#8zKT zO~c%axS9!k);#6twcyg_(aBOr&`l0zaqyo;ZO;pRTf8kBZX{XZKcCfX#<(DaRZ~-Q zxNCks)9Yv1D9=IRZBd<@n_d}q%DQ^gs6Wd<^G2&Hgh#oGuw%IR{p-7J^D*nfjWuhY zT3_8@!w?TmTarzHE=rN}+_a2~&0K2DkUbOET7v(-CWx=v-j;X5Z=?RB370Nc{;j9| zdnc>}gu=hu#;Vi7aBHM|URcJ6he82a$BZ#98s!wbV?HHqxb2j=lAA)FsOf3rE- zJ@i{&qsy&-R8Kj%fNzROF7*_${dRUZz97*%?h~vq@P%vgX(`*@UT~|d_gbot>`mJQ z<^{KEfxHc!{X$`_1QH<>kAiN_r~xk+oa#kEhc@QCA?@Nmu+ssFQil_e+;NF{rYT67 zR=VL8QWXQ3SrDba1qc?asTR|$9ls%%yyDow2!=DmBG3)>%h5>^u%)PZyFp_o%OhOxfGuIt(^#l`MGw^H19|}{+y-Q%X@~l zwP^kv`C6e$?w8(rLa!Nn`uc46g3&L=1Wyi=qe1fGH>Ed zRYK!VpW6_jF!09;KJIiydi&)jg$98)zDbR3Xo01RO+&Aba~E5B>LlR3)u?=77_j;o z1zE}s8FZOKPMJX=6F32bi>YX<;IAO!sJgna#%hrY(jZb4Xi+9vWlT;5j7~1C`fgug zBc6oE$YJMdPMtweqJ^v~7n!9)WA};;5Ldqi8cE(Ac#{K`8O~;OA6qNO0dd=%d5nGD z@4wC}0{;xcEdXR}-is%y($4Sm9P zONh14!AKIl-1~H0FTq6Z*P|ZpWlS>koMVBTf{FFRw$2D-cOC{N5u@8+cm76Mo8w*s z9I$1ezHZud`Y=UioXg5$!D6~A?$t_X_{ zE-UBFkP1-s!Ljn{C{QKI1qtlPTBy@-@c{`4Y^8|D!|dn}69W^7iF%y&6e9pVW+aoU zz#VGU{Se`SEd`aprxVn`;;qYCu9a@@}2#efJ>oDez9beDag%8 zrb-f1^ZLsOq3*axs8xZ@TA=r7`9AF70}@VZis>EVoC^MhenF?o=dPp4ZU*jLeR1`M zwKr{HxF301XEEw1>30nt&y7gpO=Lfnk7GJspImKGf#wgOz^5I8oJ`ic@D{Gnz(Feu zyOLdxDRD|mQ%!48o%B23me-DHZe1fHa{qVzM2y{xzyFiN01WZV(iu`|DJ;1*dobnU zC}Zir)E&*!nSwb)D{?HrI=HB&KL?{8g-^r;K^Ugy^ki3#IS%DJrvCO%FJdX~g_^t% zbH@JFI068OZN1WbJWX^T|1T&Wigu$-rF3K*hyyxEMbtP7Eg`6n89FG%IW5516+EGX zq9T{of>5wZWt?$wNu6e33KFoj4FvonP!w%rRf+UqHXLboLk@yEg@6DE)m55}XNk}c4@6L$MJcUZbKjJs|! z2MTf%BM(7l%nT z08o^egHbK#mSRVlYv9sQx5%S;>0Zc2xgas$ONz(G}lQ=Q8)Gn2*G9@bUo`u3lws^>_+#FA12lf};nocNT$ z2nZ6Vr8{fjHu=f(hg}_Df`^!$Iw1lpGJ2lh|Bz8>M==BbkS*1Y>EQClkCL;-IKGd;b9EbYCO_ZvH?%&1QWkTI|#@0+d#eSq6z*E zfc{*aFq9EYt-pYN#GDq)eC~B}|G!3Z5%9R_D)s-ikNmP;IrZ?RKLmK@5Im#jeJeG} z(&YZlQuI6>;8si20to}(kOX>y6axNOj8Y=b9_Ud)>5?)i5c*`NG0q}*PS8BAl^V|! z%^JUHjvx}h&$)lYQklgWJiAjy`yUgMJY=|PdxF*Zj|o9(HON!4LHY3*qpi7-w6XjY zv3JN{7D7V=NX~Ss$qRb|u3Bv_c88i=68x1O6`o6r7#l7z(6HcO^o&CGe{^=6)li}A zi*Xj~PzCWK_k|EnmQSHq(KQm?bdhgDKM&d8(6o&w;uqI!dS}qN z$R|GP@64|Xh83}i4BD9pIP9Wy0^u`Ex1aVnVvaeZWJyC`Fc>zJ^H|hfJC`*YigmyL zKl|Y79jMFX6tkK~r%tN?> zKt)sr-V^UO1EvO@ArEDyoi(LCmdydKt~jJd{|>JPw}GAnD%@rOau$eBNirv417oET zWK{GJRBMd4feI%|fm^Wv6HwO=?Vw4T5`&@;z(D^31<1f(4IHN*S1x|JO)cAUpw?~d zQ>Hn|;O(U~P@(AY6a6Xt;qRM0{0w?b-S|(;l_76@Nq(ga!ptU?DiA)COHIrENoAJZ zV&u1JIbNf~ZfEnUB1tUg0*-@AZNVyHu?gdDqD+@C$m%m{!s5JMVdvAOm|*$^YYBZC zm93^P-S$Jxd7|njH&8>zPErC-sZ?5rEc?<_^a{yx)dM|~UJvhvFY6C|bLJzE;*Siq zoI*A`C2eyjZ64oWQwG`CJn4<_Xj#Z_IO{CwdH$~$E-qs1OOqB<5Ig@nQNHicsRG0? z(l`H9Y{=|RkS)^8Hl+M66^6>D?{Jc4baR6(ETH8X7A~n?lg(uvBx_}piV{>u&Pz%a zb9C^kilK&R+^A0-QCYBTxXFRMq4{4EIs+(2Vy52T!TyuBAihG%&scehCiL$sr2YrJ z%*$VblG{-aS3WosltZ^O@OZ=cq;er+)>4%nG+Y9=&}wB?88Wbyfs}C-^zpbllM8+M9 zDQ$}>sDKMtfZj@nHjxJizAiNwXwJ(_Rb|yy<~^|J977Orf_DtZZ4LG4n_?_^rW0{= zy^I)Fu=ghvD!+e7v)6=4RP37&Rf~dwP6MMev;ySZUp~hT6T*1Y()egO-Wn16)0(5G`0>~$a25^YY?igojMjVG_|F*KKl1*4aMN7R zl#U2$^53=bZLn6nD(Tf8F+Fb}^uo+hys&0bI9uM2VV2z`Bm9L)9SI%Cq*6vdn|yH4 zm*9^b8_N2~NP?(g!E*^lMe$OD0x^_>nUuRU@+VrgY1BwLj{yh{VXCD_mwClC3J;Wt z41aXSMvXwrVMNL^J$wSVJtmQql7tBwuVdouOz%bt=VZe)5_@gfD?Enk>ys&{n%MdC z8OfaL-#N7*_B)U29CMxR4$Z0)AjWN&%+ov&ClW8>Dpe3)c?0da z=eu%;U$!S#C*Hy5=>G8My-8l!Z2?^MeWEDpWvCb`J?c>*#CyROQd@;4cV~SR`8!um z;aIb!y@$KC!&`jy{@O0b+31_Dm5fx-N-Dp8%yfNG#eA5D-@=93#_>k6_st1i)+lbj zr_r8d=?2P1N6uA}8W0g*SY4lR#az&a6r)GF0E=gxpBWMDjodZMmGA-D>MpFc*IP;55s`}b>xg# zr5;cH*MtOx<>LjZ;1>K~d_t6SRCzO`hKwXCqngCuAO#cBz85owIOvT!BjI{S&Ztqo z8RY{hNlU;%ypv);0-u#u3v~I!E;kOAn^;&%tQ4vdD8Mp_VFb-A$_4jyf`!I?pOnnf z{JSF-@CfpSUT0oa1*uHMBdJcS&P=ZcL}DU*+?LYL^C;{l=jSl9o2m|7WJzqHwWZyg zhn>53@9jK%ny#~2A^fm8<>kR-VCU z&Hy;G;Ccmd0CT<99y7Ga@`pc&mpYX`HaJTDpWA&K8@V9js*+l4B4zV$Vw?h9)VDP~031OV3Gl zhy)9tDve(|4%#Qiec#X1<}73ztPsfx9KpoHJVl9wBM>8IK;}U?mn(QiNsJPJ-KZ1O zjWETIfOKk==z3(9d@?PCt~Gqomfmo>KN9Ct`d(lMoN+8jmbjiP#b(PxJs)|&V)``t^Ir2t$rqyo0 zc>DfB{V#hfO7iWI8>M&pTtqMF({+ox3Re!NyrnUH*I->6U|t``;2SOaHhn`ak*du~ zV*aEqgQ@XD(T2A3y&b&0Uvyy~j+y;OkI;juuWh2&^;ci>;g?xcX%js; zZ!Iq!{NQ8|eo4bn+vaS=lN@P8M#2{o{cA`*=TTy<0@K}C(~{_0>_PS)ZuPL-!iTmz zkiB(7Udt7At?@xilFv--e%47;w&myz>u6^7|0K$&y=RZa?xFt*i1-Gvw^d#~&&Lw8CI1kKuy3l|Yl)iaV?Flt z(iab~-FVH|nJ==6XlA3Z-xx1${qEdXXe;RX@U4gmJ+rDjgJrPL?7?=E7MH^AXk{h` zjhB%OtHD`TG?qUaFF*$-reffJY;=V_aRF)LNl@3et#m>SCsTB4T)n$z{XVmjhBFTh z41%hVW&xyJATDSb%WNhJDL(Kjo|V>tkro=G=j_ho359Bii22GmR}pyocQ)%X7%dPy z)FghxwMZ%+ID~{Hu?CLcd zU4uqOo1eswN=!EEmev;Xe4du~zWl8!d%~h^-h`rjt#iLWu3-S=Pa}NIY1;2-uv4?ivwp*Sx72tJDcK>SXkH00-S zsGmSiKnL#}H)=@DoFyO?70Jsh)o+GMp;(|bQAa6|Wdwv#12%Ja5Vp{MEb_0z_!^*4 z4mbQ0(duv`V9ytk zSBXdq_ivs5AMhWt@#1&h#n~fTji0{1?_VrF57PvQD?i9j+d~KnC*f6>LCSJhLWF~2 z(Z#4i2iHltr|t}(fCN+&`5^OVDe3|Jpru*1lo9NV64!>>r0ihN$V0sWL)cAyr22i&iLQ<4d3Iw1RG|k;_>T9o22wVX&Mhp6p9vUr-Pw|uj^_3{*(EvsgHeqO!1??k2jrEmh{+*$QWRyB2ZTiTu zAy|{)4}61W!}_H!?;A8XQAigvUNscG5Cl?J(fG`dLJ>=Uo1uAb=u-abuuoH(Q;7&K zbHq+d!(Ev$oDu*U!cax_;&wv!0^}a*ld6C6!m*n#^`@$}Ox^zOO;y;*!kW?R&u-|O z{0zv~-s+kuIrAlLLb`;JkLaz*CoY9D@qRj9dammDr|rK&y!h;&aL?55Uh@A=-rUZ+ zCRv*Qnu0PqgUp#&Al!7HBf{jwj=#U-3|NvUz8N8a6>C_8AHSysU#l0q%8dp@F$fTu z3zinr6JcRh0xlzGNyId;tG*5Y626hx{^?6SJiSElPkcUI$o=0s+;$glj^uPR3|?I< z{H&@BCL+UKe7{S0ttIL5>8+H2?ho$$Q0y=9{hLr>~XbV>~m%c*z)B zFC3#?r0&z5T|%SK%@iGKs9R_o+8x;eHR&E!2z`Ye>K!zi%Kr&Env^%kK`TZJ9?e#l z5y(-G)AckpU;`Lk(7I{5HCKpCRzmL5Kjl}X@@j$VgqiD%7 zlz3+8HRt(JX*o8^a5)qKX=B$gLQ9J1rJtfS6GXw92soFr#3-=vP?F}l8+Nna-2ekN z3j6#lWe!TtMJfiuVTD9$DC)1gSYcF0Q1a1RiVI&e(dlQs9HG11o9b;%ZPd%Z&OwbZ z$Uq~d62=l!oLkkn^GOCdz@#L!P!lnIe-qQEeY1xtb|`-&f|zS67}%4H0CMCMKx7o4 z;;tC)y3l|atWRh(g+GBfDoY;M?*UnW#;W!QPbE-;^yNOo2qWY$0Tdq$>wSAMJck52 z1FwRUEOrh8b2>1BGmo<#UcA$9I)B4lcO`P&Htl;90N0dSXS%n`SFB4@qR=Z&#jNm= zHB5GQ!BO%jBi03-hpb8Edi7P{e>(GxnIp0Db^uH@1fxgr8?3;V51dmznq=dUHE7)(r{k%z zD3A*^oWtu=$!e@Z$0xaK^`;7j$Yh2J1hqQ98?1L4W-94kNlaN;C(id`R{d%tmHb9u zS0Tn8h-K^YWM=8<%CaeOeYVP4KGI}+o#kmvA8R}Nt9+E25@bVRDL<}bX#f}XgyM z9s~WVLwlYkqPEM+#_NfZ>DIk3w_m1i6k*@1n=nR1)qD@5-ty}{IXe5*bMgE6?39Q)#_R2q6moa1YoU*e`s|jWOTSPWw<2l58=Uku_NnSUnD+dzD|E* zUJ!}FI$)Ic&xMo8DH+vaVD*qqutNHocK7&ZiH#veahE{=eke^Y?s3N=ke3 zzHWHgMZH$Ad~WE*A^SAqai4X)*v4hqNi#*i3I>MLL!X~N;snvfkIkAMD$VSNwwMk# zn(4bep1i&{?y!6D=e-#K2L9lb?ZmGy&k2KLu?zaHeSSNokB)SMzwf`hIA!=Fd2;cK zY35?0MD8I8L|D2JHK@iwqh%o%TvEwBK&dQpm4O4tF1^ed1R-|8TT*n;n=DJE(pHjz zd!)1}8GzPc)CsLQHEvYK62Z$b@LBbCWV%;Nf3i2qmsx;MJnSq023wHJ^Br9Cx$d+AngxM2QN;2fff1y(34X;FMYx)h*~6Re~A*JIqn((J@($K4?SECllV1OSi{ zV3D$YPkfF3uh0dgfXX;U4(`nUe>dRQ(^Q45cSm1-8UODNeBQm||H>X)wLk!{#2!^@ zV3XJ$|96G>E#DMmPKLG{hDNw3bn+lTs@#z0je!pKFdv93#x{bfx2y<8%*2p zLKH491CWjyfighL)JS7nVX~CusxS^l0dk~-Ycj6w#b(`UVmvTkpQu#}XDzf@b|sLf zO=?k6;(&ckF#akGXPPK$pj!# zq+%?2r&KJPV<--1&zmkr*W%JTa~drA<{~J41N=7?eatSOWAsDr-_$UF!Jbm}E`z^7 zIjN?3mhvN(`j-@9q7a5fRa3i*Na-9%?4j*E#*OoHlk!u`t6#M^j44X2#I&<}yw`wb zHV+rDbRyBwvrTHqqy*2t(x6Y zuKT?~^}oh!Zh(L3*Ya8IE%+)a_i!@Q27?pxq=lD?h00i{koz`cVS2CMT~R8~PD z3|Mtj3@_hGX1J`!yRR_s)*q>$|02h zK>yugf~*M%6hZ~-pvIcRqCT2*Iy*bLd}BV=jRUEZsX~|rV2fK=Lct9PX%6YbVQzL$ zI5||;B=NiN@QNYnD5S#un6!npMY1F2M-*^6XF~v(epmTO1(wl&z|(^|CNzfb^NyH*>Q=c_cMf$6?Yu7zQ+0^5s#oj#<6^F5(nRX-bO?G3J3e zklr}GQ3k78yG#ad%yn%grCnHv9SbW^N|DYhUavkWu(#vjv3a@v*JG>!s6yiO-rp%B zYWqL6VmWFW>F@6|{)XRw8>nq%xZWc*D+JX1p%5ebWZ51wk+X@2dAmu&n<0HvpR#iA=c?Fe&OXRQ_qq0{9N zC=QN$=8{HHR<@103xP1w2B1EYE@&8bM7Iu7#GLU`Er9wV9E61|vS@uQ!_7r$%E3XB zXoxUIz{W)f5ic#TC!O-{K2oVi@7C4m{ zhW6)z%8}P=@zmrbSZN9ZsX-I`oimAe5K{8|N0=dg(H9-#=U#lz7MszTb5yaQif|zt~pQKii)ED~dhdS0dlh zQJR$F!yBuyDl(3^thR^5f;Sb#(wno%t+xH5FO<`Nh+xkql1CK!;=GpI}dZZ zHJON5G2vacraQqIOOoY9)~8`jJ|{{26h_dB2VMV_*@djxADgZ8|LqT#tmyy{oec4s z#DMkeW84{wZcJmOr?3WMWA2G5td@_4{~uFd9oKZh-@2naf0boWR% zxm;(L`J55{3xe3Ox(Q32x-Nj|GgUL1%ux+7T&hBKa9M-)t zBUzUDQ@rkY<-%!U6JZXBx91%0akMZiZyr^n3u%FY6I`IpffYpFk>xlVB|qhp%^D}A z%N$f_1Q|pvlFlkOf7n740S5E8uXshNyHhjfxN;g&1#lsX0g-?{cAxW6w)Avzk$eR+ z!511naZZ`mg~fS3aY!t{6a^f$5-I0|dhi2?98_B)`Fq$w8lYr@O}Vo$TW`xIAgJCa zX}fd`JCupBvil>SgHvE%dlt?r*oTO9t#qdZmGlgB`{X%&9NK0!FR$T*OgtiXv znpkk)K9t2U=)hW=j(T5CoXu;Yz>Gll#Ppunxk>CD3c2M^;a<50ONU;a+L%EY=vt>U zpB_g-Pork_L5sChfxh?BNi>gcVA?}!KPc53+kbmGe~yLdq;G%ww@UNlXSdU&63LM^ z@p#eo(f3}uwy%&#Ev8LxPQ zFxy50CYQ_uUG*Ls!w(62Xpl6p-A}qx=tdamxLEBx)0Gp{D>>Lf%!cBsh-K5kVrEDh zTF~4jmWbLkt;RYre#piQ5K?40ZKM#(5GCQxty_X9Cb+nGzkv`gU%qd=sw`2g=-LFT zXZS;a)M~*)+9W}8!>^QF2F1EcXfat+e-^uLuODt><}rM5bw81`UI@3jXgaC;Gu3Yh z{SZe;S#OiS;r1iuQS?a4AfBz0s%o-5sm{QJ=qxJ{_o}pm1{4kuL#$0}@6LRlthBxm z8@O71%_0A6v|O4m5V_eJcyf)t=c*+k@7FWlI3;Lp?P@(VOB)1OBY3L>`W6!l%y#c{ z`rJ-z&eXqH#3a?ZXIjTSun9K5xb{E)`PTU7dSbK8x@D{&LpNf8g>=!i3#`lto$WKEF7*1mavLp zHO$QoPJofGkabq%68flMbbMqqgE%VbmNoNV#l5P>T6dIwz;pTLe#F?8zW=imNoKT> z!ZM#@h5!nnqechv%iTU}nV-Si3Kt8*URM?>R1REd2?oo-0GaZ=xefQd2`H;b*F@PG z#FAMwJ8;4{C)bzz^Q?t8`~6=QbKiMxQ1mJI!GSX+%x+Ag%5S>C%3=53KmkAsvxN>S z)5SdwW|dg&*VL;I$0vV3{?|SuFGJ7&eY(iC{4_aYe57pC2LPzUNfskTEPpB_r-*XW zFE#Q2gVJPWs*dxscmi%^z?0N&oYounOjUhg||!FpNCq z*S-wIy3SzC5JYDR8u!aYcTFZR4`Bo7Fjnm1D{UBQrJ$#vkicSu467b1BR6VHRArO* zLg+KPZ0J*ycp$r`JXmNNCRKNkHG(g3%nI@lK`|&W%gQ{*P!)?Gi>HkCkVznqh$5d# z7fLV$Q5pGTsblc~Fb_>c_&6CIc|4UlpZ*A*W|3R;A+$xYW{>?e95v;qNg>=ew=3Di zBFs&XD0Z9f8d%vyGYNaweH48TuMDbkh5K(%34-i4@X&5g^OYzY88X_M`P-qF;;7TG z7*TtwJ1%EjvftB&3`o%wXgwwhM*}FS7dE}SbX|v8Cr}AJV@K1r?c7qevaVLRQEDgp zcsk#d$x@(iYUSaMgeLT{#sQLb=jX^9-L(fX$NhtzCUFWRk%iw^5evv>3l+mDNq3>pG$X&a08DahAt(Kq;-F~cq z!W}D4#Vh=MAvBZkAu?Y)s2A^MTaAlr`OoF7BM!tvsAJU;YtP|jf!7Zl<}p4=t#$Nr z?zZsas{1RBTJ=MwX?Y)7#$6^U3gslEHGbHgUHkLtY~o+1+3XUwy1(!w`{Dn-+Cr)w zEn4@G`UC*bUl#(rK_M84>e0mH98UsA?_eb-CEw;>7g_;89z~mwC@fR{aUo?g4pL@H zK>g!FbwnJ;V!=UVmm17GT#wk~o1-2Xp4_jMg9I^!!?j@d$zUldIRe00f)XW+2GH$p z$WCu40G#BzWGK!wiPW9+psdgaL}`1{RZ3@7>ZZD*tF%end-^<;WaRGj(atDB4X3bL zp1&Myh%@()M8|Q76Pa9)vXSeX#XxBcz)*TJmhlma;pO}cpvcWW$S4^^mxG=|pKNZS zEKG_YXuhIvTN8!NjYJXsA=qL+9Gr|13J7Ng^kW$%cT~4g8KvQZOsx0BQ}BT5C7$ec zPCyPDMMU`S+2NDi7Q#1j4Ua?>oB3cSfNpg84FANW7}$`Byss}0Z>RkUgx@Bqd}Emw z5s@@xq*ua1WMTw1eoDdu=r>x*pSz~E$3!V)c^;@HQsWiaZ)CHFOV4L?-DLLA#Udn? zsI!)($t3RHdXYd0tSQY1tTSm0-ZmNh%@}um?GqRY=#!GoijpwQ)uMhU)ESXevFH&M z`X$D1+RW>^3TLVoy14m3&9JHJZP@>;dT~}+x}m97^yJ@c4;AjgIwNcCk(Kn+3&R0aqq(s-ZrRiscsMo}|*<$5`8&Y_VLgYZEL`YC!b1ROCt zo(>>`oXN}U5&HyB`cG5MDp?qF(O5TX1n|V$ZY;f!M6gX0P90N`e|xe>LYyojTv~2h zmLuiG4z3iN5+xnU*Jc>VeuQkDR0LSK>f-aL0l+Q$Qh+A{;t)k2x4Ejl!t&~g`B81} zIPd5p^ft)DFAh!|h#QX`0~CtSd_xZ7?(3qQi`g`JG5fhf*eR+Oy;UVLsfnXxudm6m zjm_DgqAvzNPllUHzK{+cxc#Whoy)zxn=0ELnx~E+f?-sV{B3fzwW@Umb&Zhd35w{h z`o{^+*sWHG&$CPGU%$OsoE@0wDB8{H{n91x^KemAsUQP{!L-{8@^YEh$lge*r=C2vMDL(ZedNh4UKxBs6g#O+mP@Vn|if}wx)D1DuF*Hr)f>zflb1>Kg{?CJmgrtSOt zu9=cURY;V%tpkeuzTb)FAd~NTF8$68EddM?CXV9b2k52dX^;~b_f3JZS%7}QC}Bg2 zF&f7V@t}j^dQ1MHdrxBeC50n?b>nB3^$OGqAYiTXQ~Mk7d`;?n0Pl$5ds+aiWt+{G75)=f{N;df1KZ>-PX;? zT2Nq#lICWJ+&a28YUiYS$J~kDy=PvIyY#(svY-c5lUz*Dwcc?~4)0uvcFCPDX zZu5VR`#W{{T@WAaUGUxKHrm%NEJ`>Tb-ulCxacaX()SYvLmC*oLA1S{^hid3d51_- zI!+D7V!UvDDs!`0=^&omkSQGn$Mnr<#3IJ-&ww`B9lz(5jEas{^p^#A>(<21-WI8z zBMVB_o8#jnsEO_f}$@kjHGT!#xtTn@BV6;27+jkBRH~HF_#V5ZMM7 z?yrD(DmE7&*h_-Dnu6WOR*3-lm(miKdP$}6{h1%`#g#2Sk8fLPpIIS{uZ(V}ahsS} z7cfYg6MgRT_YZn}M7g=mht{sYYC?9?O|eGIQ$Hu#892UB!tt>l*E~h zD0Qowet}UhSpXa;8Y~FmB(uyoSwtXMOb{y zta^$-A*&&DX7%$G>OzQFsxzM|J^hMkq zUrOrqKfJb%=8h$rTCS!ibd5BVXQBdePUudi(61 z?>WW8Z&cSV{tO>5gLN$}gx~C*B1V~mLJtkU4wb3Zp+tI=}%`w$IVgKuz8~ml%=b$Xr>aN;mwe zn-xSf7&H=8V?`OWNk-kS@HMx<>am~Wu$=CS*XlTp;d-tLuUCYh`MZu8AuT0q$45j zscdmLUZ9Qis9U}!eV_I5{YzgSUVIY{l8K_dzxEwvj{2u~(S)+w5X4op|1UW@!bZC~n6JKHqsv1KH(xV6_Ot#P=OD0|@>bs3Pw0mCTJ@Hh}=-q7YGpW!m z-0=4^;*G1ngGY7BSrFx;>kWIfYm!7$8SBKrJ(^J07Y4NPlVZ0|*Cq_|5^;mI)uidf zJ%RX=N4>YFmrs|&`5-RJ;7?ovR5Oqn0tZ(ik% z5&iu^+cw75eX;nb3*S~DX(mKl8X$RgbQpH?`8Og(PPaBTC$S_&+j}%;QyYY*uCa|E zQ=)65VKK$Qp~ZL<2jdpSXe)2&q*=jW;?M2!VGe0SajHRd5Tf?o2 zxz0CI(wl$gol?NN`<*Y1?>&4btZ8UmlA1Y(PB=+^VOhHU*(@8|yhDjaiYu|6b~7H# z%_lxie0aE}&N7*zkjbm~js3Fouebyig%=`|yrmi%u8%25m5Dg?kMY8!p4IPL(bje} zK9c-u+iaZ5Pu|aS2a?LwRsm2Q*_+7QV{6?0f01wm01tZ3z9%6;6c0NlWwBfof6t!e z;%oqa5D5uR{E_6;Lw0CDHPpDR&N#!O_HpO4ZzI3eAUfYJ#!h7}E*`W*Giu0zb93$( zb-r0kGPeMWRRJ(uNWxem@C3@J&j)C-F}mqY?GLqb@(3hf=q|ZYgVIF}+Upuj&aF%k z8U<5}CN{%g>HboCOdnsq3%|ucC0!{^9iO1n*Y&%UW~kZCY9UxC)AXq4o#?uG+ldM> zMA0_j=RKH-%Hf%et_y~MpM`mY5;k%b5gWPhxy8JGN(Hwib$hbFSdG)3Ht;N` z=`scAG^l1SDmmF+yCFTl{W9Rr&0)&gYhJiNwlP@(L7UWrwI9BDKN&eYMh8}mNN>;y zrdgNZ>HViYmej_>Q){YPdM;j(W?`?F-gpoz{(nK|;^6P+pgowRo25vg)zs(_Y}8G2 zzYNBR&`{=9_6X6Y*(FymLjg)IeVVXv82DiL{E_E4{VBVbux(lN%x3k3bE15E6jsJ1 zxX>>EMz*F9uQ_ir@rb8Tl)oEUMUFM>lzruFe#`~6vtxL_9mXsfR1z>tRc$3g<)JOo z@Yu8QI=02pq4;zO`FcQX@0Lg*gf;H*cGrTzkH87;`n$DTttYh-zr7&-%oO85ikJu@ zw-giea zNRWRd7^|6)dyY%elst2#wIJ$Ngt-F9V%M`@hpU^HTV6YVRNrp0``pj!t?Hku%GS41 z=dXV_g|x<7b7ejJy0ma1`N!UDX~y zXO~-4;Fq+f`o|&DPyDWx@jdRjOLx5*d+~c^x zdh5`USzzB8s9ogml;>GCoa5%-$NmR1TmY#=ERGm*^hO4a4YL^91`Vo19GW;qUGZ9Y z3LF*R1Dm^=ARyErZtnISKH_J=$$)XkLN?z{T)26+h?MWNB!m9^Z}aHVf}~f7(cG&9 z!f%%4#jWYCcvhB5$IA-cZE7Yf*Ht<``{k*oX58>NSE!_EZjl?Q>ELJutF8M@H(fA_ z54@mG@;ntj`6dwcXgFbS_{xhfgn4%BxQY{nuy*5ZU{;fD05tJNa@C^rg=taW-6zS> zi&;+($M+fizY2V$jz@H?xR1WV|3$(yp3Tg2;=K&g`M*SeLUmG^op`E*{~N5>sj^m2 zu9nO>d7lR9Jjn!*$pS?FI3UKqx?Np`YW_*S=)AZ%zW5V(N&4dL+pwOC9dR&sP|gdK zrl|SvdmnBal&7o!7|kMwjWw^0`ku%8#I%Vqu~2# z^7V-vfF2gXQZd;K$~JQT;$3UUD)r4Ex=|N#q+Kbsw~WHx{xE;I%k0Pi zytz8B6uOnzzY(X6D;^m8U|M+dsn`A!Yt{nwR)c9N*8Yu$Z@@znnJyN=oKKX(Qtsaq zu^$>^w)z$F^+50nMo%%5Ia5{U{n49i4}~fU-CFjJ-TjKLFmxSfes!%cW0ze@Rx-&b zl>$6VL8f9>3~S4GG%#H-Uu&NW+rWP>rx&Z!&#u@1b0Gcwkf{lL`_?}`(3BHT^4rn} z6Q!U8hcAv#FVVxTygDpHXgp$T=I?p2b_oXj;5-XFXOY;W0j~( zS2FZk*({v!3h%@y6GzCm2(V*u_q!|z*nSouWs&;RF#Z+T`JjJc>D z;;i#LWatO)=rs@BUJRjbiZtJA4xrV!zZg2;k9L(CqsNo&(_}YU8=shRNi>! zoxS$A{40(6Rsi`x0oT14if2om_pdwN{qx0X>`&p>i;Jp@i_d>ZLx$HcE^a)C|M`=k zrP)IJ@b|CeFZVBwf>~p-?f_A_2~a}HBuClp5~=BQ`Jw%Ts7u_K{swX?bo>X+eVE&rw{*gPDve*~KT+-hSmum4~ArTbo4Z)yfsz z94^{ApQ)Zne?_cTd{4RLo^~M)Q4yb)D-EB*e7%kRqO2$?m$fP^|aR^Ux_1keR*nSo?>mz3koJ zN-ZlMM{{H0hy6 z6YyZx4&7Je<~I&}=;9|7Qda?dg?-N^moC=U|L*lZ=g-gEz4RT6QRF1-+YUg$iBjin44tIY41&u8(GF5!36EXrq*l|0s zOp%+QpHCU$`(k4m)cF2;L{b?;;Oudgrdg%mPbrRfNzhVhL-jKcMzVNvc!^J=IIU_uJzXfKH#EJK%yWEPAwv#6l*F;C%4EW-0`8c zCvAMPMYu3PS4HvpBi;KJgEFn|$(jL2^m8$ZG z1z$Ml&aI{`yopTj%w;LAOmt@t{r>4puO+F>5{mmS9N?hz_`OoHI_>RCRRISpnx}Mw zfp<^P-kcc*d}g9U)BOm^ivl($@Pl(Jd*QjqV~S&D z+61J3aOv#d_fw_tc2Gz7))*cZ%<@FpEgd%Wi(?I)|;`B@_d*b|a{7Y_gsrlb}+g_=eU zh?1{H$W*G~cl%pFa;}plO%W)%RuL1cwAo8kbbC3(Ue;F=4B0jDe-^lo>IP2;=S>A6 z+|po*c>S$Y#!$KEz<>kw9SR}JU+)u77mi>1$+V>B- zZPKkP>}KC(mtYc8?)8q;EKG`&nVQjG@kh>_+csHI7V9h%R3XV zL+q41_qRu0Wy@375^cZT|2R|q{>IghLw4u84qF<+c#R!^OpvLu&iyU}yHLN?2*3>= z$pu#zP`ydU9#u!?(D$D7@Jp_`eeBvc$g(%t_oADsO1cW-b*{34x($HFUiF&pVYW6q zUe14!Fcto-%X@)z$OZm`1YV{m7L!k}l8`|fdjNp^Ynu+jJmVuQdTxJFmV5AW|BEBg zc>FqRqm`kc+*cbzlcgfrev=;T6!qB`W`Xzcb)uKIrZDwm*RyVLUn&%>_#XaN8~pq}8IJo%D|Y_?D_e>1W& zauDe5Or48~8kDC2vZb^`nHpOwmRlS;`STp%&xUrtG}=E9UO9U0&Hm+^y9HgI;MUNh z`Kg|W85d_{$}{Sd^0hv|8jMN8&=kc4;z^}ROfVL8Bd+SC@)>e>U@|dEruRgWS=GtZD@){GJ6nptR*M`*DKber zFnNwAM>WvU)5)vy#f=y5e7o-LfX~MTY>aJ(-#eo3rYlVQasT+m)tiNLp05qbkBK&g z1IVPXYM!DTsZQ|!n{ms zI|_NVissaGk}dShiiR1`&bs$vqHUz1;8Bp$MC+2_R>H3o9FDZPYa?GrtN z)hE;ndTR0)FM!G`X44KM2G%tUb1DTT^%yW$byu06ux-_I4qZV32Y9vwE;{hE>R1El zV#?&rimQ?}RnHc#Pb)3%Cb!tOS?<6;c6Z@jz2#XFZ;@O2FR{pPk9ER96GGCd1gh?o zg61Ku`8)T6XM?|1jTc_P5&nl0bRr zIs3`Pq*!3X_8JHWtC+i-jPbrn$C1V}VIR=bl_e@}a^R${HuIc0Z1H(o2T=5CcigZ12R z_Q!R##bqW|ZOxbXikjVh;^*BO?5%2>7Q2FP9D6l-dJ;YZ$cGFKpTD*1qi2Jl?o!kA zd8~SgxVqdoX(S&i)2(K8i< zGXa1LrQL6eId&%7v^UUZj&!T&6>cSTN_#A=tN`oyXrTo!C4A6MgPrmqNt)udJ73X4 z5O3h+?#qoVN6Bmge21*|5~m4a>NjuI+5TXvaS9q%!o0h^rcGBU)Al85>X)uRPWn+T z*LucdE~#bdpJoNue~zq1#Wji?2EUN8$H{B?`Og=M{%O^?Px)RW9}Bz#304T?H5xizRWxHzaLWi=yz92O&Caxuz{+gs;F@5- zWK0`1@SR}kH2W5HKY`D?EVEhcy(?2k?G*ZhEAxj2OwMw(k%Zzs-$Oyn^c7~Kzh}=n zp6$eAE-WW>MySvBnp!N7^SIFBcr(7*CEPWLzZ}FeCSeefqTxg~6r=B~ymEu=pxE0@ z%FH_VWKndp!g{)W1t3BmKJtr#8K?^j6R1>u;3NXMON} zHz~IrJL&iP({4M8NxIIuO?t}jfeYI;aglqGo9l5_P#cGXN)R5yMQwiI5TdAQ+RWjG z3$^s7{nM6Hp>d}>jyI5FlY*~%;FgTzH)SjOH!4ptEZ%!uZNCp3*Y7Sqz3#j)FQEBZ z9z0E3zIk#-H}blas8kY#!nBHRIZxJ6noEfs-rgsMy>ERf%7ln{gt(P3te{5(I=2)X zUlzIGW-s8AIwNEkUlTcaf6LsNGRR5y|Hz8uhM?84VFT6_+pd zX%v?h)Ng_{A$|6@Pqy6S#N3M|Qma{%F0)dV{gM(aW2W^y1_*TE zVv)@7t<+z>jqpCj*xkEWwFbk0rZI_~m#I%FiyEyelEj!}g?4qM79H(5bu)_E_Pp<` zy_b}!bK^TRe^*l*UlZB$>=#OA#NLTezk*Y+NV&dr3$u=leG~s6bG73&7pB9K_Ae4h z3I*eC3qK7XkVv@xBO$?YT4r|q^nYa6d26@Ar1O?0bL1n3*Ax%vLOhP%2}tM0aq~mt zOZ99I;_2PPiR7*O0o5rq7M9@3(jh*fbz5uJTIBYD^{nAx4^KV10_vPUB=$R&j;{;(fA+jo+o zjm7_98Pl8}kZUsEu;N}ryYes~lQ-(~g*752Gai{+$?EcZ>+{>{3y)-WUwtJ+yl}PT zM57T&=&b-FevRBkfe9~#XLKSWqT{9Z=`&DqHcWD(`y?~tS%obmXVNN$<8qBHAhedQ(DsnS1WJ)z%Y$5Q#jwto+hpLC3 znM#p?5azl8we&R@t}5>>qPg624L{e^Our`MTTX}AAJ(-t z0MOcPq`rlpl&w#I`e}xqd zmjB5|xNFKZr`$F-{>e;TCpvaRFAEJRAL+5E5TXQ(*@C?L4|6rpUF9MMr>4^})eK8V z+*%M5Yp-fWB?bd+ffj3NrBY&MSm=bv(N=eW$Pwrjl5Vw+~JRe253Ug_Hxu5`X07!0*?As-2({q3-qRIo7tF0JOH7sc8cwMX;f6uIf zMM9gsQ~h)O@(_QpkC(5RX5@__8`XV%_^!C;Na?AbO!M&CCIqil6JH>H33k+;C9 zcJkG)4b$!0jrEIW*~ruKzpnZf@D=MhPg1`0{09jfYGp>pYKZ^3>ZuGcs?wtC7h&nr zoEoY-(-7^y>X}?0Myr}>Q3qDA^cWThh_zle26^`uWA2?PBzKb+$|t0C!d6E`Grkh@ zObZpto9;p*JfBL57<*TyH)OKAd0wu@IMOVCWrTNQ_ewIX5%)z}ecj1LI*DpD%$Tj;;O@mnP{G3hG{^bs1->+-hk& zvKtsuc|kp4Cfnw>TEw|B>EY!tWn}*Gp);WLafD}VMW#Sr zyMB1TWVhkk?EWhNkl&-z_1)q-!tjVHk&Fld$cZubqoAK`)dzvp96)aBFhfL0A9*-{ zc1skCjs0t&1N_%eQs?fb!Tx_;^~NK;V_ZDx@jthGx%_c;bfJhg^X`PS73c@-YB1{aE@w1J}nn znPAa?X+_=14`#CWz$Kbs^3TUX}rr*^x`z$8f{YDR%dXi?7NV*NyiV2ESgO*+sCiWw@6S>>W{kbZf zys@_-91jlPd1e^|SROBP#g3XiKakkfHgMO_8{jZVhi0t=Pp&Dc*>%zd2dq^Y8UL}_ zJ8Su=*q~n%BlLl{#`(MQEB88Vk){}&S1D^EyS(Oy(hp_x2JR{~pC#t&<`3!gz2W~! zdlvCuACbl_Zn}p2*Fdu*<*a`-J}fWzkLR5DS=>YjZRL1v0WhS5Tv>jU#38VGre2-n zHY%_WlTaJe83eS_lz+cXKQMB?s$k;Qa zW6iw}o7*kPdx6tC1_42yP%}JZ3=mZtIL8imb$bFGG(Z+EQpj=2Qn3u2KFWb<$2Dhq zH>V{!iXav3|>JCJTdYMo)7r-tJhy&{=n&$^i#s_{cGH!%Ey?kNrr&(`CEtDUPo6F zHrFb#-VDJFokzbL27^+#u2?7}O>Ab}fjU!%li9}hKi(B=UVjSt8&yeZ&o|Gx_a^^C zf?z^D&=h>>@ zFJ)YW=?yRM^BB{#o+VF=f}-^>!TgKCqD32*f2Z4@3b*}ai`wf#rDO*B3p^@tHejI$8zrj*kPVX$qjp| zQY@P=2SJHu2FE~80E;08Eox}Tfu=118~rNA328Gif@5Z7k>^6U>Z<>Dpg_@Yzi z%IjJS<0P@Rvp+R2brDqX$Tc}rU`$N9Hd18$9uE{0t_?pN`p2mi(pAOX7yAZweCVo6=aa?3fr&VaE`3Y%Xuu!OA z^3j*52@3A}4}!{oz{ix)NL)B$2QI3*y4awP7_t?e^<{%%AXhx7bWCr@&}t5aPgO3s zy*K`#*8{7(ZZ?)7+qHiw+Sao{Kfe#~C>D5G=&&y#^xOddOIgH3hh`{LPghM{a)ttRsV%|RYIp9@klboaUvS0jg z`$#CJLat5RgVfTm_9gWOrumZR5^{mV$(%UEEn;cSGp|NrQ>J!v#sM;`;)WefnR7yG z>3&Md4{pOO&LqLKO%poP>z;q}k)MFC*{-iXnYe8I6YfZ(+9o8C5BxvS9_whQ9i6qe zZwfb&s4?jP%E;fEK3hlyK*%N7u9Y}8EaJ_tHBs6 zYki)CiT!N08kgW@nja>FbPWnVY5=J<;2eP==U_cOOv&R62F?V%yT5&ApE*N!&ELA@tF` zmhTWyS|}$uj?SbHx8>Nyin{CK@QUtQRBhjhsqa;cI;SER* zVn?2}6cni|6%1j;Ke;JrmL|7}R~Kl7Me`j=9uEC-Y0R>I^xfVuTYfPU~O9{;awQt327nsqeN2rr& z?x{gc73O0?Wbv;fM^b0@kmYaFn!P?xgsnj>FOI!#2-gIAFI2UAwc0(UITftaXbXra zUTE8{GLqg~v~_!z_02r1dG1hoN*1&pLbUOoOuURQ=EQ;ney=WOqw2c+Et zlB=HKzwx@8{S^pQ%PC$CkH(AAo)?ULg&`qu5HZwSn<8e=AXa-lGw69%JitRTF5rtt>K$Q6 znfeFUW%c0%Eg?nTfy^oi26|)4XLetH1@Ty?x$SXT&bb>zOYjD?E}*j=B#_r6qB+f} zkq$wzIImkDduF?*vX!}|8D>fyiY^}$-5$>rNv3(YUrp`J2j(2R*O|Jvzo1MI^{pm zcf|AQ%~KnKww6P)_bH+bSmSKi@2ss4$5;vKt-YyTqOI_=U0rlAJRcy;{pPR7!i}tY z@<299$pIXWIviY|RO+S5y>uzO4hqP}STt6{G1YaE13}JAOuFQMU3Cio?Uu*<&sFE| z|Ghf=CRI$;A?*9p}#4gpAo%02Ei_-QObynp zV)Ga)qu6*ZL9TGs-~|=_IfD{YzU*gUO=1Z-1~jPzN=Jr604c@g7B^|rx(!ztP%3rjCFD_ObhdOY z*h=>B;4?tF|otb$WYt4BtS zm@p$${1uC!pJ53Sb4lpW>juhfujb_qd8U{gkN0wlca(;PXT(Z{zK>T?^v2FywR4t=OTL7xTvd0!~jpMb}h71b3?ZgPn zmLqWpP=n>5C3^xDK(%ij6a_HsM+q6C)df8r3`P29`Zg$s@tD`I4c%rY=q4{w8zdO! z9B53|F289?HlCcU08zRxe3c@2_V0P$T_x9>^i*2OPT2QlffS6yLEK&G&)=Ds{vjia zQa41wFgc8f)IDR63z^qv$r1NKAS*SebMYa)HUBPhv4|TXC`@JxB!@RCL2OZ$K+Tli zPU?lR?D0F#=dyg?iM5XAQ4NcGjoq#EoqYx*`6i{2-XICM_dkNZOwtMrex>0xmI%9GVhOi5^hnH>(0AE~+ zhR@*^-27yEI{QtTC#amJGWpXAh9VNEKz-`zuclh*C48nGHky=95K7c^xZ1C?J#@~9 zD-K~i-7Im^D@$kvsfQly^B>;Gb(o!fe9FGR7fyAd!>h zm`OP_9En7j!=NA$e_kR|Y= zzE6@Hn`3zvv3uI8cX5q-Yrhb@jda}*y}t3jX;17tC1ii-B~v0(P_2Wz$lf%K`*<`S zLw^r>T4v3{l+RVWnL(AeKwV6q%Xr?&?Jbs*nbXzXj)a}0;-fgoW3%LQ#XlOs96Ow8D8-S)Rb?U03XhBZWGBRUSB!D)W#n)|cPf6Uhc#jI^EDE+HbD`REg+&N6f&hwS zG_da+5#hOdHE~q%P)|e9iWf(-DAKc<-nm2*o~X)aD0{C9Jq}3Q3gZbjtf$yKMKMc=4FYW_PKK$RU`&514-K4@H2msJU-}@&9D=;;J zjRf{fxTkIjn=CS2FEV*v*zqqt_BV>~W32kMol*Z~y;DyHN+GNP@Q@x=DM| z)X&4BfY-!*68=sjUP}}E{pa8C0V|cY@BhzMzfIah1j+yJ^6oC0DK;rV!xfVwCr+N( zu1gD5KYO`|iDPTPmv+TL#7WD@I*AD%*{{SvV`EGKMj#UYIJ^i}qPA<$ykz)HGKVUt zB?jcfg$FLp=en-&QHr1;I_dOzu9jt)^mJzG(q7xJCdZY${XEY!tVN*S%EW7<5dJbh zNjI0Wz!&2MLAmZkZFvoUHbSsr)GtPOX6hm@p5=&r0P*dDDMTS5DR_CQr_ZZCakDCVv0^Rr8;uf8Ise-QDZ3w~w#Gn&;7} zl)VCX@z+oMJ#NgLyg)}}hx(uTZyuBJ!>uTp;cKea$FM;R`vj+;ymVVyFLXLnJ`zBc zftq+kIg|$s10?Z!Z`sW3_s(k1QOv$)3Yjh!VR!V_&^k#KcV)YMFhKB_oW*$3!Ncr2< zu>`=mbY8f-&kjKgvj*d6mLVCCm--=gQPW*0G=Kut)GP*etBp(jy-ETPg~aM12-%r6}B8G zmL{W!Y#$*r5NdV)9>T+*a{TkQORxUuP40`9QQi~67m>5AEN35|#;S_-UQV(o=46Co zt!gVN$8GmHn|N1nzG2T$Bh=6kpct}L?u)OQ+@;ImjbY2MaH2L5(P0W{iO?SP|F#Uq zjc0b9Q^1Q(D}S1$yjU|6@4-<$q}H7$}o>3{-g|7;)47NAlz493W5e(HSm ztUT#b&Zuzw{vY2^-2L{K1%#VGX5v2God$6-m0!w1Ao7HWd@9HN@v&lT>aw0;D$c|@ zaS=uXV7X0Q(NndOw?zT6U1r*lckOr%k^#E{XwsL=X%kWcvO3iAwyCuAd0tH%ziz&8 zdrSOrzgE~M)K83W0a-^aL^wjZS=w{V^`$Z*{o=^m@`Zki5NoTqR;wpEv}xtjDlrcF3P|e=mbRsY3I3^zg(Y?b zOve~z5HGVNYp7^M8jSpu>$JmOD?hX0vkqcRek-bs|56@A3v~oMx{i*y4Eu{rF90~^ z_eE`OogOYYX#3v9sQK=T+Jcgd9RSB$C;(XdzCpkx@DFNat{L4P|yU6k!>f`--ab+r+HWuG&INV^8mlTOdL}r~SM|yaxn7c1EJ3ZyukW^joQ||hMq9wDv zs%hfrw|OVtgT-4?HZq~54;(+og9dl8M(PvIyr`J8a+sVV|6KoeZ)1kt!I zs!+J(PzXVXQ%E)bS}G+K4^t|R0PnSLC49#L02&4&boy#omTaHBmB!GA!BD$yIL*_j zl%zor@Kycx<5%%(6UKO&=D$0J;27b{+r1GH%n>5&ZD=fPTJl`Zy3XxKwSUw12?}S) zMgLy78pIEv`h1T}c^%h9e{BOW2ZXBbcwiWR8ns`!gbqF1d%W?{IE96zTOgxWs~SU4 z^oPrCR1N0Qko^0xEA6(3G68P55YA4r2cN<^CW@UovftGa+cKtfe6&Hh-Xku|$TCxd zu_tjk+tKq;gLnQYw=mn@xZK0# zsjKGyrM7Xp4Pe+$UUt?S{3n4sNCLPT1;h2`R$Uxj$h%G^{hw?~T{sS^4J~ZM%zPC? zUTZWmIM0AnGPt@nbgKf)Womd7Uv`KS$`S< z9adj^rA|dMll19B+~u|7h^hcdwZ=gPC;NmXdTnBGTUKM@$lyuh24D$FPHMK^YrX)OXtkV%n({eBAEeL@)8P+0iuHQPXeU!M@xp5 zNg)hMoFi~PZ8{9dOt2UPqOvylk{&fg45n7Xfq`J6ge*8aQ7~bQNQ@R;m>4b#4xAR2 zj*~%vN``Q_ut(V1?^YKbI9FqXMjCKPO(po<7{|aNUSFb32;q}eP)nDFa1ihP1_k{* z5#`LNKNvGp!ALfv42A<7Du&>q2;Pf?@Q8?c+Xm7yr~4O5JDo@he|ak*Z~~xccwvy|ijWHxW2di;})<+7Ab9!7bhE{8hG~M4WA#PQ{&9ixSVT7vA*| z__XD#(5Mle2X3)S33LFXaN1(B5C>Gs^yGVkD;C#oPoLYk5LQh0W)w__zHgak7_TxC zrVOhPfV^UTYc{>{r(N~rZmevjyl}Pu?tgoeyAk@&cMtyOIAKVEG;oW&tNGEoso%|0c80FrA_2qI5T z9b6=NWx6UCo5;cu&%T^wLDk78BJg(!ouMF#(K`1C7+T}%QatI5vhgoh8Mq&8>w>aB zMF9Y>v-^3n<_*;NXZ9VaH^%RH`}N#peNRoY3`cwI9kPP6`?D-xoBe3?%+6@N72n=Z z5t{BBx7hl9x3*6qv{{rjqqHubk8zvAfoP^#SXs&@Um#^-6=h)A zGH;#7u?ruUuj;YmIS%vP2;rfKWr&?cwtijTt5*XIQ_dCX7KZOm&9hb6cfDT)nDA$P z$UglZqQjJ>>X_rWyg)c2U7a!AU{hY4tObi#wO`~i!R`+kYig-%rYcO=d}yat-?P2k zhZARHnsG1NY-Dbi@j0t4bN`hu4Q;09xTJU$rwXtpn z*VI2XoH#w_mJD@G4lT9@F%_W@{-K%P^cew$8_aGC8re& zd}fKg(WDnamG-J=XPrclK7q)zP#lhc8pk7bFSWdSH#U(DkbQDc;%9V<0#(~FFrZzw(cw9dP8w@TciXAC`) zg0N{s6l3wI4bh64Q{i|ofH)ZzSfVComDDeY$$ns`_a{SU-ffX%#}7{LOhifidEK#& ze&J$*ofY9*WhnDgr`rx{jxAV``I>lW*F{di}3dF`!dR9ig|1JdwcoM zhRn0A8#noZTUbRtz+ zp=!f=6cW=3OW6&BQ*bdH?UJa@3vDk)|1D+ipuWpFE#By9TmDxm3%^Ieh=iSgi`umb zZTjtd*U!u7IAUfpXXq;vNH&<+ZtO0 z%rDDndVKl8TU^%ewh-*`}j##k#$sIK0K|Up`M_=B0n~ykxhiiGo$zDnuOomZl3H z>Px9WYe}lgyv^VmQ+a~rN4_%6;^(Z*%acWuwfZ3p%cyfGzYcv=vToAYIi4{dD#r1{ zD`54)@Bn>C7x(SYWQfqizkqQ8@V(G^;l={-Un!I3z6;{&p9wx95hws~wVOmbiS7Vb zr_V1HKr6fg?c;N=d1YpJj*aWiVRzD62y!a}}KP zXVYu9a(d@9P1lWb!Sv7GmgldrTz*S)CFsPonGo?MR}5@df^9hQ2uCTo()gt`;+ofO@MD{6;b9W)aM1d(L-8e%{KoHVU(v@oW;d^JG_GE5#~ zQCSP=k25y8Vw9c)s-eHfv>1!xc77_8F5H#-Z)~+42|D{c@K{GazfE3kC(iT!Tgp5I z;152Z{^KhT__yA}I#j9gy8*@dx0HGB3Gc}Re#u`s@5b1FH|@7G`-2t!e&*e@U==QN z^xh(SFJ@Qb?x>Cb_6LJEu{FKki;ZOS09#BZ^Ek$j5PvcW)E`QI5V&?Q^$Mfm@z}CxQ`0$}N zK~cZ6=L-1&=!YUanu-p^@Z;BaxF<&7j(@u$YJ!1e*GZT|5wotm3{sBH{o{FTMpp7mrsa5f&y#6Q18-#E^`@?fPqrdvuT zp~gTUB`ne2W#epMGWS<{xPCcRQLc+cA}fBPIHtTgB-RLOJ)J3d1kuQNjYWoKQ!Z`4 zAeEpXK~J^-HdiMm-_d*7GV%oQ`hkZukG@*xJ?FDpgBo+$gp;(*%|UeY7K`%&JQ>F zBSb$N{o;x`UXfF%T!>V$sp_97rm>&Mr>0v}B+2Eid`(!A^gvkF(-gRx{0(wHP`{q~ z=sz+4zXLUf(fjin$J4=ovyjBM_Qdy;7sigE^cPtY-4YWPE{{V!UdMiRA@%mRvk%0R zXwF&pn?wIPrT+cM@8XsAVxt#aDeBOiJQ{&(r&7?=7Z)f6z{19tWSc08MPT&iimK-3 zn$$*u5eopN*ce<|!zev?MJe_5ka$DhkvX~ctg#1cm6ns|MiRH<+g{^v zNidA>qZf|}92}WkF@&Lr#JI}!Au<^Ab24${^?{?0RfDDLhA-YHsJD|uY{yl@G zdDGj*^arHRGDBiUt9CVmdg{8VW$l?wTYMkc#37cnN#8Ix-F%mm#x~asuxpTEZ`O{ZNUPOhn;{DY5xaaBkvYU~9HXJo?3Ji=a~0w6!s zPDH|tuk4hMkSC;moQ4&HK>)0l(QH7pw23FBS1T&UM}To+$jbsXCk*p_jtYmGVm;KW zV6jxhtk-H#=mm;vYMaEEmbFJ7J`tbaaFiCx`{k=WYCHUx8?1a)}~u3x|e(DstgJ&YTUu>N)*)w905v zsWE%}e=J;E=gmL69nt8CO6_+`PGn-34RcK)&Px8VeRCbtBu=L$G2_`M6-xd#x@Olg z*}qqb{#4tUv|u25)N9cPX=DVhS#iuSyH83tY(5zK%YHq3CKl>g)*wE6MP_W`Y@~P} zTCsIVS}Kg9x8&F8D)^V@(*+|y3S>|W73%pR+(pDg9K{+^^H(#J>Y5o(S*EzblxMu( zk(45%@rKUdIbc z=N_kDEx3K(ui5qb&h|!_^HToQIvSLR9%3mz;@Gh5v~4KD_3`OQ+C}EkyDP)C$wK~WM?)1OIb)9(i!FRZ?Z%I#;i)}{ZphO4w6B*^Bx<4!&HA`&o$sj^?e_(p3{9^{fGBWM^>)!330sh zZ|o_Qf72ihT^_eo!ENAo#uJsV0#jbp_Jy!H@+f&yG`;S3o@~05G2okG9Q0OqpKH|n z9$I5vS!eQXPPFu``~#R*YBSL=)iKkz*l1O?k%Lzw4_?aDlm^ptM%A-n{qJzc9- z%EX)$`TjotMRI!PgR4qqY}79b(flEuA8aA9dmX%n-xsdN&<5BjUpA7njxv$uV6y)om-EH4i?{Ut7uX!_4CA#4rPcqRr3KW@lh8 zTW;a)>^*3oRY!FLUT3YZeu8^ipjcK@l;Gfyx_+28vjm~M4Y+MDnO(nnY4{|juPj=! z-yR&0uJQ!`$#R+dZ9syOMjNeDU6%IWz0e=P_mD@6Hv&%J|Mo(a+^|OEgu>CV4K!5%?=91G1Q%M-ov0q~cx1&4 zZY^{sy_`j;gyIS{+dlHlx8+sMoRc&8LZFyLT#wMTsWat#!2c;(V7<`cNG&G;GxaNV z!}%Asr{_!A#PnnyS5DoZOKa`FugS}|oI}nlZ(RBwQcD(l(%z5Z7jncPS5lbo%@k~C zEuqZh%+7{0(vfAO-}=}}aTncW_KR30$SplM-*B(wFT|tBmTvsk#L}c{Z@@0URN9wv z<*Y}`ow5ZV@E-IUHo?uW{PNN}>bJ)BnKTWnXOB96K}u9Xhx_~v+XGQeBS{ST9wHtn zgZu4(eNT<1?PG*!cTeSt3N7n6i;W;=7rjZj!+e)IKRi7mGi@Pj84*LSlWyP2t24JX zf^C);0~MJYWov{yB9klFSpNLWO3(`fUXS|+kK^u@gZS*P4-8KZ?r#3W)c^cm-75+z zL-k=wcQ>zB|1Q-N0D1ePr6<8b8~+mFsPW2m&RV5*db@U!P<(j~W~{itM@3=Z^#%!| zD<~R|#J2e#pW-BF3PJJ%J%$M z`JhHi>Db0%6)77cC90&8HWs~scFMK%R4UP7%5E~2aR`d3C@+qusEcnd%g{F<(wO)D zf&GF&By7)>I$)NK+OvabiBqJ9pW~sra=*&^RFk)oP5LMxtp^e~#}3Ax2f*uCk4?jg z1V@-*99opij6;g)Z1#$ZOLlq4cCDCmp#{$kwDZO1+gZg8W*cXs(L^|?4hjd{(s@uf z|6(}3lsm9=6nJ*8y=ZrL_w`O7?5_B8URd+2((kZ0r{8Qm%NcWn(9(Swd)HxCrx*a1 zY%@23^=WNK&=4E0Mj`|dUQF}^hDmu)6zT1c9959n5tf%kRfe@pq4SiR$<8uu|I^>?icJfWES`Pi01 zg%`(>g{!VBN8dsyRLRa!wVj1Qcd!U)!n(da8n*K$sENCRFRv(%zgghq3iCKET>X+c zFZ}-0OiQ>hH2;xNL}juX9>tP}@`gu*qB5}#c!?3=LPQRoW7A_47#TC;S0UV}iJJj+ zUb5%^^@K|l`HO$pH9w_ve!2je=V-SpRn7-QcZL8=757P;Qq9czgjc!fQ!0&yX-A}? zR$4(NeGL9%WE~HOBWy8Q!}A;4NvoH@-QDKzu>OU+^FJ>-Ul2)7|9Snn?)9rtun7Pl zWTtU1hA1r`A5F&zpNNP>Qv-HK7%?=4XLARCMLf@?RLI09!0k{xE;AG~wmLl_UZi^nf&7aySnvM_3hXtB-KXJv3sMQTrT^zXHikRwNe-TyBoYa4Om}%~N zIiP11zhqMPwO%?)mU;7cMnmA^EP|)WnAreU-QwS`=4TM3RIXz|sqx|2NbitY3w!)gzEJnSK)rqRYss_`qjw#_uH^75iKXlStjMo+g;r8zRR0Qgw!q+EzKLq~Lc#uD(7(p2Krl%e#*J%8QCGyWiqGmQC@;Z-TjjYE40p>oL&F9?H zeBGKV4Q3C->P|L9%X14m@Js9X9|VR!#Ts9DA4>cd;h*74(O0K=A_K)rBP$C1xYf~s z5K|nLU1RjyUwj3?z!DKF67S@Q;)Se4@=_Wi(p7`SQevQS&=fFAkQJg>3YypVQrCC( zCs88bQOT*O*;f%FX+3jhr8Xt2&i~*wjh{s-9gC=TXv$2h$3CIvLQAS5J@=sB*4aV? z)hcBDz2C#MJEYc!f4*hP=%+Np;EeN6tJnO6$m;4iDjMUc`ncMxqO1i%x0zWO>~pGp zY4#3rjGu${eiXGt*QZS5&lf4t($c+=MG6>ibX4+LoGxU2u5yigKwg}%&m4CvsF^gz zz>ioT>p(yrUD!U%)Mo_(XLEkJA#03#kT4nqy9i8J) zhPH%zSb$ToqPH!Z{qy3sZSFMOJQy`vT#JcE`uNuaRho`ucfQY`QalTd@>XfQvh z+j?NJi9PS3Av-0Z;}eFW;(GOu*^gDNl;O;D66@F80wdBq;W0~cE*{iP>KAE}e%V=# zeCF#W8B1%e>Fs6p2|`X%JU*Z4xvf%YATE zh$tKrfvSPdv-W_g`0MAL>|| z?E{y#N6|TwGo^O$)S^7Y9K4OQNqgkm^%niO34SFKn;>dZ{(geaDUtpK~cxTbL+u0GcbJB=Nx41VA761Dr{$hzFzOGEoA(#)C-lVNu4z zb9$@uFp)#cBJC%ixLiKkgC2&Td%$+SfYfBwLE0&pA{APmNK6crQsz}rbRM1gRaxc; zOBqjfy%tXOqk2_tF1H>F<&`o+X3BcpIdU6W!pIVDNxHU+i_;h(`B?QjoI*a#17LJw zEMQ>~lQedVT}8w>DWTkUS=EeKH;sX;V=Co-+j z-7is=H!SMK7-Sl_XF4P0yb=QgiZ#V6c4shc5IH^@GcC!A(zB;$H*N zWZmO9L8+2|4J1DrN#*Q086Hdila8|?q+bY#F%lKQ%h+1^@hx++GzPIxpdzKI(`a7z zvnPbSk66T)dvQz%*uy%?-X0e6inJTd*in#*7B;dPkzWHSk!OJ@;s-E27mgSr;q6$J zD&j5;q&B>8s)0@Hb_&~maj#8-ypS8UUakeU+}`e-X{ny-6-pi|vvFgevU$s;y!Yro zJ^h?O>ojlg`|bSTy;xEULY63o>oHY@y`!QQ+ z#UuQNIsLNq#KSz$lRtyk-1* zvZNq8DZKz89~Cx$D6gLrDl@C71fE$N9E{giP8^Jz3E~}BN#+#=;6XD5)L9AS83f_> z7rdN_M5GBlbMz`6=A1PEK@eNV^olAqDfMkLz6o>ov;=%mJ-KB<0*&9aKoj-C8_Lwx zmOiulIv}q!$prFI0}c zb{v_K&@5q6Q(5J59wQ#ZaK>HiVx{eViJ293jTlGRy()}2r?igLE#_Pbz~+G-ONAn? zxzKtv%*#cLQ3C)lhC-_K>K%$L2(5XsL8L5{V#Y4_+BD~k=qL+^ctPF>D*#vzQyp_F2wkW8v5+g0q6=7=cx(-i;H`@slpF%{OlvjUql zHaEb=Xr|tG$o=sQwmZ%T&Wqwl_~#j}56`=1UB4kJ7A~XBuXT^I2chnYU@;0!M+W z*@?gedZ-ZAb4`Zva}{b<@`>WARAu1~5mHMS>Rxb6$sm^MojF-_SV zD{=Q9lkm8%u5aZE^;`V9{o%0PpDdy&<>(-%KB{Aa?1|x-o|+x@MPm@SSY(uWg90=q zh_*P(_<4vEo2kdvjI!JR0@FVcKLZ`-ze6YD4qij?E!PMhDt2JIT< z;o_B5qkeC(Rmi)>r`Z#kb6m>i)R(C88&#VMNb*V5U3DGDrF`qtDVWA+d)6MyO+o1~ z_q~yp!?|Vo*tCkMk!Do_7~6F?bYpi9^$rw74hw6 zX1Pdm3YuWI%Ich+K;NaT$ws!1XF~@n62r`zLtMUzl`!sOiC4%Wmd5yv}WbWFoUFW{Mtlh`p5J?OeiavfF^dzTzOGTi5xujI@I-j z!ZtyAev_>V>?g4x)@+y$=Qf#HhJLb68hOWFXeYb*#|Qzs2aE=7_L!WK-b#wOv^(A* z#6t>iN84uDH+LGiES|3FUs zg4iHnxh9Y~v=+Ty6m>|AMWU}Js;lgnbTCT6*3h~m`&aG`qddba8Nvr> zujqg{g35`G+uz_617@YMS0;Hsnyo+a&CJ=ffv^FrN1^IpJYNM6dTV=N2EPLF?g9vM z4^_5>#;IVF?xT2#FK@T`5=o)sSnK`N@j`n5F~;Q$-rNBvPC)zNC+*Iv235jN6rdik zXzBKB5(@st0Sd-^#Li_NbN0!X%YBG>sWtk%T90Pn!I2Udo_-NOL6?t@s}?2R&Fd7CFtXrDOn&3a_*9myyyIKI|g2?@=MQ!KF+>=-Nm zyHr4G#qa`2<~-q{XvV9NWyn2>&n$U^m0#O6zpTqU<6-3~%pU7ts7Qh>Il~-jUNg@w z3Lzj;zLTodPa>NcQqm{#oacafZ7mnK4ZPhw9K|$_hrKTr7v-t5K6#71xwf@QvJvH-H$k-bB_wSVBl#+8v(wZuOUCAjLu3H_38U zCA$eT!NQ6|f)I36PkBpSMcww!$4MF!KvR>f$JE?H=x)-U8wcx33Yp>8OzS>rQLgO( ztMt0V9_GqutZ{)l*?Y87)R=tU(HXqRBelDCErM&m%*{ZjpB4{7pZpr`C4r-&aQN!rv3zXcKlzelcZ}U2-%t@@rh)TVkkG zM%7tL%6TX2d|<+$2!xth2~e%g8iS&H%P#Sd*)8B^3Hpp!1M|X{jiezcY4quI`n=RP zwFSb;z(jC-!CaHf`+;Srb5V24v&wQCH9HG}koftA&6tF3>9`xxkG?cDMN0MQNl#h@ zp5-{T`~KwYwWrX@daDe!(!4 zZuq*b0`?-3Acm|*Osx@7j>{w=0g22N_qcu@6Fa*RJ{eU4%ftecLU+VX#lA}u?|k|$ zO_piEN{z2#zU9omfXzkL#P2D zDB!-3)L5$1C@8dx*I5dOX8*i8p<Rw_I?|4WOXUFq3K1CTA2P`>MnO zW5a?}2s)Q|PUM?v#Pr+IdJQvD%Eyup@R@U6on$KD*OQ=*_TJYyyPB4O$H-Hf6y-U| z(-Y(+O{jC2eGOz%*k3?q%Wf|!4h7~N=vMVEZznmjs z%$nMQhGzQDW=?+27Q;e)#^#bTUQ`IM=($_aiYt0_CW%8z}Vvl7_DAbKUJ2g@Bkb+9O*+K(mIXZTs@4+tr76cGq`)CO&fKlV1<-^+!M7{raaudxRQgr0o7}8rH4P$f}Y4#>3Na7!~Wc zyRH4)cuPY^1UNFGk76vba5qP05@nOAW?DE>v_?y*eAlg0&Cot>5uaMFT{Ll$-(t^u zInvibkTd9Q1G$RqEb-C>4lytAD$r5NMJ8}?^UQ-()!Ci-Dc(Re#(>I9Yp-Lf#z%KQ zO4DnT=Hb<7Z1gvpox~Nn57q@Ge~4nXkJdasjqgxkoBqw2ABp^UEt*w%Stt_hKTps3 zR39r-%bfeMug@A>se9sjtYeoEzEkQ1R$^_o&r`qw*)A&n^@RIcbKJeeM=&BtEXg?- z$TCMASFY69Dh^LT*|XkzhS_HeFdMfs2a4`ncJVRdh*>pyM9}u$@ znjcqkL{CNg|5)8u=$q5;?xZk-AKhL3e*G;RV}vM!|NVL8;7asEL=?-2>>EN^5Nf0oNJ+?)xLZrlp=Znu3hbZbZ~pNuS;KDDXzO1 z^`W6{LBZPJ>(^Jd@~@>lv5pIqml;VuKm79j{dFEp=q+YDHD$RTfHv8OuC5l(-#z<4 zfAt`2ZMrNnuqyvI@3T6JDKroJunAogzi?*rs0|58S zeN3QcyKmY5r$z3c?BMGP06Qt0S_Jl~X@8>~EuZ<=F{qHVl{pSneW4OL|M6jl66B%( zAhr_m3WY>I9?qKuiVb{S6l?j36?8bQCbMMXW1l-a1HT)t!GRog4mU4(f&=l4L+Z6e zW*SW!c8TtQqPjz9W>X_NGR`iaH!~$J0U^86^R)8$SaTysb3kWB$f!ks{o-0-kOr~U z6~6N~OpQ&ywiS(Io`ITm+29IYlN|lk4UZX@ki;3mvuQ$y<1YOt8~viWg=VUVQOko3 zwnTo#M-GW!b+$t8ng16H#W9~HFP3ILP9U4E+KT0$&AV%V%P#UAcs#fniX{c zSA=ov>ni{?lhXJW>S_XHX2q7+&8A0wC!OM577{xQe$SjRp~au5Bw^Mcs#pG;USBbN z^xlELK1<9TPQ+=0x&X*vae7NLTdBw|5c4s~>xN@e24E|58tK(u1Ut#h8$ARLO)bjMbo@z5IboDph*ISU;Sr&MXGspn0xX?giFyLf5CY~IFd zgq3bMzR(^hbM3!(ZL=xnfLRHg6ho4}&-b(RiyGI~TRNk{OMm|t=~$ai0lPP^@Drn=Dn}nSS~U7Wn~C$8!~Jt};67sAqCg#QB81-X6?;g16{g4ckhiYCMw3Zl&WY zQkLqZ=O(dP%uG)yBGviqu}2+-k9<_WQ>FY{QQD#O=GG_PqLZoZvA_$9L zlo^U#%@a{iR0t8P3hMtuZSVAm z+-a~_ns2v|Ou46BsI+QjjCN`y8R8VZH2R36b|1wu)dg2~i zM>bEgpCnN#mC4<@*YQnaTAeL((~qiHR~zP!jK9=N-LgdK6vqH>U=Cs@A9-~9S(b7pPoNC@ah>&X@ zx>^h+Y!|5pS1+H~HyULshGOlz1L=?#Quo4w!mEvMZg?##;5{N*0hHjp&9kp)$IbEB z4}H_w`z;gM9ba8Pc~zjf4+qX4g~dwR`y>QvI%_XbGKt&sx$rnRxv0Hq{C!SL8f@mV zIP!`|^Juy-@oy|$1bmNoo;lU~-_W(RO3BW9X_R}UJ^Z(av5C|;SjD-<87Wdbw&zh5 z?mni1MG~VO@E9jv=hIVJ$}dwG4n)Kw_*D=HE#e)VY~DU7h#Rr%ogAfl&Pti7iYUX$ z_HuX}W6DLYX< zw5jsa#)RFM!3aq7S@i_vQ7}wbnF&^JZCVLh-t!cI%pN1miJ>2VYshgQe|#g^ujXBN4~4I8ml z<85=?grB0pm|4frGzbx`G5U4wPdFnEA@F1S;Vhx_41w=7{wAT28Q2LU0X7D*6Mg%j z>ygK}^6-W#+-y|`P|f|xe1?VttkD}wXy@~Sqi1t`Q~xCvCP4A*J@Ib#_QUC*CALHi zL#gx|mn%q_%M%2;FQI?B7hY&0sB7_L{M+jy&((k7$^FmmZBNiaA#qOLT(La2I@F-B#fxt&?$rCFL&b-0HKT0eddb1W>NpKmvdw59P(ooa$EB41yjM4ptv}^+;ys<3o4XF9|)DAP>QADelT%A znNZL)7d8O{)NqqxfPrnyi?HFfCY-LKBOCx6p$KIJ34c=NC&M-IhifqFi+Jh*oVh%- zYG}b3sW(7ejFKtEwzeOQ0Zwo0rPT|O5f#eEWlb|OU>`kyzC=y}H3k#L-O5&D04H%& z_Edz*{Dy$0qC9&fpqcG4vVM#*vo9$G6uhjEtyk9(s*_EeHjT3F%03W%qZe&FPE}xA zY?rE3w%25qS1Ba+w4(+Av%*RrIF4QBRcFX5>sx;^PSARA2yZGU3gF7Cs~>b(o-gh= zOR1yim%wgPe1G`XDzhDu4@wjg5ACRkGL-SE>iIVR;obkwTz79A{vQ(m_ugi+FXJ@; zUd1Qu*zN;TrEM>TqmC1z?ey?E}<#;p%w1+Bw24$$@D99@ygit$!zL=!!eJ~iuy3Pd3 z){)=H5r~fs8qA2NHFhw@abEUsy!5<6Kwv*)+=eb$t~#4y(+fdH`6+o~-Y{EEkIZf#*x zzniK_(w=y-^eW#6Ym+T;IhWC*98G0~y0cNBW~sJHpkCwJvwLCdck+!swln5DuPIBa zqLfz4Jh(2O91vOf)?+mU`+j=4ZO%8X{!s>w0WdU)5D@aN$>4wSj65l+FBcDDLbO<6L6TP2CK!GEjj7HTjAfH&#f%?ctqC4H)H>v zZrm>+q37Cv0^#?o^q&C$ba@3z126vytjLYr2UEGCsyP~$_W3O*9`*!<&))<14}H*0 zOG~0JS@q-mmbZjWw&GVRvkk0Ka{h7wX9ykFcrBd4Ou`Prjn|n?KuPkLl72!JEvW&$ z6zMNl>+T1hf}SBW_+mGz)h{$4f|zSn`L#*YBJC2NO)fj9a-W72^e*jYX-hxHx$(*V zPVREHUXeS!Ct53f*l!V8UIV~1g=r?){pyW2E(BB^q$R#Wme8;vehFh_sG5*4!P0K0 zWb|1bNikv@+YL*E&Y-bZAXOktQ2W~yd3JQEicQeAshT0lnXK@9f$U2P-O-aqk)6lP z^JC&57y72D+Scpz=!v;Fq@?jB)|9yDm_ME?Nv5Olsqo~Uq}c1PiqA$}%BskSc1FEy zCD-*2tH|j5-V<37l@D7BEm{qqRIR$9T^+o1i$J+`nT$n5c;^abU43bNX7`1*XTR%Q z-fPkGNUx2mGUpXv+<~@44su_7C#p zVduwQYwWe=nq$r}3{PVG0-)_^{+s~YS!Pp19e6>Ta=#E%9gl`IIn%2}BLC4xlS%)e zn9a`Q^7~CO_5D7YMMq7e3Afuf*6r}iZ8J&;k^%KEJ;IcN)l5~A;-3=b*rkkpG?~C3 zE-z?B9B7faQMuiHsp8X^>6=Iq5r)v=Un_C+;GRQ z*pp-~o=l_(?Q@3aw<=;<)hygN#1xX7{C$foRw^hT1QR)g6_{6gL6Q#VfI_D!*2!vn>ISR_K)xeU4Qxi6Rb zTq5KHq(W${O2U#&5PNDC6@%$bwDuATcmv#W{06@)Ypi}q(gzo&;!)a&^N13Am zYGbr-*v(V_)oG&$H;~iUR<4$U-HdmE005^zvB77jEUW`6_Y>@T)X(YEk4x4GT?&UO zWh(iU@EbPs& zTYVwop`yJ3^IJKC2h8sk^qwo0JN-V_9)yqfQ~uR<+b2PV35WJId(0(8QQVy&dlwa8 zLp@y|qAb0=ld>LJHcn4Lo`kiff_3II*4FKzU{`*x&09(Xk-Fnedowd79 z92U{-jh@H;3wHkRZ}IrIGADLz)DZZBYIO?c8%DsAg9&g{qj@G-IIZuD$@P!2jRAfm zwiPEac8W|R6B*Nil|t)MD`6pymX&?r-AEFEHP2$U=X^nrnig4_Dy9sFGf2Wz(v`>u zDVU)=!3FkVj|qieSkJiUihn?}$5K~8shZ8bP+FH&-Dd$OTkbWlXA(Ks+bPf30KLvc z*3RsVPGoi-P7wR>XS|q)>$~Wf?www#5xIVS3e9xLflB%O7v1`MnyB*=+V-(J&?u4{v>*T`)j4Ck+)7~8;(lG04YZv(q_3W=^Vr<7_ z=`Gv*bTRZ9F{AUVE}<2Y^G%ntpa=YBH;47SUzmYUUZoh#eqqJVG2yuS^k9EHKo-43 zTZY&n0HRzA5ruBaWVmz$_(XtkR6)@m4maL|Hr@t$<)0s}5F+0p#mkY0u(vrWs3ofz9We%Iq`&p)2ms&lgsHYeO2jll>Gq5 zR&dU4v^x4e8sA}*?QMG+be}=Staw0D&qL3gmpjAurJpKYrP;m;QjzowrrU55FTdT! zq2L)?ac^p%b;#x%w_*Uc*igOph%_3`gx)>1iL*4?;-Ib{y->(M&Rp3EV_lnC*Y(Va z!oDT|9&%*(PQEu21v4_@wSut}oU%;lk~VH63!en5@`|ssMx5=f&QuHy;e^A~X=EP~ zM{zqbCWuXF_etuRO~d`bAWt6`gCf&?YupdxNDvDfJ)R2XCXp}6r6DDbZf~h}QDz+3 z$U<)s9WfaJkO)s@LA@LLqJPmKSU?iWPQffjMTm!@T&5?+H*}}z$Ju-HgtZOwjWqWM z!%QVd9OZpV#gJkA1w|i?m`n?MKKVy-^c(^jLsSBhetUziL;B4>{D)U^D`cMLKOOsE z+8^RsNY7-UL3W2I$>L?H(OWs4x-v%vVwa`;L>NJqVh10cFb7>TMU=i}yIqZ$@Q5J2 z{N-=@o0qP$-oC+7yZ{`-84UswaXd8fPzjSS0m!J4mfvuK+gOuGHU&lEbl_KDd_9^f zC%Wz}S`%VM$VNg7Xg_J=oLh=0OKvfbSfm6U)BwfK*oj$2ELk=kY8_XkqP0^Z}?FUzk*@`>piG z@op%K5EDM zZKU6&I;i*+o+)=uf#M^RVZu;yt={RG90~>kaU?>N={3rCBMlWTEIk(GtAh zmd8sP*RVTUZ9Giv3J$v?PtCJOqG+C)#OwO9MvIW+eRin;s7_x^DI|0*a-uB4$zApM zguHxA#DcJMcCqd2JKExo`}NHvJNs;Fs~VWt8p%ebC)I+ce|9eH!~Z6Igs1q48!u2O zSaj6#88QmnbO8w$0MZq?e(c2fR{hRV&%*Uuh%5-!7=6X!S#I-JU&DXiL(V@I{eSgJ zScy^HFG{yWq$COe0E%?i`8fT6V(4iY=jeMlnPA=O&HgpJODH#6LT!1l3dM_!Qw>`} z-qmA1PvS0e9j4ix$nIGkaMcQ12q(=#>-iHim~7%}MX(Jk+nvPe;XpC!K%=LSmvB6& zt#;85pGb}SEtXG052`k&wN<@-#B#i{ysj-8^rU&iYWbv3(z+@A*F}o^$cR~U0@s^2 zJ#p?*0BH+PLUF{WJ?M8hDqTL59T?8>T@jD^7p)@<$A>+frwbo#NzT;Eji>{xb+)R3 z)xWHviH7xuW8<@Jx58rwP{ueZy+wdo4o(wd(xfOr@hDAN(Hz1VB0m^!EOKrUnnv+7 zQ?i8*uce;RcJ86_JCFo@R0U`0k4rG;_b_NKZ*Oymp>|&9=5(-k1raPGH8Tzt9;TGT|0# zR}17w^>a<8R2?ad5w}culs?T;{_K3SY292U`$*$903HJ@R$*&Dy`-_b&c98FQ3D(H z)Gf20LpIeZiL(`o0?)tAes||jQI=UF{qcPM?BV-QGg*J0pT6R|aUI_HP`fZZnoxLm z3M-j$_G<3t$dC2_z`iM)%RMUl>d)OOU-e7vJLzixyqp|E0FCzQqDoO;c1}(--m8M| zg%qHAab19L za&mR*9Kowlv96m*IFayeFn!!UbKU-h=BIpTq|$PxCDk{}m8PX1Ezfaual&a8)d#jG z*mUnbxrQg|JeWurc(ig}pMSBvb?v=}m93HBuCAeXM?{nx_K9&M%j4#xE$s5ERlz}Fxg@9 zBAPz#8Bz#8CDHf9QVMMLnS=k^2R49P8 zyfAXY0YWu&vvN)UQiOS8e9E}Gm*PtH#mwmGDO8CWmi?9N>I7YEAk=+X4G(Oq(mX3w zKNL?8!-bj`!hc2B$6<}1Vy^kKqgQG8o-_2}w{)$DZw9QKKB}UbwEkqTOOIz=?Pdp_ z9KRBUgj~SK%ve%WrMzFiUo7_CYeldA(UP&x)Za2vWs@`C-=6)@&Rmu@# zWP5-5vizcAJQ3}{q2>?;7#59VrMa=m6Zr#UnL2MjHHC5$J(C~NUuK36MLc({wXVYY13-TdOUO^!2rZ=wAZv%tCcuy%Ra7(z3gXBUQE*^XdOMxODf|ZUQICv2ZL$!XLx(F8 zYi$2P3xXZj!~f*0*59|Ze)L%NQgusPGy`HE`%~KLx%@q6!r4U-CokQBp*;K@trUxe z)zQ<~#e42%$WhX~{@Rwd=wJWZxxQl+u#j`N>U(m!NF-K$kJ%M#>!6grnTO)MRo`pa zrPHjZ6Kk)}Fs%a!23c_Vq6l;N7brOAql{cwc9LGrC+Tbq=T+a!bao zjJpz)2Ca|NC4Qtr9?1S(+v!iESAELnSXob`CljgTR{&!n5He)&O_tQG8Fmp}xk)zY z`5b7QhC?=~GQL%e;hSQL!o}$W*|{2JEZzaE4y$ukU;yI689Ir1yuviQXx2L%zy6kw zNMu+qsKhvO3W=J>B!~;y**WbDMEnqk-WQH^IUXx`{Uw~@N2!mW`)^90D)aT3Wy@$Y znmbOqd<)Upp9q9>Zdx`0Eltg;CJ;%Fw@ZVA8y6qEk4&Cr?wY*E4vZd`@K~!V;Dzz(xR%}m zg=+YxXt(L!M6wO?IPADqg+mozr->-Z!F1)v89z-u2xmUjoQfh|_x@Og z^GbU~EX8+oPE9#dJfGN0WO)&W4%fmdEMt5|+qRmd0AVUJTEO6GT6)n5`_@>X+&$mR zfs3Bc?i@Wj~W5kCr%^|qIECZdq-U+iB^rwc=hVZ4(cgppf=#KZA$uSYF zm*msXX|9VLq@rVwHe$c8-y&fh^^*ZxlqsqYGovQ_hBcUH6vnoA)-5~!SBe)A#RB-LPD zBKC7H1h*}%vAt~;27@lIi31i$I1IS@@Qr`}E#5c%;shW4{$p<-fB`7!JR!=SEj@G6 zc|2D6pg!ll?{*XCFsUGgVBeT&OW(X;CntMilI)SgQ(~SK&usNk-TErdv7`KsMYZ6` z%A9NtS1p-QL7J=OzB|3wZ=OaMRc8TW=jW)ZY(9JMypE?Srj=D)(gf~-q{1_Oqn#yf z`xxPr5E`G!#XQXT`bSUL{LAXRHaH60D9A*Vl70Ge$=R3GRJ5~3{jf?nPsA4M^A3rs zI}yVL$iOUR;;*C#mHC{cjtq-BY57z1K_Xz$d}0DuQv)f=@T+x~l_<%o3fO~Zj&-ii zJK+Ki8TONT#zQqmO+0bu`QWtiv0mBEmcwn<&q0Y}r98>fkG-DZzipvCwh(<|=NH>m z+?w(6JXCkoJxs>>770_RixDgm3=jwZoxYj&{(s6;ejZ+aEwT1aec7HeeKG|_OA7#C zn?FP^cx4O~ruhs=@&Ndfg_)}GPPAz>adx?T77kwAidgsFvWOyXR+ZEiY3n4=II_30 z1q;Df=2m)4>GmmelEc)Z6itjvXG+$8jUM4PQUs(g%dDgpzY?U64R25=HFmd5vBGiV zDWU6`;U(17R2APRe%V@?MwMN<8$C3j%BfoTs7i@k#qe)u!eFEyo_;`ABB zU(*jpGj2<7l$JRZ5HrtJq3RtUt={fSiWcI)-+qqM%_!SI6sOKf3 zCu~?6Q_~a8^+#wZzI%@4cgcrndZi7ukQjxkSxy7X$mlv&#HNBROV%7|r}CV#vwS3u zL-w6b*yd*=vO{O?8nL`pOD;VHPr(`fA8F-2g-mg+AoWw($Mxe0Hp`~;)$9;pe z*}v}=E7-}U_@&CGG~L{t4g)HULE?l(64a>U(yNz5qZwsBN~~IxL;*4)r1TlF$(f*B zHdJ6gsZAT}4G1 zlgYtzwK8%)Y&=ssntj$JVXUdNWt}m6Om=XH``N6WK+Y`nue5nT-coFhC*RRn?pLn| zOj?@XP=Wx3FsO=8DUl6|7%EFyux$+8Buf$DqHu%`Nb9z&vn?qgo>_QFUyO?Mk-mJB zI#rRo9)eeRXZSkQtco638#9NFb zCDd0)D;Y$x5?50{x)#5!J+GR|pkg*HBj-VyVg*~&`6#*d0{!n*1uW(w4L#xdx&L!2 z9(bjKZMZ|eMLDWtx9@|@LZO@5jy1k}pGFlnqobt%yt2AE&ENQH^IPoCLw+C=kf@Uq zr%LGg&82+b&98_(I>6KwgXf3bLG=b4w^Y00YIDJg}0@T+?xikv9yXNnxKu|iU+v~KRW z!wzGWRTDgX%~MjK--Dywh>&ip>*YB3_5+p+Ir8pOU4q%WdGIl?oBc1EAic@$^>__z z{DNh{YAlK1>g+|IpH7TJ5&HoCeV{$LqZDu{SwcHLM-3NAVoOKKuR{nRO#ml@NYZ_h z3{hdfI@-fmjKri1i7%p5b4(OMw{mPPRU{z>1FExn>?`I)w(?IUI|`t1?nxsPU1Fi;SIsG%WyweFr^f{$g~-O|ri32Z)7`&b`RkxuLa5N{ z+Je8_ti7_)I)FZ`mBvtL4pSI$c_=-&4D<{dPF)|pMZyYz0F9hFhU;ewvlHLJPCavB zvD&R#9U8@T5e@**@_loAj^i2|(`?LiK^CC<1m3ESp%?T7;(N6HhJS=OuJ78Z_7R}G zTQ)qs0l4l%;GG@%t8SI&0m?T&Pmcd4-44;sNizT!qRzpU?yCOL;b#zR$EV-ObQ~vs z55eBI4PUFXT^&*%hQ=UB#m^$?xuJ7b(LGDk@$_u*giPZPfp8B}I9!o*$=Q&&aKc$k ztg}L^&pF$clAR~V($8tr(Wd}L?NvY=A1=I3!o~r`y)x@AL;=VgH~=hFOs1gB7#4hp zEQgp1fCnzg0HKtXwRHmE)d}H3hGTMMoeGe3QUrE`s{A;Qm)=;}_BfJAWIbsgq$0tA zjshqM-zFfT09|vY912o4V;nA8^xVkNLg~+ z=aHM#a#AJHQ)%Z62lInT`MoQaPLMnTvMi{7{Nw>=#CfW$n2Om0?X4<4;da}EFH1`7HD>P=NKVHgvLE95M z9#fT`dXy@^XUt8Q`S{+a3EbdqlQp@~l~y;HDM6}Wi~ng>*~J`7II>=pwr5OM)4AvW zDe(^dkYK*3FD*NO$XH|jL?bKHhyG+)zwvHS@u_O~YPLn=m3fC_&et#kT7pAPJKJly z&p-CbGM`N_tvH1dB-wte4%`&Gx#=zVU*CYgoCIOT%eRd8mf#XzT$!^-)b5A*B^dwHxi2ou+iMtX{?Z#cPaCeTC{s) z_oY8vw?avS$u6H$zL{Hbk0^wU$(W48sZ}Yr^Hu&(A2Z*s|Gaj1@lHL4r)7*KT!4m^ z1};3&OLmQaL=ewS^h$daI-FX;-sdIG?qjxM{nUVfw$}(o%W;K?KWx`w&Fx_yq$GLZ zl8I2KhQ#a=g&D~i;IPT!ZsJqW@heG6uzi;5>=o?Z(j?Gdclg9x* zqRgu!OP}s73{%@PMr#{>+Y#|>9?h3FQ0=tDd4^K};*4{(xkK~YV(6;#9Vk+zJI|7Z z>@^p`vhA1X0T-(|JWo0F0G0HqDu$Al9jmk*)Ub`KUW^YLPPfBJbt5HZ)Wdg2&|-`= z&Hrt8OMr_oY&;^W*ZN;%%9c~CandEf`CmM8^FW8H<-LJGr%uIlGg_7NtLM*VSL1AR z%Q*;keHHXr8)EoyD5VYq!WnbXXx+twu#j9GNzXaUlg+(HGIu>8X?o!;k%EY5k9jG_RylnQ+GEoaxIKHNR|*{P3Vg?Z~hoc zxPt#^`vyFJ&zb2(ymj(Y_r@-++OeR+sl1C@CiHKa8Ghq__%;;wzy@2$F^Z&;&luj}OblG6{^5%40U+vJ&Dy@T%xxV%;=c zqcmAV_L5gra!mNSq!QfEtqPp>MBv)vo&xEtTGpA$Ya9}myf_5)AxP3BaGaDDgIKI4=B|OGUxQzZoiWE==@_!T3{CSaL(-gqUw8V1v&3u zr2|z9c?n*H?S4Ta#4BlM+(#Ljg-Q>aA4Ri{X+@zMmSO$qz5`e1@`6jM-ro*Nd#olZnpM*wLKjG0Pw~0>96Ry zPRWFmD;i7N$u-lr_ISx>LY$NBe!7RUhv8dQ@`~;zW_9Z~*ZMinHf=>2o0XY#x_Pp5 zjsor6&AXjk2Q{b%2m14?p1$Jt514I{k<&t`(hTe?1{ZB4xP`w^?|F=~{HwyE{Jiky8JLE4VR4f;s6Kgyi$X#F*{>_>_5pj$(LJq(D9^DU zkwflAb(Zghyq{r=1A~ifyR?C+&+1rtQic3jwcf(&1!~3SPderyz#4EG0arA zR+%A7wR828h$z@7oWf(&L}u7sUkTo4`)1(0iO9yW9dRoq9=Y4aI%Sr;P>vRx;P*kJ zK-@d9!;f#PUvs`Sx`*KIOB~f<$V-0v)pafnn}XE$+X8(GmDmxme({EaTYJkJR9Pm$ zTTG_xSXuS%Xtyy~K^$q(Fq6r*7ft9+i$DqdikEoi9eYC_a(3et$%@WOT+O zkZ$#=i2r-Pl4|%4xM3kxf!x^ocwYBm#FvnS(P7!wP4{-GQ{KIy186_k<}^ zb2?YYNKcB;zh9^Z-pQ(#Qdall4s)Td)}opHw2;vZ|C}ix?;tbbTNQWRVRzhfuw5LJ zk-=%bn&+zc_Cz`FU1=J6SWx=)V5Yp1tKg>z#{LkJlFw%A4>Q#M%y|XRxvZ^qFe_XK zoIr7n({d$v3$~U*y;ownaahGMdfMISeF3o)Q(}6kK0lbagh-wJjIHtwkINHH@64g% zq_gqQ3k)W2R~X|(G^SBFfNwg5j%q3?$edy}%Ds6ntT*fFA7Xb?Y3SIQm^H?(g0xc1 zx(`M&G?szTXd2Z^$%RcHX`57!Pi2(%`TnsNv!?nTUa?tYn6LS3-c`+%H@0*z5x@9g zhDBI8M0G#eaLL{OjT5h|In%QE-2E7#a&sN{*gJpGSBgQw!8G-8Y;7r+I!@0$HP}O< zNbwyinHe^aaTgwswbmQ1u3A?qmeo%+&3HBx-O9S2B#$=3F< zXf5^;`4_D8o0yPZ%in$hzhh?v(z*WnU$=id9LeWu_nUWJDdw$C_#F1BD&QVRsuRgiqQ|KYgHDsE`Z$JCyjO$?^M~fTdF9 z`e%i{a!M009MMa_j?3Nt@ROShHKKd}4D777gC68&;UZ(_B2wj)#f*{KVq$HhCU_}_ zI|TZ8HTuGT$Q}|?%gILYxT#r(@oMU)7U6kVGo~h*Xj(|Wb8Z4r{kY)V%aqR^=X_C( zLuTAi(eisnZq4tz@N=D^A)nX73q~GPD~lLGMheqp-3WukA>NkIX)XsF+>^}QX8Qa_@`p2%RmJpe7aUh6gaWwNov&@`PJRGoIz@}70;?W~ zpAj?rzYMx}IaPIYvyAnfDL|~EE(Wk1uB`K;|51@!$NG47r4%><*rC{!`8JC6)gXU< z`-#0SH9T_Lf`i0)UOXSqj)+N~XOM}6CWPseO-opV#uLTCgMh?*F}0Zlc|1%qj+)s6 z>q_g~6hh&77oWn^Q{pIU;j1=ldlpOQ%EW&D@9`^YbLB;GA@nwF63aC9b&%0I-ST9?0Dg<<{y-EZj)^qx<&u(N(%kJ38yd zxU#J6iVewDsHFPz!73430cFA?Nz_WX5GNuOIUZr5*h6-uCSbS`zS#@3OT+ z4qf)%EfTO6EVo6B2JmmJn?!%GQ_n>HN(tM~1wf&=ZV9MYZDX(w)yI#F_22!KFj)Ot zhb1ioD|uVd!Oq+)smtWxI&6zSTqgpL_Cqwgrke+yE)AEtKTsB&FBSm|N3lZ;Il-0G zKgzionO+5Meb8TPkp3bNpekrzQntV&VIKJ1xIIndm>?ySdfC!LzcHwK-VH^C3f$HhegRc1@vC?~1On%d|819zez`KFDr#xVR zkR0pe9g_FvHg4aU**!w#4o|<$YG&`@DbLq5`4jtaXyr%IIw=pQ5(VfqN%y_Zl7%_6 z6tPzYfF6Cki+n*Q-J-<}h*je$Y;%ep$i0wpyQz9p@$9Cf=GF1c%?&*k4zpfAPQjH3 z-nCS=%I?FR+R3m}1OhGhhTokEm78104TjIT=s31*&f@`_D1@|3%`C!-eYX6BeSlt4@ws0%iB%n3OjlRmO-_ zom2BYN#MF#4tkm5`G_=OOM-|G1}!^D_dY(a z{i`DX5&PtE`VKco_#rv>Gt9sEmJF=w`3m7s0=VxPNs)P%rT5g&TB8p5TT=wHG6Tr;up;tND;Sq^^-kR zmPyu1vk=zsX5Ejt@@}?9VCBo9<;-qRa&i;`Fp6Rg7@4Sw6|gqk`~?74MXW*B{+9tS0MQpgKl)5~PFjax1XNrycx-s9Y$nG!Pf!m@PB;m7l@+kw8QXiQd8T?dLuip`Pt>1+&< ze;!Ta)AgXQ7tgLeHeP0c3|l!>D~ob?gc5ll&r%r9wyv{udlh#x@M@`b=k5R>L2&3w z%OFFVv@eW#s@>v*hb^j0#BV5^Rrm*blM~4j4WlLS$uDuVY0n2D~f_iC5M(hdcP1rz}a z3BQI**KrkMM1i~%ShZP+lX?l*lYb@dK>vZw#I@QkZRx~c#<+-hvMwRxAO1+ZBF9NG zsyk#KQJVm{w+1Zwc${rVV{`=%X_Ca={-t8|QYWyC)N-{GPAM7Z$;1d0h-ez8XGa0k z-7DGcN+YT8lmzX1yEA=6EPcItUWhF-R|`F4jI%F^*jl{YXnf)PfTDQ*Phb2fOXNra zyzb?*kH~AI2v--5ty1p&%DM(K0s(`=!4^?|2qe{Az5g)s)2AADQpVMaK<@=h`|I(<(Su#n1`-ZpM|{3miYvY`#ZA*18viPQztK>PD(UIngO~t@VT% zjp%8mv7#{QB7G)!)u`_`+a;>;a;){{J;prbVFIZ-w_g>!*X_Zx?D*a{=3-iQd9wpy zz!qcXzGbG;H-s!~q%_4eFdCo=`&oztqNHq@T2>iKDwH;GU;9S~@Y}Hd{ghg*53Xn( zk&7Kd*Iv8GO~RFGKBeWKsMiM^0$1eZ zwUG2MJCxA?h+PvjO2w+WM2F*0h$q;J+$m_&_P#e?&Iq^(!H1)&mX3-61P8zBT?J6h zwE6>BM}X>+n_c-yq*RwN0E4D3|N(XQ*7eCE;0cvVNE4}xt4CI2uzR@KjJ#oWU5(kxXeL3 z|2qHvdh_OH_eSnHb|JiZe$x?pbNsd|hMY9|+502pa4PJLZQ+ZJWD!PK?VL7Al75=^NM9{V@#}P% z-{5Q%-&=xe59B9nC--b;b#xzHmR$v{4etX-uQ=j~!ekhPlMxaQ^(nU;HZsyS{#=gE zj33Ug>%D(4zQ~bRpg;OqHR@AcJ=r;#)dTM>zx`M_jD+EVz;THLkSX!DBzze_Q0Jqw z1DE<)IwW3b~L6>dx9wH9}Zec>@>QH?H^2quuz zyuMGS>HAhKx zRM$K{Eo;8Kh!O%-UWi)`Q!%1@;?XG(-j}8#tNKmM2hz($=Gfq#%L2QH)m1BXdJZL2 zne-cSE>gFld*e4`@8@dOH9f)zVr7dXku6%wuoZr7!FY+}yT`z(O?7FvbCr^e;p0}D zjbU}ehb1vMdE4X$T&dxkko1b1VqnpH>5po?+#Q6Z*pu-PKlg9ah8`qD42cmd{j(V2EpU8*9x-^?_)Wq8L!hw!1z3J3=HO4YXkEg7QfmDtNxddq zg8L%ahF{k5d)pqaJVjg*B6;sFJ#$uXjvkEuNw3YizPh>j@pJzD?c<-=y^Hb3aFe8- z-K-YRas6G9eB8s#nm#@;#Ep?KA?qP=cM2p75J=|s?a8bgh!kR$j3VnWEQIuOs*r}x zF994%yh0gp?X@xOEWY`l+PlaDkcAH^8t6G-+VM}{E2mTrSL$T#blOZts^}k{f+2b2 z#=oK)H7)ouyq3(kXltl4Xey=}b8-R%sS9c9cp8!PcIfH${!8(aa7ghm%5{cFE18L1 z=*(DegL2VZo=e6jDg1nATS8BlL!n%FMR$tP;q~lpmG;trcN}jn-B0NnBsV7Nk6z@C zNJqT&QI&Ih+CIHZ`mR&(Fbsz|#J}?rkWUFa`>pvWEWY2Y#| zPez2q7Q`?;EtdGKBsyG!aw@^DJpz> z|2TdrVn0{I8%?ne3-aSJ9kX|Gp$yUC>fxJXUZGi0N@P%Cd&*k1=QAYyQ|itUO~W0u zPfN$l6T2p=YRTsmZ;NNXsKndWcR20~h5ZoFGa6ic;(Egbo+py1AH?eMR}geO_y8Yf z(lI(Wn5j&?IlIH56J%zBt5cya^{~|$g3cRDh%DVGh?BZsO+;C;7@{I|*B$bIccH9U4GBIPJwO8Tlo~qO1u3O)rOPz5RW0ayDe2T3uI>?q z$FteZ-ZK^$NYPVdkqzd)oHpU$JK0m2cWx|CFTZZ2MP@Kw#0s1L6e=qo#PSFC?br-n zwv^Kyaa})FQA7CU=I;#hwpYgGxq1U=b@6j>RcH`fzAD55&7);PBcZk^({N8BayM@RW2_(8R93E91c{r|xElk9G)j{bvCrG96;Jo&GzPnm zD`i+2X^g3V(_l0u#dURov*3NFq(c7k14nFA{*F?jPQp;JCNR=88*UR_9W0S)BT_wUgTt#FH=$Tv8QrVX)ue;PT{PbOx2_w%Ew(v zPg0(OTg@qJo#LVK!YxJn!I%zv@;s`~LTLa@5w}ojD8NER3UJi{(CxNw61V%O$aE0(L2=_Iqs0;rȵ<*TD&V3R&*nls>ZKK*)z%Lq0TpUe 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 z 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%0A_W=+rB*YAG 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

    {n)mFPb#9pa?{W1He>i6vS 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�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
  • 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�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
    >G%>+Xw$+dZ(0rNvbb2<7VO1v81?@cW;@@Y*&` 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
    O)h~=% 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�<%nDIT|#Nut*pYFWiL1iOWuRjTB`VNp$X2^$}*} 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᝽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É*PX1D1{^~+xJ5bAqd{;84(x& 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�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%0A2(n-1;NNP}cM{8Vb+5)_9Uw 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�i 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

    3EYH-P5Eox>%U}VEbau( zLTCK5xjBbt^;KFB_^3<+dgKMkEn&8atN_ZyDaJ>%60l|s6%HCAC_Nu1abhfi_8HY& zzD=tH{pFF5({-gw5QbMKhcv@Y$iaw7n1(ZtiJZ%+30N_zsOXIvohz9VsыHMo% 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

    >MK`Faz_WIx@izSL3xt%$ju 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

  • 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 z

    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%0A|7T9!yp8Ub(m`N^*qwX$h- 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%0AWFcHx>(-&dGMVs4~ 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 z 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�e>pw(Pc*O2k65qg%)Z;p{ea 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 F{0oa%US|LR literal 0 HcmV?d00001 diff --git a/static/img/200809-transcription-assemblyai/assemblyai-dashboard.png b/static/img/200809-transcription-assemblyai/assemblyai-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..509b1af75835be13b4b7065c21f9af0a567857f9 GIT binary patch literal 197635 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 literal 0 HcmV?d00001 diff --git a/static/img/headers/python-assemblyai.jpg b/static/img/headers/python-assemblyai.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41945eec63274a33b7847878a41ce37ed558379a GIT binary patch literal 42144 zcmeFZc_39?+dsa|k;oK6M-d{)9O0xgB~!*Ihs<-P9ODT^88TDIAv5V@F4Hk9h0Js2 z%$#F9IKywdpXYvt_xld_^L*d$U%z{?k9GE5YwdMid#`KwT-QPxAx#6P@2G010%T+W zpbq{3q#59g3f#dK0JO9KVE_P505oLG00meh1AhRrvjEj^bpUuo#`U+lBbm@&+mM58 z!~yUVU<3~jGKt^ntYAGP+yS8cYu{w>?{NX|cs%M~{^~lwZJb>!z1%!_C9lWUqV| z+U=3e6)QIvF}USpG4U%`#Q+5;{IR8#lZ_YeBO5yhSH%mPwdf1H4%UhnjHR`%YCXPX zWAC8u=V7Dor)^;6=VT>keF3V(s{ogWyF7NW@v`KFyEwag%EJ{e{5H5eSU)~3c7gY| zCSFd87fiHtd2hLS*zihUk-BpA0@&Nb+E)JFZPmZ_1-~g?`0FHne0;9>NM3RCuoDxP zlamv>Dj_BzAqut-_4IZ1vV@Dedh-1~!fhK*D-VaqUJh=qyvHM2K63N+QoI1(`7cv) zdHlCw|5Mt3Z)k1xw|0-cJ)D2LxwVy;jkAr5jjNX@$S3h*a$FwE-}10IelP}ZZqAAq z{`o=urGb{4wS%qiZA&j3#S6y|PW0+E(W|lszdyL+nOj@QdwM@|w6XH~D=@K*8xfA zOLvBygY)b~0YRZl!cx*Qve)F~Z{1c=Ra4ivqi;|YTYJZsubqAU1A{}u zBco$8vvczczZRF4SFl^#JG*=PxP!xExzy8>CW&=&0NGDllB{Be~hq@e~Yre z5%zbw#(`U)Lvmcm!QbBs#qlQvCB<=}1SvT#RDUhhzZII}a^i1=1P=1s2w*qx_XODX zZ`b~Cg)|Ae6q=+lfS!U3e3>Yi04RXJJmAemFekd`8>DJRroB9Se=#ZYdM$VIBVYd1 zToqP8@6Y3Zi?5p{}R6j{^Zxc#IM0W`SmaHYv@mY{Y(5B{*zz- z62Ja!`)ij3griUFx^WZ?>{82^!WFbz7E{K=r&jywqau0Rewn&{Hb{NT-Xe8Ynf}B^SFbL!&a}vY6eLvX`Y@ZF4BGk`3HWAK zzJOg}k4Fd}Znl`yV}_quGA$Vu#9N*66k?S0pI?ML_v(`q^o;LX=@3BY;yjnIH<=72 zO*eE7EZ>oU#thVaN+Eu#6`?NNmk?&Gtb&l*Md0Xq1IBlhy!%LiU5PLo&4U5!xSGU@ zyNr3iNC4f&;|A)oWtqj^Ft!H<9{IzqF5OFi9HY1;6(|fxKh_tge#ZD9{g|dF9Grf6Z^`XE0EAJ;?CeQOR zyznF}P?x((xiGI1mDZf+d-mtJhmf4#=wkSHKbVd<>KmoA?5f#Z*1F@@?BXZ$N_(@> zoTmO)puh;rK=XaZ-ZXt*$H|C~aR|Q9!{HKU;A?>f|M2&@Pm)5d4~?3d zNWgd@wEjL)?dhDtIKyyhTNh%y3-!4w=FP5KuxW*F!p+){dAk?$-`!$5BDUT-HJkHc zwiAag|9ZwaCz1$N^h)_Nln<7=*g$P#*q_Yokt>F$gL)2Q zp?ALEUAu%TxgS^=L2>jAyZO^WetIwyT>cCsd^gFdg#C={!w*XCjop^qdbb%9urGz^k81(q|aAs$%>#9MRKI!L82(s^)Z`lwa7Yb5Bx#im8zR zDqqywC_kZh4ZKHJ|AqDN@A)B#^y$VQ@sc<`Ec@(}LbmYdUd3rs5-PVA&b!j?Wino@ ztW4dq386n@^_(&|0XO{PClw(v=oa_@jIc+cqmo+{1>!*}x`mu6XIngvI^`T%m^EIOjKM?<(Pp3 z1KB!~rh&U-wsvUP`?;V_xi_^^MnL^dyC2@tdv+WKxmzQuK>3FEjXb8!pLh*es7*Ce$v*X092 z8&ra6M*dmc_2^C^g$KgI6+`PH(!U0OW;iVQrO8_A^{ShQnGzhzw_bE)o{cWwkEY2m z+sZR?NxNvNA()`WPnMv}OP~5IUdwvaJ-RVoODbJg`_i+y)z$l-d6-^+6|HV+s*7x) zK7(oe+&&)=tr?I$yiQ)#o1%ht#)PX71<{evw%XMs@ zSh!2u8%Fy{xF>pRxyFRyRWe~XC&Ltt0d_{t1CzjE{oa(3h!#{4Q4|*_?Z$v`yqP&+ z!ksXgW%UKRk$P|s9ge>-qn2nZ+0rrX*LI+kQ8*bSxYt95)!D0p(ci8}?bGb?J}5ze zvQA`{v7Aom-P8XkhpxoqONN>}#b4KG{0@8eEC|VX7wl1ca;nl>OOK%~ZMFsAshS@U zxo1sCsdL93we5{*Ct12*to=fv9@#|sYM1a8(WHc!PE|TZKq@F&&PF><+SJ2`R3n_Z zZNxJ&Dn~)FqKKGAX3!Dd)-hSWUpaHN@~DxPahpxS!)Z6 z&@PO&$9?duq^2@^7Xb+U!(knlQ(zTKo?oDND!}{5D5&EnIU!epQ|WoZxXP(-w>uMf z=`_}8+XCa%q{xWgBmkoe!3pX_H2}D3y#X)(lW&}d9ux=1swwQCI*!uruPt1iC{&}N z($Q5x6fv%!I+BA6&JBltkmB*^rg`(@S=`fZ_f=T)6rRPkUCCHARx(_rijHDsTls;H(3h!6%TQfiG8NYU)r02W!A1%#NWcT+CgY->K`aR< zf$fKH7v~Y?@9xEP zLPOg;|2v{WdW{4)^-E14MP0_6{c6Q&4vf17_XOLKbPt?}AALX2Pj1(*Qomwt_Ne$GPTK0ottq|vxpP>wypG934c|$0+x3?Z zNkH?_=vshJz5-?R_JOvdVH2e>nfWqCzuAYqrU%czf5&L7M@j!&j5r72H&=*Cn!a4i z^s@VEB4*W4ioopSHXpaE;PYCy#fGEib$Ir(lw!xP0i(NKPx(Hsal{N|TBV=8oA5Pn z`0&I$f-Hyi*;5I7P%!AmYrMDq7UfDA?~pSa;;xqvQ*t}k>YX^by3$Uk{<_A4EteJN zSba`xW7ash`g6n;E&Y?&2K%@lim-E|AN?{EmsU#i{d?x=32#)d$(%{-?NGXGz+abKh4r!O zg=bWHje32#$7{P_K3T}v>piPqLa<3c9NALU!7^oH#DgB^{cBp5xdHKV8JNqkh@HZxf#+2MKR)&8FNdBXSE(Ph| z00av!kN{Kkv5**uLx3{kxq%Y@v4l7UN(g#HPaW(K$RBi)OuNQNxZXwrGU<}i6zE8R zmJpuFT%80+VNVm*>QyAz4D-CMJ33l-BR60%}?`OmW4|Wie?G>BBKTnsw*7A4v_I(vlMa~bs zC)egTAhWj@d$Hub1HE2!X&Xm#!5*9VYM0b@m%H_Zc*;VNUgON*^-Y(lVjslI$+zw@ zmai+Yl@sfgd*(0i2a&0(QwW6I;FPB2Pu(+9P;Z~s5J=S)5@c<5-+jLza%=&lr+eq= zsaQC2e-$9#eT zxY&C*5jzwx+Md5I?S`cQUk|?n2@+JJ#9M?s9CX01BKAlCaSU+_$3_Cg zk$a282^AGqh=f2ql?{-~$(J*Zx{|?^?VFvg|^qd-uix>hs{u0=*x)WUnR*?LjkTw$5elEqmjk zLQQ+Irwg-c?u$3gi)_CT73}LY(^I3{&CIy$wyg{8e2*f&lkqd&^+L@S6X_U1chDG{ z(uzDiwFF~u8{;yvQ`zbPTst7ofuLF9AQWSUeg~v0eAkAo4z+nTzHSe0w_WTCK<0qo&Hq=ow zGC=|!Hlw=soPLDpy=+bf4v|XiH5JG#cak57Z$I(H*3A_Eow!INQUY z-#Wxt$E&g&WUUnJ5@3C@Yh6bU_-lk*sTY-ErzY>Wn=7`_f08@*2DNoa8FFGp4)qa4 zFc`<#XHkuaGYw`pULVJyT-E)z7@dLuXCS z7{<#eBmH($g(z?eAVryoCNaDY2G#150mXRdHuftlK6xcYX|Wv_K@9ldl3V$9`px}2 zayL0F7PL!SMB!KY%;)8r)PPHWM41@235BsBizzBqP2c%1mC>Mt{uC9?ET><#|j z*);-*drkk17;H%b5)fM|V!+nsAuW=qNdmqgA4AUJ_>O6OAd544^=6ib!ptW|wJu`$ zoo?S{i;yBemROPLmHnPz{=jPeZpl4^IU=>l^0n*j^iS;G=rtK-ohY0#>O4=O!6Wl0b)l=_{Z1}FBxA3@XbI^ zJDLVISyC+|C6?bjV&HNrihb-ibU;WX0S@9MKte16jWL6g02Wwh(kJw#Tsi&1=zLB= z+w|E~r)=Y1WN+!W)vp4DRrQ?P1hyR-yaaMx0QyS>YfL<8M*?OY<)AjmF(pGsdE1R4;lY>EZ%fi8E4Y_GsP6&NCx1C*zy&fxA@xy=TO>GkK(aEX=V z2AA)6vvtL)Q8$EyU3hC!*cTrks9z%|NUJh-r&&*ht@Ql=tpjm~OpuQD@Ser+Dm$KK zl}Nih2TBx?_A0-H!S~^}>7ykN?kZCrrUHc|fbs|w5&`&|gq#3ND-;1KFQJXJXI5>M zn76A$_@K*%*HWe#M~9m+%Nbl1Ap$bJ;iDW783unk5M8o$8;xm#lp~*=|DhnlYQdrJ zJ3=-Yybja-0VbO_u4}4rQj`Fca|y7k#C~YS=2NI0gnD9?DDnCVuPAdE5bx*x0k(%C zd?0cYyOd7XHDJA4-L;3ly9|6OPU+y;hBY&;Z-Od;5=#QsIp;+6Z^u88H%V}57^US> z`|*Ru6THR%&ORD9H#Ze6%|oGD|4H8Xbu-(x2AMBKR$I{ZE~#o}&b&w8J1&3s(2yFA z%Xze+Ay_CV@a6^;tKQ!Zh-*+Av|>1_fef$pQJ(Gl$FT=@nHTgrL%6Wy=w9PJQ{3`Q zPZWefDzZ!X#&+6?4EImWTyD}t)1hjK(FxJ-Gz{Uwfvbl#;8d81!^qLY^q(x)!EOUp z-lui1cRMJ5(Cmq-==SZNkk;hbTz_>>`Lm9>FyZf3>LQdyi38^Z3fGI6sh1Y7Ol+vM zcTWwknn$Yu2+-EX80g?GQln=?wPBnA!j-QSC0H)^zt>}$sDiWMyH?K{{){f@%72(G z(!9X+m@jS@wVR0T2=RhJ;C_fxt8vBS6PMJeZar4LK8yuT5h`nNp8AeTJhh*&!%au3 zPAZ;?-Cr~~dK85y4j#O#+?~9zdUJ3?Dzfo*Rp0CM)5>4=q~rd^tAFI%zgmZo{!mO& zSF$ma5~YGcfH)s3yn|&-Rdn5d@)JB@|;FL&lYK_cyhVLkE=|1Zt~$echH2itZ#J`eU;} zGUKH?o~Cm3kC4_iXvKORrrri}98}vd@R5JyviO&neZ55xzr0YJh6w*jQK1#PEQ7u; zD~Ip$o?lD_9YHn%OUh#%pL;`F*u6^Jng{8C@CnvM*O%7K6E+6 zo9_@RI4|P6K+l#`5AJ3is1t_tXpOqti11IS<|5U<}SwlME%SY(WDMmawbl!pc=o|_71>TPpydMde zIfd~dke5LDh*JI2Q#7F@fVUP3I+4*{&t_kD@W>B&e)$MF?n@1wcjDgu{g$~zI~gz* zgKg>q@dZA0u!?uj9YahB)SQ)&H-e79A&1oAL<-233~{pKFHE_Fc+&;yPM#U?l4+3Y zhmoZ*nfQ${t@koryeH4Uu=vP5J(R60V3Aoe=M>m~2iQRi65I0vMs5vBRdoNz4(6sF;?@`hOlmhk& zRw;;Qikx9=)igu01og;5FfX01o2v9~aD2<1fIcj0O@5jY`nK}Ox~q2it}7hBx`Sk> zvz;|(Y3*Q%vs%267o8HV#2x44x4_9#jffvj#rg-$UMsc}QA zGy82k!iyS%qTDZeKRuu^?^7iKPj0(rB~A~&G2WLuvLJqeFhHHA!uoJ(ZM_{X#ben@ z!Kk7brOtqWqV>UP&z8dF^r%PZNX95At%3_icJ@jk20hD`J-Sk(_04QTb;`TLAYKx$ zz8YqvRr7`f4*x{g_Ke2t zSz~n8=B7siq-WIm3{JO~Y(4d0waY9)jE?VlVqj~#(*=008GrkG9F0KHb|YlKxYr9{ zxb`mM<_%6o8dKn&JB&VP1XAVJqBC0Cv>!cd*5nqrAUm4)@j=zKCC>+_^}?gacp1W5 z1s-^H>g(!(A8gOr!ZfXN5md;k{Pl7y`(6Pycb+Ivo2;qsI)5abJe{d<7FdP4ijB9- zvac)8Mvg1G&iw3@`%-m&WI+zq&Hf}V@-u%zycVCN_&4sp{}UvI-5_?O+3VCW#j`SR zitM+g+#^4=7I8#{OzfbLMfQTpV>THqVYfc3uh~-&ZlJ9oF+uFOT1==~;1xHCWzk;2 z2ce-A{);7nS+F)S{ONCdEpCkP$~wNe@kJAbomaeFO{dxr_BB_ET}qaFSCX}AE`=?P z_?Qon75}5f^#B@>tY)Mh#9O^ayxlHe2qda|RThj^pRN%r4DFF>V0oMRAPv1FY z$dhx9T4H0a5$)G#_;=XwpWz8D`$Uc*S1Cnxs*KU^9v@D$Fl472A9mu(n-5`;J0fps zj3VSLKS#CCw8N$G$%rNcaFxf$+OI=ni1f=23Mu!b+lG@r^YPnBk>O){AG$^1`HFFp z=1AqCcj7t}Y+mhGl|S71zYYaJNq-F zqgZ>rir;z~R`)qKNle@+3QNc}h5O&B{;>vZl~`@1Kw76-J0?;IElpQW zgjq!=%d&9wXS>MDd6`H0Y;6QxnlnE8?MjmxRajDyQA53fAKJL=U{7kYTT_;QTbCun zUQnSQ^d(Sh%i4?B*kkNfPp|w5TY_y|bQAJp!BUPOn?zu=fh(Vku!ILRHdkQ_L1$w< zT4qECzUNYZiJuQ?rEpBp^7m`BQO;%yLQG%Y>A3xfa&GnK8x^+hzd%1}+`6C_qoVOQ zl=t}&-K+BSXdvBFx7=>|PFDt%#OI0V>|^Z!>Vsqd1^=k}r18os5mX+RZAie6Qvo3Gj>RC3QQ?d_FB0$? zdV~N$PG}~c!N{cN$P-i)&1>On3L&25^fKXfc|*s&^g)|JpT-2pM4%;8vJT*UE7v&ey3n0 zJ)nMdi(Le1`plMpowcQnTU4!9P$?-f$1(QV2B#GmBhkT$bgad>U?Zmwa8uK(7u}d~ zs-pYt7YPf$;<_;-3#sHj3`cO(h{t%e9=f7*K-8vxS7^w|cNTud(mg4jQ?=us;y~)r zCS9F+$7AGai|sYa`V|SS5Am=1LbnoK>ni+n;CPLeo$||U4=x&FMHP^$hzt?(eCqgy zVnSsDmClhou`fdqXUk_@7IN@mC)qW|%Jb-p`W}#k7g@MN0`eI+XSrouQY=01a(^xy zerCtMz@LimnXY@n0Qc+9(!1YQK~x5X_a~3%|6uU{A;VS2&F$jAvK!;&H8!=+g*ycK zZT%X}>!9byM`g&PA$?Q{>hEq)7?{IT=7wLoR3cxx81t)DgLr@I(q&Br*Rn4;A!IbmunBaNSa1d-4l-TqMh$lzqY4{2_2C8UyiZ}! z2|ODH-2|l^$I0FZA>#%Z#ZQwz79ZwBIb>3Byo*42d%M}4eDLt2`f#%C5=}jzak-G* z_C5ofs>U9wb7~w-q@$UJ9tYj_lapm@y)WM5Q?a0RbKC~OZUmk+p$ScYbJ7bl zo4Pc>?<~s_+Bi3a4nvHY?Y+h3uk+0AV+CIbzBT^-L_IRy@`aC+P+f%r%3;+V5KPu;KC(+2$06Mzb$dl*I@4O zW%>scq^QEw!=`u8`QgS=TSKYhFzk)Uajg(e+YvzYDu4XBJRkP zF$}>ntc>+O&@@hQe91+3i=sn{j4<8%ASOgX-);`VVCJ+(e@^5XLzMh!rw{)OKb2Na zGHPR~-^ipCv~idAa7HJq&|eLzEC-z|K?ufh3U~2Ty5Gai)|lsK;xs+wE6U!xPZ!Q- zB;jAd`%r=YFqeIGt>v9B#W!UxMty<8< zG6dfXEt4*rf&gQji_>25=Q%t3^QxV3J8b}hYrxoZ4h6td8qW@-ioIAj9kc&RAKgU5 z@1-z&>i^2mf{^~_oH~jn=;;1!meu`p7ZPopvo4+S^DTP}Jr6S?ICVDAJMd{?SY2Vewm!(|nq`L_=MIb)q95cPiww)i{BQDVp8xYwi4{cvN z#(N41Mr-K^w8#uq#isG!WHa}GZ1352+0(I9l5(rd%8RITiG3cP_p6+fp5^==oG*23 z`)Bdot>x;a%B!tZ(JA!atl|AAZyqT2Z-EXM+b!F;7$Y_oB{(aH$KQRwaQ$o!+evYS zd*#R9%%uMjT^h|axI22N+l9=P$SRxTqGHv*|8%xAF;bngYJh(+^-|QxG?*r!Ds#T> zwX&VN_)>CTDG1nW1vu1t)z+Iy?=rrUX3E3eTe-EL-&PiA1_m|1MacE!OXG*fY z?%aFM(%k}h)8teMRYJyulfrNd z&SIr=tJ&Z!^vHWGCurkIN*3N}PU+sq(Sa3}`v!MlipY5|yn*mUCj23h`@4vCSe94K zE-~-0%4^=%SZ26EM{bnn0I2FRaYtRJ{sF>sdB!26H* zdo42j=heYF&e=2`D~-3)_OAC-t*?Ed{^V$QQF~@Um*(&aIN7UcCmzPx{HCsx&2E9L z`ya=i#a;V(mBy6d$I-z?^aX(lwVtsML@4y^qZsr0OZMxP_in{)TSX8FO5C`gEwhZz z*YR3;AK|WiYN|YPy7m-x|1qoY{iLx*e`WEd%hKvr8JAeI`JbLvJ{(E{qokh^P4}SF z@nZsLt3WKQ@kzXnr^xl!yes*XI}|_Bv51#bba+F|aI3_U-$Ha-xvF|==HB7(VI6FF zNItjR)RBq5S3b$wJysdD2qn^iuR3LUUl6ZDH3?wGvpdtbUG$_^R91KeTJhHJ>eXg_ zn$awH@!_Y9laRg_RDjFVRQJ^dvVHi1&HTt(9O6A zD_Kj}@)H(@LcRPu*Htd=i$H$0Unws!&Asm?F!ghTp72~vg{?S{Db@Hixazyz6STi_ zr$)s)^7ob*F~`PIYf=6M&k2qD=Y%LdK`{5>bb6peqTYk`DWl`ehtdu|P^z!$8KkNz zni#0`IP#P?<{5dsDf)Xjw5{Bvz3KNz=>`APu4BN&&nqiU@lq0lYFu5i6Yv)RoyH%7cvFQ0>}bcyL$lcDP4vTF<-BUdy~5?`%) z1kiz?Yy<-?WxE?CbJsV=!rP4ASDn4>;gG@QU`+0`Y|Q*UbN6&sBlM><(IN1ng6*qY zvA@!FBIEV-98)*-KA5^c+^xhX1acC3XF8|~4Vo8BY`m(2%)X-a4{u}kUfRqAl6SP6 zb$njk@0`^?Z8%LCOimwUSmcM*Z2mB28Gu}bZIit~2`40J)K+awJwar#ItZ!U6#i;Y zlTpbe$H6LTjqS_6%xcW%BX4=`T{8JQ{+QSM*}&WH2)d{E?+DZGdooe3=O5_^N^><_ zW4%t+*z;gOEe89Z|L`r-%jST4mn?*LDZyI88@b*0Fcaw#v+5~)agb)Zb6J7ss zLfS}gg_h<+bc}YtWwKpdRZ%+_KtHb!_iq`?e<`i*^;U*9FW!!hQr%>GhmD{B1}zcO z2{kDZuG84Xs6MZkk2K#_Gp%z7W@a*o5owQ?cJ81OpJQ^+b!<|t8mq+R`3LmmWHj8t zu+fwjSok?EoWqPi?9|ekkK?&@mXgfD2`lbK0Tk1W3~-8;y|Ht_F5D+6PjZfk#{*xX zNj_fS{z%K!2Hw6psHG?|*VB!>jZ5RrgwV9z=ggDxd8K(vdu0z-j88YlWqI^p(|am8 z5ka&95*?BdZ0GORp}pjMF9Gk3vM&t6Hv zLYuMhVh#H-&XBl;s+li6raP(sl%98-swez*_jz)z^N`;&2Ptj3GIfa)N`oF?aLtvRTdh3JbYpN>ck89)Ou+Zh;W@&6goI$fSFyoLj#xE9rNY|RZ80ATn%xdar z5FtDid+#F6WmnOl5--Sg-^BW~(*Y4wtl-<)B)S8OJXG9_4&bDX&^`HjeVCu+2BfKw zV_Cy|3R^slh#=DA^1u+tlWNCDNwFH2Rg{~Q24`vhIj8U+^9%pG`u~*t`ysU13EgJ; z$ZzG$+;*H3@&o8+ZOJaf_LxCo-&<^+ti?4aB(|xxt@bwkx}``Zz6}57kbHfc+i$=? z54J24$V7Zx5N#FQcD_eH%1>9l-G9J({#RBl*F}pisbjGne7qB2h{5=Z_$OwKyo3na zHdPIppXG_~L0eg4eRv4OGJZ>AW#dx1#yXn!iev2leZAAJ@oLu$&*coi#3jthARl!( z&3sb%78U9#bK7^+3&t<53Bs#vM3G4rUc;(!T^AkJ$(dlJ5GoLbZ zl-ux^y;ik^>txQ}ja?EqbZt_l!7vfyFQ++Cvks!@kV)m_d{I8`!gbc5lMl)#Cp$Ib zH8?VIN})q&?hg1tSX64ujLpT#uVPJt2gr}p0ko}mWLqC4!mQKqW@?iS))Yk3aS-rc zA_2G}Ck+aE-ye)eE?}5|4R+!HgiCzU@;VZ3o5-V;y8JmX(vc~KN0NX_MU`m?YH**}C5g&QtTiS5TMsvaQf z5c1)3wcz}rzs+Ba$ZL&Q5(Tvm6zu*rnTZ65^8QZ3NsSW+sU}JdjtHzF*7mo)vR?^v z2Losx7=aADB?%xDYBr9bexLuE$Xh$LihINCRWD=ilR;y<+)a_KXnGTJ(NwdJwbRab z2|Ci-zLZ;tw~AJ_ykh)26bT2$k*{&1F@@~hiX8phgXrEMn$i@UcyK;Hmdyq#_8ftn z^-(&HdtS0yG}P--S?x-%i;W}pdrLPNmj%cXkV?`4rUO=eL>{=6>0oYB2!)fw`6w2` z@(DVc&(cStN0Q(gWe%_@erN_y*-IPb>wO=3IeKRO(zD@yz_Ust>>jWG+%METnms7~ zfn2OA`~!cN)w*a7%dY}_wzjO(hTcO{sOJoX(P=>QRML#gxxKPom(BgEAQxgAwA8K@ zGEOloY@e#&F$(u<>(fHOyp*&ms(t(*VT31c#eGvHU=YkJ|@~L zkA(%Dy=K$D({w^jpJ4}vPECx7WQPAtbsyNv9B>_#?vYDV<-7k9wLOH|5#(p6B>J-v ztAjd8z(FAi*f0j;CXBz3IWYV;@S7lU^l&>PtZgYnWX>)A z^1Cwz7ZQe-@4?lY$MU0gM-&vZ+xs49&oCL-#k&)n4!?sk*aUpOm+A`E72L5Gdijq%8)7nV#H!KL zGMpxh&92u0Q=U%PXVCqa{^7-8bb>dE*N|iRp&=L}H}}Dc%*wpP47V67T^O>7X8y@{ zo?+aBX4;;@xZPax2cA7^VpYEW`_&vKDP+BcWN<1`1@x*Q7$emBvRe=*UaaO7SK6Z= znwR;vyX8Zd%|YmuN*kQ~$0_)s|0Y?0K!eQItqU!Zs%n!O(oB64(IHmtXX8M1pIgYQ1=x7Y0cASiIZ`1a8%euvI<1*Dff16raIItLJiQC4o zfZ~m!&R8jUR>a{)EyHNQje=lEgo*>?sxw@2F6Q}0 zz^$2D$|J|{L^kd)Fcsf#L48#Nb}Q%yx_mQ|NCvM7q-fKvfmB?384*i2KilB@-#f1V z2{DZSQ%*dnj$NwT5D;^Ai(^SfG?_TmvQ zJ6`uKwhV@>oqLr2etftzq8Zkb+U#4uhAsF$K^NN5aw|iE+ z2G_fyU4b0C4stLkB^GgRh!T^VW|>Rw)C{e~(-PECX|vsY`AHUzbB?PnDZYv+2L}%h z%~@tT-{i?>FlVGp?rHiE&7Uaj&(gG>M6ynDaZ$r7a4{Qm-Spu{n;ZTNgTLxBj-4sg z5(qtm>W}hmH7+vmKHi^Da5-P=j75t1IZSN=Yih`%h`Z0E#kJ0SBKt`7UauI&WtlPRP$w5FOFQNk2OGPyEtKK~%|#cU0^}8|cw4OI@=Uwj;Qjti z;mfDk%bvegMc3;UPl1~hB@d1HFy&<75y^u4@!R7YN~bXh5OLo-i+NyQ1!eU5)}eFY zR;(#H5Wc!CL=YKNTXQ(Ncq5HvraBZm5*QBZ@0+MR&X6c%bLRZpt|4@CDe;o~6#>@| zf-)$Cb|e^IFN?>3;LR=Q?kp5n6ix)!@!mZOqDId%=rN&&JHF%H z{sVVMrIGmC+@N0*W{Adsf$;-A`^Ot#=E~eY-y+KqZ&2qO5)kh>1KK98$9Mk_u0}{l z+x0Nq5%>{saz?~~J$5;-^*i(ob$wQvg4m*7Lhysv8S>pLZOwU>Mw;b?GH6a7gDq~> zhjTYY<|C?-t7>ejN4-X}DxW<*UlD!&Zs2LUgv@;L9vU{LYpCS6Y61&_g=_b6If_+G zBol(~iUwEoNg_@Zd!WY@wj4w2O-Igcqis4i3CiB9%L_bmk{2P0C(s<2bjG_tVMnYLr(u?B!ukv+CxN$ z0(&v;2o~Pr$DH!{ZAd$L@>fBgqMoNp5M0cx+KWe+o-j+_54jd>h8in@#YdnQ7h-{E z5|$zXCzsA-DBvO;kz?mAQx+q6)D@Q~K-m*wcC3xx^?7}&bHH91le_ZHKF0`NV|Oa} zlku+L4CbM9zUqk(;0oRPZ^~kS$u1^H{Q-K8ife*X>2i_w45?YdOaU=5y2LHwuIMGq_ ziIItmZN+8sA1yi`dz?ZzKrkw(as9gk0W_8vq(N-uPJ(cBAN_Vl>oE2{%rOYeJLAg3 z31U0$VijAvlfTNpQ3}ko!e%n=0xzpuQ7f55?~4IVN5TOv{Yr9psdB7s;>?^Ay#1Ez zBHPa2^ZNcVv7e3gM~6F?vP76F2k+J?O;GX5f=}xfbUHnV7KfeTTK88if8j`e#(qSV zmNB%4VhH_QXUurd0o$>*JI7VR-nOLcyLQ1MD)R$;6}IBe?;y-E4;0g%cG^Pj?SX9d z$DP~@!&Gim^Hjjx3?@04LVOtPDe%(;s1Kl;d=WN_mIArFUM&i>C8MM#Vio>ey`W?BKFf2r{nSIy zY;D9}9Wd6#@PtC@-F}(L;wk45@*5{vhS0svp=V1?xRuTa7N`)GACLeA&$ap)>_`OT zTBqiQGws(dsj6$4>Gv#{63lbnEVj#@)mExs0sn#RY?_JYv8vT8|4W#N$96QwYA}K> zv__{Uvm8vj%NA%jhc!Y8)Xtu)H_|88*xKwpm}cy3Xv98T{)lPFeG*Qe9L0KgX13u1 zL=r%pB|2lbrIRq9_;-eMwqS(>o@s5Pl8AQc4{@+G0^@)f?xN0`zthpZfPjZ)?YdG8 zESS``qE%tFuijT?_WbV!@_e==^uoq&J8-L)-h6rXLXjG)h42NTv4YIUY&QV1A9Q$d zRv`)jywy0%BMt}Col?pMY~aq=Zhuk>hw=WCmB5hs2!amkz~|5!hl0Jl*2Au%y>m6X zFR#Y`Lx0NqoQ(QJ<68tV%-s1`jAGAK>sL~%4|wy+sW_!1DLJJd*u2`qiyVkHyeBYR zU1pk(wW;m0Kll@c8dn^v6_<4=JiRyd!g>UQ^*!^Lmcq8oL>qVV zuCr`K5$t^?o}gwOWgovQORwQ-qxYfR8VFRf%5cz@-!C{Rc@F-*Ywon|UJtoDg%@HhpNZQlthFt+|^O$d&NPP6Zr7oqNc(K<~O z!qq^?0%Wi>(Y6-FIZMN)VRJt?V&e{nF)FZ;7(DCIEOUSoxZ_2aZEwN}<(6qSJzbq~ zl+)46I*gr!t;ei2%s5!$JY~D)OV(FaPj=ml1~dMm17haga%8NFY&imikC@y@06BtC za4i3kke=ZGPX3!e$BfUUL<9-LBgE)&s??uqk_OpWS%%T%CHN~iojI{c^Yh^?MEa^D zgRQ%9ueS+vurW70GpKlJ^=D$jQcs1qk^uJ68>#5@65+CWJlYgk05ODQ5M6sq)8xmK z-zo+%T^l41w@LC0P2XoD2rrvH%!si%gM1Vb*LJp@JnC^a>$>dS@;(=%?slnH(g2lm zu<;TY&p2S*%OMmK&js~l(AT4f#iH1;?RQV_@DuDQJogd^c?zd6C!38;Q(m}cN6f1R zydHge@x@#{;v@p28-o+te-)$%Pu^7RzY;UbS06{+&g;xg@8Oh4KqIE#1t}8V;oW@g z*yeu?aiyzmV+?}G(E`7cekJ9_F1(EtSIYT8k)NUY=I1Z{&)`=W@}97vr1uSh?>!Mg(r({v z(cfTu*KxICO~~j}wu*gBh!%R)&E})n4P-Kw z{#S0_rT0avm5sc+)NesiZ%+I%wRKpN&-%k7 z!2o5#Tf7s(Y4*BW$QNyu_fa|2%1^I@aJ=3bL+`Qa(|(~a5b>-wUOS1|+{?i{|K?bg zOakm9*x?O#c_!7MrXZQpXGJy`#}@al;S!Fn!+-7#oAeJ&-Hk$)ccqhO9&d2Dp~`R# zdIz}k2el~l4{W@l05Q8@`O*lFC!RwyP4Ues^!=(Z*P zbNyTp7v5>T<>PewsD9_ijr=Tp@sVKDUBV*|@34gZg4%$L;$0Zu0Y!Vj^O3z1)JHiKo;1h{iLaY`cmTsaG z@bHBDN$lXJ=wV_K-(hy+2$*H;;)Vq=zEbE9|Gg)e1@yBZa-3L;Q4!N+yjcEiR`;*L zCd9n@#Mo?sPpI%~I^jW(9_7qsuw$dwhl+&rUzbOW@j=)#0*0ly)WLIQ>1n$jF31&C zGc7enZIO4dSnkggeot5{4BUA2HqGgCJ%4DF@+S&Xlo*dsq6r3}ANE%7c9VeITk=*6 zFI2x#5Iyx++JRi3#YaT%lMqq(ukyqiK5wRnRSZz!;1~~~g$CPIz3VK^8A)+JuoR%tuRIJ=v4+xA9>m0L_3*oOG0zC z63r)jUFEjP`D-71HOk?w{;c}d+=BtTK1-L{Uaq$L4~x!0*x`uAAoc+Tr`f{3DXqQ| zesuktZXkl`Q%o^aMWExy5x@Vhy)Tc4>VNwl2`w@uQj#gVkdQ24DqE7Jgb-6HYsi*u z%n8X7rWDFHB)c)l63LJ)%9_Z&7ujYkGlQAw`Se>}_wT;%?{@!Q&;7^qe7}DwW6tZG z&$-TZeXjR%ow&TS(fcdU8;Hc?%jaXQ2fL2+&70~6XWgBovb$Hm{l`O(&7X?}RfeCo39^NXK(%30LD9aykLve#?}ZWegN z!U?zS{rY!BQ!Z(8FAm5nBr+#Kj(-M`F1T^hw~!XF4KjE4PZ6s^MSQaiO~bztGGQJl z(gh+-)a^cV=S-DP17VK^z|Db9gZ9NgG-f;g+P@4f; z>Av^E724W|cy-tefchw^?sDBauI<5nA!{gdc;H5V~b12Vvi_DppK6f zI=3TlBL+2_z$bjs*od`*5#z?om>Idj2evU9aim$%n8}__)|at*FXdbH6$E1a0fzG1 zZPag-S@0Qa+;gre5yVB*XC!@(EM+9DwpR`<{#o{>tOvJZ^cN@~ri`9%UWIAL?QzxM zqnmfrQ9NzC%Tlb1?rak*Wnt!Rc-Ouui5&M_X(DuNYAW6(oLqC&sO!+$LevV{deeAI*RK$Dm*n%e6v)Gk9Uao(_aGO-mylXinNe_|7vo0nXZx7` z2BYby_-27VlJ(|oW@C*iBSquz_kGKbS-Zrxpr5}xeo5o46hq+|`$4Nm{*km0%11^t zns3vDj;tj0=5F0{p|i*$cvnNrQx@j+tv6zc+K@}fm#}8sD?)=+o2t}yVo92`aFx{k z!~4{oR|KNQ)C?`{`?4Y?@~oN;c>om{l+vk zOwqwRP;KH|lCt`NfLw|qRRcjrm)w4*I8qcJYh%qYn_K*jHWws4^^Dq@BO`w327S|C z9XHy!S(O3yltpy)34>FOmRCM|mB7XfxG)Y@o7sb%y^WCDxLj#5PlioYWrnC%ZyTa< zf59$G-dj4=S8wsz;ZFbb90HtS$1O*dJ=eqqdZZgV+Y()F_7~XN#?V0U3Y|9rTN;_kO?%p$%SiN;c5$t|HeyBUg{0S~X4qLuFF}BLKB= z8T%b#1tg4>IkN@=C87&4{>hEzH%=$9hh)101Z374?~dF>oJ#eDn6;`t%qN+5FP+!T>a*?)I#_JYjou{+2VzuT)Bg5f%+ zBE&PbmgrK=Z>5OJsP2p#u!78E56I#7!yC0@{hZF~dyK|uEu^yDblDbi5`*f^up3aH z^>;V^mW#yOOM2;^)!g1J)0=3heAqM6Qom-{EnLz2GOVR5mTot%+Wm&<^{&o5HBjM- zUQ&~~){WxL)X%%s7M)a+E2b}cw3X@T%}a^3UG@(-H0&pSkHZAj5k}`7qKWBu8j{8uliJ9|NG3nAzjMSn}d^+Els_PkVCmyS(B1Y^* zr1^C5@v7b8Ql4<);+Y+|;_qSEYJIdtJ>$@9c0s1&?Tj{h*Q8P;&)cWV=o%k4y%sN2 zE6%5HaW%)#4smJleryGrCZ;Vu=AtiDafXcwgS%)8>{DnQrP5l*RZVt<_m3Q z__xVIBcJ!3xEN}>pOy5YyLY5%SVm^Ih{MSjvZs$W!gx8Uy9ae{r3B|i#RlxSH9U=f zDx*I1kY7UDA_lgFc!)Tbjv!qk>|nMF?x}uQpBVbKakPJsdJ$$NzLEw%&!~pR(wN&A ziE427!1V9&PrmQS#Izo7OZGPhnazyZ3o=_K=E$%w(X8rqjEY!-%j+Avr4Sb;GjC!( z;mY7KNC)hpAzJp8>etIz=mNHwE}Hp=t+5^sFp<>Kr~l#D{2!?a|EVhc`SXBqCXX@4 zsy$e!TZ}TJcRSZ;Zn-vWd@C=GwzR;CSOxm1@NvB5sAcDZw}gOd$F@hum%zST(kP@x zv5FQ*h8vJg3$lbAJz^E$+A57uI+ngym{MNG$f!9us6*8gDZiU9*nWS^b9CSy(oEvz z*5j?KnZFPb|A>-D_jKTz01ZN01D{hfW*Z|HgJ>IfF&r3C8MfM+7i#{%+IJ2pCF_of~8|T#jJJc>U%=TSmD91 zf}l100Xt?P6uVDS;&4dtE?rdKXa!KH_B9e;>BiW9TE(CIYIWR3QZb9 zvbFV09jDysJ-<^SSpJB84hu_T>XrIlSx}Fjb&FZcIA+BU)bs4hIpQ zz#E7MA7d8)qa(-U=^~3a)iZDGWqJcdYfp#t4;W4XhzFpL&CJ6wfLBDO{~RRnSR;rQ z@^~yoQ@HeJ4axkM8e+A9jZrhrw|M&?-B0>aOEkGcGv;~0E+i9~4k`{{anpCuO&V%s z(vxpwgx5E|%y4lTu8F21ZAsrkrKa~=jFY)9xtez~V!tQYGInDGUZcYN*`XQMf0P`| zPITKh9 zZ2#y%x1Eum$-DA<({4+Az$i|)nyK$^+-6vp7#`j1{_?wr|7F+yF*7l8c%fh8Swr@~ zSqng$w7%#dm{_#x%x=>Y7pok0YqZ%d&`_MQn=Y5TWDKxj4#)E%Ki}9s$uEy z4yGq^tQsri^aHl*875=k+G^#rxv}&%(6LzEOMp@E^7tIp>eY z58{-X)Xqrfv#8y^{&Au=p?tAhP9H$5BBD@N0AhFxHVv z8B9eaS)Yzz@BoyiPU;6NeqS}FfcSL}G-gD{F0C=e(aNmTKuK&{;>@{eazC-17t0c1D)YO$75&H%|AW zR@jLoai%VHYILuLK!tdNCA&JZ)a9pk#+GhO^Zdl*KEyi86g&9?Mz@BxAb#m|;gqZ6 z$eHxNFGA*O2p(L!^G^tC3JTPnaH~&t2ZJKO74HMbFxA3{p;bTu+Rg=*He?&%h?wj( z|Ge@O9p%T}FHG8*5fzD)I3V4Ep3(zjKNf-BVWLPU2 zF~0t^S^A`We9ddky1iGuVKM1)sJMQySYlSS*v3v0Vn^=-#qsHfghQ9-6h&~pb)s80 zPbOI(Sf_H+h{<1#y;6+qIl5H?m)w`nEx*6@DBe!=c|?oIng|ulD}ru{U@U(bqd(80 z#$}Y22HWDxyGorO-&FGLn8ZcnPsqr(-wpPGweEf-@17cm-;~9CsF7i$pwTm)4^up{VPZufd&S@9oI- z3v|vNEc-lJ;BfDif&h$79<ffd%JM%%2q(jePQ~VFJSeJ>re7mNjkvwTz99`tm(GiOn4MJFvAxYt=6^(k{PNQO z$H-Bz&%gj!p$-Avt|v(~m)Gogn-YI&y*iVvh<#B#aE_Gs2K#_1nN(+U@>8`DtBbRK zXo5y?N zuIn+K9Ga+-+K~6ZzRCEct%fEhY8d#jzer%YkD`@WQ zp~6dBaCcEG#dCgtfBBJSFqiK5Y2KONkktGEchi5>gdUK7KlIqHXDP!EUUBy+gC ziVpKpgj$VyMUt*+o{7;`(@ zCfuG?vkysf6vd=Ic@jkXByuN&6_1INeThZLuII=hX{yjyU*~)B)-{>%*YtWfnuz$k z>RT@ZHzb88HUmjIhx&4lGX?&Wc7BN)M`d3Pobbyz^ia^>?9zswJC(t+A4flgTsesi z>z8G)fSbUAlt+#Ok!3N9nnU6j1cm1bT@swh-p$=X*!jO7mT1rd%&S5#>}m@{SD#ES zZAiHP?L1r%aCxJREn&U);4VId`X+D4~LCq&jEDeY^#rqqkxcMH5HQxEs zo`al+D&d>|FaZthoY2OFmCpGIN{U76v(yb~LqJ4Qv@|a|hU)LD-4~H_<*fJV^r+X< zzH4cmvR@P^tR$cL{;}74EnZoa3A<*rKiQhA4)HUPT30%ClG$J^^OC1)YiE>sN?~S( z6$MvjEN^aP(u`4xO$r#(dR{eyFfFxsUvf ztUHkqQ6uRa6By87QradRTC2`(aFe#u>`%p3YkCsqUa6G~X;7p++uZ+G-tfe-DG3T; z8lwb9xl4<1OB>STZw^!f6T}0TIV?c{;2xxkK5VRE|D>k9w`pSevv})C-F5}k^!9NX zS0gUp*bb}kN4kwq)3=dLn+RF; zKBA?s^bUVXN^rZ_P3+Visn(tJsqJ8+JCX2B5fl2#S#cA$9_R?fX})BJPv11{mp~T1p?>?Qp#? zukeuZ)?X`$(C_)8K$G~3c^d;_|X{Q@bww6O%&wi#q7JRq`R>X4dA%g zz_go_Oc6@}u;INwe*8A@8qjRG<--m~0~{9snmjvI&V z=Z_xaI3Wk~G*)muh;>@dJl34SqrB`fQoSR5Dw*qPDE7SWZBFQD<15pBC+OAuQA&8_ zB7wxvXT=56#~u`$b7$N|di#HhXnDs}+#6@O%Wldw;Y?#N{cW51H9xTgm952d7ZqLw zj>LsLF15X$S#f+d=h$LeSW}k^%m*k9LBZ=Wdxz{@q_?PQx5eH^bg}w*Iz9M62kq^$? zOAM3uNFJ!VFYM}QmH%0!v^vpT-{dQ;KGI=|CTS}rwW|MyS!O?z&_JLah34H!edbTj z;!u^ng-1LEnor*wdRI`r=bP>Ix>d0^qrnK0u~EN0C8$@3G#ad?RX$Mg?KZz%Db6<0 zj5&Xc6f;sg)kijcGLThKncD4DRpAqJ?u+WVDATyG!?^;%r}zPPvI6hN)xG*K%&DPT z?L2rsx-Or3XWG(FQv55V)JdLGjD{Rl-S051)Ze->?jk$=aLz8xhsQ#C5UuHU%{23A z(Cp+>DtZCIiMU^p%1R6MqGE(e&m$EABtIr3qN}wQ1FCPId@{5LmDk_=(HV@ZHma|N zwtxH5j`-M3c`E9Rf0?^8?wrb_j+s_W@hWYO~|HixrZ!-(}a=pA>&96 zG=Dj{u<~}8DZ6~hiEAg%h9o~uWUQO+NDq{%h3t`A>PcWXbJ5{Wj`8azc2!REP9B)K z)FhJ6F_nWvXNr7&Zx!GzdqkQqXf22CIk`)=7IUDIY*^y%;`C-(WD<*q_=zM_6zynx z?u3iew>soD*K;MCT92->J$t+yb@v3zAc$5|kaG%_2-XH;*bt>yZSMHs8Ig?CJj^U% zI=f*+qz7$+zdC36 zfV;JIh*5A1vWJJ0n*|8`D8u67U8SDQc#LgtYBbtw*lZ`c_kh_MEX5E^l(~Z0>f5gt zKx)<}%NMzooyI1AQ!(~mv1viI8PWGxQ97W9X8VX-ZX$LkorFvs6=Fit6&XjRINDDM z7_;X5#@6+pG67l=Wr&f2K16;qzOQJ5QSC7_c;!81{{8-7jzjtMF`!HfwQPPj8eth4 z^CIc`>zdb_l642Jw0>J2l42O3t!^kHca2;@th=y^YfKPBi8NWCxjLUO-nW%{M><(ru>5*JS;+kbeBLM%RV!b>QtWJ(O5 zXi7=xSmmc7Cl1Q;(8Wm25hwc0A8ghSpvfhI+m1^h9}~1@=9N zB<9jAR03#nho%X+mNvPFnYRvhwUc<=l#tQNf$cDE1pllTFw-OndB4D7T*S4@-MdzYNpwN(?Rll{;%_O8W8T&x) zK#W-pUeM75-D_25mr}ifYgOm%rX|!dB}sSlPliq4HK>NwK_5LWN8XX%M`ds2y(U#m zyGYWXz&3U8SkW}cQy&KAjSMNDJ{(c~x(L`Bue^a+`7@)E-??F?&f`Km7= zQMopj$c*=VZCk`kPMANnDK?8M(XDGBp-Z%V2u_|m!A#T9MylYQ;6m*`js8DjEfvh2q==ZotV=aYIMzRCJ*`m8QGw2qaAZd zR;wybU%<{$Sgs*s=oRMZZ*0=bMV?scHSkou7S}fl0Q>@1>)oQZ>4%v0RSmAmB+zQ-{+*t zV{%16RigI>Njdi2bX^Vwc58ar{qX0URE<<-&a|f@v2^T zbY1sxx=`}hCZVlpN4H7rHnC#Y#;21{RtY!L;H?CjB(=e9x3Aln89r-vFkWSMKJQ$V zf8Tl=Eo*s#+K?F9Sg)Wk(%$Ue(&CAlC2u;Q_k~O>)fu34OYiIXciHXv?hcxdQyl|J z6g64}DWGuxOJM{>?jt^HFrw;nOR!E^k*_kD%NQ>foVEjGug{pG&oJ8)He1#^*#mjg87Z>VCo377s;DLLZ>JBenuSrk zh$BYr*uReRzpy^|1$dq6Qg~r(hhEhA#XD(&S%8Lu#vVbt%SN}Log-a%lMmRRuJeq# zX}+-?ef)EwcL%$rQ^NBV(MxSOOC|vIB8f#6SX4$jToH<9g?kbmWZn7#~U_^tt zRfM@u4L^vGU0e4QaXK+_%nMJ(K6ySbS*h$>Xm;3x2UR^&<;m zA!N+Fnebq=)U7@V8A04hFk3RJIxQL+zN!86%Q}9MFHcoaWjst653zh+#m;};G(}%y z#GxJ3P^1cD2eV80IkQhwQ{z|mc3H6#b+y9Zmq@Y+xax8ot)-d?>{%s{I%0fT zRmZDum&`A5sPgjZNukoMCGtoOFb$-gLC&KKu;{HA2xrs+=YMH5P7A~8TJXkAA+%d^uX5ZQ5k zs4tm*0Zb3<8ygLqA|o3QIW=pQMC&hA14q}PjBxa#(KR;c)M$AHoj1USmg($68l>Fa zw0oG=j%TBkDJ`z;q;;^_vNA4QP{mg3nxM*kkF2^(#Hcr&jWK!Po&jM>KV2THnxkY6 z$h}#*mACGCoXl~o#Zl$PQJX-a3TUdjAFwWL*BIrc*a)R!W;;)? zob^cKySjs1{K`fqon@HApHlhW%_+(R0(}Yb)znA_C8=yxv|E}Bdo3yzPVi(;rmwu9r$3}bIz4f|8 z{#mO4Vx)n5624jJ9F~EHLFrUF_d&`d&{#AO?wL^rQYKS$<(LcW;!*=dJKhk9>m$Ur zH_Yvmn~uKNG4Y1CNTWAZ4qhuKuEl;aW?=;>gvM-#N^wCo%Dx(d=3Qmm#GYpy?6Nje z2Jc?Wu`qqm3&U!n_%U6GVpKhR;P3;o3_kCqhgIv=Sm*iTjuWLUG!z7O^hX&A^!UOul4zVD?aR*+tfEt3ceU+(#-?M zP&A=FFwE7(P{y$Jl)XdJ9d>?3>Wh2Ia2T-qeXDQd+O=1+JXj>?Y`#{I(FJqpS0sr4 zxo)}(s*;z&)L37%6wn@gKXp@ETB+zjZHGT>nK0lvfqhVOkS^N0RQ3iZWK?wiI%}{M z=uZcUw{bE26-}r}B}w$MdQC#0Z+VtZ$KGdD+fR%ugaLrkNm1!MHj~YkZ)lpe3Gc43 zo`6pgVIC^Y-NZz7LyGlzrpwtI`Ub+M?0Y)d_*!-cPw#SR4rUUfzF5~G}~8=|*ek1ZDl`H8Lf<+`SLE?Y+ViI|p@zG>E$y+@ z-Y*_`1v;CR3TO8d#2zB3^*iW%N{obOcL!_j7oeC(D9Rr3ep5}ndq-Y(%`T*#)he=+ zwN0}#Wc8Yp*wej@5XU}ZsZ#Uio`da3Q+Tt3v33N1986~# zlz+mYKnAi$FG0zjMzedh(aPdriy*s@udzyDnG=ZX#CjT{=d$83)o32IUYo5%890vetanxdbX zwQqq&pMrPZV%+F}YzzK~=^T;OD_wf9kKg|O!b?%J3DHgK#nFwKv7@*&LUXVlFvfSQ zZC~XjO$t4As(v$PV(r}00ZyPB$2^A?^qyb_L>qDug%)_-nxTfp>Oiv61V^KchY>eg z^YhxS8ylMOuZhnyuQO-Fcc|aveb=Q8S&iM{Io^{VR&Qc_-}LE?SiQS?4v*LIPM>nc zRbyRh2*yCHnDhRhnAC6m^gkuc5%s7ZysCl-1Rb_uekis9-XBcaf633TLbqKY9!!r~ z&j157)1diKuo~_(h+NgqK@MePrH-7Fsa{wo?nUMMyDc0bSzQhiD<A$Z%$m4@6T$(xY|%`tn~3Hd^;r zko@&v{FMy;%AS9#G=C+7KadO#)yUCLoQdz12GpB1o847<08P_wdsScQ6l<>IX~Iea zP;~~U(6wHNweq_Rd?QkFk((|y!jsUT&jjJ&LgL6sz?{%%Lq*mFjG$#F2lds@Vaj#d zOfK}1u9r2P-uXNGGemfz>+RPF(@07mI9N07(_~bFhG1vJgJJ8*UAqt4X5%q}PDF0C z0Q@3kDoyG{a8c26D*l|->DmIs}&nj1gQ^49zSnU5y4ru{sw{f z2b{3~O~ddTZOZ@ef6MwutYd%T_4%*&pY;!#DgNvC{;dCJ{dcsWf8u!i-PzQC;>D$<0iCjtJzuoF^~(H`KRddZl8yRKCC&O@mA`s*=v?uc lt>-OJeboq*!(hu16hi(i`V~!vF{|DOgfUf`m literal 0 HcmV?d00001 diff --git a/theme/templates/article-sidebar.html b/theme/templates/article-sidebar.html index 35e141c2c..e25cfab10 100644 --- a/theme/templates/article-sidebar.html +++ b/theme/templates/article-sidebar.html @@ -1,7 +1,6 @@ {% if article.author == "Kevin Whinnery" %} {% include "sponsor/twilioquest.html" %} {% endif %} -{% include "sponsor/sentry-assemblyai.html" %} {% include "sponsor/carbon.html" %}

    diff --git a/theme/templates/blog/transcribe-recordings-speech-text-assemblyai.html b/theme/templates/blog/transcribe-recordings-speech-text-assemblyai.html new file mode 100644 index 000000000..379b4da4b --- /dev/null +++ b/theme/templates/blog/transcribe-recordings-speech-text-assemblyai.html @@ -0,0 +1,6 @@ + +Learning Programming +Why use Python? +The Python Programming Language +Python Basic Data Types Tutorial: Strings +APIs From 71e04f3f59b6f7bf710f5dcd081104fb37dbfc7f Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 9 Aug 2020 10:50:49 -0400 Subject: [PATCH 219/302] update meta page --- content/pages/meta/00-change-log.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 0f2dfd40d..b2e7a993e 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,8 @@ on GitHub. ## 2020 ### August +* New blog post that shows + [How to Transcribe Speech Recordings into Text with Python](/blog/transcribe-recordings-speech-text-assemblyai.html). * Added new [GPT-3 page](/gpt-3.html). * Updated [debugging](/debugging.html) page with some additional descriptions. From dcf8020d7553d74a3373169cfbdef5a99e228963 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 15 Aug 2020 06:27:05 -0400 Subject: [PATCH 220/302] tweak link on author page --- content/pages/meta/02-about-author.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/pages/meta/02-about-author.markdown b/content/pages/meta/02-about-author.markdown index ebe7b7686..0ab3b577c 100644 --- a/content/pages/meta/02-about-author.markdown +++ b/content/pages/meta/02-about-author.markdown @@ -8,17 +8,17 @@ meta: Learn more about the author of Full Stack Python, Matt Makai. [Full Stack Python](https://www.fullstackpython.com/) is coded and written by -[Matt Makai](http://www.mattmakai.com/). Matt currently +[Matt Makai](https://github.com/mattmakai). Matt currently works in Washington, D.C. for the [Twilio Developer Network](https://www.twilio.com/blog/2014/02/introducing-developer-evangelist-matt-makai.html) as the Director of Developer Content. Other projects by Matt include -[The Full Stack Python Guide to Deployments](https://www.deploypython.com/), [Python for Entrepreneurs](https://training.talkpython.fm/courses/explore_entrepreneurs/python-for-entrepreneurs-build-and-launch-your-online-business), -[Introduction to Ansible](https://training.talkpython.fm/courses/explore_ansible/introduction-to-ansible-with-python) -and +[Introduction to Ansible](https://training.talkpython.fm/courses/explore_ansible/introduction-to-ansible-with-python), [Coding Across America](http://www.codingacrossamerica.com/). +and +[The Full Stack Python Guide to Deployments](https://www.deploypython.com/), You can reach him by email at matthew.makai@gmail.com. Matt can't respond to every email, but he will do his best to reply when possible. From 10c243fe0323428a5b899bb71a0f1ea532b0cc10 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 23 Aug 2020 14:50:14 -0400 Subject: [PATCH 221/302] add new post on using sentry with django --- ...port-errors-flask-web-apps-sentry.markdown | 2 +- ...handle-exceptions-django-projects.markdown | 454 ++++++++++++++++++ .../division-by-zero-exception.jpg | Bin 0 -> 206499 bytes .../exception-thrown-debug-page.jpg | Bin 0 -> 174207 bytes .../200823-django-sentry/sentry-dashboard.jpg | Bin 0 -> 132816 bytes ...try-handle-exceptions-django-projects.html | 7 + 6 files changed, 462 insertions(+), 1 deletion(-) create mode 100644 content/posts/200823-sentry-handle-exceptions-django-projects.markdown create mode 100644 static/img/200823-django-sentry/division-by-zero-exception.jpg create mode 100644 static/img/200823-django-sentry/exception-thrown-debug-page.jpg create mode 100644 static/img/200823-django-sentry/sentry-dashboard.jpg create mode 100644 theme/templates/blog/sentry-handle-exceptions-django-projects.html diff --git a/content/posts/200630-report-errors-flask-web-apps-sentry.markdown b/content/posts/200630-report-errors-flask-web-apps-sentry.markdown index 5f78f398a..e55c14c5c 100644 --- a/content/posts/200630-report-errors-flask-web-apps-sentry.markdown +++ b/content/posts/200630-report-errors-flask-web-apps-sentry.markdown @@ -117,7 +117,7 @@ With our base application working, we can now add error reporting for the situations that do not work as expected. -## Adding Sentry to our app +## Adding Sentry to the Flask app It's time to add Sentry with the Flask integration into the mix, so that we can easily see when the route errors out due to bad input. diff --git a/content/posts/200823-sentry-handle-exceptions-django-projects.markdown b/content/posts/200823-sentry-handle-exceptions-django-projects.markdown new file mode 100644 index 000000000..d3ef987b8 --- /dev/null +++ b/content/posts/200823-sentry-handle-exceptions-django-projects.markdown @@ -0,0 +1,454 @@ +title: Using Sentry to Handle Python Exceptions in Django Projects +slug: sentry-handle-exceptions-django-projects +meta: Learn to handle Python exceptions in your Django projects with the hosted Sentry service. +category: post +date: 2020-08-23 +modified: 2020-08-23 +newsletter: False +headerimage: /img/headers/django-sentry.jpg +headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. + + +Web applications built in [Django](/django.html) can become sprawlingly complex over time, which is one reason why centralized error handling is important. This tutorial will guide you through adding a free, basic Sentry configuration to a new Django project. + +When we're done, you will be able to view centralized error reports in the Sentry dashboard like you see in this screenshot: + +Sentry dashboard with caught Django exceptions. + + + +## Tutorial Requirements +Throughout this tutorial we are going to use the following dependencies, +which we will install in just a moment. Make sure you also have Python 3, +[preferrably 3.7 or newer installed](https://www.python.org/downloads/), +in your environment: + +We will use the following dependencies to complete this +tutorial: + +* [Django](/django.html) [web framework](/web-frameworks.html), + [version 3.1](https://www.djangoproject.com/download/) +* [sentry-sdk](https://sentry.io/for/python/), + [version 0.16.5](https://pypi.org/project/sentry-sdk/) + +All code in this blog post is available open source under the MIT license +on GitHub under the +[sentry-handle-exceptions-django-projects directory of the blog-code-examples repository](https://github.com/fullstackpython/blog-code-examples). +Use the source code as you desire for your own projects. + + +## Development environment configuration +Change into the directory where you keep your Python +[virtual environments](/virtual-environments-virtualenvs-venvs.html). +Create a new virtualenv for this project using the following +command. + +Start the Django project by creating a new +[virtual environment](/virtual-environments-virtualenvs-venvs.html) +using the following command. I recommend using a separate directory +such as `~/venvs/` (the tilde is a shortcut for your user's `home` +directory) so that you always know where all your virtualenvs are +located. + +```bash +python3 -m venv ~/venvs/djsentry +``` + +Activate the virtualenv with the `activate` shell script: + +```bash +source ~/venvs/djsentry/bin/activate +``` + +After the above command is executed, the command prompt will +change so that the name of the virtualenv is prepended to the +original command prompt format, so if your prompt is simply +`$`, it will now look like the following: + +```bash +(djsentry) $ +``` + +Remember, you have to activate your virtualenv in every new terminal +window where you want to use dependencies in the virtualenv. + +We can now install the [Django](https://pypi.org/project/Django/) +package into the activated but otherwise empty virtualenv. + +``` +pip install django==3.1 sentry-sdk==0.16.5 +``` + +Look for output similar to the following to confirm the appropriate +packages were installed correctly from PyPI. + +``` +(djsentry) $ pip install django==3.1 sentry-sdk==0.16.5 +Collecting django + Downloading https://files.pythonhosted.org/packages/2b/5a/4bd5624546912082a1bd2709d0edc0685f5c7827a278d806a20cf6adea28/Django-3.1-py3-none-any.whl (7.8MB) + 100% |████████████████████████████████| 7.8MB 6.3MB/s +Collecting sentry-sdk + Downloading https://files.pythonhosted.org/packages/f4/4c/49f899856e3a83e02bc88f2c4945aa0bda4f56b804baa9f71e6664a574a2/sentry_sdk-0.16.5-py2.py3-none-any.whl (113kB) + 100% |████████████████████████████████| 122kB 33.7MB/s +Collecting asgiref~=3.2.10 (from django) + Using cached https://files.pythonhosted.org/packages/d5/eb/64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6/asgiref-3.2.10-py3-none-any.whl +Collecting sqlparse>=0.2.2 (from django) + Using cached https://files.pythonhosted.org/packages/85/ee/6e821932f413a5c4b76be9c5936e313e4fc626b33f16e027866e1d60f588/sqlparse-0.3.1-py2.py3-none-any.whl +Collecting pytz (from django) + Using cached https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl +Collecting urllib3>=1.10.0 (from sentry-sdk) + Using cached https://files.pythonhosted.org/packages/9f/f0/a391d1463ebb1b233795cabfc0ef38d3db4442339de68f847026199e69d7/urllib3-1.25.10-py2.py3-none-any.whl +Collecting certifi (from sentry-sdk) + Using cached https://files.pythonhosted.org/packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl +Installing collected packages: asgiref, sqlparse, pytz, django, urllib3, certifi, sentry-sdk +Successfully installed asgiref-3.2.10 certifi-2020.6.20 django-3.1 pytz-2020.1 sentry-sdk-0.16.5 sqlparse-0.3.1 urllib3-1.25.10 + +``` + +We can get started coding the application now that we have all of our +required dependencies installed. + + +## Coding the initial application +We have everything we need to start building our application. + +We can use the [Django](/django.html) `django-admin` tool to create +the boilerplate code structure to get our project started. +Change into the directory where you develop your applications. For +example, I typically use `/Users/matt/devel/py/` for all of my +Python projects. Then run the following command to start a Django +project named `djsentry`: + +``` +django-admin.py startproject djsentry +``` + +Note that in this tutorial we are using the same name for both the +virtualenv and the Django project directory, but they can be +different names if you prefer that for organizing your own projects. + +The `django-admin` command creates a directory named `djsentry` +along with several subdirectories that you should be familiar with +if you have previously worked with Django. + +Change directories into the new project. + +``` +cd djsentry +``` + +Create a new Django app within `djsentry`. + +``` +python manage.py startapp errors +``` + +Django will generate a new folder named `errors` for the project. +We should update the URLs so the app is accessible before we write +our `views.py` code. + +Open `djsentry/djsentry/urls.py`. Add the highlighted +lines so that URL resolver will check the `errors` app +for additional routes to match with URLs that are requested of +this Django application. + +```python +# djsentry/djsentry/urls.py +~~from django.conf.urls import include +from django.contrib import admin +from django.urls import path + + +urlpatterns = [ +~~ path('', include('errors.urls')), + path('admin/', admin.site.urls), +] +``` + +Save `djsentry/djsentry/urls.py` and open +`djsentry/djsentry/settings.py`. +Add the `errors` app to `settings.py` by inserting +the highlighted line: + +```python +# djsentry/djsentry/settings.py +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +~~ 'errors', +] +``` + +Make sure you change the default `DEBUG` and `SECRET_KEY` +values in `settings.py` before you deploy any code to production. Secure +your app properly with the information from the Django +[production deployment checklist](https://docs.djangoproject.com/en/stable/howto/deployment/checklist/) +so that you do not add your project to the list of hacked applications +on the web. + +Save and close `settings.py`. + +Next change into the `djsentry/errors` directory. Create +a new file named `urls.py` to contain routes for the `errors` app. + +Add all of these lines to the empty `djsentry/errors/urls.py` +file. + +```python +# djsentry/errors/urls.py +from django.conf.urls import url +from . import views + +urlpatterns = [ + url(r'^$', views.errors_index, name="index"), +] +``` + +Save `djsentry/errors/urls.py`. Open +`djsentry/errors/views.py` to add the +following two highlighted lines. You can keep the boilerplate comment +"# Create your views here." or delete like I usually do. + +``` +# djsentry/errors/views.py +from django.shortcuts import render + + +~~def errors_index(request): +~~ return render(request, 'index.html', {}) +``` + + +Next, create a directory for your template files named `templates` under +the `djmaps/maps` app directory. + +``` +mkdir templates +``` + +Create a new file named `index.html` within +`djsentry/errors/templates` that contains the +following [Django template language](/django-templates.html) markup. + +``` + + + + First step for errors + + +

    Hello, world!

    + + +``` + +We can test out this static page to make sure all of our code is +correct before we start adding the meat of the functionality to +the project. Change into the base directory of your Django project +where the `manage.py` file is located. Execute the development +server with the following command: + +```bash +python manage.py runserver +``` + +The Django development server should start up with no issues other than +an unapplied migrations warning. + +``` +Watching for file changes with StatReloader +Performing system checks... + +System check identified no issues (0 silenced). + +You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. +Run 'python manage.py migrate' to apply them. +August 15, 2020 - 17:26:57 +Django version 3.1, using settings 'djsentry.settings' +Starting development server at http://127.0.0.1:8000/ +Quit the server with CONTROL-C. + +``` + +Open a web browser and go to `localhost:8000`. + +Plain old HTML page saying 'Hello, world!'. + +Our code works, but it sure does not do much yet. Let's add +sentry-sdk so we can understand how it works. + + +## Adding Sentry and the sentry-sdk library +We can now add Sentry and test it with a bunch of errors to make sure it +is working properly. + +Sentry can either be [self-hosted](https://github.com/getsentry/onpremise) or +used as a cloud service through [Sentry.io](https://sentry.io). In this +tutorial we will use the cloud hosted version because it's faster than +setting up your own server as well as free for smaller projects. + +Go to [Sentry.io's homepage](https://sentry.io). + +Sentry.io homepage where you can sign up for a free account. + +Sign into your account or sign up for a new free account. You will be at +the main account dashboard after logging in or completing the Sentry sign +up process. + +There are no errors logged on our account dashboard yet, which is as +expected because we have not yet connected our account to our Django +project. + +Blank Sentry account dashboard. + +Create a new Sentry Project just for this application by clicking +"Projects" in the left sidebar to go to the Projects page. + +Button to create a new Sentry project. + +On the Projects page, click the "Create Project" button in the top right +corner of the page. + +Create a new Sentry project. + +You can either choose "Django" or select "Python". I usually just choose +"Python" if I do not yet know what framework I'll be using to build my +application. Next, give your new Project a name and then press the "Create +Project" button. Our new project is ready to integrate with our Python code. + +We need the unique identifier for our account and project to authorize our +Python code to send errors to this Sentry instance. The easiest way to get +what we need is to go to the +[Python+Django documentation page](https://docs.sentry.io/platforms/python/django/) +and read how to configure the SDK. + +The Sentry docs show you exactly what you need to export to connect to your account. + +Copy the string parameter for the `init` method and set it +[as an environment variable](https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html) +rather than having it exposed in your project's code. + +```bash +export SENTRY_DSN='https://yourkeygoeshere.ingest.sentry.io/project-number' +``` + +**Make sure to replace "yourkeygoeshere" with your own unique identifier +and "project-number" with the ID that matches the project you just +created.** + +Check that the `SENTRY_DSN` is set properly in your shell using the `echo` +command: + +```bash +echo $SENTRY_DSN +``` + +Next, update `settings.py` with the following highlighted new lines: + +```python +# settings.py +~~import os +~~import sentry_sdk + +from pathlib import Path +~~from sentry_sdk.integrations.django import DjangoIntegration + + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve(strict=True).parent.parent +``` + +At the bottom of the file after the line with `STATIC_URL`, add the +Sentry configuration: + +```python +STATIC_URL = '/static/' + +~~sentry_sdk.init( +~~ dsn=os.getenv('SENTRY_DSN'), +~~ integrations=[DjangoIntegration()], + +~~ # If you wish to associate users to errors (assuming you are using +~~ # django.contrib.auth) you may enable sending PII data. +~~ send_default_pii=True +~~) +``` + +Now that we have the configuration in place we can deliberately make some +errors happen to test the connection to Sentry's service. + + +## Testing Sentry's error catching +We'll change some of the existing code to deliberately throw exceptions +to make sure everything is working properly. + +Start by opening `errors/views.py` and updating it with one new +highlighted line that will automatically throw a generic Exception +when this function is called. + +```python +# djsentry/errors/views.py +from django.shortcuts import render + + +def errors_index(request): +~~ raise Exception('testing exception') + return render(request, 'index.html', {}) +``` + +Go to `localhost:8000` in your browser and you will immediately get this +exception page when running the development server: + +Django development mode debug page when the Exception is raised. + +We can also try out code that does not simply raise an exception but instead +will definitely create one when executed, like this division by zero +operation: + +```python +# djsentry/errors/views.py +from django.shortcuts import render + + +def errors_index(request): +~~ division_by_zero = 1 / 0 + return render(request, 'index.html', {}) +``` + +Django development mode debug page when the Exception occurs. + +If those exceptions both appear in the Sentry dashboard like this, you're all +set: + +Sentry dashboard with the exceptions that just occurred.. + +The above exceptions were just a couple of generic ways to test that everything +is working to send error information to Sentry. This configuration will +also handle the +[many other Django exceptions](https://docs.djangoproject.com/en/stable/ref/exceptions/) +you are likely to see when building the rest of your Django project. + + +## Additional resources +We just finished building a Django project that uses Sentry for +centralized error handling. + +Next, try out some of these other related [Django](/django.html) tutorials: + +* [Tracking Daily User Data in Django with django-user-visit](/blog/track-daily-user-data-django-user-visit.html) +* [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html) +* [How to Add Maps to Django Web App Projects with Mapbox](/blog/maps-django-web-applications-projects-mapbox.html) + +If you have questions or comments about this tutorial, please contact me +via Twitter [@fullstackpython](https://twitter.com/fullstackpython), or +on GitHub [@mattmakai](https://github.com/mattmakai). +See something wrong with this post? Fork +[this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200823-sentry-handle-exceptions-django-projects.markdown) +and submit a pull request. + diff --git a/static/img/200823-django-sentry/division-by-zero-exception.jpg b/static/img/200823-django-sentry/division-by-zero-exception.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3fe1a333dc5194837193b30c2755f6e651265b7 GIT binary patch literal 206499 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

    elnFmK;h z)jd}!&iWkvC`LvShfIO0y#7m)%6QWYhh(XgXs=zEAac9I9B)z|9f&9kW0FCK=WR}# zw#kNiLM=SL>qGae16se+t=8hGb%u4hA;e-M6h7#9T1>(Zh&C;q=5KUi#3Ai-A6tO1 zs9V?u>`cM(QCT^3rEF@wtx0gQ={8L9GF{p^eHQ&3PS=yWX~Yx<4{8p4Fr4+8I6<>W zsEhY-K*V3T&SILDpu4QZj;(m-E)dwJ67YYLn2=r%h^g5&Zv(jG#@)Pp{^sRrhjT#U z@cdf3O@bm2KqnJ@>8${G_Uj|Xb2M1F6Y%jaDb|liEn|=PY<-!>LvO)+$f4@2>MQQn z)l$WT(8}xuk|MFWi9^3HmTD3>S=^4k&&<>dwy}aJX1`b8znpsIy|tIteMa@Y%)#S~Bm#)VdV{b^OLtujPgYF*SY^$4+wL4{(l&iTZx0u~FhM*O(ygkSRiG-GQ zjnSs|&)ETETfjQyYp)ZP?B?*}o>4<|7@SC&H3K6va%>7#j$bONG8Nj_`c!$UPh!v7 znV=q|Ng^IZBW&_X@=oG69hWT9j8jtPrp44%QnMlVSCEN^u` zVma*MaV%~wZInUn`SBjR3@4FJ1IMF zj}s}1%!g;LiJF-x?P@2CS@h`KVY>9BDRWe`D|ub~H zKK3|yt+Br9XgYFsv^kM2b|7N)v#jnDDw@oE+uS>}6MW?GQDkw;@x>)xI~l|~U;D4p0)Uoh9rPmGQ-9nRoN<@V;FpCDRkjl~A> z5tljb*6HB)MYB^LfgLCGU-#aeel}IMJ9)C9>65nWmAcAD^hk4D`CRs3t@(-VRYJPm zk&5-1?&P$$M)-*+>zxiH1WWB6()3Nl)S*MOBiG|pe(ac;*v>89U7yU@csn9TBm1-Q zu9${9E3DV?OLs=_dIX@UkjCUYxIoav=@GqD)%iZx!@O%Z59)YL^p=hClI^R~tW;zD zI>oP&CWmJ?ALfc4WM0q5v#Yx-;HIT|_RgE$NG7+2D2)sDv=Xgc?Ax0VufD_w0btx4 zxx+g#e9Ud1?>A%n^`m=}Cb*2a0*&%-g1}z5u)={LFdybNI&nGF_nwFIH~3X)`!b9P z(iQu*a4>(~BTGRnVg6i15%xg;1dm5NRJiR(0~EZ zHu{F$7j)5*;?8tQYA8x+QolZ}Gn62_cmN@z5n#f8Srbwkewkt)e$U(X#bs+;gfXU; zDss{1rqLM80V*C^rQ$*wKG96YKMftufF?BYCH1&U&`Y@|39kU5>X7HURC5{;w!ur2 ztfvN?gscVIO2eN{^S;x7X<$}JZzYs65F|LgkKixMvlB*VwfXW+I7qX*-K{rt+1#n@ zGh9l0tn0}7e(i;R4Er3*lk9itq?6HC%*^b3uL3Db3WUFo&&OGb?3@u>#o$?UNCy~v zIvsFz(Q>MdPGnZOOm~s$D+@m7JJ>Sf&tr?-oEK~I$Zj6mG4xORzBW~UGShu(|G9Qr zGZrh`CM{Kp4Igni9&zc@;Ipo+r+(K3O5M{IZErFPTHuZBYp~$$Dk!e4dT=Bib(hk$}>o10(_IhWuqy4R&7>(Z~fyUZ^0~Vhj4LWYWj>E0^8bdn%(Wqik8DzXKvbFP(g~Jj!an3&`6}rW+`#=CJic{!)0=-HOp&tE%KD zNlK2VSGQ)Ev>Ol77oRuzpr0Y%wx2U&Zu(vzAZ>koo=rSkSmwIQ#zt|PFI%WhRxR^t zBZD@cSR%epd@I>1#g;f<3_qsL^m50^)ty~KHn*Pho~DtN$}*t~Z(V6kNF&+jtqK;u{9t$Ym`@UwT^((b;Qo>QFm>f!OKT~LC?G5Gw*U&s0iodnoO zqIG?RrsYBarwtXjbo(;-WfhSMe2Hwr7!i8URFUz`)C0bspsI*oqOG5xR~NYttftni zBlKw67-923yW0AsE}7fUU8^diyK;FIsSL%*V%mG{IP*y8K|?OK`wR5x9awhQ3X^M_@FIJjxI{USs0o(;@(V zV9R^r2qm8>=gXV6vVSM+sm}KLm6Y6o3`D+Zvc?OqPg)Vj(qq}pVS5Uw)Y+=kQ9cNTA1wCl8LQ`)bzix^sVwERO8gHYF%GW@Jo2u zh_*$wEq#A$Z@VOO2TZ(KI4_Adwk?{q8P#xn5!o+EMzS*Ba$1I;9nIRl(D+_0;`N{v ze+^RLBoG*8lP%LSOVQs>63C&=r23kHa^tTwR~KF;Jz7Q7j8kc*K6^FN7^Z7!-=f#- z@WAgLfo$p#{uMvLqtmQU{Jy3@PB2w;&4mVrc??U%a50>NkwU%H@R3b(huTtSxKbs= zy*ijxq^EnoDErcrUDosmn?8^u%a?JC9p&Dt-Z^gX0uHUNPZ`6Csr%3vCAWJe8mwzP zm}%F4^%G=mKvaEU$Z^?i6=6(LOLgHwiR1t6D9Z*fb-je~o38|ni=H_EY$I@^Ew=@V zqS2phv@Rw}G37mWAVse~3|N`#0RkM`-zV{03eEbi2}t$6iRME*c(8n&)^QF1{~M^bYvOhC75mYI-eMte}+EN}Wg~;2H1hvwnZr zRJNj=eCs;f5!JCjFe>BH;MulGrOC3<`O_V*EnFECL>ohh9T<>0Wsm5msWOv3#OLR* zdsoP-u#h>CiY~+HTuY1h4u9NKV_*s^0X<@(+-jge(eN+nOh? zZWziNXV4m6ii3Zlb~M_Wn2mZGuLViU_lOLcr3vPsD+So7YNMi>uSBI(_&ZA4-Jf`( zic@vll?8i~{iip4w~5JrOg!#2vV&+NioiELvVaW;+0#kP>*B4X>ewQW2~%c`iAK?) zHuvnSrMceT8p2P8SI>5*>8{qq8(SsGb9;`cQV18i&U2$^LL0dd`)?*7%bu=%x113K zRTlYkcV^^?j8${&YN)4O7Oc&A!)=$tMEF7tmrYkcrOf{XF#}8zM|4i(YnosY7Zj18 z+qhmQj+g0&+ZOjB!ms5htDW>C5aDUTX*c$zrQDZ@%7|?aHr!9O7EEo+p5as^ZFxRA z_>SE9G14O_B>cYaQ#^>D?eIX-^&xg!Mab@WHGnVYWzjb#z~jhkl3G*pLy7yAh=qKOH&swRY4M zYTXc-TT}Z%B*UuxrNs+NrRbIGbp97geM>cM1L6?+$7xHEOw-*O)=qpGpZ#y&++3xf z&5F~qY z_UiiTRs6?7R}o+MW$9s34aj!c>ve!QBgfm_uu4f|gKsZ0Ev4dONK%cy)Ufznl|Ihb z)vZ!klT``qN=Q0R1KxLV@n&*J8Bc#5|gGP)CTeY0M7cUfeTh#^mNKT| z)S?pEIuHDX`Rjy(pW3QzIr?kt^QiOlJhZE@hY4oIghq0?$TviM<;t}sK zRVUhajCzO_Rj+l0NK!X3U48cx1nqe}^+t{A$ST(Mo$SPSUps`ov^~n&6wrHm+r{yu zZp77I9D)Bm)ZsD%L1YhBtgfgWkMAXs)sTGHCwiQ&ukQ*CwW`$*R#b}AKjPf*;(_uY z#6DL`7S1q;Hr>mcR;;+^d^Ldq^JP)cWSRB;fb%K%29N~LBUgaY6b)5LZhx|SaBRr? z3_8Ynz2N4DLmXYUE1&#S80mA2xQr9dfyi~Oq^e?HADGwJt43v{{>gh3Jf!h;{tr7Q zI(v7;FC%vvRd!yM+$n#%GcjstVL6ar6k5|;!gbUCCMQw!hz~PXUd;S>p9a`c#!g_V zfV@Kdwb;8Tnm3g)+WOuWFHR?uTpLgMUbcK_w{qdvhJK!Ye6QVIbp8&TO?hXAuH5zX zryxlXkHpwxZqE3l&j6MG3mc#Y1^Vyu;rWEJpM1+FEdl2U$J5BJRFe9*W-e%DD62^; zcg@Y|-_Fyo+%JtPG&L|-5Fzn)pj?~Kl)n3rWVJWlZ#y;O3L|;1)PC z?44B_(eVl9Q}~!>;>&7zffJW66y?hKpSz)54=Ct9e%Ach=b7h{rarE|O~j}5-CjyF zK&r_2jbI;fH&ZDeIwJdVcZ^%yj?SH?FC!) zim`VT+d9zL`YRN z&0XZfR8M*G1e^IMj6rjgHXQdilWKJ}Bb&>%&yOjK1Ez7H_EcXQy6-5;jR?9wO((8k zGK_ZeO8P#rJh@sywA2?a1ufZ9pKoDrH#3)DV2!7q^=O&%-+(?3>pY*0{f6OzqBzm9 zowy4+Lle5=B|$wtVykfr7qUZvv^43NJJVO$qZS`K$}yb?M<>Tdz1B_tQdymZK+MxF z$M3dR)N_*X6!Jd%6y5lMJD=n8l`5mcPiG%z>JAp#HJn?#tRwbHs+dU!U3uY_@dwId zulP7>FH8dPF7Q7;Bs+6?n?GX{AVjtGOq{0U3 zg~UznH1AC2sCr(|qQ$2B+L{3E)0g&RjB7jur{?~Ty4NxHVEemj z$=EdHWA?BD?;14o_uAWjEGy*ifc%Xk^zk-XHL2bnPuQLeifCp=aI-lH6-HY<0i94$ zL+4~Pxp*dgNiafh5zV1hDY(m8$?B#YeChBfG=6tm|dL|B_+9P<~Ful60h>;HR*ig>$fyF*{p*-GF+G%87;Tv#gb4$}zua(J?zS-*$tSKehBZzOg z?Io{&r+H0`uPzY8OereBIDqVJYc*=e@>dIap0m_Ud0ua&%J#&Ic+aL*oHt;L_lQod z!9inaOX;LJtvf+WW)Pg4wApC7I7oxOVv^7%dw!FzseHlOgI-vShp&t-#K|BG)+AHk8#$78GQfDcR?zNFMNm-Ym>a!+vn z^`rb)`Txy?+KQ410Xnw~8A%K9bSj?^=!F+=nosGKi_UVf39@Oib{B4JWEdJyTxAIx z!%mJguOBR6v3ckTjn1I#IkgwHRl&+K^CA{!?=%3I_v!?&sg?zZFQ;o@?A>Hdrr`CH zCLpC0I3D=w7~C1X>%)VE0~`DOEqLTJK%-VP13nnpe0diAmv9W0yo3k~vj^_>!!a8C z2EqRur5VdfNCtoXYs}N<`WP(Wp%%t|g6M(wy*JPYKS5~>@QXv{zf^88tVT2#^bBwx zV9)~bl+WoI(taxft~x3^!vN~_%>`Idpr3zlYcyJ^Qs4~r*KNVSgms+SMZ|wCAp(bP znjfA4hn#S243zZurUH55Y|Iarft$V-Ks24rYKYCNUw?1&tKorsz`xZLyhK0LyxzHh z#dQ6p#nVSNH2cfXhcC-=;Df8pmzNM!G5B993IE;x@wYSTe))OUg}EAFp+5M_t$K1@q*6F016Yo%=Jn6@`P6-j+ z2Dta{&*F4>MgMMosPRl2lr|XeYGAsi|Je<$DL%jcVOI^w>1)NWUOf*+5QX-2u@>H= zQ2U;T7ZH&CbYk$grd5<4`G}phC%B>1+A>`9yDpDNbpF*k3YuR3JEQr}T=?hQ`7;;( zE64dCT%X>^tCILu7OQA95IW#-F=72L9%PK#?J0;Q9E5X9Q?sNPS4>Y2epv+sMh*kc z&;ny~VO54XiN;@SyTcy$l(h_SW2I$QLG2>LIo2*Ypu#>WSsPwpY1YVo&avX z8hAY!v;iD>IaW07L<(}YM01I3UQ+(C3toR?ehNT2L5%q#BC=D^pCFm6pP;5L^zh%s zE3jRFE|~Nk;CmVj=f$l&3^E*xHb-W~5d^=T;e)SN!cTtyPW;#66YyW2&HPI(ozjPf z{%(QtFU1FcdGd~1+F`4}#S*+VN{61F`Tu6~HG2aU6n5jA52wKwJMhR~i$lSGKRUX6 z8a{Znc^_CKuS-0!vGMsbiS<_g3G#_XW&K^+`tonPYW`w7ZW0pGU+gOKOX=dDpkE#> z`>XZ-bj+WQ`7>kw;femtn7{qtf9lEqxUxTM%s87@M5F^{*nyg^ zrcQwBtPH7~x^Atmc1WgAD(M z4eD27%uoXfp=B$hB4~D%-F>#W`KOfeEl)srs9*_E#PN9<`SXJ3f>Aj%u2yGEow%Pe z6uC+smW_aKU<@nK+7}EkhPp8r!;(3zp>5;Mmg7@A%b8ZjKYcXO8xPrmXpFT}aG2=DyVc5*4+gh2g$r7Qhm-h0O(9(j8 zP9AL!h7r+Ed>#|2Vt-VhmQ!hyleaZocQPC+XW2z_VCe}@0D@+g%_tmMGY&qxUb?wZ z<=$3?JNO#G8~`AWB47e^-7Y_GiL^X8#GxvbS8G$cjxBf|YV)C|CU2i+=+kSH(YA?C zo>o33MbR63PM1cxHJ9L9knp__@f!H?@oV7eW<{f#(zPQp{TDj?>r#oICCj^by<%q% zAD5{dL2|)X8c>y?MmVBj!0vno5^NrvDqI<6T%gD1ow!(akg3&vg)QiDJG1c9MMnJ^ z3}+>>D+0@mrU2lJy`m)s4VqRnTA#avU0$T&IYZLMOX~2uN&uhkQ4h^w_TcK9gOlDE z=C830hvV-VL0h!Aw3gO*F4CvB3dO=$g-k?jtmLaKxry@E{eE;arpEP1---Q8y=e0I zj8-kcz9B7Rfxy0!lmRA<_GqRNWxg7H11+vvS5<{_i$iQS3L^ILIwYl3twldRJLw{B zvA}^OGAvens&M34ieyEcwm7`0#@<3X1iNITO##OBPY^jri0J*w@MI{_oDsvejJ*9S zLr#>jO{ic;ydl_iOl%=M>3-6~#4NoSe)8Ucp0vGBmcEqHjITCXGb`FvBNOF0AzIl1 z^0H$-dILRb(+hcNXJ_QcP}97L^{xFdj5ab4K?6uR+B63{SS&42*)g%9s-sJ7tG#MM zncJq_LwI?MSt2t7wW{AgEVI5R?8!fGZ23N3yJpY<=Hp$20b(X50-cc~TkL3Oi$x!G z`DWCu)rsgbL*qf7rbOyyM^@(oqb%Y_=Fo^-lMJr2Z$saPlHEe-DL@Ck0UsItYiO6N zB;w43Zx&WsxqV>e)*q$qlqtgZ3z#~>rX8QYKQ<^yJhI+pPe&8BncYEtf4^vaU`9&X znbZ_S8p7Ou!o<+1suB&U7_;p0h*0hq#C^zdOZ@OK?oMH5u}ucK5|z#~xg!uUj-u;m zG_Q_Bc_V8d(-V;om2pRap~&?7?Zwb*}E z+zKrlVn*MEU{ZpU{~7GQ0zg{;&T9G?20>0;vH+6whg}~iH4W>V(p?5*)!U;7-cd%0 zaM;+gJBD1_A-dPI!PPe0bPoeM%Yvgb*8>V?aMayJJ4F08D#C1?+;qkz(f*6CD5i=8t{;jEz6@;*U@G z;}8F=1%K9pKWo9CwcyWM@MkUfvljeW3;uhq1>;6r+h)U=G^dk#r`7oz6?cq3vgx=H zeN}ni!mYxtvf?6 zPXLXiL>{uqS-$9Od5xTGKxP}WJs~Z+#7t!Dp(hZ+bickXRwH%ISX~AT(Ox&zxUo|- z(Au6|(9(N!(U#*T+1$!ZvQ2*-o%hY?1Nv)4!jq~|{@DJ@xmqR|k*xDtr}O*UY?nB< z#T4>m$Id2V-W!@KWb}To_SN&4YczP-`4&&Fb_0*Hbh^KyL&X=vE;54B z5WRC<&B%fBDhWH~2apy(=K^I9P{#3sMxNMmfzncL=VWK!WoPFT3y_=Kpuybaz&>u% z0FGGA+rj5lLB789m$(4u%M##x+5VIB^*`BNZ8tGua1{|vMHp%&$T^i8h%%D{jMv9} z$rV;Fxh}2y6U5>VM6AYx&$X#^WZ6XPhM4lUY`GxX$0BieuJiP{?1y-rG+0rWEj8oY zO~)s=NcTy#xaQ52^mFW~l@B<5;l6*C;1!?~=$|w>46}9hDH8~;+9mi2l50+#FrLwE zh?(}-d*(lUcZ$98OTJA+`JVo?ildTei=$M6Yb4!FW&mVKGtf=x;T6JEO91NNwqL+_ z4Pci_$UM@ogE!L-Tj2YP!1*+I6uj;SkeLE8+$VN|(l0DPFYEK21cz?=pAF%g9}S)@ zHlHHlLCipjZ}5c{Eai5}gYN@z{J92GE!?Dzl1Bu^iX!ghp-*4m5x<@A&IY&a+!}*q z{;dp^_uYsjP!={3IP9mvVo8x%m%>;N(hD@WwKyB4%J!a>z$4^_j5u-hNKVghwF^^y zmB~pDC~RE?dq}>6eF4Qz^~Av}H%0LVCBO0$aq`;eSI2hKTMV^&-fpvz zy8%}h1Ek31$o^58e=DT_S0Cj@% zceDK3X&Q9t#4UV%kB}h*E4mgJEfHd`XQp!iNh*N90SH|I71ip5Bc6dTox;z)nht<8 z|LxY5-}|BLMZ^$3=ZZkBP@JWdfose8C0BrIHs4CeSDiSv&t}Rdj$T@M=NHkZ0GcLG z#h!RMn|3@6S(hXJ*QW{mRe8O;wZYS1A$Nn(+fH*rUAS?3x1$V}+^-+3KTj>GiH*(y z>HTZDe~gAQcI_e$i^;|L z$E4KBgoFdUo;R4bP1l*zrJ>*d1kL=Fnlk6Lc0{bL0d>xt8uk`{r_X~G!6>}h2gK#; zAe=2#katoaO%vBsS{obTsj_$E$L*HZ8yd>X%x5$L&ASQMD79VZ$!!HU{VUNI)?v*X z*J!YWWdI{4`?sr7v-M?bKarmxrg@mu1pnHoD1%aEh{^m+qvXp|nu0Y&2dZt-isYEa z5W|TFSGkKN$_xi?XuJwsc^wT$gbZivVyc|xMpOLU=S z#PD&#podn<#M07D^b3S=0~&#J$Ao!-FFoY}!-U>C+=H?_RZ>Yz#VQyT2GNX-9f4>Tj939(a3R-;`+#1aUc@16Mr`q&tJgLq+Hz>&? zVX1tHSmbIG;R_6y3D4E^UxYvjObgiEshKe;D_tZP=F@BGHP%6C5Kr@|D` z1&i5(YL2z>IK&EiKrr-c- zRdAL4QMaqLHXS*U;hG28+1piKGcg7)|G@ch!5^D8S=)w2O*OeTZVPr}Yvi|=;j2b>^c z7!;IQ_+wr^->}W+rD~W9#cftXs7v>*UcoOSr=G$vH?(a1A^Iu0;<040ewK#!ll~FD zrPs_cj@g9s50+&#w8Fh_|2R(K33do=CXH>Se;d8fPEE8lz_pjzG}fPPY^-X*Bk%Y{ z99b!p#Tp<)OK!4Ogj!!*ds|}W;jW8%mEusaIg(A|R=i^sU`TGM^Nu^ESaaM@ddYuZ zLpyc~KXLnmK09f&G~H`g1Ou&Tkpw@Cqvpbi>I0p~E;2msaI)|P1shYLvx!pKg#wIx zh~IwaIE~&`%z19c*i0^_Up{6Yh4)#dS%8Q8R^Jw<&dQMr#mf^lo^Dt3=mmTiDH36w zag1%&v=LP7icWcw@w)=iKnohfu0BH6)5tgLC0<`lr&VogPy-AzBG0W74QTrzqXOLN+BmWW^R995lZKC)y!L8-pU)AKi%bR z%@R+ir2F>PeU`v(7NqiiMn+@BUUZ;fYK}F#GQw*~8nlx7}WErc%eO@!9QW zx9gGGWUSvTr#0tO;oIQKp8w{iqyNz(c^T5`K%iky7=|&-vDGp&$~jVZb|kxekKNh5 z?2dB0byDg*f=*agZY?9Ud%w|i7p0W;49-{VUf{qMlv0w*%lZM2Ot@xy364COf7S4?2-8pQbUAnH)feS-X%2Zju`e*O!AkI>$ zRv^r_kz^TauXWlgc^q6u5b7@eC3Tt7cZ&2Arm>e4O!Dwb7*Tu zf_j`#G}nStZ)5+8>eEbMWqL-=lO*hRA+_wX}>cOqspaIQ}l%hc6lSy^Vregd=aSvAYHI?`?lVIbgzT(o~v{?DUmQ*2Cc| zrj6$Se>O`iWY7PWy3g8qlD$OJp^t`Gw!B=X{{#?wHHKOKYddyKdVc2BE?R>C1o*c8 zO@L3q+_73V@|s!OVkA*(_56)7EDN++8+u^tZfk!T#}KjvxyPki3YoVFeI?foaw2tL zDs5{?t0~N+7 z++e6t`FXjA*}-UEbrPUQKlrHLzXIn?HF1P$+tV8E`zG&oUChy{vJ_~-b}#qvSGz73 z;pjYi(U0#SZv0b59C2ipY(o4uAS|$UT$K_CJxpn|80IbD?;011VG=>RlsuTmCnCP7 zB3_BI$awSR2I=){TRiImbT;m(j408QNVx0CrhSU;tHwc*0V2?_7(#WG))IcLn^7m* zf_A}&ysxm3^C7J+j*b`3x6Jr=-COU;zMZff z6;aQ#PD<+{w>wcDse7i{7pxl9V=q(pDWqv|wIZvK%rCe`ReO++CYyxA=pSN_;Ol<4*I5~ZDI(VV_Zt_ju1ST^# z!gysj?l&s}kFYxR?ebiCuEF4YdT3SZ3Sg z>}DTfvcqf2osga6uu$>@rcYN=y|L7HOPI>73#O(FjAjg``tlTWyKux_d|zC%$<}** z;F*ovZ|o)~Q`d_k3`;W}wRe%ykR4SXR)jlSIrsPeJ92&NbwJZ(TAIMPD7ge>A4B=B^F96w?&7{hg9L3SPe0VX z9m~>ydfecNAlg_C^KPSa36~;FpnoV>8#|06A){JMuV9SNP8l3at8F_r{RlTE4Dvnu z0X>i^0Plyk23Kwp9=osqPf&{xcxA_B;erYS#AIa{Os-Fr4S~^jm4D?_(EmH9;*sEA zVvIrmCdLS8k(Zs}k)C79e}YCn7G;$>cbFesWj;Ow;*xR%brlc_#wj>kzPU-ho9Fbe zf&av0E8`;{1tJ4mES-OXDEPoXK@Uq55ES4g2lONBv>j$L6tJPL>yt*>fP!_@S-`f$MZc?1(m7~rh~LWd#_4M1*{MJ z=T?gogw(c@>$tOVJy}J$a7KX$_O9ZEJ^HUnS?<6FrvhGUx45a{ueAN-g7VGdv<9oo z83Fce?9vej+Q-hA(~P!nFi^S+mhE+-xs&Cuca?CT_%PK+k&oX0t#5)u(Tr&F)gQ(h zhe9-FS%E{&2EBKqMuu-3g;aJfyB*^`_hRO?zU8(Yw(Df;!7SeY`bTPJUISRB>=Gt`4H$n>Fn4)jevUT3#4oTDI+3T9 zA+_r|a3y*)V`%STz9;qRql^+b1n%M{&BS9ACW^~r!&(*c@J$U{gN9#7&ofRe{~SS4$09z@(@@GqY0}RUYPMuQe;hB?M|j}I zlzmtuBW&uXK_^m5EkV@Lpx*P$kWC}tw%x*4Xa7kYC))M>SEcRDW|gyPMryY@bpd8q z-go%s2lIg~TRj^J+~U6a6SRzlpRdv!dex~v5rU;W*r%Rs(4xH9 zc}oC)ELr#yYwbSxT=99E!EJ_)n!04jeMNapV_?O(3V0SLLpksx!u@asXYSTCnj{zd_;vy#3`T zh}A$cnu#4iUoQSaUtXEI24Wio4n%|U0ob`G13q(#4K;fG6D0J0$j|_|BQ6=a-`ZIjoR-Q(Rwg`AP~UeDWWNj^;ny<9m-j ztYY8(g*EVE7t?_23D!1&M>MY(1N6me__+j6iNzsv0oG*|nZ5yw^+bH7oGFkew$ zn!;EYYzy0TT@Wz1#M9ZckB$iQtyK6!@vB#!8tL`f-w|4@?t9(2#!Ab-;~JvBGW(vT_!tG2p*bFYn2(=Tue^rZhA$e1C7mgAQ2c9`21 zG%JokF@wn zJaVFDnbfaI0=e*(H%)6ypfYrXf%as-p_4A%w4LATi4Lx#a~KLLKxK+~h|bH}G9w;Y zuN`vPC)$GBr)eWA>#e@OUz=gmoRar+`rJP<+nbXeEb=s*j5H#5zj{;EVl4Jpw2{ZD zD}D}G_r`XLeXU@e$g;?t9k?}gA(Q|Cxo#Uj=$YGMo2}vCoedTIp%#y_i^5tqsn7IC zCRq7h3t+`H(5bh>JOLnN$Ytg#(tbzXeVJggv^1#gmSUp>oMO}V#kq0Y$;WtxXH;$N zVxQxP;(DIK9|=u;f9&I|^w>Ez&Fr|i+`a*zDU!GWfM$K<9*igx!;UKJxQnh^oEdl_ zL)3CU7_m=ra?Qn-L9;O^y~>$AXLcl8oiYrU(7zYX;flgxS zMrX9Dac4I*=Sqvq(O%!dLR_!3-R`BzAE+{XIBaI|*-({vY}0cr?Q)WTK31jffOa?_ zwHb^9k=2KTA-dt&f)Hu8ODtV2$q8W`cR=bIu{sieK}E4Wk?~;eVFLdc7qF?5gjJO zgc-=6nSDs^G9c!`m&l%E;A@=xb@#*u?oK8whL)YlnQilH_q|(6vFc85{S916`UcCr zaZBtN3wmaIZxor#bRID279Lb{ZQw6i>P8-S1$74a! z2#!vac!&9omb(j}&CS==#HTb~kKDi5(J(z%b{sb5Yim!Zd=Y6WHxp30lUDo%pnRX7 zW>rh+dYkgTH|ctZ!86qp2%M*>oJc)UZ%`Mjv>r3kZ?LRNQh6>cz3|mtFmrW*cflj} z)1(7p+h7fOlE?jkt(IC_DdMJ!-@R3RP^t>!jjGX=R0!CJTjJ~9bBB^a0hC5?17CH9 z$Hb6{93M5&OSO4R6}QBz5lT*bZG>wV>7*vp&8Iul~R(yEPWn8PWz=N#| z3%Zwn*UE;tO$RR5Fax%a?YMGlxcR%*fe8P`+lUwFVOOLqiR8KYRga1eHzsiHR|899 z24gACHt)YzQ-n zs(I7sW4$a8l|}_)weWoHYL#D_BAc>eVqt{bU3k0uu;^t5+*_tW9)DO zuz%dd!s=63fg!Z@vhgOC3Y}HrQKXdCZpMfL&Yyzq0j)FS3_78$>2`IMZ7PEyOHGt& zRuW<2SYZ#2>xZ;?{9YfTrQk_d(tsr5`t`R6`g1P1tI$KNK|SDjy|eyj!}P3K=pyUNb)D>%K-t)>9%&?68Oddj|O{$WdpSf ze!RHFSmm<-3hz~D`a^?pO-k;3935g1p&a2e!#WyXdW^(Id_%^ZI6L04U*@4dQ>hq zY@F2_qrlquGSfhvC%z5meGvawL7u&W&f!ZsF>))s_AF66!oTXfS5h1x3fh*i&d+z=Q!?y$p zlEj9KM`AegZL#zXmDLl;@{-x|rB)R4w)G_e-}WgZCHJ*LuVXT_9+Bl8d9xu^!I2Ef zrH_H#Rr^uRG1QGB-vj)uXpm|fj$h0VlTV-Vu-2>9P_(G5sIV8KQ4lF|aO0g#s1moW zcD@pWqM2_0e78ZRa^{x1{7B5e)q@EsiF?(@9fXBs0)og^nSj<*fmQ|X8H z_vp9Q#vctv?nR&yx=v4o_At(dlA%3)&m>G|vvL~UW!cC1i@R;88N5AjdFt0j)V=be z2+>tNUaoT0#jh%<`fv?uOQAq)arM1lVb+i9sTHqw;sFlFzV{AAA@)nDS6iuxt^RU(kz)l-8Q+rtL zxSA78D?smb-WiAGXCy=MtH`k@s_)wa^q=(q02A9+MdJbL@3^wJJ+d^$?JG^eExs(n z{FbKtTU++RI%E8NtJN`x;pf8b#E#t!i6Fw&=fdW>brvmbml||0*EwYC)+*zLb{ibd z7cjl9u3w}3XBG%Nq7mY6VFEcGMe0c;tnFzxOWA80J`Y)8d>5b;O7k`z)qQNQ z_kYa1k0xl=bn=17cmiGwHJW5@e1I*5R36CU0-EOD3)C=5)Id;PNYw(>ym583W4QR6 zJ&^+YA@jRy!J<_WbIb|OcY?VoEkUyvr!8>cD85zEvv5ik5vkwqWZdS!Ngo|-HAI2` z!u4|IYa@@u^Jbxd4iKIn?alp*2g zj|g1S#|=*cxzf&P9Aw|aH^z#W>)HP!Y%0h6a~y;C2WkqCSYpbd(02F%^B8=4O|8AG z#+X?pAi0C@uC3ok&{Gg$6$_3MB}gWS>la*29qDc%_YR_wWjK z+5&$J;pqe?h)jdjfL!t;&!5vPsB7f2sVOK@UR6^w83ouQfMOhQdAr~#pcv$=0vgd8 zwY{oFLYbHze>*qH$Tl7CZnHdi5fGL+aHIcch79Q8M$#p)76bs;$}d!s^53W=I{yik zWUbK@kXe7u%*La7(!dwiWfy<($NkYdM)a{b*A;(~CRfC*H(^%jI^%4MP zu2}vAt#}C|_Rk4{k%?yD0QO%apADun%bkDwZa9qwJ_H8BVZKd)&zQpTBV(@M=DqU} zHQ&i6xY7;UxKd5HZCHnLzr1qv6NDiF9{+x0FuZw#ISeUFK`_0{{?;^Lrp{ve_?*M32+4* zP+2>D0KtJBplU>7MH7FkQ3SdH>wgZ%67&GO#3KV<+sj1wdUo?Es<|_|LI87=fW?ZV zCtkn+j7aW3YxnTe^1Kr(fC~`=@HaaD5|ij}J{&Q>KrbvCCjMV;nr(^oO)B1llsw1F zWk+S-s+9lp^>mU8nQ3|P(t@`mggMgczcA;)!_ggi}?K0wiUmRoc}ON!2h)U@Nbsw|7~n2{Y$s-Qj1{!X?o?qM-5c?_rXE;d#8Lh z82x2fG5>Se{1;7oXxPqJ>*;5*x!W>x62LMz(; z#bfCC-}KMV|4%T%E5QNmHe9j;$869G5$P*{$-E9?D2QD*HaMWSty;Ey41+|-MV{EfW``kap&8~KiK%|RX?5w-jyy3#7Knwl@4`0is> z$zl20_ymTwV->=+^kz=lHHdw>qTDIWNyVRh_u}ex-QRezdGgjsG1GYfB7$$Y9T@ci zrW<=kG@W!RXz?%}F=y`EH#p%S;hpwY0^_DC!x--Qtshy$=%iaW?saygHi)@8-D!Ck zNp{lzw7@E{$bvuH5>8L|b;mW34577^L%5+gSn&9~`egg!3eQC}dCeUQ4b2YJ{Z8_; zln-u5dQ!)jc}3zXY*tmUepcJTEr0~NHW(#jJ!4<>zK(C%$YfY(Vv9)5j<`kQkrcUk zWY;%1k0Cd$eW3Du{kTgHSSi0HQ9Ui~blER_EPg1m+b9~7f}-*~j9v8!0b7qj-;{)cNl@14hb$9baVG_%UH*XYzm+sS5;0g1b zLXqz?L0tez<`k0v&&Jvy)2FED9mMpE5;?cVNCmlHW@=>Ihq{u2%hd>`E&^7V0Wy7s z%@AcIa9{bdRak{O$MWvg7b?-UI!FP{WC|@VijW$zrV=@7Zw*$B?Ks(59r@o)H&bPe-5bH zMOSQi`4a8BajyOFib;ee1ex$thnR+WT$r>(naoyN%oi*Nxnrdj1}*Pk+#j+ii;$xKe-j07CXwm**$}0sRzW3GagcfJO z=;01lv&MerKwKBYkCj9K%p1Z?zl;b*Ml2vbq2};Dc<5JYaD_&Y4qkm3y6{xq)hF5dhZdm3g)7tz!v%>dGNH4We6YmFm z^F^<{=swm=-A_6=;7sz}rU$(E+Xv7}_lM=k(7Civs=HB1U(v3er6)PZC@%Sy!#VnmvnY5lL;zmf?=dYGPOK_BPy%?)VK-~C{Sc< zA~AwK#ZeWzynFNVqxM3GHoB#|(>Rhxi1q|nBseSkoYDa}H-d@z&-1+t2fT=9RDYxs z#yD^PhJqy8RTY!xY}MV$*k(eRdra>uws<~>qC>H7 zs&3muwl@$7_P+Nkj`wVl?T8gZ%`nUcAGMiii-m8h1>m6<^)Rt)Dm;A?fy`$nY5{sUGLrhbm8RR4H?P=*vB_|A8&3-zPi6ofZy)qdmR=tWKn#U$P=&GBln zQeo(J*1LRnj-yQy4n_KqZt~-FxR@Kwv+D$S!L<~Dazg{$d^4*0XIqA^+b7U+e&8sv z+gpQWUPyN@+JqcCom~9;7ha*7Uh9^RIa^o~jFZwmzh=kl8vC#;q@_YYn!7PLVt^%< zjIQh$ede}%JO6F!nsLg}XPAnQl7fclql2aM3#&ugtzoQ#*^KbYZ5b>Z@vew^90Dvw zYmga1=ubU&;pVpHk7`!!K(h=xMwde8(w9yfBGfD`FxKttN=K-!vPjJ4B#~FAs=}mE zm?3cj19$yviZ?{ToAx@%%(|v&Db5^^r8Ks<hkZ+caSlbX56^n=q`0+B{q!F zdIH3lu_Ywj<}cYiXLZ2~1_kFF`+i!Gb6hV*CI7(w<)W&%5`{x5V-w}?eY9E)#C7j2 z_|(fJCaE|fr1+nLyTBq9Hw{S z?0sPII_@`Nhhsq|@x6Lr?#3$JT~CoU27<=o8YY%oa)(^E`0eP&y(fvF(?Riy#kQ}>5q}Cta*c|~N_lzZX*REfcG=w5_p^~n)gTcPk9yC0L7&sW4kTVb zaLc+6r|COXF-p+hV^4?+s%O$KnWw0!LEb3yWNpgNe#`OMQR{j{?h)U*sh7*H-IdbY z7a+sWvd;?~P>9}!bTeXhYTg&s1ZPg^)4{}H){V_0t9fk1 zwZANO+z>;84wCvXN5e+=CEcfnmXvqUfDRB(=o48`-1B8HRhr%Ki`|(`EX@f6*{)sp zA3bpdZ~HW2S@C%EhW(qMT|jc<1{&QC{{nl@hAd>$l8G!u<=QsWktU-m1I~k={T5r+;A5>C9(5-{UTnIARe;F%Dx|3X{ zeD376{SAdQfEBJu_sCY&aVvx1Np-~4RSctWrMiOFEAqw0^9%mCp*<8$v|- z&SN?`;O@CzotNF|x*#DeTJjIL%Q4m#A$w}j%{<>*;ruFw zDR%J5w*scbMHB(k>=%9x@H$8rh9A4XgnpFrf>0Ob2Hae$Jrc~$eKs>>B)^wxq4UF$ z3(!Cj@E+4+hfZP2{hSW23o(t6CVAob; zI?O%XPXP+P;UEdD&qGf>960+0>6qgG@>mQjuXamiI3)DR!=SR!Bsql!%OAd;Ll6m#JU60m~)*x2w8YF40YbmSvqBF64R@SJfVjZ zN58lw)GX4v{?bIUsEvU>Q?M=d%Ml96o(n=AKK#v(3PyIyX}t}wi;XKa1%S4kt!3Rg08{mg4DyDR&>onhS*;lg!8>U&}?RXFO z#VTX*lf5kqeF+e{uB>;Fb0pSMwu&cwS4fX~f`SoFjjArG8=t!C()}%91~>vx9=QRO zm#;D3h&1J`h4z0tGm7_6EpM|0$1ZQ2D`nUH95++}zxS?H{m+B6U~ruFXL7u;ci>~pTrtT>Mkpz+-s2M;%KBn_|de;%#( zpETO}2UzKU!naWu5@o()(0;3k#1#{@M(!f4k+6vQ{TZ2i@+2qt7x3Qf9|&Zr|EqV` z0%G$Yu`yE4gWKLK?m_N0?%r?s@3HaoCr9mg6*doauz;k>WAKHszTN~&g6K!?7VVSw zg&$Yw@S>w3EhfPFzWMn$J$M96R|A$YS$r5z!z-7dlUDim;o?X^jDJn^?!=cxIWB;2 zr#LwyUFZ8(O`TU-fFi-LFg_gsBh$dir{KZ@5@z+cN&~WI;t%6$ZCeD*+M+q`n0}bJi<;Nz;c_aF{c&KHXv!(7KKhR{ zq6l(js=My)b*c@qn<7v~a^`CNrQm)dd(v1*v@3(eB(?kDpmJowN9tN}Mum!zxR??0 zQ2P=_dM77u3M`t^%M#pZ<}ZRsX^{BZk8Y1$zoJ|SZ)0WGk0_%gIXIXD7$d#onfG1; zjEU55=9P4j_yjan?-KtWfW`aMmJp>eiq8smi7g%EJ9l$d35oATN7>olBv^5ITl-o` zx(HJvQYB-WyZ5UF6IFyp(|C#!APVHx*$PRE_#f+%KVaFVTQaNuNCuuc=$jmQSJ7b3 z19!dCw6}LPcO$FOf`Z=8q$`uBens|~N*0_|S5&da5n7Ps8J@0q`2Q=2*P{ z@xZjUGrkx^ifo14;p~rB2wU~fG%S=hf89MthTn(x!y1jXSl-|GWqx~m9doxO?5mU8 zFYl)Lww3w1nTh5ozVQ-@JreI#Hv?wJ1OTnQD>P)Qa&2rO(JNp~#hG!OUEZb_z`%9# zjzX8KFTr_OOcK2RSrU7T;PIr?!e_y95XIR$^K`uhesKn7?KYwnS*D;&i+vLCv`HQ$ z&EPB!2%#ZGic)j|byhSQlV{9vQjsK)P%86kjzvkrA)!m|xD!w4pmNQ_*o=D)xt_tt zA9B_Zm1D03Pt9_wQuN!P%!T=@A+MA{S{i6_`Bn#&VcJ$J%&K@56~f74)XE+{KQ$wlZ{f?y`bvZzg8yjXXvr}|8j~y=uRRzil^}@HY8nX} z<0ys*P^C2`10&EgTUebZT#ZXY5sLPZ4hHuO6_q>kb>CFUEVT(ksxRO=N!$U7BvbQR z(im8y(nxDU1-6hW;R=wlGp0Zl7$}*(dTH1%RGHaC3O>c<6$6zOXeJMhglgzTBWv-7Ch2xK7@t)eFsj(gj*K-~>yY0HdP~bys<8U%S99WqLi}21v1MAkhX-iDa2C z?@ARfsVsZCVKO&knc!+5@`fzS3tI3G4_)X34cxVdaw7sETgderiY?6k!j>{6i#>_b3!``j38 zQ`TqIJSKnNps##1ae9(%O)Lt zaTgqBRMIp)r$!q+oXJ}ZV2V~NKm%hCGTY_G%9p(}Doh4ym8CW*EH)M&EBDd_3|BcK zNL1+Km2~Miww!gU(BO+ zQO0rtKDRo1xGBFB)KkW0%B`rJt*yOF{yb{ncoGM_RHzM6opC>>STZnVQ_5|GaU=Mi z$BsnMYrydvPQ_(<qW(##t|AU>95x(3iN%LolmBT&wjcU3lTF1w=HuT z>3GKV6_m(_1T60ejdVok#e94%FO<&U~p9xgvYQ+liMy*Tw@(jECYLGF;X z*S4(@=~hX2KO)R%4YC=H!=*I_ypL49{cld%pp6d~CnG{OKcnsy?{v;zMrk$2DK@up zcVwNCG(MfYa9C z7?#kDUSYbY=h7_8g~Ju=hc9eq0)F0S8W;{)zO3<|e?JyrHcYMSD^G$X?i`O}FMoJlk%=SsMLeJWK-2z6pmK+=)wb)6?*Ea3p#nx-Tp>TchepNM_ z?6ia-@9|Ybzj5gwOoHFp1b==0yEbS~grp3};30TpCwd^9G1h(QJ!5Wx1i)|1bM9y; zwC2w((8Hug_r`Y3l)9B*aM=;7=?_aYV9J^!?7W`HvqHZx|!w^QQ;WgX`Oph<#V-Jf}tjs~p=f-+Se& zZi~kHpa7sHgUVCUcNnRm=%2}3B&gY;F z+y|1i;{X!A!Ae`QTdU6{>ipjEhQ=T=XZ=Bm5~@B0<2%=oXj;ym2SzW}LDRa8Ph0S= zt=~|>JDFi5dlBwd5A-z)XPSGxI(6ALTP;f{G4d6WRVIwsZ^=(!|hXc(rLg6rt<1IP7Ko zJbm*S#TRxkXyLHzoW~dTrZM-aBeK8mBK&x zi}Z@iL|C^5g*9GM`D#lPkwRhDVf5SPO(R$)ik;F0(^p*)0c?$P?vB{2Hk4K=G*?%} zN#;D+v?@up+|8UJ4btx>_OP5!uuR2}@3=gf&j>LX+FNLGT=}Y3@Q9&Gf0hY(ZfBiq z+VdC@3~w|($^9o{Qb40n;kCGIAloTG_5-CuAmxD{XPycqkOvOwe;SzkMN5|t@N5#{#z(@`hle{d?N-t6sQPj4AZ{_K&q%h}*A#g$OF zG`SpYjXTKy8^F4FFjpr0eS7wZ{MQu*l)}co2%^_J{IM>W;?VYpJ;itnx1n2SdEey3 z0zXklRCvBtxh=mu$==s4kUbwd%pnO;Lz(6pk-^Ez_yo&nf!`0iXxYpB&4PQ3+V%XE zFQYH+G;qcU_}%4Iud~aiuV3Rs28iP`r>FA)l;mes)EzrQan6qD zMz?LY9>7EuT7P$D_0|`#OY+)mO-=?}_As)nnp_SGTUMFVm#M2CU4f(F206vxD)+AG zSoH^#1I1~h0t=3puRFZmLBPDC#IJRsEa|S^oP8vI1Ftoo>@#gsR7XL0==-*u346Be zvZ_{o-OO6vyCW_m;RR$N{fZdDwH|x+OE>;*(=2P}yZgVqMNUc}i$3trDxygCG_oBP zymct&+8U-U<$j7(EL*8ZBFl{fS|*_mOOCvxcUqZ?Rb}=i2CF^XAC^;uYmD!|Z8=mu z@6%u!qIu5E&JY=m@5LsKuU-LkJ@N_2Psl%P8bJN_Wc65Bm#F)ie9|rTwMDF2k&=XW zHA~J@tJ5VUW%A=7A}+^By-#GfwX@4giY7;Gez97{q)xTz?ZEG{xhIB9$Ua`%!n!LchUCD~aQHJx<&I^Al%$MjDP(KLaD^ zQHS06%;EJ5)qoJBhy!2O&WYgpzlk_>S5F1PS$L5m4#+(42V^V9pPZCeHOL=Y&qKPx zCJ%`s*{X9Szf=VxTUT7*sNddyM`}2fmgoMv4c`h{DJ34sqek}qp2WdofMM?Uc?6)r zXf{G1&yK$zip&7xMHD-fsDG4%fL~(CnWjlox5N2FqPi^i;NFnYF2ds*14JFj-nDGf z*HiF#YfZy}b)G(1;Z6wNf}3F?T4=hVK+Hj63N|Pr%_!++9LK2V8)p1fHB4D9uuT<# z#{6Ar(x8a*(XYC#K$=PD=+@`pE}JYz-HvAH`R8`|ZB?v(yBl4R@K%L_%Jsr$sog2Q zOQwb^uM0P29hq`TBh2G)POW2jHjzgAK=TBPnD%EKgS!E zO`-(Io1H4uQ2btcLDF+ZQQg@&YQK}=$SzrsSv+08vjdBE-^-qUeU>23Dd^3igkGh9 zPv9WMe)$U*F%Ktzs1v{gAp~IvPTCH$?MfAcS)tTzm_i6dWhG;Dpg|}3DDde)LUQbU z(za59{Rw@uBLfkJ)8}Nk9E2ASIc>pd2nLaL*iq0{1`^kN?Ro3h+E^}>lw4As5EF2t zi?OZmu-Txu6J+tVaUok?)10fT%<1r&^m5b{X|Hja+a)3)-Nbtc3O9V#dRFkb+`X=) zAZRDdKg;W^(8@p0z>yG)oGE`qnv7t2NBtx)&@G zj7L(f&kW#!_+m38x)r6rVQgVeZJNocGinmIYJ$0L{q)oop%e*ecd`@It2$$9O_&+E zRGM`sZPK^0{?bp=zuKu;M-%>vhftfKR5IL?@x*vK`01vl>=9PUmYPyQOji6mm8`Ls zC^ZB8{%RPkoZ$$+g@(z`296&CgpShHBbe*qEhT=kFd{GIVIkmYRfawY>bA(mjXq2b zGk)`qhlFrOhre*cJ;{F?;!w2Rg^!S1kg<-TJ%6h&EwZ|FlumOo>a?#^t3gf6tz;E# zHG6VhQ*j;BPSCLau^F}NrCLUb;GrA%ds;r%Fhh)ISzx=IIej)L+rX73>MiwJ zUdI80R*ZRj(=8_oSkjwr=SS*=Jjw5a`(({;IOURN`sHFg5Pm3HkI(8R5Wh^;O< zU?CjT$*zD%f*xjWHv2hQPVe3>CvZ z!ZkVS5&Ty}c>_Lf^mFXRz+v>{GSHJ=-rJ!*Tf#fP(P+AXB0jn_!o!8u1!PWVi>?ON zDibCo6V*vq|DE>P0`D1_N_cozz2J(!fd+L#FLMvF&$|El*iRe^+@&a)`KkMh8c&SNFQ9Ey98Xv zj!cl7Bg^|UY)X6srKou{!XIDotq`wtNDsb!hfI}Jk&uf=XjnYy&3hEoOzRDQ&@ zd?W1SiSG=ba;Qw9Dw2(lPo|DDsn^3H*2Z(UD*-8ggnGXhe-Na~aC*>B60s&<707vG z74=Ap1f`|P`U3o#JM;aEiGZ{`hsw-T{kPf8xCH70zwb77sLWutlnY7>qb4w^&p%oW z?$KuO$?A=M5Y)pyD3zYKZwgFL#X??8BC`l<>IG|lu87VLO#WQF zsWa+rSRts~vK#o;!ou=1<3c4VYCj2@u_43qOs*s~DO&ZmY)g~w#qw*s%=h1s7n1)& zUH&DH{pha`+H0BSP80ro>7++X$ag9B4)n)Qgw6M7)9?D{>#Xfco%o%4gO0&L?sl?f z9A?gm&CWTyWFw=v76KAdv5+g|_=Bo1F#fOD43CAQS96hF}?M0<_>40llmbUsX&MTbW9yhtN1t z$!R~)KCV#5g`4-T<4)Njc(+ugHvltka74Kwr&8ZrIa(F_*VJsol24{pT||FX&w0)a zoFW@rh5xfrz)=rQZX)WHgbp$#pO}!j;ZE0~7UnT>C?{ak#Bz)iKe{M636IXkhUL0* z1a4WtS3fFW}^TaaL9;6(ABeeIV}LlQ2+3Dt@gB zBbmq17(fzy4>BpKFJr&4R5O}!IYWks7D~v$`M;zt8Frqsp>5K|W{biI2JboF!d;=} z-Rafgkg0|{ij2NJUqe+wAyv#T$B0Q_4 z)`PEdyrI8s7}=AM$`pk4N@16R;>HJF-R-eK+Q}F&El$wSOXerp2_;3A9&v4NC8`Qa z_0|EN!UfJit^mE-bcd%emo}oUV;ioEoFHc8!!8f_*T0UBECmy%e&q~w5g?b4RDCzU zp*)kZUhx+{e!Eae2mJy!eAntr!>QeDNvK%H1nU0t>vm^J#HdPpnpB{_rQ;nLpBcSLy=k2{ z?ssXpEE9>)*gCLinsWDD6K6N{i?HX5(f>H0L<1YJu}SN1u<&QxIyHR_?fQJhi)Zsd z0sE=rla7(dXQebDT=#l$M4%d1(WJw>)NIO+4AMva*IYmL@bt+l+3? z{`tIkY;vhCN^w2%UWCnY%qm1>Hd0Pb(ApHKUqC7ovO9OhNxpHX3F$vM;Zf*mj1wRb z)~q6zuzUOM#Y?dX*~+M#h}N^ZtyAPEXOC|Xb=(SHil=^hpKyV-L0vK$gTqe8iJKUk zbv$0i{>;)hyIZ86oaZW#SQV**umbF4Y^iTUd(%$ZbX{j4N6n%6)~`wTv1hrHf<$D0 zAoWt^di^yx1sRV_ISA^>?_RF2GO7n#C+kNHGx-grY7DGj?PDf<)G)@M>@{JYaa-fn zoAQ%2bM-Gl0z53@Lo-J)`n2?iW?m0jU_55-eD90TnTrI7)XO~K67e9VY+WBjuTiy4 z4;Pm@Zsqq*5k4!bl|y}pDe@>}L0T6e-!o(z^R4`T3hRwq{?~h8eQLkpvVrm!qJ&5} zC0T%qYHngZ+Ii^kcW)Y?(iu(;|Ui(dJ_3HL7aJalBQD0)HTWMqqm==jEo-#nY z^rjq6^I-DXDVU|-{cA@x-5YX*CrpIQSO|trl-Qis3qN$RsXj{cA(Bqo+FQb;qhr>z zFJlH(t>qwT?B2cPMiUz48qMRJ#_npjG9CBldABguQ<<$H>+C&VS{uz_iEj4GqS`DS zklv@KXO1Jm*_Rv+tA}w2MYO|iUSi+~`j!vR#;$GSK`Q#o8Ne%z-H){CCH7ES@ zZz!*7swaK^+2+c>MS(>T4^%RR25kAAeiy+l$af2JxO2-KUn4Qj%K26QVavDJ1Dg{J z;wPMhzh~d5Q{w!r3;e{OGU3wnUJ+S>)p&;~J`KkTMXQEOuV(=b3M#_$qG)B+1Ha4X zcdN?S@J41cz@#%a=}^5`z`Xc2p6krbAv$25WG}%L(s01uPAZ)qCMk(=O$1EELRNxa4`zX-hcf-gbG1MqB2aohq)R)DuL`ytf`&Qds@pqRy+ z`y{!ouJbRSOkL-dmgY!{b#lkYk^Mz0HI2n%wj<+AC;q#4d;yEJ4DdRbWBREH0^55uu%6W0&> zhMnT>Ne!P=xN6nt(|7iL^S_1XdN6%Ij4jmN**JmTYIi~3$wZyzg$E4cM}7MtJ(l-D zH%L+hsiO2Tx1wgKv;d&wScX7oudcJTZpKfYx&K&C-^g?rm$%6F1(r=^ zL4s4&sN|zUMT}6>^1Xl<)&oE7aKtE%;AlIS|hm8qcQwa9^FNdz{P$nevoB>W2ESH znnsU4+;@-+spe|ExhO~=*w4KYF63*hTG-gAl*doy3*1#I!4XS86GQg}+>g?2RVE4f zdpuMD%?}Kb;yxxsvwncBI2_}(q;}XRGJ!+9rWX_38qDsO;#fAT{Jb!f#Y25EIx z-QpJ%hgTs$#h|BhAm+YSyXA@E6vFk#!D&qOytdj(HQ$$*90EOC!m@ivH*Ucj{*k+i zv*{^)ZT^D5WW`tWXF?sCR2iv1^~{?RV*TJ+X*0**Cw1P4WV{%L#^rw%jQxQ~<9Kyra;t&`a1f#LQ6|<<| zsP#?L)M27ytcogNr=EYgn=paT8x&me3?%-j+YPG|?!Ki?W9WsZ8oPo_2!FCYI=j@J zx2|icRVjOJZ1CW_Xy#<0LDfs$ZLAPr7Y)-_OINwQWG-ljDfZzw;vWllQq|13bNlMH zHYDGj_}I#|O6cip6eXxcypNFecv9Zwn|Z20t7C&LX%#$LwCcP5TxaM!+dsi?jHnvQm;YU@TE-lDN-p-)7!K5L^#Q$yPm zbEdCY=+T=EqO+bw?Ife8zUk`U@5{LdKNEr zVVkbg;OJPWXw6dYVNbF(8+robxG%7X-X2xJ)ciI|KFo@ezC72-1(#DoKGSq51;AD_ zv}p-%z9vdQt@R_F1xOn`Ep+TtFX=`He|@00Dw3K)fbBIB_{{6LZ`n;e={gZuW+URc zP8<8;3+UFqAs?p{;*6upG=0AtD~9?8_Lzy>L+J2<4;q^Tk%{~b1s`D`c$}87%q_c@ z$~E0b@?75@W5%g)P=M@{GJgV*Hs&~wlD;shV%xy(wyq_c9_qWA`0PRS=(tMn5kHl> z7MOI=mc4-d{1vuaR5Mp~RpnOH$#)e=jS2oqem)%HZ)5M&1Y*@m8cGjod78nRmud^! z^|K+b4TdX-tlpR0giP?Gio`xzxwu;hwz**W4EsEgc>K&Ozt8k|*$u1#ytQ1twLA%2 zy8d#WY*Wb`&6`>g`=*qbR}>|E;;9-$>1s45%7nPSeNM2ffBDEDpbnTP6!&GrCj00Y zksd9^Arsy+3f$aN?O4q|@>M)77+KFY{LA?yqM=T)e`2hYL<_6H*h2 zFk-JfX)d0R1LW;aJeW&X;%U>kfs3Ki{X2nWi>iB)W83?KvIckLOZq<%z643M%hFPQ zqS9z}@MvBZarx^evd?BK*udXV>Wk)N>d;wU05BX}$bV{MOpXZX2zJFtlg(YRRm3Eh z13}Ie#s|W;G5u+V6z)`FyNzC-BFD7crdkzdI5-1r7ZA%FyA- zbc^l;;dc@*e17h=A8!tZ+asas1emssl>JpDG7$)Qe(zSP+vU_MA*!hG!aMztlNDNF z+{(T8JNSi9df<3WK3ZANG;{iOZWC?OF9WUDfho>Fr3BMe<=DE8{NAwWFuDCNE6o!x zD|P`qjtoLAR{&A;3+G81(1crD1nKSPh|_k?GMn_yDECr>RTDixsr=)}Gfpk?3}6`W zjYGCAP2%IlkRPIUz{6$7D7TfR20U{URpow79Ydx1-7wiTr(;G^4otqd)P;BiD-16# z67fpX6k^D2ixh)zC@3UtTIR_Ef(rC30M~4L*=zKddZC~Qkv(r>jQeGUa>C#`i$Z^- z9@^(33&!57!040o5JNAm-W&0?OrI~)6ZsAdb@dqe+iUR8dr;IAL{jZpU+kYl~|f<>bZhxLVjo4u-}O7�zo<{7Tb>6Y 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 Programming +Web development +Django +Sentry +Sentry homepage {% include "blog/external-link.html" %} +Sentry Python Quickstart docs {% include "blog/external-link.html" %} \ No newline at end of file From 32ad06f254b170ab8b4b3d1efb4b5082c3d3f0ad Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 30 Aug 2020 08:08:30 -0400 Subject: [PATCH 222/302] update changelog and fix typo --- content/pages/meta/00-change-log.markdown | 6 ++++-- ...09-transcribe-recordings-speech-text-assemblyai.markdown | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index b2e7a993e..b3d21b0ec 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,8 +15,10 @@ on GitHub. ## 2020 ### August -* New blog post that shows - [How to Transcribe Speech Recordings into Text with Python](/blog/transcribe-recordings-speech-text-assemblyai.html). +* New blog posts on + [How to Transcribe Speech Recordings into Text with Python](/blog/transcribe-recordings-speech-text-assemblyai.html) + and + [Using Sentry to Handle Python Exceptions in Django Projects](/blog/sentry-handle-exceptions-django-projects.html). * Added new [GPT-3 page](/gpt-3.html). * Updated [debugging](/debugging.html) page with some additional descriptions. diff --git a/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown b/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown index 775de816f..61e5084b9 100644 --- a/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown +++ b/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown @@ -3,7 +3,7 @@ slug: transcribe-recordings-speech-text-assemblyai meta: Learn to transcribe speech in recordings like MP3s into text with Python and AssemblyAI's API. category: post date: 2020-08-09 -modified: 2020-08-09 +modified: 2020-08-30 newsletter: False headerimage: /img/headers/python-assemblyai.jpg headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. @@ -38,7 +38,7 @@ comfortable with to work with a database instead of writing SQL... ## Tutorial requirements Throughout this tutorial we are going to use the following dependencies, which we will install in just a moment. Make sure you also have Python 3, -[preferrably 3.6 or newer installed](https://www.python.org/downloads/), +[preferably 3.6 or newer installed](https://www.python.org/downloads/), in your environment: We will use the following dependencies to complete this From 1b47c231a828211892bb3b86f15b81b8d92f89b9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 3 Sep 2020 09:16:25 -0400 Subject: [PATCH 223/302] new gpt-3 resource --- content/pages/10-working/00-gpt-3.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown index 1e54ef4ea..5e2e78be3 100644 --- a/content/pages/10-working/00-gpt-3.markdown +++ b/content/pages/10-working/00-gpt-3.markdown @@ -107,6 +107,11 @@ These resources range from broad philosophy of what GPT-3 means for machine learning to specific technical details for how the model is trained. +* [The Ultimate Guide to OpenAI's GPT-3 Language Model](https://www.twilio.com/blog/ultimate-guide-openai-gpt-3-language-model) + is a detailed tutorial on how to use OpenAI's playground user interface, + what the parameters do, and how to convert what you have done in + the playground into a Python script that calls their API. + * [OpenAI's GPT-3 Language Model: A Technical Overview](https://lambdalabs.com/blog/demystifying-gpt-3/) and [GPT-3: A Hitchhiker's Guide](https://lambdalabs.com/blog/gpt-3/) From b586659e03ea7fb84fa1394d1e6ab06af29d6071 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 20 Sep 2020 12:16:54 -0400 Subject: [PATCH 224/302] update flask examples with latest updates --- .../flask/flask-app-badrequest.markdown | 7 +- .../examples/flask/flask-app-flask.markdown | 4 +- .../examples/flask/flask-app-headers.markdown | 9 +- .../flask/flask-app-immutabledict.markdown | 2 +- .../flask/flask-blueprints-blueprint.markdown | 11 +- .../flask-ctx-after-this-request.markdown | 2 +- .../flask/flask-ctx-has-app-context.markdown | 1 + .../flask-ctx-has-request-context.markdown | 129 +++++++++++++++++- .../flask/flask-globals-current-app.markdown | 39 +++--- .../examples/flask/flask-globals-g.markdown | 15 +- .../flask/flask-globals-request.markdown | 38 +++--- .../flask/flask-globals-session.markdown | 32 ++++- .../flask/flask-helpers-flash.markdown | 2 +- .../flask-helpers-make-response.markdown | 2 +- .../flask/flask-helpers-url-for.markdown | 26 ++-- .../flask/flask-json-jsonencoder.markdown | 8 +- .../flask/flask-json-jsonify.markdown | 8 +- .../flask-sessions-badsignature.markdown | 2 +- ...ask-signals-got-request-exception.markdown | 1 + ...templating-render-template-string.markdown | 2 +- .../flask-templating-render-template.markdown | 18 ++- .../flask-views-http-method-funcs.markdown | 4 +- .../flask/flask-views-methodview.markdown | 2 +- .../examples/flask/flask-views-view.markdown | 2 +- 24 files changed, 274 insertions(+), 92 deletions(-) diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 656406cf3..43874fee8 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -20,7 +20,7 @@ that accepts POSTs. and ImmutableDict are several other callables with code examples from the same `flask.app` package. -These topics are also useful while reading the `BadRequest` examples: +These subjects go along with the `BadRequest` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -166,6 +166,7 @@ import hashlib import logging import os import warnings +from urllib.parse import urlparse from functools import wraps from flask import Blueprint, current_app, g, request, session @@ -175,7 +176,7 @@ from werkzeug.security import safe_str_cmp from wtforms import ValidationError from wtforms.csrf.core import CSRF -from ._compat import FlaskWTFDeprecationWarning, string_types, urlparse +from ._compat import FlaskWTFDeprecationWarning __all__ = ('generate_csrf', 'validate_csrf', 'CSRFProtect') logger = logging.getLogger(__name__) @@ -222,7 +223,7 @@ class CsrfProtect(CSRFProtect): '"flask_wtf.CsrfProtect" has been renamed to "CSRFProtect" ' 'and will be removed in 1.0.' ), stacklevel=2) - super(CsrfProtect, self).__init__(app=app) + super().__init__(app=app) ~~class CSRFError(BadRequest): diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 333598654..0bc58532b 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -1084,7 +1084,8 @@ from util import base64_to_pil ~~app = Flask(__name__) -from keras.applications.mobilenet_v2 import MobileNetV2 + +from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2 model = MobileNetV2(weights='imagenet') print('Model loaded. Check http://127.0.0.1:5000/') @@ -1107,7 +1108,6 @@ def model_predict(img, model): - ## ... source file continues with no further Flask examples... ``` diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index 79b73c775..f0ff819bc 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -22,7 +22,7 @@ Flask web applications. and ImmutableDict are several other callables with code examples from the same `flask.app` package. -You should read up on these subjects along with these `Headers` examples: +These topics are also useful while reading the `Headers` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -60,21 +60,27 @@ from CTFd.cache import cache, clear_standings from CTFd.config import TestingConfig from CTFd.models import ( Awards, + ChallengeComments, ChallengeFiles, Challenges, + Comments, Fails, + Fields, Files, Flags, Hints, Notifications, + PageComments, PageFiles, Pages, Solves, Tags, + TeamComments, Teams, Tokens, Tracking, Unlocks, + UserComments, Users, ) @@ -149,6 +155,7 @@ import operator import re import six import sys +import warnings from collections import OrderedDict from functools import wraps, partial diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 86bed27c1..7e42b432a 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -77,8 +77,8 @@ DEFAULTS = { 'CUSTOMIZATION_DEBUG': False, 'CUSTOMIZATION_DIR': None, 'CUSTOM_COUNTRIES': {}, + 'CUSTOM_LANGUAGES': {}, 'DB_LOG': False, - 'DEBUG': False, ## ... source file abbreviated to get to ImmutableDict examples ... diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 62a85d083..d74117ac5 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -38,7 +38,7 @@ from flask import redirect, render_template, request, session, url_for from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired from CTFd.cache import clear_team_session, clear_user_session -from CTFd.models import Teams, Users, db +from CTFd.models import Teams, UserFieldEntries, UserFields, Users, db from CTFd.utils import config, email, get_app_config, get_config from CTFd.utils import user as current_user from CTFd.utils import validators @@ -551,7 +551,7 @@ from werkzeug.urls import url_quote_plus from flask_debugtoolbar.compat import iteritems from flask_debugtoolbar.toolbar import DebugToolbar -from flask_debugtoolbar.utils import decode_text +from flask_debugtoolbar.utils import decode_text, gzip_compress, gzip_decompress try: from importlib.metadata import version @@ -666,6 +666,7 @@ import hashlib import logging import os import warnings +from urllib.parse import urlparse from functools import wraps ~~from flask import Blueprint, current_app, g, request, session @@ -675,7 +676,7 @@ from werkzeug.security import safe_str_cmp from wtforms import ValidationError from wtforms.csrf.core import CSRF -from ._compat import FlaskWTFDeprecationWarning, string_types, urlparse +from ._compat import FlaskWTFDeprecationWarning __all__ = ('generate_csrf', 'validate_csrf', 'CSRFProtect') logger = logging.getLogger(__name__) @@ -714,7 +715,7 @@ def generate_csrf(secret_key=None, token_key=None): if not request.referrer: self._error_response('The referrer header is missing.') - good_referrer = 'https://{0}/'.format(request.host) + good_referrer = f'https://{request.host}/' if not same_origin(request.referrer, good_referrer): self._error_response('The referrer does not match the host.') @@ -727,7 +728,7 @@ def generate_csrf(secret_key=None, token_key=None): self._exempt_blueprints.add(view.name) return view - if isinstance(view, string_types): + if isinstance(view, str): view_location = view else: view_location = '.'.join((view.__module__, view.__name__)) diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index 636546cb0..c12fcfed7 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -218,6 +218,7 @@ def us_signin_send_code(): @auth_required( + lambda: config_value("API_ENABLED_METHODS"), within=lambda: config_value("FRESHNESS"), grace=lambda: config_value("FRESHNESS_GRACE_PERIOD"), ) @@ -233,7 +234,6 @@ def us_setup(): form = form_class(meta=suppress_form_csrf()) - ## ... source file abbreviated to get to after_this_request examples ... diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index 4742fb9f9..bc40fdf0e 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -158,6 +158,7 @@ from flask_pluginengine import current_plugin from speaklater import is_lazy_string, make_lazy_string from werkzeug.utils import cached_property +from indico.core.config import config from indico.util.caching import memoize_request diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index b639f67eb..9506aece1 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -179,7 +179,128 @@ def _get_item(model, view_arg, name): ``` -## Example 3 from indico +## Example 3 from Flask-SocketIO +[Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) +([PyPI package information](https://pypi.org/project/Flask-SocketIO/), +[official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) +and +[project documentation](https://flask-socketio.readthedocs.io/en/latest/)) +is a code library by [Miguel Grinberg](https://blog.miguelgrinberg.com/index) +that provides Socket.IO integration for [Flask](/flask.html) applications. +This extension makes it easier to add bi-directional communications on the +web via the [WebSockets](/websockets.html) protocol. + +The Flask-SocketIO project is open source under the +[MIT license](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/LICENSE). + +[**Flask-SocketIO / flask_socketio / __init__.py**](https://github.com/miguelgrinberg/Flask-SocketIO/blob/master/./flask_socketio/__init__.py) + +```python +# __init__.py +from functools import wraps +import os +import sys + +gevent_socketio_found = True +try: + from socketio import socketio_manage +except ImportError: + gevent_socketio_found = False +if gevent_socketio_found: + print('The gevent-socketio package is incompatible with this version of ' + 'the Flask-SocketIO extension. Please uninstall it, and then ' + 'install the latest version of python-socketio in its place.') + sys.exit(1) + +import flask +~~from flask import _request_ctx_stack, has_request_context, json as flask_json +from flask.sessions import SessionMixin +import socketio +from socketio.exceptions import ConnectionRefusedError +from werkzeug.debug import DebuggedApplication +from werkzeug.serving import run_with_reloader + +from .namespace import Namespace +from .test_client import SocketIOTestClient + +__version__ = '4.3.2dev' + + +class _SocketIOMiddleware(socketio.WSGIApp): + def __init__(self, socketio_app, flask_app, socketio_path='socket.io'): + self.flask_app = flask_app + super(_SocketIOMiddleware, self).__init__(socketio_app, + flask_app.wsgi_app, + socketio_path=socketio_path) + + def __call__(self, environ, start_response): + environ = environ.copy() + environ['flask.app'] = self.flask_app + return super(_SocketIOMiddleware, self).__call__(environ, + start_response) + + +## ... source file abbreviated to get to has_request_context examples ... + + + self.default_exception_handler = exception_handler + return exception_handler + + def on_event(self, message, handler, namespace=None): + self.on(message, namespace=namespace)(handler) + + def on_namespace(self, namespace_handler): + if not isinstance(namespace_handler, Namespace): + raise ValueError('Not a namespace instance.') + namespace_handler._set_socketio(self) + if self.server: + self.server.register_namespace(namespace_handler) + else: + self.namespace_handlers.append(namespace_handler) + + def emit(self, event, *args, **kwargs): + namespace = kwargs.pop('namespace', '/') + room = kwargs.pop('room', None) + include_self = kwargs.pop('include_self', True) + skip_sid = kwargs.pop('skip_sid', None) + if not include_self and not skip_sid: + skip_sid = flask.request.sid + callback = kwargs.pop('callback', None) + if callback: + sid = None +~~ if has_request_context(): + sid = getattr(flask.request, 'sid', None) + original_callback = callback + + def _callback_wrapper(*args): + return self._handle_event(original_callback, None, namespace, + sid, *args) + + if sid: + callback = _callback_wrapper + self.server.emit(event, *args, namespace=namespace, room=room, + skip_sid=skip_sid, callback=callback, **kwargs) + + def send(self, data, json=False, namespace=None, room=None, + callback=None, include_self=True, skip_sid=None, **kwargs): + skip_sid = flask.request.sid if not include_self else skip_sid + if json: + self.emit('json', data, namespace=namespace, room=room, + skip_sid=skip_sid, callback=callback, **kwargs) + else: + self.emit('message', data, namespace=namespace, room=room, + skip_sid=skip_sid, callback=callback, **kwargs) + + def close_room(self, room, namespace=None): + self.server.close_room(room, namespace) + + +## ... source file continues with no further has_request_context examples... + +``` + + +## Example 4 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -231,6 +352,12 @@ class AddRequestIDFilter(object): return True +class AddUserIDFilter(object): + def filter(self, record): +~~ record.user_id = unicode(session.user.id) if has_request_context() and session and session.user else '-' + return True + + class RequestInfoFormatter(logging.Formatter): def format(self, record): rv = super(RequestInfoFormatter, self).format(record) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 6e9dd327b..7628786b8 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -739,7 +739,7 @@ from werkzeug.urls import url_quote_plus from flask_debugtoolbar.compat import iteritems from flask_debugtoolbar.toolbar import DebugToolbar -from flask_debugtoolbar.utils import decode_text +from flask_debugtoolbar.utils import decode_text, gzip_compress, gzip_decompress try: from importlib.metadata import version @@ -848,12 +848,12 @@ def replace_insensitive(string, target, replacement): response.headers['content-type'].startswith('text/html')): return response - response_html = response.data.decode(response.charset) + if 'gzip' in response.headers.get('Content-Encoding', ''): + response_html = gzip_decompress(response.data).decode(response.charset) + else: + response_html = response.data.decode(response.charset) no_case = response_html.lower() - body_end = no_case.rfind('') - - if body_end >= 0: ## ... source file continues with no further current_app examples... @@ -1594,6 +1594,7 @@ import hashlib import logging import os import warnings +from urllib.parse import urlparse from functools import wraps ~~from flask import Blueprint, current_app, g, request, session @@ -1603,7 +1604,7 @@ from werkzeug.security import safe_str_cmp from wtforms import ValidationError from wtforms.csrf.core import CSRF -from ._compat import FlaskWTFDeprecationWarning, string_types, urlparse +from ._compat import FlaskWTFDeprecationWarning __all__ = ('generate_csrf', 'validate_csrf', 'CSRFProtect') logger = logging.getLogger(__name__) @@ -1687,7 +1688,7 @@ def _get_config( class _FlaskFormCSRF(CSRF): def setup_form(self, form): self.meta = form.meta - return super(_FlaskFormCSRF, self).setup_form(form) + return super().setup_form(form) def generate_csrf_token(self, csrf_token_field): return generate_csrf( @@ -1723,7 +1724,7 @@ class _FlaskFormCSRF(CSRF): return view = app.view_functions.get(request.endpoint) - dest = '{0}.{1}'.format(view.__module__, view.__name__) + dest = f'{view.__module__}.{view.__name__}' if dest in self._exempt_views: return @@ -1766,7 +1767,7 @@ class _FlaskFormCSRF(CSRF): if not request.referrer: self._error_response('The referrer header is missing.') - good_referrer = 'https://{0}/'.format(request.host) + good_referrer = f'https://{request.host}/' if not same_origin(request.referrer, good_referrer): self._error_response('The referrer does not match the host.') @@ -1779,7 +1780,7 @@ class _FlaskFormCSRF(CSRF): self._exempt_blueprints.add(view.name) return view - if isinstance(view, string_types): + if isinstance(view, str): view_location = view else: view_location = '.'.join((view.__module__, view.__name__)) @@ -1814,7 +1815,7 @@ class CsrfProtect(CSRFProtect): '"flask_wtf.CsrfProtect" has been renamed to "CSRFProtect" ' 'and will be removed in 1.0.' ), stacklevel=2) - super(CsrfProtect, self).__init__(app=app) + super().__init__(app=app) class CSRFError(BadRequest): @@ -1857,7 +1858,6 @@ import warnings import pkg_resources ~~from flask import _request_ctx_stack, current_app, render_template -from flask_babelex import Domain from flask_login import AnonymousUserMixin, LoginManager from flask_login import UserMixin as BaseUserMixin from flask_login import current_user @@ -1867,6 +1867,7 @@ from passlib.context import CryptContext from werkzeug.datastructures import ImmutableList from werkzeug.local import LocalProxy +from .babel import get_i18n_domain, have_babel from .decorators import ( default_reauthn_handler, default_unauthn_handler, @@ -2063,6 +2064,13 @@ _default_config = { ~~ current_app.after_request(csrf_cookie_handler) ~~ current_app.config["WTF_CSRF_HEADERS"].append(cv("CSRF_HEADER")) + @app.before_first_request + def check_babel(): + if have_babel() and "babel" not in app.extensions: + raise ValueError( + "Flask-Babel or Flask-BabelEx is installed but not initialized" + ) + state._phone_util = state.phone_util_cls(app) state._mail_util = state.mail_util_cls(app) @@ -2079,13 +2087,6 @@ _default_config = { for newc, oldc in [ ("SECURITY_SMS_SERVICE", "SECURITY_TWO_FACTOR_SMS_SERVICE"), ("SECURITY_SMS_SERVICE_CONFIG", "SECURITY_TWO_FACTOR_SMS_SERVICE_CONFIG"), - ("SECURITY_TOTP_SECRETS", "SECURITY_TWO_FACTOR_SECRET"), - ("SECURITY_TOTP_ISSUER", "SECURITY_TWO_FACTOR_URI_SERVICE_NAME"), - ]: - if not app.config.get(newc, None): - app.config[newc] = app.config.get(oldc, None) - - for uia in cv("USER_IDENTITY_ATTRIBUTES", app=app): # pragma: no cover ## ... source file continues with no further current_app examples... diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index c14142844..46f7dfbc6 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -440,7 +440,7 @@ from werkzeug.urls import url_quote_plus from flask_debugtoolbar.compat import iteritems from flask_debugtoolbar.toolbar import DebugToolbar -from flask_debugtoolbar.utils import decode_text +from flask_debugtoolbar.utils import decode_text, gzip_compress, gzip_decompress try: from importlib.metadata import version @@ -695,6 +695,7 @@ import hashlib import logging import os import warnings +from urllib.parse import urlparse from functools import wraps ~~from flask import Blueprint, current_app, g, request, session @@ -704,7 +705,7 @@ from werkzeug.security import safe_str_cmp from wtforms import ValidationError from wtforms.csrf.core import CSRF -from ._compat import FlaskWTFDeprecationWarning, string_types, urlparse +from ._compat import FlaskWTFDeprecationWarning __all__ = ('generate_csrf', 'validate_csrf', 'CSRFProtect') logger = logging.getLogger(__name__) @@ -781,7 +782,7 @@ def validate_csrf(data, secret_key=None, time_limit=None, token_key=None): class _FlaskFormCSRF(CSRF): def setup_form(self, form): self.meta = form.meta - return super(_FlaskFormCSRF, self).setup_form(form) + return super().setup_form(form) def generate_csrf_token(self, csrf_token_field): return generate_csrf( @@ -805,7 +806,7 @@ class _FlaskFormCSRF(CSRF): raise -class CSRFProtect(object): +class CSRFProtect: def __init__(self, app=None): self._exempt_views = set() @@ -840,7 +841,7 @@ class CSRFProtect(object): if not request.referrer: self._error_response('The referrer header is missing.') - good_referrer = 'https://{0}/'.format(request.host) + good_referrer = f'https://{request.host}/' if not same_origin(request.referrer, good_referrer): self._error_response('The referrer does not match the host.') @@ -853,7 +854,7 @@ class CSRFProtect(object): self._exempt_blueprints.add(view.name) return view - if isinstance(view, string_types): + if isinstance(view, str): view_location = view else: view_location = '.'.join((view.__module__, view.__name__)) @@ -920,9 +921,9 @@ from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf from wtforms import validators, ValidationError from itsdangerous import BadSignature, SignatureExpired -from speaklater import is_lazy_string from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict + from .quart_compat import best from .signals import user_authenticated diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 97cf9cda4..6c2281032 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -1075,7 +1075,7 @@ from werkzeug.urls import url_quote_plus from flask_debugtoolbar.compat import iteritems from flask_debugtoolbar.toolbar import DebugToolbar -from flask_debugtoolbar.utils import decode_text +from flask_debugtoolbar.utils import decode_text, gzip_compress, gzip_decompress try: from importlib.metadata import version @@ -1187,8 +1187,8 @@ def replace_insensitive(string, target, replacement): response.headers['content-type'].startswith('text/html')): return response - response_html = response.data.decode(response.charset) - + if 'gzip' in response.headers.get('Content-Encoding', ''): + response_html = gzip_decompress(response.data).decode(response.charset) ## ... source file continues with no further request examples... @@ -1976,6 +1976,7 @@ import hashlib import logging import os import warnings +from urllib.parse import urlparse from functools import wraps ~~from flask import Blueprint, current_app, g, request, session @@ -1985,7 +1986,7 @@ from werkzeug.security import safe_str_cmp from wtforms import ValidationError from wtforms.csrf.core import CSRF -from ._compat import FlaskWTFDeprecationWarning, string_types, urlparse +from ._compat import FlaskWTFDeprecationWarning __all__ = ('generate_csrf', 'validate_csrf', 'CSRFProtect') logger = logging.getLogger(__name__) @@ -2043,7 +2044,7 @@ def generate_csrf(secret_key=None, token_key=None): return view = app.view_functions.get(request.endpoint) - dest = '{0}.{1}'.format(view.__module__, view.__name__) + dest = f'{view.__module__}.{view.__name__}' if dest in self._exempt_views: return @@ -2086,7 +2087,7 @@ def generate_csrf(secret_key=None, token_key=None): ~~ if not request.referrer: self._error_response('The referrer header is missing.') - good_referrer = 'https://{0}/'.format(request.host) + good_referrer = f'https://{request.host}/' if not same_origin(request.referrer, good_referrer): self._error_response('The referrer does not match the host.') @@ -2099,7 +2100,7 @@ def generate_csrf(secret_key=None, token_key=None): self._exempt_blueprints.add(view.name) return view - if isinstance(view, string_types): + if isinstance(view, str): view_location = view else: view_location = '.'.join((view.__module__, view.__name__)) @@ -2191,7 +2192,6 @@ import inspect ~~from flask import Markup, current_app, request from flask_login import current_user from flask_wtf import FlaskForm as BaseForm -from speaklater import is_lazy_string, make_lazy_string from werkzeug.local import LocalProxy from wtforms import ( BooleanField, @@ -2205,6 +2205,7 @@ from wtforms import ( validators, ) +from .babel import is_lazy_string, make_lazy_string from .confirmable import requires_confirmation from .utils import ( _, @@ -2731,12 +2732,6 @@ from flask_multipass import InvalidCredentials, Multipass, NoSuchUser from indico.core.logger import Logger -try: - from flask_multipass.providers.oauth import OAuthInvalidSessionState -except ImportError: - OAuthInvalidSessionState = None - - logger = Logger.get('auth') @@ -2750,6 +2745,12 @@ class IndicoMultipass(Multipass): def sync_provider(self): return next((p for p in self.identity_providers.itervalues() if p.settings.get('synced_fields')), None) + @property + def synced_fields(self): + provider = self.sync_provider + if provider is None: + return set() + synced_fields = set(provider.settings.get('synced_fields')) ## ... source file abbreviated to get to request examples ... @@ -2782,10 +2783,12 @@ class IndicoMultipass(Multipass): logger.warning('Invalid credentials (ip=%s, provider=%s): %s', ~~ request.remote_addr, exc.provider.name if exc.provider else None, exc) else: + exc_str = str(exc) fn = logger.error - if OAuthInvalidSessionState is not None and isinstance(exc, OAuthInvalidSessionState): + if exc_str.startswith('mismatching_state:'): fn = logger.debug - fn('Authentication via %s failed: %s (%r)', exc.provider.name if exc.provider else None, exc, exc.details) + fn('Authentication via %s failed: %s (%r)', exc.provider.name if exc.provider else None, exc_str, + exc.details) return super(IndicoMultipass, self).handle_auth_error(exc, redirect_to_login=redirect_to_login) @@ -2833,7 +2836,8 @@ from util import base64_to_pil app = Flask(__name__) -from keras.applications.mobilenet_v2 import MobileNetV2 + +from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2 model = MobileNetV2(weights='imagenet') print('Model loaded. Check http://127.0.0.1:5000/') diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 9f8ee050c..beade4434 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -47,7 +47,7 @@ from flask import current_app as app from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired from CTFd.cache import clear_team_session, clear_user_session -from CTFd.models import Teams, Users, db +from CTFd.models import Teams, UserFieldEntries, UserFields, Users, db from CTFd.utils import config, email, get_app_config, get_config from CTFd.utils import user as current_user from CTFd.utils import validators @@ -735,6 +735,7 @@ import hashlib import logging import os import warnings +from urllib.parse import urlparse from functools import wraps ~~from flask import Blueprint, current_app, g, request, session @@ -744,7 +745,7 @@ from werkzeug.security import safe_str_cmp from wtforms import ValidationError from wtforms.csrf.core import CSRF -from ._compat import FlaskWTFDeprecationWarning, string_types, urlparse +from ._compat import FlaskWTFDeprecationWarning __all__ = ('generate_csrf', 'validate_csrf', 'CSRFProtect') logger = logging.getLogger(__name__) @@ -1241,6 +1242,33 @@ class AddRequestIDFilter(object): return True +class AddUserIDFilter(object): + def filter(self, record): +~~ record.user_id = unicode(session.user.id) if has_request_context() and session and session.user else '-' + return True + + +class RequestInfoFormatter(logging.Formatter): + def format(self, record): + rv = super(RequestInfoFormatter, self).format(record) + info = get_request_info() + if info: + rv += '\n\n' + pformat(info) + return rv + + +class FormattedSubjectSMTPHandler(logging.handlers.SMTPHandler): + def getSubject(self, record): + return self.subject % record.__dict__ + + def emit(self, record): + try: + port = self.mailport + if not port: + port = smtplib.SMTP_PORT + smtp = smtplib.SMTP(self.mailhost, port, timeout=self._timeout) + msg = MIMEText(self.format(record), 'plain', 'utf-8') + msg['From'] = self.fromaddr ## ... source file abbreviated to get to session examples ... diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 0adf66d40..5c2afbb90 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -961,9 +961,9 @@ from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf from wtforms import validators, ValidationError from itsdangerous import BadSignature, SignatureExpired -from speaklater import is_lazy_string from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict + from .quart_compat import best from .signals import user_authenticated diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 2dc887a82..2cb8bbace 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -421,7 +421,7 @@ def login(): ) return _security._render_json(payload, 400, None, None) else: - return redirect(get_post_login_redirect()) + return redirect(get_url(_security.post_login_view)) form_class = _security.login_form diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 92e4fa985..ef8efeb87 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -938,9 +938,9 @@ from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf from wtforms import validators, ValidationError from itsdangerous import BadSignature, SignatureExpired -from speaklater import is_lazy_string from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict + from .quart_compat import best from .signals import user_authenticated @@ -992,22 +992,22 @@ def validate_redirect_url(url): url_next = urlsplit(url) url_base = urlsplit(request.host_url) if (url_next.netloc or url_next.scheme) and url_next.netloc != url_base.netloc: - return False + base_domain = current_app.config.get("SERVER_NAME") + if ( + config_value("REDIRECT_ALLOW_SUBDOMAINS") + and base_domain + and ( + url_next.netloc == base_domain + or url_next.netloc.endswith(f".{base_domain}") + ) + ): + return True + else: + return False return True def get_post_action_redirect(config_key, declared=None): - urls = [ - get_url(request.args.get("next", None)), - get_url(request.form.get("next", None)), - find_redirect(config_key), - ] - if declared: - urls.insert(0, declared) - for url in urls: - if validate_redirect_url(url): - return url - ## ... source file continues with no further url_for examples... diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index fd4d8ce5d..d3052dce6 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -60,9 +60,9 @@ from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf from wtforms import validators, ValidationError from itsdangerous import BadSignature, SignatureExpired -from speaklater import is_lazy_string from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict + from .quart_compat import best from .signals import user_authenticated @@ -81,8 +81,6 @@ localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) ## ... source file abbreviated to get to JSONEncoder examples ... - accept_mimetypes = req.accept_mimetypes - if not hasattr(req.accept_mimetypes, "best"): # pragma: no cover accept_mimetypes.best = best if accept_mimetypes.best == "application/json": return True @@ -103,6 +101,8 @@ def json_error_response(errors): ~~class FsJsonEncoder(JSONEncoder): def default(self, obj): + from .babel import is_lazy_string + if is_lazy_string(obj): return str(obj) else: @@ -137,6 +137,8 @@ class SmsSenderFactory: def default_want_json(req): if req.is_json: return True + accept_mimetypes = req.accept_mimetypes + if not hasattr(req.accept_mimetypes, "best"): # pragma: no cover ## ... source file continues with no further JSONEncoder examples... diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 53923a951..946f7adeb 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -821,7 +821,7 @@ def _pop_injected_js(): def jsonify_form(form, fields=None, submit=None, back=None, back_url=None, back_button=True, disabled_until_change=True, disabled_fields=(), form_header_kwargs=None, skip_labels=False, save_reminder=False, - footer_align_right=False, disable_if_locked=True): + footer_align_right=False, disable_if_locked=True, message=None): if submit is None: submit = _('Save') if back is None: @@ -832,7 +832,7 @@ def jsonify_form(form, fields=None, submit=None, back=None, back_url=None, back_ html = tpl.simple_form(form, fields=fields, submit=submit, back=back, back_url=back_url, back_button=back_button, disabled_until_change=disabled_until_change, disabled_fields=disabled_fields, form_header_kwargs=form_header_kwargs, skip_labels=skip_labels, save_reminder=save_reminder, - footer_align_right=footer_align_right, disable_if_locked=disable_if_locked) + footer_align_right=footer_align_right, disable_if_locked=disable_if_locked, message=message) ~~ return jsonify(html=html, js=_pop_injected_js()) @@ -915,13 +915,13 @@ from util import base64_to_pil app = Flask(__name__) -from keras.applications.mobilenet_v2 import MobileNetV2 + +from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2 model = MobileNetV2(weights='imagenet') print('Model loaded. Check http://127.0.0.1:5000/') -MODEL_PATH = 'models/your_model.h5' ## ... source file abbreviated to get to jsonify examples ... diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 4428d6b6e..a858ac1ec 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -362,9 +362,9 @@ from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf from wtforms import validators, ValidationError ~~from itsdangerous import BadSignature, SignatureExpired -from speaklater import is_lazy_string from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict + from .quart_compat import best from .signals import user_authenticated diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index 4484cce5a..dcce6fb02 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -41,6 +41,7 @@ import operator import re import six import sys +import warnings from collections import OrderedDict from functools import wraps, partial diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index c785805cb..e076864e9 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -20,7 +20,7 @@ the `.templating` part. render_template is another callable from the `flask.templating` package with code examples. -These topics are also useful while reading the `render_template_string` examples: +You should read up on these subjects along with these `render_template_string` examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index da6a6da1a..db924ba7b 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -21,7 +21,7 @@ the `.templating` part. render_template_string is another callable from the `flask.templating` package with code examples. -You should read up on these subjects along with these `render_template` examples: +These topics are also useful while reading the `render_template` examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) @@ -141,7 +141,7 @@ from flask import current_app as app from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired from CTFd.cache import clear_team_session, clear_user_session -from CTFd.models import Teams, Users, db +from CTFd.models import Teams, UserFieldEntries, UserFields, Users, db from CTFd.utils import config, email, get_app_config, get_config from CTFd.utils import user as current_user from CTFd.utils import validators @@ -383,7 +383,14 @@ def register(): db.session.commit() db.session.flush() - login_user(user) + for field_id, value in entries.items(): + entry = UserFieldEntries( + field_id=field_id, value=value, user_id=user.id + + +## ... source file abbreviated to get to render_template examples ... + + if config.can_send_mail() and get_config( "verify_emails" @@ -1398,7 +1405,6 @@ import warnings import pkg_resources ~~from flask import _request_ctx_stack, current_app, render_template -from flask_babelex import Domain from flask_login import AnonymousUserMixin, LoginManager from flask_login import UserMixin as BaseUserMixin from flask_login import current_user @@ -1408,6 +1414,7 @@ from passlib.context import CryptContext from werkzeug.datastructures import ImmutableList from werkzeug.local import LocalProxy +from .babel import get_i18n_domain, have_babel from .decorators import ( default_reauthn_handler, default_unauthn_handler, @@ -1858,7 +1865,8 @@ from util import base64_to_pil app = Flask(__name__) -from keras.applications.mobilenet_v2 import MobileNetV2 + +from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2 model = MobileNetV2(weights='imagenet') print('Model loaded. Check http://127.0.0.1:5000/') diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index b2fec1e84..d9ad8fb08 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -19,7 +19,7 @@ and View are a couple of other callables within the `flask.views` package that also have code examples. -You should read up on these subjects along with these `http_method_funcs` examples: +These subjects go along with the `http_method_funcs` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) @@ -45,7 +45,7 @@ from __future__ import unicode_literals import inspect import warnings import logging -from collections import namedtuple +from collections import namedtuple, OrderedDict import six from flask import request diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index e048933c1..7dca926b6 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -19,7 +19,7 @@ and http_method_funcs are a couple of other callables within the `flask.views` package that also have code examples. -These topics are also useful while reading the `MethodView` examples: +These subjects go along with the `MethodView` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 1f8e51936..25ca74e2d 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -20,7 +20,7 @@ and http_method_funcs are a couple of other callables within the `flask.views` package that also have code examples. -You should read up on these subjects along with these `View` examples: +These topics are also useful while reading the `View` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) From 3615d3c987b6ffd52161de96f9ad37dff9f24fc0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 4 Oct 2020 12:07:43 -0400 Subject: [PATCH 225/302] adding new numpy resources --- content/pages/03-data/17-scipy-numpy.markdown | 7 +++++++ theme/templates/article.html | 2 +- theme/templates/blog.html | 2 +- ...lio-voice-call-recording-transcriptions-assemblyai.html | 6 ++++++ theme/templates/css/base.css | 2 +- 5 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 theme/templates/blog/accurate-twilio-voice-call-recording-transcriptions-assemblyai.html diff --git a/content/pages/03-data/17-scipy-numpy.markdown b/content/pages/03-data/17-scipy-numpy.markdown index b6350d46a..62ec16355 100644 --- a/content/pages/03-data/17-scipy-numpy.markdown +++ b/content/pages/03-data/17-scipy-numpy.markdown @@ -67,12 +67,19 @@ following resources are broader walkthroughs for the SciPy ecosystem: computation and how to perform operations that get the results you need for your data analysis. +* [Scientific Computing in Python: Introduction to NumPy and Matplotlib](https://sebastianraschka.com/blog/2020/numpy-intro.html) + is a detailed tutorial that goes through the basics for NumPy and + then connects it to [Matplotlib](/matplotlib.html). + * [Math to Code](https://mathtocode.com/) provides an interactive tutorial to learn how to implement math in NumPy. * [101 NumPy Exercises for Data Analysis](https://www.machinelearningplus.com/python/101-numpy-exercises-python/) + has a bunch of questions and answers to common ways to work with NumPy + and is useful to understand what you can do with this library. * [NumPy: creating and manipulating numerical data](http://www.scipy-lectures.org/intro/numpy/index.html) + contains many code examples for common operations. * [Python NumPy Array Tutorial](https://www.datacamp.com/community/tutorials/python-numpy-tutorial) is a starter tutorial specifically focused on using and working diff --git a/theme/templates/article.html b/theme/templates/article.html index 5d7d00cdc..1b2932f1e 100644 --- a/theme/templates/article.html +++ b/theme/templates/article.html @@ -25,7 +25,7 @@ {% if article %}

    -

    {{ article.title }}

    +

    {{ article.title }}

    {% if article.modified != article.date %} Post updated by diff --git a/theme/templates/blog.html b/theme/templates/blog.html index 6a20daefb..ed1afb06d 100644 --- a/theme/templates/blog.html +++ b/theme/templates/blog.html @@ -21,7 +21,7 @@

    Blog Tutorials

    {% endif %} -

    {{ a.title }}

    +

    {{ a.title }}

    {% if a.modified != a.date %} Post updated by diff --git a/theme/templates/blog/accurate-twilio-voice-call-recording-transcriptions-assemblyai.html b/theme/templates/blog/accurate-twilio-voice-call-recording-transcriptions-assemblyai.html new file mode 100644 index 000000000..379b4da4b --- /dev/null +++ b/theme/templates/blog/accurate-twilio-voice-call-recording-transcriptions-assemblyai.html @@ -0,0 +1,6 @@ + +Learning Programming +Why use Python? +The Python Programming Language +Python Basic Data Types Tutorial: Strings +APIs diff --git a/theme/templates/css/base.css b/theme/templates/css/base.css index a982788e7..06a5ef2ed 100644 --- a/theme/templates/css/base.css +++ b/theme/templates/css/base.css @@ -1 +1 @@ -{% raw %}hr,img{border:0}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:18px;background:#fefefe}body{margin:0;font:18px Georgia,serif;line-height:1.4;color:#222;padding:0}img{vertical-align:middle}hr{height:0;box-sizing:content-box;margin:21px 0;border-top:1px solid #eee}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",sans-serif;font-weight:500;line-height:1.1;color:#000}h1,h2,h3{margin:32px 0 6px}h1{font-size:40px}h2{font-size:28px}h3{font-size:22px}h4,h5,h6{margin:11px 0;font-size:18px}p{margin:0 0 12px}ol,ul{margin:0 0 10px}code,pre{font:"Courier New",monospace;border-radius:4px;background-color:#f4f9ff;font-size:12px}code{padding:2px 4px;white-space:nowrap}pre{overflow:scroll;white-space:pre;display:block;padding:10px;margin:0 0 11px;line-height:1.4;word-break:break-all;word-wrap:break-word;border:1px solid #ccc}.cn{padding:0 15px 0 15px;margin-right:auto;margin-left:auto}.cn:before,.cn:after{display:table;content:" "}.cn:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.c2,.c3,.c4,.c5,.c6,.c7,.c8,.c9,.c10,.c11,.c12{position:relative;min-height:1px;padding:0 15px 0 15px}a{background:transparent;text-decoration:none;border-bottom:1px dotted;color:#444}a:hover{text-decoration:none;color:#000}.ft{padding:0 0 24px;float:right}.sns{font-family:"Helvetica Neue",sans-serif}.sps{font-size:14px}.hd{margin:20px 0 15px 0}.hd>a{border-bottom:none}img.hdr{vertical-align:middle;border:none;height:52px;width:52px;padding:1px}.hdt a,.hdt a:hover{font:72px "Helvetica Neue",sans-serif;font-weight:normal;letter-spacing:.03em;vertical-align:middle;margin-left:5px;color:#000;text-decoration:none;border-bottom:none;line-height:.9em}.bk{margin:0 5px 0 5px}img.nob{border:none}p.banner{font-weight:500;line-height:1.1;color:#fff;font-size:22px;margin:14px 0 18px 0}.bp{line-height:1.3em}{% endraw %} +{% raw %}hr,img{border:0}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:18px;background:#fefefe}body{margin:0;font:18px Georgia,serif;line-height:1.4;color:#222;padding:0}img{vertical-align:middle}hr{height:0;box-sizing:content-box;margin:21px 0;border-top:1px solid #eee}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",sans-serif;font-weight:500;line-height:1.1;color:#000}h1,h2,h3{margin:30px 0 6px}h1{font-size:40px}h2{font-size:28px}h3{font-size:22px}h4,h5,h6{margin:11px 0;font-size:18px}p{margin:0 0 12px}ol,ul{margin:0 0 10px}code,pre{font:"Courier New",monospace;border-radius:4px;background-color:#f4f9ff;font-size:12px}code{padding:2px 4px;white-space:nowrap}pre{overflow:scroll;white-space:pre;display:block;padding:10px;margin:0 0 11px;line-height:1.4;word-break:break-all;word-wrap:break-word;border:1px solid #ccc}.cn{padding:0 15px 0 15px;margin-right:auto;margin-left:auto}.cn:before,.cn:after{display:table;content:" "}.cn:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.c2,.c3,.c4,.c5,.c6,.c7,.c8,.c9,.c10,.c11,.c12{position:relative;min-height:1px;padding:0 15px 0 15px}a{background:transparent;text-decoration:none;border-bottom:1px dotted;color:#444}a:hover{text-decoration:none;color:#000}.ft{padding:0 0 24px;float:right}.sns{font-family:"Helvetica Neue",sans-serif}.sps{font-size:14px}.hd{margin:20px 0 15px 0}.hd>a{border-bottom:none}img.hdr{vertical-align:middle;border:none;height:52px;width:52px;padding:1px}.hdt a,.hdt a:hover{font:72px "Helvetica Neue",sans-serif;font-weight:normal;letter-spacing:.03em;vertical-align:middle;margin-left:5px;color:#000;text-decoration:none;border-bottom:none;line-height:.9em}.bk{margin:0 5px 0 5px}img.nob{border:none}p.banner{font-weight:500;line-height:1.1;color:#fff;font-size:22px;margin:14px 0 18px 0}.bp{line-height:1.3em}{% endraw %} From 3e8c6108aceca254f7a33d132093fd3aa4ff8c37 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 5 Oct 2020 12:10:31 -0400 Subject: [PATCH 226/302] update videos page and change log --- .../pages/01-introduction/09-best-python-videos.markdown | 2 ++ content/pages/meta/00-change-log.markdown | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/content/pages/01-introduction/09-best-python-videos.markdown b/content/pages/01-introduction/09-best-python-videos.markdown index b265bc34b..85000438e 100644 --- a/content/pages/01-introduction/09-best-python-videos.markdown +++ b/content/pages/01-introduction/09-best-python-videos.markdown @@ -163,6 +163,7 @@ like [PyCon US](https://us.pycon.org/) and Python language. * PyCon US videos from + [2020](https://www.youtube.com/c/PyCon2020/videos), [2019](https://www.youtube.com/channel/UCxs2IIVXaEHHA4BtTiWZ2mQ/videos), [2018](https://www.youtube.com/channel/UCsX05-2sVSH7Nx3zuk3NYuQ/videos), [2017](https://www.youtube.com/channel/UCrJhliKNQ8g0qoE_zvL8eVg/videos), @@ -172,6 +173,7 @@ like [PyCon US](https://us.pycon.org/) and are all available online for free. * All of the talk videos are available on YouTube for + [EuroPython 2020](https://www.youtube.com/playlist?list=PL8uoeex94UhHgMD9GOCbEHWku7pEPx9fW0), [EuroPython 2019](https://www.youtube.com/playlist?list=PL8uoeex94UhHFRew8gzfFJHIpRFWyY4YW), [EuroPython 2018](https://www.youtube.com/watch?v=LoRq9yGeBWY&list=PL8uoeex94UhFrNUV2m5MigREebUms39U5), [EuroPython 2017](https://www.youtube.com/watch?v=OCHrzW-R3QI&list=PL8uoeex94UhG9QAoRICebFpeKK2M0Herh), diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index b3d21b0ec..571a4baeb 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,12 @@ view commit-level changes via the on GitHub. ## 2020 +### October +* New [NumPy](/scipy-numpy.html) resources. + +### September +* Tweaks across [Flask code examples](/flask-code-examples.html). + ### August * New blog posts on [How to Transcribe Speech Recordings into Text with Python](/blog/transcribe-recordings-speech-text-assemblyai.html) From 46c761c9799228f85de69e5069867a4074712fa6 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 10 Oct 2020 12:04:31 -0400 Subject: [PATCH 227/302] new blog post on speech to text transcriptions wiht assemblyai and flask --- ...cording-transcriptions-assemblyai.markdown | 569 ++++++++++++++++++ .../call-recording-url.png | Bin 0 -> 80463 bytes .../dial-call-sid.png | Bin 0 -> 37149 bytes .../201009-twilio-flask-assemblyai/ngrok.jpg | Bin 0 -> 103403 bytes .../twilio-console.png | Bin 0 -> 248523 bytes 5 files changed, 569 insertions(+) create mode 100644 content/posts/201009-accurate-twilio-voice-call-recording-transcriptions-assemblyai.markdown create mode 100644 static/img/201009-twilio-flask-assemblyai/call-recording-url.png create mode 100644 static/img/201009-twilio-flask-assemblyai/dial-call-sid.png create mode 100644 static/img/201009-twilio-flask-assemblyai/ngrok.jpg create mode 100644 static/img/201009-twilio-flask-assemblyai/twilio-console.png diff --git a/content/posts/201009-accurate-twilio-voice-call-recording-transcriptions-assemblyai.markdown b/content/posts/201009-accurate-twilio-voice-call-recording-transcriptions-assemblyai.markdown new file mode 100644 index 000000000..e178de998 --- /dev/null +++ b/content/posts/201009-accurate-twilio-voice-call-recording-transcriptions-assemblyai.markdown @@ -0,0 +1,569 @@ +title: Higher Accuracy Twilio Voice Transcriptions with Python and Flask +slug: accurate-twilio-voice-call-recording-transcriptions-assemblyai +meta: Use AssemblyAI's speech-to-text service to improve recording transcription accuracy for Twilio Programmable Voice phone calls. +category: post +date: 2020-10-10 +modified: 2020-10-10 +newsletter: False +headerimage: /img/headers/python-assemblyai.jpg +headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. + + +[Twilio's Programmable Voice API](https://www.twilio.com/docs/voice) +is commonly used to initiate and receive phone calls, but the transcription +accuracy for [recordings](https://www.twilio.com/docs/voice/api/recording) +often leaves a lot to be desired. In this tutorial, we'll see how to connect an +outbound phone call powered by the Twilio Voice API with +[AssemblyAI's deep learning transcription API](https://docs.assemblyai.com/guides/transcribing-an-audio-file-recording) +to get significantly more accurate speech-to-text output. + + +## Required Tools for this Application +Ensure you have Python 3 installed, because Python 2 reached its +end-of-life at the beginning of 2020 and is no longer supported. +Preferrably, you should have +[Python 3.6 or newer installed](https://www.python.org/downloads/) +in your [development environment](/development-environments.html). +This tutorial will also use: + +We will use the following dependencies to complete this +tutorial: + +* [requests](https://requests.readthedocs.io/), version + [2.24.0](https://pypi.org/project/requests/), for accessing the + [AssemblyAI transcription API](https://docs.assemblyai.com/overview/getting-started) +* [Flask](https://flask.palletsprojects.com/en/1.1.x/), version + [1.1.2](https://pypi.org/project/Flask/1.1.2/), to respond to Twilio's + webhooks +* A [Twilio account](https://www.twilio.com/referral/w9pugq), of which a + free trial version is good enough to test this tutorial +* [Twilio Python helper library](https://pypi.org/project/twilio/), + version [6.45.4](https://pypi.org/project/twilio/6.45.4/) or newer, + for interacting with the [REST API](https://www.twilio.com/docs/usage/api) +* An [AssemblyAI](https://www.assemblyai.com/) account, which you can sign + up for a [free key API access key here](https://app.assemblyai.com/login/) +* [Ngrok](https://ngrok.com/) if you need a localhost tunnel to expose + a public URL that webhooks can send a POST request to + +All code in this blog post is available open source under the MIT license +on GitHub under the +[accurate-twilio-voice-call-recording-transcriptions-assemblyai directory of the blog-code-examples repository](https://github.com/fullstackpython/blog-code-examples). +Use the source code as you desire for your own projects. + + +## Configuring our development environment +Change into the directory where you keep your Python +[virtual environments](/virtual-environments-virtualenvs-venvs.html). +Create a new virtualenv for this project using the following +command. + +Start this Python project by creating a new +[virtual environment](/virtual-environments-virtualenvs-venvs.html) +using the following command. I recommend using a separate directory +such as `~/venvs/` (the tilde is a shortcut for your user's `home` +directory) so that you always know where all your virtualenvs are +located. + +```bash +python3 -m venv ~/venvs/record-transcribe +``` + +Activate the virtualenv with the `activate` shell script: + +```bash +source ~/venvs/record-transcribe/bin/activate +``` + +After the above command is executed, the command prompt will +change so that the name of the virtualenv is prepended to the +original command prompt format, so if your prompt is simply +`$`, it will now look like the following: + +```bash +(record-transcribe) $ +``` + +Remember, you have to activate your virtualenv in every new terminal +window where you want to use dependencies in the virtualenv. + +We can now install the required packages +package into the activated but otherwise empty virtualenv. + +``` +pip install Flask==1.1.2 requests==2.24.0 twilio==6.45.4 +``` + +Look for output similar to the following to confirm the appropriate +packages were installed correctly from PyPI. + +``` +(recordtranscribe) $ pip install Flask==1.1.2 requests==2.24.0 twilio=6.45.4 +Collecting Flask + Using cached https://files.pythonhosted.org/packages/f2/28/2a03252dfb9ebf377f40fba6a7841b47083260bf8bd8e737b0c6952df83f/Flask-1.1.2-py2.py3-none-any.whl +Collecting requests + Using cached https://files.pythonhosted.org/packages/45/1e/0c169c6a5381e241ba7404532c16a21d86ab872c9bed8bdcd4c423954103/requests-2.24.0-py2.py3-none-any.whl +Collecting twilio + Using cached https://files.pythonhosted.org/packages/d0/4e/7c377eb1a1d57f011dc1bee2fee77cf1e9a08407b8d44ea25a187a30c78d/twilio-6.45.4.tar.gz +Collecting Werkzeug>=0.15 (from Flask) + Using cached https://files.pythonhosted.org/packages/cc/94/5f7079a0e00bd6863ef8f1da638721e9da21e5bacee597595b318f71d62e/Werkzeug-1.0.1-py2.py3-none-any.whl +Collecting itsdangerous>=0.24 (from Flask) + Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl +Collecting click>=5.1 (from Flask) + Using cached https://files.pythonhosted.org/packages/d2/3d/fa76db83bf75c4f8d338c2fd15c8d33fdd7ad23a9b5e57eb6c5de26b430e/click-7.1.2-py2.py3-none-any.whl +Collecting Jinja2>=2.10.1 (from Flask) + Using cached https://files.pythonhosted.org/packages/30/9e/f663a2aa66a09d838042ae1a2c5659828bb9b41ea3a6efa20a20fd92b121/Jinja2-2.11.2-py2.py3-none-any.whl +Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests) + Using cached https://files.pythonhosted.org/packages/9f/f0/a391d1463ebb1b233795cabfc0ef38d3db4442339de68f847026199e69d7/urllib3-1.25.10-py2.py3-none-any.whl +Collecting idna<3,>=2.5 (from requests) + Using cached https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl +Collecting certifi>=2017.4.17 (from requests) + Using cached https://files.pythonhosted.org/packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl +Collecting chardet<4,>=3.0.2 (from requests) + Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl +Collecting six (from twilio) + Using cached https://files.pythonhosted.org/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl +Collecting pytz (from twilio) + Using cached https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl +Collecting PyJWT>=1.4.2 (from twilio) + Using cached https://files.pythonhosted.org/packages/87/8b/6a9f14b5f781697e51259d81657e6048fd31a113229cf346880bb7545565/PyJWT-1.7.1-py2.py3-none-any.whl +Collecting MarkupSafe>=0.23 (from Jinja2>=2.10.1->Flask) + Using cached https://files.pythonhosted.org/packages/0c/12/37f68957526d1ec0883b521934b4e1b8ff3dd8e4fab858a5bf3e487bcee9/MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl +Installing collected packages: Werkzeug, itsdangerous, click, MarkupSafe, Jinja2, Flask, urllib3, idna, certifi, chardet, requests, six, pytz, PyJWT, twilio + Running setup.py install for twilio ... done +Successfully installed Flask-1.1.2 Jinja2-2.11.2 MarkupSafe-1.1.1 PyJWT-1.7.1 Werkzeug-1.0.1 certifi-2020.6.20 chardet-3.0.4 click-7.1.2 idna-2.10 itsdangerous-1.1.0 pytz-2020.1 requests-2.24.0 six-1.15.0 twilio-6.45.4 urllib3-1.25.10 + +``` + +We can get started coding the application now that we have all of our +required dependencies installed. + + +## Building our application +Time to dig into the code! We're going to write three source files in +this application: + +* `app.py`: a Flask app that will handle the phone call and recording +* `transcribe.py`: a short Python script to invoke AssemblyAI with the + recording and start the transcription process +* `print_transcription.py`: a script to print the output of the + transcription to the terminal + +Remember that you can get access to all three of the completed files in the +`accurate-twilio-voice-call-recording-transcriptions-assemblyai` directory +of the +[blog-code-examples](https://github.com/fullstackpython/blog-code-examples) +Git repository if you do not want to type or copy from the blog post +itself. + +Create a new directory named `record-transcribe` to store your source files +and change into the new directory. + +``` +mkdir record-transcribe +cd record-transcribe +``` + +Create a new file named `app.py` with the following code: + + +```python +import os +from flask import Flask, request +from twilio.twiml.voice_response import VoiceResponse +from twilio.rest import Client + + +app = Flask(__name__) + +# pulls credentials from environment variables +client = Client() + +BASE_URL = os.getenv("BASE_URL") +twiml_instructions_url = "{}/record".format(BASE_URL) +recording_callback_url = "{}/callback".format(BASE_URL) +twilio_phone_number = os.getenv("TWILIO_PHONE_NUMBER") + + +@app.route("/record", methods=["GET", "POST"]) +def record(): + """Returns TwiML which prompts the caller to record a message""" + # Start our TwiML response + response = VoiceResponse() + + # Use to give the caller some instructions + response.say('Ahoy! Call recording starts now.') + + # Use to record the caller's message + response.record() + + # End the call with + response.hangup() + + return str(response) + + +``` + +There are a couple more functions we'll need to add to `app.py` but first +let's take a look at what the above code does. + +We imported parts of both the Flask and Twilio helper libraries, which will +enable us to programmatically create and control phone calls that Twilio +records. Note that when we instantiate the Twilio helper library with the +empty `Client()` constructor, it automatically looks to read two environment +variables, `TWILIO_ACCOUNT_SID` and `TWILIO_AUTH_TOKEN` to gain appropriate +permissions to your Twilio account. If those two environment variables +are not set with those exact names then you will need to explicitly pass +the Account SID and Auth Token for your account into the constructor. + +After the import are the Flask and Twilio library instantiations. +Then we configure the `BASE_URL` by reading from an environment variable. +In this tutorial the `BASE_URL` will be from Ngrok, but it can also +be your domain where your application is deployed, such as +"https://www.twilio.com". We have not yet set these environment variables, +but we will shortly after we finish writing `app.py`. + +After setting `BASE_URL`, and the three other variables set by environment +variables, we have the `record` function. This function is a +[Flask route](https://hackersandslackers.com/flask-routes/) that +generates the [TwiML](https://www.twilio.com/docs/voice/twiml) +that tells Twilio how to handle a phone call. First, an automated voice +alerts the person who picks up that the phone call is being recorded. Then +the recording starts. Whatever the person on the call says will be recorded +and stored by Twilio. + +Finish `app.py` by adding these two following functions after the +`record` function: + +```python +@app.route("/dial/") +def dial(phone_number): + """Dials an outbound phone call to the number in the URL. Just + as a heads up you will never want to leave a URL like this exposed + without authentication and further phone number format verification. + phone_number should be just the digits with the country code first, + for example 14155559812.""" + call = client.calls.create( + to='+{}'.format(phone_number), + from_=twilio_phone_number, + url=twiml_instructions_url, + ) + print(call.sid) + return "dialing +{}. call SID is: {}".format(phone_number, call.sid) + + +@app.route("/get-recording-url/") +def get_recording_url(call_sid): + recording_urls = "" + call = client.calls.get(call_sid) + for r in call.recordings.list(): + recording_urls="\n".join([recording_urls, r.uri]) + return str(recording_urls) +``` + +The `dial` function creates a Flask route that takes a phone number +input as part of the second level path. Note that in a production +application you *must* have better phone number validation or you +will have a security issue with unsanitized inputs. We are doing +this here to easily grab a phone number as input rather than having +to build a whole user interface with an HTML form just to grab a +phone number. `dial` calls the +[Twilio Voice API](https://www.twilio.com/docs/voice) using our +Twilio account credentials so that we can dial an outbound phone +call to the number sent in through the URL. The `twiml_instructions_url` +should be set to the `record` function URL so that it can give the +proper dialing and recording TwiML instructions for how Twilio's +service should handle dialing the phone call. + +Once we dial the outbound phone call, the +[call SID](https://support.twilio.com/hc/en-us/articles/223180488-What-is-a-Call-SID-) +is printed to the terminal. We'll need that call SID to get the +recording after the call is finished. + +Our `app.py` file is all done. We just need to export our environment +variables for our Twilio credentials. + +[Sign up for Twilio](https://www.twilio.com/referral/w9pugq) or +[log into your existing account](https://www.twilio.com/console). +Once you get to the [Twilio Console](https://www.twilio.com/console), +you can obtain your `TWILIO_ACCOUNT_SID` and `TWILIO_AUTH_TOKEN` on the +right side of the page: + +Twilio Console. + +When you sign up you should have a phone number assigned to your account. +You can use that or +[purchase a new phone number](https://www.twilio.com/console/phone-numbers/search) +to use. + +Set three environment variables with the names `TWILIO_ACCOUNT_SID`, +`TWILIO_AUTH_TOKEN`, and `TWILIO_PHONE_NUMBER` using the `export` command +in your terminal. Make sure to replace the values with your own Account SID, +Auth Token and Twilio phone number. + +```bash +export TWILIO_ACCOUNT_SID=xxxxxxxxxxxxx # found in twilio.com/console +export TWILIO_AUTH_TOKEN=yyyyyyyyyyyyyy # found in twilio.com/console +export TWILIO_PHONE_NUMBER=+17166382453 # replace with your Twilio number +``` + +Note that you must use the `export` command in every command line window +that you want this key to be accessible. The scripts we are writing will +not be able to access the Twilio APIs if you do not have the tokens exported +in the environment where you are running the script. + +There is one more environment variable to set before we can run `app.py`. +We need to use Ngrok as a localhost tunnel so that Twilio's webhook can +send an HTTP POST request to our `app.py` Flask application running on +our local development environment. + +Run Ngrok in a new terminal window, because you will need to keep it +running while we run our other Python code: + +```bash +./ngrok http 5000 +``` + +Ngrok running with a localhost tunnel. + +Copy the HTTPS version of the "Forwarding" URL and set the `BASE_URL` +environment variable value to it. For example, in this screenshot you +would set `BASE_URL` to `https://7f9139eaf445.ngrok.io` using the +following command: + +```bash +export BASE_URL=https://7f9139eaf445.ngrok.io # use your ngrok URL, or domain. no trailing slash +``` + +Okay, we can finally run `app.py`. Make sure you are still running Ngrok +in a different window, your virtualenv is active and that in this terminal +you have your four environment variables set, then run the `flask run` +command: + +```bash +flask run +``` + +You should see Flask output something like the following text: + +```bash + * Environment: production + WARNING: This is a development server. Do not use it in a production deployment. + Use a production WSGI server instead. + * Debug mode: off + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` + +That is a legitimate warning: only use this command for +development purposes and when you want to [deploy](/deployment.html) +to production you need to use a real [WSGI server](/wsgi-servers.html) +like [Gunicorn](/green-unicorn-gunicorn.html). + +Time to test out our application. + + +## Testing Twilio Programmable Voice Recording +We can test our application by going to localhost on port 5000. +Go to this URL in your web browser, replacing the "14155551234" +with the phone number you want to call, where the person on the +line will be recorded: http://localhost:5000/dial/14155551234. + +That number should now receive a phone call from your Twilio +number. Pick up, record a message that you want to use to test +the transcription, and then hang up. + +If you get an error, make sure all of your environment variables +are set. You can check the values by using the echo command like +this: + +```bash +echo $BASE_URL +``` + +When the call is over, copy the call SID show on the web page +so that we can use it to look up where the recording audio +file is stored. + +Twilio call SID. + +Go to "localhost:5000/get-recording-url/" with the call SID +at the end. For example, +"localhost:5000/get-recording-url/CAda3f2f49ff4e8ef2be6b726edb998c92". + +Twilio call recording URL. + +Copy the entire output except for the ".json" at the end, then paste +it into the web browser's URL bar, prepended with "api.twilio.com". +For example, +"https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300". +This will bring up the recording. Copy the entire URL and we will use it +as input into the AssemblyAI service. + + +## Transcribing with the AssemblyAI API +We can now use the AssemblyAI API for speech-to-text transcription on +the call recording that was just made. + +[Sign up for an AssemblyAI account](https://app.assemblyai.com/login/) +and log in to the +[AssemblyAI dashboard](https://app.assemblyai.com/dashboard/), then +copy "Your API token" as shown in this screenshot: + +AssemblyAI dashboard. + +We need to export our AssemblyAI API key as an environment variable +so that our Python application can use it to authenticate with their +API. We also need to pass the publicly-accessible URL for the recording, +so we'll set that as an environment variable as well. + +```bash +# make sure to replace this URL with the one for your recording +export ASSEMBLYAI_KEY=your-api-key-here +export RECORDING_URL=https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300 +``` + +Create a new file named `transcribe.py` and write the following code in it: + +```python +import os +import requests + +endpoint = "https://api.assemblyai.com/v2/transcript" + +json = { + "audio_url": os.getenv("RECORDING_URL") +} + +headers = { + "authorization": os.getenv("ASSEMBLYAI_KEY"), + "content-type": "application/json" +} + +response = requests.post(endpoint, json=json, headers=headers) + +print(response.json()) +``` + +The above code calls the AssemblyAI transcription service using +the secret key and passes it the URL with the file recording. +The script prints out the JSON response from the service, +which will contain a transcription ID that we'll use to access +the results after they finish processing. + +Run the script using the `python` command: + +```bash +python transcribe.py +``` + +You will get back some JSON as output, similar what you see here: + +```bash +{'audio_end_at': None, 'acoustic_model': 'assemblyai_default', 'text': None, 'audio_url': 'https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300', 'speed_boost': False, 'language_model': 'assemblyai_default', 'redact_pii': False, 'confidence': None, 'webhook_status_code': None, 'id': 'zibe9vwmx-82ce-476c-85a7-e82c09c67daf', 'status': 'queued', +'boost_param': None, 'words': None, 'format_text': True, 'webhook_url': None, 'punctuate': True, 'utterances': None, 'audio_duration': None, 'auto_highlights': False, 'word_boost': [], 'dual_channel': None, 'audio_start_from': None} +``` + +Find the value contained with the `id` field of the JSON response. We need +that value to look up the final result of our transcription. Copy the +transcription ID and set it as an environment variable to use as input by +the final script: + +``` +# replace with what's found within `id` from the JSON response +export TRANSCRIPTION_ID=aksd19vwmx-82ce-476c-85a7-e82c09c67daf +``` + +We just need a little more Python that looks up the result and we'll be all +done. + + +## Retrieve the AssemblyAI Transcription +AssemblyAI will be busy transcribing the recording. Depending on the size of +the file it can take anywhere from a few seconds to a few minutes for the +job to complete. We can use the following code to see if the job is still +in progress or it has completed. If the transcription is done it will print +the results to the terminal. + +Create a new file named `print_transcription.py` with the following code: + +```python +import os +import requests + +endpoint = "https://api.assemblyai.com/v2/transcript/{}".format(os.getenv("TRANSCRIPTION_ID")) + +headers = { + "authorization": os.getenv("ASSEMBLYAI_KEY"), +} + +response = requests.get(endpoint, headers=headers) + +print(response.json()) +print("\n\n") +print(response.json()['text']) +``` + +The code above in `print_transcription.py` is very similar to the code +in the previous `transcribe.py` source file. imports `os` (operating system) +from the Python standard library, as we did in the previous two files, +to obtain the `TRANSCRIPTION_ID` and `ASSEMBLYAI_KEY` environment variable +values. + +The `endpoint` is simply the AssemblyAI API endpoint for retrieving +transcriptions. We set the appropriate `authorization` header and +make the API call using the `requests.get` function. We then print +out the JSON response as well as just the text that was transcribed. + +Time to test out this third file. Execute the following command in +the terminal: + +```bash +python print_transcription.py +``` + +Your output will be different based on your recording but you should see a +result in the terminal similar to the following: + +```bash +{'audio_end_at': None, 'acoustic_model': 'assemblyai_default', 'auto_highlights_result': None, 'text': 'An object relational mapper is a code library that automates the transfer of data stored in a relational database tables into objects that are more commonly used in application. Code or MS provide a high level abstraction upon a relational database that allows the developer to write Python code. Instead of sequel to create read update and delete data and schemas in their database developers can use the programming language that they are comfortable with comfortable to work with the database instead of writing sequel statements or short procedures.', 'audio_url': 'https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300', 'speed_boost': False, 'language_model': 'assemblyai_default', 'id': 'zibe9vwmx-82ce-476c-85a7-e82c09c67daf', 'confidence': 0.931797752808989, 'webhook_status_code': None, 'status': 'completed', 'boost_param': None, 'redact_pii': False, 'words': [{'text': 'An', 'confidence': 1.0, 'end': 90, 'start': 0}, {'text': 'object', 'confidence': 0.94, 'end': 570, 'start': 210}, {'text': 'relational', 'confidence': 0.89, 'end': 1080, 'start': 510}, {'text': 'mapper', 'confidence': 0.97, 'end': 1380, 'start': 1020}, {'text': 'is', 'confidence': 0.88, 'end': 1560, 'start': 1350}, {'text': 'a', 'confidence': 0.99, 'end': 1620, 'start': 1500}, {'text': 'code', 'confidence': 0.93, 'end': 1920, 'start': 1620}, {'text': 'library', 'confidence': 0.94, 'end': 2250, 'start': 1860}, {'text': 'that', 'confidence': 0.99, 'end': 2490, 'start': 2220}, {'text': 'automates', 'confidence': 0.93, 'end': 2940, 'start': 2430}, {'text': 'the', 'confidence': 0.95, 'end': 3150, 'start': 2910}, {'text': 'transfer', 'confidence': 0.98, 'end': 3510, 'start': 3090}, {'text': 'of', 'confidence': +0.99, 'end': 3660, 'start': 3480}, {'text': 'data', 'confidence': 0.84, 'end': 3960, 'start': 3630}, {'text': 'stored', 'confidence': 0.89, 'end': 4350, 'start': 3900}, {'text': 'in', 'confidence': 0.98, 'end': 4500, 'start': 4290}, {'text': 'a', 'confidence': 0.85, 'end': 4560, 'start': 4440}, {'text': 'relational', 'confidence': 0.87, 'end': 5580, 'start': 4500}, {'text': 'database', 'confidence': 0.92, 'end': +6030, 'start': 5520}, {'text': 'tables', 'confidence': 0.93, 'end': 6330, 'start': 5970}, {'text': 'into', 'confidence': 0.92, 'end': 7130, 'start': 6560}, {'text': 'objects', 'confidence': 0.96, 'end': 7490, 'start': 7100}, {'text': 'that', 'confidence': 0.97, 'end': 7700, 'start': 7430}, {'text': 'are', 'confidence': 0.9, 'end': 7850, 'start': 7640}, {'text': 'more', 'confidence': 0.97, 'end': 8030, 'start': 7790}, {'text': 'commonly', 'confidence': 0.92, 'end': 8480, 'start': 7970}, {'text': 'used', 'confidence': 0.86, 'end': 8750, 'start': 8420}, {'text': 'in', 'confidence': 0.94, 'end': 9050, 'start': 8840}, {'text': 'application.', 'confidence': 0.98, 'end': 9860, 'start': 9110}, {'text': 'Code', 'confidence': 0.93, 'end': 10040, 'start': 9830}, {'text': 'or', 'confidence': 1.0, 'end': 11210, 'start': 10220}, {'text': 'MS', 'confidence': 0.83, 'end': 11480, 'start': 11180}, {'text': 'provide', 'confidence': 0.94, 'end': 11870, 'start': 11510}, {'text': 'a', 'confidence': 1.0, 'end': 11960, 'start': 11840}, {'text': 'high', 'confidence': 1.0, 'end': 12200, 'start': 11930}, {'text': 'level', 'confidence': 0.94, 'end': 12440, 'start': 12170}, {'text': 'abstraction', 'confidence': 0.95, 'end': 12980, 'start': 12410}, {'text': +'upon', 'confidence': 0.94, 'end': 13220, 'start': 12950}, {'text': 'a', 'confidence': 1.0, 'end': 13280, 'start': 13160}, {'text': 'relational', 'confidence': 0.94, 'end': 13820, 'start': 13280}, {'text': 'database', 'confidence': 0.95, 'end': 14210, 'start': 13790}, {'text': 'that', 'confidence': 0.96, 'end': 14420, 'start': 14150}, {'text': 'allows', 'confidence': 0.99, 'end': 14720, 'start': 14360}, {'text': +'the', 'confidence': 0.56, 'end': 14870, 'start': 14690}, {'text': 'developer', 'confidence': 0.98, 'end': 15290, 'start': 14810}, {'text': 'to', 'confidence': 0.94, 'end': 15410, 'start': 15230}, {'text': 'write', 'confidence': 0.96, 'end': 15680, 'start': 15380}, {'text': 'Python', 'confidence': 0.94, 'end': 16070, 'start': 15620}, {'text': 'code.', 'confidence': 0.98, 'end': 16310, 'start': 16070}, {'text': 'Instead', 'confidence': 0.97, 'end': 17160, 'start': 16500}, {'text': 'of', 'confidence': 0.93, 'end': 17340, 'start': 17130}, {'text': 'sequel', 'confidence': 0.86, 'end': 17820, 'start': 17280}, {'text': 'to', 'confidence': 0.91, 'end': 18090, 'start': 17880}, {'text': 'create', 'confidence': 0.89, 'end': 18450, 'start': 18090}, {'text': 'read', 'confidence': 0.88, 'end': 18840, 'start': 18480}, {'text': 'update', 'confidence': 0.92, 'end': 19290, 'start': 18870}, {'text': 'and', 'confidence': 0.94, 'end': 19590, 'start': 19230}, {'text': 'delete', 'confidence': 0.89, 'end': 19920, 'start': 19530}, {'text': 'data', +'confidence': 0.95, 'end': 20190, 'start': 19890}, {'text': 'and', 'confidence': 0.92, 'end': 20490, 'start': 20250}, {'text': 'schemas', 'confidence': 0.86, 'end': 21000, 'start': 20430}, {'text': 'in', 'confidence': 0.94, 'end': 21210, 'start': 21000}, {'text': 'their', 'confidence': 0.98, 'end': 21510, 'start': 21150}, {'text': 'database', 'confidence': 0.97, 'end': 21900, 'start': 21450}, {'text': 'developers', 'confidence': 0.83, 'end': 23200, 'start': 22420}, {'text': 'can', 'confidence': 0.95, 'end': 23440, 'start': 23200}, {'text': 'use', 'confidence': 0.97, 'end': 23650, 'start': 23410}, {'text': 'the', 'confidence': 0.99, 'end': 23890, 'start': 23590}, {'text': 'programming', 'confidence': 0.97, 'end': 24370, 'start': 23830}, {'text': 'language', 'confidence': 1.0, 'end': 24700, 'start': 24310}, {'text': 'that', 'confidence': 1.0, 'end': 24880, 'start': 24640}, {'text': 'they', 'confidence': 0.99, 'end': 25060, 'start': 24820}, {'text': 'are', 'confidence': 0.85, 'end': 25210, 'start': 25000}, {'text': 'comfortable', 'confidence': 0.92, 'end': 25780, 'start': 25180}, {'text': 'with', 'confidence': 1.0, 'end': 25960, 'start': 25720}, {'text': 'comfortable', 'confidence': 0.94, 'end': 29090, 'start': 28090}, {'text': 'to', 'confidence': 0.84, 'end': 29840, 'start': 29180}, {'text': 'work', 'confidence': 0.95, 'end': 30050, 'start': 29780}, {'text': 'with', 'confidence': 0.98, 'end': 30290, 'start': 30020}, {'text': 'the', 'confidence': 0.69, 'end': 30440, 'start': 30230}, {'text': 'database', 'confidence': 0.98, 'end': 30860, 'start': 30380}, {'text': 'instead', 'confidence': 1.0, 'end': 32780, 'start': 31780}, {'text': 'of', 'confidence': 0.98, 'end': 32900, 'start': 32720}, {'text': 'writing', 'confidence': 0.87, 'end': 33320, 'start': 32870}, {'text': 'sequel', 'confidence': 0.88, 'end': 33860, 'start': 33290}, {'text': 'statements', 'confidence': 0.95, 'end': 34310, 'start': 33800}, {'text': 'or', 'confidence': 0.9, 'end': 34460, 'start': 34250}, {'text': 'short', 'confidence': 0.9, 'end': 34790, 'start': 34430}, {'text': 'procedures.', 'confidence': 0.98, 'end': 35270, 'start': 34760}], 'format_text': True, 'webhook_url': None, 'punctuate': True, 'utterances': None, 'audio_duration': 36.288, 'auto_highlights': False, 'word_boost': [], +'dual_channel': None, 'audio_start_from': None} + + +An object relational mapper is a code library that automates the transfer of data stored in a relational database tables into objects that are more commonly used in application. Code or MS provide a high level abstraction upon a relational database that allows the developer to write Python code. Instead of sequel to create read update and delete data and schemas in their database developers can use the programming language that they are comfortable with comfortable to work with the database instead of writing sequel statements or short procedures. +``` + +That's a lot of output. The first part contains the results of the +transcription and the confidence in the accuracy of each word transcribed. +The second part is just the plain text output from the transcription. + +You can take this now take this base code and add it to any application +that needs high quality text-to-speech transcription. If the results +aren't quite good enough for you, check out this tutorial on +[boosting accuracy for keywords or phrases](https://docs.assemblyai.com/guides/boosting-accuracy-for-keywords-or-phrases) +as well as +[selecting a model that better matches your data](https://docs.assemblyai.com/guides/transcribing-with-a-different-acoustic-or-custom-language-model). + + +## What now? +We just finished building a highly accurate transcription application for recordings. + +Next, try out some of these other related Python tutorials: + +* [How to Transcribe Speech Recordings into Text with Python](/blog/transcribe-recordings-speech-text-assemblyai.html) +* [Reporting Exceptions in Python Scripts with Sentry](/blog/report-exceptions-python-scripts-sentry.html) +* [Basic Data Types in Python: Strings](/blog/python-basic-data-types-strings.html) + +Questions? Let me know via +[a GitHub issue ticket on the Full Stack Python repository](https://github.com/mattmakai/fullstackpython.com/issues), +on Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). +If you see an issue or error in this tutorial, please +[fork the source repository on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/201009-accurate-twilio-voice-call-recording-transcriptions-assemblyai.markdown) +and submit a pull request with the fix. + diff --git a/static/img/201009-twilio-flask-assemblyai/call-recording-url.png b/static/img/201009-twilio-flask-assemblyai/call-recording-url.png new file mode 100644 index 0000000000000000000000000000000000000000..e2ee688f341d69969308ad74a60fca75931f0173 GIT binary patch literal 80463 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%0AN#k*th*py{{{Ch|F}Oh9K$Kt2Ks{Sw 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 literal 0 HcmV?d00001 diff --git a/static/img/201009-twilio-flask-assemblyai/dial-call-sid.png b/static/img/201009-twilio-flask-assemblyai/dial-call-sid.png new file mode 100644 index 0000000000000000000000000000000000000000..a7b52751747a30a7d814054df9f91517068fd4b3 GIT binary patch literal 37149 zcmeFY1zVg;@;3|w8GP{I9)i2Oy9Rd%8r%nm;2t2j6N0-t!CeBu-GaOOGub_7cmF4Q z_6xi(*IYwS->ubE)g`|>Oi4i!837Lg0s;bAT1rd>0sziTC^b`kltI0 ziYiHqijpWf+L>8en?gWHg(YafX}%l8&eTznw(wWV3tWMY#S@YN(0}w(6;>5NmwLUJ{3eto=bWRV`(}1q6ADKtRMnIwUHQzV&Owg=iHciN}EwLJIImD+*%4!WOkA34s*hdl%&N z15|`yUUZfSnU)95&=Upm$I2v8AQe>)@`g2c(w7vS{v^~} zwfP2`i#Tq)XMAHcyH79jRb13q#xxMG>!jk)5vw?QV8dH`Eb5TW^yq%}p)3p}z!%@z zkeWs0#pZnQp(EEJip{P{!g>pP(JRx7u3rkPfgK*7`{Sz96>$6N3|~~2G0rg#&Rs0r zfjOWFAa1n2zf{E$%cd32=&GpxIyF0Gk$gC2c5c%|*(XoN4!No*_pLH34zU^lry!L$ zCKjuYs%W!^)#>ib=JeT`I0>x1@M}XzN^31cmI0W!`r}~RTUmZ|$Xg*4M?XO02etrK z6*!5!(-c5>CowS0&)7nL_gf(VQ}}6zwCsKlp&Cvi0@iHHzaNO>XYmQumln=UI;8ch zpQIA`U5FcGBs($3^qimzL1EZ;i_ZbAbQ!|3#$3#iuf-!tc-HelKq9~XZ{`4NA};(J z{K#uY&#w0(yz7wbG&uqGPH}l+&+>Hdh2XYgCQQ<=T>2XMw=Vlc&x8h0QXJmcBIr6W z?uG=wiH@%*4Nv!!4P{)}of8bLm84o7zCFhLY%B(!!{x*KZc%H|GgMsdd&R+*Xm+c@ z;-#EeyC6U#7gfu>ciKru)Kln5ZJDmRy||yL)1VP$ozPkq5&)Dup5H` zd~v?Fn^s=MG)49mE+>vJdAP5FaxH_3k^3^}(ioDqLJ_qHZn1z>AQk^b`^1oz5MGF4 zyYPGVt5ojOGNEMim&t@yND`&F)m7hJMm?mZsfUh`#m6%Po)Gd=7enZ8dyf7p`gt?! z#c+`A$j)ogERfjWV7a;?`TS4;5Tqmok+2RV@Ol1Wm1D+@ncIdm$?!k@Rg_Q?KdKqh z&jC0Bjtp_;5b?f|+9Rby?|c)t$65+LD8S%@<6ooS6$J(cPN2aWf7B#%4Mp7WuZ$(3 zAP5si|HMXtF({lDik=eY74n&UIJR!!O&;tW40kAj=orb-fc%!gWKgS!K<;Z9QDh~j zA4G)y)ygP%QEzfECJ3Anv?IqPalRy2us36rNyg;tOq5u_-4h)3LgWWAGt-V>y??Ju zha%fw&CJb#PuopX`JoiW>f_6$Y3ZwjK7lo{bpINAjmF?FrzX07ik;@05vO&xuB}9N zy^NbTXGD*P{t8Uwjlf5EzAi2i6eF6P&q~5`GF(DjkZ$j&*6CxVOwb8K+wD2?(VW6q zLnA^D!dk*cdt5g}jTytlSV)^bK}kDM2o!x%mC+VmkmiwT7Tc$2qq2&nA0*lWIPz%8 zFpz3|a{CnXi7__o)5F_lOx|!o%4o7YxdOTz>l`*^1|=S9Z&m){SL~ls#YVr5eNk6A zD5NTME3Bxitu3v4tnK?CUHkKc+J~d>JY_Bh2e0I_e#&i5vRKG07%y;WvmU)UV$V=$ zCiry3BNF5$Zy$CayhH)y_ivqk=AW#TY%7PeN3;8tRwss;dhJt<64s5nQQq{`nx7}% zjZluXjaZGuNc@x_Admen@`dM%ti(xV2yV#hh{)kcH+%#3XNxWtc+NpqEwf2O$5~8H z7Y;%zo@wWRJ@~0(BiL@JVEEt!!a1(_S(T5WfCF!%OkhBQY1xn(khxV&jYQn2kv~8+C)a=)|Rw~pp zRIS)}&jx?!t{<$|vYaxWdT(XP+vl2ZQ+7np8&0^WVBN5A{CSzz6YfFvf%p*rFpK9k z?akmh>Yl31bC}=R@C-w>NsW?6lZ9bnvVAZtccW zlBY?upW9ypL8|V$XL+6yps_RSORv4{4a)O{HJ9$Rb^g8wxD)J?ae;OL$1I*K1_PZ{ zxmB0;*?HJQ&^6h$rQk<{!c~F}Q6J(*??=R^oBJ2sHM~zamE>!CZ$p%Gm31Wek!n%4 z;A{~N0md+M*msK zU7J>Gsf!jrRJmc@S`(94qskm50wz5U{~*eUe&!P!6_dHRLK2szF6nWiJ*5>Tqth2h z&Y$hW5yOj#vsqcG9W8#kpS0|iiWx`a>lNyg`D`3pM#R-=4w5$nO{YH-xz~D?Kq<>9 zv0>wV>wa+m`sLhn`zbd&w>bCa-Mjqbw0ur^o})+Sojt??LF(wY&+f1SqD)^*^QTAL zSx?3{Mi$ucQ!?0FOruBB@0@scB*vBnVt5$sR_rK`DTifOyprzqro1lhoOT2s1L;AmQ-chK0!___mxpPG1nJS~cpf$fh-rNf4bs~hZNkRm zkY&SUzsgq7BkI?CH?5p+Y@=#KYAJWb)m2+>r>VuOXB3?l&o!ntYd1B2Vacy{h&oFB zY9&yHRnex6rCsNlG2a|?uu_Io-cd_xBDySb5w(pk_)KxP*Oxyae>HtQjg=Ob7QrF7 z5?8(bWBf47sy@}0e)Zlx%~_}aI`F8By`7z%cf^&hNZcx+PLG$>ReuSqzNBib&UVW7 z=kYneVT|K=jRA{qQ$44L-LSxQd-Id)!z`g8!P^qa{esyWworT?yeYgz)M$aZNz4i7 zHH`*?2Eu9{RhPNb(>U@U`M}?k5*;J{QkNLTQRRPcW;9Q8-Tw9Ca}t1Rbew zC#!~yk`(pV^|;;GuRlE0ZCP=ao9mu5lD3{*nmvyuHH6zY?f3WJUST-05Do zRlx1=MD_7j@EhQ@>`j+ERV<=A^;b z(3k6q`D!!1y(mj6i$;*w+x8y)XBMD=9OP2EW{=mpJ1fM z>K!b!^6EP{;H{#jHzNU%7-HYBfT!Fk4RY>P+LP`8A(Y>KVJ0S&lHzzyKAL!aK}c!@ ztQ}wA&C^rGC?p9xS{xK#|vxg7h_IHi_F}1tKvYw39MjH;e^`zb=}jb!jl|> z?OPjERWy*l-GeVAnp5bU4wE(~*z3?W)s!}qmxrJMmjMvakgyQ1z$HisDDW5hA7w~z z`R%{!Lo6Yn|Ir2lLIC_90s<-<>dzXO?Ce*6mLY0>J*?;ANdPx#uvFD_)|8jyd2eUK zU}R!vY{~$#vH#Tof)B(4F4~wn8TF?Xu$(6|EgvrBl$-YXDfa(O?f2} zQ9DOd5_SeQ1|~8A1QHSwK1UNX9u+Z(Ke~f|@sn9NJKOUxGP=3BF}SfZ*g2XrGIMit zGcvI-varyDThKeX+d3P8=xv?I|2fE?%CHXb3k+GeNGd~&GuZjNk z_s?}YTbliQCR?XJwguiGIm-q$83Kt@b6pv$5_Ai&7))qGPTwcv$Qd_{pb9g+cp#kB=Xj5M(MR)cI2<`0xH& zh;tJ(BT^)NFG-MgJ=dkbkONq`%-jQ$g2{bp#;E>pS9Y*t$MS`+mFx68T#S0MVe|3Q0n%T}wluK%Kg_ zd+)q?&%@hjpY(T=xMF}OX{lh8#6bouHM@wq3rGgMTc`e80t)5*T2)b_d!=O9x2K1j z?Vn{YTPtmzF_V?t>VHEpNc2j0CBJ%QCSj;`$+hPvPsh!lzDP}IK2q}-e@8AP3NX1~ z_1Q8VFW*3%-Q7pMY;^`ae18ygcm4a#cR~}ztUb^3!}F;?16^Nbj$>vK7Y&bf#{CTs zgGhu>El>@U<)Ly&{gTIlIhOw%JBNzNdUs%g(@Yk;qYgmpgT7?Peii!vS!-Yd1b=q7 z%%>yiHBx__23z}1;T7b+U78_S2yDI?#zBk7u8n0ZIzEh*O>mg={w={m6Ts)#KQuff zEdItH4wXoA<6?Axk0M6=Z>5&`BLvLuYljq2-1ig+zAW4uZXN^DO#J_|=6|26kSbc} zxj4XTww(T}Y*Hc?t$LxNs(N)={6#m!_Ss*#U0pwYbWo5DQT3jAg|mAIuIP^S7w#i?JHM{4D|3!h}8} zOaOrq*!0C?WsciJF|`oL0HE<^PZ)U!3gNkPo3XRcOsUpanFN}TWxP`&Y(vbMzmN>eva&6 z<}RbZe*@nm0Hr8!m&f;XIdwiR_|ntf=^*y|`k3Q{KEqFF3;p=PVY^fqAG3s=*`e(v zpTSdy=WC6TQ&-?gf`cP+$$QdDj?ZEJ2?h~+PCnx%S`P>VPbcsi7gqRgl#`c6(cCu% zP8iSFCEy-;d(lpEDDG>-lMUX!2dzda8mMu#(Lqlpi5hp`Cs(ICPda|EIKk?N<&&y;<`M(tgs*_-75a(qFnQ9fYc zn~_8=84WP*gfj+Dngk7xKJfhXU~1{ND$j>V!e-FyEd56AwK*||XmI3Yr4hONVO9Uu zH~&}F_Um3PbfsY*W?0`UX7UxMW%=NdYgFi8EqoQ+jKJqC=h1M++;utiu*d#gM#X5M zl*xp6VS0`h8)y}0EyUlTE5c^B1GQ>zOBd=7{|44T>mznMjnG`^9`nGpP>X=jrD{{Fq;3KMN6kbAExM4> zPxycq|5JQmI$AV&$W@VgTd+xk81L)z7S|&N%gOu%hfN=KceE>F=(>JlU)_zqC>-UG z&^RB`Vq@LPKzNL%^neDIr0|#lh3?>}BY1WL(col0+a=AIX#~u-Zy8&agul&MTJZWl z^HFy343Bs(#n*k9PQ2V>O`fNTnmYn(kJu=D&cL@$W-KEvUbkQ>E`h~*n|B{skFf~LUww3Luw51bFer16w78M$ z(>a8XpVkv_I|f?MH45}hkcxEk;$-2f&qc9(9hT{jw$s7Dw^Y@`YVJOtB;Z`BS;NVF zXU2yPEpT`hi?#AK2k(IQ#Pw44(-k!AI`LxzN!1U%r(E#}>AQ2rMp_m3!T5qt`SNMB zkPkx%zRNQaIEkTWtH{V^x?1R@q;=;I~lShR^PWdS3#Gh3s>jGR@ydgkH;1+GUt zGQb!Y@**khx7`O?2# z%f@j2Qdrs40-ha~wR5Gt=55n=D>{-LDj-@bNL=#}COkmFdW>*35x++*CawAiI_<|m z=7NSS!6z}3jFuZRbw7zY0awlvCbJ*8P)(ws-ee4`K*dVkQ>KPZ@%~0xDf# z72|nL*bWWk5ckAwxj04Mvbgv3IGB;gg6+~-?0CK(wqefn&cBTeD^e>_FKp~fVKrA? zsR4RBi~)mvZ;d`L`s`1a*hP#3ZmMjTwQ09{1+2(u+dtE&X*=$Wl`V8m-S>oH*!CKR z{)obBvyK?&v|XwcF{7*M@=He#yed@rn!1on4$_VxdTP_{@L4{(+m$=Yhy)U?<9a|L zHakQ3BD{1 zBd)6#Dv^p27wWX$I@NQbR^5Wdy;4+M=ryrjoAN}pDXqUGM=NMJse%N|ePZt#g6(Cg zRq|9#B}rLiKAHhRqjMM*4n?rIS<`1@y{o-fb zOy7WM^5a4PYHr6ZKxzEja=ouISPw`**KUJx^Oo=3fw;llTG$B>r}>dm-Ch2`8ACt| z`+Az@Etor7ptqF~owY{Yc z+yv_#9z`AZ*A)gGV`GeJ#h)`~!r~|csJ>kvEm}p4Hxn$fTd9}8z{mFSuQMpHt#nNU z_d+fAQfKme)|cnD7Pke(55!TH96=)4Su4V#XjPlUdflDVlInRDdKOn)pxHtb8(d*f zDOg`+sa?fb9UY~+tUg=wN1>iQ88zmgie<5w#_1$J69l;YZd@B<`vY$L@^1;6@kKoO zL|^;um5rh5Rm4sqR9vJH4WIg;L~);FOkAQV+Z?aPa6#fhRpENPV$SN`FN?h1EimYK zp{78lTX*|eifeSt$>zn|epQc`g)(h;?Ql59?A~$VxiQMhrnlhC;yec!%%FYi^>Lmk zcL!j_Tw~yqVqvzpXPzm|nB{Yxa_-@RU<<@fV$dOL^SG)!2zldw@o=|uCUeOi<1ZaS zDhfLo7`Dmp8gYTo;T*UKvt_&5P9IP8LKaXaz=s=nyxuLLz0x=+s>sro?EE1f@aQ-8% zuh9wG^Q+7nK_BhJ+sLoK+zWtKJhWSBl{OEVdp_$wsmF1?KAcZ*t1E{_S$L3hZavclnX%OBq3pW?*ry6v@za#lCAhvGD@P zv%K$PYXY6+u0BOk7M^z(cQZ`ukN!WyE%a^}C9oQwyAF}l>-bg6_^wZm^vA5Un>HOLnY!Rf%@Hy zmL58lg7J=Co5!?*=)h<)^B07swZp0MOQzV~^Py?i>qFcOq^h9o7qHn{=yh4tmLKas zh)hqg+Tm-^8n*t^L^5A4MKAijLf)PB4^-y7x)ieJv8lz8lz?c5pK=3LMg;Pyt>_|N z5;~u;!1nR}Oj$*XW6f1-Avujkp^|d3TFJ4xmjw55Cs=nb1{GN{sE<6o^*FVM>mZuio%W~(=K`g1{9IjZ6;?vy!AERy>vNl;;(*B#4X3T=`q zDCZ-g%&UmbPEpsmZRS#&(`-_io?d}gEgUTe5467Z>#{|a8Z-GK?K+Q71LpK|nsp!8 zwKm{9mm5|@wt}9XZdR*3u4L|PhV5i-ZKm?eDDU~phE_nE@+lVX7HOn3KnA0}%lUey z(2K=po03x9CS4Y@fx-<0^Qs>A*CHN5$r)S@9~Wj{Tzonr=u2OoABb@8MgiMKI=u*; zXG65|35BS^S-t{F#p)$_sV>J$(&$vubY*l#I-ccSuUrr6>5IKq+t+|-7HMbew@LuJ z17v(%D#QH=8qS_x8=xP%;lqCi@-T?n8R{%O`!JMp-ShRFbMDH2$|7> zet&}=$)+9qPL$5rCJY@WsO|g1?mK+!n+vl7#jM1xpol`6!8l469W3S;7flSe2xzd2 zHH^L&Fh)538stYT;5E@)9#g_Kdm0`L=V5_lWOjL%!w-ES8iG61C#{KNGSl^wp}7z}x4tW+&t9xbk3 zk3heejT&IF1|PpX&ngD{@awv}=PH+|m+3+8A|-x8R7QoeXqh#L&){{N^RB4w*+3zT z2JqDysTHdtCqP8i_s0;&dt4cyUl8G%)2lWZJ(>9@vG@F}PQ0~4SbBQ!H4d5Yykqxi z@=uQE1hg>Qe9ASITW*ib(2)$@{$to2 zAz<}p6erKy@iPi_Yx`5C6Qh>uq`-zVcgsGqzv=@Le@z7v5fOVKzi5ky$oGM+NNCgo z2TtLU?|0wBG_xB7ake48I@(b#%Odwg@!So00%l)91*}Vq)K$B&jIJ_Mu(z8L^G-^mbO4oPUy!u|K+?!id7&g{~Lp%pwBM)sMETDk~WV->H3yilTy)*EdS%{ln`aTxV6 za}fjWCt!1Mp?&YK8nng&TsYNSncg!bLh7=y5il0bF#Lj$$y`fdwH-^ zN=C7JvdEdf{2}38Lu`-}XuI5ONi5>Yy@-p70k#cQsRN-M^j}TY;C9u33FgCO>3FEQ zW|xrtWY_UTBO2oKRUrSi^Z_>DeSdU`-jac3ndVRb)P^&d1)PKU--2L0L{Odka$M2W zEPV0go3C@k(Qz{eV;v$VqO*>=B)(m4U2eDG?#7Nh1L1h8OLgzguX8wTR$hx_PY2Pe z(`gV5&4p0$cfo!m*|j{;1~G#jeCci8mw-Zz8g&L^YA=YJZOXvIWfxg-q`w7f3?{q0>OXdkk+Wn5Y-~I^oxWym247&@=l2BCcWY* zy}Bm4O_S3O3fjq{h#|g6Y~Xa)WQaS1LMPY6#mB}BGI50Ik#xZ1Q=TkNs|A@zA&4cA zF$~acGMd5LiGdNyO%!^EXF%dz#qhhuaY(jy-|oN_g}h-Zk*5QB}BNP8ZU z%VXFLdk{ho_@pWg#`_1>VQ@2_LOA6?{8o$>)_X97uh+qPemoinDRvGs>eT_YiOoCb zJ_oX46$(X5;tx0FYfL1r`LRNUujqf6R$*H|Je(k^6RelIB7-=sV$^u2#-RgO8hG2u z$N4q75bn+*5yTe_fjV-#E4_?`on^exb%{x_5^5_q12HN2qO2zYP7n>ATZzC zvUSP(36@I5=F&trFoaB$bl(c4ceu08)o9Ls*U>|L0DF%U^XfbxbRk9w3!G+Yi*fTn zLFS{MqiX`A?^9fy7w9~8Zu|lGVO8C&TcCN zX`c;(1TdwGCOHsi`1BC&qr8Q4%u^kQr9%Lj0{T|*v$>tO8PBRINju9v8eyWS zt&CzA*$m8)?MT&ca~&cSW{#HlAC+w^YZx+~R8=yvfMu50u0+kgoE_uuH6ec6d@ZujecaG&e?M2_tU;vKyNyQW` zG6koLr|r?Q7xHa~ zqtt+Lx>#L9PoqR#&uk=}$To!fU48m8PBey=E1HN!`O>~Un3og7FsML$&c7lHENyEG zVHllVnjfLzRp%h=^mAR|P%(}c>Knv)0S%_Z2`KBGwjN}>i;`Q|_27`YD)AvWc%j|wc0dg_V|vT;WD>Mx1Po+2UYezkLUw%FKm1VL z@jY5l(`s>z>MwUtSde3UzeULJA$Do(3OJ~IFL_FlZyP|*mvq$z6|+`jK0eobnj5^s z)*4Rw^Nm8fSh?=qECVOTPaVjg-oZSQ(F9c`sUme5mJ}?eL)IrLN1wuWlJt{L#|3W| zuSTHXAUZ$Z)LKq?Ak}Qi0yrPorob_#YB#hb{0LDVdb^c1cog%L25;ZKoihI6|Ki|t z`U9@~W_EYs%cO4`q6RluB>+`-U?=0+uN9uC*InEv$6u_4b|US`DsWO10X?j%jtSvmL&SM&eG1hK>)|Efq3z#M++rJ>RU7 zIACU$$s5@Gye3$~)yWYNZyCV^#lMlJIX&-#yOImQxr5VNN!sj>nV*M2z^t4a6H8^Y z%+T^VA!y>Cvoq%czH9yE{LwG*JkTg*XY&{NJwTJyT7r+V+D$f* z&axmQ3>*lb*9t);uAh<;>X{)GA~7-NJSML(Mvw44-x^fI9_!xQPN!0=oE7ZKZe)EY z#HdoO#|bU#%)ZqqQB z{zPfDOJj2v2Rp$#>V^UqJvZP8eLmrN&*7_&6}YMWxSIqyZxymo&|^pkI!xqcxRCWv z!Maj$14rvl(MA7PaEA{H zJEWKJNEpb;_V(sxw}>FWo#7-wF?KqZJz6^HPziNdG3TeJ0AN%vT!uQ>5p8(yG~?88 zGJd;M_nzoC4gc+n@LJda!JBRePywM%4_FE558-p#eg<31CBoeSxS9R~h&?0%X)EIv z#Dsj=;2hdq#TYpGRr-lMYMS=$R0^ErX}R3Hh}CgcD~9##Z7wr3y*{`Jvlv$g*z5|j zAnPaTH9IGgingokmz;jmtMaOQyk9iqcDpX+yU~T0bsjbMwCuvKHLo~kDBuDOkoZHu z*~tRpSA8DZ>IzpNwdy{6C3&_EL#I>)!7p1ZHDA4vN^XB*l#veL9aBvJJAuIx@;hk=t^gBRmTsyTcl>J2uF3QX|9Tr-35 zRPo@1rp|lWeC;*d2G^qxUtE+5frKIVr|Y7>c=OmD^u{X28qk&en%jhaE)>2Zo!hC% zv(p+w3a_fK6aB_Ljl+iC>_IIVHE?_Yj8$My#PoMIpA~Dy<{Y54JXIgTX+6*Srr_pIvenTnCKHzBpij(lAWsU>ACd{3y zs5bbh-AtaN1&n*+=>f%2hKvE z1;1ZQGAIP~>|%6%C`+vqb@tsJ!m^wz6b3M=s9MiFs%e3(fAsgHdD~+dlHTbVbec>C zK6j?M8OY2y5h&O`uNNRzW^R*R?=LM&R#kJZq1Yb~*pOp>_AzqS_SMU|bBo#s!j#~%ksGFmx`%}KBQXt zKf-Jsxvi*Nb@JLSfm|2G!q68jGyHaW?N)S)^jf0PCow2xOu~8-T&jk#*BP)GoC!n9 z{Xhe>W$;j;ElfR;V1uF=r9OGiK77sWZmG#BPpxETModA3vNf^JID2!mb~$mtXHBRw zsZ}f5iq&P`#Qkd8tQZw=TK6HS)$Y65^P@Y%%GQ7=ffZBGy1=Db=xAgR)|E*5>4K|= zEitd_h(~#T9TimTm3d;BPJ=pgPa6y=;Rc65{(341fz^11b;>_-+`9jFOv<+}q9l_d z_Q_JqL7RSDcZGP++D^(0J=Xlr12qM@avN+uk06{FQ@{{7QD4`JpQhtr96{r+9Rruk zI#e}Bvd`7K^ZkqDLGgFvhaLaz2|E!-|1ot{b@_JsNi9_(#1b`I!v1b$QhLL-!?$ygiTT(O;9h5TK7SmEiU90n1?HF>~mY(zfe<%-M=l9mJ1mF^T4Qx*LaE>6H0fPO=_ zbwW>v71g1$N{SpCsVDjQ`Qc+7)22g5pV4)|1Gd+xcfcu9J=kbsD{0JI^*FHEcJLZG z*9E7d@?}#R2rFe{$%06Jz#B`pU_`go-KfLbxq`F>&%_9N(KZ2PL9Sly(VW)1QU+?8 z3SdB)1k_18PAiAl>lS0D{}c8)l_8OVu}DwBexp&UNqWl{p2+-Of;QMj0_zkxRGJpA!{WDXNMumE}w%Dl+76#A681Mquh?8vc zf_uWr*c%;$37}BST*~AV0U`H*qUEt;H@`p-rX6EOQ#SvCYw1-WjYs@j(;E}}OT|DQ zi2=rEcK4U}`DQ~G1l`Z`w2^3X?_(IAM5H8MBNKjjMar?ZT+l`i&I1*R-GbpC17Jbn zZ$Bo|>kGIDeK1*)Ld#x1LV|1(ehR+c2yEvP0`*y4Y1#vszy5+z#mYh;ntkXt{#Z3? z{BUc$c(nogtEEm-3=nIAAXIy`p(kS3wY*{OCJeJrK39*JBi<*p0%p`Ea zFI%_J&W(JkIecG8xrnPpoYDn-6@Ix*Ev_edrvw5?DQ%yG3IT==TCcmz zq0wC_RN*2%N>q7!Df@j6q4*1+&tFp-jN>b9EhSJjK?iS$k2d=72w3GvzE40R){UP^ z%1#!}^g!uaWc6=W25a!36kz9CsRMj0oBDQ2{6z+vClmZ;gxI|2x{{&y)is z8dxfT4C-(EzrpuJ;230vC;3HSz(z;Y|J^jkT>ezXw|5tp(j*c<(D`8FIr!om`U8{6 zypir6_d7J~j~bvlnBxCH3Vu_Bis8Rb?umH#j1@;-PARsU$UCzG#x?rXo3Z~5MZjF; z{)?+xt@>D_*P)3#4;?7QL?eR%-Z#gDO`azTNW@r*S^pO9zidF{m;A@UJ4umD0!Y~4 z1S-LiCG9Lv$Cvgicl+`4XdlC`d!&SxI00~Ee-V#Ae*)ZoEuWB@mjZm6p%^>xogu%+ z=KdsXRnWK1DpL}I-=j|d;#hD&=n@PZ=JC)&%|!lNJ_XB558f|U9sRl`^p{QjpPwWi zzYepl9Bw@LZ>a$8V2ljrld7L8jwFA3P~c4f+W<;_(fYFi=AyqrrT*L_xPR3zF4c6R z<_7-lsr^z1`p`sRH+(Q)*G1-cW$}N6#(z%8k7%N5oyHLieEs{GfynTD*WaowK>B=? z|7&Iv|JMrO@t7Z>&M$vQGX0x;B>(Mt`1j*KWz3ihOuPSouz!-{|2s4Tku_(&{+Hp9 z%j$3Xa3ZlYwb}Hq*8+MBq0}x;6|Y`<-GTQ1$+##`k3~Nrx|T_xtY%6{5zs?9p!GrP zK^9I7d}x2ivM=yV&>=6Sn(_ZjfTc(v!0Opg+N znKGU2p#)kYt=o6~?>8kY*Uqqh%tw(2c0edZ8V{^+Fa&3LvPi5$%Qh|S zn5=gNu^4qh7b)d@1m|UEVZf+)xUbgp)#tMYzS28m8K$ReoebMK%fEoYrJ7YDgm!(A zxW)Kxz95MoXQG}f-^&Qa(!uF~!QKd*X^!R$;_(n@V=~ClQOyC2@n2xW;+<762s6)Q zFz(v^vFN?VHMzspzS@;nFRMEkR8$O;*~Vp-K%PwLiVxjVf5{nGS|_ z9nMvCuiSjLSZ=P1B;=hb`F1n+K1O<@Cydf%|HpnjjT+5h5@S|R6#neH2FM-7ECD?{ zPTSH2`7{oBJoXQm_QbK%YqvRV)h^2_^EECRx?FB5wz?f}95(n!Q>q1NajUmJM`}6A zw&#AObh#fn?@r<`6)YVe2r+otxY^6;K)DK+2_Xu|Q~jFsXlt$>2x>K)d^>-)_<{R; z$2ROn)oU=Np%Bxny!D60V=9k9jliV20#R%RzQ)i`c0`kl;=A+t-8+?5YZr6&j_a3} z`wF@YZgtnEdI@+ni_hHV0!8W-L6~&wo@dInSd8|LcFUj7$nS?g6Sq6>m54RrP0ktn z-p{SuH%aR9pc=w;-G*~xn68$OR{P%A?dy*vbR=)l>&k>DRWJ;yuAtSm9!CB^sT^lAb3qpK`K^H{O~(&8q8JP+F+niK zH(_wqoAl;5Bpn){d}kza1zScLb@k|wI@?Z%X8)2&zwdrMEjEs*zUj&D3NkpDcN;o> zo);OHy@+lr%Yr{6JA7{Q+^K)G%vh~Q9yYz|qITS$6V_@ziS|Y@+c@vNsCFD<{J__b z^2`8_{wDEb@33^H2<2AOIit)HNHJylNk($}jP%xSxl(n8F@-u!o&J+A!_(KXCh3;) z$?JgeN1m5T)zsV3f^he4^^70mF_o8J7mYWJPokr$mzy(bapV%WsHcWbEz_JGzAe%p zU=K$}(VApk$=%*e!VG2>RARnWS4T)HF7)Ae*k>v|x;dVs7&eQE#|XJ88PwqmLD0O> zEz{6X3Jihl^s8ekg^ zCGaxt!$NHl=36Bp5{6CO4%Z`Xt$OPeS>hE}bV?Zta8gN?7_iQzuW7y1=-_$*#szR_ zBTSrLM$P!`Q~}9U0A@{K(hSBO^rlO zt*VC`0EN;1q?)L`q4Ra2LMCb4=MzXsP6;~4bFq%b=_)y!39n)VAtO+F?p)|!d#_R4(o3J3+E4RQq-(MHjuQ> zLQ~PBk^7#pNbZpA=yq0w?_jejt7+#C;va4f6OG$G@CrGEaP4XF9WT1rTC3!mGwJ2y z`fg7vP2R&BbHa(^8QEi1!ozOUH)~tp1x?R){j1H+*i!h70=+)S->rd-(&Sk<;!>*ws?Ka^5y)tLrc)k=drkfJ+@IYV?nmU^%INQf%FR5*Xf?zmJ8%@ zKDltCE=bsln^UI8NKl6sOj0?CP)Hw%iSLUzPKu!E=lf$nMS=sj)X@^0fl$TOcX~d2 z&f%ZSX1>|n7}>;xg>@3wCt+Q@DSl3?Jt8ZbGOf;(t}z+WARfw7HW)Df@>6yN!WY%v zvwGx@Yt-LDhU5n+mv*fMX%d58T*HdTFwsK1qJU+A3zWXw0!e6~nwNwDIEWqxPVWzB z7l$Qf&=5*LDMHajTo*q>kW_@P zFuZ%$V!9ITYdW`erBdpQl{D494ph-YAmjyYn)l6Bs4qJpmW?Lcf2qHZ1c)7u1<26suz zJ6i)>ez$^sqwPoObJLjFrEAyyfvo!5r9u}f%Fk~54`o|p2216rkf$w-%?l4^WN%_# z)=n0o(6gA2SrQIXyHTC+GQR>-)(2nC5A-NQD9?S^oQu5;Oh)y-DTLe^Lc01@zB>AV zrL@7?{$BJ=d7?yxOQNe@hY|*QN*O0`4fozQp5?q?8wPjfdUhUzrPNN+QjI=|Uf{tq zGB&HVpvT;cxSwu`yrT8HUh#|_b%o2bY9BpsVY0EKsnD!CX;+4jCTh>A_0Y4mQG@)O z7`$B$1M>|n@PR zpn&%i-(6r0WMWh)cFYSM*LZ0&k-xp&Sw4x#(TZ-s>SGk707i6w@aE;H?Ar_j}>MhP!wL@z?_70cVriq+LoNq##w5Hm zeV^Ukw-Yoz&$1i8_@4FR$b?EffrEE%8TdV~+0x)XOWXnjIXdCuW4{mnRJ_-Ry+-l63O8FnLiOw#+H1666Q2%)5*WBRs5#IwHjY_SNs+%;wVevMVd|w9-2*k)sJT`m(4GeqPg7mo~3qN{J^LQF^Vu; zptAg(c@n##UR4ZbRr%yhB2lHk3qlNPWMpx__b84|=9X}5pWX8><@YeD(j~>W7(MVi zkv*jSc$Sd#;VQiT__08(T8Pz#&x*dU&_3aIY_+khH-3R6`CVb0|9U-DVE)(bnwxF# zsM&M|IhWT;B~EtZvA?wogYvqxAUQ>(`K%N=i|&yTeQ-TV?Qld%`c~#j-`3PIG<1*R z<>-6G+as4n=FSS*r8Hx$lPK>l2T<7&^)<%sia`GZZjx!_I}9sxJg7Mop9(~O|6`buN$==Swb(StL1QCykhyXzyjrww`%<4^`i zcO@z%Z$-^Yc&X5($FS)06WhRH{Z22MJwX$%2<$=RXJe`!Q4Q!tCGen=vc3!O zOtSZeg&r?#H1lmnnLcR^L=v#;Ds*Nxs5=v}tiy%+>U#f(kUxL5{~*kFq!bcS^0_Rs zOJQktvDxJ7n&9(3u#iu3{W|gS)3G4!63sEJ(_!R>d&sqBA*|t{m3HcoKl?=ExnG#I zX0sFp{!FF#?b(l zJYla3Nm%oB7K?NgKAW^9bo>XM!v2rLz47KLwR|a-eQU zn8#vIP7G9|E>=JG^wRf314UWYPnm=>X*R^0j`=?0WaGK@o#|accC@PM)5A0`AM`U` zR`K=;UI#15$faM2D(BW7F?SI}JO61W@Y1wv620$R{{022ZkgmQ=TL3%es<%%RHd4g z#7dKTIq{!`K}=XtytVgqlsabB@rop!wv$tE$DMM-$7DzwX7y8wEX7898e#lU9P-23 z-a_r>(3xU3uFCEW+7DVyzh4G8H1&RIet+YmQ1LDD-|n3i(_(b#i1WQJ*+hc04i8P92R zpeeMMOMS_EfF>UsgELr8Hw!+FJs9de9#3t-`jB} zv&Z`ZM`j&9n~d@Xq*>cpU2I(QQ@oJJV_ErkKB82+AeQmt(6m^|3_7|Gr8DS$bvA=> zhV!ny3l!uJ9Pd18+hzLr+*SnwBWsv6Y~6{E##n8L_TJe4vrN~(MXf`yo9w3as~@Iz zygbm}HjdDm1FXSlGvW=&X2qm+xPb6jPgQN)_u@_{Bf5J5S>uh%&hN9GbcfP!#DI~J zEBc@wPI9yaArRh%IYTc~L0QV2g=0P;hXEir+Zx=5RVR{9f^zLWlnsx>gxf(LIYcpM zGcQ)OBWMos1Bnz#4$DfI4C^e@Uagh#+a5OhmDZCK%q;pI)ULAj2ng9-NMe6H*KSp@ zYtonOmO3yX?%&UwrQBX%d-65tFv*_M`8=LUZNWq6F};HiH#xiJytKa1{Z;1B>SecI zv(IYsvPz#z^04zWP5xRgEYt!WcWKp|m**k8V9bxXvZ@hdP&fyEPDlY?p!0!8Du&(h z`2`g{9N}@6HXJUmKhAp`?u)iY@j4|8E7Ek@g2gxceWrTZcwUhuqeLEhxCz;K81FM_ zy(6fB;l>L)sc2%`>JLFKhqK#+G$OIC*a?MZlGr5qGQZ4A^v@WReC7Zxp(dYIAA~?o zhp-;BSXWBH+ndI!@+#i5gM%+Q2mD$|1A#LOC%OCnxn1l(d6wc z-n@hQq2=}w&}@q*ys!nv7dux%uau=m`I=d1407sZ>mwihIoM+=kd*lS9a=rM!v*dT zK{V$E9GdO#RW`x}C{Wl)C-P!?U;Ht_Z$sL;^OdChx*minr{yvQ=2Wpb)7=l|)@wXr zvlZ&|q3A?HvysJ!EMnIavXm`fM18IulOM#~?>!4?Fe17j`-8D$fmuPNaS)p^X$X!x zpWy_T-xYFAp7uQWLKaFrN-&NtT5d-Vc0xhmlAbE0k+ZT4T)ZQw{O0H;maKf$X-8ZFI1I+3xX z(1o_bfEa!foMT8bwHrSMx=(9cH~=LyFb$amUdZJqKn#8}8~QKx9Ba)t``5eI><^zB zN-cHW;-DHMRT&w&ZLHTlyZE7F>?5R22Wu-F!;f{%av@6{l07)v!>%G2f6n;>PQ(lo zDhRm5z3hQpbsykdh~DM2q@f-PtjWR-;{%@Z)s{mq+CsgLE?L3;hFR}%@8wSjUqMsl zE8}s)%Q<+es~ZiwSgxU&O@Gu=YlX|chCgxi#56DP{6lMuutU0kw0l zi~23uk@<7^l2anWHwL1&WBFG;Zw8@I_eZ_NqeI+sP70Z>w{(y)t7i}*K$QhDWTA21IC|KQEFx|Y@3KonUc!a=VjB&qyP zQ7C<=aF~}#=sa<1U&PxMrvsGhMR_kbI=Hf!2P)w+HzW~qR1R<`)-^pq(n1^a*OT@* z(Z{)MVl6VUp(;1VliFY?eHPfG@eM|}U>~@^dZx6*CZuLVJEo?|YD%W#{f2GuMJJ3x_L4jnpb|`Y98+{(PH<^h4Ro;r2Gy-gZIm$C=A`#j25-=Ut1g->yxEWRf3v z_Uf7s(gpYGkisF?tO1%oAS`L6{hA?0-5Yj_(TAHu9uQWnGrutUvNjz0VwbbsXE)~$ zg(|`hdafNh>R=l7ojCU64iybITW8EZ#P3DAFzYjMcodU8*Fv8Ldq(Nmw>a<*645dr z_oo~0xOa<3x2_F3W)+ehx%+zQ>c5$qo2rTPrWAFeRju0|v!TBRq<-mz4gtm5p2a1h z!N63xBYwvs~E8#1qTro)Fus3ombFjc{f0tcSJ~#8d z-<-&$zvffJ)Ho8I*%zNL37LYpTfF46mt7UwW|Sit*R|Y~bSj0e4;>gkb1nZ_@-3oX z(~4n}@_eW^A`e*rs5~`3yM?!a2jV+$$SA(fB8|Gy;oFGWaCL}ivPAFcj;E%uoGDeG zfz53W#>NBI>C%*+KoCX(@Q-1A?PPt;kV@#nbmz{+r(Yth8w1yLx>$LC=8MOR4Ik1@$`Zf=ngiSUnUED7zd79%9w&}nfl@Bv~pP%M zv}XJQ{Br7#(hs#_~ICu=_&5Gi42pU*fNc7Zaux@5K{ap$wi(2uwRzA^(^LW4?s|bjJ z1%8$H_i(T^wG`Cp#03NdsW6dU1r~*pW*(kD28sqP>_5oQ2LquG05&hx`?Vwdww({h zf{MqKnkM9$0T7M6Pv5>a-H!|I9gu_f|IB$;xyubQI9~bVf3)ysjLA%WBN1yXfOR9N zu}Zg}cJOE$9Xe6K74q!EH;$SW%o>GEw%|;Z)8CZAj%Zav{WRo!=90yRALB|kQD`Cr zZ3s~mBs|f&Y8KHX|1?^Nl&$bs&Fu@PHt$Es>$vFc^THTT{0<*=FmJ}t267HLJ>{1{ zBo)Nq9h=99s%W8yj~Og2_8YaBTND$Rr@ynftaHBD>8oGb>eJsuC1_AQ;qW;*xZ3Ke zPz9x0gmv7&4qny`(`LTaMoWI+PP%HcLUn=rO%a)$=TQ6@X~p)&B4zgtS5n2m@oxuo zG&7H`rZGBWMH)pwSrcix>v2czJqDC1dAujFmT$Gqcylk;>wXFYg?q>9Bi2Skiz+sJxlaZ#p3Ag$0M(}cLP_&0wPBW z@K`byp%%LbuDylQsOjOS1Rj=DnaE*E*J7C451BYzZ~&HT^sn>m&L6L~t%n0BiOO7` zoxqV-tD0CEnV}E4Wo@?9U*CLDh<#B}pw|$_X5Q)6d%N5UAQu=1r)gf}rZw_*DQ~Zh zKd|q?EqpmcE#RpEHJ;vb44$QHAH!9Lu!<}D79Q_Y*Px%%KwPjX%$iUHdoRl;-y``5 zf#3h+EK(G^FFMrt^TZ=i`bol)sX~ZZc2StMYxC8LKZ~D1!N;?~m|5dEq?LLtZ%&-y zW`9$D03xc?1hof;(CDQ0@p91t`3;ZIRu~pJQ(qXSs`=wR6nqNQO=UvgIb|aFsSg! znaodm7`WK{?L|e?6hdD80A4y-F1h%nJubS1!bYQ^cnKuBc9uMa6$Ar=)Y z4{m=GPZ66w6PJi|OxPcnYL-l4#fGP&Xf~CN&@`r}(|1l=%bhgpUL6-+@1(S}PHSiK zRiBR478d;jmuOnEDZ_mjRQ;}11~v}Q=COlZ0>p`r?ILYBLQ02KPu}18foaGIXfR-Y_rI#lw|NMAgr^;ekbHNK+QQ&A7&>|Qn{ua{SlLR9FpxVsm}KZcYVs;A0K0$dHZs5 z+(zxBg=njfe}8!PLQeU0Z!MIOVUdEZJPN2YRu9Q?vAB+O4H^rVxg>a`w@;hOwQaMK z&}IuSCV7oMbJV!< z_T-$r6%=ATZ5-4)NdeXoW{h?@CBR$JgFGw$w~f`~B4Cj67AM>II?o^)Oez6{_#_bJ ztnfG8oNdPgJtF4yx!>-E>lKA#H=_oCk=pfpxpv*4;$8d+^ct`oe%|aYTUb~lk8lAr z^mKei6)8_n8*viX$LmdO{h5`=V}J3kV(RC)?R*}0R!-!eIHhaik2lb4W^pOVW)h%7 zn!M~TBiZ1_z|+<785CJr68nH$N^J^)CnX`hCv>j7{Ul(B_y(m6R-o&w{i5 zDd&=?SnkF-Cyi)FaR72Xe18MiKf+#KnYv6k9TDB9I(RO%9#P#fi)eG**Y>3#S+74k ziXB4_RVbRp2n zhnYunxtvKtFiwhVR*UaQRIJ^Cxn%q7O~g$U$Ez`B^QHliKHtXF6_P=KVvTaL_rhTQ zX&c$|jqu(zpj_6Bo=kRR-O-@gylmFR{_LD0)tD;z&2Rky5X2 zeNCgm48aUpRhCw76Jt3f1h;-`N`cA_3kl$Qmlt2Tg=9@=2v4wsy%>L9c*5QR0X~h$ zS~+p^Bd3!GT|2=5h>>cszUY|7=QWOJ zQ+4w!xzRnF>E|6OBfk1!73|$XadHKCs8|nSkDTB?C(WJ zFWWG{sv#4OApS~Zg^k_Xe(a8&yxVKpa_K|)zTAAco8I>cxcg{=D?M^ht!IZH@sjFE zog`USY9A$A+TuncKKydK90zUA*g0RLZHacx4SHb}nw3mDWs z&G8TD){A>!*m=YX@a({@cc;$%g56!hFnX#Ua$j%6@hu++IjVtoOjTp+WN*PAG8O3wPMN9hw<|(KZ#XWZE2rTRp@Emd^Tk~8>Vk2r>x_ru7`8GvpXpD37*-rD;Z`?OdIzML* zhI|)~=RGO5IWVn}c#XtawMqYB*SXyqQ|DuY7wchrLET`fX12p>rxi5Sz!h)`N0=&X zq=iXWWrPW+@AJi9-T4*~cQcRkRHs~xy8mro%9D1vaG)AiTZ{j>YVVC!$QZB|wF_fW z*)>Le!IHA)Q#sHiWoQR9OUmPo7hX8Wt%-^HU3?cXxD*OSI!$#FO{bi?Ba~>lyk^TK zM8JH^JWL0#5JBJKA~jo?24%zFeU4HScMzwl?~d}so2f}}Zn-*56Kbz<*1Omfws&1rFHR3RDs=bdrcarl)6FuP?5kosgZHcUD$Qonf`>}E-w1XprM%N77MWj+oe$*@aGL9v$D88&GC?X%q9gNaKk} zrr@uOmY*G}e`huJqkT40)&!*%p1&6t_J&}4syFt_GdBo9_yxMx-K)F0L9B+3(9^Jp zDV(Ba$t!Vdt_DD)d;7Qb!G!wjnUdEQv}R)z#bo_rx!1kQY(Ri5d@v2!SN4TM`(Drt zHc_QQ%DdG1UE*^g@%ghBJhgjEeQe#3JMnw3Dc$!41R5_0lP=xuS5pME=12!NMF zPERlex7ORlX#N{P3Y?SazNiv31+2@SK;x1LC8)gU8*U+jDNj@UxTx(xQ25L9=z#|S zQ+FUTMhJSj;cne#+bhV+s0r{|mYz_zDvl&D(rQ-f zjYz)ogjDKJNsBb?qEibmkr47shj}b@JzS=*xX$-(vI9UOo97aBpll=plA;GnU-h31 z!C+9`O*X(^(-TWfP=kCjL?jW z-5!5)vNuQ?B8ejbS70VVX(;m>@tf-MHg-4!c`z(PIiTLFrQc zN-{kawJoC6;8z9yKmd6-_?5GIbMDdEC=?GTHCXG!D(G`iE1&Ow#jL-|axz1>Z3&;K zE;(C>_DsBDKKpvGN~`U>Ez7m^8#tpxgRMprtC|&CZO1<1CnMU>M>ZgArwfMy@-ICapvs^<&ocDmx`3?^{7YfyZOr|iOd zWq|twm9rd|!n&^ynRK1j&TDC3q{i;gt?&gW94DNT`h9iv9y7UDinL!rAFR!MFoz#I zL&OCuP*y05q*`_MP1yozqvvW`N;*qQe;{?p@QynA+whCu*U$~aeJ>c-GM&;-BT(p{ zMy0IDiz~7ss*1RRrX4t6WO#O2E8D+%N_a0l@N?qG1uf!+FhY$%tsk53XonRVaI|qS zsgBkztXR&G!My#~7}I#HQbX$r>vnn!eV%Vtm@v?J-`s~=om}@Z-*Tw_=7TlMNv6p9 zSR3-$%(C={-&-mrVwR9_k8}9WnCi;p_)A8^ z2Pq9t0K}PjQ-i7*IG~~6eb@lW2QtWh2)BW-IqUp9iZVH~c^6Lv#(`RB=K72Ooa`I{ z%Zq5O2h>>nteqI_mp@Un0Is2 ziK#!C{C?B4PIiBYesQL25?}>VqNv#r1J&1MAlB)haQqBa%RFXFs$%1Ay3p-lW}FhC zd4l2Nry)Ivb@L0~{Js?+CmZat|M-oFN}}gl2ZP%@EeA@vF+cvAf9aLkPMPLa<`Qpq z#9V8e?C(%U7@xPCb=O%KShA>Tunbe;yotN%Lzg>Qnbz8gH4iJ{^W{KKub-&zeh56ub@uIIcPRfn7^S*2bX73e1%D8p?Qf)!= zaSMz?>UGQilx}d_1(8xvTQm4`^?ZYY1_@1~+tPddm_UQFKel?>XbsrN&a*sjvR41+7@r@%MQAuubQ)pQHr)hC|=O1$;v;e zhxy$XmV3Pm4E#tU%=w&JRC0D{pCm%2I1U=o_@`0!0}XjHnQtm$-O=LGo6bf)C5bjR zC{Pvu7x)WMka7NzHa+;k&Vv@0JfGngASG9!ZOLxHEL(OK=J#*`nduFUn0UQn5?Hhu zPP>YqL!CvV_Yn}C)siFlTWuh0iH~c+*odS`9x=i~x2Wi3jkJNqbk+V(es}n6dd)^f z&p)nVKJV`tl5k6z7SC8GGVloYbbRw}D2>;q_4OxNR2T6NjeSq8g5@V`yhs0qVYmF2vx#EQQk+@gaXSOBv%wEc8Ow6##%^lyESa>ZmX>g^`=UK>jj5i36k)~@vATk^JICP{BaY6L zXpJ0soEF}8nC;y-3^dgfjGlvgdNwtRiHDYTH1R^TA~0Osad^(UUJyUG>e9%eg@4lIzA?YRNY*>2v}Ao z#v^VrxW{zh*+r(J_H(7Yt|LenOxF2=8{YG_Cqeo7gAS5CJnH5$HI&!vLm+fy-uLEg zr=IyX^#uCZ;kI2Hebp-JpDkouzHF3*MrfVccv_Bj=-mIR;dr^NXoaIkxb_Y*!-n{! zB-{Z{>f+StF=C>UNSUYO=U7dN*K9gc;e)BC*d{2R&z7;m8({a#Tvy7}a?|;~6-J@%EC>bmG@8m1&JSd)Dl6l@0ai z6w=-TWUl%Q4!sv3*qX4(?3VdTC7ITu;~8DRAXgqKM20@fq1%@8T<<8VTCU56!f-za zWHX}^vQ&GsX;tT>z){_Aqb0@~8Z$ZaTHiWR$ zx6OC@X*UBHUJ_Wtzq@m;I<|eqF2MIS2uR|6%GVApcjF_Z=`Wjp^f1LfUQ~`GT^4!b zl=4w%>-+q+`dd6<4!6ax!^!7TJS>x2j6%UJ0jf@NENJ~F9kLmwtYSr<(kE=-z?AKO zF}pHaz|=PQ!4-?*R9O@@DPeAkTc`NYh52F4{gNoj7bhYTK%w?S8UDZ7Y4WwBneoQR}^7VQ~cf~S_1(6t)`u>F$R|l zFlgb}#q8ix-*4#`nSFRstB@w-kr{vB86+(Ae6LSc-~VXUMpKWzf=%0j&m;QkU{6bc zlGAg2&)Tak*R~Ruztdu~QDZkJC$g?sL}Z**GD&Zap)Vw#Uha{jvV~2y854d*&GP9b z*rK2J%KR#}Yp6cFrisr3CN`wn`LxzqN=mX?Ar&Uu3{TsK4@l*^aGm|3T(ko_PM59j z3+oH_^ZmI*ohlf(Fh%J&&~)N=tloF;YLw~j;w^{Yt8GTsdC=zSV<9Y zBwC*WsY~OH*ROGhqKZXowB8t;hJC{db~nos@_gHIvG52qt;_)!cEn{;PiTxoRg8qI|8S-d6v)xfRyl4t;P&irl1Z)UmKDX%nqZu0sj=$E*j zpdHZiOLFMEkvR?edxXZ}7;b7ql9Xnc3jp=r+OSCJ*XW zO^^8PzCyFd_2TKV1=hqn5R`Po3d6vxhP#`2?dpvrkhNJ(v9#McgYL`Js}6s*11 zUTyo(;=ev%PuhOnx0p2k8uscr>H52RX<$*KAgO&3o<83N<@dF=Z}Pab8ch+7lS6&G zRi!JWPt>-&LD9F7ozh))rs7hS?IR=a9D*=;A(v40^Y&}ZG2w=u&1f2Tm!jA5hC(>F zm8S`|cK93)O3+`UUN7^FJQLrPb%6^W9UN_~uQgqqU<{em{9BJ!2<=ayWw5xUMS{Cso?}PPG=(hSf70 zPd)u&g{Aw7kk9K&b@4>Cu_VzkwUV!tg~;FwarL2`D>vKzT!==q5xnune6KLX|hTlZM4m36BKQ*?F}yW0zo zj$<$(g$0g?JT^o9-LlT-ml7-?y?Qsx?9JwvhR_+Tol48o1=^`OZ4S?b81e}vosKEU z*{v6Z!AXHF>oO1Asi&)Dj995(BVqVjeIAFJ%6X$F%j?hrv}4|+j1SALzHycmQu|2*#>5r&%MjS zL32eO%leDW#=fpx{e*|2esx)_wPD3ZW?~HcPb;HtSnt%U3Aed1sZHxyQ*MJZ1YWg= z1&j|7{uJ*#n9v{u6WdsXGujCdF7XhiaSMhLF=rt!$j519g6#R(vq8s69)Iz=h5qce zU?fA-bZsG)N#eB5hYo*EZ6gDk5HD1vKBR#h?8SL~x1*YxW=ho#e>WmU;m zIKDcgvZw#8+& z%H`?GJL~W)rqy2!auQlwu*J#P*MnxU8IEMP{VyNr$i@GvLx2H3mKCv=PSUd|y z%QYW`SUbJ{ob}Fz;ZXf+j>RGYbBs~7P_2pyCN9aqM+Bd|0h)u;AOAXGGG||ch+~1} zVgF47aPPrxoa%w)gskTE!`0e=5l$aoSul!q=hwJLp9|PQpC^|0<$-dv0re$=NtwiM zkIgnvWw~j@YTR`Wl2<4u(Muu{J`)nf>3wz@4bBvV62${datn)P)HjS224|6IoFv3} zqmz-bbbf}N;uhjExCg((3O<}9^kJB<|5rG*?Zi*Xa3KncpFY2}=1^a5jc1rT9>Mss z&Rknu?f@&z2Vi+SwDowal)}-og8kOmfM4lUbc};?m+Z89D2Bw8a_80+BHDZ!ll|VM z@O*bd((Pc*7=r$GqH+|(mOG!o8H|)$A$oaSfIivQC->>PyR5rVVP*v!Ysg@N}Zdb6zgwE2HK1ce~>zK6PyHn9R3J#xWMaVJCc(Lm!;XPB;_%`BDd}w5$>R zYttQT_o@PR_$wON2nC|`FTvSZetCzJtCe8o2$~_R7t!yU9KwAn13UN(DVkfeiYkh{ z^M9`Yiff*Y@4VCd&4I9s4Lxlkkl7l}_AZy+Z1oTb$#g)I##vvvdB<>`uHW-1p^Ty) zwP+l+l>6iL3emkc+gXjr&eikQ5uiV?by1lOE46P5yw6H(>vnOYymNcB1|pN>h{nsx zd%>FLBnF_1+>%l@x`1|8t?*B%p26OIQ&(sb+u*+2;zutmQu@=ZPdSr2{#P;Ho0k=2 z7T+OXsIIEs&!Ze4xype;cF81a`6BAG2J>M?u#6nB;XKk7V#>Xs2g@f~r_7&m$cl}0*F!PM> zzPPwje7NG_)sePQ6Sz3f8BhaD0{&3{DOHa7loeHoh#4gI?aj}cSw1UoKj0{K$HooE z3Lf7+69&^9J2$zAKz)y4_s1*bXT2L!Ig7r#hR_no+05xB#3oBvuprp{1!h`0tEYs+|Xo6)n^FE zJm<2HTfd-Hwl>lQS$~j}dPLX2S;DYmNu>=#L-%FZ$FmyKp|p&Q*LeYzDmn~tpz4E_ zj>Ut8hEeQ#B-s|L4p9_37U#tQO7_QwS@cdKN+ihHR1usm6jgD&*qjM~{7xwdVl<89 zdTs#$z$@<+!SuK2GfR}`^eZoD@8jgSbF6&;Qkqte3@c7-9dV><3Fri}FUQh7lfQ`b z)+a_w0`5pj1G2QqGF>djGxlQp?dGa~{@o-}1$fzUpmcaMjRN$nx{bemuGhmY9&RrR z0r=Yh4WnrlfQr0{_JZj(G56QNkyB!+3&;?*nB#Y1w{ER|8(0fHnKL) z`BzR8>BvgEH(BOF%xH-nA!nw1MZUGpz(btUwAnNzL9Qgey6Dg)yyM}%;#oA&(yrIy z%z5|WLi(hgvL4-D6tG;TDF4y91W@yvvi_$=!1y;{8PYaM`|A`iH$JwOh$!c{EaWzD zmN8r2!BM6;G9azp1e74*}a<_Kc_G;q`lG=c?}7DGk& zn($7LNB0Zj=zIWvcFK+0M$g}&;cDgg1)UM;6!dG#ka7oUdZ%cG5e4z|;0}3({qsKx z!EG1WFutejT!a(!QINL-Hu3whbg{9Dyl(ZK>!FV1k<&ICIJ*7!tK#E}+WF0PsB_2S zP7PL)yWy&pz|2i$OWWxMo%i~5$XX=gEqYPrQ;d>+^Pr`aoli@~BIPP!hg*rp76FDC zooMm&|1GG@XY-Pk<5 zR`b7De4OGKFFKBgUQ4p$*Y6WHM~e}O%beS8A#d`$x@$pJl^@h^_|05Kl)fInyS&BPUr7XBB1lUqlJA1VbmCH}JMYbH-O^HZLO>eZ|>==jn% z_il1zR;m(e=W*|0oqlxgqtTBaR^pzvn=bEhy~pS3y&~QDBV}~xnXR9YylZ-5L&$}^ z!btdSq-)g`K2jPc{_vlgU2ebaNa*OkXTxcqPPc}JL5Vy^U5~I{OtxW@9>(R&qM>c9 zF1A#r3hq(leUXx*BsaZnC_eCY8x*b;GUgI-C?Yxq7u?!s3MF}ni+7PQAHJ7Z#YFz$ zD&Cxv8_j493qtS0BfV+2-CT6bcV7xo#WA$~ux; z$@Wmp9lk_+Nc~+q#HdsdS8GKVkg=F&^8;vPVj`^S=^!pWF)7GI1{f4VbLibnYd~pu zpF-6@w>`yBS9Y+)!9;48l9=dfJUSOn!flbVw4}%G@9Y?9Uo?y4J5{8_4~TtmB1W;Fg6KQjBRy*^l{rfo7 zgoJ>gF{ZQ=RiYL>WvY6Ufp$@;<-1=LiG{iTPw;0=W}}H$2CJJ!okqxsyjJ?PlO5jf zd3HfoA@y0~o+F?tuNPAyyY0otU8BfVst(4mw}SR3!uoSjO36G%-3WPYoc3*peC(Lt zzV3}H3Ai)UJ7)@bHaV72w4M~=la!iPTTa)GgGa2YqC-D1=f57^+uP&panD@5y*z~J zo2h2+jwb=J{7CNGGpbOVST1+ycnX1v$4{!xuZIhH3SR=jz9I=hn+rBo7nk`isWRGS zN2DE`C zU4D7dkeA@ERuy^CH7-YTcAvYq5}}8T;th&XBJKaY=JM;HW<_L3_$cj`p@r+J-N6RtpmC}DzTPRW>%&k76k#cBWDNy>SeD=Bh@Op zZJ}cWx3h9%?6EjQ+MNcOH3gDM+8yC532|0r(~K@}|GEB_Le0SknZPZ^)Xe)x+J<}R z{GvifcD>@Y0nrurSyIO}m#<)^#R6yMEt9 z;PMlH>sqy4pUcXX4m7aRisr{HWB21$jPhmsWo}n?j8om=)zc%QtToXEyeyO1h~NAJ z$bY&^FlSsE&8JQFs*}QI4qqm29&YP6sTzB0(6Vd%0~e+bFs7Qo);KA(%K;IxveKkS-sd+`OLARbSw*hHk3 z?!H?wqsnyaqe!;0tgHFV=fPkgIr_nV&z+;gSD~wmjL*iwMZRd>XHJwSJM*2j-^2c> z1^6<#W%g|u(lD_NO2r6t%)Xl>QZqZ2WQ|&>BO;G*( zmYaKuEV5{EK2>D|qQv-uUtpd+KRR6;W@lv`JBLBo{cx*r891L2 z8L4$^h+7gMYZEZAd{QQj0uC8;def6q!2%#geOaH0Vj$8DF0;wFRv|P=LP8=#D{=+2$Ld7bL0v(Crxo+;n8bJKVY3HjkjSy5kS^}zeGPgiV9IwT8ceL3vOI8g8 z?LB_J3hj-!VszUbQFX_hr$6DpGc%u7^x&EBKo?ew7hmra*@d(_*I897E^p97Pe=I{ zmHkHR28X)H;a)>1hMqLxn=T4N2@r<_ITp=%h5|`BF^=h zN!90wA6#xf$D3?1_rJ-0x|GT9BW7ZfeE+h|31epZ!jZmtlABJMi2rS3eMbVLAdy;H%FQfl+`HD z%6c)hPI_h{_|1&pqsM)OHivnHrzi(*{(J@hbmBR4093BIcNaPLtEOB&cby92BUO8JyrH9*=BbE2g@tuwAeD zO_`_>Z82^Z;*<#K0L;>lOzF=>V-wgjI=At7 zso-_`E-I>dxNI}Y#8(h#@Gy-ppZS{(bTO+OjrU&aPjAys_-PJ_&Vy&x<1W3~c_$6t zo2W9P^^=P_52Js!GV{B)T!|lgT#KCpvwzDT;S7S|4}Gu`GJ~f+UHCs)Gily@XVmO; z{>{*{=0vzS5xd%XYwcolAyBB8XW^D$7V87Sv`=1j@eKzrtU(kA92C;VX}b=i?m9d1 z=tbV!KAzuzR<6VYYt>|}_UF2umKP09+A}&}KZArJ`6>yGn^U4b2eGA^rLSW-FuxKj zno~;aLrp}xj^2I3c3xUhc20a)(yUaOx_iw$?0M36C4ZrV`AP(WhB%(>Q&pl?5Z2MQ z!KXT8P|c{zcA1;M=*|>J>+7Q_d$G*vjS_M6SZukNwC^cK^T+jQhWt5!Efs&FOO>F7 z6D9j)TfxNYC$jw9<4`sse6_~MGb{KhN>_vXuW7CZ2Zw$AeuWE(;7i@5!}u8mqO|e( zNQ%*fws}2&$(s;x$zm8nef-)#XQnionC#D<XS;GOhL@pYPDm;*#fU&pw$TWPs8j(6h?;otxE-(L5xFO`X? z5cFdxDmAOJx*E=^_gw)iUwcLwuwh-$p$NL}C(L*Gcl{b4=L1r(`G6}pKX~?v`9p=o z|La)se}7_=e1`aEV3$W>FeN_T6kvZh4!400zswUY^QRf$Nh>c=pbPPoIh6kjo-aMWPDj~JI_^cq4hG*LB$9v>wiOs zJyi3LKWPo^m8E8Ujfv)G_bIi%r>8T-`%>x7Xe+9}L)Z8xEE~`hw99o#v~&EA0MR^r79(ig8mQx-X;YA literal 0 HcmV?d00001 diff --git a/static/img/201009-twilio-flask-assemblyai/ngrok.jpg b/static/img/201009-twilio-flask-assemblyai/ngrok.jpg new file mode 100644 index 0000000000000000000000000000000000000000..253ed6bb7c2330d3370f9c6ec137d6324ffbed2c GIT binary patch literal 103403 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

    What topic do you want to learn next?

    +
    +
    +
    + {% include "choices/buttons/databases.html" %} +
    +
    +
    +
    + {% include "choices/buttons/application-dependencies.html" %} +
    +
    +
    +
    + {% include "choices/buttons/development-environments.html" %} +
    +
    +
    From 0ff8428b2d39481ec8656c9ae7f3760a17f0c897 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 29 Nov 2020 10:55:58 -0500 Subject: [PATCH 237/302] new git resource --- .../19-git.markdown | 5 +++++ .../10-working/01-event-streams.markdown | 20 +++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/content/pages/02-development-environments/19-git.markdown b/content/pages/02-development-environments/19-git.markdown index ce70f3b16..ae0fab9b8 100644 --- a/content/pages/02-development-environments/19-git.markdown +++ b/content/pages/02-development-environments/19-git.markdown @@ -223,6 +223,11 @@ workflow. These resources will come in handy for specific Git subjects. system. This is an awesome read to get a view on how Git works under the commands you're using to manipulate these objects. +* [How to Undo Mistakes With Git Using the Command Line](https://www.youtube.com/watch?v=lX9hsdsAeTk) + is a video that covers topics like resetting a file to an old revision, + recovering deleted commits, squashing multiple commits into one with + interactive rebase and recovering deleted branches. + ## Git Workflows Teams of developers can use Git in varying workflows because of Git's diff --git a/content/pages/10-working/01-event-streams.markdown b/content/pages/10-working/01-event-streams.markdown index 3b25b8813..8171c9db7 100644 --- a/content/pages/10-working/01-event-streams.markdown +++ b/content/pages/10-working/01-event-streams.markdown @@ -19,15 +19,18 @@ streams. Amazon Web Services' Kinesis and are proprietary hosted implementations. -## How are event streams stored? +## How are event streams typically stored? Some applications, such as aggregating millions of sensors, or thousands -of constantly streaming cameras, throw off large amounts of data. It's -difficult to process those large volumes of data in traditional data stores, -so event streams are built off of a simpler data structure: logs. +of streaming cameras, constantly output large amounts of data with no breaks. +It is difficult to process such large volumes of data in traditional data +stores, so event streams are built off of a simpler data structure: logs. -Logs are ordered sequences of events and they typically have less constraints -than a database. Logs can handle the high throughput writes needed to keep -up with the constant flood of data from the source of an event stream. +Logs are ordered sequences of events and they typically have less constraints +than a database. In event streams, logs are also immutable. They do not change +once they are written. Instead, newer events are written in the sequence as +state changes. The reduced constraints compared to a database and the +immutability mean that logs can handle the high throughput writes needed to +keep up with the constant flood of data from the source of an event stream. ## Event stream resources @@ -36,4 +39,5 @@ up with the constant flood of data from the source of an event stream. concepts behind event streams and how they fit into [microservices](/microservices.html) architectures. - +* Quora has a solid answer to the question of + [what is an event stream?](https://www.quora.com/What-is-an-event-stream). From 957783c95cc43169ca94877586506d6cdec0f526 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 3 Dec 2020 10:42:21 -0500 Subject: [PATCH 238/302] new mongodb resource and event streams description --- content/pages/03-data/12-mongodb.markdown | 6 ++++++ content/pages/10-working/01-event-streams.markdown | 14 +++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/content/pages/03-data/12-mongodb.markdown b/content/pages/03-data/12-mongodb.markdown index 94826bfd6..1e9f15161 100644 --- a/content/pages/03-data/12-mongodb.markdown +++ b/content/pages/03-data/12-mongodb.markdown @@ -67,6 +67,12 @@ command line and query language. [Google Cloud Function](/google-cloud-functions.html) to store persistent data while running on a serverless platform. +* [Everything You Know About MongoDB is Wrong!](https://developer.mongodb.com/article/everything-you-know-is-wrong) + lists many of the common thoughts developers have about MongoDB and + why some of them are misconceptions. This is a good read for + developers who used MongoDB several years ago and want to know what + major improvements have been made since then. + ### MongoDB security NoSQL databases can be a weak spot in a production deployment environment, diff --git a/content/pages/10-working/01-event-streams.markdown b/content/pages/10-working/01-event-streams.markdown index 8171c9db7..3259aaa0f 100644 --- a/content/pages/10-working/01-event-streams.markdown +++ b/content/pages/10-working/01-event-streams.markdown @@ -9,9 +9,8 @@ meta: An event stream is a log of one or more events. Event streams are a log of one or more "things that happen", which are usually referred to as events. Event streams are -conceptually focused around things that happen rather than objects, -which are the typical storage unit for -[relational databases](/databases.html). +conceptually focused around events than "things" or objects, which are +the typical storage unit of [relational databases](/databases.html). Apache Kafka and Gazette are a popular open source implementations of event streams. Amazon Web Services' Kinesis and @@ -19,6 +18,15 @@ streams. Amazon Web Services' Kinesis and are proprietary hosted implementations. +## Why do event streams matter to developers? +The way that data is stored affects how you can work with it. Constraints +and guarantees like consistency make it easier to code certain applications +but harder to build other types of applications that need performance in +different ways. Event streams make it easier to build applications that +analyze large amounts of constantly-updated data because the events are +not stored relationally. + + ## How are event streams typically stored? Some applications, such as aggregating millions of sensors, or thousands of streaming cameras, constantly output large amounts of data with no breaks. From 58fb7b1655b70622b32d6d67bd2ec401bb1e3096 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 5 Dec 2020 10:55:58 -0500 Subject: [PATCH 239/302] add logo --- static/img/logos/bodywork.jpg | Bin 0 -> 23085 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/img/logos/bodywork.jpg diff --git a/static/img/logos/bodywork.jpg b/static/img/logos/bodywork.jpg new file mode 100644 index 0000000000000000000000000000000000000000..821b77ebb50fb346ee64afb66200001bb8d510bb GIT binary patch literal 23085 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 Date: Sat, 5 Dec 2020 15:13:26 -0500 Subject: [PATCH 240/302] working on bash page --- .../08-bash-shell.markdown | 43 +++++++++++++++++++ content/pages/meta/00-change-log.markdown | 3 ++ 2 files changed, 46 insertions(+) diff --git a/content/pages/02-development-environments/08-bash-shell.markdown b/content/pages/02-development-environments/08-bash-shell.markdown index abf95629b..c7e94db46 100644 --- a/content/pages/02-development-environments/08-bash-shell.markdown +++ b/content/pages/02-development-environments/08-bash-shell.markdown @@ -20,6 +20,42 @@ during Python software development as part of a programmer's
    Bash is an implementation of the shells concept. Learn more in the development environments chapter or view the table of contents for all topics.
    +### How do Python developers use Bash? +If you are programming in the terminal on [macOS](/macos.html) +or [Linux](/ubuntu.html), or using the +[Windows Subsystem for Linux on Windows 10](https://docs.microsoft.com/en-us/windows/wsl/install-win10), +you can easily gain access to Bash if it is not already +your default shell. + +You can show what shell you are currently using by echoing the +`SHELL` environment variable, like so: + +``` +$ echo "$SHELL" +``` + +Which will then print the shell you are currently using. For example, +on macOS I am using Bash by default so the echo command prints: + +``` +/bin/bash +``` + +How much you use Bash or any shell will likely depend on your +[development environment](/development-environments.html), especially +if you are using an editor like [Vim](/vim.html) instead of an +IDE like [PyCharm](/pycharm.html), because it is often easier to do +certain tasks in the shell. For example, most developers I know who +use PyCharm will search for some instance of source code right in +their IDE, whereas I use a combination of Vim and [tmux](/tmux.html) +so I frequently flip between panes to use commands like `grep` to +do my source code searches. + +There is no right way to perform a task like source code searching, it's +really just what works for your brain as a developer that will guide +how often you interact with the Bash shell. + + ### Bash resources * [Bash Guide for beginners](http://www.tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html) is an entire book for those new to working with commandlines. It covers @@ -103,6 +139,13 @@ during Python software development as part of a programmer's their destructive abilities by reading through the descriptions provided by the author. +* [Faster bash startup](https://danpker.com/posts/2020/faster-bash-startup/) + and + [Even faster bash startup](https://work.lisk.in/2020/11/20/even-faster-bash-startup.html) + are two great tutorials that will save you a bunch of time if you frequently + open new Bash shells. On many systems you can easily cut down the startup + time for the shell which can be unnecessarily sluggish. + * [Bash Quick References](https://shellmagic.xyz/) is a cheat sheet for common operators and signals that come up when working with scripts. diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 726ad5b09..dcd6f3490 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,9 @@ view commit-level changes via the on GitHub. ## 2020 +### December +* New [Bash](/bourne-again-shell-bash.html) resources and explanations. + ### November * New resources for [DevOps](/devops.html) and [containers](/containers.html). From fa28d99682e34dd555de1fab1cfc2b793d47e83a Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 6 Dec 2020 08:51:34 -0500 Subject: [PATCH 241/302] new event streams resource --- content/pages/10-working/01-event-streams.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/pages/10-working/01-event-streams.markdown b/content/pages/10-working/01-event-streams.markdown index 3259aaa0f..596944b50 100644 --- a/content/pages/10-working/01-event-streams.markdown +++ b/content/pages/10-working/01-event-streams.markdown @@ -49,3 +49,9 @@ keep up with the constant flood of data from the source of an event stream. * Quora has a solid answer to the question of [what is an event stream?](https://www.quora.com/What-is-an-event-stream). + +* [Summary of the Amazon Kinesis Event in the Northern Virginia (US-EAST-1) Region](https://aws.amazon.com/message/11201/) + is specific to AWS Kinesis but it explains how Amazon uses event + streams at scale to run and coordinate a significant number of their + services. When their event streams service went down... it took a + whole lot of other stuff down at the same time. From 9430638ec7f27f2d1b9fa133812fae4e18fd5f38 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 18 Dec 2020 06:17:15 -0500 Subject: [PATCH 242/302] new vim and bash resources --- .../02-vim.markdown | 54 ++++++++++-------- .../08-bash-shell.markdown | 57 ++++++++++++++++--- content/pages/meta/00-change-log.markdown | 3 +- 3 files changed, 80 insertions(+), 34 deletions(-) diff --git a/content/pages/02-development-environments/02-vim.markdown b/content/pages/02-development-environments/02-vim.markdown index da89bbe3d..bb3895f79 100644 --- a/content/pages/02-development-environments/02-vim.markdown +++ b/content/pages/02-development-environments/02-vim.markdown @@ -91,6 +91,35 @@ If a Vimrc file does not already exist, just create it within the user's home directory and it will be picked up by Vim the next time you open the editor. +The following are a few resources for learning what to put in, and how to +structure a `.vimrc` file. I recommend adding configuration options one +at a time to test them individually instead of going whole hog with a Vimrc +you are unfamiliar with. + +* [A Good Vimrc](http://dougblack.io/words/a-good-vimrc.html) is a fantastic, + detailed overview and opinionated guide to configuring Vim. Highly + recommended for new and experienced Vim users. + +* [5 lines for a blank .vimrc](https://swordandsignals.com/2020/12/13/5-lines-in-vimrc.html) + shows settings for case insensitive search, highlighting as you search, + disabling swap, and a couple more "must have" enhancements to the + default configuration. + +* [Vim and Python](https://justin.abrah.ms/vim/vim_and_python.html) shows + and explains many Python-specific .vimrc options. + +* [Vim as a Python IDE](http://liuchengxu.org/posts/use-vim-as-a-python-ide/) + shows a slew of plugins and configuration options for coding with Python + in Vim. + +* This + [repository's folder with Vimrc files](https://github.com/amix/vimrc/tree/master/vimrcs) + has example configurations that are well commented and easy to learn from. + +* For people who are having trouble getting started with Vim, check out this + blog post on the + [two simple steps that helped this author learn Vim](http://adamdelong.com/two-simple-steps-helped-me-learn-vim/). + ### Vim tutorials Vim has a reputation for a difficult learning curve, but it's much easier @@ -159,31 +188,6 @@ to get started with these tutorials. habits. -### Vimrc resources -These are a few resources for learning how to structure a `.vimrc` file. I -recommend adding configuration options one at a time to test them -individually instead of going whole hog with a Vimrc you are unfamiliar with. - -* [A Good Vimrc](http://dougblack.io/words/a-good-vimrc.html) is a fantastic, - detailed overview and opinionated guide to configuring Vim. Highly - recommended for new and experienced Vim users. - -* [Vim and Python](https://justin.abrah.ms/vim/vim_and_python.html) shows - and explains many Python-specific .vimrc options. - -* [Vim as a Python IDE](http://liuchengxu.org/posts/use-vim-as-a-python-ide/) - shows a slew of plugins and configuration options for coding with Python - in Vim. - -* This - [repository's folder with Vimrc files](https://github.com/amix/vimrc/tree/master/vimrcs) - has example configurations that are well commented and easy to learn from. - -* For people who are having trouble getting started with Vim, check out this - blog post on the - [two simple steps that helped this author learn Vim](http://adamdelong.com/two-simple-steps-helped-me-learn-vim/). - - ### Vim installation guides These installation guides will help you get Vim up and running on Mac OS X, Linux and Windows. diff --git a/content/pages/02-development-environments/08-bash-shell.markdown b/content/pages/02-development-environments/08-bash-shell.markdown index c7e94db46..d5e0c24c1 100644 --- a/content/pages/02-development-environments/08-bash-shell.markdown +++ b/content/pages/02-development-environments/08-bash-shell.markdown @@ -56,12 +56,59 @@ really just what works for your brain as a developer that will guide how often you interact with the Bash shell. -### Bash resources +### Getting started with Bash +Working with a shell, Bash or otherwise, is intimidating the first time +you try to get started. You are staring at the `$` prompt without a +whole lot of direction. + +When you are completely new to using Bash, it is a good idea to at least +scan, if not take some additional time for in-depth reading of the +documentation for commands that every developer uses. The following +commands are used so frequently in Bash that an experienced developer +probably does not even think about them anymore, they become just a +natural part of your workflow: + +* `echo`: [print text to the command line](https://man7.org/linux/man-pages/man1/echo.1.html) +* `ls`: [list the contents of a directory](https://man7.org/linux/man-pages/man1/ls.1.html) +* `cd`: [change the working directory](https://man7.org/linux/man-pages/man1/cd.1p.html) +* `cp`: [copy a file or directory](https://man7.org/linux/man-pages/man1/cp.1.html) +* `mv`: [move one or more files](https://man7.org/linux/man-pages/man1/mv.1.html) +* `rm`: [delete one or more files or directories](https://man7.org/linux/man-pages/man1/rm.1.html) + +If you know how to use the above commands then you will at least be able +to move around the file system, create, move and update files and know +what is on your storage device(s). + +The following commands are somewhat more advanced but also frequently +used by developers: + +* `su`: [run comamnds as different users or groups](https://man7.org/linux/man-pages/man1/su.1.html) +* `whoami`: [print which user you are currently logged in as](https://man7.org/linux/man-pages/man1/whoami.1.html) +* `grep`: [searches for patterns in files](https://man7.org/linux/man-pages/man1/grep.1.html) + +The above lists are not even close to exhaustive for what commands +you need to know when working with Bash. Read some of the following +introductory tutorials to gain a better understanding of working +with this shell: + +* [The Linux command line for beginner](https://ubuntu.com/tutorials/command-line-for-beginners) + by [Ubuntu](/ubuntu.html) will provide you with context for how to + use the command line, working with files and directories, and handling + superuser commands. + * [Bash Guide for beginners](http://www.tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html) - is an entire book for those new to working with commandlines. It covers + is an entire book for those new to working with command lines. It covers commands, paths, Bash shell scripting, variables and many other critical topics that are necessary to move from beginner to advanced Bash user. +* [101 Bash Commands and Tips for Beginners to Experts](https://dev.to/awwsmm/101-bash-commands-and-tips-for-beginners-to-experts-30je) + gives a well-done laundry list of tricks to explore. + +* [Bash Quick References](https://shellmagic.xyz/) is a cheat sheet for + common operators and signals that come up when working with scripts. + + +### Additional Bash resources * [Advancing in the Bash shell](http://samrowe.com/wordpress/advancing-in-the-bash-shell/) covers important concepts such as bang syntax, movement commands, tab completion and aliases. @@ -88,9 +135,6 @@ how often you interact with the Bash shell. script that was never meant to be used by anyone other than the original author. -* [101 Bash Commands and Tips for Beginners to Experts](https://dev.to/awwsmm/101-bash-commands-and-tips-for-beginners-to-experts-30je) - is a well-done laundry list of tricks to explore. - * [Bash scripting quirks & safety tips](https://jvns.ca/blog/2017/03/26/bash-quirks/) explains Bash basic programming constructs like `for` loops and variable assignment then goes into ways to avoid weird issues in your code. @@ -146,9 +190,6 @@ how often you interact with the Bash shell. open new Bash shells. On many systems you can easily cut down the startup time for the shell which can be unnecessarily sluggish. -* [Bash Quick References](https://shellmagic.xyz/) is a cheat sheet for - common operators and signals that come up when working with scripts. - * [Anybody can write good bash (with a little effort)](https://blog.yossarian.net/2020/01/23/Anybody-can-write-good-bash-with-a-little-effort) covers the basics of shell scripting and provides some recommendations for creating more maintainable scripts such as using linters and diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index dcd6f3490..12a37ddf7 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,7 +15,8 @@ on GitHub. ## 2020 ### December -* New [Bash](/bourne-again-shell-bash.html) resources and explanations. +* New [Bash](/bourne-again-shell-bash.html) and [Vim](/vim.html) resources + and explanations. ### November * New resources for [DevOps](/devops.html) and [containers](/containers.html). From 63a826d2ee71aceed1480a0ed9ddbd32f08b8680 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 26 Dec 2020 11:30:13 -0500 Subject: [PATCH 243/302] new bash description and resources --- .../08-bash-shell.markdown | 78 +++++++++++++------ 1 file changed, 55 insertions(+), 23 deletions(-) diff --git a/content/pages/02-development-environments/08-bash-shell.markdown b/content/pages/02-development-environments/08-bash-shell.markdown index d5e0c24c1..40f6b0525 100644 --- a/content/pages/02-development-environments/08-bash-shell.markdown +++ b/content/pages/02-development-environments/08-bash-shell.markdown @@ -108,7 +108,62 @@ with this shell: common operators and signals that come up when working with scripts. +### Bash scripting +Bash is used not only as an interactive prompt but also for scripting, which +makes it possible to execute one or more Bash commands stored within a file. +These scripts can be short, with only a single command, or very complicated +with control-flow logic, for loops, and almost anything you want to automate +or compute because +[Bash is a Turing-complete programming language](https://www.quora.com/Is-Bash-Turing-complete). + +Complex Bash scripts sometimes get a negative reputation because they can be +difficult to read and understand if you are not the original author (or you +are reading your own script after a significant period of time has elapsed). +There are many ways to accomplish the same tasks with Bash so the files are +often confusing to read unless the author of a script included clear +documentation. This readability problem is typically less of an issue with +Python scripts because spacing is enforced and the standard library +encapsulates common tasks. + +It's a good idea to think about how you want to structure your Bash scripts +as they grow larger. The following resources provide insight into what you +should consider while coding Bash scripts. + +* This [minimal safe Bash template](https://betterdev.blog/minimal-safe-bash-script-template/) + contains an 86-line Bash script that the author claims once you + understand and use it as a base then it will make your scripts + easier to maintain over time. + +* [Creating a bash completion script](https://iridakos.com/tutorials/2018/03/01/bash-programmable-completion-tutorial.html) + is a great tutorial that walks you through a reasonably complex Bash + script for completing syntax in other Bash shell scripts. + +* [Anybody can write good bash (with a little effort)](https://blog.yossarian.net/2020/01/23/Anybody-can-write-good-bash-with-a-little-effort) + covers the basics of shell scripting and provides some recommendations + for creating more maintainable scripts such as using linters and + formatters. + +* Google's [Shell Style Guide](https://google.github.io/styleguide/shell.xml) + covers how to write consistent, maintainable shell scripts, which is + particularly important if you have ever tried to debug a hacky shell + script that was never meant to be used by anyone other than the original + author. + +* [Bash scripting quirks & safety tips](https://jvns.ca/blog/2017/03/26/bash-quirks/) + explains Bash basic programming constructs like `for` loops and variable + assignment then goes into ways to avoid weird issues in your code. + +* If all else fails when you're trying to use Bash scripts, this article + on [replacing Bash scripts with Python](https://github.com/ninjaaron/replacing-bash-scripting-with-python) + is a guide on swapping in Python for administrative scripting, including + what to do about replacing invaluable command line tools such as `awk`, + `sed` and `grep`. + + ### Additional Bash resources +The following resources cover more advanced Bash use cases and what pitfalls +to try to avoid as you work with the shell or write scripts. + * [Advancing in the Bash shell](http://samrowe.com/wordpress/advancing-in-the-bash-shell/) covers important concepts such as bang syntax, movement commands, tab completion and aliases. @@ -129,16 +184,6 @@ with this shell: `PROMPT_COMMAND`, `CDPATH` and `REPLY` which can simplify your scripts by using values that Bash already has stored for you. -* Google's [Shell Style Guide](https://google.github.io/styleguide/shell.xml) - covers how to write consistent, maintainable shell scripts, which is - particularly important if you have ever tried to debug a hacky shell - script that was never meant to be used by anyone other than the original - author. - -* [Bash scripting quirks & safety tips](https://jvns.ca/blog/2017/03/26/bash-quirks/) - explains Bash basic programming constructs like `for` loops and variable - assignment then goes into ways to avoid weird issues in your code. - * [Safe ways to do things in bash](https://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md) shows you how to not shoot yourself in the foot by using safe coding practices with your shell scripts. @@ -156,19 +201,10 @@ with this shell: application that generates a hostable, customizable status page for your services. -* [Replacing Bash scripts with Python](https://github.com/ninjaaron/replacing-bash-scripting-with-python) - is a guide on using using Python for administrative scripting, including - what to do about replacing invaluable command line tools such as `awk`, - `sed` and `grep`. - * [Using Aliases to Speed Up Your Git Workflow](https://dev.to/robertcoopercode/using-aliases-to-speed-up-your-git-workflow-2f5a) has a bunch of shell aliases that make it easier for you to execute complicated or uncommon [Git](/git.html) commands. -* [Creating a bash completion script](https://iridakos.com/tutorials/2018/03/01/bash-programmable-completion-tutorial.html) - is a great tutorial that walks you through a reasonably complex Bash - script for completing syntax in other Bash shell scripts. - * [6 Tips Before You Write Your Next Bash Cronjob](https://yasoob.me/posts/6-tips-before-you-write-your-next-bash-cronjob/) covers starting your scripts with shebang, redirecting output, timeouts and sudo privileges. @@ -190,7 +226,3 @@ with this shell: open new Bash shells. On many systems you can easily cut down the startup time for the shell which can be unnecessarily sluggish. -* [Anybody can write good bash (with a little effort)](https://blog.yossarian.net/2020/01/23/Anybody-can-write-good-bash-with-a-little-effort) - covers the basics of shell scripting and provides some recommendations - for creating more maintainable scripts such as using linters and - formatters. From 024c9d750539fbcf920cc5d9ff0b3f0760af650a Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 30 Dec 2020 14:25:58 -0500 Subject: [PATCH 244/302] new networking and stripe resources --- .../pages/04-web-development/40-networking.markdown | 13 +++++++++++++ content/pages/04-web-development/53-stripe.markdown | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/content/pages/04-web-development/40-networking.markdown b/content/pages/04-web-development/40-networking.markdown index 5b3a98045..7e690cdba 100644 --- a/content/pages/04-web-development/40-networking.markdown +++ b/content/pages/04-web-development/40-networking.markdown @@ -13,6 +13,19 @@ web applications. ### Resources about networking +The "Let's code a TCP/IP stack" series along with its +[open source code](https://github.com/saminiir/level-ip) gives a ton of +context on how TCP/IP works while providing the code for implementing the +foundational pieces. You will likely need to pair this with a more theoretical +reference tutorial such as [RFC 1180](https://tools.ietf.org/html/rfc1180) +to have a more complete understanding of the protocol: + +1. [Ethernet & ARP](http://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/) +1. [IPv4 & ICMPv4](http://www.saminiir.com/lets-code-tcp-ip-stack-2-ipv4-icmpv4/) +1. [TCP Basics & Handshake](http://www.saminiir.com/lets-code-tcp-ip-stack-3-tcp-handshake/) +1. [TCP Data Flow & Socket API](http://www.saminiir.com/lets-code-tcp-ip-stack-4-tcp-data-flow-socket-api/) +1. [TCP Retransmission](http://www.saminiir.com/lets-code-tcp-ip-stack-5-tcp-retransmission/) + * [Monitoring and Tuning the Linux Networking Stack: Receiving Data](https://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/) along with [Monitoring and Tuning the Linux Networking Stack: Sending Data](https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data/) diff --git a/content/pages/04-web-development/53-stripe.markdown b/content/pages/04-web-development/53-stripe.markdown index 9e5a2dd9b..aee4f6f98 100644 --- a/content/pages/04-web-development/53-stripe.markdown +++ b/content/pages/04-web-development/53-stripe.markdown @@ -43,6 +43,11 @@ for processing payments. ### Resources about Stripe +* [Stripe’s payments APIs: the first ten years](https://stripe.com/blog/payment-api-design) + has a ton of great context about how Stripe's payments API has evolved, + its architecture, how they expanded it over time, and generally a bunch + of solid storytelling behind how it has been built. + * [How Stripe Designs Beautiful Websites](https://leerob.io/blog/how-stripe-designs-beautiful-websites) explains the process for how Stripe creates their gorgeous design that makes people want to use the service and explore what else they can From f8095c8310bb6636a3903e5715cc75c3ee49e41c Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 1 Jan 2021 10:58:12 -0500 Subject: [PATCH 245/302] new resources and flask extensions --- .../08-bash-shell.markdown | 5 + .../12-tmux.markdown | 4 + .../04-web-development/46-webhooks.markdown | 4 + .../57-sql-injection.markdown | 5 + .../10-working/01-event-streams.markdown | 3 +- .../flask/flask-app-badrequest.markdown | 11 +- .../examples/flask/flask-app-flask.markdown | 109 +++++++--- .../examples/flask/flask-app-headers.markdown | 2 +- .../flask/flask-app-immutabledict.markdown | 8 +- .../flask/flask-cli-appgroup.markdown | 14 +- .../flask/flask-cli-dispatchingapp.markdown | 4 +- .../flask/flask-cli-flaskgroup.markdown | 11 +- .../flask/flask-cli-pass-script-info.markdown | 4 +- .../flask/flask-cli-scriptinfo.markdown | 13 +- .../flask/flask-cli-with-appcontext.markdown | 11 +- .../flask/flask-ctx-has-app-context.markdown | 31 ++- .../flask-ctx-has-request-context.markdown | 55 +++-- .../flask/flask-extensions-plug-ins.markdown | 9 + .../flask/flask-globals-current-app.markdown | 94 +++++++- .../examples/flask/flask-globals-g.markdown | 18 +- .../flask/flask-globals-request.markdown | 183 ++++++++-------- .../flask/flask-globals-session.markdown | 85 ++++---- .../flask/flask-helpers-flash.markdown | 33 +-- .../flask-helpers-get-root-path.markdown | 49 +++-- .../flask-helpers-make-response.markdown | 7 +- .../flask/flask-helpers-url-for.markdown | 116 +++++++++- .../flask/flask-json-jsonify.markdown | 201 ++++++++++++++---- .../flask-sessions-sessionmixin.markdown | 6 +- .../flask-templating-render-template.markdown | 144 +++++++++++-- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 4 +- .../examples/flask/flask-views-view.markdown | 2 +- content/pages/meta/00-change-log.markdown | 9 +- theme/templates/base.html | 2 +- 34 files changed, 866 insertions(+), 392 deletions(-) diff --git a/content/pages/02-development-environments/08-bash-shell.markdown b/content/pages/02-development-environments/08-bash-shell.markdown index 40f6b0525..7fd89c38e 100644 --- a/content/pages/02-development-environments/08-bash-shell.markdown +++ b/content/pages/02-development-environments/08-bash-shell.markdown @@ -226,3 +226,8 @@ to try to avoid as you work with the shell or write scripts. open new Bash shells. On many systems you can easily cut down the startup time for the shell which can be unnecessarily sluggish. +* [Bash HTTP monitoring dashboard](https://raymii.org/s/software/Bash_HTTP_Monitoring_Dashboard.html) + ([source code](https://github.com/RaymiiOrg/bash-http-monitoring)) + is a useful application fully written in Bash shell scripts that + monitors the health of one or more websites to make sure they are + up and running. diff --git a/content/pages/02-development-environments/12-tmux.markdown b/content/pages/02-development-environments/12-tmux.markdown index 4da1c3016..1813d8f4f 100644 --- a/content/pages/02-development-environments/12-tmux.markdown +++ b/content/pages/02-development-environments/12-tmux.markdown @@ -28,6 +28,10 @@ easier to use many shells at once and attaching to both local and remote tmux+Vim user myself, I can attest to how great these two tools complement each other. +* [Writing & Coding Workflow](http://jacobzelko.com/workflow/) shows one + developer's configuration that combines [Vim](/vim.html) and several plugins + with tmux for a productive setup. + * [Making tmux Pretty and Usable - A Guide to Customizing your tmux.conf](http://www.hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/) * [Tmux Pairing Anywhere: On Your Box](http://iamvery.com/2013/11/16/tmux-pairing-anywhere-on-your-box.html) diff --git a/content/pages/04-web-development/46-webhooks.markdown b/content/pages/04-web-development/46-webhooks.markdown index 06e3b1984..9fbbcdbac 100644 --- a/content/pages/04-web-development/46-webhooks.markdown +++ b/content/pages/04-web-development/46-webhooks.markdown @@ -32,6 +32,10 @@ otherwise independent web applications. for how to receive an HTTP POST webhook request, as well as how to test it locally with Ngrok. +* [Webhooks for Beginners - Full Course](https://www.youtube.com/watch?v=41NOoEz3Tzc) + is an entire free video course that shows both how to use and implement + webhooks into applications. + * [Should you build a webhooks API?](https://brandur.org/webhooks) * [Webhooks do’s and dont’s: what we learned after integrating +100 APIs](https://restful.io/webhooks-dos-and-dont-s-what-we-learned-after-integrating-100-apis-d567405a3671) diff --git a/content/pages/04-web-development/57-sql-injection.markdown b/content/pages/04-web-development/57-sql-injection.markdown index 8536fdb73..084f699e8 100644 --- a/content/pages/04-web-development/57-sql-injection.markdown +++ b/content/pages/04-web-development/57-sql-injection.markdown @@ -24,3 +24,8 @@ can affect both [relational databases](/databases.html) and * [Securing your site like it's 1999](https://24ways.org/2018/securing-your-site-like-its-1999/) covers a bunch of common web application vulnerabilities including SQL injection. + +* [Automating Blind Sql Injection](https://bad-jubies.github.io/Blind-SQLi-1/) + shows how to use Python to execute SQL injection on the example + [Damn Vulnerable Web Application](https://github.com/digininja/DVWA) + project. diff --git a/content/pages/10-working/01-event-streams.markdown b/content/pages/10-working/01-event-streams.markdown index 596944b50..dcc13182f 100644 --- a/content/pages/10-working/01-event-streams.markdown +++ b/content/pages/10-working/01-event-streams.markdown @@ -54,4 +54,5 @@ keep up with the constant flood of data from the source of an event stream. is specific to AWS Kinesis but it explains how Amazon uses event streams at scale to run and coordinate a significant number of their services. When their event streams service went down... it took a - whole lot of other stuff down at the same time. + whole lot of other stuff down at the same time. There is also some + [additional analysis in this post by an independent developer](https://ryanfrantz.com/posts/aws-kinesis-outage-analysis.html). diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 43874fee8..a02fc98a2 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -266,22 +266,21 @@ The code is open sourced under the ~~from werkzeug.exceptions import BadRequest, Forbidden, HTTPException, NotFound from indico.util.i18n import _ -from indico.util.string import to_unicode def get_error_description(exception): try: description = exception.description except AttributeError: - return to_unicode(exception.message) + return str(exception) if isinstance(exception, Forbidden) and description == Forbidden.description: - return _(u"You are not allowed to access this page.") + return _("You are not allowed to access this page.") elif isinstance(exception, NotFound) and description == NotFound.description: - return _(u"The page you are looking for doesn't exist.") + return _("The page you are looking for doesn't exist.") ~~ elif isinstance(exception, BadRequest) and description == BadRequest.description: - return _(u"The request was invalid or contained invalid arguments.") + return _("The request was invalid or contained invalid arguments.") else: - return to_unicode(description) + return str(description) class IndicoError(Exception): diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 0bc58532b..830f152ea 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -19,7 +19,7 @@ application's functionality, including URL rounting, and ImmutableDict are several other callables with code examples from the same `flask.app` package. -You should read up on these subjects along with these `Flask` examples: +These subjects go along with the `Flask` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -88,34 +88,82 @@ as-is to run CTF events, or modified for custom rules for related scenarios. CTFd is open sourced under the [Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). -[**CTFd / manage.py**](https://github.com/CTFd/CTFd/blob/master/././manage.py) +[**CTFd / tests / test_themes.py**](https://github.com/CTFd/CTFd/blob/master/./tests/test_themes.py) ```python -# manage.py -~~from flask import Flask -from flask_sqlalchemy import SQLAlchemy -from flask_script import Manager -from flask_migrate import Migrate, MigrateCommand -from CTFd import create_app -from CTFd.utils import get_config as get_config_util, set_config as set_config_util -from CTFd.models import * +# test_themes.py + +from flask import request +from jinja2.sandbox import SecurityError +from werkzeug.test import Client + +from CTFd.utils import get_config +from tests.helpers import create_ctfd, destroy_ctfd, gen_user, login_as_user + + +def test_themes_run_in_sandbox(): + app = create_ctfd() + with app.app_context(): + try: + app.jinja_env.from_string( + "{{ ().__class__.__bases__[0].__subclasses__()[40]('./test_utils.py').read() }}" + ).render() + except SecurityError: + pass + except Exception as e: + raise e + destroy_ctfd(app) + + +def test_themes_cant_access_configpy_attributes(): + app = create_ctfd() + with app.app_context(): + assert app.config["SECRET_KEY"] == "AAAAAAAAAAAAAAAAAAAA" + assert ( + app.jinja_env.from_string("{{ get_config('SECRET_KEY') }}").render() + != app.config["SECRET_KEY"] + ) + destroy_ctfd(app) + -app = create_app() +def test_themes_escape_html(): -manager = Manager(app) -manager.add_command("db", MigrateCommand) + +## ... source file abbreviated to get to Flask examples ... + + + + r = client.get("/challenges") + assert r.status_code == 200 + assert "Challenges" in r.get_data(as_text=True) + + r = client.get("/scoreboard") + assert r.status_code == 200 + assert "Scoreboard" in r.get_data(as_text=True) + destroy_ctfd(app) -def jsenums(): - from CTFd.constants import JS_ENUMS - import json - import os +def test_that_request_path_hijacking_works_properly(): + app = create_ctfd(setup=False, application_root="/ctf") + assert app.request_class.__name__ == "CTFdRequest" + with app.app_context(): + with app.test_request_context("/challenges"): + assert request.path == "/ctf/challenges" + destroy_ctfd(app) - path = os.path.join(app.root_path, "themes/core/assets/js/constants.js") + app = create_ctfd() + assert app.request_class.__name__ == "CTFdRequest" + with app.app_context(): + with app.test_request_context("/challenges"): + assert request.path == "/challenges" - with open(path, "w+") as f: - for k, v in JS_ENUMS.items(): - f.write("const {} = Object.freeze({});".format(k, json.dumps(v))) +~~ from flask import Flask + +~~ test_app = Flask("test") + assert test_app.request_class.__name__ == "Request" + with test_app.test_request_context("/challenges"): + assert request.path == "/challenges" + destroy_ctfd(app) @@ -215,7 +263,6 @@ from sqlalchemy import event from sqlalchemy.engine import Engine from sqlalchemy.exc import OperationalError, ProgrammingError -from flaskbb._compat import iteritems, string_types from flaskbb.extensions import (alembic, allows, babel, cache, celery, csrf, db, debugtoolbar, limiter, login_manager, mail, redis_store, themes, whooshee) @@ -249,6 +296,7 @@ from .forum import views as forum_views # noqa from .management import views as management_views # noqa from .user import views as user_views # noqa + logger = logging.getLogger(__name__) @@ -740,8 +788,8 @@ def on_disconnect(): disconnected = '/' -@socketio.on('connect', namespace='/test') -def on_connect_test(): +@socketio.event(namespace='/test') +def connect(): send('connected-test') @@ -789,10 +837,15 @@ def on_connect_test(): self.assertEqual(len(received), 1) self.assertEqual(received[0]['args'], {'connected': 'foo'}) - -if __name__ == '__main__': - unittest.main() - + def test_encode_decode(self): + client = socketio.test_client(app) + client.get_received() + data = {'foo': 'bar', 'invalid': socketio} + self.assertRaises(TypeError, client.emit, 'my custom event', data, + callback=True) + data = {'foo': 'bar'} + ack = client.emit('my custom event', data, callback=True) + data['foo'] = 'baz' ## ... source file continues with no further Flask examples... diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index f0ff819bc..d7f527937 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -22,7 +22,7 @@ Flask web applications. and ImmutableDict are several other callables with code examples from the same `flask.app` package. -These topics are also useful while reading the `Headers` examples: +These subjects go along with the `Headers` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 5fcb634f0..5339581e3 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -40,8 +40,6 @@ The code is open sourced under the ```python # config.py -from __future__ import absolute_import, unicode_literals - import ast import codecs import os @@ -86,8 +84,8 @@ DEFAULTS = { allowed |= set(INTERNAL_DEFAULTS) for key in set(data) - allowed: - warnings.warn('Ignoring unknown config key {}'.format(key)) - return {k: v for k, v in data.iteritems() if k in allowed} + warnings.warn(f'Ignoring unknown config key {key}') + return {k: v for k, v in data.items() if k in allowed} def load_config(only_defaults=False, override=None): @@ -112,7 +110,7 @@ def load_config(only_defaults=False, override=None): ~~ return ImmutableDict(data) -class IndicoConfig(object): +class IndicoConfig: __slots__ = ('_config', '_exc') diff --git a/content/pages/examples/flask/flask-cli-appgroup.markdown b/content/pages/examples/flask/flask-cli-appgroup.markdown index 828b6c8e2..573902b6a 100644 --- a/content/pages/examples/flask/flask-cli-appgroup.markdown +++ b/content/pages/examples/flask/flask-cli-appgroup.markdown @@ -35,8 +35,6 @@ The code is open sourced under the ```python # util.py -from __future__ import unicode_literals - import traceback from importlib import import_module @@ -56,8 +54,8 @@ def _create_app(info): class IndicoFlaskGroup(FlaskGroup): def __init__(self, **extra): - super(IndicoFlaskGroup, self).__init__(create_app=_create_app, add_default_commands=False, - add_version_option=False, set_debug_flag=False, **extra) + super().__init__(create_app=_create_app, add_default_commands=False, add_version_option=False, + set_debug_flag=False, **extra) self._indico_plugin_commands = None def _load_plugin_commands(self): @@ -65,7 +63,7 @@ class IndicoFlaskGroup(FlaskGroup): def _wrap_in_plugin_context(self, plugin, cmd): cmd.callback = wrap_in_plugin_context(plugin, cmd.callback) - for subcmd in getattr(cmd, 'commands', {}).viewvalues(): + for subcmd in getattr(cmd, 'commands', {}).values(): self._wrap_in_plugin_context(plugin, subcmd) def _get_indico_plugin_commands(self, ctx): @@ -77,12 +75,12 @@ class IndicoFlaskGroup(FlaskGroup): ctx.ensure_object(ScriptInfo).load_app() cmds = named_objects_from_signal(signals.plugin.cli.send(), plugin_attr='_indico_plugin') rv = {} - for name, cmd in cmds.viewitems(): + for name, cmd in cmds.items(): if cmd._indico_plugin: self._wrap_in_plugin_context(cmd._indico_plugin, cmd) rv[name] = cmd except Exception as exc: - if 'No indico config found' not in unicode(exc): + if 'No indico config found' not in str(exc): click.echo(click.style('Loading plugin commands failed:', fg='red', bold=True)) click.echo(click.style(traceback.format_exc(), fg='red')) rv = {} @@ -105,7 +103,7 @@ class LazyGroup(click.Group): def __init__(self, import_name, **kwargs): self._import_name = import_name - super(LazyGroup, self).__init__(**kwargs) + super().__init__(**kwargs) @cached_property def _impl(self): diff --git a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown index 6301decdf..facbdfdef 100644 --- a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown +++ b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown @@ -33,8 +33,6 @@ The code is open sourced under the ```python # devserver.py -from __future__ import print_function, unicode_literals - import os ~~from flask.cli import DispatchingApp @@ -115,7 +113,7 @@ class DebuggedIndico(DebuggedApplication): def __init__(self, *args, **kwargs): self._evalex_whitelist = None self._request_ip = None - super(DebuggedIndico, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index f42799cb7..e2ca94dfd 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -44,7 +44,6 @@ from datetime import datetime import click import click_log -from celery.bin.celery import CeleryCommand from flask import current_app ~~from flask.cli import FlaskGroup, ScriptInfo, with_appcontext from flask_alembic import alembic_click @@ -115,8 +114,6 @@ The code is open sourced under the ```python # util.py -from __future__ import unicode_literals - import traceback from importlib import import_module @@ -136,8 +133,8 @@ def _create_app(info): ~~class IndicoFlaskGroup(FlaskGroup): def __init__(self, **extra): - super(IndicoFlaskGroup, self).__init__(create_app=_create_app, add_default_commands=False, - add_version_option=False, set_debug_flag=False, **extra) + super().__init__(create_app=_create_app, add_default_commands=False, add_version_option=False, + set_debug_flag=False, **extra) self._indico_plugin_commands = None def _load_plugin_commands(self): @@ -145,7 +142,7 @@ def _create_app(info): def _wrap_in_plugin_context(self, plugin, cmd): cmd.callback = wrap_in_plugin_context(plugin, cmd.callback) - for subcmd in getattr(cmd, 'commands', {}).viewvalues(): + for subcmd in getattr(cmd, 'commands', {}).values(): self._wrap_in_plugin_context(plugin, subcmd) def _get_indico_plugin_commands(self, ctx): @@ -157,7 +154,7 @@ def _create_app(info): ctx.ensure_object(ScriptInfo).load_app() cmds = named_objects_from_signal(signals.plugin.cli.send(), plugin_attr='_indico_plugin') rv = {} - for name, cmd in cmds.viewitems(): + for name, cmd in cmds.items(): ## ... source file continues with no further FlaskGroup examples... diff --git a/content/pages/examples/flask/flask-cli-pass-script-info.markdown b/content/pages/examples/flask/flask-cli-pass-script-info.markdown index c8516a952..2f663acce 100644 --- a/content/pages/examples/flask/flask-cli-pass-script-info.markdown +++ b/content/pages/examples/flask/flask-cli-pass-script-info.markdown @@ -32,8 +32,6 @@ The code is open sourced under the ```python # core.py -from __future__ import unicode_literals - import click ~~from flask.cli import AppGroup, pass_script_info @@ -54,7 +52,7 @@ def _get_indico_version(ctx, param, value): if not value or ctx.resilient_parsing: return import indico - message = 'Indico v{}'.format(indico.__version__) + message = f'Indico v{indico.__version__}' click.echo(message, ctx.color) ctx.exit() diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index 97aae3a5a..4a8997772 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -44,7 +44,6 @@ from datetime import datetime import click import click_log -from celery.bin.celery import CeleryCommand from flask import current_app ~~from flask.cli import FlaskGroup, ScriptInfo, with_appcontext from flask_alembic import alembic_click @@ -158,8 +157,6 @@ The code is open sourced under the ```python # util.py -from __future__ import unicode_literals - import traceback from importlib import import_module @@ -179,8 +176,8 @@ def _create_app(info): class IndicoFlaskGroup(FlaskGroup): def __init__(self, **extra): - super(IndicoFlaskGroup, self).__init__(create_app=_create_app, add_default_commands=False, - add_version_option=False, set_debug_flag=False, **extra) + super().__init__(create_app=_create_app, add_default_commands=False, add_version_option=False, + set_debug_flag=False, **extra) self._indico_plugin_commands = None def _load_plugin_commands(self): @@ -188,7 +185,7 @@ class IndicoFlaskGroup(FlaskGroup): def _wrap_in_plugin_context(self, plugin, cmd): cmd.callback = wrap_in_plugin_context(plugin, cmd.callback) - for subcmd in getattr(cmd, 'commands', {}).viewvalues(): + for subcmd in getattr(cmd, 'commands', {}).values(): self._wrap_in_plugin_context(plugin, subcmd) def _get_indico_plugin_commands(self, ctx): @@ -200,12 +197,12 @@ class IndicoFlaskGroup(FlaskGroup): ~~ ctx.ensure_object(ScriptInfo).load_app() cmds = named_objects_from_signal(signals.plugin.cli.send(), plugin_attr='_indico_plugin') rv = {} - for name, cmd in cmds.viewitems(): + for name, cmd in cmds.items(): if cmd._indico_plugin: self._wrap_in_plugin_context(cmd._indico_plugin, cmd) rv[name] = cmd except Exception as exc: - if 'No indico config found' not in unicode(exc): + if 'No indico config found' not in str(exc): click.echo(click.style('Loading plugin commands failed:', fg='red', bold=True)) click.echo(click.style(traceback.format_exc(), fg='red')) rv = {} diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index 70e615275..bb89e469a 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -44,7 +44,6 @@ from datetime import datetime import click import click_log -from celery.bin.celery import CeleryCommand from flask import current_app ~~from flask.cli import FlaskGroup, ScriptInfo, with_appcontext from flask_alembic import alembic_click @@ -158,9 +157,7 @@ def install(welcome, force, username, email, password, no_plugins): @click.pass_context ~~@with_appcontext def start_celery(ctx): - CeleryCommand(celery).execute_from_commandline( - ["flaskbb celery"] + ctx.args - ) + celery.start(ctx.args) @flaskbb.command("shell", short_help="Runs a shell in the app context.") @@ -183,7 +180,11 @@ def shell_command(): try: import IPython - IPython.embed(banner1=banner, user_ns=ctx) + from traitlets.config import get_config + + c = get_config() + c.InteractiveShellEmbed.colors = "Linux" + IPython.embed(config=c, banner1=banner, user_ns=ctx) except ImportError: code.interact(banner=banner, local=ctx) diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index bc40fdf0e..a29697b0f 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -143,15 +143,12 @@ The code is open sourced under the import ast import re -import textwrap -import traceback -import warnings from contextlib import contextmanager from babel import negotiate_locale from babel.core import LOCALE_ALIASES, Locale from babel.messages.pofile import read_po -from babel.support import NullTranslations, Translations +from babel.support import NullTranslations ~~from flask import current_app, g, has_app_context, has_request_context, request, session from flask_babelex import Babel, Domain, get_domain from flask_pluginengine import current_plugin @@ -183,22 +180,22 @@ def get_translation_domain(plugin_name=_use_context): return get_domain() -def gettext_unicode(*args, **kwargs): - from indico.util.string import inject_unicode_debug - func_name = kwargs.pop('func_name', 'ugettext') +def _indico_gettext(*args, **kwargs): + func_name = kwargs.pop('func_name', 'gettext') plugin_name = kwargs.pop('plugin_name', None) - force_unicode = kwargs.pop('force_unicode', False) - - if not isinstance(args[0], unicode): - args = [(text.decode('utf-8') if isinstance(text, str) else text) for text in args] - using_unicode = force_unicode - else: - using_unicode = True translations = get_translation_domain(plugin_name).get_translations() - res = getattr(translations, func_name)(*args, **kwargs) - res = inject_unicode_debug(res) - if not using_unicode: + return getattr(translations, func_name)(*args, **kwargs) + + +def lazy_gettext(string, plugin_name=None): + if is_lazy_string(string): + return string + return make_lazy_string(_indico_gettext, string, plugin_name=plugin_name) + + +def orig_string(lazy_string): + return lazy_string._args[0] if is_lazy_string(lazy_string) else lazy_string ## ... source file continues with no further has_app_context examples... diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index 9506aece1..235184bfc 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -203,7 +203,7 @@ import sys gevent_socketio_found = True try: - from socketio import socketio_manage + from socketio import socketio_manage # noqa: F401 except ImportError: gevent_socketio_found = False if gevent_socketio_found: @@ -216,14 +216,14 @@ import flask ~~from flask import _request_ctx_stack, has_request_context, json as flask_json from flask.sessions import SessionMixin import socketio -from socketio.exceptions import ConnectionRefusedError +from socketio.exceptions import ConnectionRefusedError # noqa: F401 from werkzeug.debug import DebuggedApplication from werkzeug.serving import run_with_reloader from .namespace import Namespace from .test_client import SocketIOTestClient -__version__ = '4.3.2dev' +__version__ = '5.0.2dev' class _SocketIOMiddleware(socketio.WSGIApp): @@ -243,11 +243,11 @@ class _SocketIOMiddleware(socketio.WSGIApp): ## ... source file abbreviated to get to has_request_context examples ... - self.default_exception_handler = exception_handler - return exception_handler + else: + def set_handler(handler): + return self.on(handler.__name__, *args, **kwargs)(handler) - def on_event(self, message, handler, namespace=None): - self.on(message, namespace=namespace)(handler) + return set_handler def on_namespace(self, namespace_handler): if not isinstance(namespace_handler, Namespace): @@ -260,7 +260,7 @@ class _SocketIOMiddleware(socketio.WSGIApp): def emit(self, event, *args, **kwargs): namespace = kwargs.pop('namespace', '/') - room = kwargs.pop('room', None) + to = kwargs.pop('to', kwargs.pop('room', None)) include_self = kwargs.pop('include_self', True) skip_sid = kwargs.pop('skip_sid', None) if not include_self and not skip_sid: @@ -278,17 +278,17 @@ class _SocketIOMiddleware(socketio.WSGIApp): if sid: callback = _callback_wrapper - self.server.emit(event, *args, namespace=namespace, room=room, + self.server.emit(event, *args, namespace=namespace, to=to, skip_sid=skip_sid, callback=callback, **kwargs) - def send(self, data, json=False, namespace=None, room=None, + def send(self, data, json=False, namespace=None, to=None, callback=None, include_self=True, skip_sid=None, **kwargs): skip_sid = flask.request.sid if not include_self else skip_sid if json: - self.emit('json', data, namespace=namespace, room=room, + self.emit('json', data, namespace=namespace, to=to, skip_sid=skip_sid, callback=callback, **kwargs) else: - self.emit('message', data, namespace=namespace, room=room, + self.emit('message', data, namespace=namespace, to=to, skip_sid=skip_sid, callback=callback, **kwargs) def close_room(self, room, namespace=None): @@ -314,16 +314,11 @@ The code is open sourced under the ```python # logger.py -from __future__ import unicode_literals - import logging import logging.config import logging.handlers import os -import smtplib import warnings -from email.mime.text import MIMEText -from email.utils import formatdate from pprint import pformat import yaml @@ -346,21 +341,21 @@ else: has_sentry = True -class AddRequestIDFilter(object): +class AddRequestIDFilter: def filter(self, record): ~~ record.request_id = request.id if has_request_context() else '0' * 16 return True -class AddUserIDFilter(object): +class AddUserIDFilter: def filter(self, record): -~~ record.user_id = unicode(session.user.id) if has_request_context() and session and session.user else '-' +~~ record.user_id = str(session.user.id) if has_request_context() and session and session.user else '-' return True class RequestInfoFormatter(logging.Formatter): def format(self, record): - rv = super(RequestInfoFormatter, self).format(record) + rv = super().format(record) info = get_request_info() if info: rv += '\n\n' + pformat(info) @@ -371,14 +366,14 @@ class FormattedSubjectSMTPHandler(logging.handlers.SMTPHandler): def getSubject(self, record): return self.subject % record.__dict__ - def emit(self, record): - try: - port = self.mailport - if not port: - port = smtplib.SMTP_PORT - smtp = smtplib.SMTP(self.mailhost, port, timeout=self._timeout) - msg = MIMEText(self.format(record), 'plain', 'utf-8') - msg['From'] = self.fromaddr + +class BlacklistFilter(logging.Filter): + def __init__(self, names): + self.filters = [logging.Filter(name) for name in names] + + def filter(self, record): + return not any(x.filter(record) for x in self.filters) + ## ... source file abbreviated to get to has_request_context examples ... @@ -416,7 +411,7 @@ class IndicoSentry(Sentry): 'name': session.user.full_name} def before_request(self, *args, **kwargs): - super(IndicoSentry, self).before_request() + super().before_request() ~~ if not has_request_context(): return self.client.extra_context({'Endpoint': str(request.url_rule.endpoint) if request.url_rule else None, diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown index 67c8b60c2..52adcbeae 100644 --- a/content/pages/examples/flask/flask-extensions-plug-ins.markdown +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -114,6 +114,15 @@ open sourced under the [MIT license](https://github.com/maxcountryman/flask-login/blob/master/LICENSE). +### Flask-Meld +[Flask-Meld](https://github.com/mikeabrahamsen/Flask-Meld) +([PyPI package information](https://pypi.org/project/Flask-Meld/)) +allows you to write your front end web code in your back end +Python code. It does this by adding a `{% meld_scripts %}` tag to +the Flask template engine and then inserting components written +in Python scripts created by a developer. + + ### flask-praetorian [flask-praetorian](https://github.com/dusktreader/flask-praetorian) ([project documentation](https://flask-praetorian.readthedocs.io/en/latest/) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index a8a87959a..a8ba8daaf 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -1201,7 +1201,81 @@ def _secret_key(key=None): ``` -## Example 10 from flask-restx +## Example 10 from Flask-Meld +[Flask-Meld](https://github.com/mikeabrahamsen/Flask-Meld) +([PyPI package information](https://pypi.org/project/Flask-Meld/)) +allows you to write your front end web code in your back end +Python code. It does this by adding a `{% meld_scripts %}` tag to +the Flask template engine and then inserting components written +in Python scripts created by a developer. + +[**Flask-Meld / flask_meld / component.py**](https://github.com/mikeabrahamsen/Flask-Meld/blob/main/flask_meld/./component.py) + +```python +# component.py +import uuid +import os +from importlib.util import module_from_spec, spec_from_file_location + +import orjson +~~from flask import render_template, current_app, url_for +from bs4 import BeautifulSoup +from bs4.formatter import HTMLFormatter + + +def convert_to_snake_case(s): + s.replace("-", "_") + return s + + +def convert_to_camel_case(s): + s = convert_to_snake_case(s) + return "".join(word.title() for word in s.split("_")) + + +def get_component_class(component_name): + module_name = convert_to_snake_case(component_name) + class_name = convert_to_camel_case(module_name) + module = get_component_module(module_name) + component_class = getattr(module, class_name) + + return component_class + + +def get_component_module(module_name): +~~ user_specified_dir = current_app.config.get("MELD_COMPONENT_DIR", None) + + if not user_specified_dir: + try: + name = getattr(current_app, "name", None) + full_path = os.path.join(name, "meld", "components", module_name + ".py") + module = load_module_from_path(full_path, module_name) + except FileNotFoundError: + full_path = os.path.join("meld", "components", module_name + ".py") + module = load_module_from_path(full_path, module_name) + return module + else: + try: + full_path = os.path.join(user_specified_dir, module_name + ".py") + module = load_module_from_path(full_path, module_name) + except FileNotFoundError: + full_path = os.path.join( + user_specified_dir, "components", module_name + ".py" + ) + module = load_module_from_path(full_path, module_name) + return module + + +def load_module_from_path(full_path, module_name): + spec = spec_from_file_location(module_name, full_path) + + +## ... source file continues with no further current_app examples... + +``` + + +## Example 11 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1458,7 +1532,7 @@ def _clean_header(header): ``` -## Example 11 from flask-sqlalchemy +## Example 12 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) ([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) and @@ -1575,7 +1649,7 @@ def _make_table(db): ``` -## Example 12 from Flask-WTF +## Example 13 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1833,7 +1907,7 @@ def same_origin(current_uri, compare_uri): ``` -## Example 13 from Flask-Security-Too +## Example 14 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -2094,7 +2168,7 @@ _default_config = { ``` -## Example 14 from Flask-User +## Example 15 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -2202,7 +2276,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 15 from Flask-VueJs-Template +## Example 16 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -2243,7 +2317,7 @@ def index_client(): ``` -## Example 16 from Flasky +## Example 17 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -2298,7 +2372,7 @@ def run_migrations_online(): ``` -## Example 17 from indico +## Example 18 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -2359,7 +2433,7 @@ def run_migrations_offline(): ``` -## Example 18 from sandman2 +## Example 19 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2484,7 +2558,7 @@ def register_model(cls, admin=None): ``` -## Example 19 from tedivms-flask +## Example 20 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 4c01cc517..b12610288 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -49,7 +49,6 @@ from flask_babel import lazy_gettext as _ from flask_jwt_extended import current_user as current_user_jwt from flask_jwt_extended import JWTManager from flask_login import current_user, LoginManager -from flask_openid import OpenID from werkzeug.security import check_password_hash, generate_password_hash from .api import SecurityApi @@ -69,6 +68,7 @@ from .views import ( RegisterUserModelView, ResetMyPasswordView, ResetPasswordView, + RoleModelView, ## ... source file abbreviated to get to g examples ... @@ -541,11 +541,11 @@ from base64 import b64decode from functools import wraps from hashlib import md5 from random import Random, SystemRandom -~~from flask import request, make_response, session, g +~~from flask import request, make_response, session, g, Response from werkzeug.datastructures import Authorization from werkzeug.security import safe_str_cmp -__version__ = '4.1.1dev' +__version__ = '4.2.1dev' class HTTPAuth(object): @@ -642,7 +642,6 @@ class HTTPBasicAuth(HTTPAuth): ## ... source file abbreviated to get to g examples ... - def decorated(*args, **kwargs): selected_auth = None if 'Authorization' in request.headers: try: @@ -657,8 +656,9 @@ class HTTPBasicAuth(HTTPAuth): break if selected_auth is None: selected_auth = self.main_auth - return selected_auth.login_required(role=role)(f)( - *args, **kwargs) + return selected_auth.login_required(role=role, + optional=optional + )(f)(*args, **kwargs) return decorated if f: @@ -1109,8 +1109,6 @@ The code is open sourced under the ```python # config.py -from __future__ import absolute_import, unicode_literals - import ast import codecs import os @@ -1151,7 +1149,7 @@ DEFAULTS = { ## ... source file abbreviated to get to g examples ... -class IndicoConfig(object): +class IndicoConfig: __slots__ = ('_config', '_exc') @@ -1176,7 +1174,7 @@ class IndicoConfig(object): @property def IMAGES_BASE_URL(self): -~~ return 'static/images' if g.get('static_site') else url_parse('{}/images'.format(self.BASE_URL)).path +~~ return 'static/images' if g.get('static_site') else url_parse(f'{self.BASE_URL}/images').path @property def LATEX_ENABLED(self): diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 54818ed16..545ea5b4a 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -346,8 +346,8 @@ from flaskbb.plugins.utils import validate_plugin from flaskbb.user.models import Group, Guest, User from flaskbb.utils.forms import populate_settings_dict, populate_settings_form from flaskbb.utils.helpers import (get_online_users, register_view, - render_template, time_diff, time_utcnow, - FlashAndRedirect) + render_template, redirect_or_next, + time_diff, time_utcnow, FlashAndRedirect) from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin, IsAtleastModerator, @@ -447,9 +447,14 @@ class DeleteUser(MethodView): ] def post(self, user_id=None): -~~ if request.is_xhr: -~~ ids = request.get_json()["ids"] - +~~ if request.get_json() is not None: +~~ ids = request.get_json().get("ids") + if not ids: + return jsonify( + message="No ids provided.", + category="error", + status=404 + ) data = [] for user in User.query.filter(User.id.in_(ids)).all(): if current_user.id == user.id: @@ -467,12 +472,7 @@ class DeleteUser(MethodView): ) return jsonify( - message="{} users deleted.".format(len(data)), - category="success", - data=data, - status=200 - ) - + message=f"{len(data)} users deleted.", ## ... source file abbreviated to get to request examples ... @@ -561,8 +561,14 @@ class BanUser(MethodView): ) return redirect(url_for("management.overview")) -~~ if request.is_xhr: -~~ ids = request.get_json()["ids"] +~~ if request.get_json() is not None: +~~ ids = request.get_json().get("ids") + if not ids: + return jsonify( + message="No ids provided.", + category="error", + status=404 + ) data = [] users = User.query.filter(User.id.in_(ids)).all() @@ -573,26 +579,20 @@ class BanUser(MethodView): continue elif user.ban(): - data.append( - { - "id": - user.id, - "type": - "ban", - "reverse": - "unban", - "reverse_name": - _("Unban"), - "reverse_url": - url_for("management.unban_user", user_id=user.id) - } - ) + data.append({ + "id": user.id, + "type": "ban", + "reverse": "unban", + "reverse_name": _("Unban"), + "reverse_url": url_for("management.unban_user", user_id=user.id) + }) + ## ... source file abbreviated to get to request examples ... - return redirect(url_for("management.banned_users")) + return redirect_or_next(url_for("management.banned_users")) class UnbanUser(MethodView): @@ -617,8 +617,14 @@ class UnbanUser(MethodView): ) return redirect(url_for("management.overview")) -~~ if request.is_xhr: -~~ ids = request.get_json()["ids"] +~~ if request.get_json() is not None: +~~ ids = request.get_json().get("ids") + if not ids: + return jsonify( + message="No ids provided.", + category="error", + status=404 + ) data = [] for user in User.query.filter(User.id.in_(ids)).all(): @@ -635,11 +641,13 @@ class UnbanUser(MethodView): ) return jsonify( - message="{} users unbanned.".format(len(data)), + message=f"{len(data)} users unbanned.", category="success", - data=data, - status=200 - ) + + +## ... source file abbreviated to get to request examples ... + + user = User.query.filter_by(id=user_id).first_or_404() @@ -648,7 +656,7 @@ class UnbanUser(MethodView): else: flash(_("Could not unban user."), "danger") - return redirect(url_for("management.banned_users")) + return redirect_or_next(url_for("management.users")) class Groups(MethodView): @@ -720,8 +728,15 @@ class DeleteGroup(MethodView): ] def post(self, group_id=None): -~~ if request.is_xhr: -~~ ids = request.get_json()["ids"] +~~ if request.get_json() is not None: +~~ ids = request.get_json().get("ids") + if not ids: + return jsonify( + message="No ids provided.", + category="error", + status=404 + ) + if not (set(ids) & set(["1", "2", "3", "4", "5", "6"])): data = [] for group in Group.query.filter(Group.id.in_(ids)).all(): @@ -739,13 +754,6 @@ class DeleteGroup(MethodView): return jsonify( message="{} groups deleted.".format(len(data)), category="success", - data=data, - status=200 - ) - return jsonify( - message=_("You cannot delete one of the standard groups."), - category="danger", - data=None, ## ... source file abbreviated to get to request examples ... @@ -820,8 +828,14 @@ class MarkReportRead(MethodView): def post(self, report_id=None): -~~ if request.is_xhr: -~~ ids = request.get_json()["ids"] +~~ if request.get_json() is not None: +~~ ids = request.get_json().get("ids") + if not ids: + return jsonify( + message="No ids provided.", + category="error", + status=404 + ) data = [] for report in Report.query.filter(Report.id.in_(ids)).all(): @@ -840,17 +854,12 @@ class MarkReportRead(MethodView): return jsonify( message="{} reports marked as read.".format(len(data)), - category="success", - data=data, - status=200 - ) - - if report_id: ## ... source file abbreviated to get to request examples ... + for report in reports: report.zapped_by = current_user.id report.zapped = time_utcnow() report_list.append(report) @@ -859,7 +868,7 @@ class MarkReportRead(MethodView): db.session.commit() flash(_("All reports were marked as read."), "success") - return redirect(url_for("management.reports")) + return redirect_or_next(url_for("management.reports")) class DeleteReport(MethodView): @@ -875,11 +884,16 @@ class DeleteReport(MethodView): ] def post(self, report_id=None): +~~ if request.get_json() is not None: +~~ ids = request.get_json().get("ids") + if not ids: + return jsonify( + message="No ids provided.", + category="error", + status=404 + ) -~~ if request.is_xhr: -~~ ids = request.get_json()["ids"] data = [] - for report in Report.query.filter(Report.id.in_(ids)).all(): if report.delete(): data.append( @@ -896,12 +910,6 @@ class DeleteReport(MethodView): message="{} reports deleted.".format(len(data)), category="success", data=data, - status=200 - ) - - report = Report.query.filter_by(id=report_id).first_or_404() - report.delete() - flash(_("Report deleted."), "success") ## ... source file continues with no further request examples... @@ -1312,11 +1320,11 @@ from base64 import b64decode from functools import wraps from hashlib import md5 from random import Random, SystemRandom -~~from flask import request, make_response, session, g +~~from flask import request, make_response, session, g, Response from werkzeug.datastructures import Authorization from werkzeug.security import safe_str_cmp -__version__ = '4.1.1dev' +__version__ = '4.2.1dev' class HTTPAuth(object): @@ -1342,7 +1350,6 @@ class HTTPAuth(object): ## ... source file abbreviated to get to request examples ... - return f def get_user_roles(self, f): self.get_user_roles_callback = f @@ -1352,8 +1359,9 @@ class HTTPAuth(object): @wraps(f) def decorated(*args, **kwargs): res = f(*args, **kwargs) + check_status_code = not isinstance(res, (tuple, Response)) res = make_response(res) - if res.status_code == 200: + if check_status_code and res.status_code == 200: res.status_code = 401 if 'WWW-Authenticate' not in res.headers.keys(): res.headers['WWW-Authenticate'] = self.authenticate_header() @@ -1572,9 +1580,11 @@ class MultiAuth(object): self.main_auth = main_auth self.additional_auth = args - def login_required(self, f=None, role=None): - if f is not None and role is not None: # pragma: no cover - raise ValueError('role is the only supported argument') + def login_required(self, f=None, role=None, optional=None): + if f is not None and \ + (role is not None or optional is not None): # pragma: no cover + raise ValueError( + 'role and optional are the only supported arguments') def login_required_internal(f): @wraps(f) @@ -1593,8 +1603,9 @@ class MultiAuth(object): break if selected_auth is None: selected_auth = self.main_auth - return selected_auth.login_required(role=role)(f)( - *args, **kwargs) + return selected_auth.login_required(role=role, + optional=optional + )(f)(*args, **kwargs) return decorated if f: @@ -2204,6 +2215,7 @@ from wtforms import ( ValidationError, validators, ) +from wtforms.fields.html5 import EmailField from wtforms.validators import StopValidation from .babel import is_lazy_string, make_lazy_string @@ -2213,7 +2225,6 @@ from .utils import ( _datastore, config_value, do_flash, - find_user, ## ... source file abbreviated to get to request examples ... @@ -2290,7 +2301,7 @@ class ForgotPasswordForm(Form, UserEmailFormMixin): class LoginForm(Form, NextFormMixin): - email = StringField(get_form_field_label("email"), validators=[email_required]) + email = EmailField(get_form_field_label("email"), validators=[email_required]) password = PasswordField( get_form_field_label("password"), validators=[password_required] ) @@ -2438,8 +2449,8 @@ def on_disconnect(): disconnected = '/' -@socketio.on('connect', namespace='/test') -def on_connect_test(): +@socketio.event(namespace='/test') +def connect(): send('connected-test') send(json.dumps(request.args.to_dict(flat=False))) ~~ send(json.dumps({h: request.headers[h] for h in request.headers.keys() @@ -2452,8 +2463,8 @@ def on_disconnect_test(): disconnected = '/test' -@socketio.on('message') -def on_message(message): +@socketio.event +def message(message): send(message) if message == 'test session': session['a'] = 'b' @@ -2498,6 +2509,7 @@ def get_request_event2(data): ~~ request_event_data = request.event emit('my custom response', data) + socketio.on_event('yet another custom event', get_request_event2) @@ -2509,6 +2521,7 @@ def on_custom_event_test(data): def on_custom_event_test2(data): emit('my custom namespace response', data, namespace='/test') + socketio.on_event('yet another custom namespace event', on_custom_event_test2, namespace='/test') @@ -2518,8 +2531,6 @@ def on_custom_event_broadcast(data): emit('my custom response', data, broadcast=True) -@socketio.on('my custom broadcast namespace event', namespace='/test') -def on_custom_event_broadcast_test(data): ## ... source file abbreviated to get to request examples ... @@ -2537,7 +2548,7 @@ def error_handler_default(value): error_testing_default = True else: raise value - return value + return 'error/default' @socketio.on("error testing", namespace='/unused_namespace') @@ -2724,8 +2735,6 @@ The code is open sourced under the ```python # auth.py -from __future__ import unicode_literals - ~~from flask import current_app, request from flask_multipass import InvalidCredentials, Multipass, NoSuchUser @@ -2738,12 +2747,12 @@ logger = Logger.get('auth') class IndicoMultipass(Multipass): @property def default_local_auth_provider(self): - return next((p for p in self.auth_providers.itervalues() if not p.is_external and p.settings.get('default')), + return next((p for p in self.auth_providers.values() if not p.is_external and p.settings.get('default')), None) @property def sync_provider(self): - return next((p for p in self.identity_providers.itervalues() if p.settings.get('synced_fields')), None) + return next((p for p in self.identity_providers.values() if p.settings.get('synced_fields')), None) @property def synced_fields(self): @@ -2759,10 +2768,10 @@ class IndicoMultipass(Multipass): self._check_default_provider() def _check_default_provider(self): - sync_providers = [p for p in self.identity_providers.itervalues() if p.settings.get('synced_fields')] + sync_providers = [p for p in self.identity_providers.values() if p.settings.get('synced_fields')] if len(sync_providers) > 1: raise ValueError('There can only be one sync provider.') - auth_providers = self.auth_providers.values() + auth_providers = list(self.auth_providers.values()) external_providers = [p for p in auth_providers if p.is_external] local_providers = [p for p in auth_providers if not p.is_external] if any(p.settings.get('default') for p in external_providers): @@ -2789,7 +2798,7 @@ class IndicoMultipass(Multipass): fn = logger.debug fn('Authentication via %s failed: %s (%r)', exc.provider.name if exc.provider else None, exc_str, exc.details) - return super(IndicoMultipass, self).handle_auth_error(exc, redirect_to_login=redirect_to_login) + return super().handle_auth_error(exc, redirect_to_login=redirect_to_login) multipass = IndicoMultipass() diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 4777019a3..6c16cb69a 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -153,8 +153,6 @@ import logging ~~from flask import flash, redirect, request, session, url_for from flask_babel import lazy_gettext -from flask_openid import OpenIDResponse, SessionWrapper -from openid.consumer.consumer import CANCEL, Consumer, SUCCESS from .forms import LoginForm_oid, RegisterUserDBForm, RegisterUserOIDForm from .. import const as c @@ -176,6 +174,8 @@ def get_first_last_name(fullname): class BaseRegisterUser(PublicFormView): route_base = "/register" + email_template = "appbuilder/general/security/register_mail.html" + email_subject = lazy_gettext("Account activation") ## ... source file abbreviated to get to session examples ... @@ -229,8 +229,8 @@ class RegisterUserOIDView(BaseRegisterUser): return redirect(self.get_redirect()) def oid_login_handler(self, f, oid): - if request.args.get("openid_complete") != u"yes": - return f(False) + from flask_openid import OpenIDResponse, SessionWrapper + from openid.consumer.consumer import CANCEL, Consumer, SUCCESS ## ... source file continues with no further session examples... @@ -271,7 +271,7 @@ from babel.core import get_locale_identifier from babel.dates import format_date as babel_format_date from babel.dates import format_datetime as babel_format_datetime from babel.dates import format_timedelta as babel_format_timedelta -~~from flask import flash, g, redirect, request, session, url_for +~~from flask import current_app, flash, g, redirect, request, session, url_for from flask_allows import Permission from flask_babelplus import lazy_gettext as _ from flask_login import current_user @@ -282,32 +282,44 @@ from pytz import UTC from werkzeug.local import LocalProxy from werkzeug.utils import ImportStringError, import_string -from flaskbb._compat import (iteritems, range_method, string_types, text_type, - to_bytes, to_unicode) from flaskbb.extensions import babel, redis_store +from flaskbb.utils.http import is_safe_url from flaskbb.utils.settings import flaskbb_config -try: # compat - FileNotFoundError -except NameError: - FileNotFoundError = IOError logger = logging.getLogger(__name__) _punct_re = re.compile(r'[\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.]+') -def slugify(text, delim=u"-"): - text = unidecode.unidecode(text) - result = [] - for word in _punct_re.split(text.lower()): - if word: +def to_bytes(text, encoding="utf-8"): + if isinstance(text, str): + text = text.encode(encoding) + return text + + +## ... source file abbreviated to get to session examples ... + + result.append(word) - return text_type(delim.join(result)) + return str(delim.join(result)) + + +def redirect_url(endpoint, use_referrer=True): + targets = [endpoint] + allowed_hosts = current_app.config["ALLOWED_HOSTS"] + if use_referrer: + targets.insert(0, request.referrer) + for target in targets: + if target and is_safe_url(target, allowed_hosts): + return target -def redirect_or_next(endpoint, **kwargs): - return redirect(request.args.get("next") or endpoint, **kwargs) +def redirect_or_next(endpoint, use_referrer=True): + return redirect( + redirect_url(request.args.get("next"), use_referrer) + or redirect_url(endpoint, use_referrer) + ) def render_template(template, **context): # pragma: no cover @@ -462,11 +474,11 @@ from base64 import b64decode from functools import wraps from hashlib import md5 from random import Random, SystemRandom -~~from flask import request, make_response, session, g +~~from flask import request, make_response, session, g, Response from werkzeug.datastructures import Authorization from werkzeug.security import safe_str_cmp -__version__ = '4.1.1dev' +__version__ = '4.2.1dev' class HTTPAuth(object): @@ -1206,16 +1218,11 @@ The code is open sourced under the ```python # logger.py -from __future__ import unicode_literals - import logging import logging.config import logging.handlers import os -import smtplib import warnings -from email.mime.text import MIMEText -from email.utils import formatdate from pprint import pformat import yaml @@ -1238,21 +1245,21 @@ else: has_sentry = True -class AddRequestIDFilter(object): +class AddRequestIDFilter: def filter(self, record): record.request_id = request.id if has_request_context() else '0' * 16 return True -class AddUserIDFilter(object): +class AddUserIDFilter: def filter(self, record): -~~ record.user_id = unicode(session.user.id) if has_request_context() and session and session.user else '-' +~~ record.user_id = str(session.user.id) if has_request_context() and session and session.user else '-' return True class RequestInfoFormatter(logging.Formatter): def format(self, record): - rv = super(RequestInfoFormatter, self).format(record) + rv = super().format(record) info = get_request_info() if info: rv += '\n\n' + pformat(info) @@ -1263,14 +1270,14 @@ class FormattedSubjectSMTPHandler(logging.handlers.SMTPHandler): def getSubject(self, record): return self.subject % record.__dict__ - def emit(self, record): - try: - port = self.mailport - if not port: - port = smtplib.SMTP_PORT - smtp = smtplib.SMTP(self.mailhost, port, timeout=self._timeout) - msg = MIMEText(self.format(record), 'plain', 'utf-8') - msg['From'] = self.fromaddr + +class BlacklistFilter(logging.Filter): + def __init__(self, names): + self.filters = [logging.Filter(name) for name in names] + + def filter(self, record): + return not any(x.filter(record) for x in self.filters) + ## ... source file abbreviated to get to session examples ... @@ -1308,7 +1315,7 @@ class IndicoSentry(Sentry): ~~ 'name': session.user.full_name} def before_request(self, *args, **kwargs): - super(IndicoSentry, self).before_request() + super().before_request() if not has_request_context(): return self.client.extra_context({'Endpoint': str(request.url_rule.endpoint) if request.url_rule else None, diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 042c7aad2..4ec9a3fb4 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -126,8 +126,6 @@ import logging ~~from flask import flash, redirect, request, session, url_for from flask_babel import lazy_gettext -from flask_openid import OpenIDResponse, SessionWrapper -from openid.consumer.consumer import CANCEL, Consumer, SUCCESS from .forms import LoginForm_oid, RegisterUserDBForm, RegisterUserOIDForm from .. import const as c @@ -149,6 +147,8 @@ def get_first_last_name(fullname): class BaseRegisterUser(PublicFormView): route_base = "/register" + email_template = "appbuilder/general/security/register_mail.html" + email_subject = lazy_gettext("Account activation") ## ... source file abbreviated to get to flash examples ... @@ -262,6 +262,9 @@ class RegisterUserDBView(BaseRegisterUser): return redirect(self.get_redirect()) def oid_login_handler(self, f, oid): + from flask_openid import OpenIDResponse, SessionWrapper + from openid.consumer.consumer import CANCEL, Consumer, SUCCESS + if request.args.get("openid_complete") != u"yes": return f(False) consumer = Consumer(SessionWrapper(self), oid.store_factory()) @@ -280,9 +283,6 @@ class RegisterUserDBView(BaseRegisterUser): session["oid_resp"] = resp def form_get(self, form): - self.add_form_unique_validations(form) - - def form_post(self, form): ## ... source file continues with no further flash examples... @@ -1525,8 +1525,6 @@ The code is open sourced under the ```python # roles.py -from __future__ import unicode_literals - import csv ~~from flask import flash, session @@ -1535,25 +1533,30 @@ from indico.core.errors import UserValueError from indico.modules.events.roles.forms import ImportMembersCSVForm from indico.modules.users import User from indico.util.i18n import _, ngettext -from indico.util.string import to_unicode, validate_email +from indico.util.spreadsheets import csv_text_io_wrapper +from indico.util.string import validate_email from indico.web.flask.templating import get_template_module from indico.web.util import jsonify_data, jsonify_template -class ImportRoleMembersMixin(object): +class ImportRoleMembersMixin: logger = None def import_members_from_csv(self, f): - reader = csv.reader(f.read().splitlines()) - emails = set() + with csv_text_io_wrapper(f) as ftxt: + reader = csv.reader(ftxt.read().splitlines()) + emails = set() for num_row, row in enumerate(reader, 1): if len(row) != 1: raise UserValueError(_('Row {}: malformed CSV data').format(num_row)) - email = to_unicode(row[0]).strip().lower() + email = row[0].strip().lower() + + +## ... source file abbreviated to get to flash examples ... + - if email and not validate_email(email): raise UserValueError(_('Row {row}: invalid email address: {email}').format(row=num_row, email=email)) if email in emails: raise UserValueError(_('Row {}: email address is not unique').format(num_row)) @@ -1573,12 +1576,12 @@ class ImportRoleMembersMixin(object): if form.remove_existing.data: deleted_members = self.role.members - users for member in deleted_members: - self.logger.info('User {} removed from role {} by {}'.format(member, self.role, session.user)) + self.logger.info(f'User {member} removed from role {self.role} by {session.user}') self.role.members = users else: self.role.members |= users for user in new_members: - self.logger.info('User {} added to role {} by {}'.format(user, self.role, session.user)) + self.logger.info(f'User {user} added to role {self.role} by {session.user}') ~~ flash(ngettext("{} member has been imported.", "{} members have been imported.", len(users)).format(len(users)), 'success') diff --git a/content/pages/examples/flask/flask-helpers-get-root-path.markdown b/content/pages/examples/flask/flask-helpers-get-root-path.markdown index 0284ba378..957aecb48 100644 --- a/content/pages/examples/flask/flask-helpers-get-root-path.markdown +++ b/content/pages/examples/flask/flask-helpers-get-root-path.markdown @@ -33,14 +33,13 @@ The code is open sourced under the ```python # setup.py -from __future__ import unicode_literals - import os import re import shutil import socket import sys from operator import attrgetter +from pathlib import Path from smtplib import SMTP import click @@ -48,10 +47,8 @@ from click import wrap_text ~~from flask.helpers import get_root_path from pkg_resources import iter_entry_points from prompt_toolkit import prompt -from prompt_toolkit.contrib.completers import PathCompleter, WordCompleter -from prompt_toolkit.layout.lexers import SimpleLexer -from prompt_toolkit.styles import style_from_dict -from prompt_toolkit.token import Token +from prompt_toolkit.completion import PathCompleter, WordCompleter +from prompt_toolkit.styles import Style from pytz import all_timezones, common_timezones from redis import RedisError, StrictRedis from sqlalchemy import create_engine @@ -72,6 +69,8 @@ def _echo(msg=''): click.echo(msg, err=True) + + ## ... source file abbreviated to get to get_root_path examples ... @@ -103,25 +102,25 @@ def _get_dirs(target_dir): ~~ return get_root_path('indico'), os.path.abspath(target_dir) -PROMPT_TOOLKIT_STYLE = style_from_dict({ - Token.HELP: '#aaaaaa', - Token.PROMPT: '#5f87ff', - Token.DEFAULT: '#dfafff', - Token.BRACKET: '#ffffff', - Token.COLON: '#ffffff', - Token.INPUT: '#aaffaa', +PROMPT_TOOLKIT_STYLE = Style.from_dict({ + 'help': '#aaaaaa', + 'prompt': '#5f87ff', + 'default': '#dfafff', + 'bracket': '#ffffff', + 'colon': '#ffffff', + '': '#aaffaa', # user input }) def _prompt(message, default='', path=False, list_=None, required=True, validate=None, allow_invalid=False, password=False, help=None): - def _get_prompt_tokens(cli): + def _get_prompt_tokens(): rv = [ - (Token.PROMPT, message), - (Token.COLON, ': '), + ('class:prompt', message), + ('class:colon', ': '), ] if first and help: - rv.insert(0, (Token.HELP, wrap_text(help) + '\n')) + rv.insert(0, ('class:help', wrap_text(help) + '\n')) return rv completer = None @@ -133,14 +132,14 @@ def _prompt(message, default='', path=False, list_=None, required=True, validate if dev: config_data += [ - b'', - b'# Development options', - b'DB_LOG = True', - b'DEBUG = True', - b'SMTP_USE_CELERY = False' + '', + '# Development options', + 'DB_LOG = True', + 'DEBUG = True', + 'SMTP_USE_CELERY = False' ] - config = b'\n'.join(x for x in config_data if x is not None) + config = '\n'.join(x for x in config_data if x is not None) if dev: if not os.path.exists(self.data_root_path): @@ -152,8 +151,8 @@ def _prompt(message, default='', path=False, list_=None, required=True, validate os.mkdir(path) _echo(cformat('%{magenta}Creating %{magenta!}{}%{reset}%{magenta}').format(self.config_path)) - with open(self.config_path, 'wb') as f: - f.write(config + b'\n') + with open(self.config_path, 'w') as f: + f.write(config + '\n') ~~ package_root = get_root_path('indico') _copy(os.path.normpath(os.path.join(package_root, 'logging.yaml.sample')), diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index aa1e8690d..8b052e595 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -150,11 +150,11 @@ from base64 import b64decode from functools import wraps from hashlib import md5 from random import Random, SystemRandom -~~from flask import request, make_response, session, g +~~from flask import request, make_response, session, g, Response from werkzeug.datastructures import Authorization from werkzeug.security import safe_str_cmp -__version__ = '4.1.1dev' +__version__ = '4.2.1dev' class HTTPAuth(object): @@ -187,8 +187,9 @@ class HTTPAuth(object): @wraps(f) def decorated(*args, **kwargs): res = f(*args, **kwargs) + check_status_code = not isinstance(res, (tuple, Response)) ~~ res = make_response(res) - if res.status_code == 200: + if check_status_code and res.status_code == 200: res.status_code = 401 if 'WWW-Authenticate' not in res.headers.keys(): res.headers['WWW-Authenticate'] = self.authenticate_header() diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index c4ee0b2a0..b45d3898e 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -699,7 +699,111 @@ def login_user(user, remember=False, duration=None, force=False, fresh=True): ``` -## Example 9 from flask-restx +## Example 9 from Flask-Meld +[Flask-Meld](https://github.com/mikeabrahamsen/Flask-Meld) +([PyPI package information](https://pypi.org/project/Flask-Meld/)) +allows you to write your front end web code in your back end +Python code. It does this by adding a `{% meld_scripts %}` tag to +the Flask template engine and then inserting components written +in Python scripts created by a developer. + +[**Flask-Meld / flask_meld / component.py**](https://github.com/mikeabrahamsen/Flask-Meld/blob/main/flask_meld/./component.py) + +```python +# component.py +import uuid +import os +from importlib.util import module_from_spec, spec_from_file_location + +import orjson +~~from flask import render_template, current_app, url_for +from bs4 import BeautifulSoup +from bs4.formatter import HTMLFormatter + + +def convert_to_snake_case(s): + s.replace("-", "_") + return s + + +def convert_to_camel_case(s): + s = convert_to_snake_case(s) + return "".join(word.title() for word in s.split("_")) + + +def get_component_class(component_name): + module_name = convert_to_snake_case(component_name) + class_name = convert_to_camel_case(module_name) + module = get_component_module(module_name) + component_class = getattr(module, class_name) + + return component_class + + +def get_component_module(module_name): + + +## ... source file abbreviated to get to url_for examples ... + + + context_variables = {} + context_variables.update(context["attributes"]) + context_variables.update(context["methods"]) + context_variables.update(data) + context_variables.update({"form": self._form}) + + frontend_context_variables = {} + frontend_context_variables.update(context["attributes"]) + frontend_context_variables = orjson.dumps(frontend_context_variables).decode( + "utf-8" + ) + rendered_template = render_template( + f"meld/{component_name}.html", **context_variables + ) + + soup = BeautifulSoup(rendered_template, features="html.parser") + root_element = Component._get_root_element(soup) + root_element["meld:id"] = str(self.id) + root_element["meld:data"] = frontend_context_variables + self._set_values(root_element, context_variables) + + script = soup.new_tag("script", type="module") + init = {"id": str(self.id), "name": component_name, "data": data} + init = orjson.dumps(init).decode("utf-8") + +~~ meld_url = url_for("static", filename="meld/meld.js") + meld_import = f'import {{Meld}} from ".{meld_url}";' + script.string = f"{meld_import} Meld.componentInit({init});" + root_element.append(script) + + rendered_template = Component._desoupify(soup) + + return rendered_template + + def _set_values(self, soup, context_variables): + for element in soup.find_all(attrs={'meld:model': True}): + element.attrs["value"] = context_variables[ + element.attrs["meld:model"] + ] + + @staticmethod + def _get_root_element(soup): + for element in soup.contents: + if element.name: + return element + + raise Exception("No root element found") + + @staticmethod + def _desoupify(soup): + + +## ... source file continues with no further url_for examples... + +``` + + +## Example 10 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -754,7 +858,7 @@ def ui_for(api): ``` -## Example 10 from flaskSaaS +## Example 11 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -895,7 +999,7 @@ def reset(token): ``` -## Example 11 from Flask-Security-Too +## Example 12 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -1015,7 +1119,7 @@ def get_post_action_redirect(config_key, declared=None): ``` -## Example 12 from Flask-User +## Example 13 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1164,7 +1268,7 @@ class EmailManager(object): ``` -## Example 13 from Flasky +## Example 14 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1364,7 +1468,7 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body) ``` -## Example 14 from Datadog Flask Example App +## Example 15 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 47d22f29a..c1458d1be 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -165,8 +165,8 @@ from flaskbb.plugins.utils import validate_plugin from flaskbb.user.models import Group, Guest, User from flaskbb.utils.forms import populate_settings_dict, populate_settings_form from flaskbb.utils.helpers import (get_online_users, register_view, - render_template, time_diff, time_utcnow, - FlashAndRedirect) + render_template, redirect_or_next, + time_diff, time_utcnow, FlashAndRedirect) from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin, IsAtleastModerator, @@ -174,15 +174,36 @@ from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin, ## ... source file abbreviated to get to jsonify examples ... + + flash(_('User updated.'), 'success') + return redirect(url_for('management.edit_user', user_id=user.id)) + + return render_template( + 'management/user_form.html', form=form, title=_('Edit User') + ) + + +class DeleteUser(MethodView): + decorators = [ + allows.requires( + IsAdmin, + on_fail=FlashAndRedirect( + message=_("You are not allowed to manage users"), + level="danger", endpoint="management.overview" ) ) ] def post(self, user_id=None): - if request.is_xhr: - ids = request.get_json()["ids"] - + if request.get_json() is not None: + ids = request.get_json().get("ids") + if not ids: +~~ return jsonify( + message="No ids provided.", + category="error", + status=404 + ) data = [] for user in User.query.filter(User.id.in_(ids)).all(): if current_user.id == user.id: @@ -200,7 +221,7 @@ from flaskbb.utils.requirements import (CanBanUser, CanEditUser, IsAdmin, ) ~~ return jsonify( - message="{} users deleted.".format(len(data)), + message=f"{len(data)} users deleted.", category="success", data=data, status=200 @@ -230,6 +251,36 @@ class AddUser(MethodView): + +class BanUser(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to manage users"), + level="danger", + endpoint="management.overview" + ) + ) + ] + + def post(self, user_id=None): + if not Permission(CanBanUser, identity=current_user): + flash( + _("You do not have the permissions to ban this user."), + "danger" + ) + return redirect(url_for("management.overview")) + + if request.get_json() is not None: + ids = request.get_json().get("ids") + if not ids: +~~ return jsonify( + message="No ids provided.", + category="error", + status=404 + ) + data = [] users = User.query.filter(User.id.in_(ids)).all() for user in users: @@ -239,20 +290,13 @@ class AddUser(MethodView): continue elif user.ban(): - data.append( - { - "id": - user.id, - "type": - "ban", - "reverse": - "unban", - "reverse_name": - _("Unban"), - "reverse_url": - url_for("management.unban_user", user_id=user.id) - } - ) + data.append({ + "id": user.id, + "type": "ban", + "reverse": "unban", + "reverse_name": _("Unban"), + "reverse_url": url_for("management.unban_user", user_id=user.id) + }) ~~ return jsonify( message="{} users banned.".format(len(data)), @@ -271,7 +315,8 @@ class AddUser(MethodView): flash(_("User is now banned."), "success") else: flash(_("Could not ban user."), "danger") - return redirect(url_for("management.banned_users")) + + return redirect_or_next(url_for("management.banned_users")) class UnbanUser(MethodView): @@ -279,11 +324,15 @@ class UnbanUser(MethodView): allows.requires( IsAtleastModerator, on_fail=FlashAndRedirect( + message=_("You are not allowed to manage users"), + level="danger", + endpoint="management.overview" + ) + ) + ] -## ... source file abbreviated to get to jsonify examples ... - - + def post(self, user_id=None): if not Permission(CanBanUser, identity=current_user): flash( @@ -292,8 +341,14 @@ class UnbanUser(MethodView): ) return redirect(url_for("management.overview")) - if request.is_xhr: - ids = request.get_json()["ids"] + if request.get_json() is not None: + ids = request.get_json().get("ids") + if not ids: +~~ return jsonify( + message="No ids provided.", + category="error", + status=404 + ) data = [] for user in User.query.filter(User.id.in_(ids)).all(): @@ -310,7 +365,7 @@ class UnbanUser(MethodView): ) ~~ return jsonify( - message="{} users unbanned.".format(len(data)), + message=f"{len(data)} users unbanned.", category="success", data=data, status=200 @@ -323,7 +378,7 @@ class UnbanUser(MethodView): else: flash(_("Could not unban user."), "danger") - return redirect(url_for("management.banned_users")) + return redirect_or_next(url_for("management.users")) class Groups(MethodView): @@ -339,6 +394,19 @@ class Groups(MethodView): ## ... source file abbreviated to get to jsonify examples ... + + flash(_('Group updated.'), 'success') + return redirect(url_for('management.groups', group_id=group.id)) + + return render_template( + 'management/group_form.html', form=form, title=_('Edit Group') + ) + + +class DeleteGroup(MethodView): + decorators = [ + allows.requires( + IsAdmin, on_fail=FlashAndRedirect( message=_("You are not allowed to modify groups."), level="danger", @@ -348,8 +416,15 @@ class Groups(MethodView): ] def post(self, group_id=None): - if request.is_xhr: - ids = request.get_json()["ids"] + if request.get_json() is not None: + ids = request.get_json().get("ids") + if not ids: +~~ return jsonify( + message="No ids provided.", + category="error", + status=404 + ) + if not (set(ids) & set(["1", "2", "3", "4", "5", "6"])): data = [] for group in Group.query.filter(Group.id.in_(ids)).all(): @@ -400,6 +475,21 @@ class Groups(MethodView): ## ... source file abbreviated to get to jsonify examples ... + reports = Report.query.\ + filter(Report.zapped == None).\ + order_by(Report.id.desc()).\ + paginate(page, flaskbb_config['USERS_PER_PAGE'], False) + + return render_template("management/reports.html", reports=reports) + + +class MarkReportRead(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( + message=_("You are not allowed to view reports."), + level="danger", endpoint="management.overview" ) ) @@ -407,8 +497,14 @@ class Groups(MethodView): def post(self, report_id=None): - if request.is_xhr: - ids = request.get_json()["ids"] + if request.get_json() is not None: + ids = request.get_json().get("ids") + if not ids: +~~ return jsonify( + message="No ids provided.", + category="error", + status=404 + ) data = [] for report in Report.query.filter(Report.id.in_(ids)).all(): @@ -439,13 +535,13 @@ class Groups(MethodView): _("Report %(id)s is already marked as read.", id=report.id), "success" ) - return redirect(url_for("management.reports")) + return redirect_or_next(url_for("management.reports")) report.zapped_by = current_user.id report.zapped = time_utcnow() report.save() flash(_("Report %(id)s marked as read.", id=report.id), "success") - return redirect(url_for("management.reports")) + return redirect_or_next(url_for("management.reports")) reports = Report.query.filter(Report.zapped == None).all() report_list = [] @@ -455,6 +551,20 @@ class Groups(MethodView): ## ... source file abbreviated to get to jsonify examples ... + report_list.append(report) + + db.session.add_all(report_list) + db.session.commit() + + flash(_("All reports were marked as read."), "success") + return redirect_or_next(url_for("management.reports")) + + +class DeleteReport(MethodView): + decorators = [ + allows.requires( + IsAtleastModerator, + on_fail=FlashAndRedirect( message=_("You are not allowed to view reports."), level="danger", endpoint="management.overview" @@ -463,11 +573,16 @@ class Groups(MethodView): ] def post(self, report_id=None): + if request.get_json() is not None: + ids = request.get_json().get("ids") + if not ids: +~~ return jsonify( + message="No ids provided.", + category="error", + status=404 + ) - if request.is_xhr: - ids = request.get_json()["ids"] data = [] - for report in Report.query.filter(Report.id.in_(ids)).all(): if report.delete(): data.append( @@ -490,7 +605,7 @@ class Groups(MethodView): report = Report.query.filter_by(id=report_id).first_or_404() report.delete() flash(_("Report deleted."), "success") - return redirect(url_for("management.reports")) + return redirect_or_next(url_for("management.reports")) class CeleryStatus(MethodView): @@ -792,8 +907,6 @@ The code is open sourced under the ```python # util.py -from __future__ import absolute_import, unicode_literals - from datetime import datetime ~~from flask import g, has_request_context, jsonify, render_template, request, session @@ -854,15 +967,15 @@ def jsonify_data(flash=True, **json_data): class ExpectedError(ImATeapot): def __init__(self, message, **data): - super(ExpectedError, self).__init__(message or 'Something went wrong') + super().__init__(message or 'Something went wrong') self.data = dict(data, message=message) def _format_request_data(data, hide_passwords=False): - if not hasattr(data, 'iterlists'): - data = ((k, [v]) for k, v in data.iteritems()) + if not hasattr(data, 'lists'): + data = ((k, [v]) for k, v in data.items()) else: - data = data.iterlists() + data = data.lists() rv = {} for key, values in data: if hide_passwords and 'password' in key: diff --git a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown index 57ac14477..87a1b97b1 100644 --- a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown +++ b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown @@ -43,7 +43,7 @@ import sys gevent_socketio_found = True try: - from socketio import socketio_manage + from socketio import socketio_manage # noqa: F401 except ImportError: gevent_socketio_found = False if gevent_socketio_found: @@ -56,14 +56,14 @@ import flask from flask import _request_ctx_stack, has_request_context, json as flask_json ~~from flask.sessions import SessionMixin import socketio -from socketio.exceptions import ConnectionRefusedError +from socketio.exceptions import ConnectionRefusedError # noqa: F401 from werkzeug.debug import DebuggedApplication from werkzeug.serving import run_with_reloader from .namespace import Namespace from .test_client import SocketIOTestClient -__version__ = '4.3.2dev' +__version__ = '5.0.2dev' class _SocketIOMiddleware(socketio.WSGIApp): diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index bf8f90896..5c5af4b0a 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -21,7 +21,7 @@ the `.templating` part. render_template_string is another callable from the `flask.templating` package with code examples. -These topics are also useful while reading the `render_template` examples: +You should read up on these subjects along with these `render_template` examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) @@ -314,6 +314,9 @@ def reset_password(data=None): @ratelimit(method="POST", limit=10, interval=5) def register(): errors = get_errors() + if current_user.authed(): + return redirect(url_for("challenges.listing")) + if request.method == "POST": name = request.form.get("name", "").strip() email_address = request.form.get("email", "").strip().lower() @@ -328,9 +331,6 @@ def register(): emails = ( Users.query.add_columns("email", "id") .filter_by(email=email_address) - .first() - ) - pass_short = len(password) == 0 ## ... source file abbreviated to get to render_template examples ... @@ -1122,7 +1122,111 @@ def show_phone(): ``` -## Example 10 from flask-restx +## Example 10 from Flask-Meld +[Flask-Meld](https://github.com/mikeabrahamsen/Flask-Meld) +([PyPI package information](https://pypi.org/project/Flask-Meld/)) +allows you to write your front end web code in your back end +Python code. It does this by adding a `{% meld_scripts %}` tag to +the Flask template engine and then inserting components written +in Python scripts created by a developer. + +[**Flask-Meld / flask_meld / component.py**](https://github.com/mikeabrahamsen/Flask-Meld/blob/main/flask_meld/./component.py) + +```python +# component.py +import uuid +import os +from importlib.util import module_from_spec, spec_from_file_location + +import orjson +~~from flask import render_template, current_app, url_for +from bs4 import BeautifulSoup +from bs4.formatter import HTMLFormatter + + +def convert_to_snake_case(s): + s.replace("-", "_") + return s + + +def convert_to_camel_case(s): + s = convert_to_snake_case(s) + return "".join(word.title() for word in s.split("_")) + + +def get_component_class(component_name): + module_name = convert_to_snake_case(component_name) + class_name = convert_to_camel_case(module_name) + module = get_component_module(module_name) + component_class = getattr(module, class_name) + + return component_class + + +def get_component_module(module_name): + + +## ... source file abbreviated to get to render_template examples ... + + + def __context__(self): + return { + "attributes": self._attributes(), + "methods": self._functions(), + } + + def updated(self, name): + pass + + def render(self, component_name): + return self._view(component_name, self._attributes()) + + def _view(self, component_name, data): + context = self.__context__() + context_variables = {} + context_variables.update(context["attributes"]) + context_variables.update(context["methods"]) + context_variables.update(data) + context_variables.update({"form": self._form}) + + frontend_context_variables = {} + frontend_context_variables.update(context["attributes"]) + frontend_context_variables = orjson.dumps(frontend_context_variables).decode( + "utf-8" + ) +~~ rendered_template = render_template( + f"meld/{component_name}.html", **context_variables + ) + + soup = BeautifulSoup(rendered_template, features="html.parser") + root_element = Component._get_root_element(soup) + root_element["meld:id"] = str(self.id) + root_element["meld:data"] = frontend_context_variables + self._set_values(root_element, context_variables) + + script = soup.new_tag("script", type="module") + init = {"id": str(self.id), "name": component_name, "data": data} + init = orjson.dumps(init).decode("utf-8") + + meld_url = url_for("static", filename="meld/meld.js") + meld_import = f'import {{Meld}} from ".{meld_url}";' + script.string = f"{meld_import} Meld.componentInit({init});" + root_element.append(script) + + rendered_template = Component._desoupify(soup) + + return rendered_template + + def _set_values(self, soup, context_variables): + for element in soup.find_all(attrs={'meld:model': True}): + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 11 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1177,7 +1281,7 @@ def ui_for(api): ``` -## Example 11 from flaskSaaS +## Example 12 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -1380,7 +1484,7 @@ def paySuccess(): ``` -## Example 12 from Flask-Security-Too +## Example 13 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -1487,7 +1591,7 @@ from .forms import ( ``` -## Example 13 from Flask-SocketIO +## Example 14 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -1563,7 +1667,7 @@ def get_session(): ``` -## Example 14 from Flask-User +## Example 15 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1655,7 +1759,7 @@ class EmailManager(object): ``` -## Example 15 from Flasky +## Example 16 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1695,7 +1799,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 16 from Datadog Flask Example App +## Example 17 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1797,7 +1901,7 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 17 from indico +## Example 18 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1811,14 +1915,12 @@ The code is open sourced under the ```python # mathjax.py -from __future__ import absolute_import - ~~from flask import current_app, render_template -class MathjaxMixin(object): +class MathjaxMixin: def _get_head_content(self): -~~ return render_template('mathjax_config.html') + unicode(current_app.manifest['mathjax.js']) +~~ return render_template('mathjax_config.html') + str(current_app.manifest['mathjax.js']) @@ -1827,7 +1929,7 @@ class MathjaxMixin(object): ``` -## Example 18 from keras-flask-deploy-webapp +## Example 19 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1919,7 +2021,7 @@ if __name__ == '__main__': ``` -## Example 19 from newspie +## Example 20 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -2074,7 +2176,7 @@ if __name__ == '__main__': ``` -## Example 20 from Science Flask +## Example 21 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -2362,7 +2464,7 @@ def static_from_root(): ``` -## Example 21 from tedivms-flask +## Example 22 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -2465,7 +2567,7 @@ def init_error_handlers(app): ``` -## Example 22 from trape +## Example 23 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index d9ad8fb08..6970f57bd 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -19,7 +19,7 @@ and View are a couple of other callables within the `flask.views` package that also have code examples. -These subjects go along with the `http_method_funcs` code examples: +You should read up on these subjects along with these `http_method_funcs` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 36f0eeace..00e7805b0 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -19,7 +19,7 @@ and http_method_funcs are a couple of other callables within the `flask.views` package that also have code examples. -You should read up on these subjects along with these `MethodView` examples: +These topics are also useful while reading the `MethodView` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) @@ -130,7 +130,7 @@ logger = logging.getLogger(__name__) identifier=form.login.data, secret=form.password.data ) login_user(user, remember=form.remember_me.data) - return redirect_or_next(url_for("forum.index")) + return redirect_or_next(url_for("forum.index"), False) except StopAuthentication as e: flash(e.reason, "danger") except Exception: diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 1f8e51936..25ca74e2d 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -20,7 +20,7 @@ and http_method_funcs are a couple of other callables within the `flask.views` package that also have code examples. -You should read up on these subjects along with these `View` examples: +These topics are also useful while reading the `View` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 12a37ddf7..2779eae30 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -13,10 +13,15 @@ view commit-level changes via the [source repository's commit log](https://github.com/mattmakai/fullstackpython.com/commits/) on GitHub. +## 2021 +* Updated + [Flask extension projects and example code](/flask-extensions-plug-ins-related-libraries.html). +* Happy New Year! + ## 2020 ### December -* New [Bash](/bourne-again-shell-bash.html) and [Vim](/vim.html) resources - and explanations. +* New [Bash](/bourne-again-shell-bash.html), [tmux](/tmux.html) and + [Vim](/vim.html) resources and explanations. ### November * New resources for [DevOps](/devops.html) and [containers](/containers.html). diff --git a/theme/templates/base.html b/theme/templates/base.html index f477ca1c7..6c14fbb83 100644 --- a/theme/templates/base.html +++ b/theme/templates/base.html @@ -17,7 +17,7 @@ {% block content %}{% endblock %}

    D!S;t;UWf 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 literal 0 HcmV?d00001 diff --git a/static/img/201009-twilio-flask-assemblyai/twilio-console.png b/static/img/201009-twilio-flask-assemblyai/twilio-console.png new file mode 100644 index 0000000000000000000000000000000000000000..7f0a3a66a96e1c1337297eb9e4b93a4fb4d47c2c GIT binary patch literal 248523 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%0DFLtp%2i~deCUYB>c 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 literal 0 HcmV?d00001 From 0d4314220d68cab0a1571457741291f3e5fc1a13 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 10 Oct 2020 12:05:58 -0400 Subject: [PATCH 228/302] update changelog --- content/pages/meta/00-change-log.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 571a4baeb..d42f29d99 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,8 @@ on GitHub. ## 2020 ### October +* Added new blog on + [Higher Accuracy Twilio Voice Transcriptions with Python and Flask](/blog/accurate-twilio-voice-call-recording-transcriptions-assemblyai.html). * New [NumPy](/scipy-numpy.html) resources. ### September From ce1a402543f380f35dfbb22a64251dd7002895f5 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 20 Oct 2020 07:50:10 -0400 Subject: [PATCH 229/302] add new pandas resource --- content/pages/03-data/16-pandas.markdown | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/content/pages/03-data/16-pandas.markdown b/content/pages/03-data/16-pandas.markdown index 1ac1e2b5b..833ce8720 100644 --- a/content/pages/03-data/16-pandas.markdown +++ b/content/pages/03-data/16-pandas.markdown @@ -129,3 +129,15 @@ is a data structures and analysis library. * [How to convert JSON to Excel with Python and pandas](https://www.marsja.se/how-to-convert-json-to-excel-python-pandas/) provides instructions for creating a spreadsheet out of JSON file. + +* [Loading large datasets in Pandas](https://towardsdatascience.com/loading-large-datasets-in-pandas-11bdddd36f7b) + explains how to get around the `MemoryError` issue that occurs + when using `read_csv` because the data set is larger than the + available memory on a machine. You can use chunking with + the `read_csv` function to divide the data set into smaller parts that + each can be loaded into memory. Alternatively, you can use a + [SQLite database](/sqlite.html) to create a [relational database](/databases.html) + with the data then use SQL queries or an + [object-relational mapper (ORM)](/object-relational-mappers-orms.html) + to load the data and perform analysis in pandas. + From 7760b89f6a6a3e99342a028526e1111c8785d753 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 29 Oct 2020 09:38:22 -0400 Subject: [PATCH 230/302] new pandas resource --- content/pages/03-data/16-pandas.markdown | 6 ++ .../flask/flask-app-immutabledict.markdown | 2 +- .../flask-ctx-after-this-request.markdown | 58 +++++++++---------- .../flask/flask-globals-current-app.markdown | 29 +++++----- .../examples/flask/flask-globals-g.markdown | 2 +- .../flask/flask-globals-request.markdown | 14 ++--- .../flask/flask-globals-session.markdown | 2 + .../flask/flask-helpers-flash.markdown | 2 +- .../flask-helpers-make-response.markdown | 2 +- .../flask/flask-helpers-url-for.markdown | 20 +++---- .../flask/flask-json-jsonencoder.markdown | 2 +- .../flask/flask-json-jsonify.markdown | 3 +- .../flask-sessions-badsignature.markdown | 6 +- .../flask-templating-render-template.markdown | 3 - .../flask/flask-views-methodview.markdown | 2 +- .../examples/flask/flask-views-view.markdown | 2 +- 16 files changed, 81 insertions(+), 74 deletions(-) diff --git a/content/pages/03-data/16-pandas.markdown b/content/pages/03-data/16-pandas.markdown index 833ce8720..54cbf13a6 100644 --- a/content/pages/03-data/16-pandas.markdown +++ b/content/pages/03-data/16-pandas.markdown @@ -141,3 +141,9 @@ is a data structures and analysis library. [object-relational mapper (ORM)](/object-relational-mappers-orms.html) to load the data and perform analysis in pandas. +* Real-world Excel spreadsheets are often a mess of unstructured data, so + this tutorial on + [Reading Poorly Structured Excel Files with Pandas](https://pbpython.com/pandas-excel-range.html) + gives example code for extracting only part of a file as well + as reading ranges and tables. + diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 7e42b432a..5fcb634f0 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -20,7 +20,7 @@ so that values cannot be modified after initially being set. and Headers are several other callables with code examples from the same `flask.app` package. -These topics are also useful while reading the `ImmutableDict` examples: +You should read up on these subjects along with these `ImmutableDict` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index c12fcfed7..446419809 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -53,7 +53,11 @@ from .decorators import anonymous_user_required, auth_required, unauth_csrf from .forms import Form, Required, get_form_field_label from .quart_compat import get_quart_status from .signals import us_profile_changed, us_security_token_sent -from .twofactor import is_tf_setup, tf_login +from .twofactor import ( + is_tf_setup, + tf_login, + tf_verify_validility_token, +) from .utils import ( _, SmsSenderFactory, @@ -63,10 +67,6 @@ from .utils import ( do_flash, find_user, get_identity_attributes, - get_post_login_redirect, - get_post_verify_redirect, - get_message, - get_url, ## ... source file abbreviated to get to after_this_request examples ... @@ -127,30 +127,30 @@ def us_signin_send_code(): ## ... source file abbreviated to get to after_this_request examples ... - else: - return redirect(get_post_login_redirect()) - - form_class = _security.us_signin_form - - if request.is_json: - if request.content_length: - form = form_class(MultiDict(request.get_json()), meta=suppress_form_csrf()) - else: - form = form_class(formdata=None, meta=suppress_form_csrf()) - else: - form = form_class(meta=suppress_form_csrf()) - form.submit.data = True - if form.validate_on_submit(): + remember_me = form.remember.data if "remember" in form else None - if ( - config_value("TWO_FACTOR") - and form.authn_via in config_value("US_MFA_REQUIRED") - and (config_value("TWO_FACTOR_REQUIRED") or is_tf_setup(form.user)) + if config_value("TWO_FACTOR") and form.authn_via in config_value( + "US_MFA_REQUIRED" ): - return tf_login( - form.user, remember=remember_me, primary_authn_via=form.authn_via + if request.is_json and request.content_length: + tf_validity_token = request.get_json().get("tf_validity_token", None) + else: + tf_validity_token = request.cookies.get("tf_validity", default=None) + + tf_validity_token_is_valid = tf_verify_validility_token( + tf_validity_token, form.user.fs_uniquifier ) + if config_value("TWO_FACTOR_REQUIRED") or is_tf_setup(form.user): + if config_value("TWO_FACTOR_ALWAYS_VALIDATE") or ( + not tf_validity_token_is_valid + ): + + return tf_login( + form.user, + remember=remember_me, + primary_authn_via=form.authn_via, + ) ~~ after_this_request(_commit) login_user(form.user, remember=remember_me, authn_via=[form.authn_via]) @@ -173,10 +173,10 @@ def us_signin_send_code(): return redirect(get_post_login_redirect()) form.passcode.data = None - return _security.render_template( - config_value("US_SIGNIN_TEMPLATE"), - us_signin_form=form, - available_methods=config_value("US_ENABLED_METHODS"), + + if form.requires_confirmation and _security.requires_confirmation_error_view: + do_flash(*get_message("CONFIRMATION_REQUIRED")) + return redirect(get_url(_security.requires_confirmation_error_view)) ## ... source file abbreviated to get to after_this_request examples ... diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 7628786b8..a8a87959a 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -1612,7 +1612,7 @@ logger = logging.getLogger(__name__) def generate_csrf(secret_key=None, token_key=None): - secret_key = _get_config( +~~ secret_key = _get_config( ~~ secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, message='A secret key is required to use CSRF.' ) @@ -1640,7 +1640,7 @@ def generate_csrf(secret_key=None, token_key=None): def validate_csrf(data, secret_key=None, time_limit=None, token_key=None): - secret_key = _get_config( +~~ secret_key = _get_config( ~~ secret_key, 'WTF_CSRF_SECRET_KEY', current_app.secret_key, message='A secret key is required to use CSRF.' ) @@ -1887,6 +1887,7 @@ from .forms import ( ## ... source file abbreviated to get to current_app examples ... + UnifiedSigninSetupForm, UnifiedSigninSetupValidateForm, UnifiedVerifyForm, us_send_security_token, @@ -1899,7 +1900,6 @@ from .utils import ( FsPermNeed, csrf_cookie_handler, default_want_json, - default_password_validator, get_config, get_identity_attribute, get_identity_attributes, @@ -1927,6 +1927,7 @@ _default_config = { "FLASH_MESSAGES": True, "I18N_DOMAIN": "flask_security", "I18N_DIRNAME": pkg_resources.resource_filename("flask_security", "translations"), + "EMAIL_VALIDATOR_ARGS": None, "PASSWORD_HASH": "bcrypt", "PASSWORD_SALT": None, "PASSWORD_SINGLE_HASH": { @@ -1936,20 +1937,11 @@ _default_config = { "django_pbkdf2_sha1", "django_bcrypt", "django_salted_md5", - "django_salted_sha1", ## ... source file abbreviated to get to current_app examples ... - "SEND_CONFIRMATION_TEMPLATE": "security/send_confirmation.html", - "SEND_LOGIN_TEMPLATE": "security/send_login.html", - "VERIFY_TEMPLATE": "security/verify.html", - "TWO_FACTOR_VERIFY_CODE_TEMPLATE": "security/two_factor_verify_code.html", - "TWO_FACTOR_SETUP_TEMPLATE": "security/two_factor_setup.html", - "CONFIRMABLE": False, - "REGISTERABLE": False, - "RECOVERABLE": False, "TRACKABLE": False, "PASSWORDLESS": False, "CHANGEABLE": False, @@ -1962,6 +1954,14 @@ _default_config = { "TWO_FACTOR_AUTHENTICATOR_VALIDITY": 120, "TWO_FACTOR_MAIL_VALIDITY": 300, "TWO_FACTOR_SMS_VALIDITY": 120, + "TWO_FACTOR_ALWAYS_VALIDATE": True, + "TWO_FACTOR_LOGIN_VALIDITY": "30 days", + "TWO_FACTOR_VALIDITY_SALT": "tf-validity-salt", + "TWO_FACTOR_VALIDITY_COOKIE": { + "httponly": True, + "secure": False, + "samesite": None, + }, "CONFIRM_EMAIL_WITHIN": "5 days", "RESET_PASSWORD_WITHIN": "5 days", "LOGIN_WITHOUT_CONFIRMATION": False, @@ -2073,6 +2073,7 @@ _default_config = { state._phone_util = state.phone_util_cls(app) state._mail_util = state.mail_util_cls(app) + state._password_util = state.password_util_cls(app) app.extensions["security"] = state @@ -2086,7 +2087,6 @@ _default_config = { for newc, oldc in [ ("SECURITY_SMS_SERVICE", "SECURITY_TWO_FACTOR_SMS_SERVICE"), - ("SECURITY_SMS_SERVICE_CONFIG", "SECURITY_TWO_FACTOR_SMS_SERVICE_CONFIG"), ## ... source file continues with no further current_app examples... @@ -2144,6 +2144,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ## ... source file abbreviated to get to current_app examples ... + @app.before_request def advance_session_timeout(): session.permanent = True # Timeout after app.permanent_session_lifetime period session.modified = True # Advance session timeout each time a user visits a page @@ -2168,7 +2169,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) def call_or_get(function_or_property): return function_or_property() if callable(function_or_property) else function_or_property - return dict( +~~ return dict( ~~ user_manager=current_app.user_manager, call_or_get=call_or_get, ) diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 46f7dfbc6..4c01cc517 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -919,7 +919,7 @@ from flask_login import current_user from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf -from wtforms import validators, ValidationError +from wtforms import ValidationError from itsdangerous import BadSignature, SignatureExpired from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 6c2281032..54818ed16 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -2204,6 +2204,7 @@ from wtforms import ( ValidationError, validators, ) +from wtforms.validators import StopValidation from .babel import is_lazy_string, make_lazy_string from .confirmable import requires_confirmation @@ -2213,7 +2214,6 @@ from .utils import ( config_value, do_flash, find_user, - get_identity_attribute, ## ... source file abbreviated to get to request examples ... @@ -2260,16 +2260,16 @@ class ForgotPasswordForm(Form, UserEmailFormMixin): submit = SubmitField(get_form_field_label("recover_password")) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.requires_confirmation = False + def validate(self): if not super().validate(): return False if not self.user.is_active: self.email.errors.append(get_message("DISABLED_ACCOUNT")[0]) return False - if requires_confirmation(self.user): - self.email.errors.append(get_message("CONFIRMATION_REQUIRED")[0]) - return False - return True ## ... source file abbreviated to get to request examples ... @@ -2313,6 +2313,7 @@ class LoginForm(Form, NextFormMixin): ) ) self.password.description = html + self.requires_confirmation = False def validate(self): if not super().validate(): @@ -2324,7 +2325,6 @@ class LoginForm(Form, NextFormMixin): self.email.errors.append(get_message("USER_DOES_NOT_EXIST")[0]) hash_password(self.password.data) return False - if not self.user.password: ## ... source file abbreviated to get to request examples ... @@ -2366,7 +2366,7 @@ class ResetPasswordForm(Form, NewPasswordFormMixin, PasswordConfirmFormMixin): if not super().validate(): return False - pbad = _security._password_validator( + pbad, self.password.data = _security._password_util.validate( self.password.data, False, user=current_user ) if pbad: diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index beade4434..4777019a3 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -927,8 +927,10 @@ from werkzeug.local import LocalProxy from .utils import ( SmsSenderFactory, base_render_json, + check_and_get_token_status, config_value, do_flash, + get_within_delta, login_user, json_error_response, send_mail, diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 5c2afbb90..042c7aad2 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -959,7 +959,7 @@ from flask_login import current_user from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf -from wtforms import validators, ValidationError +from wtforms import ValidationError from itsdangerous import BadSignature, SignatureExpired from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 2cb8bbace..aa1e8690d 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -323,6 +323,7 @@ The Flask-Security-Too project is provided as open source under the ```python # views.py +from functools import partial import time from flask import ( @@ -356,7 +357,6 @@ from .unified_signin import ( us_verify, us_verify_link, us_verify_send_code, -) ## ... source file abbreviated to get to make_response examples ... diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index ef8efeb87..c4ee0b2a0 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -936,7 +936,7 @@ from flask_login import current_user from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf -from wtforms import validators, ValidationError +from wtforms import ValidationError from itsdangerous import BadSignature, SignatureExpired from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict @@ -1238,9 +1238,9 @@ class Role(db.Model): def to_json(self): json_user = { ~~ 'url': url_for('api.get_user', id=self.id), - 'username': self.username, - 'member_since': self.member_since, - 'last_seen': self.last_seen, +~~ 'username': self.username, +~~ 'member_since': self.member_since, +~~ 'last_seen': self.last_seen, ~~ 'posts_url': url_for('api.get_user_posts', id=self.id), ~~ 'followed_posts_url': url_for('api.get_user_followed_posts', id=self.id), @@ -1298,9 +1298,9 @@ class Post(db.Model): def to_json(self): json_post = { ~~ 'url': url_for('api.get_post', id=self.id), - 'body': self.body, - 'body_html': self.body_html, - 'timestamp': self.timestamp, +~~ 'body': self.body, +~~ 'body_html': self.body_html, +~~ 'timestamp': self.timestamp, ~~ 'author_url': url_for('api.get_user', id=self.author_id), ~~ 'comments_url': url_for('api.get_post_comments', id=self.id), 'comment_count': self.comments.count() @@ -1340,9 +1340,9 @@ class Comment(db.Model): json_comment = { ~~ 'url': url_for('api.get_comment', id=self.id), ~~ 'post_url': url_for('api.get_post', id=self.post_id), - 'body': self.body, - 'body_html': self.body_html, - 'timestamp': self.timestamp, +~~ 'body': self.body, +~~ 'body_html': self.body_html, +~~ 'timestamp': self.timestamp, ~~ 'author_url': url_for('api.get_user', id=self.author_id), } return json_comment diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index d3052dce6..4c391f2be 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -58,7 +58,7 @@ from flask_login import current_user from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf -from wtforms import validators, ValidationError +from wtforms import ValidationError from itsdangerous import BadSignature, SignatureExpired from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 946f7adeb..47d22f29a 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -72,6 +72,7 @@ def protect(allow_browser_login=False): ## ... source file abbreviated to get to jsonify examples ... + return functools.update_wrapper(wraps, f) def has_access_api(f): @@ -96,7 +97,7 @@ def has_access_api(f): permission_str, self.__class__.__name__ ) ) - response = make_response( +~~ response = make_response( ~~ jsonify( {"message": str(FLAMSG_ERR_SEC_ACCESS_DENIED), "severity": "danger"} ), diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index a858ac1ec..3fc694c20 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -360,7 +360,7 @@ from flask_login import current_user from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf -from wtforms import validators, ValidationError +from wtforms import ValidationError ~~from itsdangerous import BadSignature, SignatureExpired from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict @@ -391,11 +391,11 @@ def _(translate): ## ... source file abbreviated to get to BadSignature examples ... - if config_value("EMAIL_PLAINTEXT"): - body = _security.render_template("%s/%s.txt" % ctx, **context) if config_value("EMAIL_HTML"): html = _security.render_template("%s/%s.html" % ctx, **context) + subject = localize_callback(subject) + sender = _security.email_sender if isinstance(sender, LocalProxy): sender = sender._get_current_object() diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index db924ba7b..bf8f90896 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1477,9 +1477,6 @@ from .forms import ( def reauthn_handler(self, cb): self._state._reauthn_handler = cb - def password_validator(self, cb): - self._state._password_validator = cb - def __getattr__(self, name): return getattr(self._state, name, None) diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 7dca926b6..36f0eeace 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -19,7 +19,7 @@ and http_method_funcs are a couple of other callables within the `flask.views` package that also have code examples. -These subjects go along with the `MethodView` code examples: +You should read up on these subjects along with these `MethodView` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 25ca74e2d..1f8e51936 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -20,7 +20,7 @@ and http_method_funcs are a couple of other callables within the `flask.views` package that also have code examples. -These topics are also useful while reading the `View` examples: +You should read up on these subjects along with these `View` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) From 34b0c0a5f8d5ea75b2aafd194ee0b5a24763998b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 30 Oct 2020 07:17:37 -0400 Subject: [PATCH 231/302] new rq resource --- content/pages/04-web-development/29-rq-redis-queue.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/pages/04-web-development/29-rq-redis-queue.markdown b/content/pages/04-web-development/29-rq-redis-queue.markdown index 55979bf3c..d984e121a 100644 --- a/content/pages/04-web-development/29-rq-redis-queue.markdown +++ b/content/pages/04-web-development/29-rq-redis-queue.markdown @@ -30,6 +30,10 @@ track of tasks in the queue that need to be executed. * The [RQ intro post](http://nvie.com/posts/introducing-rq/) contains information on design decisions and how to use RQ in your projects. +* [Build a Ghostwriting App for Scary Halloween Stories with OpenAI's GPT-3 Engine and Task Queues in Python](https://www.twilio.com/blog/ghost-writer-spooky-task-queues-python-openai-gpt3) + is a fun tutorial that uses RQ with OpenAI's [GPT-3](/gpt-3.html) API + randomly write original stories inspired by creepy Halloween tales. + * [International Space Station notifications with Python and Redis Queue (RQ)](https://www.twilio.com/blog/2015/11/international-space-station-notifications-with-python-redis-queue-and-twilio-copilot.html) shows how to combine the RQ task queue library with Flask to send text message notifications every time a condition is met - in this blog From cebbc6e7d28e20a43f14163f8de3186f18f74fc4 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 31 Oct 2020 16:00:18 -0400 Subject: [PATCH 232/302] new django orm and gpt-3 resources --- content/pages/03-data/08-django-orm.markdown | 3 +++ content/pages/10-working/00-gpt-3.markdown | 25 +++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/content/pages/03-data/08-django-orm.markdown b/content/pages/03-data/08-django-orm.markdown index e8c08aaee..59bb49f8b 100644 --- a/content/pages/03-data/08-django-orm.markdown +++ b/content/pages/03-data/08-django-orm.markdown @@ -192,3 +192,6 @@ following resources should get you past the initial hurdles. fields with a checking constraint and a web form that ensures all of the fields sum up to a precise amount, such as 100%. +* [Learn Django ORM - Query and Filters](https://www.youtube.com/playlist?list=PLOLrQ9Pn6cazjoDEnwzcdWWf4SNS0QZml) + is a video tutorials series that gives an overview of the ORM's + querying and filtering capabilities. diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown index 5e2e78be3..2b7eaced0 100644 --- a/content/pages/10-working/00-gpt-3.markdown +++ b/content/pages/10-working/00-gpt-3.markdown @@ -125,10 +125,6 @@ is trained. trained and what happens in various scenarios such as text output and code generation. -* [Building a Chatbot with OpenAI's GPT-3 engine, Twilio SMS and Python](https://www.twilio.com/blog/openai-gpt-3-chatbot-python-twilio-sms) - is a step-by-step tutorial for using GPT-3 as a smart backend - for an SMS-based chatbot powered by the [Twilio API](/twilio.html). - * [GPT 3 Demo and Explanation](https://www.youtube.com/watch?v=8psgEDhT1MM) is a video that gives a brief overview of GPT-3 and shows a bunch of live demos for what has so far been created with this technology. @@ -137,11 +133,24 @@ is trained. points out that many of the good examples on social media have been cherry picked to impress readers. -* [gpt-3-experiments](https://github.com/minimaxir/gpt-3-experiments) - contains Python code open sourced under the MIT license that - shows how to interact with the API. - * [Why GPT-3 matters](https://leogao.dev/2020/05/29/GPT-3-A-Brief-Summary/) compares and contrasts this model with similar models that have been developed and tries to give an overview of where each one stands with its strengths and weaknesses. + + +## GPT-3 tutorials +* [Building a Chatbot with OpenAI's GPT-3 engine, Twilio SMS and Python](https://www.twilio.com/blog/openai-gpt-3-chatbot-python-twilio-sms) + is a step-by-step tutorial for using GPT-3 as a smart backend + for an SMS-based chatbot powered by the [Twilio API](/twilio.html). + +* [gpt-3-experiments](https://github.com/minimaxir/gpt-3-experiments) + contains Python code open sourced under the MIT license that + shows how to interact with the API. + +* [Twilio](/twilio.html) put out a series of fun GPT-3 tutorials that show + the range of creative outputs the model can generate: + + * [Control a Spooky Ghost Writer for Halloween with OpenAI's GPT-3 Engine, Python, and Twilio WhatsApp API](https://www.twilio.com/blog/ghost-writer-spooky-openai-gpt3-python-whatsapp) + * [Generating Lyrics in the Style of your Favorite Artist with Python, OpenAI's GPT-3 and Twilio SMS](https://www.twilio.com/blog/generating-lyrics-in-the-style-of-your-favorite-artist-with-python-openai-s-gpt-3-and-twilio-sms) + * [Automated Yugioh Deckbuilding in Python with OpenAI's GPT-3 and Twilio SMS](https://www.twilio.com/blog/building-computer-generated-yugioh-decks-in-python-with-openai-s-gpt-3-and-twilio-sms) From fbbafc22d2cbbd12c39ad9ff4abacfc447079907 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 2 Nov 2020 15:16:10 -0500 Subject: [PATCH 233/302] add new django and react resource --- .../04-web-development/24-react.markdown | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/content/pages/04-web-development/24-react.markdown b/content/pages/04-web-development/24-react.markdown index 18ca6555b..518d5e929 100644 --- a/content/pages/04-web-development/24-react.markdown +++ b/content/pages/04-web-development/24-react.markdown @@ -35,6 +35,27 @@ tack on React to build your client-side user interfaces. quickly fall out of date while this one tends to stick to the basics that are relevant to beginners. +* [9 things every React.js beginner should know](https://camjackson.net/post/9-things-every-reactjs-beginner-should-know) + is not a tutorial but instead the author gives some strong opinions for + what beginners should know as they start learning React. + +* [React Bootstrap](https://react-bootstrap.github.io/) + ([source code](https://github.com/react-bootstrap/react-bootstrap) replaces + the existing Bootstrap JavaScript with React components that do not + rely on jQuery. + + +## Python+React tutorials +* [How to set up Django with React](https://mattsegal.dev/django-react.html) + presents one developer's opinionated way of combining a + [Django](/django.html)-powered back end with React on the front end, + including how to serve up static assets. + +* [Django REST with React (Django 2.0 and a sprinkle of testing)](https://www.valentinog.com/blog/tutorial-api-django-rest-react/) + combines a [Django](/django.html) plus + [Django REST Framework (DRF)](/django-rest-framework-drf.html) backend + with React on the front end and shows how to stich it all together. + * This Modern Django 4-part tutorial series is well-done, has [freely available source code](https://github.com/v1k45/ponynote) and includes: @@ -44,10 +65,6 @@ tack on React to build your client-side user interfaces. 3. [Creating an API and integrating with React](http://v1k45.com/blog/modern-django-part-3-creating-an-api-and-integrating-with-react/) 4. [Adding authentication to React SPA using DRF](http://v1k45.com/blog/modern-django-part-4-adding-authentication-to-react-spa-using-drf/) -* [Django REST with React (Django 2.0 and a sprinkle of testing)](https://www.valentinog.com/blog/tutorial-api-django-rest-react/) - combines a [Django](/django.html) plus - [Django REST Framework (DRF)](/django-rest-framework-drf.html) backend - with React on the front end and shows how to stich it all together. * [Build a Simple CRUD App with Python, Flask, and React](https://developer.okta.com/blog/2018/12/20/crud-app-with-python-flask-react) shows how to combine a [Flask](/flask.html) backend with React. @@ -56,15 +73,6 @@ tack on React to build your client-side user interfaces. is a Git repository with a code tutorial and instructions for how to follow along, as well as exercises to ensure you are tested as you go. -* [9 things every React.js beginner should know](https://camjackson.net/post/9-things-every-reactjs-beginner-should-know) - is not a tutorial but instead the author gives some strong opinions for - what beginners should know as they start learning React. - -* [React Bootstrap](https://react-bootstrap.github.io/) - ([source code](https://github.com/react-bootstrap/react-bootstrap) replaces - the existing Bootstrap JavaScript with React components that do not - rely on jQuery. - ### Other React resources * [React interview questions](https://tylermcginnis.com/react-interview-questions/) From 00de5000aeee3f357fea212f4802538acf53f880 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 8 Nov 2020 12:06:55 -0500 Subject: [PATCH 234/302] add new devops and containers resources --- content/pages/05-deployment/35-containers.markdown | 13 +++++++++++++ content/pages/06-devops/00-devops.markdown | 6 ++++++ content/pages/meta/00-change-log.markdown | 3 +++ ...django-accurate-twilio-voice-transcriptions.html | 5 +++++ 4 files changed, 27 insertions(+) create mode 100644 theme/templates/blog/django-accurate-twilio-voice-transcriptions.html diff --git a/content/pages/05-deployment/35-containers.markdown b/content/pages/05-deployment/35-containers.markdown index f88e53a02..b265af9d3 100644 --- a/content/pages/05-deployment/35-containers.markdown +++ b/content/pages/05-deployment/35-containers.markdown @@ -70,6 +70,12 @@ useful. explains how Linux features such as `cgroups`, `chroot` and namespaces are used by container implementations. +* [Container networking is simple](https://iximiuz.com/en/posts/container-networking-is-simple/) + shows that container networking is nothing more than a simple combination + of the well-known Linux facilities such as network namespaces, virtual + Ethernet devices (veth), virtual network switches (bridge) and + IP routing and network address translation (NAT). + * [Running containers without Docker](https://jvns.ca/blog/2016/10/26/running-container-without-docker/) reviews a migration path for an organization that already has a bunch of infrastructure but sees advantages in using containers. However, the @@ -115,6 +121,13 @@ Container security is a hot topic because there are so many ways of screwing it up, just like any infrastructure that runs your applications. These resources explain security considerations specific to containers. +* [A Practical Introduction to Container Security](https://cloudberry.engineering/article/practical-introduction-container-security/) + examines security at build time for projects and how to + minimize the risk of supply chain attack. It then goes into + infrastructure and runtime security where you need to understand + different attack vectors and minimize malicious attempts against + your containers during these phases.. + * [Building Container Images Securely on Kubernetes](https://blog.jessfraz.com/post/building-container-images-securely-on-kubernetes/) discusses some of the issues with building containers and why the author created [img](https://github.com/genuinetools/img) as a tool diff --git a/content/pages/06-devops/00-devops.markdown b/content/pages/06-devops/00-devops.markdown index 47ec79be1..c1a95152a 100644 --- a/content/pages/06-devops/00-devops.markdown +++ b/content/pages/06-devops/00-devops.markdown @@ -58,6 +58,12 @@ teams, culture, processes and tools into software development organizations. their services running and putting them out for other developers to consume. Highly recommended. +* [Introduction to DevOps and Software Delivery Performance](https://www.stridenyc.com/blog/introduction-to-devops-and-software-delivery-performance) + explains the four key delivery metrics of Delivery Lead Time, + Deployment Frequency, Time to Restore Service, and Change Fail Rate, + and then gives a high-level overview of technical, process and + cultural capabilities that impact these metrics. + * [Operations for software developers for beginners](https://jvns.ca/blog/2016/10/15/operations-for-software-developers-for-beginners/) gives advice to developers who have never done operations work and been on call for outages before in their career. The advantage of DevOps diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index d42f29d99..726ad5b09 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,9 @@ view commit-level changes via the on GitHub. ## 2020 +### November +* New resources for [DevOps](/devops.html) and [containers](/containers.html). + ### October * Added new blog on [Higher Accuracy Twilio Voice Transcriptions with Python and Flask](/blog/accurate-twilio-voice-call-recording-transcriptions-assemblyai.html). diff --git a/theme/templates/blog/django-accurate-twilio-voice-transcriptions.html b/theme/templates/blog/django-accurate-twilio-voice-transcriptions.html new file mode 100644 index 000000000..8b9e6fcc6 --- /dev/null +++ b/theme/templates/blog/django-accurate-twilio-voice-transcriptions.html @@ -0,0 +1,5 @@ + +Learning Programming +Web development +Django +APIs From 409d0dc76d810e16aea03fc2ce82d82215ecf8e5 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 22 Nov 2020 11:11:43 -0500 Subject: [PATCH 235/302] new container resource --- content/pages/05-deployment/35-containers.markdown | 5 +++++ .../django/django-extensions-plug-ins.markdown | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/content/pages/05-deployment/35-containers.markdown b/content/pages/05-deployment/35-containers.markdown index b265af9d3..5ec0a850e 100644 --- a/content/pages/05-deployment/35-containers.markdown +++ b/content/pages/05-deployment/35-containers.markdown @@ -83,6 +83,11 @@ useful. eventually plan to use Docker, Kubernetes or other container tools and orchestration layer. +* [Datadog's 2020 Container Report](https://www.datadoghq.com/container-report/) + contains some interesting statistics about container usage across + their customer base, such as [Kubernetes](/kubernetes.html) adoption + and container deployments by cloud platform. + * [mocker](https://github.com/tonybaloney/mocker) is a Docker imitation open source project written in all Python which is intended for learning purposes. diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 626e23cc5..304798584 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -75,6 +75,18 @@ Code from django-angular is shown on: * [django.utils.html format_html](/django-utils-html-format-html-examples.html) * [django.urls.exceptions NoReverseMatch](/django-urls-exceptions-noreversematch-examples.html) +### django-appmail +[Django-Appmail](https://github.com/yunojuno/django-appmail) +([PyPI package information](https://pypi.org/project/django-appmail/)) +is a [Django](/django.html) app for handling transactional email templates. +While the project began development as a way to work with the Mandrill +transactional [API](/application-programming-interfaces.html), it is +not exclusive to that API. The project simply provides a way to store +and render email content. The library does not send or receive emails. + +Django-Appmail is open sourced under the +[MIT license](https://github.com/yunojuno/django-appmail/blob/master/LICENSE). + ### django-axes [django-axes](https://github.com/jazzband/django-axes/) From 9bf220c61f10894025266f647422ea334bed907f Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 27 Nov 2020 13:19:06 -0500 Subject: [PATCH 236/302] working on new page for event streams --- .../04-web-development/15-web-design.markdown | 5 +++ .../10-working/01-event-streams.markdown | 39 +++++++++++++++++++ theme/templates/choices/event-streams.html | 18 +++++++++ 3 files changed, 62 insertions(+) create mode 100644 content/pages/10-working/01-event-streams.markdown create mode 100644 theme/templates/choices/event-streams.html diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index b485938b3..58e9cc31f 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -83,6 +83,11 @@ this short list as my absolute favorites that help developers become design principles for building user experiences. Highly recommended even if just to see how the information is presented. +* [Building your color palette](https://refactoringui.com/previews/building-your-color-palette/) + explains why color pickers are not useful for most user interfaces + and how you should actually go about selecting your color palette + for a real world application. + * [How I Work with Color](https://medium.com/@JustinMezzell/how-i-work-with-color-8439c98ae5ed) is a fantastic article from a professional designer on how he thinks about color and uses it for certain effects in his designs. diff --git a/content/pages/10-working/01-event-streams.markdown b/content/pages/10-working/01-event-streams.markdown new file mode 100644 index 000000000..3b25b8813 --- /dev/null +++ b/content/pages/10-working/01-event-streams.markdown @@ -0,0 +1,39 @@ +title: Event Streams +category: page +slug: event-streams +sortorder: 1002 +toc: False +sidebartitle: Event Streams +meta: An event stream is a log of one or more events. + + +Event streams are a log of one or more "things that happen", which are +usually referred to as events. Event streams are +conceptually focused around things that happen rather than objects, +which are the typical storage unit for +[relational databases](/databases.html). + +Apache Kafka and Gazette are a popular open source implementations of event +streams. Amazon Web Services' Kinesis and +[Azure Event-Hubs](https://azure.microsoft.com/en-us/services/event-hubs/) +are proprietary hosted implementations. + + +## How are event streams stored? +Some applications, such as aggregating millions of sensors, or thousands +of constantly streaming cameras, throw off large amounts of data. It's +difficult to process those large volumes of data in traditional data stores, +so event streams are built off of a simpler data structure: logs. + +Logs are ordered sequences of events and they typically have less constraints +than a database. Logs can handle the high throughput writes needed to keep +up with the constant flood of data from the source of an event stream. + + +## Event stream resources +* [What is Apache Kafka?](https://www.youtube.com/watch?v=FKgi3n-FyNU) sounds + like it just focuses on Kafka but it actually covers the fundamental + concepts behind event streams and how they fit into + [microservices](/microservices.html) architectures. + + diff --git a/theme/templates/choices/event-streams.html b/theme/templates/choices/event-streams.html new file mode 100644 index 000000000..f7c07c6e9 --- /dev/null +++ b/theme/templates/choices/event-streams.html @@ -0,0 +1,18 @@ +

    {% block lower_banner %}{% endblock %} - + {% block bottom_banner %}{% endblock %} {% block js %}{% endblock %} From a76db92343941a01c1431c86bb33ddb1341301f6 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 1 Jan 2021 10:59:51 -0500 Subject: [PATCH 246/302] fixing changelog page --- content/pages/meta/00-change-log.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 2779eae30..e5ff2fc0e 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,10 +14,12 @@ view commit-level changes via the on GitHub. ## 2021 +### January * Updated [Flask extension projects and example code](/flask-extensions-plug-ins-related-libraries.html). * Happy New Year! + ## 2020 ### December * New [Bash](/bourne-again-shell-bash.html), [tmux](/tmux.html) and From 02bdebaee80e8ba0661bd4b298ccda61abffb072 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 5 Jan 2021 07:25:33 -0500 Subject: [PATCH 247/302] add new blog post --- .../django-extensions-plug-ins.markdown | 12 + content/pages/meta/00-change-log.markdown | 2 + ...urate-twilio-voice-transcriptions.markdown | 718 ++++++++++++++++++ .../assemblyai-dashboard.png | Bin 0 -> 197635 bytes .../call-recording-url.png | Bin 0 -> 66333 bytes .../dial-call-sid.png | Bin 0 -> 17921 bytes static/img/210105-django-assemblyai/ngrok.jpg | Bin 0 -> 69204 bytes .../twilio-console.png | Bin 0 -> 248523 bytes 8 files changed, 732 insertions(+) create mode 100644 content/posts/210105-django-accurate-twilio-voice-transcriptions.markdown create mode 100644 static/img/210105-django-assemblyai/assemblyai-dashboard.png create mode 100644 static/img/210105-django-assemblyai/call-recording-url.png create mode 100644 static/img/210105-django-assemblyai/dial-call-sid.png create mode 100644 static/img/210105-django-assemblyai/ngrok.jpg create mode 100644 static/img/210105-django-assemblyai/twilio-console.png diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 304798584..39f74cc70 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -482,6 +482,18 @@ The project is open sourced under the [Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). +### Django Request Token +[Django Request Token](https://github.com/yunojuno/django-request-token) +([PyPI package information](https://pypi.org/project/django-request-token/0.13/)) +encapsulates the logic for issuing expiring and one-time tokens +with a [Django](/django.html) web application to use with protected URLs. +Note that [PostgreSQL](/postgresql.html) as your backend +[database](/databases.html) is a dependency for using this project. + +The Django Request Token project is open sourced under the +[MIT license](https://github.com/yunojuno/django-request-token/blob/master/LICENSE). + + ### django-rq [django-rq](https://github.com/rq/django-rq) ([PyPI package information](https://pypi.org/project/django-rq/)) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index e5ff2fc0e..a2e9d1a01 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,8 @@ on GitHub. ## 2021 ### January +* Published a new blog post on + [Using Django & AssemblyAI for More Accurate Twilio Call Transcriptions](/blog/django-accurate-twilio-voice-transcriptions.html). * Updated [Flask extension projects and example code](/flask-extensions-plug-ins-related-libraries.html). * Happy New Year! diff --git a/content/posts/210105-django-accurate-twilio-voice-transcriptions.markdown b/content/posts/210105-django-accurate-twilio-voice-transcriptions.markdown new file mode 100644 index 000000000..94df3bed8 --- /dev/null +++ b/content/posts/210105-django-accurate-twilio-voice-transcriptions.markdown @@ -0,0 +1,718 @@ +title: Using Django & AssemblyAI for More Accurate Twilio Call Transcriptions +slug: django-accurate-twilio-voice-transcriptions +meta: Use Python, Django and AssemblyAI's transcription API to improve recording accuracy for Twilio Programmable Voice phone calls. +category: post +date: 2021-01-05 +modified: 2021-01-05 +newsletter: False +headerimage: /img/headers/django-assemblyai.jpg +headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. + + +[Recording phone calls](https://www.twilio.com/docs/voice/tutorials/how-to-record-phone-calls-python) +with one or more participants is easy with +[Twilio's Programmable Voice API](https://www.twilio.com/docs/voice/quickstart/python), +but the speech-to-text accuracy can be poor, especially for transcription +of words from niche domains such as healthcare and engineering. +[AssemblyAI's API for transcription](https://www.assemblyai.com/) +provides much higher accuracy by default and through optional keyword lists. +accuracy for [recordings](https://www.twilio.com/docs/voice/api/recording). + +In this tutorial, we'll record an outbound Twilio call recording to AssemblyAI's +API to get significantly more accurate speech-to-text output. + + +## Tutorial Prerequisites +Ensure you have Python 3 installed, because Python 2 reached its +end-of-life at the beginning of 2020 and is no longer supported. +Preferrably, you should have +[Python 3.7 or greater installed](https://www.python.org/downloads/) +in your [development environment](/development-environments.html). +This tutorial will also use: + +We will use the following dependencies to complete this +tutorial: + +* [Django](/django.html) version 3.1.x, where *x* is the latest security + release +* A [Twilio account](https://www.twilio.com/referral/w9pugq) and the + [Python Twilio helper library](https://pypi.org/project/twilio/) + version 6.45.2 or newer +* [requests](https://requests.readthedocs.io/) + [version 2.24.0](https://pypi.org/project/requests/) +* An [AssemblyAI](https://www.assemblyai.com/) account, which you can sign up for a [free key API access key here](https://app.assemblyai.com/login/) + +All code in this blog post is available open source under the MIT license +on GitHub under the +[django-accurate-twilio-voice-transcriptions directory of the blog-code-examples repository](https://github.com/fullstackpython/blog-code-examples). +Use the source code as you desire for your own projects. + + +## Configuring our development environment +Change into the directory where you keep your Python +[virtual environments](/virtual-environments-virtualenvs-venvs.html). +Create a new virtualenv for this project using the following +command. + +Start the Django project by creating a new +[virtual environment](/virtual-environments-virtualenvs-venvs.html) +using the following command. I recommend using a separate directory +such as `~/venvs/` (the tilde is a shortcut for your user's `home` +directory) so that you always know where all your virtualenvs are +located. + +```bash +python3 -m venv ~/venvs/djtranscribe +``` + +Activate the virtualenv with the `activate` shell script: + +```bash +source ~/venvs/djtranscribe/bin/activate +``` + +After the above command is executed, the command prompt will +change so that the name of the virtualenv is prepended to the +original command prompt format, so if your prompt is just +`$`, it will now look like the following: + +```bash +(djtranscribe) $ +``` + +Remember, you have to activate your virtualenv in every new terminal +window where you want to use dependencies in the virtualenv. + +We can now install the [Django](https://pypi.org/project/Django/) +package into the activated but otherwise empty virtualenv. + +``` +pip install django==3.1.3 requests==2.24.0 twilio==6.45.2 +``` + +Look for output similar to the following to confirm the appropriate +packages were installed correctly from PyPI. + +``` +(djtranscribe) $ pip install django==3.1.3 requests==2.24.0 twilio=6.45.2 +pip install django requests twilio +Collecting django + Downloading Django-3.1.3-py3-none-any.whl (7.8 MB) + |████████████████████████████████| 7.8 MB 2.6 MB/s +Collecting requests + Using cached requests-2.24.0-py2.py3-none-any.whl (61 kB) +Collecting twilio + Downloading twilio-6.47.0.tar.gz (460 kB) + |████████████████████████████████| 460 kB 19.6 MB/s +Collecting sqlparse>=0.2.2 + Downloading sqlparse-0.4.1-py3-none-any.whl (42 kB) + |████████████████████████████████| 42 kB 4.8 MB/s +Collecting pytz + Downloading pytz-2020.4-py2.py3-none-any.whl (509 kB) + |████████████████████████████████| 509 kB 31.0 MB/s +Collecting asgiref<4,>=3.2.10 + Downloading asgiref-3.3.0-py3-none-any.whl (19 kB) +Collecting chardet<4,>=3.0.2 + Using cached chardet-3.0.4-py2.py3-none-any.whl (133 kB) +Collecting idna<3,>=2.5 + Using cached idna-2.10-py2.py3-none-any.whl (58 kB) +Collecting certifi>=2017.4.17 + Using cached certifi-2020.6.20-py2.py3-none-any.whl (156 kB) +Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 + Downloading urllib3-1.25.11-py2.py3-none-any.whl (127 kB) + |████████████████████████████████| 127 kB 24.5 MB/s +Collecting six + Using cached six-1.15.0-py2.py3-none-any.whl (10 kB) +Collecting PyJWT>=1.4.2 + Using cached PyJWT-1.7.1-py2.py3-none-any.whl (18 kB) +Using legacy 'setup.py install' for twilio, since package 'wheel' is not installed. +Installing collected packages: sqlparse, pytz, asgiref, django, chardet, idna, certifi, urllib3, requests, six, PyJWT, twilio + Running setup.py install for twilio ... done +Successfully installed PyJWT-1.7.1 asgiref-3.3.0 certifi-2020.6.20 chardet-3.0.4 django-3.1.3 idna-2.10 pytz-2020.4 requests-2.24.0 six-1.15.0 sqlparse-0.4.1 twilio-6.47.0 urllib3-1.25.11 + +``` + +We can get started coding the application now that we have all of our +required dependencies installed. + + +## Starting our Django project +Let's begin coding our application. + +We can use the [Django](/django.html) `django-admin` tool to create +the boilerplate code structure to get our project started. +Change into the directory where you develop your applications. For +example, I typically use `/Users/matt/devel/py/` for all of my +Python projects. Then run the following command to start a Django +project named `djtranscribe`: + +``` +django-admin.py startproject djtranscribe +``` + +Note that in this tutorial we are using the same name for both the +virtualenv and the Django project directory, but they can be +different names if you prefer that for organizing your own projects. + +The `django-admin` command creates a directory named `djtranscribe` +along with several subdirectories that you should be familiar with +if you have previously worked with Django. + +Change directories into the new project. + +``` +cd djtranscribe +``` + +Create a new Django app within `djtranscribe` named `caller`. + +``` +python manage.py startapp caller +``` + +Django will generate a new folder named `caller` in the project. +We should update the URLs so the app is accessible before we write +our `views.py` code. + +Open `djtranscribe/djtranscribe/urls.py`. Add the highlighted +lines so that URL resolver will check the `caller` app +for additional routes to match with URLs that are requested of +this Django application. + +```python +# djtranscribe/djtranscribe/urls.py +~~from django.conf.urls import include +from django.contrib import admin +from django.urls import path + + +urlpatterns = [ +~~ path('', include('caller.urls')), + path('admin/', admin.site.urls), +] +``` + +Save `djtranscribe/djtranscribe/urls.py` and open +`djtranscribe/djtranscribe/settings.py`. +Add the `caller` app to `settings.py` by inserting +the highlighted line: + +```python +# djtranscribe/djtranscribe/settings.py +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +~~ 'caller', +] +``` + +Make sure you change the default `DEBUG` and `SECRET_KEY` +values in `settings.py` before you deploy any code to production. Secure +your app properly with the information from the Django +[production deployment checklist](https://docs.djangoproject.com/en/stable/howto/deployment/checklist/) +so that you do not add your project to the list of hacked applications +on the web. + +Save and close `settings.py`. + +Next change into the `djtranscribe/caller` directory. Create +a new file named `urls.py` to contain routes for the `caller` app. + +Add all of these lines to the empty `djtranscribe/caller/urls.py` +file. + +```python +# djtranscribe/caller/urls.py +from django.conf.urls import url +from . import views + +urlpatterns = [ + url(r'', views.index, name="index"), +] +``` + +Save `djtranscribe/caller/urls.py`. Open +`djtranscribe/caller/views.py` to add the +following two highlighted lines. + +``` +# djtranscribe/caller/views.py +from django.http import HttpResponse + + +~~def index(request): +~~ return HttpResponse('Hello, world!', 200) +``` + +We can test out that this simple boilerplate response is +correct before we start adding the meat of the functionality to +the project. Change into the base directory of your Django project +where the `manage.py` file is located. Execute the development +server with the following command: + +```bash +python manage.py runserver +``` + +The Django development server should start up with no issues other than +an unapplied migrations warning. + +``` +Watching for file changes with StatReloader +Performing system checks... + +System check identified no issues (0 silenced). + +November 15, 2020 - 14:07:03 +Django version 3.1.3, using settings 'djtranscribe.settings' +Starting development server at http://127.0.0.1:8000/ +Quit the server with CONTROL-C. +``` + +Open a web browser and go to `localhost:8000`. + +Web browser rendering simple text 'Hello, world!'. + +You should see 'Hello, world!' rendered in the browser. +That means everything is working properly so far and we can +now add the dialing, recording and transcribing capabilities to +our Django project. + + +## Adding Twilio to the Django project +Time to add Twilio's Voice API into the mix so we can dial +a phone call from our Django project and make a recording +out of it. + + +Start by opening up `djtranscribe/djtranscribe/settings.py` +and modifying it with the following highlighted `import os` +line: + +```python +# djtranscribe/djtranscribe/settings.py +~~import os +from pathlib import Path + + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent +``` + +Then at the bottom of the `settings.py` file, add the +following highlighted lines, which will be settings that are pulled from +environment variables we will configure later. + +```python +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.1/howto/static-files/ + +STATIC_URL = '/static/' + + +~~BASE_URL = os.getenv("BASE_URL") +~~TWIML_INSTRUCTIONS_URL = "{}/record/".format(BASE_URL) +~~TWILIO_PHONE_NUMBER = os.getenv("TWILIO_PHONE_NUMBER") +``` + +Save `settings.py` and change into the `caller` Django app directory. + +Update `djtranscribe/caller/urls.py` with the the following new +code: + +```python +# djtranscribe/caller/urls.py +from django.conf.urls import url +from . import views + +urlpatterns = [ +~~ url(r'dial/(\d+)/$', views.dial, name="dial"), +~~ url(r'record/$', views.record_twiml, name="record-twiml"), +~~ url(r'get-recording-url/([A-Za-z0-9]+)/$', views.get_recording_url, +~~ name='recording-url'), +] +``` + +Next, open `djtranscribe/views.py` and update it with the following +code, replacing what already exists within the file: + +```python +# djtranscribe/caller/views.py +from django.conf import settings +from django.http import HttpResponse +from django.views.decorators.csrf import csrf_exempt + +from twilio.rest import Client +from twilio.twiml.voice_response import VoiceResponse + + +def dial(request, phone_number): + """Dials an outbound phone call to the number in the URL. Just + as a heads up you will never want to leave a URL like this exposed + without authentication and further phone number format verification. + phone_number should be just the digits with the country code first, + for example 14155559812.""" + # pulls credentials from environment variables + twilio_client = Client() + call = twilio_client.calls.create( + to='+{}'.format(phone_number), + from_=settings.TWILIO_PHONE_NUMBER, + url=settings.TWIML_INSTRUCTIONS_URL, + ) + print(call.sid) + return HttpResponse("dialing +{}. call SID is: {}".format( + phone_number, call.sid)) + + +@csrf_exempt +def record_twiml(request): + """Returns TwiML which prompts the caller to record a message""" + # Start our TwiML response + response = VoiceResponse() + + # Use to give the caller some instructions + response.say('Ahoy! Call recording starts now.') + + # Use to record the caller's message + response.record() + + # End the call with + response.hangup() + + return HttpResponse(str(response), content_type='application/xml') + + +def get_recording_url(request, call_sid): + """Returns an HttpResponse with plain text of the link to one or more + recordings from the specified Call SID.""" + # pulls credentials from environment variables + twilio_client = Client() + recording_urls = "" + call = twilio_client.calls.get(call_sid) + for r in call.recordings.list(): + recording_urls="\n".join([recording_urls, "".join(['https://api.twilio.com', r.uri])]) + return HttpResponse(str(recording_urls), 200) +``` + +Each of the above view functions performs one of the steps needed to +create a call recording of a phone call dialed by Twilio, and then +retrieve it as a file. `dial` programmatically initiates the outbound +call, `record_twiml` returns instructions to play a message that the +call is being recorded, records it, and then hangs up when the call +is done. `get_recording_url` only returns the URL location of the +recorded phone call so that in the next step we can send the file over +to AssemblyAI. + +Our Django project modifications are done. Next, we need to use +two services, Twilio and Ngrok, to enable some of the machine +to happen of phone calling and running the application from our +local machine. + + +## Twilio credentials and environment variables +[Sign up for Twilio](https://www.twilio.com/referral/w9pugq) or +[log into your existing account](https://www.twilio.com/console). +Once you get to the [Twilio Console](https://www.twilio.com/console), +you can obtain your `TWILIO_ACCOUNT_SID` and `TWILIO_AUTH_TOKEN` on the +right side of the page: + +Twilio Console. + +When you sign up you should have a phone number assigned to your account. +You can use that or +[purchase a new phone number](https://www.twilio.com/console/phone-numbers/search) +to use. + +Set three environment variables with the names `TWILIO_ACCOUNT_SID`, +`TWILIO_AUTH_TOKEN`, and `TWILIO_PHONE_NUMBER` using the `export` command +in your terminal. Make sure to replace the values with your own Account SID, +Auth Token and Twilio phone number. + +```bash +export TWILIO_ACCOUNT_SID=xxxxxxxxxxxxx # found in twilio.com/console +export TWILIO_AUTH_TOKEN=yyyyyyyyyyyyyy # found in twilio.com/console +export TWILIO_PHONE_NUMBER=+17166382453 # replace with your Twilio number +``` + +Note that you must use the `export` command in every command line window +that you want this key to be accessible. The scripts we are writing will +not be able to access the Twilio APIs if you do not have the tokens exported +in the environment where you are running the script. + +There is one more environment variable to set before we can run `app.py`. +We need to use Ngrok as a localhost tunnel so that Twilio's webhook can +send an HTTP POST request to our Django application running on +our local development environment. + +Run Ngrok in a new terminal window, because you will need to keep it +running while we run our other Python code: + +```bash +./ngrok http 8000 +``` + +Ngrok creating a localhost tunnel. + +Copy the HTTPS version of the "Forwarding" URL and set the `BASE_URL` +environment variable value to it. For example, in this screenshot you +would set `BASE_URL` to `https://7764c1810ad3.ngrok.io` using the +following command: + +```bash +export BASE_URL=https://7764c1810ad3.ngrok.io # use your ngrok URL, or domain. no trailing slash +``` + +We also need to update `djtranscribe/djtranscribe/settings.py`'s +`ALLOWED_HOSTS` list to include the Ngrok Forwarding URL otherwise +the [webhook](/webhooks.html) from Twilio asking for instructions +on how to handle the phone call will fail. Open the `settings.py` +file and update the `ALLOWED_HOSTS` with your Ngrok Forwarding +hostname list the following: + +``` +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = os.getenv('SECRET_KEY', 'development key') + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +~~ALLOWED_HOSTS = ['7764c1810ad3.ngrok.io','127.0.0.1','localhost'] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'caller', +] +``` + +Okay, we can finally re-run our Django web app. Ensure Ngrok is still +running in a different window, your virtualenv is active and that in this +terminal you have your four environment variables set, then run the +`runserver` command in the root project directory where `manage.py` +is located: + +```bash +python manage.py runserver +``` + +Let's make our phone ring by testing the application. + + +## Testing Twilio Programmable Voice Recording +We can test our application by going to localhost on port 8000. +Go to this URL in your web browser, replacing the "14155551234" +with the phone number you want to call, where the person on the +line will be recorded: http://localhost:8000/dial/14155551234. + +That number should now receive a phone call from your Twilio +number. Pick up, record a message that you want to use to test +the transcription, and then hang up. + +If you get an error, make sure all of your environment variables +are set. You can check the values by using the echo command like +this: + +```bash +echo $BASE_URL +``` + +When the call is over, copy the call SID show on the web page +so that we can use it to look up where the recording audio +file is stored. + +Twilio call SID served through the Django web app. + +Go to "localhost:8000/get-recording-url/" with the call SID +at the end. For example, +"localhost:8000/get-recording-url/CAda3f2f49ff4e8ef2be6b726edb998c92". + +Twilio call recording URL. + +Copy the entire output except for the ".json" at the end, then paste +it into the web browser's URL bar, prepended with "api.twilio.com". +For example, +"https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300". +This will bring up the recording. Copy the entire URL and we will use it +as input into the AssemblyAI service. + + +## Transcribing with the AssemblyAI API +We can now use the AssemblyAI API for speech-to-text transcription on +the call recording that was just made. + +[Sign up for an AssemblyAI account](https://app.assemblyai.com/login/) +and log in to the +[AssemblyAI dashboard](https://app.assemblyai.com/dashboard/), then +copy "Your API token" as shown in this screenshot: + +AssemblyAI dashboard. + +We need to export our AssemblyAI API key as an environment variable +so that our Python application can use it to authenticate with their +API. We also need to pass the publicly-accessible URL for the recording, +so we'll set that as an environment variable as well. + +```bash +# make sure to replace this URL with the one for your recording +export ASSEMBLYAI_KEY=your-api-key-here +export RECORDING_URL=https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300 +``` + +Create a new file named `transcribe.py` and write the following code in it: + +```python +import os +import requests + +endpoint = "https://api.assemblyai.com/v2/transcript" + +json = { + "audio_url": os.getenv("RECORDING_URL") +} + +headers = { + "authorization": os.getenv("ASSEMBLYAI_KEY"), + "content-type": "application/json" +} + +response = requests.post(endpoint, json=json, headers=headers) + +print(response.json()) +``` + +The above code calls the AssemblyAI transcription service using +the secret key and passes it the URL with the file recording. +The script prints out the JSON response from the service, +which will contain a transcription ID that we'll use to access +the results after they finish processing. + +Run the script using the `python` command: + +```bash +python transcribe.py +``` + +You will get back some JSON as output, similar what you see here: + +```bash +{'audio_end_at': None, 'acoustic_model': 'assemblyai_default', 'text': None, 'audio_url': 'https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300', 'speed_boost': False, 'language_model': 'assemblyai_default', 'redact_pii': False, 'confidence': None, 'webhook_status_code': None, 'id': 'zibe9vwmx-82ce-476c-85a7-e82c09c67daf', 'status': 'queued', +'boost_param': None, 'words': None, 'format_text': True, 'webhook_url': None, 'punctuate': True, 'utterances': None, 'audio_duration': None, 'auto_highlights': False, 'word_boost': [], 'dual_channel': None, 'audio_start_from': None} +``` + +Find the value contained with the `id` field of the JSON response. We need +that value to look up the final result of our transcription. Copy the +transcription ID and set it as an environment variable to use as input by +the final script: + +``` +# replace with what's found within `id` from the JSON response +export TRANSCRIPTION_ID=aksd19vwmx-82ce-476c-85a7-e82c09c67daf +``` + +We just need a little more Python that looks up the result and we'll be all +done. + + +## Retrieve the AssemblyAI Transcription +AssemblyAI will be busy transcribing the recording. Depending on the size of +the file it can take anywhere from a few seconds to a few minutes for the +job to complete. We can use the following code to see if the job is still +in progress or it has completed. If the transcription is done it will print +the results to the terminal. + +Create a new file named `print_transcription.py` with the following code: + +```python +import os +import requests + +endpoint = "https://api.assemblyai.com/v2/transcript/{}".format(os.getenv("TRANSCRIPTION_ID")) + +headers = { + "authorization": os.getenv("ASSEMBLYAI_KEY"), +} + +response = requests.get(endpoint, headers=headers) + +print(response.json()) +print("\n\n") +print(response.json()['text']) +``` + +The code above in `print_transcription.py` is very similar to the code +in the previous `transcribe.py` source file. imports `os` (operating system) +from the Python standard library, as we did in the previous two files, +to obtain the `TRANSCRIPTION_ID` and `ASSEMBLYAI_KEY` environment variable +values. + +The `endpoint` is the AssemblyAI API endpoint for retrieving +transcriptions. We set the appropriate `authorization` header and +make the API call using the `requests.get` function. We then print +out the JSON response as well as just the text that was transcribed. + +Time to test out this third file. Execute the following command in +the terminal: + +```bash +python print_transcription.py +``` + +Your output will be different based on your recording but you should see a +result in the terminal similar to the following: + +```bash +{'audio_end_at': None, 'acoustic_model': 'assemblyai_default', 'auto_highlights_result': None, 'text': 'An object relational mapper is a code library that automates the transfer of data stored in a relational database tables into objects that are more commonly used in application. Code or MS provide a high level abstraction upon a relational database that allows the developer to write Python code. Instead of sequel to create read update and delete data and schemas in their database developers can use the programming language that they are comfortable with comfortable to work with the database instead of writing sequel statements or short procedures.', 'audio_url': 'https://api.twilio.com/2010-04-01/Accounts/ACe3737affa0d2e17561ad44c9d190e70c/Recordings/RE3b42cf470bef829c3680ded961a09300', 'speed_boost': False, 'language_model': 'assemblyai_default', 'id': 'zibe9vwmx-82ce-476c-85a7-e82c09c67daf', 'confidence': 0.931797752808989, 'webhook_status_code': None, 'status': 'completed', 'boost_param': None, 'redact_pii': False, 'words': [{'text': 'An', 'confidence': 1.0, 'end': 90, 'start': 0}, {'text': 'object', 'confidence': 0.94, 'end': 570, 'start': 210}, {'text': 'relational', 'confidence': 0.89, 'end': 1080, 'start': 510}, {'text': 'mapper', 'confidence': 0.97, 'end': 1380, 'start': 1020}, {'text': 'is', 'confidence': 0.88, 'end': 1560, 'start': 1350}, {'text': 'a', 'confidence': 0.99, 'end': 1620, 'start': 1500}, {'text': 'code', 'confidence': 0.93, 'end': 1920, 'start': 1620}, {'text': 'library', 'confidence': 0.94, 'end': 2250, 'start': 1860}, {'text': 'that', 'confidence': 0.99, 'end': 2490, 'start': 2220}, {'text': 'automates', 'confidence': 0.93, 'end': 2940, 'start': 2430}, {'text': 'the', 'confidence': 0.95, 'end': 3150, 'start': 2910}, {'text': 'transfer', 'confidence': 0.98, 'end': 3510, 'start': 3090}, {'text': 'of', 'confidence': +0.99, 'end': 3660, 'start': 3480}, {'text': 'data', 'confidence': 0.84, 'end': 3960, 'start': 3630}, {'text': 'stored', 'confidence': 0.89, 'end': 4350, 'start': 3900}, {'text': 'in', 'confidence': 0.98, 'end': 4500, 'start': 4290}, {'text': 'a', 'confidence': 0.85, 'end': 4560, 'start': 4440}, {'text': 'relational', 'confidence': 0.87, 'end': 5580, 'start': 4500}, {'text': 'database', 'confidence': 0.92, 'end': +6030, 'start': 5520}, {'text': 'tables', 'confidence': 0.93, 'end': 6330, 'start': 5970}, {'text': 'into', 'confidence': 0.92, 'end': 7130, 'start': 6560}, {'text': 'objects', 'confidence': 0.96, 'end': 7490, 'start': 7100}, {'text': 'that', 'confidence': 0.97, 'end': 7700, 'start': 7430}, {'text': 'are', 'confidence': 0.9, 'end': 7850, 'start': 7640}, {'text': 'more', 'confidence': 0.97, 'end': 8030, 'start': 7790}, {'text': 'commonly', 'confidence': 0.92, 'end': 8480, 'start': 7970}, {'text': 'used', 'confidence': 0.86, 'end': 8750, 'start': 8420}, {'text': 'in', 'confidence': 0.94, 'end': 9050, 'start': 8840}, {'text': 'application.', 'confidence': 0.98, 'end': 9860, 'start': 9110}, {'text': 'Code', 'confidence': 0.93, 'end': 10040, 'start': 9830}, {'text': 'or', 'confidence': 1.0, 'end': 11210, 'start': 10220}, {'text': 'MS', 'confidence': 0.83, 'end': 11480, 'start': 11180}, {'text': 'provide', 'confidence': 0.94, 'end': 11870, 'start': 11510}, {'text': 'a', 'confidence': 1.0, 'end': 11960, 'start': 11840}, {'text': 'high', 'confidence': 1.0, 'end': 12200, 'start': 11930}, {'text': 'level', 'confidence': 0.94, 'end': 12440, 'start': 12170}, {'text': 'abstraction', 'confidence': 0.95, 'end': 12980, 'start': 12410}, {'text': +'upon', 'confidence': 0.94, 'end': 13220, 'start': 12950}, {'text': 'a', 'confidence': 1.0, 'end': 13280, 'start': 13160}, {'text': 'relational', 'confidence': 0.94, 'end': 13820, 'start': 13280}, {'text': 'database', 'confidence': 0.95, 'end': 14210, 'start': 13790}, {'text': 'that', 'confidence': 0.96, 'end': 14420, 'start': 14150}, {'text': 'allows', 'confidence': 0.99, 'end': 14720, 'start': 14360}, {'text': +'the', 'confidence': 0.56, 'end': 14870, 'start': 14690}, {'text': 'developer', 'confidence': 0.98, 'end': 15290, 'start': 14810}, {'text': 'to', 'confidence': 0.94, 'end': 15410, 'start': 15230}, {'text': 'write', 'confidence': 0.96, 'end': 15680, 'start': 15380}, {'text': 'Python', 'confidence': 0.94, 'end': 16070, 'start': 15620}, {'text': 'code.', 'confidence': 0.98, 'end': 16310, 'start': 16070}, {'text': 'Instead', 'confidence': 0.97, 'end': 17160, 'start': 16500}, {'text': 'of', 'confidence': 0.93, 'end': 17340, 'start': 17130}, {'text': 'sequel', 'confidence': 0.86, 'end': 17820, 'start': 17280}, {'text': 'to', 'confidence': 0.91, 'end': 18090, 'start': 17880}, {'text': 'create', 'confidence': 0.89, 'end': 18450, 'start': 18090}, {'text': 'read', 'confidence': 0.88, 'end': 18840, 'start': 18480}, {'text': 'update', 'confidence': 0.92, 'end': 19290, 'start': 18870}, {'text': 'and', 'confidence': 0.94, 'end': 19590, 'start': 19230}, {'text': 'delete', 'confidence': 0.89, 'end': 19920, 'start': 19530}, {'text': 'data', +'confidence': 0.95, 'end': 20190, 'start': 19890}, {'text': 'and', 'confidence': 0.92, 'end': 20490, 'start': 20250}, {'text': 'schemas', 'confidence': 0.86, 'end': 21000, 'start': 20430}, {'text': 'in', 'confidence': 0.94, 'end': 21210, 'start': 21000}, {'text': 'their', 'confidence': 0.98, 'end': 21510, 'start': 21150}, {'text': 'database', 'confidence': 0.97, 'end': 21900, 'start': 21450}, {'text': 'developers', 'confidence': 0.83, 'end': 23200, 'start': 22420}, {'text': 'can', 'confidence': 0.95, 'end': 23440, 'start': 23200}, {'text': 'use', 'confidence': 0.97, 'end': 23650, 'start': 23410}, {'text': 'the', 'confidence': 0.99, 'end': 23890, 'start': 23590}, {'text': 'programming', 'confidence': 0.97, 'end': 24370, 'start': 23830}, {'text': 'language', 'confidence': 1.0, 'end': 24700, 'start': 24310}, {'text': 'that', 'confidence': 1.0, 'end': 24880, 'start': 24640}, {'text': 'they', 'confidence': 0.99, 'end': 25060, 'start': 24820}, {'text': 'are', 'confidence': 0.85, 'end': 25210, 'start': 25000}, {'text': 'comfortable', 'confidence': 0.92, 'end': 25780, 'start': 25180}, {'text': 'with', 'confidence': 1.0, 'end': 25960, 'start': 25720}, {'text': 'comfortable', 'confidence': 0.94, 'end': 29090, 'start': 28090}, {'text': 'to', 'confidence': 0.84, 'end': 29840, 'start': 29180}, {'text': 'work', 'confidence': 0.95, 'end': 30050, 'start': 29780}, {'text': 'with', 'confidence': 0.98, 'end': 30290, 'start': 30020}, {'text': 'the', 'confidence': 0.69, 'end': 30440, 'start': 30230}, {'text': 'database', 'confidence': 0.98, 'end': 30860, 'start': 30380}, {'text': 'instead', 'confidence': 1.0, 'end': 32780, 'start': 31780}, {'text': 'of', 'confidence': 0.98, 'end': 32900, 'start': 32720}, {'text': 'writing', 'confidence': 0.87, 'end': 33320, 'start': 32870}, {'text': 'sequel', 'confidence': 0.88, 'end': 33860, 'start': 33290}, {'text': 'statements', 'confidence': 0.95, 'end': 34310, 'start': 33800}, {'text': 'or', 'confidence': 0.9, 'end': 34460, 'start': 34250}, {'text': 'short', 'confidence': 0.9, 'end': 34790, 'start': 34430}, {'text': 'procedures.', 'confidence': 0.98, 'end': 35270, 'start': 34760}], 'format_text': True, 'webhook_url': None, 'punctuate': True, 'utterances': None, 'audio_duration': 36.288, 'auto_highlights': False, 'word_boost': [], +'dual_channel': None, 'audio_start_from': None} + + +An object relational mapper is a code library that automates the transfer of data stored in a relational database tables into objects that are more commonly used in application. Code or MS provide a high level abstraction upon a relational database that allows the developer to write Python code. Instead of sequel to create read update and delete data and schemas in their database developers can use the programming language that they are comfortable with comfortable to work with the database instead of writing sequel statements or short procedures. +``` + +That's a lot of output. The first part contains the results of the +transcription and the confidence in the accuracy of each word transcribed. +The second part is just the plain text output from the transcription. + +You can take this now take this base code and add it to any application +that needs high quality text-to-speech transcription. If the results +aren't quite good enough for you, check out this tutorial on +[selecting a model that better matches your data](https://docs.assemblyai.com/guides/transcribing-with-a-different-acoustic-or-custom-language-model) +as well as +[boosting accuracy for keywords or phrases](https://docs.assemblyai.com/guides/boosting-accuracy-for-keywords-or-phrases). + + +## Additional resources +We just finished building a highly accurate transcription application for recordings. + +Next, try out some of these other related [Django](/django.html) tutorials: + +* [Using Sentry to Handle Python Exceptions in Django Projects](/blog/sentry-handle-exceptions-django-projects.html) +* [Tracking Daily User Data in Django with django-user-visit](/blog/track-daily-user-data-django-user-visit.html) +* [How to Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html) + +Questions? Let me know via +[a GitHub issue ticket on the Full Stack Python repository](https://github.com/mattmakai/fullstackpython.com/issues), +on Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). +See something wrong with this post? Fork +[this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/210105-django-accurate-twilio-voice-transcriptions.markdown) +and submit a pull request. + diff --git a/static/img/210105-django-assemblyai/assemblyai-dashboard.png b/static/img/210105-django-assemblyai/assemblyai-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..509b1af75835be13b4b7065c21f9af0a567857f9 GIT binary patch literal 197635 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 literal 0 HcmV?d00001 diff --git a/static/img/210105-django-assemblyai/call-recording-url.png b/static/img/210105-django-assemblyai/call-recording-url.png new file mode 100644 index 0000000000000000000000000000000000000000..fdf8d4bc495bfc6243194bae993f2b99d52548a0 GIT binary patch literal 66333 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

    django.template.base VariableNode, token_kwargs

    +

    django.template.context + Context +

    +

    django.template.defaultfilters + escape, + filesizeformat, + safe, + slugify, + striptags, + title, + truncatechars +

    +

    django.template.loader + get_template, + render_to_string, + select_template +

    +

    django.template.loader_tags + BlockNode, + ExtendsNode, + IncludeNode +

    +

    django.template.loaders.filesystem + Loader +

    django.template.response SimpleTemplateResponse, TemplateResponse From cb2cdbf1368aa74846f4a102f9f13248fa739b83 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 17 Feb 2021 06:16:07 -0500 Subject: [PATCH 253/302] new gpt resource --- content/pages/10-working/00-gpt-3.markdown | 10 ++++++++++ content/pages/meta/00-change-log.markdown | 3 +++ 2 files changed, 13 insertions(+) diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown index 2b7eaced0..bb50342a2 100644 --- a/content/pages/10-working/00-gpt-3.markdown +++ b/content/pages/10-working/00-gpt-3.markdown @@ -139,11 +139,21 @@ is trained. with its strengths and weaknesses. + ## GPT-3 tutorials * [Building a Chatbot with OpenAI's GPT-3 engine, Twilio SMS and Python](https://www.twilio.com/blog/openai-gpt-3-chatbot-python-twilio-sms) is a step-by-step tutorial for using GPT-3 as a smart backend for an SMS-based chatbot powered by the [Twilio API](/twilio.html). +* [Automating my job by using GPT-3 to generate database-ready SQL to answer business questions](https://blog.seekwell.io/gpt3) + walks through how the author created a bridge to translate between + plain English-language questions and + [relational database](/databases.html) SQL. The post provides both + a story for why someone would want to use GPT-3 for this purpose and + incremental steps for how the author started and figured out how + to make it better. In the end it does not quite work in all scenarios + but the proof of concept is impressive and the story is a fun read. + * [gpt-3-experiments](https://github.com/minimaxir/gpt-3-experiments) contains Python code open sourced under the MIT license that shows how to interact with the API. diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index a2e9d1a01..5b111b452 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,9 @@ view commit-level changes via the on GitHub. ## 2021 +### February +* New [GPT-3](/gpt-3.html) resources. + ### January * Published a new blog post on [Using Django & AssemblyAI for More Accurate Twilio Call Transcriptions](/blog/django-accurate-twilio-voice-transcriptions.html). From 71624ae6740a17ff34d8fbc8f2c6f20ca5e622e9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 21 Feb 2021 09:42:35 -0500 Subject: [PATCH 254/302] add new vuejs and pandas resources --- content/pages/03-data/16-pandas.markdown | 7 +++++++ content/pages/04-web-development/25-vuejs.markdown | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/content/pages/03-data/16-pandas.markdown b/content/pages/03-data/16-pandas.markdown index 54cbf13a6..9ac2c3bbe 100644 --- a/content/pages/03-data/16-pandas.markdown +++ b/content/pages/03-data/16-pandas.markdown @@ -70,6 +70,13 @@ is a data structures and analysis library. and charts that show the pay off period broken down by interest and principal. +* [Efficiently cleaning text with pandas](https://pbpython.com/text-cleaning.html) + provides a really great practical tutorial on different approaches + for cleaning a large data set so that you can begin to do your analysis. + The tutorial also shows how to use the + [sidetable](https://github.com/chris1610/sidetable) library, which + creates summary tables of a DataFrame. + * [tabula-py: Extract table from PDF into Python DataFrame](https://blog.chezo.uno/tabula-py-extract-table-from-pdf-into-python-dataframe-6c7acfa5f302) presents how to use the Python wrapper for the [Tabula](https://tabula.technology/) library that makes it easier to diff --git a/content/pages/04-web-development/25-vuejs.markdown b/content/pages/04-web-development/25-vuejs.markdown index 20a22a4d1..934f720b0 100644 --- a/content/pages/04-web-development/25-vuejs.markdown +++ b/content/pages/04-web-development/25-vuejs.markdown @@ -34,6 +34,11 @@ rich apps that run in web browsers. ### Vue.js resources +* [Building web apps with Vue and Django](https://dafoster.net/articles/2021/02/16/building-web-apps-with-vue-and-django-the-ultimate-guide/) + covers architectural decisions such as whether to use one or + two servers and then explains how to go down the one server + route with a [Django](/django.html) back end. + * [A friendly introduction to Vue.js](https://appendto.com/2016/11/a-friendly-introduction-to-vue-js/) contains the code and brief explanations of what it's doing so you can learn to create your first Vue app. From d981a073cece0b115314b6b258802735f6e151ab Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 10 Mar 2021 12:03:49 -0500 Subject: [PATCH 255/302] new webhooks resource --- content/pages/04-web-development/46-webhooks.markdown | 6 ++++++ content/pages/meta/00-change-log.markdown | 3 +++ 2 files changed, 9 insertions(+) diff --git a/content/pages/04-web-development/46-webhooks.markdown b/content/pages/04-web-development/46-webhooks.markdown index 9fbbcdbac..01d76fe43 100644 --- a/content/pages/04-web-development/46-webhooks.markdown +++ b/content/pages/04-web-development/46-webhooks.markdown @@ -23,6 +23,12 @@ otherwise independent web applications. ### Webhook resources +* [Building Webhooks Into Your Application: Guidelines and Best Practices](https://workos.com/blog/building-webhooks-into-your-application-guidelines-and-best-practices) + is an extensive high-level guide that defines what webhooks are, why you + will want to build them if you need to proactively notify other applications + of events, and what security considerations you need to have when + creating them. + * [What's a webhook?](https://sendgrid.com/blog/whats-webhook/) is a high-level explanation of this concept that also contains some basic security considerations when using them. diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 5b111b452..b2480041a 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,9 @@ view commit-level changes via the on GitHub. ## 2021 +### March +* New [webhook](/webhooks.html) resource. + ### February * New [GPT-3](/gpt-3.html) resources. From d9f81761092c19c42e24ba444bfd63a19277eeab Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 20 Mar 2021 13:45:52 -0400 Subject: [PATCH 256/302] update flask extensions example --- .../examples/flask/flask-extensions-plug-ins.markdown | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown index 52adcbeae..9467b3f26 100644 --- a/content/pages/examples/flask/flask-extensions-plug-ins.markdown +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -54,6 +54,17 @@ is provided as open source under the [Apache 2.0 license](https://github.com/johnwheeler/flask-ask/blob/master/LICENSE.txt). +### Flask-Authorize +[Flask-Authorize](https://github.com/bprinty/Flask-Authorize) +([documentation](https://flask-authorize.readthedocs.io/en/latest/) +and +[PyPI package](https://pypi.org/project/Flask-Authorize/)) +is a [Flask](/flask.html) extension to make it easier to implement +Access Control Lists (ACLs) and Role-Based Access Control (RBAC) into +web applications. The project is open sourced under the +[MIT license](https://github.com/bprinty/Flask-Authorize/blob/master/LICENSE). + + ### flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) From 320edf385c12ceff648e0d778cd086e4d2e52694 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 21 Mar 2021 08:36:30 -0400 Subject: [PATCH 257/302] add new flask example project --- .../examples/flask/flask-example-projects-code.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index 438fc76c6..a4b3d973e 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -158,6 +158,14 @@ source under the [GNU General Public License](https://github.com/danielhomola/science_flask/blob/master/LICENSE). +### ShortMe-URL-Shortener +[ShortMe](https://github.com/AcrobaticPanicc/ShortMe-URL-Shortener) +is a [Flask](/flask.html) app that creates a shortened URL +that redirects to another, typically much longer, URL. The +project is provided as open source under the +[MIT license](https://github.com/AcrobaticPanicc/ShortMe-URL-Shortener/blob/main/LICENSE). + + ### tedivm's flask starter app [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as From 6722f2fff9a0196feb040715515a700575e5ab84 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 21 Mar 2021 09:00:47 -0400 Subject: [PATCH 258/302] update flask examples --- .../flask/flask-app-badrequest.markdown | 2 +- .../examples/flask/flask-app-flask.markdown | 194 ++++++-- .../examples/flask/flask-app-headers.markdown | 4 +- .../flask/flask-app-immutabledict.markdown | 2 +- .../flask/flask-cli-appgroup.markdown | 2 +- .../flask/flask-cli-flaskgroup.markdown | 2 +- .../flask/flask-cli-pass-script-info.markdown | 2 +- .../flask/flask-cli-scriptinfo.markdown | 2 +- .../flask-ctx-after-this-request.markdown | 10 +- .../flask/flask-globals-current-app.markdown | 319 ++++++++++-- .../examples/flask/flask-globals-g.markdown | 141 +----- .../flask/flask-globals-request.markdown | 65 ++- .../flask/flask-globals-session.markdown | 26 +- .../flask/flask-helpers-flash.markdown | 126 +---- .../flask-helpers-get-root-path.markdown | 6 +- .../flask-helpers-make-response.markdown | 20 +- .../flask/flask-helpers-safe-join.markdown | 132 ++--- .../flask/flask-helpers-send-file.markdown | 17 +- .../flask/flask-helpers-url-for.markdown | 234 +-------- .../flask/flask-json-jsonencoder.markdown | 13 +- .../flask/flask-json-jsonify.markdown | 128 ++++- .../flask-sessions-badsignature.markdown | 20 +- .../flask-sessions-sessioninterface.markdown | 5 +- .../flask/flask-signals-namespace.markdown | 46 +- ...templating-render-template-string.markdown | 109 ++++- .../flask-templating-render-template.markdown | 456 ++++-------------- .../flask-views-http-method-funcs.markdown | 2 +- 27 files changed, 994 insertions(+), 1091 deletions(-) diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index a02fc98a2..76ff30b02 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -20,7 +20,7 @@ that accepts POSTs. and ImmutableDict are several other callables with code examples from the same `flask.app` package. -These subjects go along with the `BadRequest` code examples: +You should read up on these subjects along with these `BadRequest` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 830f152ea..33f54b1ef 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -93,11 +93,17 @@ scenarios. CTFd is open sourced under the ```python # test_themes.py -from flask import request +import os +import shutil + +import pytest +from flask import render_template, render_template_string, request +from jinja2.exceptions import TemplateNotFound from jinja2.sandbox import SecurityError from werkzeug.test import Client -from CTFd.utils import get_config +from CTFd.config import TestingConfig +from CTFd.utils import get_config, set_config from tests.helpers import create_ctfd, destroy_ctfd, gen_user, login_as_user @@ -121,12 +127,6 @@ def test_themes_cant_access_configpy_attributes(): assert app.config["SECRET_KEY"] == "AAAAAAAAAAAAAAAAAAAA" assert ( app.jinja_env.from_string("{{ get_config('SECRET_KEY') }}").render() - != app.config["SECRET_KEY"] - ) - destroy_ctfd(app) - - -def test_themes_escape_html(): ## ... source file abbreviated to get to Flask examples ... @@ -166,6 +166,25 @@ def test_that_request_path_hijacking_works_properly(): destroy_ctfd(app) +def test_theme_fallback_config(): + app = create_ctfd() + try: + os.mkdir(os.path.join(app.root_path, "themes", "foo")) + except OSError: + pass + + with app.app_context(): + set_config("ctf_theme", "foo") + assert app.config["THEME_FALLBACK"] == False + with app.test_client() as client: + try: + r = client.get("/") + except TemplateNotFound: + pass + try: + r = client.get("/themes/foo/static/js/pages/main.dev.js") + except TemplateNotFound: + ## ... source file continues with no further Flask examples... @@ -185,49 +204,66 @@ forms, and internationalization support. Flask App Builder is provided under the [BSD 3-Clause "New" or "Revised" license](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/LICENSE). -[**Flask AppBuilder / flask_appbuilder / tests / _test_oauth_registration_role.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/tests/_test_oauth_registration_role.py) +[**Flask AppBuilder / flask_appbuilder / tests / test_mongoengine.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/tests/test_mongoengine.py) ```python -# _test_oauth_registration_role.py -import logging -import unittest - -~~from flask import Flask -from flask_appbuilder import AppBuilder, SQLA +# test_mongoengine.py +from flask_appbuilder.views import CompactCRUDMixin, MasterDetailView +from flask_mongoengine import MongoEngine +import jinja2 +from nose.tools import eq_, ok_ +from .base import FABTestCase +from .mongoengine.models import Model1, Model2 logging.basicConfig(format="%(asctime)s:%(levelname)s:%(name)s:%(message)s") logging.getLogger().setLevel(logging.DEBUG) -log = logging.getLogger(__name__) - - -class OAuthRegistrationRoleTestCase(unittest.TestCase): - def setUp(self): -~~ self.app = Flask(__name__) - self.app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False - self.db = SQLA(self.app) - def tearDown(self): - self.appbuilder = None - self.app = None - self.db = None - def test_self_registration_not_enabled(self): - self.app.config["AUTH_USER_REGISTRATION"] = False - self.appbuilder = AppBuilder(self.app, self.db.session) +DEFAULT_INDEX_STRING = "Welcome" +INVALID_LOGIN_STRING = "Invalid login" +ACCESS_IS_DENIED = "Access is Denied" +UNIQUE_VALIDATION_STRING = "Already exists" +NOTNULL_VALIDATION_STRING = "This field is required" +DEFAULT_ADMIN_USER = "admin" +DEFAULT_ADMIN_PASSWORD = "general" - result = self.appbuilder.sm.auth_user_oauth(userinfo={"username": "testuser"}) - - self.assertIsNone(result) - self.assertEqual(len(self.appbuilder.sm.get_all_users()), 0) +log = logging.getLogger(__name__) - def test_register_and_attach_static_role(self): - self.app.config["AUTH_USER_REGISTRATION"] = True - self.app.config["AUTH_USER_REGISTRATION_ROLE"] = "Public" - self.appbuilder = AppBuilder(self.app, self.db.session) - user = self.appbuilder.sm.auth_user_oauth(userinfo={"username": "testuser"}) +class FlaskTestCase(FABTestCase): + def setUp(self): +~~ from flask import Flask + from flask_appbuilder import AppBuilder + from flask_appbuilder.models.mongoengine.interface import MongoEngineInterface + from flask_appbuilder import ModelView + from flask_appbuilder.security.mongoengine.manager import SecurityManager +~~ self.app = Flask(__name__) + self.app.jinja_env.undefined = jinja2.StrictUndefined + self.basedir = os.path.abspath(os.path.dirname(__file__)) + self.app.config["MONGODB_SETTINGS"] = {"DB": "test"} + self.app.config["CSRF_ENABLED"] = False + self.app.config["SECRET_KEY"] = "thisismyscretkey" + self.app.config["WTF_CSRF_ENABLED"] = False + + self.db = MongoEngine(self.app) + self.appbuilder = AppBuilder(self.app, security_manager_class=SecurityManager) + + class Model2View(ModelView): + datamodel = MongoEngineInterface(Model2) + list_columns = [ + "field_integer", + "field_float", + "field_string", + "field_method", + "group.field_string", + ] + edit_form_query_rel_fields = { + "group": [["field_string", FilterEqual, "G2"]] + } + add_form_query_rel_fields = {"group": [["field_string", FilterEqual, "G1"]]} + add_exclude_columns = ["excluded_string"] ## ... source file continues with no further Flask examples... @@ -1316,7 +1352,80 @@ def create_celery_app(): ``` -## Example 20 from tedivms-flask +## Example 20 from ShortMe +[ShortMe](https://github.com/AcrobaticPanicc/ShortMe-URL-Shortener) +is a [Flask](/flask.html) app that creates a shortened URL +that redirects to another, typically much longer, URL. The +project is provided as open source under the +[MIT license](https://github.com/AcrobaticPanicc/ShortMe-URL-Shortener/blob/main/LICENSE). + +[**ShortMe / app / setup.py**](https://github.com/AcrobaticPanicc/ShortMe-URL-Shortener/blob/main/app/./setup.py) + +```python +# setup.py +import os + +~~from flask import Flask +from flask_restful import Api +from dotenv import load_dotenv + +from app.db.extensions import db +from app.db.models import AuthToken +from app.views.index.index import index_blueprint +from app.views.internal.redirect_to_url import redirect_to_url_blueprint +from app.views.internal.favicon import app_blueprint +from app.views.internal.send_verification_code import send_otp_blueprint +from app.views.internal.shorten_url import shorten_url_blueprint +from app.views.your_short_url.your_short_url import your_short_url_blueprint +from app.views.total_clicks.total_clicks import total_clicks_blueprint +from app.views.error.error import error_blueprint +from app.views.page_not_found.page_not_found import page_not_found_blueprint +from app.views.api_doc.api_doc import api_doc_blueprint +from app.views.get_token.get_token import get_token_blueprint +from app.views.your_api_token.your_api_token import your_api_token_blueprint +from app.views.verify_code.verify_code import verify_code_blueprint + +from app.api.api import Shorten, TotalClicks, GetToken + + +def create_app(config_file): + app_path = os.path.dirname(os.path.abspath(__file__)) + project_folder = os.path.expanduser(app_path) + load_dotenv(os.path.join(project_folder, '.env')) + +~~ app = Flask(__name__) + api = Api(app) + app.config.from_pyfile(config_file) + + db.init_app(app) + + with app.app_context(): + db.drop_all() + db.create_all() + + app_auth_token = app.secret_key + auth_token = AuthToken(auth_token=app_auth_token) + db.session.add(auth_token) + db.session.commit() + + api.add_resource(Shorten, '/api/shorten') + api.add_resource(GetToken, '/api/get_token') + api.add_resource(TotalClicks, '/api/total_clicks') + + app.register_blueprint(index_blueprint) + app.register_blueprint(page_not_found_blueprint) + app.register_blueprint(redirect_to_url_blueprint) + app.register_blueprint(your_short_url_blueprint) + app.register_blueprint(total_clicks_blueprint) + app.register_blueprint(error_blueprint) + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 21 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1339,7 +1448,8 @@ import os import requests import yaml -~~from flask import Flask, session, render_template +~~from flask import Flask, render_template +from flask import session as current_session from flask_mail import Mail from flask_migrate import Migrate, MigrateCommand from flask.sessions import SessionInterface @@ -1445,7 +1555,7 @@ def create_app(extra_config_settings={}): ``` -## Example 21 from trape +## Example 22 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index d7f527937..cbbeeabc3 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -22,7 +22,7 @@ Flask web applications. and ImmutableDict are several other callables with code examples from the same `flask.app` package. -These subjects go along with the `Headers` code examples: +These topics are also useful while reading the `Headers` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -108,7 +108,7 @@ def create_ctfd( ctf_name="CTFd", ctf_description="CTF description", name="admin", - email="admin@ctfd.io", + email="admin@examplectf.com", password="password", user_mode="users", setup=True, diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 5339581e3..899031de3 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -65,7 +65,6 @@ DEFAULTS = { 'ATTACHMENT_STORAGE': 'default', 'AUTH_PROVIDERS': {}, 'BASE_URL': None, - 'CACHE_BACKEND': 'files', 'CACHE_DIR': '/opt/indico/cache', 'CATEGORY_CLEANUP': {}, 'CELERY_BROKER': None, @@ -77,6 +76,7 @@ DEFAULTS = { 'CUSTOM_COUNTRIES': {}, 'CUSTOM_LANGUAGES': {}, 'DB_LOG': False, + 'DEBUG': False, ## ... source file abbreviated to get to ImmutableDict examples ... diff --git a/content/pages/examples/flask/flask-cli-appgroup.markdown b/content/pages/examples/flask/flask-cli-appgroup.markdown index 573902b6a..0e496e286 100644 --- a/content/pages/examples/flask/flask-cli-appgroup.markdown +++ b/content/pages/examples/flask/flask-cli-appgroup.markdown @@ -48,7 +48,7 @@ from werkzeug.utils import cached_property def _create_app(info): from indico.web.flask.app import make_app - return make_app(set_path=True) + return make_app() class IndicoFlaskGroup(FlaskGroup): diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index e2ca94dfd..5e87669b6 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -127,7 +127,7 @@ from werkzeug.utils import cached_property def _create_app(info): from indico.web.flask.app import make_app - return make_app(set_path=True) + return make_app() ~~class IndicoFlaskGroup(FlaskGroup): diff --git a/content/pages/examples/flask/flask-cli-pass-script-info.markdown b/content/pages/examples/flask/flask-cli-pass-script-info.markdown index 2f663acce..2467707c5 100644 --- a/content/pages/examples/flask/flask-cli-pass-script-info.markdown +++ b/content/pages/examples/flask/flask-cli-pass-script-info.markdown @@ -38,7 +38,6 @@ import click from indico.cli.util import IndicoFlaskGroup, LazyGroup -click.disable_unicode_literals_warning = True __all__ = ('cli_command', 'cli_group') @@ -58,6 +57,7 @@ def _get_indico_version(ctx, param, value): @click.group(cls=IndicoFlaskGroup) +@click.option('--version', '-v', expose_value=False, callback=_get_indico_version, is_flag=True, is_eager=True, ## ... source file abbreviated to get to pass_script_info examples ... diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index 4a8997772..3a17c827b 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -170,7 +170,7 @@ from werkzeug.utils import cached_property def _create_app(info): from indico.web.flask.app import make_app - return make_app(set_path=True) + return make_app() class IndicoFlaskGroup(FlaskGroup): diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index 446419809..ad395c4b1 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -42,7 +42,7 @@ The Flask-Security-Too project is provided as open source under the import time from flask import current_app as app -~~from flask import abort, after_this_request, request, session +~~from flask import after_this_request, request, session from flask_login import current_user from werkzeug.datastructures import MultiDict from werkzeug.local import LocalProxy @@ -97,7 +97,7 @@ def _send_code_helper(form): method = form.chosen_method.data totp_secrets = _datastore.us_get_totp_secrets(user) if method == "email" and method not in totp_secrets: -~~ after_this_request(_commit) +~~ after_this_request(view_commit) totp_secrets[method] = _security._totp_factory.generate_totp_secret() _datastore.us_put_totp_secrets(user, totp_secrets) @@ -152,7 +152,7 @@ def us_signin_send_code(): primary_authn_via=form.authn_via, ) -~~ after_this_request(_commit) +~~ after_this_request(view_commit) login_user(form.user, remember=remember_me, authn_via=[form.authn_via]) if _security._want_json(request): @@ -207,7 +207,7 @@ def us_signin_send_code(): return tf_login(user, primary_authn_via="email") login_user(user, authn_via=["email"]) -~~ after_this_request(_commit) +~~ after_this_request(view_commit) if _security.redirect_behavior == "spa": return redirect( get_url(_security.post_login_view, qparams=user.get_redirect_qparams()) @@ -262,7 +262,7 @@ def us_setup(): form.user = current_user if form.validate_on_submit(): -~~ after_this_request(_commit) +~~ after_this_request(view_commit) method = state["chosen_method"] phone = state["phone_number"] if method == "sms" else None _datastore.us_set(current_user, method, state["totp_secret"], phone) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index a8ba8daaf..8dcdeaf60 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -234,7 +234,250 @@ class MenuApiManager(BaseManager): ``` -## Example 3 from FlaskBB +## Example 3 from Flask-Authorize +[Flask-Authorize](https://github.com/bprinty/Flask-Authorize) +([documentation](https://flask-authorize.readthedocs.io/en/latest/) +and +[PyPI package](https://pypi.org/project/Flask-Authorize/)) +is a [Flask](/flask.html) extension to make it easier to implement +Access Control Lists (ACLs) and Role-Based Access Control (RBAC) into +web applications. The project is open sourced under the +[MIT license](https://github.com/bprinty/Flask-Authorize/blob/master/LICENSE). + +[**Flask-Authorize / flask_authorize / mixins.py**](https://github.com/bprinty/Flask-Authorize/blob/master/flask_authorize/./mixins.py) + +```python +# mixins.py + + +import six +import re +import json +~~from flask import current_app +from werkzeug.exceptions import Unauthorized +from sqlalchemy import Column, ForeignKey +from sqlalchemy.types import Integer, Text +from sqlalchemy.orm import relationship +from sqlalchemy.sql import operators +from sqlalchemy.ext.declarative import declared_attr +from sqlalchemy import TypeDecorator, inspect, and_, or_ + + +class JSON(TypeDecorator): + impl = Text + + @property + def python_type(self): + return object + + def process_bind_param(self, value, dialect): + return json.dumps(value) + + def process_result_value(self, value, dialect): + try: + return json.loads(value) + except (ValueError, TypeError): + return None + + +## ... source file abbreviated to get to current_app examples ... + + + operators.contains_op): + return Text() + else: + return self + + def process_bind_param(self, value, dialect): + if not value: + return None + return '|'.join(value) + + def process_result_value(self, value, dialect): + try: + if not value: + return [] + return value.split('|') + except (ValueError, TypeError): + return None + + +MODELS = dict() + + +def gather_models(): + global MODELS + +~~ from flask import current_app +~~ if 'sqlalchemy' not in current_app.extensions: + return +~~ check = current_app.config['AUTHORIZE_IGNORE_PROPERTY'] + +~~ db = current_app.extensions['sqlalchemy'].db + for cls in db.Model._decl_class_registry.values(): + if isinstance(cls, type) and issubclass(cls, db.Model): + if hasattr(cls, check) and not getattr(cls, check): + continue + MODELS[table_key(cls)] = cls + return + + +def table_key(cls): +~~ if current_app.config['AUTHORIZE_MODEL_PARSER'] == 'class': + return cls.__name__ + +~~ elif current_app.config['AUTHORIZE_MODEL_PARSER'] == 'lower': + return cls.__name__.lower() + +~~ elif current_app.config['AUTHORIZE_MODEL_PARSER'] == 'snake': + words = re.findall(r'([A-Z][0-9a-z]+)', cls.__name__) + if len(words) > 1: + return '_'.join(map(lambda x: x.lower(), words)) + +~~ elif current_app.config['AUTHORIZE_MODEL_PARSER'] == 'table': + mapper = inspect(cls) + return mapper.tables[0].name + + +def default_permissions_factory(name): + def _(cls=None): + perms = default_permissions(cls) + return perms.get(name, []) + return _ + + +def default_permissions(cls=None): + if cls is None or cls.__permissions__ is None: +~~ return current_app.config['AUTHORIZE_DEFAULT_PERMISSIONS'] + elif isinstance(cls.__permissions__, int): + return parse_permission_set(cls.__permissions__) + elif isinstance(cls.__permissions__, dict): + return cls.__permissions__ + + +def default_allowances(cls=None): + global MODELS + if not MODELS: + gather_models() + + default = { +~~ key: current_app.config['AUTHORIZE_DEFAULT_ALLOWANCES'] + for key in MODELS + } + + if cls is None: + return default + + if isinstance(cls.__allowances__, dict): + return cls.__allowances__ + + return default + + +def default_restrictions(cls=None): + global MODELS + if not MODELS: + gather_models() + + default = { +~~ key: current_app.config['AUTHORIZE_DEFAULT_RESTRICTIONS'] + for key in MODELS + } + + if cls is None: + return default + + if cls.__restrictions__ == '*' or cls.__restrictions__ is True: + return { +~~ key: current_app.config['AUTHORIZE_DEFAULT_ACTIONS'] + for key in MODELS + } + + if isinstance(cls.__restrictions__, dict): + default.update(cls.__restrictions__) + return default + + +def permission_list(number): + if isinstance(number, six.string_types) and len(number) == 1: + number = int(number) + if not isinstance(number, int): + return number + + ret = [] + for mask, name in zip([1, 2, 4], ['delete', 'read', 'update']): + if number & mask: + ret.append(name) + return ret + + +def parse_permission_set(number): + if isinstance(number, six.string_types) and len(number) == 3: + number = int(number) + + +## ... source file abbreviated to get to current_app examples ... + + + cls.group_id.in_([x.id for x in current_user.groups]), + cls.group_permissions.contains(check) + )) + return or_(*clauses) + + @property + def permissions(self): + result = {} + for name in ['owner', 'group', 'other']: + prop = name + '_permissions' + if hasattr(self, prop): + result[name] = getattr(self, prop) + return result + + @permissions.setter + def permissions(self, value): + for name in ['owner', 'group', 'other']: + if name not in value: + continue + prop = name + '_permissions' + if hasattr(self, prop): + setattr(self, prop, value[name]) + return + + def set_permissions(self, *args, **kwargs): +~~ if 'authorize' in current_app.extensions: +~~ authorize = current_app.extensions['authorize'] + if not authorize.update(self): + raise Unauthorized + + if len(args): + perms = parse_permission_set(args[0]) + kwargs.update(perms) + + permissions = self.permissions.copy() + permissions.update(kwargs) + self.permissions = permissions + return self + + +class OwnerMixin(object): + __user_model__ = 'User' + + @classmethod + def get_user_default(cls): + from .plugin import CURRENT_USER + return CURRENT_USER().id + + @classmethod + def get_user_tablename(cls): + if isinstance(cls.__user_model__, str): + + +## ... source file continues with no further current_app examples... + +``` + + +## Example 4 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -377,7 +620,7 @@ class ForgotPassword(MethodView): ``` -## Example 4 from flask-base +## Example 5 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -484,7 +727,7 @@ class User(UserMixin, db.Model): ``` -## Example 5 from flask-bookshelf +## Example 6 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -589,7 +832,7 @@ app.register_blueprint(admin, url_prefix="//admin") ``` -## Example 6 from Flask-Bootstrap +## Example 7 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -713,7 +956,7 @@ class Bootstrap(object): ``` -## Example 7 from flask-debugtoolbar +## Example 8 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -861,7 +1104,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 8 from flask_jsondash +## Example 9 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -954,7 +1197,7 @@ def local_static(chart_config, static_config): ``` -## Example 9 from flask-login +## Example 10 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -1201,7 +1444,7 @@ def _secret_key(key=None): ``` -## Example 10 from Flask-Meld +## Example 11 from Flask-Meld [Flask-Meld](https://github.com/mikeabrahamsen/Flask-Meld) ([PyPI package information](https://pypi.org/project/Flask-Meld/)) allows you to write your front end web code in your back end @@ -1213,14 +1456,14 @@ in Python scripts created by a developer. ```python # component.py -import uuid import os +import uuid from importlib.util import module_from_spec, spec_from_file_location import orjson -~~from flask import render_template, current_app, url_for from bs4 import BeautifulSoup from bs4.formatter import HTMLFormatter +~~from flask import render_template, current_app, jsonify def convert_to_snake_case(s): @@ -1275,7 +1518,7 @@ def load_module_from_path(full_path, module_name): ``` -## Example 11 from flask-restx +## Example 12 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1308,7 +1551,7 @@ from six import string_types, itervalues, iteritems, iterkeys from werkzeug.routing import parse_rule from . import fields -from .model import Model, ModelBase +from .model import Model, ModelBase, OrderedModel from .reqparse import RequestParser from .utils import merge, not_none, not_none_sorted from ._http import HTTPStatus @@ -1532,7 +1775,7 @@ def _clean_header(header): ``` -## Example 12 from flask-sqlalchemy +## Example 13 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) ([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) and @@ -1569,24 +1812,24 @@ from sqlalchemy import event from sqlalchemy import inspect from sqlalchemy import orm from sqlalchemy.engine.url import make_url -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.ext.declarative import DeclarativeMeta from sqlalchemy.orm.exc import UnmappedClassError from sqlalchemy.orm.session import Session as SessionBase from .model import DefaultMeta from .model import Model -__version__ = "3.0.0.dev" - -_signals = Namespace() -models_committed = _signals.signal("models-committed") -before_models_committed = _signals.signal("before-models-committed") +try: + from sqlalchemy.orm import declarative_base + from sqlalchemy.orm import DeclarativeMeta +except ImportError: + from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.ext.declarative import DeclarativeMeta +try: + from greenlet import getcurrent as _ident_func +except ImportError: + from threading import get_ident as _ident_func -def _make_table(db): - def _make_table(*args, **kwargs): - if len(args) > 1 and isinstance(args[1], db.Column): ## ... source file abbreviated to get to current_app examples ... @@ -1625,7 +1868,7 @@ def _make_table(db): raise RuntimeError( "No application found. Either work inside a view function or push" " an application context. See" - " http://flask-sqlalchemy.pocoo.org/contexts/." + " https://flask-sqlalchemy.palletsprojects.com/contexts/." ) def get_tables_for_bind(self, bind=None): @@ -1649,7 +1892,7 @@ def _make_table(db): ``` -## Example 13 from Flask-WTF +## Example 14 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1907,7 +2150,7 @@ def same_origin(current_uri, compare_uri): ``` -## Example 14 from Flask-Security-Too +## Example 15 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -2168,7 +2411,7 @@ _default_config = { ``` -## Example 15 from Flask-User +## Example 16 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -2276,7 +2519,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 16 from Flask-VueJs-Template +## Example 17 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -2317,7 +2560,7 @@ def index_client(): ``` -## Example 17 from Flasky +## Example 18 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -2372,7 +2615,7 @@ def run_migrations_online(): ``` -## Example 18 from indico +## Example 19 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -2404,10 +2647,12 @@ logging.config.fileConfig(config.config_file_name) ~~target_metadata = current_app.extensions['migrate'].db.metadata -def _include_symbol(tablename, schema): - if schema and schema.startswith('plugin_'): +def _include_object(object_, name, type_, reflected, compare_to): + if type_ != 'table': + return True + if object_.schema and object_.schema.startswith('plugin_'): return False - return tablename != 'alembic_version' and not tablename.startswith('alembic_version_') + return name != 'alembic_version' and not name.startswith('alembic_version_') def _render_item(type_, obj, autogen_context): @@ -2422,18 +2667,16 @@ def _render_item(type_, obj, autogen_context): def run_migrations_offline(): url = config.get_main_option('sqlalchemy.url') context.configure(url=url, target_metadata=target_metadata, include_schemas=True, - version_table_schema='public', include_symbol=_include_symbol, render_item=_render_item, + version_table_schema='public', include_object=_include_object, render_item=_render_item, template_args={'toplevel_code': set()}) - with context.begin_transaction(): - ## ... source file continues with no further current_app examples... ``` -## Example 19 from sandman2 +## Example 20 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2558,7 +2801,7 @@ def register_model(cls, admin=None): ``` -## Example 20 from tedivms-flask +## Example 21 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index b12610288..e84628965 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -606,9 +606,10 @@ class HTTPAuth(object): return login_required_internal def username(self): - if not request.authorization: + auth = self.get_auth() + if not auth: return "" - return request.authorization.username + return auth.username def current_user(self): if hasattr(g, 'flask_httpauth_user'): @@ -878,127 +879,7 @@ class CSRFProtect: ``` -## Example 7 from Flask-Security-Too -[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) -([PyPi page](https://pypi.org/project/Flask-Security-Too/) and -[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) -is a maintained fork of the original -[Flask-Security](https://github.com/mattupstate/flask-security) project that -makes it easier to add common security features to [Flask](/flask.html) -web applications. A few of the critical goals of the Flask-Security-Too -project are ensuring JavaScript client-based single-page applications (SPAs) -can work securely with Flask-based backends and that guidance by the -[OWASP](https://owasp.org/) organization is followed by default. - -The Flask-Security-Too project is provided as open source under the -[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). - -[**Flask-Security-Too / flask_security / utils.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./utils.py) - -```python -# utils.py -import abc -import base64 -import datetime -from functools import partial -import hashlib -import hmac -import time -from typing import Dict, List -import warnings -from datetime import timedelta -from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode -import urllib.request -import urllib.error - -~~from flask import _request_ctx_stack, current_app, flash, g, request, session, url_for -from flask.json import JSONEncoder -from flask_login import login_user as _login_user -from flask_login import logout_user as _logout_user -from flask_login import current_user -from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME -from flask_principal import AnonymousIdentity, Identity, identity_changed, Need -from flask_wtf import csrf -from wtforms import ValidationError -from itsdangerous import BadSignature, SignatureExpired -from werkzeug.local import LocalProxy -from werkzeug.datastructures import MultiDict - -from .quart_compat import best -from .signals import user_authenticated - -_security = LocalProxy(lambda: current_app.extensions["security"]) - -_datastore = LocalProxy(lambda: _security.datastore) - -_pwd_context = LocalProxy(lambda: _security.pwd_context) - -_hashing_context = LocalProxy(lambda: _security.hashing_context) - -localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) - - -## ... source file abbreviated to get to g examples ... - - - user.login_count = user.login_count + 1 if user.login_count else 1 - - _datastore.put(user) - - session["fs_cc"] = "set" # CSRF cookie - session["fs_paa"] = time.time() # Primary authentication at - timestamp - - identity_changed.send( - current_app._get_current_object(), identity=Identity(user.fs_uniquifier) - ) - - user_authenticated.send( - current_app._get_current_object(), user=user, authn_via=authn_via - ) - return True - - -def logout_user(): - - for key in ("identity.name", "identity.auth_type", "fs_paa", "fs_gexp"): - session.pop(key, None) - - csrf_field_name = find_csrf_field_name() - if csrf_field_name: - session.pop(csrf_field_name, None) -~~ g.pop(csrf_field_name, None) - session["fs_cc"] = "clear" - identity_changed.send( - current_app._get_current_object(), identity=AnonymousIdentity() - ) - _logout_user() - - -def check_and_update_authn_fresh(within, grace, method=None): - - if method == "basic": - return True - - if within.total_seconds() < 0: - return True - - if "fs_paa" not in session: - return False - - now = datetime.datetime.utcnow() - new_exp = now + grace - grace_ts = int(new_exp.timestamp()) - - fs_gexp = session.get("fs_gexp", None) - if fs_gexp: - - -## ... source file continues with no further g examples... - -``` - - -## Example 8 from Flask-User +## Example 7 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1095,7 +976,7 @@ def allow_unconfirmed_email(view_function): ``` -## Example 9 from indico +## Example 8 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1134,7 +1015,6 @@ DEFAULTS = { 'ATTACHMENT_STORAGE': 'default', 'AUTH_PROVIDERS': {}, 'BASE_URL': None, - 'CACHE_BACKEND': 'files', 'CACHE_DIR': '/opt/indico/cache', 'CATEGORY_CLEANUP': {}, 'CELERY_BROKER': None, @@ -1144,6 +1024,7 @@ DEFAULTS = { 'CUSTOMIZATION_DEBUG': False, 'CUSTOMIZATION_DIR': None, 'CUSTOM_COUNTRIES': {}, + 'CUSTOM_LANGUAGES': {}, ## ... source file abbreviated to get to g examples ... @@ -1180,6 +1061,12 @@ class IndicoConfig: def LATEX_ENABLED(self): return bool(self.XELATEX_PATH) + def validate(self): + from indico.core.auth import login_rate_limiter + login_rate_limiter._get_current_object() # fail in case FAILED_LOGIN_RATE_LIMIT invalid + if self.DEFAULT_TIMEZONE not in pytz.all_timezones_set: + raise ValueError(f'Invalid default timezone: {self.DEFAULT_TIMEZONE}') + def __getattr__(self, name): try: return self.data[name] @@ -1193,8 +1080,6 @@ class IndicoConfig: raise AttributeError('cannot change config at runtime') -config = IndicoConfig() - ## ... source file continues with no further g examples... @@ -1202,7 +1087,7 @@ config = IndicoConfig() ``` -## Example 10 from tedivms-flask +## Example 9 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 545ea5b4a..4368a1a2f 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -129,11 +129,17 @@ scenarios. CTFd is open sourced under the ```python # test_themes.py -~~from flask import request +import os +import shutil + +import pytest +~~from flask import render_template, render_template_string, request +from jinja2.exceptions import TemplateNotFound from jinja2.sandbox import SecurityError from werkzeug.test import Client -from CTFd.utils import get_config +from CTFd.config import TestingConfig +from CTFd.utils import get_config, set_config from tests.helpers import create_ctfd, destroy_ctfd, gen_user, login_as_user @@ -152,8 +158,6 @@ def test_themes_run_in_sandbox(): def test_themes_cant_access_configpy_attributes(): - app = create_ctfd() - with app.app_context(): ## ... source file abbreviated to get to request examples ... @@ -202,6 +206,28 @@ def test_that_request_path_hijacking_works_properly(): destroy_ctfd(app) +def test_theme_fallback_config(): + app = create_ctfd() + try: + os.mkdir(os.path.join(app.root_path, "themes", "foo")) + except OSError: + pass + + with app.app_context(): + set_config("ctf_theme", "foo") + assert app.config["THEME_FALLBACK"] == False + with app.test_client() as client: + try: + r = client.get("/") + except TemplateNotFound: + pass + try: + r = client.get("/themes/foo/static/js/pages/main.dev.js") + except TemplateNotFound: + pass + destroy_ctfd(app) + + ## ... source file continues with no further request examples... @@ -1466,9 +1492,10 @@ class HTTPAuth(object): return login_required_internal def username(self): -~~ if not request.authorization: + auth = self.get_auth() + if not auth: return "" -~~ return request.authorization.username + return auth.username def current_user(self): if hasattr(g, 'flask_httpauth_user'): @@ -1500,9 +1527,14 @@ class HTTPBasicAuth(HTTPAuth): username, password = b64decode(credentials).split(b':', 1) except (ValueError, TypeError): return None + try: + username = username.decode('utf-8') + password = password.decode('utf-8') + except UnicodeDecodeError: + username = None + password = None return Authorization( - scheme, {'username': username.decode('utf-8'), - 'password': password.decode('utf-8')}) + scheme, {'username': username, 'password': password}) def authenticate(self, auth, stored_password): if auth: @@ -1514,11 +1546,6 @@ class HTTPBasicAuth(HTTPAuth): if self.verify_password_callback: return self.verify_password_callback(username, client_password) if not auth: - return - if self.hash_password_callback: - try: - client_password = self.hash_password_callback(client_password) - except TypeError: ## ... source file abbreviated to get to request examples ... @@ -2735,13 +2762,19 @@ The code is open sourced under the ```python # auth.py +import functools + ~~from flask import current_app, request from flask_multipass import InvalidCredentials, Multipass, NoSuchUser +from werkzeug.local import LocalProxy +from indico.core.config import config +from indico.core.limiter import make_rate_limiter from indico.core.logger import Logger logger = Logger.get('auth') +login_rate_limiter = LocalProxy(functools.cache(lambda: make_rate_limiter('login', config.FAILED_LOGIN_RATE_LIMIT))) class IndicoMultipass(Multipass): @@ -2756,16 +2789,11 @@ class IndicoMultipass(Multipass): @property def synced_fields(self): - provider = self.sync_provider - if provider is None: - return set() - synced_fields = set(provider.settings.get('synced_fields')) ## ... source file abbreviated to get to request examples ... - self._check_default_provider() def _check_default_provider(self): sync_providers = [p for p in self.identity_providers.values() if p.settings.get('synced_fields')] @@ -2789,6 +2817,7 @@ class IndicoMultipass(Multipass): def handle_auth_error(self, exc, redirect_to_login=False): if isinstance(exc, (NoSuchUser, InvalidCredentials)): + login_rate_limiter.hit() logger.warning('Invalid credentials (ip=%s, provider=%s): %s', ~~ request.remote_addr, exc.provider.name if exc.provider else None, exc) else: diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 6c16cb69a..6659b6dbf 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -73,7 +73,7 @@ auth = Blueprint("auth", __name__) ## ... source file abbreviated to get to session examples ... - log("registrations", "[{date}] {ip} - {name} registered with {email}") + ) db.session.close() if is_teams_mode(): @@ -101,7 +101,7 @@ def login(): ~~ session.regenerate() login_user(user) - log("logins", "[{date}] {ip} - {name} logged in") + log("logins", "[{date}] {ip} - {name} logged in", name=user.name) db.session.close() if request.args.get("next") and validators.is_safe_url( @@ -111,7 +111,11 @@ def login(): return redirect(url_for("challenges.listing")) else: - log("logins", "[{date}] {ip} - submitted invalid password for {name}") + log( + "logins", + "[{date}] {ip} - submitted invalid password for {name}", + name=user.name, + ) errors.append("Your username or password is incorrect") db.session.close() return render_template("login.html", errors=errors) @@ -119,10 +123,6 @@ def login(): log("logins", "[{date}] {ip} - submitted invalid account information") errors.append("Your username or password is incorrect") db.session.close() - return render_template("login.html", errors=errors) - else: - db.session.close() - return render_template("login.html", errors=errors) ## ... source file continues with no further session examples... @@ -1367,7 +1367,8 @@ import os import requests import yaml -~~from flask import Flask, session, render_template +from flask import Flask, render_template +~~from flask import session as current_session from flask_mail import Mail from flask_migrate import Migrate, MigrateCommand from flask.sessions import SessionInterface @@ -1429,7 +1430,7 @@ def get_config(): @user_logged_out.connect_via(app) def clear_session(sender, user, **extra): -~~ session.clear() + current_session.clear() def init_celery_service(app): @@ -1447,13 +1448,6 @@ def init_error_handlers(app): @app.errorhandler(403) def error_forbidden(e): - return show_error(403, 'Forbidden') - - @app.errorhandler(404) - def error_pagenotfound(e): - return show_error(404, 'Page not found.') - - @app.errorhandler(500) ## ... source file continues with no further session examples... diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 4ec9a3fb4..e89f89b9f 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -918,127 +918,7 @@ class LoginManager(object): ``` -## Example 8 from Flask-Security-Too -[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) -([PyPi page](https://pypi.org/project/Flask-Security-Too/) and -[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) -is a maintained fork of the original -[Flask-Security](https://github.com/mattupstate/flask-security) project that -makes it easier to add common security features to [Flask](/flask.html) -web applications. A few of the critical goals of the Flask-Security-Too -project are ensuring JavaScript client-based single-page applications (SPAs) -can work securely with Flask-based backends and that guidance by the -[OWASP](https://owasp.org/) organization is followed by default. - -The Flask-Security-Too project is provided as open source under the -[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). - -[**Flask-Security-Too / flask_security / utils.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./utils.py) - -```python -# utils.py -import abc -import base64 -import datetime -from functools import partial -import hashlib -import hmac -import time -from typing import Dict, List -import warnings -from datetime import timedelta -from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode -import urllib.request -import urllib.error - -~~from flask import _request_ctx_stack, current_app, flash, g, request, session, url_for -from flask.json import JSONEncoder -from flask_login import login_user as _login_user -from flask_login import logout_user as _logout_user -from flask_login import current_user -from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME -from flask_principal import AnonymousIdentity, Identity, identity_changed, Need -from flask_wtf import csrf -from wtforms import ValidationError -from itsdangerous import BadSignature, SignatureExpired -from werkzeug.local import LocalProxy -from werkzeug.datastructures import MultiDict - -from .quart_compat import best -from .signals import user_authenticated - -_security = LocalProxy(lambda: current_app.extensions["security"]) - -_datastore = LocalProxy(lambda: _security.datastore) - -_pwd_context = LocalProxy(lambda: _security.pwd_context) - -_hashing_context = LocalProxy(lambda: _security.hashing_context) - -localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) - - -## ... source file abbreviated to get to flash examples ... - - - string = string.encode("utf-8") - return string - - -def hash_data(data): - return _hashing_context.hash(encode_string(data)) - - -def verify_hash(hashed_data, compare_data): - return _hashing_context.verify(encode_string(compare_data), hashed_data) - - -def suppress_form_csrf(): - if get_request_attr("fs_ignore_csrf"): - return {"csrf": False} - if ( - config_value("CSRF_IGNORE_UNAUTH_ENDPOINTS") - and not current_user.is_authenticated - ): - return {"csrf": False} - return {} - - -def do_flash(message, category=None): - if config_value("FLASH_MESSAGES"): -~~ flash(message, category) - - -def get_url(endpoint_or_url, qparams=None): - try: - return transform_url(url_for(endpoint_or_url), qparams) - except Exception: - if _security.redirect_host: - url = transform_url( - endpoint_or_url, qparams, netloc=_security.redirect_host - ) - else: - url = transform_url(endpoint_or_url, qparams) - - return url - - -def slash_url_suffix(url, suffix): - - return url.endswith("/") and ("%s/" % suffix) or ("/%s" % suffix) - - -def transform_url(url, qparams=None, **kwargs): - if not url: - return url - - -## ... source file continues with no further flash examples... - -``` - - -## Example 9 from Flask-User +## Example 8 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1511,7 +1391,7 @@ class UserManager__Views(object): ``` -## Example 10 from indico +## Example 9 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1600,7 +1480,7 @@ class ImportRoleMembersMixin: ``` -## Example 11 from tedivms-flask +## Example 10 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-get-root-path.markdown b/content/pages/examples/flask/flask-helpers-get-root-path.markdown index 957aecb48..53da00788 100644 --- a/content/pages/examples/flask/flask-helpers-get-root-path.markdown +++ b/content/pages/examples/flask/flask-helpers-get-root-path.markdown @@ -62,13 +62,13 @@ from indico.util.console import cformat from indico.util.string import validate_email -click.disable_unicode_literals_warning = True - - def _echo(msg=''): click.echo(msg, err=True) +def _warn(msg): + msg = wrap_text(msg) + click.echo(click.style(msg, fg='yellow'), err=True) ## ... source file abbreviated to get to get_root_path examples ... diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 8b052e595..64df32c79 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -329,7 +329,6 @@ import time from flask import ( Blueprint, - abort, after_this_request, current_app, jsonify, @@ -352,17 +351,23 @@ from .quart_compat import get_quart_status from .unified_signin import ( us_signin, us_signin_send_code, - us_qrcode, us_setup, us_setup_validate, us_verify, us_verify_link, us_verify_send_code, +) +from .recoverable import ( ## ... source file abbreviated to get to make_response examples ... +from .utils import ( + base_render_json, + check_and_update_authn_fresh, + config_value, + do_flash, get_message, get_post_login_redirect, get_post_logout_redirect, @@ -377,23 +382,14 @@ from .unified_signin import ( slash_url_suffix, suppress_form_csrf, url_for_security, + view_commit, ) if get_quart_status(): # pragma: no cover from quart import make_response, redirect - - async def _commit(response=None): - _datastore.commit() - return response - - else: ~~ from flask import make_response, redirect - def _commit(response=None): - _datastore.commit() - return response - _security = LocalProxy(lambda: current_app.extensions["security"]) _datastore = LocalProxy(lambda: _security.datastore) diff --git a/content/pages/examples/flask/flask-helpers-safe-join.markdown b/content/pages/examples/flask/flask-helpers-safe-join.markdown index 7959e05d2..9df182563 100644 --- a/content/pages/examples/flask/flask-helpers-safe-join.markdown +++ b/content/pages/examples/flask/flask-helpers-safe-join.markdown @@ -25,76 +25,98 @@ as-is to run CTF events, or modified for custom rules for related scenarios. CTFd is open sourced under the [Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). -[**CTFd / CTFd / views.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/views.py) +[**CTFd / CTFd / __init__.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/__init__.py) ```python -# views.py +# __init__.py +import datetime import os +import sys +import weakref +from distutils.version import StrictVersion -from flask import Blueprint, abort -from flask import current_app as app -from flask import redirect, render_template, request, send_file, session, url_for +import jinja2 +from flask import Flask, Request ~~from flask.helpers import safe_join -from sqlalchemy.exc import IntegrityError - -from CTFd.cache import cache -from CTFd.constants.config import ( - AccountVisibilityTypes, - ChallengeVisibilityTypes, - ConfigTypes, - RegistrationVisibilityTypes, - ScoreVisibilityTypes, +from flask_migrate import upgrade +from jinja2 import FileSystemLoader +from jinja2.sandbox import SandboxedEnvironment +from werkzeug.middleware.proxy_fix import ProxyFix +from werkzeug.utils import cached_property + +import CTFd.utils.config +from CTFd import utils +from CTFd.constants.themes import ADMIN_THEME, DEFAULT_THEME +from CTFd.plugins import init_plugins +from CTFd.utils.crypto import sha256 +from CTFd.utils.initialization import ( + init_events, + init_logs, + init_request_processors, + init_template_filters, + init_template_globals, ) -from CTFd.models import ( - Admins, - Files, - Notifications, - Pages, - Teams, - Users, - UserTokens, - db, -) -from CTFd.utils import config, get_config, set_config -from CTFd.utils import user as current_user -from CTFd.utils import validators -from CTFd.utils.config import is_setup - - -## ... source file abbreviated to get to safe_join examples ... +from CTFd.utils.migrations import create_database, migrations, stamp_latest_revision +from CTFd.utils.sessions import CachingSessionInterface +from CTFd.utils.updates import update_check +__version__ = "3.3.0" +__channel__ = "oss" - abort(403) - else: - abort(403) - if team: - if team.banned: - abort(403) - else: - pass +## ... source file abbreviated to get to safe_join examples ... - if file_id != f.id: - abort(403) - except (BadTimeSignature, SignatureExpired, BadSignature): - abort(403) + self.cache[cache_key] = template + return template + + +class ThemeLoader(FileSystemLoader): + + DEFAULT_THEMES_PATH = os.path.join(os.path.dirname(__file__), "themes") + _ADMIN_THEME_PREFIX = ADMIN_THEME + "/" + + def __init__( + self, + searchpath=DEFAULT_THEMES_PATH, + theme_name=None, + encoding="utf-8", + followlinks=False, + ): + super(ThemeLoader, self).__init__(searchpath, encoding, followlinks) + self.theme_name = theme_name + + def get_source(self, environment, template): + if template.startswith(self._ADMIN_THEME_PREFIX): + if self.theme_name != ADMIN_THEME: + raise jinja2.TemplateNotFound(template) + template = template[len(self._ADMIN_THEME_PREFIX) :] + theme_name = self.theme_name or str(utils.get_config("ctf_theme")) +~~ template = safe_join(theme_name, "templates", template) + return super(ThemeLoader, self).get_source(environment, template) + + +def confirm_upgrade(): + if sys.stdin.isatty(): + print("/*\\ CTFd has updated and must update the database! /*\\") + print("/*\\ Please backup your database before proceeding! /*\\") + print("/*\\ CTFd maintainers are not responsible for any data loss! /*\\") + if input("Run database migrations (Y/N)").lower().strip() == "y": # nosec B322 + return True + else: + print("/*\\ Ignored database migrations... /*\\") + return False + else: + return True - uploader = get_uploader() - try: - return uploader.download(f.location) - except IOError: - abort(404) +def run_upgrade(): + upgrade() + utils.set_config("ctf_version", __version__) -@views.route("/themes//static/") -def themes(theme, path): -~~ filename = safe_join(app.root_path, "themes", theme, "static", path) - if os.path.isfile(filename): - return send_file(filename) - else: - abort(404) +def create_app(config="CTFd.config.Config"): + app = CTFdFlask(__name__) ## ... source file continues with no further safe_join examples... diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown index 3ae76de0e..1676d0fa2 100644 --- a/content/pages/examples/flask/flask-helpers-send-file.markdown +++ b/content/pages/examples/flask/flask-helpers-send-file.markdown @@ -55,6 +55,7 @@ from CTFd.constants.config import ( RegistrationVisibilityTypes, ScoreVisibilityTypes, ) +from CTFd.constants.themes import DEFAULT_THEME from CTFd.models import ( Admins, Files, @@ -67,15 +68,11 @@ from CTFd.models import ( ) from CTFd.utils import config, get_config, set_config from CTFd.utils import user as current_user -from CTFd.utils import validators ## ... source file abbreviated to get to send_file examples ... - abort(403) - - if team: if team.banned: abort(403) else: @@ -96,11 +93,13 @@ from CTFd.utils import validators @views.route("/themes//static/") def themes(theme, path): - filename = safe_join(app.root_path, "themes", theme, "static", path) - if os.path.isfile(filename): -~~ return send_file(filename) - else: - abort(404) + for cand_path in ( + safe_join(app.root_path, "themes", cand_theme, "static", path) + for cand_theme in (theme, *config.ctf_theme_candidates()) + ): + if os.path.isfile(cand_path): +~~ return send_file(cand_path) + abort(404) diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index b45d3898e..a82f0f96d 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -699,111 +699,7 @@ def login_user(user, remember=False, duration=None, force=False, fresh=True): ``` -## Example 9 from Flask-Meld -[Flask-Meld](https://github.com/mikeabrahamsen/Flask-Meld) -([PyPI package information](https://pypi.org/project/Flask-Meld/)) -allows you to write your front end web code in your back end -Python code. It does this by adding a `{% meld_scripts %}` tag to -the Flask template engine and then inserting components written -in Python scripts created by a developer. - -[**Flask-Meld / flask_meld / component.py**](https://github.com/mikeabrahamsen/Flask-Meld/blob/main/flask_meld/./component.py) - -```python -# component.py -import uuid -import os -from importlib.util import module_from_spec, spec_from_file_location - -import orjson -~~from flask import render_template, current_app, url_for -from bs4 import BeautifulSoup -from bs4.formatter import HTMLFormatter - - -def convert_to_snake_case(s): - s.replace("-", "_") - return s - - -def convert_to_camel_case(s): - s = convert_to_snake_case(s) - return "".join(word.title() for word in s.split("_")) - - -def get_component_class(component_name): - module_name = convert_to_snake_case(component_name) - class_name = convert_to_camel_case(module_name) - module = get_component_module(module_name) - component_class = getattr(module, class_name) - - return component_class - - -def get_component_module(module_name): - - -## ... source file abbreviated to get to url_for examples ... - - - context_variables = {} - context_variables.update(context["attributes"]) - context_variables.update(context["methods"]) - context_variables.update(data) - context_variables.update({"form": self._form}) - - frontend_context_variables = {} - frontend_context_variables.update(context["attributes"]) - frontend_context_variables = orjson.dumps(frontend_context_variables).decode( - "utf-8" - ) - rendered_template = render_template( - f"meld/{component_name}.html", **context_variables - ) - - soup = BeautifulSoup(rendered_template, features="html.parser") - root_element = Component._get_root_element(soup) - root_element["meld:id"] = str(self.id) - root_element["meld:data"] = frontend_context_variables - self._set_values(root_element, context_variables) - - script = soup.new_tag("script", type="module") - init = {"id": str(self.id), "name": component_name, "data": data} - init = orjson.dumps(init).decode("utf-8") - -~~ meld_url = url_for("static", filename="meld/meld.js") - meld_import = f'import {{Meld}} from ".{meld_url}";' - script.string = f"{meld_import} Meld.componentInit({init});" - root_element.append(script) - - rendered_template = Component._desoupify(soup) - - return rendered_template - - def _set_values(self, soup, context_variables): - for element in soup.find_all(attrs={'meld:model': True}): - element.attrs["value"] = context_variables[ - element.attrs["meld:model"] - ] - - @staticmethod - def _get_root_element(soup): - for element in soup.contents: - if element.name: - return element - - raise Exception("No root element found") - - @staticmethod - def _desoupify(soup): - - -## ... source file continues with no further url_for examples... - -``` - - -## Example 10 from flask-restx +## Example 9 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -858,7 +754,7 @@ def ui_for(api): ``` -## Example 11 from flaskSaaS +## Example 10 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -999,127 +895,7 @@ def reset(token): ``` -## Example 12 from Flask-Security-Too -[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) -([PyPi page](https://pypi.org/project/Flask-Security-Too/) and -[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) -is a maintained fork of the original -[Flask-Security](https://github.com/mattupstate/flask-security) project that -makes it easier to add common security features to [Flask](/flask.html) -web applications. A few of the critical goals of the Flask-Security-Too -project are ensuring JavaScript client-based single-page applications (SPAs) -can work securely with Flask-based backends and that guidance by the -[OWASP](https://owasp.org/) organization is followed by default. - -The Flask-Security-Too project is provided as open source under the -[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). - -[**Flask-Security-Too / flask_security / utils.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./utils.py) - -```python -# utils.py -import abc -import base64 -import datetime -from functools import partial -import hashlib -import hmac -import time -from typing import Dict, List -import warnings -from datetime import timedelta -from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode -import urllib.request -import urllib.error - -~~from flask import _request_ctx_stack, current_app, flash, g, request, session, url_for -from flask.json import JSONEncoder -from flask_login import login_user as _login_user -from flask_login import logout_user as _logout_user -from flask_login import current_user -from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME -from flask_principal import AnonymousIdentity, Identity, identity_changed, Need -from flask_wtf import csrf -from wtforms import ValidationError -from itsdangerous import BadSignature, SignatureExpired -from werkzeug.local import LocalProxy -from werkzeug.datastructures import MultiDict - -from .quart_compat import best -from .signals import user_authenticated - -_security = LocalProxy(lambda: current_app.extensions["security"]) - -_datastore = LocalProxy(lambda: _security.datastore) - -_pwd_context = LocalProxy(lambda: _security.pwd_context) - -_hashing_context = LocalProxy(lambda: _security.hashing_context) - -localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) - - -## ... source file abbreviated to get to url_for examples ... - - - return url - - -def slash_url_suffix(url, suffix): - - return url.endswith("/") and ("%s/" % suffix) or ("/%s" % suffix) - - -def transform_url(url, qparams=None, **kwargs): - if not url: - return url - link_parse = urlsplit(url) - if qparams: - current_query = dict(parse_qsl(link_parse.query)) - current_query.update(qparams) - link_parse = link_parse._replace(query=urlencode(current_query)) - return urlunsplit(link_parse._replace(**kwargs)) - - -def get_security_endpoint_name(endpoint): - return f"{_security.blueprint_name}.{endpoint}" - - -def url_for_security(endpoint, **values): - endpoint = get_security_endpoint_name(endpoint) -~~ return url_for(endpoint, **values) - - -def validate_redirect_url(url): - if url is None or url.strip() == "": - return False - url_next = urlsplit(url) - url_base = urlsplit(request.host_url) - if (url_next.netloc or url_next.scheme) and url_next.netloc != url_base.netloc: - base_domain = current_app.config.get("SERVER_NAME") - if ( - config_value("REDIRECT_ALLOW_SUBDOMAINS") - and base_domain - and ( - url_next.netloc == base_domain - or url_next.netloc.endswith(f".{base_domain}") - ) - ): - return True - else: - return False - return True - - -def get_post_action_redirect(config_key, declared=None): - - -## ... source file continues with no further url_for examples... - -``` - - -## Example 13 from Flask-User +## Example 11 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1268,7 +1044,7 @@ class EmailManager(object): ``` -## Example 14 from Flasky +## Example 12 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1468,7 +1244,7 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body) ``` -## Example 15 from Datadog Flask Example App +## Example 13 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index 4c391f2be..c1bb443db 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -50,7 +50,16 @@ from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode import urllib.request import urllib.error -from flask import _request_ctx_stack, current_app, flash, g, request, session, url_for +from flask import ( + _request_ctx_stack, + after_this_request, + current_app, + flash, + g, + request, + session, + url_for, +) ~~from flask.json import JSONEncoder from flask_login import login_user as _login_user from flask_login import logout_user as _logout_user @@ -63,7 +72,7 @@ from itsdangerous import BadSignature, SignatureExpired from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict -from .quart_compat import best +from .quart_compat import best, get_quart_status from .signals import user_authenticated _security = LocalProxy(lambda: current_app.extensions["security"]) diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index c1458d1be..ae6a13eca 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -659,7 +659,113 @@ class ManagementOverview(MethodView): ``` -## Example 3 from flaskSaaS +## Example 3 from Flask-Meld +[Flask-Meld](https://github.com/mikeabrahamsen/Flask-Meld) +([PyPI package information](https://pypi.org/project/Flask-Meld/)) +allows you to write your front end web code in your back end +Python code. It does this by adding a `{% meld_scripts %}` tag to +the Flask template engine and then inserting components written +in Python scripts created by a developer. + +[**Flask-Meld / flask_meld / component.py**](https://github.com/mikeabrahamsen/Flask-Meld/blob/main/flask_meld/./component.py) + +```python +# component.py +import os +import uuid +from importlib.util import module_from_spec, spec_from_file_location + +import orjson +from bs4 import BeautifulSoup +from bs4.formatter import HTMLFormatter +~~from flask import render_template, current_app, jsonify + + +def convert_to_snake_case(s): + s.replace("-", "_") + return s + + +def convert_to_camel_case(s): + s = convert_to_snake_case(s) + return "".join(word.title() for word in s.split("_")) + + +def get_component_class(component_name): + module_name = convert_to_snake_case(component_name) + class_name = convert_to_camel_case(module_name) + module = get_component_module(module_name) + component_class = getattr(module, class_name) + + return component_class + + +def get_component_module(module_name): + user_specified_dir = current_app.config.get("MELD_COMPONENT_DIR", None) + + + +## ... source file abbreviated to get to jsonify examples ... + + + + def render(self, component_name: str): + return self._view(component_name) + + def _render_template(self, template_name: str, context_variables: dict): + return render_template(template_name, **context_variables) + + def _view(self, component_name: str): + data = self._attributes() + context = self.__context__() + context_variables = {} + context_variables.update(context["attributes"]) + context_variables.update(context["methods"]) + context_variables.update({"form": self._form}) + + rendered_template = self._render_template( + f"meld/{component_name}.html", context_variables + ) + + soup = BeautifulSoup(rendered_template, features="html.parser") + root_element = Component._get_root_element(soup) + root_element["meld:id"] = str(self.id) + self._set_values(root_element, context_variables) + + script = soup.new_tag("script", type="module") +~~ init = {"id": str(self.id), "name": component_name, "data": jsonify(data).json} + init_json = orjson.dumps(init).decode("utf-8") + + meld_import = 'import {Meld} from "/meld_js_src/meld.js";' + script.string = f"{meld_import} Meld.componentInit({init_json});" + root_element.append(script) + + rendered_template = Component._desoupify(soup) + + return rendered_template + + def _set_values(self, soup, context_variables): + for element in soup.select("input,select,textarea"): + model_attrs = [ + attr for attr in element.attrs.keys() if attr.startswith("meld:model") + ] + if len(model_attrs) > 1: + raise Exception( + "Multiple 'meld:model' attributes not allowed on one tag." + ) + + for model_attr in model_attrs: + element.attrs["value"] = context_variables[element.attrs[model_attr]] + + @staticmethod + + +## ... source file continues with no further jsonify examples... + +``` + + +## Example 4 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -709,7 +815,7 @@ def contact(): ``` -## Example 4 from Flask-SocketIO +## Example 5 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -791,7 +897,7 @@ def get_session(): ``` -## Example 5 from Datadog Flask Example App +## Example 6 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -893,7 +999,7 @@ def stream(): ``` -## Example 6 from indico +## Example 7 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -907,14 +1013,18 @@ The code is open sourced under the ```python # util.py +import hashlib +import sys from datetime import datetime -~~from flask import g, has_request_context, jsonify, render_template, request, session +from authlib.oauth2 import OAuth2Error +~~from flask import flash, g, has_request_context, jsonify, render_template, request, session from itsdangerous import Signer from markupsafe import Markup -from werkzeug.exceptions import ImATeapot +from werkzeug.exceptions import BadRequest, Forbidden, ImATeapot from werkzeug.urls import url_decode, url_encode, url_parse, url_unparse +from indico.util.caching import memoize_request from indico.util.i18n import _ from indico.web.flask.templating import get_template_module @@ -994,7 +1104,7 @@ def get_request_info(hide_passwords=True): ``` -## Example 7 from keras-flask-deploy-webapp +## Example 8 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1083,7 +1193,7 @@ if __name__ == '__main__': ``` -## Example 8 from sandman2 +## Example 9 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1251,7 +1361,7 @@ class Service(MethodView): ``` -## Example 9 from tedivms-flask +## Example 10 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 3fc694c20..c7b207921 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -338,13 +338,6 @@ The Flask-Security-Too project is provided as open source under the ```python # utils.py -import abc -import base64 -import datetime -from functools import partial -import hashlib -import hmac -import time from typing import Dict, List import warnings from datetime import timedelta @@ -352,7 +345,16 @@ from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode import urllib.request import urllib.error -from flask import _request_ctx_stack, current_app, flash, g, request, session, url_for +from flask import ( + _request_ctx_stack, + after_this_request, + current_app, + flash, + g, + request, + session, + url_for, +) from flask.json import JSONEncoder from flask_login import login_user as _login_user from flask_login import logout_user as _logout_user @@ -365,7 +367,7 @@ from wtforms import ValidationError from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict -from .quart_compat import best +from .quart_compat import best, get_quart_status from .signals import user_authenticated _security = LocalProxy(lambda: current_app.extensions["security"]) diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 757772a3d..ad230c936 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -40,7 +40,8 @@ import os import requests import yaml -from flask import Flask, session, render_template +from flask import Flask, render_template +from flask import session as current_session from flask_mail import Mail from flask_migrate import Migrate, MigrateCommand ~~from flask.sessions import SessionInterface @@ -111,7 +112,7 @@ def init_session_manager(app): @user_logged_out.connect_via(app) def clear_session(sender, user, **extra): - session.clear() + current_session.clear() def init_celery_service(app): diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index 4faeecf05..f9987d40e 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -108,41 +108,51 @@ from sqlalchemy import event from sqlalchemy import inspect from sqlalchemy import orm from sqlalchemy.engine.url import make_url -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.ext.declarative import DeclarativeMeta from sqlalchemy.orm.exc import UnmappedClassError from sqlalchemy.orm.session import Session as SessionBase from .model import DefaultMeta from .model import Model -__version__ = "3.0.0.dev" +try: + from sqlalchemy.orm import declarative_base + from sqlalchemy.orm import DeclarativeMeta +except ImportError: + from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.ext.declarative import DeclarativeMeta + +try: + from greenlet import getcurrent as _ident_func +except ImportError: + from threading import get_ident as _ident_func + +__version__ = "3.0.0.dev0" ~~_signals = Namespace() models_committed = _signals.signal("models-committed") before_models_committed = _signals.signal("before-models-committed") -def _make_table(db): - def _make_table(*args, **kwargs): - if len(args) > 1 and isinstance(args[1], db.Column): - args = (args[0], db.metadata) + args[1:] - info = kwargs.pop("info", None) or {} - info.setdefault("bind_key", None) - kwargs["info"] = info - return sqlalchemy.Table(*args, **kwargs) +def _sa_url_set(url, **kwargs): + try: + url = url.set(**kwargs) + except AttributeError: + for key, value in kwargs.items(): + setattr(url, key, value) - return _make_table + return url -def _set_default_query_class(d, cls): - if "query_class" not in d: - d["query_class"] = cls +def _sa_url_query_setdefault(url, **kwargs): + query = dict(url.query) + for key, value in kwargs.items(): + query.setdefault(key, value) -def _wrap_with_default_query_class(fn, cls): - @functools.wraps(fn) - def newfn(*args, **kwargs): + return _sa_url_set(url, query=query) + + +def _make_table(db): ## ... source file continues with no further Namespace examples... diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index e076864e9..563672ef3 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -20,14 +20,117 @@ the `.templating` part. render_template is another callable from the `flask.templating` package with code examples. -You should read up on these subjects along with these `render_template_string` examples: +These topics are also useful while reading the `render_template_string` examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) * [Cascading Style Sheets (CSS)](/cascading-style-sheets.html) and [web design](/web-design.html) -## Example 1 from Flask-User +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / tests / test_themes.py**](https://github.com/CTFd/CTFd/blob/master/./tests/test_themes.py) + +```python +# test_themes.py + +import os +import shutil + +import pytest +~~from flask import render_template, render_template_string, request +from jinja2.exceptions import TemplateNotFound +from jinja2.sandbox import SecurityError +from werkzeug.test import Client + +from CTFd.config import TestingConfig +from CTFd.utils import get_config, set_config +from tests.helpers import create_ctfd, destroy_ctfd, gen_user, login_as_user + + +def test_themes_run_in_sandbox(): + app = create_ctfd() + with app.app_context(): + try: + app.jinja_env.from_string( + "{{ ().__class__.__bases__[0].__subclasses__()[40]('./test_utils.py').read() }}" + ).render() + except SecurityError: + pass + except Exception as e: + raise e + destroy_ctfd(app) + + +def test_themes_cant_access_configpy_attributes(): + + +## ... source file abbreviated to get to render_template_string examples ... + + + r = client.get("/themes/foo/static/js/pages/main.dev.js") + except TemplateNotFound: + pass + destroy_ctfd(app) + + class ThemeFallbackConfig(TestingConfig): + THEME_FALLBACK = True + + app = create_ctfd(config=ThemeFallbackConfig) + with app.app_context(): + set_config("ctf_theme", "foo") + assert app.config["THEME_FALLBACK"] == True + with app.test_client() as client: + r = client.get("/") + assert r.status_code == 200 + r = client.get("/themes/foo/static/js/pages/main.dev.js") + assert r.status_code == 200 + destroy_ctfd(app) + + os.rmdir(os.path.join(app.root_path, "themes", "foo")) + + +def test_theme_template_loading_by_prefix(): + app = create_ctfd() + with app.test_request_context(): +~~ tpl1 = render_template_string("{% extends 'core/page.html' %}", content="test") + tpl2 = render_template("page.html", content="test") + assert tpl1 == tpl2 + + +def test_theme_template_disallow_loading_admin_templates(): + app = create_ctfd() + with app.app_context(): + try: + filename = os.path.join( + app.root_path, "themes", "foo", "admin", "malicious.html" + ) + os.makedirs(os.path.dirname(filename), exist_ok=True) + with open(filename, "w") as f: + f.write("malicious") + + with pytest.raises(TemplateNotFound): +~~ render_template_string("{% include 'admin/malicious.html' %}") + finally: + shutil.rmtree( + os.path.join(app.root_path, "themes", "foo"), ignore_errors=True + ) + + + +## ... source file continues with no further render_template_string examples... + +``` + + +## Example 2 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -130,7 +233,7 @@ class ConfigClass(object): ``` -## Example 2 from Datadog Flask Example App +## Example 3 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 5c5af4b0a..f47d4a348 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -128,360 +128,92 @@ as-is to run CTF events, or modified for custom rules for related scenarios. CTFd is open sourced under the [Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). -[**CTFd / CTFd / auth.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/auth.py) +[**CTFd / tests / test_themes.py**](https://github.com/CTFd/CTFd/blob/master/./tests/test_themes.py) ```python -# auth.py -import base64 +# test_themes.py -import requests -from flask import Blueprint -from flask import current_app as app -~~from flask import redirect, render_template, request, session, url_for -from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired - -from CTFd.cache import clear_team_session, clear_user_session -from CTFd.models import Teams, UserFieldEntries, UserFields, Users, db -from CTFd.utils import config, email, get_app_config, get_config -from CTFd.utils import user as current_user -from CTFd.utils import validators -from CTFd.utils.config import is_teams_mode -from CTFd.utils.config.integrations import mlc_registration -from CTFd.utils.config.visibility import registration_visible -from CTFd.utils.crypto import verify_password -from CTFd.utils.decorators import ratelimit -from CTFd.utils.decorators.visibility import check_registration_visibility -from CTFd.utils.helpers import error_for, get_errors, markup -from CTFd.utils.logging import log -from CTFd.utils.modes import TEAMS_MODE -from CTFd.utils.security.auth import login_user, logout_user -from CTFd.utils.security.signing import unserialize -from CTFd.utils.validators import ValidationError - -auth = Blueprint("auth", __name__) - - -@auth.route("/confirm", methods=["POST", "GET"]) -@auth.route("/confirm/", methods=["POST", "GET"]) -@ratelimit(method="POST", limit=10, interval=60) -def confirm(data=None): - if not get_config("verify_emails"): - return redirect(url_for("challenges.listing")) - - if data and request.method == "GET": - try: - user_email = unserialize(data, max_age=1800) - except (BadTimeSignature, SignatureExpired): -~~ return render_template( - "confirm.html", errors=["Your confirmation link has expired"] - ) - except (BadSignature, TypeError, base64.binascii.Error): -~~ return render_template( - "confirm.html", errors=["Your confirmation token is invalid"] - ) +import os +import shutil - user = Users.query.filter_by(email=user_email).first_or_404() - if user.verified: - return redirect(url_for("views.settings")) +import pytest +~~from flask import render_template, render_template_string, request +from jinja2.exceptions import TemplateNotFound +from jinja2.sandbox import SecurityError +from werkzeug.test import Client - user.verified = True - log( - "registrations", - format="[{date}] {ip} - successful confirmation for {name}", - name=user.name, - ) - db.session.commit() - clear_user_session(user_id=user.id) - email.successful_registration_notification(user.email) - db.session.close() - if current_user.authed(): - return redirect(url_for("challenges.listing")) - return redirect(url_for("auth.login")) - - if current_user.authed() is False: - return redirect(url_for("auth.login")) - - user = Users.query.filter_by(id=session["id"]).first_or_404() - if user.verified: - return redirect(url_for("views.settings")) - - if data is None: - if request.method == "POST": - email.verify_email_address(user.email) - log( - "registrations", - format="[{date}] {ip} - {name} initiated a confirmation email resend", - ) -~~ return render_template( - "confirm.html", infos=[f"Confirmation email sent to {user.email}!"] - ) - elif request.method == "GET": -~~ return render_template("confirm.html") - - -@auth.route("/reset_password", methods=["POST", "GET"]) -@auth.route("/reset_password/", methods=["POST", "GET"]) -@ratelimit(method="POST", limit=10, interval=60) -def reset_password(data=None): - if config.can_send_mail() is False: -~~ return render_template( - "reset_password.html", - errors=[ - markup( - "This CTF is not configured to send email.
    Please contact an organizer to have your password reset." - ) - ], - ) +from CTFd.config import TestingConfig +from CTFd.utils import get_config, set_config +from tests.helpers import create_ctfd, destroy_ctfd, gen_user, login_as_user - if data is not None: + +def test_themes_run_in_sandbox(): + app = create_ctfd() + with app.app_context(): try: - email_address = unserialize(data, max_age=1800) - except (BadTimeSignature, SignatureExpired): -~~ return render_template( - "reset_password.html", errors=["Your link has expired"] - ) - except (BadSignature, TypeError, base64.binascii.Error): -~~ return render_template( - "reset_password.html", errors=["Your reset token is invalid"] - ) + app.jinja_env.from_string( + "{{ ().__class__.__bases__[0].__subclasses__()[40]('./test_utils.py').read() }}" + ).render() + except SecurityError: + pass + except Exception as e: + raise e + destroy_ctfd(app) - if request.method == "GET": -~~ return render_template("reset_password.html", mode="set") - if request.method == "POST": - password = request.form.get("password", "").strip() - user = Users.query.filter_by(email=email_address).first_or_404() - if user.oauth_id: -~~ return render_template( - "reset_password.html", - infos=[ - "Your account was registered via an authentication provider and does not have an associated password. Please login via your authentication provider." - ], - ) - - pass_short = len(password) == 0 - if pass_short: -~~ return render_template( - "reset_password.html", errors=["Please pick a longer password"] - ) - - user.password = password - db.session.commit() - clear_user_session(user_id=user.id) - log( - "logins", - format="[{date}] {ip} - successful password reset for {name}", - name=user.name, - ) - db.session.close() - email.password_change_alert(user.email) - return redirect(url_for("auth.login")) - - if request.method == "POST": - email_address = request.form["email"].strip() - user = Users.query.filter_by(email=email_address).first() - - get_errors() - - if not user: -~~ return render_template( - "reset_password.html", - infos=[ - "If that account exists you will receive an email, please check your inbox" - ], - ) - if user.oauth_id: -~~ return render_template( - "reset_password.html", - infos=[ - "The email address associated with this account was registered via an authentication provider and does not have an associated password. Please login via your authentication provider." - ], - ) +def test_themes_cant_access_configpy_attributes(): - email.forgot_password(email_address) -~~ return render_template( - "reset_password.html", - infos=[ - "If that account exists you will receive an email, please check your inbox" - ], - ) -~~ return render_template("reset_password.html") +## ... source file abbreviated to get to render_template examples ... -@auth.route("/register", methods=["POST", "GET"]) -@check_registration_visibility -@ratelimit(method="POST", limit=10, interval=5) -def register(): - errors = get_errors() - if current_user.authed(): - return redirect(url_for("challenges.listing")) + except TemplateNotFound: + pass + destroy_ctfd(app) - if request.method == "POST": - name = request.form.get("name", "").strip() - email_address = request.form.get("email", "").strip().lower() - password = request.form.get("password", "").strip() + class ThemeFallbackConfig(TestingConfig): + THEME_FALLBACK = True - website = request.form.get("website") - affiliation = request.form.get("affiliation") - country = request.form.get("country") + app = create_ctfd(config=ThemeFallbackConfig) + with app.app_context(): + set_config("ctf_theme", "foo") + assert app.config["THEME_FALLBACK"] == True + with app.test_client() as client: + r = client.get("/") + assert r.status_code == 200 + r = client.get("/themes/foo/static/js/pages/main.dev.js") + assert r.status_code == 200 + destroy_ctfd(app) - name_len = len(name) == 0 - names = Users.query.add_columns("name", "id").filter_by(name=name).first() - emails = ( - Users.query.add_columns("email", "id") - .filter_by(email=email_address) + os.rmdir(os.path.join(app.root_path, "themes", "foo")) -## ... source file abbreviated to get to render_template examples ... +def test_theme_template_loading_by_prefix(): + app = create_ctfd() + with app.test_request_context(): + tpl1 = render_template_string("{% extends 'core/page.html' %}", content="test") +~~ tpl2 = render_template("page.html", content="test") + assert tpl1 == tpl2 - errors.append( - "Only email addresses under {domains} may register".format( - domains=get_config("domain_whitelist") - ) +def test_theme_template_disallow_loading_admin_templates(): + app = create_ctfd() + with app.app_context(): + try: + filename = os.path.join( + app.root_path, "themes", "foo", "admin", "malicious.html" ) - if names: - errors.append("That user name is already taken") - if team_name_email_check is True: - errors.append("Your user name cannot be an email address") - if emails: - errors.append("That email has already been used") - if pass_short: - errors.append("Pick a longer password") - if pass_long: - errors.append("Pick a shorter password") - if name_len: - errors.append("Pick a longer user name") - if valid_website is False: - errors.append("Websites must be a proper URL starting with http or https") - if valid_country is False: - errors.append("Invalid country") - if valid_affiliation is False: - errors.append("Please provide a shorter affiliation") - - if len(errors) > 0: -~~ return render_template( - "register.html", - errors=errors, - name=request.form["name"], - email=request.form["email"], - password=request.form["password"], + os.makedirs(os.path.dirname(filename), exist_ok=True) + with open(filename, "w") as f: + f.write("malicious") + + with pytest.raises(TemplateNotFound): + render_template_string("{% include 'admin/malicious.html' %}") + finally: + shutil.rmtree( + os.path.join(app.root_path, "themes", "foo"), ignore_errors=True ) - else: - with app.app_context(): - user = Users(name=name, email=email_address, password=password) - - if website: - user.website = website - if affiliation: - user.affiliation = affiliation - if country: - user.country = country - - db.session.add(user) - db.session.commit() - db.session.flush() - - for field_id, value in entries.items(): - entry = UserFieldEntries( - field_id=field_id, value=value, user_id=user.id - - -## ... source file abbreviated to get to render_template examples ... - - - if config.can_send_mail() and get_config( - "verify_emails" - ): # Confirming users is enabled and we can send email. - log( - "registrations", - format="[{date}] {ip} - {name} registered (UNCONFIRMED) with {email}", - ) - email.verify_email_address(user.email) - db.session.close() - return redirect(url_for("auth.confirm")) - else: # Don't care about confirming users - if ( - config.can_send_mail() - ): # We want to notify the user that they have registered. - email.successful_registration_notification(user.email) - - log("registrations", "[{date}] {ip} - {name} registered with {email}") - db.session.close() - - if is_teams_mode(): - return redirect(url_for("teams.private")) - - return redirect(url_for("challenges.listing")) - else: -~~ return render_template("register.html", errors=errors) - - -@auth.route("/login", methods=["POST", "GET"]) -@ratelimit(method="POST", limit=10, interval=5) -def login(): - errors = get_errors() - if request.method == "POST": - name = request.form["name"] - - if validators.validate_email(name) is True: - user = Users.query.filter_by(email=name).first() - else: - user = Users.query.filter_by(name=name).first() - - if user: - if user and verify_password(request.form["password"], user.password): - session.regenerate() - - login_user(user) - log("logins", "[{date}] {ip} - {name} logged in") - - db.session.close() - if request.args.get("next") and validators.is_safe_url( - request.args.get("next") - ): - return redirect(request.args.get("next")) - return redirect(url_for("challenges.listing")) - - else: - log("logins", "[{date}] {ip} - submitted invalid password for {name}") - errors.append("Your username or password is incorrect") - db.session.close() -~~ return render_template("login.html", errors=errors) - else: - log("logins", "[{date}] {ip} - submitted invalid account information") - errors.append("Your username or password is incorrect") - db.session.close() -~~ return render_template("login.html", errors=errors) - else: - db.session.close() -~~ return render_template("login.html", errors=errors) - - -@auth.route("/oauth") -def oauth_login(): - endpoint = ( - get_app_config("OAUTH_AUTHORIZATION_ENDPOINT") - or get_config("oauth_authorization_endpoint") - or "https://auth.majorleaguecyber.org/oauth/authorize" - ) - - if get_config("user_mode") == "teams": - scope = "profile team" - else: - scope = "profile" - - client_id = get_app_config("OAUTH_CLIENT_ID") or get_config("oauth_client_id") - - if client_id is None: - error_for( - endpoint="auth.login", - message="OAuth Settings not configured. " - "Ask your CTF administrator to configure MajorLeagueCyber integration.", - ) - return redirect(url_for("auth.login")) ## ... source file continues with no further render_template examples... @@ -1134,14 +866,14 @@ in Python scripts created by a developer. ```python # component.py -import uuid import os +import uuid from importlib.util import module_from_spec, spec_from_file_location import orjson -~~from flask import render_template, current_app, url_for from bs4 import BeautifulSoup from bs4.formatter import HTMLFormatter +~~from flask import render_template, current_app, jsonify def convert_to_snake_case(s): @@ -1164,11 +896,25 @@ def get_component_class(component_name): def get_component_module(module_name): + user_specified_dir = current_app.config.get("MELD_COMPONENT_DIR", None) + ## ... source file abbreviated to get to render_template examples ... + func + for func in dir(self) + if callable(getattr(self, func)) + and not func.startswith("_") + and func not in self._meld_attrs + ] + + for func in function_list: + functions[func] = getattr(self, func) + + return functions + def __context__(self): return { "attributes": self._attributes(), @@ -1178,47 +924,35 @@ def get_component_module(module_name): def updated(self, name): pass - def render(self, component_name): - return self._view(component_name, self._attributes()) + def render(self, component_name: str): + return self._view(component_name) + + def _render_template(self, template_name: str, context_variables: dict): +~~ return render_template(template_name, **context_variables) - def _view(self, component_name, data): + def _view(self, component_name: str): + data = self._attributes() context = self.__context__() context_variables = {} context_variables.update(context["attributes"]) context_variables.update(context["methods"]) - context_variables.update(data) context_variables.update({"form": self._form}) - frontend_context_variables = {} - frontend_context_variables.update(context["attributes"]) - frontend_context_variables = orjson.dumps(frontend_context_variables).decode( - "utf-8" - ) -~~ rendered_template = render_template( - f"meld/{component_name}.html", **context_variables + rendered_template = self._render_template( + f"meld/{component_name}.html", context_variables ) soup = BeautifulSoup(rendered_template, features="html.parser") root_element = Component._get_root_element(soup) root_element["meld:id"] = str(self.id) - root_element["meld:data"] = frontend_context_variables self._set_values(root_element, context_variables) script = soup.new_tag("script", type="module") - init = {"id": str(self.id), "name": component_name, "data": data} - init = orjson.dumps(init).decode("utf-8") - - meld_url = url_for("static", filename="meld/meld.js") - meld_import = f'import {{Meld}} from ".{meld_url}";' - script.string = f"{meld_import} Meld.componentInit({init});" - root_element.append(script) - - rendered_template = Component._desoupify(soup) - - return rendered_template + init = {"id": str(self.id), "name": component_name, "data": jsonify(data).json} + init_json = orjson.dumps(init).decode("utf-8") - def _set_values(self, soup, context_variables): - for element in soup.find_all(attrs={'meld:model': True}): + meld_import = 'import {Meld} from "/meld_js_src/meld.js";' + script.string = f"{meld_import} Meld.componentInit({init_json});" ## ... source file continues with no further render_template examples... @@ -2487,7 +2221,8 @@ import os import requests import yaml -~~from flask import Flask, session, render_template +~~from flask import Flask, render_template +from flask import session as current_session from flask_mail import Mail from flask_migrate import Migrate, MigrateCommand from flask.sessions import SessionInterface @@ -2511,7 +2246,6 @@ def get_config(): app.config.from_object('app.settings') if 'APPLICATION_SETTINGS' in os.environ: app.config.from_envvar(os.environ['APPLICATION_SETTINGS']) - if 'AWS_SECRETS_MANAGER_CONFIG' in os.environ: ## ... source file abbreviated to get to render_template examples ... @@ -2532,7 +2266,7 @@ def get_config(): @user_logged_out.connect_via(app) def clear_session(sender, user, **extra): - session.clear() + current_session.clear() def init_celery_service(app): diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 6970f57bd..d9ad8fb08 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -19,7 +19,7 @@ and View are a couple of other callables within the `flask.views` package that also have code examples. -You should read up on these subjects along with these `http_method_funcs` examples: +These subjects go along with the `http_method_funcs` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) From be01f80d97ff908263b24bb2ef7dc9c45b2030e3 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 25 Mar 2021 07:36:49 -0400 Subject: [PATCH 259/302] tweak enterprise python page for clarity --- .../01-introduction/05-enterprise-python.markdown | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/content/pages/01-introduction/05-enterprise-python.markdown b/content/pages/01-introduction/05-enterprise-python.markdown index d00e8fbe0..f6f1ea7f8 100644 --- a/content/pages/01-introduction/05-enterprise-python.markdown +++ b/content/pages/01-introduction/05-enterprise-python.markdown @@ -39,12 +39,14 @@ frameworks when otherwise they should not make technical design decisions. ## Why are there misconceptions about Python in enterprise environments? Traditionally large organizations building enterprise software have used -statically typed languages such as C++, .NET and Java. Throughout the 1980s -and 1990s large companies such as Microsoft, Sun Microsystems and Oracle -marketed these languages as "enterprise grade". The inherent snub to other -languages was that they were not appropriate for CIOs' difficult technical -environments. Languages other than Java, C++ and .NET were seen as risky and -therefore not worthy of investment. +statically typed languages and platforms such as C++, C# and Java. +Throughout the 1990s and early 2000s, large companies such as +Microsoft, Sun Microsystems and Oracle marketed these languages as +"enterprise grade". The inherent message about other programming +ecosystem was that they were not appropriate for CIOs' difficult +technical environments. Languages other than Java, C++ and C# (along +with its broader .NET platform) were seen as risky and therefore not +worthy of investment. In addition, "scripting languages" such as Python, Perl and Ruby were not yet robust enough in the 1990s because their core standard libraries were From 27ae3a64ac7952d168ead1f9cdffd041f55ef643 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 23 Apr 2021 08:24:49 -0400 Subject: [PATCH 260/302] add new resources and latest blog post --- content/pages/03-data/04-sqlite.markdown | 7 + .../10-working/01-event-streams.markdown | 2 +- content/pages/meta/00-change-log.markdown | 4 + .../170428-python-2-7-aws-lambda.markdown | 7 +- ...-monitor-python-aws-lambda-sentry.markdown | 333 ++++++++++++++++++ .../add-env-var.jpg | Bin 0 -> 64232 bytes .../add-lambda-layer.png | Bin 0 -> 31104 bytes .../add-layer-specify-arn.jpg | Bin 0 -> 79891 bytes .../arn-region.png | Bin 0 -> 58913 bytes .../aws-lambda-configuration.jpg | Bin 0 -> 28342 bytes .../aws-lambda-landing.jpg | Bin 0 -> 171339 bytes .../aws-lambda-python.jpg | Bin 0 -> 119871 bytes .../configure-test.jpg | Bin 0 -> 113168 bytes .../create-function-detail.png | Bin 0 -> 188050 bytes .../create-function.png | Bin 0 -> 85806 bytes .../deploy-starter-app.png | Bin 0 -> 74252 bytes .../functions-list.jpg | Bin 0 -> 49733 bytes .../hello-world-python3.png | Bin 0 -> 119295 bytes .../lambda-code-editor.jpg | Bin 0 -> 90354 bytes .../lambda-search-bar.png | Bin 0 -> 65193 bytes .../layer-with-arn.png | Bin 0 -> 150571 bytes .../sentry-dsn-string.jpg | Bin 0 -> 214288 bytes .../sentry-error-dashboard.jpg | Bin 0 -> 94389 bytes .../sentry-homepage.jpg | Bin 0 -> 246339 bytes static/img/headers/python-lambda-sentry.jpg | Bin 0 -> 26907 bytes ...or-python-functions-aws-lambda-sentry.html | 6 + 26 files changed, 357 insertions(+), 2 deletions(-) create mode 100644 content/posts/210422-monitor-python-aws-lambda-sentry.markdown create mode 100644 static/img/210406-python-sentry-aws-lambda/add-env-var.jpg create mode 100644 static/img/210406-python-sentry-aws-lambda/add-lambda-layer.png create mode 100644 static/img/210406-python-sentry-aws-lambda/add-layer-specify-arn.jpg create mode 100644 static/img/210406-python-sentry-aws-lambda/arn-region.png create mode 100644 static/img/210406-python-sentry-aws-lambda/aws-lambda-configuration.jpg create mode 100644 static/img/210406-python-sentry-aws-lambda/aws-lambda-landing.jpg create mode 100644 static/img/210406-python-sentry-aws-lambda/aws-lambda-python.jpg create mode 100644 static/img/210406-python-sentry-aws-lambda/configure-test.jpg create mode 100644 static/img/210406-python-sentry-aws-lambda/create-function-detail.png create mode 100644 static/img/210406-python-sentry-aws-lambda/create-function.png create mode 100644 static/img/210406-python-sentry-aws-lambda/deploy-starter-app.png create mode 100644 static/img/210406-python-sentry-aws-lambda/functions-list.jpg create mode 100644 static/img/210406-python-sentry-aws-lambda/hello-world-python3.png create mode 100644 static/img/210406-python-sentry-aws-lambda/lambda-code-editor.jpg create mode 100644 static/img/210406-python-sentry-aws-lambda/lambda-search-bar.png create mode 100644 static/img/210406-python-sentry-aws-lambda/layer-with-arn.png create mode 100644 static/img/210406-python-sentry-aws-lambda/sentry-dsn-string.jpg create mode 100644 static/img/210406-python-sentry-aws-lambda/sentry-error-dashboard.jpg create mode 100644 static/img/210406-python-sentry-aws-lambda/sentry-homepage.jpg create mode 100644 static/img/headers/python-lambda-sentry.jpg create mode 100644 theme/templates/blog/monitor-python-functions-aws-lambda-sentry.html diff --git a/content/pages/03-data/04-sqlite.markdown b/content/pages/03-data/04-sqlite.markdown index 2cb4cef26..d5aee3aaa 100644 --- a/content/pages/03-data/04-sqlite.markdown +++ b/content/pages/03-data/04-sqlite.markdown @@ -86,6 +86,10 @@ tutorials will help you get started. It's a great short read which shows that the code is well-tested and maintained. +* [SQLite is not a toy database](https://antonz.org/sqlite-is-not-a-toy-database/) + is a whirlwind overview of some of the best aspects of SQLite and why + you should use it. + * [Data Analysis of 8.2 Million Rows with Python and SQLite](https://plot.ly/ipython-notebooks/big-data-analytics-with-pandas-and-sqlite/) explains how you can load a large dataset in to SQLite and visualize it using the Plotly service. @@ -139,6 +143,9 @@ you are having with SQLite rather than going through a general tutorial. digs into the internals of SQLite and shows some bugs found (and since fixed) while the author was researching the SQLite source code. +* [How to Store Multimedia Files in a SQLite3 Database with Python](https://www.twilio.com/blog/intro-multimedia-file-upload-python-sqlite3-database) + goes through the Python code for storing and accessing BLOB-type objects. + * [Going Fast with SQLite and Python](http://charlesleifer.com/blog/going-fast-with-sqlite-and-python/) shares essential knowledge for working effectively with SQLite in Python, particularly when it comes to transactions, concurrency and commits. diff --git a/content/pages/10-working/01-event-streams.markdown b/content/pages/10-working/01-event-streams.markdown index dcc13182f..0daa6e45f 100644 --- a/content/pages/10-working/01-event-streams.markdown +++ b/content/pages/10-working/01-event-streams.markdown @@ -9,7 +9,7 @@ meta: An event stream is a log of one or more events. Event streams are a log of one or more "things that happen", which are usually referred to as events. Event streams are -conceptually focused around events than "things" or objects, which are +conceptually focused around events than objects or tables, which are the typical storage unit of [relational databases](/databases.html). Apache Kafka and Gazette are a popular open source implementations of event diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index b2480041a..8ad49d56e 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2021 +### April +* Published new post on [How to Monitor Python Functions on AWS Lambda with Sentry](/blog/monitor-python-functions-aws-lambda-sentry.html). +* New [SQLite](/sqlite.html) resource. + ### March * New [webhook](/webhooks.html) resource. diff --git a/content/posts/170428-python-2-7-aws-lambda.markdown b/content/posts/170428-python-2-7-aws-lambda.markdown index 77a3e8ec9..c702fc194 100644 --- a/content/posts/170428-python-2-7-aws-lambda.markdown +++ b/content/posts/170428-python-2-7-aws-lambda.markdown @@ -3,7 +3,7 @@ slug: aws-lambda-python-2-7 meta: Learn how to create and deploy your first Amazon Web Services (AWS) Lambda function with Python 2.7. category: post date: 2017-04-28 -modified: 2017-04-29 +modified: 2021-03-30 newsletter: False headerimage: /img/170428-aws-lambda-python-2-7/header.jpg headeralt: AWS, AWS Lambda and Python logos, copyright their respective owners. @@ -22,6 +22,11 @@ function that executes some simple Python 2.7 code and handles environment variables. The code can then be modified to build far more complicated Python applications. +*Note*: AWS +[ended support for Python 2.7 Lambda functions in 2021](https://aws.amazon.com/blogs/compute/announcing-end-of-support-for-python-2-7-in-aws-lambda/) +and Python 2.7 no longer receives support so you should really be using +[Python 3.8 or above](https://aws.amazon.com/about-aws/whats-new/2019/11/aws-lambda-now-supports-python-3-8/). + ## Tools We Need We do not need any local development environment tools to get through diff --git a/content/posts/210422-monitor-python-aws-lambda-sentry.markdown b/content/posts/210422-monitor-python-aws-lambda-sentry.markdown new file mode 100644 index 000000000..00d3e4cba --- /dev/null +++ b/content/posts/210422-monitor-python-aws-lambda-sentry.markdown @@ -0,0 +1,333 @@ +title: How to Monitor Python Functions on AWS Lambda with Sentry +slug: monitor-python-functions-aws-lambda-sentry +meta: Learn how to monitor your Python 3 functions on AWS Lambda using Sentry. +category: post +date: 2021-04-22 +modified: 2021-04-23 +newsletter: False +headerimage: /img/headers/python-lambda-sentry.jpg +headeralt: The Python, AWS Lambda and Sentry logos are copyright their respective owners. + + +[Amazon Web Services (AWS) Lambda](/aws-lambda.html) is a usage-based +compute service that can run [Python 3](/why-use-python.html) code. Errors +can happen in any environment you are running your application in, so +it is necessary to have reliable [monitoring](/monitoring.html) in place +to have visibility when a problem occurs. + +In this post we will install and configure +[Sentry](https://sentry.io/welcome/)'s application monitoring +service that works specifically for code running on AWS Lambda. + + +## Application Dependencies +A local [development environment](/development-environments.html) is not +required to follow this tutorial because all of the coding and configuration +can happen in a web browser through the +[AWS Console](https://console.aws.amazon.com/console/). + +The example code can be copy and pasted from this blog post or you +can access it on GitHub under the +[Full Stack Python blog-post-examples](https://github.com/fullstackpython/blog-code-examples) +repository within the +[monitor-python-aws-lambda-sentry directory](https://github.com/fullstackpython/blog-code-examples/tree/master/monitor-python-aws-lambda-sentry). + + +## Accessing the AWS Lambda Service +[Sign into your existing AWS account](https://aws.amazon.com/console) +or sign up for a [new account](https://aws.amazon.com/). Lambda +gives you the first 1 million requests for free so that you can execute +basic applications without no or low cost. + +The AWS Lambda landing page. + +When you log into your account, use the search box to enter +"lambda" and select "Lambda" when it appears to get to the right +page. + +Use the search bar to find AWS Lambda. + +If you have already used Lambda before, you will see your existing Lambda +functions in a searchable table. We're going to create a new function so +click the "Create function" button. + +Click the create function button. + +The create function page will give you several options for starting a new +Lambda function. + +The create function details page. + +Click the "Browse Serverless App Repository" selection box, then choose +the "hello-world-python3" starter app from within the +"Public applications" section. + +The create function details page. + +The hello-world-python3 starter app details page should look something +like the following screen: + +Hello world Python3 example app and Lambda function. + +Fill in some example text such as "test" under `IdentityNameParameter` +and click the "Deploy" button: + +Click the deploy button to use the starter app. + +The function will now be deployed. As soon as it is ready we can +customize it and test it out before adding Sentry to capture any errors +that occur during execution. + + +## Testing the starter Python app +Go back to the Lambda functions main page and select your new deployed +starter app from the list. + +List of AWS Lambda functions you have created. + +Find the orange "Test" button with a down arrow next to it like you +see in the image below, and then click the down arrow. Select +"Configure Test Event". + +Configure the test event. + +Fill in the Event name as "FirstTest" or something similar, then +press the "Create" button at the bottom of the modal window. + +Click the "Test" button and it will run the Lambda function with +the parameters from that new test event. You should see something +like the following output: + +```python +Response +"value1" + +Function Logs +START RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 Version: $LATEST +value1 = value1 +value2 = value2 +value3 = value3 +END RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 +REPORT RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 Duration: 0.30 ms Billed Duration: 1 ms Memory Size: 128 MB Max Memory Used: 43 MB Init Duration: 1.34 ms + +Request ID +62fa2f25-669c-47b7-b4e7-47353b0bd914 +``` + +That means the test case was successful, but what happens even if there +is a straightforward mistake in the code, such as trying to access an +undeclared variable? + +Go into the code editor and you should see the starter code like this: + +Code editor within AWS Lambda. + +Update the code with the new highlighted line, which tries to access +a fourth variable, which does not exist in the test configuration +we try to run it with. + +```python +import json + +print('Loading function') + + +def lambda_handler(event, context): + #print("Received event: " + json.dumps(event, indent=2)) + print("value1 = " + event['key1']) + print("value2 = " + event['key2']) + print("value3 = " + event['key3']) +~~ print("value4 = " + event['key4']) + return event['key1'] # Echo back the first key value + #raise Exception('Something went wrong') +``` + +After adding that one new line of code, hit the "Deploy" button, +then the "Test" button. You should see some error output: + +``` +Response +{ + "errorMessage": "'key4'", + "errorType": "KeyError", + "stackTrace": [ + [ + "/var/task/lambda_function.py", + 11, + "lambda_handler", + "print(\"value4 = \" + event['key4'])" + ] + ] +} + +Function Logs +START RequestId: a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb Version: $LATEST +value1 = value1 +value2 = value2 +value3 = value3 +'key4': KeyError +Traceback (most recent call last): + File "/var/task/lambda_function.py", line 11, in lambda_handler + print("value4 = " + event['key4']) +KeyError: 'key4' + +END RequestId: a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb +REPORT RequestId: a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb Duration: 0.81 ms Billed Duration: 1 ms Memory Size: 128 MB Max Memory Used: 43 MB Init Duration: 1.61 ms + +Request ID +a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb +``` + +It is obvious when we are working in the Console that an error just +occurred. However, in most cases an error will happen sporadically +which is why we need a monitoring system in place to catch and report +on those exceptions. + + +## AWS Lambda function monitoring with Sentry +The easiest way to add Sentry to Lambda for this application +is to configure an +[AWS Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) +with the necessary dependency for Sentry. Sentry has concise +[documentation on addin gvia Lambda Layers](https://docs.sentry.io/platforms/python/guides/aws-lambda/layer/) +so we will walk through that way to configure it and test it +out. + +First, scroll down to the "Layers" section while in your Lambda +function configuration. Click the "Add a layer" button": + +Add Lambda layer. + +In the "Add layer" screen, select the "Specify an ARN" option. + +Select Specify ARN in the Add Layer screen. + +Now to specify the Amazon Resource Name (ARN), we need to use +the Sentry documentation to get the right configuration string. + +US-East-1 is the oldest and most commonly-used region so I'll +use that here in this tutorial but you should check which one +you are in if you are not certain. + +Select the AWS for the ARN string. + +Copy that value into the Lambda Layer configuration, like this: + +Select the AWS for the ARN string. + +Then press the "Add" button. Now you have the Sentry dependency +in your environment so code that relies upon that library can be +used in the Lambda function. + +Next we need to go into the Sentry dashboard to create a project, +get our unique identifer, and connect it to our Lambda function. + +Sentry can be [self-hosted](https://github.com/getsentry/onpremise) or +used as a cloud service through [Sentry.io](https://sentry.io). We will +use the cloud hosted version because it is quicker than +setting up your own server as well as free for smaller projects. + +Go to [Sentry.io's homepage](https://sentry.io). + +Sentry.io homepage where you can sign up for a free account. + +Sign into your account or sign up for a new free account. You will be at +the main account dashboard after logging in or completing the Sentry sign +up process. + +There are no errors logged on our account dashboard yet, which is as +expected because we have not yet connected our account to our Lambda +function. + +Click "Projects" on the left navigation bar, then "Create Project" +in the top right corner. + +Under "Choose a Platform", select "Serverless" and then "AWS Lambda (Python)" +as shown below: + +Choose AWS Lambda (Python) under the platform options. + +Decide under what criteria it should send error information out of +Lambda. For this tutorial, we will have it send every exception. +Then click the "Create Project." button. + +You can have Sentry handle the instrumentation automatically but +we will handle it manually for our function. On the next screen, Sentry +will provide you with your unique DSN string, which we will need for +our function. + +Copy the Sentry DSN string so we can export it as an environment variable. + +Typically you will want to +[use environment variables on AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html) +to store and access values like your Sentry key. + +Copy the contents of the Sentry DSN string, and go into the Lambda console +to create a new environment variable. To do that, click the "Configuration" +tab within Lambda like you see here: + +Click the Lambda Configuration tab. + +Then click "Edit" and add a new environment variable with the key of `SENTRY_DSN` +and the value of the DSN string that you copied from the Sentry screen. + +Add the environment variable in AWS Lambda. + +Click the "Save" button and go back to your Lambda function code. + +Update your Lambda function with the following highlighted new lines of code +to send errors to Sentry. + +```python +import json +~~import os +~~import sentry_sdk +~~from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration + +~~SENTRY_DSN = os.environ.get('SENTRY_DSN') +~~sentry_sdk.init( +~~ dsn=SENTRY_DSN, +~~ integrations=[AwsLambdaIntegration()] +~~) + +print('Loading function') + + +def lambda_handler(event, context): + #print("Received event: " + json.dumps(event, indent=2)) + print("value1 = " + event['key1']) + print("value2 = " + event['key2']) + print("value3 = " + event['key3']) + print("value4 = " + event['key4']) + return event['key1'] # Echo back the first key value + #raise Exception('Something went wrong') +``` + +Click the "Deploy" button and then "Test". The code will throw +an error and when we go back to our Sentry dashboard we will +see it captured and viewable for further inspection. + +AWS Lambda exception in the Sentry dashboard. + +It works! Next you will likely want to tune your exception reporting +criteria to make sure you get alerted to the right number of exceptions +if you do not want to see all of them. + + +## What's Next? +We just wrote and executed a Python 3 function on AWS Lambda then +captured the exception message into the Sentry logs. You can +now continue building out your Python code knowing that when something +goes wrong you will have full visibility on what happened. + +Check out the [AWS Lambda section](/aws-lambda.html) for +more tutorials by other developers. + +Further questions? Contact me on Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). I am also on GitHub with +the username [mattmakai](https://github.com/mattmakai). + +Something wrong with this post? Fork +[this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/210422-monitor-python-aws-lambda-sentry.markdown) +and submit a pull request. diff --git a/static/img/210406-python-sentry-aws-lambda/add-env-var.jpg b/static/img/210406-python-sentry-aws-lambda/add-env-var.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1f45463d4bd558c0bb523ff640d6821d37fe21a GIT binary patch literal 64232 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�!h-Z^WRG$sX)Y$q_{}BQ1WMB_Pxe#P+rn+VC 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 literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/add-lambda-layer.png b/static/img/210406-python-sentry-aws-lambda/add-lambda-layer.png new file mode 100644 index 0000000000000000000000000000000000000000..a5eb7c6711148dcbb7077c42a636c28b90011cee GIT binary patch literal 31104 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

    ah{=Q6Rah6YocF!9_$MhJVD{yPG^+hQ_N z4FCgl1UlT=PKN;sVQU1KVV!9GNjR5YOKrA-*-#l1K0@icEkUJI&rCbjwcMQKFSK^i z*Tv=iJWz@fIPHG&C(Y~|+p;`a+t7GfGm&w5@I-Nu4~?9x%1s8A2I z+#?2O#UJlZadM{iWYp7ey8}gbRRup+caMtx6pL$G%$s7&CsnlfPI$ScG3uz5rWvv; zRMUB#J}Zm9!Hp(9U7*_;DC1FVhE+ntox`XCx>@Cs)lYt0&8s%x1H0 zgW|8u{q!jymMdPc6~m9JzmYSfUJHkC=`ao6TV+>i70MGJDrFqPz15~qg>S}mYn2ZM?l$d{lNkOjh_qt7V~5 z$?jR5AorIhqlKmBK~_S&*tlnNGA!P z@m?g#(3s~Dywiti0`o$Oj%zE0ru3|mSItP0xT)Xd3ADd9O^MW}P*?R<;mhTV6zy=p zl|0sawUgqurOuv@A?uQ1jqnZzq68Z$M12QynM~4@i?AniBHg;-ASZba+iOxX$sL66 z;R;F?WbVXBM&MYzgo&El?$@n*FzzT1Uy9_7S*oSexA8WBd=q=}v(ha$&VE@S{%+k( zdiy;ihlcb!Md2d`DN{?MJi@MWTLD^F^%UvM?H-OZGd8ssxa3hkXRh8$&wgN=hi924ie{0Vy2m&f!|K%0$f2@K=3J(DpBQUW2tYpl-p_*;`+ku%0 zhGa$b4#AD5&JCXaw^D1My5|-=F9CEy)g+(b@30yEzpElq^)$QzZjsKAd{gJPW00iG z)87r!28Jfon3*ym2!klss|&HE>Lme>zKz_pnJ|@@A8+1rHsq%J;P(GK3Bj^Vk|s$5 z8x_mvO;hFhHCL)_LutTny%GG0x<7*{V*S~Oen@Gt9Z|RYP<9BG0V4f!qJ8aKEX$>D zYqT~k{|}>;wt-ekgmlWzQ}nWM8l9M!8dM+m-NDaS+g3Gl9+n{pE|grY(`Cy6S*hs( zuZei?`3ZbU8It$?G-#|^;NIkg)%{dEE*Gv$9a0z%YCO!FnAu<`;NrMUv0e(~?Pe>4 zI0BrtoiAQCrdjD`-oE!%bb5L>FD*1-tC_dUk__W<_N0AMSd!5Yh0XFRp0zhH&5%bb zF@JX$JAAZE?<4KJp70#)+9gZ|?S9eG*48=$;hZZ&PQ#;3ANTlNCgpPvsmj!dGHL9a z@Wd|Cm5S2g&N>u~bPa6Ru@X62FtyE9{yY%@RjiiZO!zG4>NSKd5cc8El7Ii=Ii};k zIo`!enhk84Avd)zuY}Kw=Ywlt=$q`DVgg!ODZjLpt8w9x)7J4-=e1G)aw_xCcrr9= zH{DMF=(uYl{NZq?C0nUIaev73n^dN+i#;X1Ij<47;o5eMgiFRVsi4!SA3t>#r?r|; zN%bkna^-VDWn{O0)y!C?7d=nIoKSviI++YK{Z$P}gvU}yos+kMe{YDdY3+%-j_0UL z5H%FAV>f{(Rh)wnVc8|-NM}~X=b8>1i>KG6^;7c0%g1}^eJvRNjf+ZwU&MljhSSFa z!oSS5SIR3m_)<(p%DHZgb zv<6z9hera+_%jA;hoj<<2#ux9{m|*Y+#+Iw5jsVaH{OHNt<@3{JRTiR; zcwxSvj`na@x=~*s`O-B20Hyzj7V`f=eWd>`hV&l^B+>9&U5u05_kE%-#- z!csf=93A2&4Pw`)m%Epqvr)+m74I{V2x3Piw-g?jnAO6+SuB|My1Pv0IXiqvsD1cR zamY~i-6nnIBh1da`=&XsQeuCPlm*kg1hbXAscQDCNSC^c%G?l#4~9~OMp`{~kIjyZ zsb}AMvlUC8ro_N}z0sVV_xq8)@4J4p+{cuD#RR`>n{dgM5y}xrG0;^Bgt*JGH}u%W z;H>StB;@g!zsKjnLUpst_!dxX8b_RqtT82-NVX&Fo8kQVld^7$zQJF&0okiGFf=w z0mep-G_)Y+^FCbp8AD$W5aElhI3x!j=6i{BEoEl>gz$Z6v=XW?Nva76QJa4@U4DMi z;9JXeU%f4)Vvi}5-U?^%M|wXXMxk>HrWCdBdK(k}41Lc>C}Fuh#g7EpbxJZ+Lzfnk zZ1F^1U2;Pa&b>0Sc6+_4(WtyqNOFzv2!x4rDV!5f=6d__nO_<8XIPI7sYZz$xB_$1 z=^IRH+9MN|R6t_bPrk6Plh+415|X%(IGBrLeDB%zPMR;AZwN$mtMm1s@-AdCTNe-~ zo@*y<#)NMQ2Aj|QY-8>HZE)@hdsBnjDwvIgf9@<)2)}o_q-^n!{PVJ3jBmKDhhJAH zy-Z5Hoa@HjR{QmUO6HaRLc}!)NKl1S_AtDw4_IM+J}0qcnxZ1E#<9jdlJy*@y}!wX z0!Z;sq&7isL7sTJ>QspwtvwO5srVjwTo2?DaR&RHh9_G=U!kGD2!9HyA#Un279|e0 z>XU4x<`ej8JB6lvG`{UW%X;$Wz>*cF3iyZyM+6g=7hv9(w&m?J95p*p?9&8UjU`h) zyFK~?Pwa4w9*@FmpwDAAx(ud_{*wL;V}?l#q|}^i7usiGYM))#FbEKoTGIp%KyuUa z9M-`ZsZ*>{FGeGY@(66$^p1HsPn@Hk$H9TpQxWE%f4<>pT~?8PUwrR8n1&MtPl-r? zq@SNW|D+nI2KGt%Ds|QdA9RqLjdvr&{lxcJOuYnV(Wsz^(g}xIdX`jvfCbw-l==pM z?aRz}ryb@RYK@cvIs8Cw4U`wfQ*45SqRCoaPh^5#7X^i{!SUv$&i5DjIZ<4z;lYRlXwhNVRx-L$cdv5eKc@`efrmJqXXMBSueHBOSi%NXN_2qhYempr= zAlF02_*(2l_wGeNpUE-{CyKcuq4J=eb6WUX6wTY^!!Tk}Ur@AKQ1?5<$HR1(gZxemp4$!pD- zYelJg7&+3FlCcucbk{22LQ+sjP|UcCh}+SXAUNHA>tM9W5Lecs6%HF)ZNr=*@j)QmPQ6?RdM+fvc9sc^vJ^ zm|MlLr!$fVg0EhpsV+~#;PE8tKI6qs2%kIwL_{KwX6e(aFk!yCd5KDViPpN+c>3JK z?yL;gI-5(x!tpE*Ct>#A9CkLwQfy0h=X|yojPv&jqwBApK%Xb7a>i%gd*=qClY94S zZk`k(6u6h5rc@aYQvn#m8-@|BdRSg`Hb5dJ!Lq6#?>>>z@^cJ4?`v=r@WgX}YD>X~ zeBKqR-~NIwTXF^~eEkd+l!6x5s-5#DoYvI2L)A3vD&P$+$7j9oM6u{(*x}e<&>*^G z%GRitDxEwuauNIam0rezwj*m!b5WF>Vy=_FLiD#a6>uPuIL-Oz0N0~{mWbDh+Zvm{ zY(pM$ab6YcI0cm>Ey;Eb{mtWQixG=vVBg?3(^id1)&VV*g4?HW4A=&FlPKF~2N7ld zxR#vIt0$4I#wg!zgk>DuT&bef{9EyC*8bQwRuNNl^2326;mv8^58dUyv2TZZ?;2dC z^Puy62%QKR{|5g!)#`r263luQCgCEC9r>G~@O%XjACrOZBvGrcP8cs;!S%H}TQPDr1SbyHo| z15Mgbo_9XCE4?7IW9naP8l^t9JUl=OQ}&lSvEX46N}bZPV-CGy6<>6uYaYnnu%LMz zIi;I@7ZbP|;v8T0Cy3?f<2-mxoL$bxRdy(G41^Wz{{YhcUt*20;bj`@t2PCZNSSou z1wYco6?nDe94uh%agt<8P{~Ga61-$Ge}f~ecya@<;8-fMqO7V%f+1kbpE#|6w)J`T zwSW9kIT-tvHv2agsG!6f>ZsnbPQ@bTI(BaXkiOs}Ma(bOzkkQ=e$g9vdGN&TGb|7W z1*7*B>*1A`I2OTcS2|dEb9t&ean@I0KpOn(ot+!NrXHxJ&;0eG&HfLFnflM?;DCZK z@%Yt0yy45J^93F`!D@d|J!9ti*n!o zzj;s$g3A3W_WjMbGg-ntDOZ+;Z?}G0a(=~^Gz>|K!}oBzdtR{`b-PCjo%%YC!{a5j zhx}V=Nh)3X5wM75?>EOwcv7havBNQYBA1u?&F^FtGSMWBJ0faIJ28|0ZnzEpvk58u z|EKK#$>;b#o1XvL?`6xY5zbidv1!;^3#P*kQrB?Rs2z_~9Gm`r{#|&4fcNpy!7Q+f z<&Z$n-vVN~+X;}b!y6eb-B#s=L0884E38o zID?XVdM|$!Tt}n-;E3KlvphSuybuOBMt+rl`+5iLDq8V|h#>`g$0+zz%U_==&@q_f zI(S5(K=|TH_!@w0CdkeI?aL*CU7^|7P!i2QIJe6bFL>JcqW-Omthy=JHz`=)#6TAK zrVSZ&nY*1z3o<+I%Q za^WAA@fYDUz?do80%HW=7v;149CjT}@KfgV=oWiPN z{@|nr{(oWC5}hvNqa_9Tervt&@|_&?g-ABbHTZByI==WSWZ(nId;Cb(eS#%vFI_)x z!7({m_x`vm-b+#DyQ)O)7y6g{GVlvzo=uzZWxb;c@!^l{A4~pV*Gaa&pilq8La$bT z#rd!Jihoh7y!9{cy|~$E)=)X|O%lZ`{$78rxLVsr#l@4O&8CP)>mtUuINvD;wsUpx zp=yd`@plU&i-aO*Ur(#%TUsMX-G4w%(OE$!7T|*1%mpTk64d4fwz2+h8OC0{-CU4H zmfZ6VUhbUa?#D1?a&=oXGN&JMiYS1IqZlKnvuUnP3;__iJu)*Uvn{KOom}bGz4oql zob?||+=>p7&wntFtyITb|08*$%6}uRGyD2Vs0c!`%s8bZ1fA1cqa;v6e2*RYE|&H6 zt-7S9C2IQ}GE?$rFvVVddijT#vh#*2?jC^wkNmul{PzQokoCm{ZjTQv?_w0PMY6S26}Pc7dcEg>C<+WYSJ-Tvz5T6Kj`fuL@J#k|jnn)#+u{D~j| ze2`?0--hBnCz-(QPsKoVFC`Nb1|D{VAo&qR3NjZ;rdsxHvcSWu(p zGOVo&9T8fw_H`9eL z*TEH=A$t9&*VY(=`~5QLy>O^AOuoQ$w^r2AYxgk66ht2fa!@|B(jefXH20>eAfT7- z&c-n_>-KZsC}%M~Ix-ldx9Gx$9=$s5$}cn!T_nJrf^VV5!|mp*&`b#P&*^pKsa73e z=;(|)Q%JO^`GyA9YbFn{N0cw_r~lU8cZWr_Ec>!0sbnNbMoAJ!as~m1AmWH9c|b(s zFhqetGDuDW0s;b(M3f*o=bST0hCx80GsGeKmgn5Px46UE=X~efci;Wq9|P0tThqO& zy1Kenb=9x>t1rx@5X?d?J?Q#{dbl?CWi66Bd+A(EJ3402?}{F8cdYeT>YLLt49;eb zrdSB924}mmdS8Ze<<%FNKwh3Zel21vwxUO&?t}+~hV5`K#e8|Prs|(C{IS!-M-*gv z=Qg3voktu|0gHW>eS_7P<~E2sp_1VKok;>6B-K^}+>DUF|%hv9|RE5U$HJ_s^$Wg+5C)^3n3KYcVGw{(R2J zR%nu+Yr5pHZhT>iZ`?^}ZlfUJ5Pg3`AMu;o&MI6*zef{=9Gh(UN@>Dejjvg(dU>QVml^zZ&N?SBt;2~$#K?(Xb* z8?q|b`S$R!=z=F6;tP_p9Kg%FsDum?)k0J5IBo2~{46x?D)Z5k5e8B8%V+R}7Q72r zXig!kHZw~@^dTuDTHNn3kzx#yMF>v_DjP1N#|>10+E_;pek!4wwX`Xj?5PzeOtx~3 z8L2K|KG`-yxz5X^EU477d_)K~?agqfI49<|ywPLNI6B>1iwV7@>MU94Iwn5n>CK3b z^2pCd#I80r>5PGdH}v#NN37SGj~wInikD2w{N3N&h&<_+!+A^dt`hrGjcjWQeYG(f zVmK@%oi{a679hjYkOs+wT2?|!Bk+82M$u|Gqr4aDqL7<|N))N_T^ z#r3{>lI3+k8hvq~J^}0nmF7;}3n@=m!s5B9iP;7c(xEpBMvll=UAi&Kf z%tXC*cgE5XkNSQ*oV~iIi0(v~QT-An!%+tv@+Z zg(d1iKIo}2R9m7ZK9OA{{Yl&VfsFPQdwhDWM7Qf02*}&9j}p<>EK!eU3U)JggtMn+ zy9Y~BsH&d7N#$hQ9J*-atyS$9(;6h1WsE-UrNk=hW3hzyU4Al81S(HU?l# zhon&Gmqxz*d}xqpa;bR5Lb_oDZ!McOc6zK+-uS*k9ZbTyw|wlB%}oWZ6t)o%u{%pN z@j2z%6^xv@q;I1nyDX1jeaX2#uI68~da>+KGkH##@RGz+wQJ8Wp<;SY(g zdbb-UTx$*|BYvPDg4K~W=Qft*=2G47Y3xq2=Zm(_9L=?xa|h|Vy4vDTI=ajEUcxQD z@QS*kD&}esHCuc=RuryV){%G@0310Z1qnFiLwQuqU#q=};OTO9%u~v2tn3SaV!o7k zzb52J;&floQe-Gz=kdpRxV@-R>1j&Odc0!RiVjZM&yP(Cl zhE86~PbzP{9E-$Mm|@tCm=Se)e#_DIv(x|z7=h$4bh|AR(UMUWKC>o!-G5Ru=%&DN z7riq-*t^n6_{h4J8a458rBZiA^J<@>x#68Ms)0bOo5T@=|8=(yTbP!kVg#NH2lo9tL;0H_GJlT9Y(2Z9TCt}NVX!;Gw;=UK|PxrC# zv50+QGtPYj!uZ3F0LiW2oSyw%yM~6pc>J3R4FA!6=3m_>M*g1Z_QM(AKeI=CyZ7I; zPh4M-s0)$;p)aa>22smJA>F*=-9qb9jT&onISDV zzYQq#l}t5M4O<|(*eflli^}{Gw4OecH)AohP71a~sV%k8o}$_4pon|tnNg4r5q=&d z5xO?yN;XoJQFKAP$*Wtdt8_YfF;ObaJ~{^1bbLRs3u_d|T*e7rmSH+3K?V3$3uakJ zgyra#9MjU8J39-;XZUL~P+H%+%pQBcEO`EfU>hU$Lo+eT%!T1Z!H6PE--3#hg&@YB za>S8Av9U?DJbI%v!7A68aHywdGdKNZ$veH;xxkx=(YVf})w3-&l!yre2(|fMH_xuB zJAPA-16ygjed$1$;_1?iP0_U=196epjOJYHbeLP5HV%f*lJRM8SF(kWc7~6m&x8WAApKRH3Skkzk*7K1(|^ z)V{r^yc7vx4W>x*>E33?c;{ejz*3(hkV7tn!GU~H^c|h9o*Yr*MdK><_PY1@Ul7f`JD#>4F(q1BV+ZK z#d4FB>h0H3$crQBRtI&Z^8EZ}lt116H zqIY#>zgbhwPP(L~C82|%d9-`9%+(FUdcA`tismAx`7GBhA0>)>I{(swR?KoUbsSLX zUb7^tLpW|PukN*EhCQV*(Qt6jB}x|i=eAAh&Xi57o(xh7@H|Uh(-5E(`IZta7xIXQ zy{bFfJX3YDxNtIqT;*z^7Rn4D8u_&-b zbKmH=Do|N$<>f;s<&X@E4VgFd7ov-I{Bl8C!6p~HH_oHG>6)F(yEshe-r6oT9huR$ ztz7VK)B0(D#nZ6a)Mbg;whF3s@O+XC_oU>Be4EOUO=4dRYejOS+MUG-Zu5+o1^+3< z_ly3fF`cC?@*@TFoBF{E=k5QHw2SQkTheZ?4DH?Ou(R%OXY<;OY{ZS`rWubC zOrBIinFSPczqBdFu!`F1B;uBrmnSS4TMxzu7e_0ve`;5?exz4w*CMjee``4e(bmE! z-Y>(3N&eDAre{f&0C{HR$eEM>g}p3f-y#gn8wO zh{tY0Hl!7_h8}+KTYShi2-?6!*I03KJ@Vs_uY1yS8Crjxr4B9IIE#&FJcUAut90hH;>;y3 zIEC@A3W&Qq-+4cHKp`SnK37?qYHETQYGV`{a?@~}kHBAf3SSui%%LBprnss1aMBdf zOt9F(jN9nGCuT7JKEyEmuxBPQ2a%=LpF1lz_#{_Q{bYBt%~dL)CJkbP717E6nq2uk zYbb^wiUL{ng~E+>z|CYq3(XNYo@Ye|rd25l*V!1~mQ>?-iRw&#e2??uz;!OWK77j2 zGOudJy@{3=32H@?uzoP?ZGBfIUEq~~cI62HCtU5?8x+LSD^L=Rj>nh^WF5)c5W=D5 zP})Z=YuY^QEmRw-%2xfdB)ScKs?13c-#<;pt`;W~`Afwwj8Y~2IQ%*H)TAQ#n&suM*-~>@Ul2}rMy)l7q7>k+8F~;L+S`W|cFLJ)wD7)| zrO9;;3#BdNUOCxoOG!v>!KDqomKpJZV>{&K=YRW(Wxknx({Mh zAhqLyH+Rs!zmC7SvGXNVhP!-3s0w(`Zj>gthh{9ApB131FxX{M6|FMc>Q-eOmuZ!| z(HvIqJ5fX2H;>=cbw#9yr+c4#rAU>xXQZb)?@$Ujr7GZM9jrU3uA#h2%Av6h2lO5>^I+r0*4Om-uS=DjCY#r0(@Er!T`7EDmInTGNPfL@Q``!a-Q>L>>m-O(} zF&vy&p-5x<)Icrn8aZY%@Sss{iB!ma%m6Zl&;TZZA1DOl7=g=v@Tj-SDlhi|kFk~e zx%D$|hunZ?n3A=&wD!Lyw_7Q0Cc7M)>LPW`Lz?-^f%@D8fltPR-vGGEhg~jv? zLkxuKMpIEHd0}rzNWnR?pU3jqJ~g(`j<(WamV=(LE0Kex9=6KIScNqcwEze~-bf>a1Uz7my}~ASb)6`q*1WX(!*&{oppvMQHN>9k&dc@nEm+lu@mFf`sxtf5%&9p$@heo z`kRET+hDOK+~;}D=T&}L&*y><5VBi>Ak4=$>fEed!AS` zx5M7UQ>EkrFCRk?;w~N{=SbF$S{W{VY8 zk4`SXV!$%Iu#+FeMCSOuh6G&Pzk_g8Ggg&2PBu-I)YG##@MDo*vu0Ech|);PUQEkV zVfA{1s%urVX+9NJV;_=>+);6aLX<_-Tb>N+$-FdCEKg84U%X|KKo$0YjW08rg)PP% z^Z)~!>oF0^tSNZxPL2&T5-w@pD{8QApiI3a$7+B1m11J#%lDKxJ~xEf0-E{=ES?@G zvktvZo>;YbTplHs&!;(%^#bmq_Bw8TNr}njxH`IHIRQkblMF%{(j(FvnP^I+Z*88c zxKWy9nvWi4CSK#rs!bK1c$4;wXi`&oP}1wpNNAAQ$MI!e8By3N4T{Mhloi{iS1lnO zoBB>cDvtN9l(Q%vljsvt6`WfQ+O69HIiWe}SX4}RA@dNDY3Qo+my&Ki_m>`FyNFh@b5695;X&UVhk zdprRoXeZyspeB56SI*S#X&imXB4Q*xDF#0NfHINr zbpgwBrCY6)m^I{EAZorh$P9=Orkh^-09h1X9Epod?VjxfrFrvJ(BC$TkT`qP;?jb?M|wjhEO_?MTeqV?LDT8&Opgw(41{iaNbS$@d|u zFUo7$CTPrj?nmCNQrsaVowKV?72Bn&Q}D(_Aj9;uFb`7om2gMB9gs&G1a~TfHO=|f zjYc?vtkd~2b;X~77YMIEXlKDImv%)CCwR6In709z&keSkN z)pIQFu{nnX-(`f?f6#ZwN7kLQsO3PppaPP3U)i3-s&dD$TjW|>Jyyvz!@Jiq!)dH} z&@mm6C@##8!uMlEE$;iV4=uP0Y9u39w}^VB)<{j{mLHlciZqN6 zvLO!RZr1H--d?L^^I2#*jK)!69C5o5J637@yox{$pC4VROuuVB{(jBH4SSw5H!LIJ z>16;(OG_U|%6m**i=4pEb~0w4*!BkVbHxjICCg2Q*sHYQa9`Jq2I=tlZ1#LJf>;?a z00F@*AhOZ$ET?CTJ~FIYV_DABKIQx_caiHt1cAOPZ!;r3TDk{_xo;n=8~?()v5Onw zK(6eUmmrLD{4Uj1t8gp{0c3JVq;6DJ#=;fUPe0a-(W1vwLC#MZ1$4#Y)uY5N%LmVU z-PhNvMUT225dyy$PY%yroOOf6THE#5^z#f5qaqIptS6+th=(n-1`FNhylp#`xw9Qb)=4 z5=$Q5qdO9QtO!()7HP%Zd%yvz?`P)sm515UBGc zd1i16Io2IhuXQB34vO~r>7kNLOzz&1An7Xzb!?}$?8~ZK`S*zJyk`fKKC*@yVw3RKUxbSQKJ>35tH}$ToJ=DcHVG8Ip>K8qz;f4m=-9?MyZB zULrOIo@lK6e$0AKX&(Gh$4c~+3Xq@pm=MJ{DMJ%HJJND zp+Ma{QymcPx0iJQ1pT3dWq)bvd7^`-T-TIeDX|W)2p$;e43mE{GsoF&SQ&k9Nm~;e z4-+0<@BI*?sjU7c&SAmw*^O?M_WHKETh2z0O+6cB0UTes4agQ?moHHK+AIZ{lm<;L zdkJv?b@MDmg*8#^F-TR%K;foBoN6!$(;DqznfR=;y^Q5zPbt5#NPk>!Ofz?B zh$TUo5(%VEKJx%DihUD^nz#^hRn;V=2SYYOuBzHH{oAwWV=g+1 zZGCchE=ejYp-MtAwMwdHpFovGukus!C9a!cws_ayzJYeG6W_3{c5LA;_^k6?r#}wz zt}=#lbdLGd!L)CeeRy(5`V`PoVht;4*bDH7#dskd66Ym*;6Z7 zqv(6Vu;Lq06D?(~UZLyfXR=^eQ{kMe+|7W3`g4N(;}={BIu^_7iYo`9yhMj573w&# z?`#Lpg@2rktk5GA5a1N@q}N{EM`s;&bC^i|02-~_3o{{3w|`LJQQ!;#PKbdW3aqipun^G-~%A* zgkZGVK=$7=VASkyj0L+eMXxtVAvd&@(;Xu_l?` zU%BnB*eZKX#g07wE7k~Jq~h^cEN70CCLyTbKi2RIGZU;KmwITcL|X36@mrah({zZ5 zx9Q%jDUO7uCx~cI8b4o^FS|`ng8y-_ih$+PS@rg#wu2?J77Y};>^?q+QsA*YKkvwv z84C_&cfr~;8ZDjKnh+lxRWa82M5Em0wT=&D=3*}LwLCUDyUc%B^%N)0EwrZISxJh^ zz2%S;0vO$$wl18y>3MlCdu=ain3h_t8U#{0Y^)TSaYP=-UU-AKNPX zr?LbUrhtaGFL|EPUT1aL%GZGj#Y|! zd5!-bchs8w)dO8pzgsUCLL;i>@R^UajP+}Q2uT(hz_iiN_uRR>_VzXDH?$uh1|RFM zekjl6vW;qe2MC~XiZ~T7vG$Gb}>(2HA4wU${@Fs>Xn} z{6FoyKfR0=4R`{SezX`BoruY;>8UBUQza~Xr$Qfiy|c5KRE~kj8mPi)JTH4lsQndd zPTn(2CZkH&xYJE|Zm%}+M$uStS}cIYdFa(=RJ*Q=@~D|YFgl*pL$OkpWm54}DbC>^|CF=3lo zpubxeAiU--d$W3|c$^mm`r@d(BzM{HL(AJz><@R(1xDgYQngBq0THoh=wU*=#6V7c zsbn#vDGT6+22qE$oj!ujO6iTfDwsPw%i{Tr`2?aYD6@Pk@6DrquGdstEFWLbeZpIZ zy+c*2mnNE+y+gRUG_Jaa=%f`;4O}uU_eTP}S`3ZC_QU7+%nevF&)OOR$t(b(n4f*c zqLrQJN2Q$L@pz)H$hP`V;!;G=4Z%TIi%=uA73r4Lv9^;2`aNcQrVkI_cV4~_Qwx19 z_`>wy!a>!8St86m3nuvxy}`uwN{>XBw<ytvSsA-+D}3-pZqn1tWDkKj^E z;A8&D*w*`0&#y%=yJej#a+7{ND_k4qn7MLka<%fYbKL&E^K~H*@2CFuY^z*mBIa!- z4kl)TRoDc8WBnafXJ<8ST|W@bO~i4R|D(a@r@T|5hfWcmj%&=S1jpf(7{iwiIoY0v(wff)_P+UIhorl|;Css#3uu{%WW%r0<-MKZ*v_AC_ zs~KkG4f5^Ihh6>tVIx(C{fU=+q{52JcO8&oPl#yNAKJY!S3P$VJ1{|xt*P^pShKaL zHLLf2g;*{xhwmyHEwnZ-{imqC3CRJdR{sp-fPxVK~?5j7piX}NJW2bMM&k@EF zQs79pioKWpex)d#k+DH8e&q$D%26qrIbOyl$dEOtgt{zTgsgEZgS>o}H5%vOLr&Ww zeZib@6p`qW;BC}&M^)+Qo9O!qH;4IZJ9wOA zp!j84YhPql{)Miz6{U4e61Ofm@#{XKzCCUAqqG6eCjv6_(c6K2(6%d;GD&vu`5H@E z$`yOI*lf2>_|E4gi+f_|i^sw5y3T8B8L3BQu@a7D{HbR6SV8U3nfD~g`7Wxof~Z>J zRV8dzr^f{Dv~H6;K^>NN&gEG<_QRJWy@-{5ExFhFvnyL`Pg^o*YkDIXiWMg&_IsjM zT}!4OZ$;_1zpYQ(_I|EBXIf?WXX?+qiivB}PGd!ec~FWW+c3irHn!`ml7C!$Ng(4H zOB=Z;G4rz+uoU@)hK@WN<^Ct1HS`QWSdK9=rQG)E(cPq>J+N0sY>WgXE^DrA3Qy>Mj&+I0rrVa{OdP;?FUb&@6K}};S zljOP~y1~ebhK83h#EiryrH`u-DsHl1ciGwBy{BbyX z_Etgh5i8HRkE{V3+!qXRg7Xyno$a1;kDTfLM@@8x^F1T~+s{tvx6uX#uuKN3&e7He z9x8Ki#q;rs@@@Vx2bqzBS}X5lME0&bNWaRz&#j7xEqBwbY-bt#f9YHQC{**u`V>VXQGw;#@9)7NOW)QUuv%AuW# z9HFkP>Z;0MHSx`tvu@d!df+sRo&NlBo!CA~w{}5i#`tk3g@!fgwxid+ViBo?aZRcY z?vkw6a9zt4W{ELu8d&)sn`jU@i6O|n|~WwuM9!_En;hq)t5Db8v7DxP+Ea+jbb zb(_3T%GoqX{n{H-!(7OAcvOvp_x@CXEv9{etwy@8ib~KW>wm@ibA49=QtOQkUaI?(O}5)vNfqp1 z2qX3LGi1(@#`pO?)c6i`48UlyU+2D`SEXm(lgJY zAPhR7*)cp^bOpH71_j&BP8^yRA>DaaMAZ!l5H_?L*g-f(&y1WY+i9c)$I5PP0)c7Y zFnGR8+`;-s-@kupIg4VZhW*FcK>r0y|34yJ4-fY;kTdF+l_3bl)Fr{43x8!eK~Lbp@I#-fh2TK>GCx zlnBT^`rZD{3;^^;jhzgb8i`1b6M{;!Q=$|gtMi)|Hs$*Z+^K0v|26EHQGju0zkiP3 zAN3wk)eU{=)NfkwD;8cKkpCGopboBIuAAq;0FFHQO~4=LYX;iax#xWVAZp1}d5s0U4caAYj}x4+0FVPwaY1?irY}!?%)x5%D~|nf|Tm`Aaj; zA1IRYjU#6m`i;ZC&yh0>_{Nb$B-5`f0yq-l-S;D5FMhlb(?9UfP&x}x3V2<=qm&61 z?RJ*-CqnAB;$JW-r&m4utKN9djRSDaJD=qo z;2QeP{QnoVB;QTrpHO>t7XM&g0cwAs4WRZ1`hTXj_D5>JZ~si}8Cm=rsXqwk-(ZOZKe(l5PI(!Y}&fH>)e<-@Lm1>NNZyfxk?{nbq`9 zEUz;%2u#GL*WVP~Kb8|9+xFY4{%hl&8Aatsfz<;4RjvN}I!x`Xw*E!f&+-)VgAS_X z0#weIzpyn?{#{r9)9diJy8352eCQkZ_N!?cm?rz*%fdU_0gTt0<1ynsh3<$W;N9K*qE!1= ztlGN${`@wn6pe!f0e8p}Y~d>wlJ6_lFz8eb@KU4z=fI>Up8Z;T9>9d^XtCq89Y>SaZ6rXL=(%44g&|@?q>pE{q^jjL}Ja+=I3p zB~iBG#gfgznNzdL`|4niG>_X9zjLzV`5mso&$9Nf{QqAfp9g&l%gqqlZx!1cWJx?2 zR4vSqAjZ`}3)Cug0bQUKJa^tA>m@jbTxP%zXQ7tJoyI^K?Kw|b)}qHt3xgZ1HC68W zm*5WXzzurtsqk8#djTKl*y^CmZsKek8%>3+a&o{4XUp7fW3=Y!5@$(O-@0iIv)2W| zhajax#TL1_(^wAN5Ifwu*l+@B9;T&>6p_(wO-C9C_hW)Lm|jDIHM>4{WB@9(QVga7 zf|sz)HkiC>;EH<9sY0wuTpy{?YKSFs#qB04DLG^zpGgnqJYii0)IdCWuMlv=rM!VO zKkagU6qP^m$kax3$u0n!{$j}Oli0MOYVJ&oiJRj2AvgP4VR9g58^6iQCAyGU|q@1Yv}V z6Bbu^xs|Eou^1eReV*)kPOvXDc`yus+#o0b!9o`jSgrD|Bh$iwwj$*YbsXNc&^}3h z-XR?Ytk6r9IxjYV;xG5IuU0zZv+!Uy3}S+#al7v!_M0UPgW#F|)7UGbmGU=v_e=tl zoEvG%aHXD~Um!<}?YX0snxO;=GJ~c#(PWL-rr-_p+#CPMjBdoaa0W=0d_0z(dul3(|)2W5pfEDc5V`&79auUuC@v zFPM_2G2ob(J9jyId81&k*0AOz*->=^RBt7vWSj*{#zW&AZq$s%r8bxugC>j-kDuwV zCf;?qM@dp$AoXf&m{OSj$s!k*?l$mVt3&m8ZFcM2aNSzx^0&e*9kB8egUj<`_CWZu1)7EBZjT403J8a0w z*^F-tVRxv=IIsTf+4B@mX1Chi0}riT&)gwInWaS*2%KB%>UL=DQIL27TYaE;!602T zLd_uVz-CMGOOPzVPF2KZgaMPkEzY2u$+<9T=u{fy5|gAug(*Q1NjO5YEz@fCE7nCJ zUZ#1cT)a4!H;CwFP9%(h7i2YWzE~Qib2Vr~Rg#~HpY4O4e+Rvml&3j}YUVHu)HVGOlXx$|6EGFHJyke)Z6>=d?2fR<$h}o--1%rkQCc|{<@0wZWYvh zlXf>xuDUFS-KzC2R`^{)ZY(@R{)cQm=IH#uuzaEQT(&NR?!YZ{o%Aj|Be!#3hB28g zaDiTi(PDxKx((jeb*@eZ{3z4)6-!CgkYj9=snF~=R0i00KDfu7hR0SS zE}h;Y1Oc2IWOcy!0beJ*dN z$D41shPb5Ndx{rHqv&1;+xC$iUq(*xXK;WO`QN=+tn#&(;E#;M$1eqY#10tpHoLL- z_GaBdWUGilxrIl^re)g3Z2M@8?Zt-u$@wjv>IB?D<9W+V`Nx7^TIvqZflhIO&{A}# z?0iZsFYqEy=8571qVK}BRvu7p8=@~3<}atrGM(N$1k8x>y5pm)ec4mx^7pZ2k)UO!?ah=az~jKOt#wLsgq%J3 zi5dtx*!YTtS#-a2Bn=dl5Ab&6b-0UGOVi2Rs3|6W9na>(FBRT=VB)2Jo&Hty1W=5p zh9|43y9(5*(K_(rRjMl#K#E+i6zuMGQ|aF3p+E_z;?hj)-8mFGIso*gA;JUk`^L+E STh{b{lc@dQG}>jqj{hI#)!GaI literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/arn-region.png b/static/img/210406-python-sentry-aws-lambda/arn-region.png new file mode 100644 index 0000000000000000000000000000000000000000..c44697a6515c1da84da5307a8a5d44a7eecd6a59 GIT binary patch literal 58913 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%0AIArde!_QXPpZW>qbEFYEXzBb;@OQ#Xk;!uy`y$r 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 literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/aws-lambda-configuration.jpg b/static/img/210406-python-sentry-aws-lambda/aws-lambda-configuration.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f5bb0e0599dd10d7931e9da256c85330a5311d8 GIT binary patch literal 28342 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�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%0A#ov&!W7s%%c=RPk{>kS@=_1YQ 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

    qA;yPSSx~0!3=L_YtZnw;f>pwQ!VkNL>vvq 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%0Dqo%(-u&>{#Z%G4ztr}$tl@zA?-@Ce@-b`ek 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 R|NW=`HpG9K5#)d8{|6bzGK~NL literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/aws-lambda-python.jpg b/static/img/210406-python-sentry-aws-lambda/aws-lambda-python.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3ba26649208f2acb15f6921e33a2c6518f277ab GIT binary patch literal 119871 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%0D7JXxT8{qCrI!GbHpC~;aH5L$Ra*ON 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ëYbVL=@_Gqmh1G&`wYzH&~nIY}11z zV_Hm8Bf2H9m;g~B$YLyGNGxNB18r&alR+WP>f(&Y{!;fOj@6qro=@;;I%s^vB)BL{ zv(RKc*56J_*3-OO^K=m;2UwA^%3M-)M8FaQPRt=Vf8%d zYs^QQ3vrx*>9cnXu7zD11Waw>&-@0_`yE+&QsIb9+VT(}zu`+g4Em4AdPk4QT#v{O zi_O{YHqfR2AoC$T=bVJ00}3?Hs)16ty{~h9AtI`rKJCo}O`~5|xYjcjCqX+vZ|JP; z{Ro21tdVU#pd;;PbVOEbdB_gQe%+`Lc4yY*38<<7ARWvN)B?O;51dg|j_FF#?uPo4!Rt@GFB!vI}E@;s>I!R=9)JdRRZy~D5v zy;%3u;FFnUQzOFfe#`A^)r_W^v|Zy|<{fqqz95+dhF8SEPGVEBFNn+V&{UUaFuFN& ztvg|zC$&Za?er-FwU=nl?a!$PD#={H%WgF&VqfN5IuFf`!D^EEB=ZfbsR>@ah73_u z#kd3;)sApk8I&!cL}I_c!J!`#o?gn(2N$`O-Q2d6#ggai9eB%;mFe zN%}~wOR7>1?JsZwgquV#Mqx^%W10!q--re?@c1ifz+~BD^C#LW-rcO$7g~R6@y_P9 zx}e`+j$SYmz|K&|S+-__sbIEP=N#;uF<_t!A)Tp5$z(VT|Kj&zqhu+8Dc@YR=)#M; z_Q@YBG##x?2I5*DJh<=@q+giF9Zju4>>`w7ksS@?u}V_*)1oyaWh~wD*B)S}7L(A1 zsLi3S889N0Y7HTmdS0e68lXe+5yi3Tkvn+6CNZ)63CteYi^Stj zAQ?SV%!72 zuk#umOEGR@UTr3^l>AZKZh%*NFzT$`Zs6|C@=|{e)mv$rWtcjEr+oakQIw*4$22*P zFBB;s6~JL(vJ9wJ)<{?k?eT4|F1%A|@Q9_YOE?wDcR=%`K-c9?MI5LjLO1vsZ$4$4?uO8Cj{Cr8)F^U;S~b3P`NeH@F-I z16gRi!&miN;72FJ1BR5CQA8gs1BT%#QP#0GwG2>u1(@oiX?FFg8a$5#Gf$=l+|E>T zhAhnR5Cl2}fU>j_8_|rQ3YguwLah^3#Y;T^12H@R12>XN}NweY_A;y zkF(z{=etle@Z3HVj`hjGNp-vMKxw-7L)IKWJl~~df+;3oG!mQC*G|Q+4oy7dM8oZaBZZ10>ce*Xt?bWF_ z*U3uXyi}-^1EO1v*iNYlDUy!&y(6+p+jiu>w0?P-*fQw*IrksV?Zd-B^LIi4F%Y=m zV?)B1?V6OlWjGUw4yw@BVEfF2kLM0Hv-ypMWoM~nX`n{=Bj%fa$2^rFYL}I6Ule?z z>fsAG3tWLIVB0%@$clL!nr1qpXzS*@-?@<2xZ>Rav5)Wimg^qQE$9svwO%?+%ap04 zHoL>seNM)Ez&HGn>+{1s3&noJw^J>)-i^R)_0(TNacO#nd8a&-J1j&}rdjep6WGVt zY(oR+D7ZH|0XkRIW3^goWh;ueGtLH5_>uZFNa3Dag4mtz7NGhPRvj&6R5i9e(PyNL zYe_}PUmVCYpOk!hVb5EFtvRDXkiDGIQDxdOyxqlU{Nz&kFB&VpS$Uj**-hPpwvoB_ z8EQjL>&-)!5vJST%@O!!#{eM8Y}3j!hknEG7x-hG&Mujc0NROdsWDlF_HJ+O;E<&G zTCK=p9|@~;QA&>_Q=3T6$FAxzKrmuKABnFWhG`bGyv+ToRiaoff%qtw#>2zKY;rEW zM0BC4BhKs1#>0~*Shix0onWN84$V{CSz0yILx1#`(^uS_4ikZho!|EWkG5bu8A_G- zV0W<*(3y6As=+3O0w}mG8Z%t7QgzRP*^=gE0(G{gV8Vjlnb?hVGUY2vV^(dMpb?_p z159HEhY5Bge9msCS&2>#vmr)9DgFM+Q`(w^|*7p0G=91Z>lx21@_ zhZP*wT)#BN$fY9vF_vLj*mMGz#G=s0kKdosMdj6wO1f+xEQE^Yq#RtAOm0K*cvNXd z@VLlSKO>vzpR=T~AQW_@CPx+!oR7%v)MwoqdO6>u1CYwb&ndgSR)?uD#&BfqFYMu<*FKAbyu4FyQoRCV-$r+YkaV1E>0mEbVIX z-2Jcf)Ez&*t#)=C(`|~lKoGl-0=tJN-C$-*7sVRXcel_zG3I==7MG znFHqTqEp5Rf7?1kK;L)HGylGG#-xK*bB@S-;28mwyvihHd;e)a2*hkyO0r+@jS=)eBb;E#u>9aeYAR`-*Cxg?&y zTvE;tN2M$07tMnf8OC8+fX9cNC4m!27{#jpcxX1F*V{@6q%qcmwvxOrI#FY@eTEd6`f0+ z9wU01l>l7xZ$^#`0|0CSua5(wnVE>UL=~(}PTrpUxOQlkn|&eIYiMqTUnqToDsL-F zwXRkF&E2xc6BR9Nz((vkuALMBlLsab?<``NWyM{ivHOHMxpv)9{^w)j1}P0SYR;+7 zYeWFc5Gp`G1IQI69^mC`93b7yA#uXz!iYoyP;0301gx&j{< z00Ky?0F;T}d%)Wn zU_V~K*cuxvyyKUCcm{m-{PpMH?uA33v0_RN3!W2<>ig#CWx$Og2zeV2#-VfxL7svM zVOJIb{o$soxu*6*Q-T5deS%COws*xl4braYcLa{4Zm)=S_g~2pcsU#`elIb?dr+vX zJ&M%}*u=EJ0HEJLEy4HS1v?`Lq@oi4Ep7ds#Gy=U4T!<*G6J;GC;upg{;$wBe#V;p zdHk#Fs#yGyUssn-NNqv&91$7?O%oNs;>5G;c5dQy`!$B4nQCPpb7o~ zS8yO%EyUFc0CaQ!egFV)0c;3100j{QzyMF=e`C-9LJwg5kpqA+gyCP<8p8W;{diXZ z^KTu{=br?Y0{Xfx?~l*d82@Ns3BHE@gE6kHfU5&Q=Dv$}fVaPkw-2khuqYs-tfhnb zClB}wb6x8Jq%%y(i)la|=I$fBXZvX7h${pMQcFd}=DxnJy4GE_KLklOY<+w@Fh~Kw z(<{JFUqhMI)Xba}XA6u50^kGK0JW{XzmL-W`**Kh{&T&?|4t`!e_{uwg|2=5TmHX= z$Q>O0?LpF(pthZZzr81jKL7w`w7rjC003aCf^v@F0H15@0%A%(FhCH)uCeo9_~|va z`wJKU(J|Cl0d-oyrXsYp^>YRQ;(k!h8f5Pb`XT-TVo@&#S1$k{p#-sly^E~_hz&t3 z=;`TwjUR!S7u5FwaT$nZ?Eb^2^M7DlTf2Yxx3zWt7ygSEXbA?P>gw;~VH^7A$N$Nb zr$-=IcYhK$cqVl5)6@sAAScLzySMf=CIs=mm)$*G5R-!#?FzE{3uEBB1ZolL5|v8aQssy2ujL9FiOaqqhAujO`5uIgGK273!eh--k>b$wmiK5_I{GXOE@ zALFH;xBlN{VZ3zmQ&IZcw%XPYM1Se`2f7E z6B{(n#Z~Lt7K{`6EWpL^dbEM{1AS+2`zL-{5H~q`Dg9k1P)kRD)9cv&@N#feRRb}| z9s0@9%jj>u&^4a`Zu|2Qj^Wkip-!m~sJrhSzd1PRzSL z0r#)#5R4P^ft&4}`ydA6!3+ZK0xEzizzPI{haKPzxB;%8_M7*?Uw`GO1Ga!4;0!nd zLVrvCu`v0Q;{~1#fH2?y@B(%G|7EBAC)W`O0_7L~lKy2Y1UUW44f#EziNKcyK1UqFfLzkdHyx;+@H2Y6iP{jV}5kkwtV)N8H4fBdqN{G*AjhOLUN ziLH*!he?mAfGLZ47d+nvj~kdWm^c54_TTzg+gOuW2&`GG4Xi~Q*J!{0RuekF23X2p zHRTA_;(sv4is`C{fhzc z?>hfm4^I>i1CIvpHXiSPwVz2{Rr*6#($Tu{-+I{|5cj)pLpECc5(fe&Odx@ zLCJNQ*S)}Bv_f=O^!#rxK!9UN0N8H<6>pzVKUZg$09GaNDd5PeiDg){cjmh7kE3M0f6Bo`#`^- zzx-idU$DTt0SP#w=m2Jb1KQIH2HXL30YktHum*db3)r9ifM5UyL;-O? z67Uqr2J(Ocpa>`fs(?D68R!6dfI(mk_zcVf%V7W60=@xA-~>2>Kp;2}A_xV94#EQA zf(SrvKx7~a5H-kMh(5#&@&Mut@qz?GV35aVlYxMo?#SXRAMw?^k9r(%wlX{ ze8cz&1)u~_YA7322r2_rf$Bodp-xagXaqD7ngcC_RzussmY#-gK=+})FtITyFj+B$ zz&@;rX@qHy>5CbGnT(l-S%%q!*^fDm3CBcYUSbhpF=7c|-NMqsGR1Pn3dV}V%E2nZ zYQ!1CRZbOAdew0BJU&Lq<~UzP^eJYQ#__9rWl~uqQs`;q12*u zqfDZ#qWnaOq#~!1pfaWkp?X2pNwq-@rRJvAqV}LpqpqW#qyA09M59FGNRvQQO*2Jv zO3Ofdo7Rywk+z0*mi9LtE1ephJ6$?mGuP_QVlxUyuibhGTS zQn4zrdayoY?Po=@F|uj01+u+i`^0v}&cklR9?f3EzRH2mA;aOsk;T!=f#hW2)Zv72 zR&XwH;c>}uxp3uj4RM`v^KhGR$8$Gxf90X&(c%f?so+`RCE``&_2n((o#Dggli_pc zd&T#eAA?_#--Z7L|AYXBfRuo%z$<}CK`gKvug^GyV9Jd{A zm)zb_;!|={s#N-}EUN6M+^Br2a!ci*$_G`bs)lN!>L)dFH6yh=wKa8ib!YVob)<%* zM!3cYO)O1q&2-IqEha5{t#U2o9qBs{@APXEY8z&Oy3>Zl#@43(0oDVP2k#!7+v?gD+WxfDvU_QVv{$juwg2XD+ab$g*HPXv!*Rz+ z-YLWBtFydwrt_|gqDzj;zN?CBo-4{t)2+bm)LqxT)cwlC#G}R&*YkmAs~5SKyH~$A zvv-L1q>q44oX>{uE#GWkq@T85i9f{O%D*Lm5}dq$4CD=r4TJ|N1ic7C2O9_1hmeJM zg?tR<4^0T&2~!Vy8;%)nAKnXNgGIsM50xIiiGW1dMf65;M8-sJJ<@no7KI<>9yJ~< z8l4gSZdfRwEU;oPraVbr7NbFWsqfrWo%~ZWHx27W+i6*$hOHI$&tt@ z$i>eM%-wi)_gTwx&gV~`pXa&c&Aw26QS*}VWx~tTR}QbH@^9x?7cdnh75skf`g-Aw z#+#->?!ufR?4qEe?PBBNp|>(`%S-4>l1eU0y-GLA^vn9orOV6TF}_Qyz^DkU*sZjz z{9L74)lw}~{icSxCh0x!KJfis?StC6I_DTN3 zG@v~&Jg7d{H>5PwJuE-mF>-69byQ}wc}!}o>7(Sw#&OB<#!ph8nkJ+tT0YWZeiYXeq+I5;p?KuB5EmU>1_GY3f4;ED(Py@8sl2w zI^TNDhSWwUTowKiVSrfPwBP*p#sACsR?IfhcFqpVPWjgxUpscycR%l0>}`GX`F6G+ zcR+UV@;mSMhQr&3ACacWEtDVX>L~e`?zr@a#E;&e_kXUPc%Gb{CZg%kWxr&84gEIx zy>k|Pj&uI(g72d3Qu}h{%Jb^V$JWpG&s^YoJ&xf7uBeYn0f5L104P3#^9PH+)_i|7 zuGh4GrR(eefd5(-{!xEc-zh6P-;^Gq5CjaGn^#LHm#lXZ8ghJQ>3^E9m406>Euz=jLzzGeQ z{wV~40ma0^#=*tICjb>1NdXK96pDcf#lpINu>g4p<^z~ySmbPCO4t;7wm9s*lsBT% z-{5j6*Y;59Pa-+R?fjzg@TqBN>FBw*d3gEwB_yS!Wp3V5QB_md(A2tPU}$7)0#4=Z z9UPsUU0mJ#0|JABLqfwI$Hd0PKS@Z;$jr*l$$j=budt~2ZAoca`MbLMhQ_Amme#i3 zzW#y1q2ZCysp*;7x%q{~B{*X9%hvYJ*WEqT(eaO;C#UFNzpr^g0O((|{>ALS@gf6x zVPIlHF>$VWK`?^B14@R8#U_SLuB3-!>r26YBMO&NIsHv-4<3iOK9b7LZxWxHQv%L~ zx~BGr+5aA~=>Jd5{zdHHyq3XTw=2k)P(|NZOLD)=JG;A#mVgo3ZV$e?6^B5?7sFp(E1 zeEebDH-a2xxyIFvQhPZ!;?>1Gw>4$&;J59Ny0#W676o;u5MxkR2X5{_P4%*h_^NWQ z0C~b4W3eo|)9?sqSGCY5=$;MLc!T_t?c;ko>;pe#(+-GkeIL&oi%ArvM{OIvyhIC?x==Z#@q_-Y*>o7w-l`XxzZz#CJ)BD3o4H%aF_%H2bvx4 z+4x_!6}{S~HLTtf>16Iv3rXo7d`RCn5W$VS0un73mv_xO^Itg!Q@#C|gODAw2-T~u zHe#kt8W&R)9L8P#mT?6zoZC+|2rT@N2O76anY)W!P8}=1TaQva^riGy^-5R8fU{+W zsBkNBu?mr^5JaRsCw1ej3RqHy}m)1FMk+DgB7 zBRWZAwOX(;@ADJFrFfX{TBy0b`1Ic3O&ku6yn~9wD!OS`LmeBddu@TXdeS(Nw+maD z!u4l=2=vePUeu`Ll7FY27PmOQ?DQS0kqO)bh7Yae8^=4hI)aTe1V4|ynf$zErmIZk zG#NbC|HIHe2p|a^mIU9kz?sxJx5|3iht*^&7 zg`|6s=5E$b`^}eFY;s3{|tuN$qhs+Z871AU1@fM6xz13M384?`iMQ(HHca zdQ;QJ&vt{FbAym(8HOvvstOKLijW4#?S7*QX>sGKJIxamy3yQJ$_ zE&27Zvs|$ko$I|xSVSf4Z>@!95R#Vj_5ECuSSBTvm_ah%l;{X zF@_3P!m#9gqskG+T7eF6#nC!mf&3qS@7v_n6OWjr5lydrtI&x$N&^M)KT%=AFSk?GX*5dpECp@IIz$v2mWbNdbOI@TM`Sf@{XSdJ*`6tL_4g_Y)6t8( zaEP_Q#DK6ey6Yydll)}jUpJfjUgKSL$fQ5+*)TTZ)V_-Qvav&(_*Xi|&EVU5B!nuy z8Uh4GGhb_jI?xly@1Jn1BO7>H6Ri}4EFQi}nf*-CN9b_(R9Q}f)HO3u4!RZXK&JZY_b1yBk8WD4(Ha*kJW`Dqolqdv>l z)s#1PH2!+Jw9`m*lp|!dqk$vr>130}eYd74)Z;q}q?3|0RQ23%E0g9D$L=074%J>tG8;g={44q}IJd8*9PZ*9g^ulo=W`8TXxgQ>ec;Qsw?A3T;4GiUODalo^Q>CgK|C%8s5DvWp$j|L34>m;6 z_jH@Bm)(CmrG;@fwpfI8&6W+>`xNSz(><3af5(`gtYk1U+WYn7oxnhcFDm}-=jzQ# zn1cDKzD}gpddgSz zTKC~BnbUD(Qx*B+9Foc~OlObVPM`{UlMwPWO10W!=${FV1d)vvW-B9%e!EAwj6}6k zsO>GYtb^O_&kk58hkL*N92Mw4hoExRQT(pIty>OUEBB{(Z2CMwMk>1s_A#?8|s@3 zQa4DHiHL=;Cf6seoi}Y*q#w%}!8`en=$MC0;|*M6sOwj)e&zV~qXhLn(4`(6v~S4~ z7qvt#W}JMy(Nlt= zY2F&Fc?H2eV`rO|De}?1Y28_vkgKCGQ;xf5;G1JkPEpL*tY^a?7#--p*C_C!*@yb| zL+rwTVXc^?yB-Y-mAGrxI714XGQP4!@jSh8kn&PYu&4sKr_MP117F~AElAc=eMh6d zah7zV#&mVhn5@B%L)+a>dF3Wyk!|uzs)toCQ9Xky=Pqc!Bv+A>tSYS4#<%bm3)!6L zwY4kYQa*oAiFwRc+UWSsOFy5R*G;+?V3LfU-o#ERTKJaJ#qiA9J&dtd#h);z8GDIF ze7UGN6U+4RFaJ2T;~T5DS?Rs|y_4xRVy5p;OBlP4+v|2rAMhBs`bxee376B_(($GL zrT5V`GptBPuAGAqLP_h-vBX<*GZ!%wWjD93>^>HC!%d`EVsP|}`P<(w34&UW&eH{6 zVp^?>lj3kfdihON}+eubf~2YuK>s%`r2 zLB;qy33b<>bYAxK9`u7}1lmb6^nrtjT&~wCGpfpBf|?%~=jAs^5+XP!JIvr$01?`4 zz3=yP6knVLuCOGY=b`mT5JN>>G<&`w|E4RUc0Iq3MU+zf4f)>0FXs;tp>kv!<2C~o zj$EfFj`jE66TXI#VsGOQ==rxU@bSNX$!L=M&4v63bsa`Q%o=jU?TIHJMq39FtumAhIGky)!VZ@H0tTTU7u1LS%*^#k`gKV?^J{#M zMmYMvpJWI|ItAk2Va#Aj86H*V?}KTe?&Z3_-D^8&j^CN~ZhR=Ko$twUKX126z3{Hf zcX}?%U*qIh6Ko>~V_$4Pruh_hh39S-$u}p*re;)y!!N8SG^dJk{Ob+FzePDxwi*f1 zKdf?0My~ITRF^8FYEtBED^|zh4>|5$0Wp4khA-}9ocum=`Cjc%mpj~^fomT-!|5mR zE;N;(?zn-}<+=!q!VcXJiWH5C^xtkJt92+6#k~rBXFi5`D<;!zvZTP5t8I*{Ifu$v zh0gxihlH-uv`Yltf!1F}B(E{o+F)6B7*q)D#~bO~2qqf}o1~4Q?ZcyIhubvT%Q9g9*+t%7&0Slgvwky0D{IY?Cpkr{~?PkPRx zIcZJs`rN5~u4vN#tqNgYbV#~zljZY5?KBdml#@^lh@iNPtYs`)xHGG5h|OkGeZ?}J zB$N1^94#1^FXGu1P$!AgZedejD81;dqMkx9Y(tj*YMFDx^UI0H&Ga9gRET_h^m7D} zbAOvnT!(h4>(h}c7td;Qo#M5Tpjr(IJX@}=GYVF3|s%iHc3`}1EG zkLPNUnFDP}=z6W@If;b^5jyKdU098~xOER!V`F1SZGW#4nQP8E{>P%R)q-cqhQD)r zYp5n92h(jUc1Pg9&Q07AuQM&~o(`j|27)D(t=Yu3%>dz>{nOw^t3VT3~m#X&o>40wnuaZTgDrlVa?U@WiK6RS7gm-9jV|s zxrao2iczQL{lMRf6>;zoOO0wMY0#)&>rRc1qRq@+pDiEw0z=2Ud^qIMx4i7BkVs84 zL3p10X;=cI1_ilX%R_JrTAtE>Jb>Q%xqXqTN{QB^b+$=Z;%~{L@B&5ab3T+;XQd7LvGr`g@b|;R zbAjM3v*n2`HI{g<{H@JZj_*M)Lh;e}OW!@c*;)nTofnqVeYh#aVAK$=&&<_;A}(P1 zNG=Dcln_a|@GQa8p3?*$=!xd@9H<@S#)z9vd_Z3_2-g?`esW7CqoodTf;XRtY*i4Q=>^~?9JJdjnZz|&L zikhKqETYUw_j81H3ZXwr~l$En2qx(9#UzU#*Cy1np3BS)&) zT{yRS)$g5S7LTy2^<_;}&FKPCpeDLL4Ikatn`d3l7<9>oTzdsS6|a+amno7v`$`xdeu0d`rL`Iz*9$VrLwI}0)sZ^h{oQ-nj0SxXd@b9 zh$*aea)(cDnS44ayux#p>lfFr?*xK&cYEWV7!x5fVo{aFkyc0g> z`g~kWbu;z=U3u++)~u*bC9F)v5NO5?{#ije8w)da>Qp2Q<2~o{d7{>IpRt zQ=a`k+TOnO;-k%^RlVBTns*q>JA5Ur!N;cwUD&$Ws}k}kQL`0PvEsSOrgM-+38 z-EwnIt=&e%>uWKf+thUF%RWokB(-{mds4!NAwugtygyk;(eJ*W8bHBDrM=(9bE9FnJi(IW~nw{EB zCNva^IdvWimM)qp3$=nWHN|B`uadHv88&NT+H#Wvy(z8L-dQX!qvP*Qv8Oo1X>mrM zssWa=NV228I9Q*v&w5J;B(asC-3Y$DfCo7x>S%E#8a5wsw5INB zpTxG@*2KD#CUP2jXrnr*(O^582GNa;5LRHHl1z{c7n97cG+xRnCv8o<0?bln)uW0! zV=c{x>5a+p@N;fUmCFF@F~p);jwGfue#PxZ4D zI{Wk1;EhUR6_VE=k9d9s%O<2oYQs9s9=%9R(Uim!mYy7X`%iPhx}`&GtsR`^X`<9F zF)xz+#DrSNO}eUfdUX88)MwAx;5v3wLCAuMN{pC{=a+j7&bx6Xbo~4B*{2&!GR6$&14e$pgMEGd!R=tbci*M9ZA8#G zD@O7@>N-v#$8e(c6iK1r`}8l3*O$zll04mND7v!)i>$Rm(uC)gk;9f8{5M*Fr;CH~ zqltGsU}Z>8MYwT|`@=Wie5#X5Y+M!CF6Z-Q)!OrATdW7Qamcmh;tWJnmF>OT-WX}J zI=yp=#P4v2-;}V@Rhn&RZ6qQlvcH?+b+BU*+Hi4iSGdS|VQUUSqqbsl>PMI?tYq_s zw`fVsuV}P`3z^$@$uup2Ta)L0p{)`vGq5xv-=RNReN@ljvPI@8!eMJ>vGw8RK&VG| zeacFXfhmz68N=QH@tP<`T z8;rR-hTGEjcrm3SYD2A^3j`}4RglU;zZSu}-V|zWxXN(_yOSbgI|s57U>Tai586{D zp7*Jb_S#JzV%6c<7nuM24)Or|khU&b_n~WPh>C83ew-?DuKk_cG*!Y-0dW!2z8&w; zI>+mF%-Uhud%*CZcU%{#dyWsKy(iL{_(Ly5UECs(W~QaXy(R!;03nomA>N zKdh!}C&C2czW%jnNpwr&`Qo|M`^gSn_<^%hdR1kE;jG+pXi5IIS%IGBeX1N+#xfg$ zY#tmr`*ZAEHYB{F2*Fjq8y17h9Yu_}q|uzVt)$t&OVQIj-W|Iw zjWPO({lkj&<|pfSQAC|td2#P^Z;4-|FYM+SP2c(bDqr<6ELSHmKwoXC_Arfi&1QTi zqzI1PTvnRcKtkdsMQzQDs_J}OUBq~DB)?i5gcK?+aO6cu9eYk1L8G=5Y_@Sc!!Ibq zwQ%_5Yz)yBWou}g!QVtprI`L91xEC5U#3ws1PyXEk`<5A(kZxmKYL@7-SWk$wsAc+ zLSjbaNx*@k=@fh#rc+_+9_%hzc_>FCwY@MwDOktirL5yX; z3UrVn$uM21_O~{=o~0on=%a_OQ`)ZG4cywYWz|JwH@yYM@=Rxbz3?L?ZRHg0Mt1iq zZw^=sq2zq6EWS?ohC9N)em}6D(=42M?$yZ0k$S%_)NhTE&CxPu!?QC#-E8?|83*d2e|&y5%UrN5SAJ&Yj`OOG@-m zulmG&WLHgz!t0z{`7iuLsWxZMjK5} z=(&8!UYJh)yNsUTjdn%+-lJaCXbaoGw(Z-MltnLI#@xr>NInuhq&gQvX(UQ8uwYLp z#IzZ8&^su4hu?IVWj!Ow`ZV{YX&^oShFvDd=%+iijAsLs{^0OSW!~(`X`*RMdvY$E zK;0ddirIWh6HFa5JZdT5@{E;`hE7eN8qbr>f7J6roJ~;x%Vv<2)E9^5k4wI0>sce!DA=taxdRYIe6H zc4JX4LyDR;gF3)!`3wFcgHLENT4Pfetx|PKpqPZL&Dm}zhUEEvaoGEQ+X%fy9ZrPtKBi1x|94wToE0Fm2 z*p6{o$CG?@Lxgx?qGH+7BE)XOVrqXlYRaT;hQqXq`mWS8R~xSxZDi#jJX*6lQUlF` zV0fr_ueN(8z};yICLR8IKsei8s3SKm*h8ql*=vd%HIyc*4w3z}I;5z5-3+QBr_o)M z%V=o7)KY02{ov@}H}&S}pB219us4CB4)0joV{;+2kJ(2nNuJ@qj5BCoa4CG-bV_fG z&s+GkH<9->#{WeJ$<^fFn}ydKhW~#$ijUr20r}on0IUF6H2UH)wEN;HviA{3VeygE zzcWVuOGe4RGyX@5|C;eXSmfJf5oY-)t}4Rsg54z~Rh`bzj>HG=GOO$E`tkS`aF}^X z31On*$(BApjy(Hv1;jG{j~Ryl#Uk^6!{WcX`hROdxvinwRoVIzQy`9CuLv%Rt^`1&wPSL`w#fg|&g;?>kY+v3xS=W*z4l!Y0}r7QA`2N|m zEuVEheys=i;#<&@cJ}1N^Ko?5rs5LCfKAiZ6|nycSuxbt^V?|WQI%vlPfM*f%BkFM z#8xE|)SFZwxj{qvR;ci3n~_{b*m7 zCDJu)YZS~4&eRD=ogjT~hCSW<=!H@G;-~wHcCL5;%i9RebIFUMOLjNK`rHGal7Y>y zFz0vY+)bU{MChfV5myl*?nc)tE~gY&Iafk@)Ps(T>6YXIw~JiZ%`+{S`ey~E^B{Br zD$Ko#`cy0WCrrTcZ675~PNu~z_4(7A#HSu+j@d;z}_2&hSIF$Ka9sk5L*3 zsZs{;5oF(gDKz^wA;gt>(paZx^$8SJ1AM*|__ij2RtZEs9#m}n!c2{R8|)nXZUL=6 zc&ghp6|hU$kn=m>M8ALPIdDIjF~^uy>}mAJU$-x23%gk^g(GIVDI~!bI|E9Oz3*mItuLvlj`<(jm$v6yisPXhMMdif-&cSav3Ij|JES%I?aruY6{`t0ZAs>{*%mH6Q;ImObu0ym z0-T6hYjU(STqKoa(>uB&xOh)c=jT?{$(y3RJU_aj!vnn=nW|MWw!?&x@tj*^zuSKl zcJo9KFGYN2X~<2BxDgU*fSyFK5TNaQ)+A>n+O<9D*FL-P>^Q|zqYxLXm12(yMU(f} z#kEoeS}tC837zYs9Z?pWH2cS>vHp7Wq5|`-9=bwhzS=%jcKH?48xl_aU$9!8QK*7V zXhaYtutoRVNG(F=oB&yHz;k8;lgT`JG#4Qr5)VJm=V<9rp!pntTQ#pUz0s5nPdnh> z?SkKZ;-5n}NatXg)3BX#>wqsFvfXac{mc>TbxyFXGpnjceH5H zs+ZU5^Uj76nx)>>69O(u3cH27ohFu`2B_p622rB zw_ZNei5$7O9PK^~0lzKMilv7BNM^?A6pHXUcR}q8Oe9?ajh?ytuaJEMxe>r*fHzT1 zLWgekZaT-Fcx5%2r){WFjv!7Nrr$sU4_;%PoIJuNdA*+Jz+%HDYE2xq_7=tSp_{6z z#z3=mUX{ma>TsX5{d*3l&e#6eU!L|V#j4QV04pPJ(nfBtps{qnuh7jTOsW=T&>LiO zLNVqZ=&4YSuY-xK)#3=?;s5%f9OtQ8$iv(L@Xn%ravTruej=wLe+Bd%CUlWr&LfK{ zo^?%lmoLV;!W;Q3*og2Yif_uv3^8IoP&g^<=IeG|Uot=xBt^QfYUrRMst=Hx2+T|V z_elAdX=Jg^$i{xs)_6CZv3DO2T3@h613grkBnP%A0VSmLf!LXjrJKQeh(%u*5?T7F z!M(+BK_e9Uw!Do&s^k5L+>`OMPf_#y{*6abzt<1dBJ|c^6c;r=CZfn;J}k`VTGIV5 zJSowsI#lqwTLiK32i!x$N7>S$HayQC#s0#@xdVQPa0R$cB;*TRq$!ZV{L!xEX~gKX z0c)OVi8D0#zcMl{z4GS}Yxlo#BpJ7+36fU6z=npsENuNvfI3Ayoajk=Y%PQ?cP<^O z(1E|Yc{n#}W{z24&&%szWY>yQhLiU-f)YLD{p1QDl;c3*Bc^2WU^;Jhf446UaA-3U zg=5^cH*r)C)L9@j(i+rc64+2oTPN(2L`$Dopw|&1$t;v_Q7cOmahyjD3k}0R4rH~n zEJKrpsH|R=44Mu-&*}YA`w6Rn`P>(!`#~4Y6WLcl8GcBXg;rOE{se~J+0b3o7_{a?i4570p-aA{SnVy9q9 z)w8*O7{@}dKz`13QP4%!hf*25B^_HlbIw%U_-wX%YGwsjh?Si7G`-z6a5eQgrI{&7 zRas4vqKoblMPFX`eg#Szq4(bUc4l74z9_nk|y*y_X7uN@wgO>`=hJkccB9n9V_ z-HjwET^Qh=Clk0VPs`_cJeV00wBBzVrt_+?swC#VMb&VFOGhhHaY&DPp7O?U@UzkL ztk&BX+Tg>s@o;GfQT+xSJo)muu?YVTRMw_GG=%r~3VUP@T z`?mNeyax(Zb6xx)EPd;w9kR$8qZxV;ija3pM~8RnNrw?G9)Nglw&4)-XLaa%q4S&D z9Tl6UL*p87oHPYW^sO#t^R5B6LJ?uj(MPe{CQqYY?&N*z_9(zd zpQ_DAIv(QfUW#~X5BQ+l5KAoN->4JBCC60Tg`JyX22<~|w7gYX;#!5U&P3v_&HXo-~%$5}`)q_w> zyX;5(=*MTuYiN#>=V;qA#gZhf+2(#(A>%zAo$pLs^`266PD@W?__(hCLBe|B8(~P2 z8K#OO?~}TE6i-s57s=w<5Pax~9rC2M;wv-T<;VHUkIiFF8Oz!n6O6>Fe(e_Crp;T> zx^@g29E|~~0tQ8=?xo<3!Mq5eklZ0_I&@n3nrqnHD+Ehjoxl(oYj3)8wB!nW=8d`m zGx3%k^gYYFz}#v#lH#vzaTWA<%%fA`+3K9wqJy6((=#B00!MwDB17dJp=b9)DmJ>G zC`gb*U1Fjm?Omw`RvX9P<`mVqou(J>zh7CYh@xundXs&dU-u(JSoYU$C*5QPj(L~` zs(xc&qW?u?QUnchEta?j-c2d^bRx*}@If|rV{6{3F^|g%p^qu!tAz(;rX;Rt-!t<) zYq^W$Mw_K38zPHEtKBy1*0K~buQg4}uSa9FDn9pRj$xIV^;;7#lh5mz5$w7se>lnG zOP-a5lIJ3c0pV79`ikK$!AFZiAH(W^ElU8FI|IR^i>k6QamDVJE%2=j<`)1)1?*1#JxmGajpkE=b49;p_4q;YU~T@;Jt znBLg6xtwAlvq9+Y51`T;wSG**v(N_2PX0W=%eyJ)DcSzSbeVSLbuKJZ=DxP40L?09 zrUoxd*$n73wUV310rghHNjQ)x6P7OPak<&ty?aaXB3%>@PpuXl%pDkE$BHue_ zGggN_?7=1e_#sny=%fl=zsZ8;8A`ikU*GdAKG#M+EE|Wf8W>Dx$Rw?qS@xXG7@Iti zcz>r*x%_<>;@#_5gDjHSG;+6^HzC1BbBGkDhqnf|5A5xXtX?M+<7C_<&--)^cT&gsB zrEO>xgwBoV2XbmQmKSq->7DX&maLkW8sJ;fOLQH-N|NJ(gK3@YWA6hsxEI+9!ipaX z&|HDJ1MVSqE$yGHU`kwB;?AQPC!ThD0)emxS;tn|Kq!>yYx8YIgASXjF?a!qVh4K-mAcR%Sk{rU`QF`Kx?u$enZ=}U_3GIa$(sN$2rXmb%y?su_ zdTVt#wGym2oCM40x-2m?F{3h3#E+30C;4;T&J}4%T|#ISg7@5}I>hOr-KknjU46@E zj^>s|SM!krBg42Ot>h7kG85S>Qc+mYIwCDqfjF{W=^J$qxC>7Cp&fPhUuGC@XubTz_wTTkw+qqUb!b7=3)=fj-I`7|-opPs+(z67GJZ zRi|wsWOM&fV`W*7+<-lYZGvBvtsG&_+ff?D`xWCu12sVNKpdL2Es2FrIQ9y_W1But z2uczEM12`t&^$7ccYCor5@w(G%NwZ1EtOEbimn;ro-`0& z%)xW^_=IX<_;U9~ba8Ra;}12do(kkJ{h98K!n`XW8fTD&blLs$`Aw_a=n@85s&03w zw&uZtFTZS@Nd;tldgMNq{i;>gE@LUO7Du0zhgh7vK;nGBmC$y7p-As~E45Ur>{Ntt zuHXT&GAFx~mUOmW#xkgbki{c`*97p zqm$WZzFk4-yC)i|PZh3JoMPlOtg-qso6Xec%n)2v${KlB>ttsSY$WVRAxA{ANk3+U zx>>lT?k{{`F6rjIgt9ELoIFR746O1Pp~tGw7JbYlsLSTU9^w>N_lwGJltaTQB96&V zs%&Eb4zh;iFSVJpdV4mtENKdSk-eknRU`qzInk@bErQOS8n5J=30!R@XX(+)Ctvs> zva0+Mo#i6F16 zE`t^(`4V*f)s%#@AC)2a9X*29Je0ZIP9HZhG|VUSftfky8kB1 z;<@+yRvS6;ST-<}}`H*<6X^9Ggv9nGJ!v+f>CpJg6 zMAIcYOa4~=JLDg3Z0uk+D?nhONRtDq4NMd`&}1d9r$~2261M4*8E+mkf}4Y-vULshYBtW0@M_Q4;lC%13g}V20$k^n>CA_ERYh-NGVtQEp5oNjyy&(UN$CQC;A?QfhqKpngHYk{LUya#JiV;q~Y)h7`g9e zB%W*Y8ebCFJDQ!noh9qXy>bb{c|)5nlH6}Rr%E7BZW*pAxfFp}B7=Ka;@jf;*BP~a z+Js-8)DC;V-JgF6AIZQqmdVW#J`%aNGC!`^Xc8-_xTJl;gVMJ`hwCFR8-0tJf~M8G zaU}`d$N5!!o@%8G)2lrx?>VcP39QM!WDB`abYqFKsmtx7o?*|}LFBZSY9lCP3f9cg zcGS1>$}#J*^A+0bN^8P`pg#pZuuydHpakGuxhRW1gLW7CuKYk5u2-;fYAiyFkCv}0 z+wZA|41^5zrY#-9OZyL_%;OKJ%9htd#CyU52R;e~);y#7qOD&x#lEa1rE+JGQ}<^Y zD=Xjd#7;>pO2Ioi^1b)aMBJ9JV52S&QelnsdigFgvc8|jqKf-oJcE~2&)I^$hOPFQ z&be?JynBE7OfcdTje}D0-lf>*AK-W$Aht{VZt;}<+eae~wvyJ2dwwd97FS+Rjz0SB zHg<_G@+Ks8ZO0r*(o>MAz>nN#kuaZoRam;{RW!ov0Qo|=$%;Ddy#4>M_nuKrb?w?{ z6cMEg(h&kul_pK3n21tEL`3Njk=_Laf&`) z@80J-XFtz7zPth^=T}F0<$$$0#^}zt z1cB>I)=RHZY%S0VXmr_pq#{Fe{}db>-QQ|%+QFpF7FvG6OVi6mf^2^z<@=Q}E}T!L zxm7xZrdn&Kh}qZ_I3!c&VtX&Q^O{W{xvnPpM=~R=D5O3OK+jLL)MeY5Rq`+Wmvv|m3WKn^# z7a^sYOby6(!go!mmFx=e6a-M zlD@m0+&yL@KkdXIXRK}=okDOisf8$`L0PwHc!&4!v>ECikcXY+0>L=iHD~2(xxK=% zbH)&=ss!ny?rR)gw*n9np9AX21L$(MP!L>WMd~)oH!u;Pk>%+eYJNf~cG!u6lz+0gb>@fN3OhXd>$O{p%+dnQ8qUC-GjE16lM3XlWUyO6;Ww|Y1+4iCbuR3(8sA& z%+11l%{VAnEbg9n4Xh(By0sge)YbVexV>qlB8e8Rj>D)34^wePOpXm#D|F<_QZy-q zTHORfmSn?)e*dED;fFj+RE=jmhU0WGbDa48&LV1Ze`T_5hD14T_U8JN@`lKtL}n=y zDv6RUcZtQ)=&u_5X;nLtJme`(bWno?GH78e7~k1JmK&>+rz{xVNV`&5RvmWFhf@<% zzQy#^tf9r2s)t_shHfIs=oIokk;Kjq-w|Fnf3=rfHw6WYVE_&CB&dLXzlFxo+N|gQ&s3VH*B(H%J((L zf^iVMqp4>QfKywAc&?-SU2j_zE>>d}+AydSQ_8@PGb8D_c{}L`-XmU^sdophH7CW& zQW-NVaQeM;>TawkP2OSXreg2Z{q}6eR)LRC=9&+o?*;C#3I+z`KPkJB8FB6Z$iFwF zBf!?c7FuJ3#KxESIpoX8ju@kl*>OL@fBb6wU^x+^vRs?IdkTq!?r4+1kp0ZB|Af^s zt17Ki9Y#;O1v!%?1nHFN)5W3Y9MD)@l)@?Gvov}hME`)zS2oOroz}jIq-&>;Q25?? zUE&G+6mlht%nSyHK=+fFq`lqTQ^;cZuJEP{o~Q%nF&B|7)4V8c%DM;Sf4@~hfg5{&~5+qiz985 z2pC*ZB#hs_feAla80=)}zR*k4e*8W$Zsw62D_MIyJ%Da8Cg7U*bOxUC2yMgB#G5_%dWD|WpQ z94iM7Ud)%#4jOJ=c?G5SlzSC4qWUzF$}h9}WwN8R&C~J-Y;EZm0whr$gu}4lwCa4o z5G(n1U+H5(T{oTL+VMrXAb$1u+pW`0TW1t}IWFhjl+m5+uDT|^;a_kHq4vY}pPYF| zK85I>LOSh1(!*{1AM)#;rx5gie5K`i2nkJaY9F7POD70xsg+e$3~!h9+Rp2wXa%ls zW+D_PUA817tgW2&7*eYrKaG8Mmd;<)_}A(rm=xvqBbdlsNcq-z24$@x`-Jn|kA`37 z)z)f%bQLz{OS>?+=moQTYD1OAa4#;_-^im?d1*|z192qKAbkq?!J2gn$>gc%oP+A! z1MYqM-Eal~j~>g4A?IOO{uG(~$7n1;YdOuM{n?1CWwg2g!Q6c-F7SDZL-sKM^=M`o`nyW&3|${Q;g-b{G{(pzJj_s zVr`!2`5nPxYF!h*9a<)SXO%~G$V(W%mB{*z z5<5_LUrhXWJbR>NkKUhzEq9Y!O1HiFQ(PDZ;DG)-J$i*U{qPt~R?-6Z3ytm9-T2=} z`WH+Vi9z5)TM+C(Zp*;Yal^Ze`8i{u*~v6^NU9Bc2lHi7{eYJ^V@kxjp1g0`8O;Z1x{UG?7FNSVQ-_W)Dc(lOyfm2x^}4E?`Z<)>cUm zIbLMRmo}eK+P?nO)!Lrr?zi(o0-qv)tS7+iSB-y>Lpsb2AM4T^Aq(M<`Y@vVkid|| zM7u;rmGDHsNKN;JAHBzMhkb+~L za?QeV!}Y+9u25(e5M90=iDt0R^R)b;IcDgsZpC$y`!dalsHDF0Aa9w!LbQRP(I&}7 zx(y5x&>i~bYlblD#3!LGirMFJ4*K_#*VO`-TlFf#x(q~mN4`v{P@k8)UTQ6JwLYbM zOINy~bN&?a*Jbhmm+8M8Cop!Gwk4L3E&zTKIkJarF4$C&ez~50ciDLVBzf8RuAUtQ z_Fa^#rF}EYBokC(IQcfXOP%xaVJ3XmX8Cdz7@BR(_>zjGkOGiW&Px9FP-J|{6 zc9i2AHysH2W~D&Zl>qh;uM{hM>4S2@WfO-ub1k>;Yx43JHmzQcHMN9QFlx@Psy*-d z?iqWZxK6SoG-3jz?%~(5UVWioR$rk*W#O#zi1kZ4K0+B*`7;k9DYIYnQzdk>)Y{rg zu*|~LIjA%)3i`!n7gE3W*u|_vi#Lw8L%#ALr@84(f?U`{9&b zxU3shLxB@dv@hjQn;_;vX?388g=p1MOjoOrU=$<&3Dj!uAN#`UhKoGb_0(;~S z$L~b8&R?v%ow;_L6TQB2e`NQKrlJR-&9dr9L zrX*`1(v5hpeF4rc7#dP1{@u(!vGuCIB5qCh60X^G$=*w(kg~p@?XmB77uz7eP8!8D z4|**(_g(&(zwI;#bpJJO*2|O!IFiSqTyXoMKpy#!_15E@w=jk=OS)Vwq0}p1E-vWq zg$c#=OLivbMrGWB)(Z4oepg~C6kiJihnD{q82;^TL5i21xdyJG65r9<24(;9X20Gz zc}Ik=g0;xSMg(zHA@+)IPJs6U%M9~Up>EA%pNHd|#aKo9=v=@KCmANo&B!zVkQ0VM ziq}mFM7s*5KZ?=NN`I{g}YLT#4Vt$!~NPq11++Cu^4Z-|Z(V9`tS9ykqrIIbPtvrD|cpMzc#e zf;bo9@CKMcTcKli$?Xkv_+PCIBr%4w$Oc``l{v1uWTmjj(>)%^58~O3K8DT15Fd+K zdrU_kV)ul>F&|(ZQ9ZbqaPrQ}MbtcDr|-5pjv$-of3->WtAqr94ZQBdGxH%{qgI7S zSq=)&j57UY3T#*dEAj-rkm&}AEZfjh zhG3M+0(x>7+Zd#5Y<=unnh7}R{%9_rx`B^nV2^4e>p8I>qB8rSnN%Hs4KJG(#K&Q%B>%7CpK9Ahu7QKME+< z)BVU0r)*4+!N~{LQDFt^PSW@3d>)L;R?oL_o)7oRHHQVi;84y}uSonAv1)DTF{JT2 zzpAsh^B25yyJb5(fEpMkC>^{75O~*J?4P$=DE;z|*ko9}BK*WSTS}Arq*SVziRg9oH z=(4LkF#Y7y#`O57MYxw<%%10&qj91k=_-(7N9b&Vmu|o&uxQU zCH7V)>O7{87P6GpCKk8PvOxkT_O^pS0L-hO1G)X6qWmOH4t>U<>)q`?VRBVv(?aEz z922n`uKltFqNumgpRWlV8%~UTUI<#TuYyKFOYPd`BcXH+A^`)HY4m`NAAv@t3JCvt zQeNgX!8fw8HBgxV>wWRm=FMVbvPFeBn*k^Y)6Gp_8W&Z9uS)baz~K({|ke9R}l1 zX*0a&$?P7fWjjm!+Jl^lxB&Sv+bIyQ<4<`n@flo*d>+6Yq@KjWuJq&2o}K(FJ|4x{}k2WGG$NB@tO2KYI={tIaF;qM4$yCZKb^6jrd1{x(f8Xz}2~m$fur zko4e$VOvkW-F9Pka>}gd7eV#WQCt$g*DgIro2z$T#cby`wa79>KS-)b#M-@;dpSm9G$B0dK>qG!=I-BGywnr?bmecTqMoH!ea(3RmknSJ=p`$Rzm%LxY35NJ z+Cs_O5x@dGX;9J?_3hl)xRllvL(O8%KhItigiK9qc2T`)C$STR+xvs&D28E-D7}-9 z`*3Eb29CE5-mjK}=>KIlrlzDH{bIXSHr`icqy(Gj4Wv8dPM)_jAH60GpX8CbNR~hx zzIMSU8YPG)WQ^A_;Oa%&jw^#?*YoV+fAZerH))qxc@`@WQC!Nq=>9C1J(oO~#tBRp zp-fKF;SQ42sGB4E;dR{fc|w&~q{JrMqtf&z5wb=W8gbA0&iMBQcl@SccWK?rW&X%) z#?adz2{H$|@kIw2U{>IS3E`oyAvB~GBA!&7o2gpan00Wu`D5}4wPyd7hh&p$Qx9J- ztKaCez6u{U0k`gF5&0~Ne$=`qMIZ3P`c+G&IY^}W^9-q{ZqdjV@Y(n6^2@LZZ!>B2 z>7a&*uBfX(IL@4=3C#pMw+eS9jJHNxW)Hh;#!JeTtrLC9t0LexHDj-nH-9BiI4*bw z!nU&tt~3QaL2e(|0|lV8*uhhP&k1j(M$~9S2m9PS95Ob|*5U8YGu2`J&eoG4@{_60 zJUrn3{&Kw_+$wKYn|$$*VWXu(6v{MfABT9b+ta~_yZOrJ=z`gclSZ=;tkUHbppK`tXO}lAVpBr2A-Rb^> zN#x+)H=T-5c#UV6%4!PW2U3X&sC#&}x8m({mH8|3kBm&&j7Y@S6xk}XADFug?Zui^ z_yy>laA1f`?0{nsKMLdUd5`d^^KX>>@PPf#jMneEuIRGd0n2FBl|kiiXJ_bE0@anQ zp*IcR9jB{PioQA0BiMB!%F{dlMM!Q#UtnkwH@r9QB`&;?Tz^8&ao|pSE`lK5X6c^M zy=Io}{FD7>&nMcGEc`GCm4wLY2Epm}bR*{Ihb8yZ8ITB_AMx`>rImHb9X1ugu6(qr z5xG54R1@u5k33$``O`&Q+oi;WfWwpNXOa9(>BW`pM7MKDv^Jh(I0a9CnQW775UKnX z-%+A@^(j4;S;XpH*_i>u{$t4w-Khe&tqT=4F%U+%_9~(LEAX&idl04O@NM#EmX_V^ zWDV|h-*^oHj|(5ALUg_hoO7H0dBO-x;ww5A5iRLVsOuv|%fsR*ExQ8+*9EnBqu842 z>jgXSb{5l3R>(ZSU1%uzEdI|M-kNx_B>k$vtHK z4askI{Y=S(GT%qcMmW>CIB?0t7 zDqu)dB`M*b{=vu=(K;v=zWcsf<2;~-4B6%5R^3s*8OO)_y7gLF@C-YY3nfbMT!coz z!I=!GDL|z^glHv;B|asvrivX5YiCWR7U%V?ix|$FCuvl@Nt3>TzW43M?Q5QAK+g0m zz6i(AZqA0)scfBP^>;-ukhF&6dbN1%N2XT~eu^a6?sA`@HhNKQl}71-;D+&_5WrKS zkpsx6ZESI))>%A}e~dpQT_p<+I19#b-xXoij*l zq1_yzXBw#1hRw|!8yV^(eZ_aX1&8~yO}d8bmdgIqS4oLI^kMQGtA8GWntctxas4gu zE9>Zr@g_tVnR_57v4w|rXn)$}F&TQzWg~ht8$aFgsHWkf4aM^tSL`U_GKddJvV_Cv z1_g5eoFM*7sOPs;*kuCu>_Me3jVga}C2~>Cm!hlChe>mypyktI)JgN3u_(P4a0!sc zDG#LMB@gll=uRjdNea$Nq9RBP^{gG-)OHcd&01rX%D=1myqZ_Ki|y7UpDmZZ5IH7) z8GK@!1wRncAX@frp?$ukUc!af)Yy@;a>BB1M8fslSAtx5+H#DDdgt7h4=eAPO5wFN zkt!on>Pc$DC6d>VlW;O`z^?!?yx@H3ex5m%dC8EM_H?b4O`iGMwsPRDx^Dv3Mw3l* z0B!aaidgY>kZDlV={CU}&=+w1KYWlbmdiz=U(>|`$$9&+xj?vblgpgm*@v|m-E0%R zwX|93qbO>r2nnj+!fnt9bUBFa1RAD8^cQYcXCqtNlHExBQ)89>UJg9Llx1CfRW&hs zqVd)kVSCBnTY{*e3{U`2Dxmw-4!J#z3s6~zPM(j3aZIlye|e+W@pYWDA!==hT{Y^Q zE%w3J+LYh4(z@sYxFZ;rcG5ZzoPbJyA~P~({>k7JH0o7}m%W{Zw;zo%esqZHr=94<&QqvSzfsJjwC0ldjI16$UKc}6O}PA~a= zKO2k+Ufgl|gX({{12>hCiv6+V^Ti7q}4oZ2Ec zG0T)7KU#u)U-sxV(7))0X>^*8f>TS9AuH&!+hyFI?cPD^BXugUJO|IurmH(R1y{=? zbDNh5u)a)HbpigGw{EV$BvE$Nr?Hr&zsUu*!G)m$o==uVtK02RuPHL$wa;~64%qHN zPWzo{DLyuwzNE?k>7QlGx=e!sXVfKY^E9nWk3`Zw}0u znC1WEbD(Ss@7&UNJ@c45{MnQ9C+G0GK`1zWxA|D|jk2)I!ELVA1J+}&D6Yu&fs zZJkS{D8$<0+v0uYMxKZ4Q!Kz40byKX6x!(&@@AgH4pd7?$#Nhwjbw~>_qttQ86PKT zt~)7-Rma6OdYcG(&8YMZX*LqoN!NiOaA+;}z@2ayB5S-)N73vvHIux*=fWP-E-^Iw z+>UnbkGncCVxsd_QSA$n%!L3OWJ(L16K$J5Roj8!4uB$=z*efpn}%zXlhL5?Mgq&I zY%THJg_yYetIPaX;-W&BU?wu0;Wry-0IEf*_U)+-^i(4*_w7~ybR`)YiV0Pg`MjpD zaWmt_hwl2BpO>ZE?)b{vQHDRIxLAD(QD4dW$nX|K{m{YaO9AX_2(BE$awIG!O$2!N zeLeZ!gTWuQ!&}Bt`oamDuUktkL*0!*{X7^u>Jc8g2?faw8Y6WIvIabo)nH8^CD>Lh zpqORU?)AaI&{j=iCA+4O;;c*`jMO304(3v;`2iz{a?0`0!k6Nb2R4M;jZv=R$?R>% z!S8F7^)+ibdI#c^+wN-7>}*p|CJMxW8LRe5Vgc9~>{ZlgE{ZUCuAF^k*yV#L58dQHpD2;&PP~CELuM>oyK>Rr&OKZ9w|i)< z!71cv?a8|jMFaP5e{FmLzfR^McSBi7l*9`pLjav;q~SxLz-b&5mQ3+{A{-ec$`7{E z-qgE!3K4OR5u7;}73T4M*6+I;S0*!Qx64SWPcAKMH(L9aL4AG6Wa`VijTlIhyejZy`(!ihK;=Kml^uK>BCM(rSOZn@1ojto0 z_0w>HSmtB9O?|uuZjEGuciS{3Do#x~Hpt$u*7d_KgMOljZ=PU8NH=XSvq4> zsGS!g#K(1Vq6Twq3UEUHIS4x`2oOX*UTlI>H=IGfYiST1vvi_KbwkvZ1?dhkVZF87 zX_H`{>g*o`k;G{MUjCPr^Cfe6_{xK`1o@5C1(EbNi>uWGlEarMqvqC<-)0)CT39|R z&f|{Tc4?92`uHjNd=MEQU+ZT$Jb7@;% ze(q#^PawQ{FvA%&uL*l+< zeS0Q=Y>E+_`Yf?55Th7(SitOg1I7jr@s&7+NVv1)Gf| zICYya8xLdM<4VE0&!Kw^%wCxbC^nFQ48KHDA$p<&f$A@S>q*_U93(=oY-FG9#`Oua z*-jY^<`o+zw?38%{?|PU9h$qdce@uWTQJk$RAGA~Es1Zu&K;Z-WM1WjCE0oA&N&=( z_1ZD(@?*-(L}R%;o@J)~((G!6f2m@A_6n?pmlHxkYRQ|E&uGWSvm_r-;?o8|V9~*2 za6yY~3`_rjjDtQ3Eqb}3sM&HxlS>|oIFAqfC*g8YHw$v2Wt4w6A7 z{V~8#kV-LmKlSkd>157({+IH1vTCpqcUTjD+u5(dkpW?PZ`6dg&VY)6|3~eEA~;Zd z3K3{*Pd}ilJB19|)}Jk|)5tUdQd*A_L)|Pi3-*U)vn#k& zs}#QRN{3}JOB)D;P<5CV&#bZ@fzz7nkQ{Ok0Ahdl!a%;FS|d2Klxvy#2ZU&_ZXB&v zF1P}T@u!hGjg_NfLu*o3oBiyk7gEm;jV^`pf=zxL9Ixm0uZH^HKR0U`%Ku|1018N| zj9C%rqcbOs*W4WpjycU+FKLA&*|#s0&nWCXw-vnnSzz&7AsS@Yk(mIcc6k^$F!r`A zTGYIjsGEXzvXAQ}C-EjMI#4X_E}i*39laqvDVKhdM4%#vGJ?5WB-k$2IIwGj9$(QQ zQ;YwLr*YdaVoo)dLyTb8OZ*zHhf*>km;&y$=pcUm>vYJWYj#`4chU$Qh5K3mUP=SP&mF`UrzgA5|p zfAJ(R8~tJMy;~R(v+2J`9J=Ncz38aM9W9g%NK+BNcM4Ix?SiR;W!9~m;1eTJYT0x4 zoa2$!iMk_}eoj@`VR3A{rXZKK+B?4uvFzw3CYiWC(Lu#45jD5&B=K|wRmw@izfS-w%%r5bBr z{)X^}!$P<8hVk5uP0&fAE}-q=R|LFun97Zj^Q(Wj_;_riV5!oWZ$#3%R{N!vK|=`H1;-2e708_H~nN_2F#=!PWg zwn&B?GqgstI!F|hY0Fm1OMe%rl>Ss!+QmV!C~4PDdF*d?1D#C2gkEun0wQ3OVzI1n+Yhtk zx(2`4z_~W%-I(o|#x?A^LDKi+-YP#gwzi7)q}I6N(MRvo6;5kuv~yPS^S7-AHqz~e zVuDbTA9hm_H{8L6uEZwKTI)Q>zUE5T7it?X3!&Bw-?i8m`_%~Zc{vb4Wnb-(QV;%QU7RJHCoYrl}>8pbtd zLk#zSYvKkRlg0o|bB%vzm_&Y=-z{5$S(Aa~`tPMV~lf;jL)K zPTVc8ZF+}F0#Ku5Up`t@X~_BBJII;FgMsP7crexLTi+|v&y(4VfFa$miZqVlEP_Bu zO327tc%#fmgPHDlO{R}5&n3=pzLs!rxA~io8vLtOsn@qI`O$gIN#Hf!*7<#D%>uf$ z%Ep`vw#AEZfjd%S4qgtt2^@EBbILzbAt@R%{PnN@W+$S)Q3pKl4Ke@yN2^lPahwXtaC5RB;zDj(#mx17L5^Bs6a@cx^ccO1 zy>+(cmw*7Xo|BxUH%g@{qYu0#thqT@Ys_7zA%*r^^!m$p*#UFkf2_@=PzWJ>Q z-cWL6E%m5f3-W1^qq&PG8hSi(3h_s$y3bQLE~yNmXF)#3eZj&FS<8*z3hG;{P66Kz zoQm7SKb>S-vbk`r4$Tg4-8(5=EIMXJ?-aP4LfZ8H@?@B;XV|Yx_Aer(ka`+@N!wrs z%ijy;rYNsd$XyKiX+a|p0sqU>UWCXWkX;8GC+mM5ijWOuwne+<|?n#YngKthc( zuucw!lJZQ^1ZMPqd0<&(*8AVD(0Z8OcM4(HQJyD)4TwFEKl9sU`VCj_d=Vln^h;br+c@iBG$x2Hn5fMl7N1@yBR5EnQxACAqrg25@6!NPabjOSu ze|@xwQ@gTv3i$)paX%Y-;Q#E#KfCddZTw%R@{eu&@B`bBRWb z&t2^M*Xn1MIM+qP!1^%$ThS?Gf=cxiG8BEk_Ejgxg^qx=@*(sq#T)P5f17jN+Vt-c z0WXeJ#GH=)Cq4iop9Q*y<45D%_&l;IxA4j2DP%9xWW(wdVv@dHv|FfzH6(>8>JmX5 zX;rm+K9qd!#PBzNC?m=K7(TFfU8LwdkXHbt8xVX#0xkjf^b_w^6PVd*5_0oQznAw` zB<8Zmt5(c$82IKST~eTWzQzB^pvp|CNIy==b=sfF&}~bB!16)FbLvEVww`fYm2re| zpFO(>ydaN4u!l!tj7$UM>X(lz^P>d|>c)8ls>V0UwZyT;HbHu2RbmzG+4Ef2pQ}L> zfAkIRYqa*Wo09I}h2AVi8kx-9_IX&@aH(=Gs^?7v^zfku*4${OaiTMgsir=4G}*=6 z+ojtpX%#bHgR=44|8lhwV$e|;6I>rM-mNQTo080DcBp+*Y*gL$|;$0vvT5#ej>qtt!{fZV(!|> z_c|$Tw4@0Eg0Bqs5{I_3a#|D=IkLu1`Et6Zem5-`>cg47k9QLiniYE_5D&RX?NRMR zukNp*hO9$yER2vGiU6gSH0E)VY6EMkvzPzlcIT|($`OlENy?A%hA(sk8XgQJSVw2x zyMFd)zOoC(MIPcDk5QJvW7>IyhuoBTP+tCCG|h7L1)~L|M=O=DGU7S1>U~{Y7FjoU z>ue3;r9=3*!tY$kC-OubAv90&NnGemEnKuAc+1Jao>CFb8cceiT>LH!tCNS2yC>>^a1S^UWVdd>Z3^9y(Tg9y>Z+wg9vq| zo0HfEW5RET)mi2`%rOp;d_3K=Ra`hbKRf1m5X@NWt1CRO3g+kIDWwU)k3G(~-;!Bd z6I}*pJ%=qg2HfQOe*m6{aoHl8*4&Efyj8-Kf1)l(>*mnOXrN3iNFr|5_D5QM;f)jeu-6_G~)rNO-(O$Kg#z7d* z5Dur@&VOBprlj}cONlq;G;H(+emX2Tlg^Hhq}v2x9ROW`)Hf+FACqGqa`svTbyP0T zcDs%=(PfZ?5riuVz&I_wrSj?r>8lM=u5$7@;+hftE zrPU3?{As=g2O6G&zgR=29QfmKMxXdvt-lJken{6CwBRO0E(RAh`x%VwZ_}(RVnXvb z<{yp9rCfYTaLb))!`j$};C8rbL&9Z51nqJUc%B3(P__3lf!xX#KZOqVGOa~Ecqf_>v~e&fEXtLnsT8Ihzqn*KF=80Fistfi zackCDj8+1t?%VS>9gknKVRDT6{T+}GyYtN)84JoBUn}MOjIc4(`%L!kxqe&Jl<+4)E*jCHH|db96P=doev*!LF)_XP+tU+Ok#~jGGFZSbIR1Ak z;ul6DZc~T&5O{U?paQ(I35#F?ino+OBH%@pis6OwiewtWWK&=MPYAPVUqh*G+OUE2 z6pvVGm1g%HnbioxX|^t&tBci*|ImD(dUZd9Zc3!E|9OJ6>N|`+~20w&V9UN_wrn=E3_x z$?pr}%@HJ;PoqvEa$Gm(t)@kaQk4Y>N{`|@RqF__FM6)~MQqJV{s}T%Cia!`&v|#w z-(z@3E4q7KAvWr!OmaE`sP_TSOtc|`ufN*Q^c-zKj(}i$ht}AT&WmO zHr4pz$Y$c_cqw0By7h9I{CQR}J?NQH8)~9^{TW;}9dt1u)h=h7P?+@He#iuAqpW&p z=zjO{!I)sQD-UyJyt*NiW@D|Fy3#nsu!zn6a!QozaCy!A{*l>`(VCP~(xjZ<-tDyr zd{x73doBsf+CeWPFHxsn#on?Ba<`Ai{M6jD@;IIHwqh3V@X^qZ9Mq{zl07!nz&e&F zZXtdh^t>Z373QnQ-dVEI4wX8MBW<=^4souuCAVZ$OO!8)*_)x3&Wj=@k$KbacE~kF zb?KW|ANY73wRxg(e}E96Vy#guNi;1QnXwV#`8U95q8J13c2 zGvw{wU7I7*!~3d!*)3OkX%1rW%k{WCZcYY<^&j>o9o1-TfpEKwn%l`cbl&Qhr^)A@ zR5^8xrp+O7$xbgL41)tJIQfOsJsUry-y5_LB=9fVRJLx~y3tP|4J`-{bI%94skCbP)*DRL8B~v{ImF&U@aMPP_*z#r7IL8LXqgDHT}VA)F&~ zjmfg6Yn9gyZ}U}XmpiyhcwNX(yOxoB`LddFaMbq;>>fF-ap@X*2x)Mv958)SJm{v( zk8QjJj(x-F8CWf*C)FHSI^wdGv^ceqiH0}GJ6e_rvJsd0i=(@^4CPXAa8Mr#oErXI zHgf)5-n>I(rh~=RF*lqOJKvz}tX+z)tJ>&{^n;cgJKfxweFXL3k932fKJ*6urfR-y zZAIL($a`(+3}w>_!tcmTE*^)vHw`LY%>4XH4@PoMUL zrxW3%$Kwq*Q1ZidE;uNiIpB)hr^xrAa~(9hCVUv{%f?2_=w4hm8(nV{e62j9%A?lo zU`ix2iBFCB5lH9x|H%)Mp{&O*E?=It{h?)c_Zl0N95$xVvF>B95}2D@2j({bmS`tg7*`<=)*X`re`Sm zy5M-E7>Wi9a`N2t2z9+exp~Nr-EAo@Rnn{ zK;>)MNVuATDIM!C8ZQ4%F{?Lc13Rm4{XCQ#T+lN|lKQ>~3JhucOXl7GwOO%eBGGyC z@)=s#w+hm+lfSsj+@CbmL%{P3Ne@3;8RF$sy|GX+_R__{x`NuQH*@|Tnwond8Y4hm zH1BYWcOk0R4Ga5F0JOHlq!Y-?qUkKi#|#&BnFQ2txoj@iCD}%On6VMsZ>GI(X$aw- z+;<^UJ2yD zIpnlLx>Vmv$1@lB>mIn^mkSoqJV^R=qY=t<%$_LS*`24Fsucr969uo40cLD3&Hn`4 zvFf~HI5?vB?2lcHJ^W%}ohX3@K}Zh;FD-TWg3NmqYB0LTR#BcjW(pKol{#dkW)W4d z+Gm9J+-dhwr*@ek0-%yqucBe-OK?yu0PKV(CzO66DUL{PmECfERuP^sM0{8~4C|DQ z?fCK}f~HfH@9f=QwI6rWzldZu_w~ntG&Jji+u(F?(0&o;dU8T^Hd5Xg4-eg(t z`2wo^JMSuqAy$375AfMHv_v4hN~5#0)3YzPLs>a}qFhI5p;sJV$X$x zg|zCHdEJ<7AWcdybUBLDGe0U+pt=jly+523=Oec?qU8L{FLx%Ngfte}51LMX%zdXD z(s#yk_7cNO1*c&|Ef{Mpv#0IA0DI(S~#UaGcn?lIp9kEoV#+8D1=vkli|QaNjNCYHeU(gN^D;L z$|Xt@ZZ~-Di|MU71->2fpk;M?-NYY1j(D@Nxpbl=5~?~-r-3avdrWS9I8KH-G}0%? zN!=fN<(kN{@u>gu{ep&t$WY#(f7Dp1ZuXxcByOC12Ikx6 zt`p7|yU0u4>L-~Y?iokK*T~>#_Y5RfO?K5$z;|wkG?^F1rDAJuXBWaSRIzg6p zH;fCEX~-3Br^x%|ifE4mnpCH}B4vT+1owA)C* zrbpM1s|(jTXM2N?L9Keo=L_P|A2!Ake)NiU=)jz+vYixcrE%U-0eB5YE_0Spcy2&{ zgE#>mNxm)|vEQqqicbtj`F~k2c1VbuR9t5@aZSnk{!YPIIPlt*^Bl+Gk#QF0_XK;X ze})<>XUYUXY&nHMlr;+G)}i<`r{v(G&_=BF9MCb{`i&(iaA|5@eEHMz?@Kdcbjt3t zvTBD(%zUD(&u_a%5@nEx2N86NM8n3By;{E__Pz>3#-{HB$T7pTgW08MmR}kICG08N zmKDXf&NsZzjClgSqm{u)vMWgq%RmRf+j$g5c{3PmV9IsaIvkvgE~fam-$ipv2DXI?Xqx1b;0-+ZW4RATg_F0w6A+T3EQ z8xm|8BPp%&o891M)YUf~D#soX3XeQXmrbFQCBv#UGu4Ur*eJ6ezBUdjy}g)pJ_`hXY`nXf&{@IzOE=t1l3nW!K6JCFuCW=XP4sD z+deZsB(0uQU6uTM>J9{RYbvkLe=R~x!rK?q3JtxCk{Wo~NNv1+Sd$i>i9~A*yd;W# zb;&Y1|BmMFI3G5eJEz7x?Rl}(wUKggN{(yuhUv7q zX-ZaQAJW8Hk|B-R_cc>>w+O8kEKkkle%rTon0nVPT9BZf7*=KW$X^6Co#QanXiKL$#m)x3(piup1# z(S44sB4IL~=F+bpeR`0@9)mM8uLB<4p%NgvuneE%gg46Htlg*_o%Qx{(@$Sx_cKlG zE}S1yK75F0EWvXhwh{}#`cn_QHnz4na0{PbnQ)MJVKCeFF+AXz`c%9o%@2wmu}Q1Y zBGi=uWi8s9H951xrkz+n42`rpBaO<70flt$A%iDQUe~F*e|9Mw7U>zca#=|KiOSzb zCwVpxe)6^9D!^PR2JR0|8#jMjr+MM*WlHz>X8EwVn0$H2hFBmaS5HcV_aghz*`<+E zlu#w6V|-3(sGOzzf3f%8aZPSZzjzd+7wJuibfl{E8U^VB0@9lbN(Yf5B@h(>sZkJ6 z5Rl%9NUxzIAiW7l?@dAvkc9iV&)(2_`?$h4PN(Mps3X)z6?PB3Qg_8?xbk&k`UXd3#amvLGsgTMJowi-r5i6E zO@*9DkF6wpi{wXV8>BR|UD#$zovY(*?s+MA*+C|>>Vb){!Hr$hhC_FCe8B*fyK(n# z7#u5x%@vP*K9CzUN84ww*9+HfdyI}!Y5B~CBgn*vir1cbt_enB0+HtmyvKeri7J}Z-aTvjoRigYHOl8r&Bb__L+^;rL zhlAfI7Df{b-+#qZ{Is@m+<>ZtvG2GCesY!Pm0S9{j8|=(>2n2^zEW1bOCE`=+T+$~ zDjlq?xiv33Ttx*+ohIHgosD6bD%f?+6=!v)@(4|3cV~{|twcl4={-%xXJl6e*a# z?Y}29L(YA%2Ch^w#Wn0H{y=)jc-C};OhA=n(dN<3cYL(o;Mu4W)M%Sgv9}723Q)2Q zqWsGHzDbrQXlM0g%lJK_AApv~2?d3=S^)O0@Pi>@+Vix>EG^oO$r3##Dh3@b0> zR~N|!Y9h`YX>icPTTsZyj{rWWc#>DsmkzE_XV)CMU`~Pf`^q-=@~fg4xXv^*G_Y3M zH|oFU+4M@8gzZXg)2>OkJv930xK(k)mhx&{MYYhU0>l0Y*4Hry!7##c;;O%tx_&L0 z1}p;>2?E=Vb(qMUueNF-6I zgK=ble4;P@68 z`U)810RN%*^%Mk|X^#F+xeEW2j$nt`5sYTwk-XifeS`#%BwbkNmk-lBuP4S|j)=b~ zbkyIi0rjvoyfoOVN~T4fyDvCs!$Y>FPFdL172z7qm{osKZqpE#{G#* zF|YW5A!FXFci8TN_^*+u(o7Ps3cFbwtFQ$XDmom>cbG6v06nxnq7d5=| z%x5O*;Voh+bG&3p5UfzI4nT?(fFCdN;+{D=>HulJ{SnxQK(dx=w40d?hyz*pmg*6+ zLObLz9TREauSV8e{1xU4`PBdGFN0}MM1TDiY+Z@lgS{%0;lmT%cnqF`?}+(F!M?x# zA3fxL3i^+#N;&Drsg$m~|MT|Tuq!}Br|OsGf7sx^_tZB?9eBY}I}G&sX6-&Ox7o%2_=e>VeuYw}<0oj-f*ceVX}_xuSNf6_gFHtYU`vj6=z z{}Jo|xF7#yn11E*cT4MEr2nr}{BE57r2gMH{~clfVgtW*(C_Bwzcv8B&ClPBM45f82}zm*?WY$@lNZ^0&VJ2jokyPHujiD~-YLz7T!3YQBsAN^j9x zT-p$F;RU)$3xp&5(kJLlgiUc=_EX@XzxjoP!_U3J^CjgLZw6o__ ziiey5tf%?PlBmwP*>u&&z^09U5ZA2<-;FyGuVWid^1_bd56rPSP}UPYH2-p|0^?vA zIpC@BR&d{ubmdT}Y*2Xfl?Bh8O2&l^=M^Gqjw`J`y%<`fHUMbe|Af~&yA?v|=~zc; zSzh1ISyuP)P2*LcA^3M>iVc_X+3YH=Da@oHc>`!MHYnF-crb)YLBZQ-PPGLQ zt}}z6oY2g%V-wr;m|z!Lcp6)nk*NLT?U~R~-%!QW1!$+vX#R<2I@B1ggKEZ64M1k? z&<}Q76i+q-aey<9%~ReTGE1YaijX$cYJ~q_GMEpn*KZYn^*c}_=3X-X08WT9Q1TU; z3Zp&6H0&8FzJ9N-`=G>uZDfqY{sAbkru+PpQxHcSq4%LH9d0;Tuo68uNBPVO563(S zRUE?5kw3>>s*N$I=-+fAc#r=|iK^02wC7$I=<@StHNnJ$eC8*Lub;_87%hWCV0Msk z27PQrtqCet4$R#fB$gzrp>)SnlW(N0XAYKPKDl@l{nj81$XdQgwft@S!b-UaSnTu>(7nb$4=%n_ae;vK*knUz`l5i4E!< zS`(NFr<~BS94Ji*8;7(~hKPC_wFBUja>6*lL`CKTqjJ-%l;XF{<2b30$jd~Fsj`}6 zE{$j50JqLaI&^+}3W*r(Je0o{H60Xi#Z<1IbtHRu^IH+K@n(0&uFxG7<2f5puFs8( zt1*m6&)&Tcc-C(vhwGm%rGsyr%xZxREJ$`+Wllk1;)$-5-hN8Oo?)6;jg2ce?BCG_ zU#5-onlb8;fp7NDA<582bFLU37>V%SG%J)BxJQw9Z!TU#^}4!cI8Zw~P6!OW2)#jk z(m|DG6%UelbXJYBUqfIHh<^weXQM{7M-^cpY~gM>-hRqxk7=s1LSN#KadCRE_RIn| zqRuWi&sQIq^rIeLlUh^&(o>qkBQTEkGt*3Hj)~@v=#b`k91m(CPT^wNh*oQT@-q`5 zL^NaH*rbnBVaZ{bG)vT!l>pvWwLv?X#UYWnxV<28!gR$+iw&3comV0CMD1di1b zy>)Bo;*eHGf?;&uJu>{zq>N;hE9oJM5t3vxPab_x7&z{?iUTkrfGp^g+hj1oaP=+_WB@B1dP_%ROF>`R4Cw0&>iHpMQ_%6o%Adr#kEPUcbd!(S2 z#xoBsw>mvBeLf3qKS#ivrb7`~Sm4M-iJwo&DFn~pr+;+=pO{Z@%F-*bX_ z@S>2db*}0tt;uhxsOc7Z8T#04(nXc+^F!jq9-o9cVmbs!#3ySzuhE>(qcj|cs1#&Y zCHG7@ep0S$d8M+`#Nr*La?3>Wj?1_@Q$vsFQ}z5a55jiy5n*g}gHW>qw5D<5iFm1y zsLrr3qG(F0phf2OKqE;g(?{^<7lD;$c7=&~qh#B`rM$o$E{QkbmTIb!o$a^|%OmGG zB7SzW|fOGbo+D@nnJC&Ut5znS2#k4M{1mNJM_UJ*$kJu1zdLq zNBt?i(yCZx+v~}P_D4~fSryru2qmHf|EmHy3)P_-`4`$KHu&zSw<}UA3KSKYzRuPf zcWA%Cujqh!3`pM+LBQP*^gsQxyf1P@W&&&~W$m~iR&@Zrd55v&6ohbuV@YJ96M_77 zm(H9H{2%O6p0i+9n5|9-xb!|eL<}CI=TslXOxbGE(jg@XrXnu)ILj9=xyCT5c5^|XoWoiVtkJ$p>3tZ)Y+&4UfDRh8Vx znl8!N4oDW6XziYZZCYo4c1F2&AI2QOq##x?3bxw5qi%%(-ByeMLgREBgc(2>KT+)q zX_57pmb;$m9ikF%5ad$2^7)dR!`rLU&Z) zE!0(X&&WiJR|-uQ`t5AtJ$VI{XKmXHM#jR<;}30F9_QZqB&}Z>D~r^y%l_PeIn?>G zH3tq)M_0{FhX+UwibGhT+NeP9t5eGwgWRP9dr4BMcutgZ(VgAw6k~3Kc)8+VR*@fr zi?iELq!s1V?N(931YuiP>T8~QPKKWu;cs7n8XsLy@MdD^jegU{oG6CQo0r3P+VXj%LOYIt^0~dqRPUNm=at%nwxC!^5r7n2#ZmeB0r|hK+ z1b;BdeyTtYy@58^#%pz+b40M&d*RraTkDD|5}K6wWdPc}G;);qdot zoZi?(96<+4^B@55Z)gB=`Z&lJD*M<%O$@?& zI&W1HvSABp@Q1Wtu|lWgs0F6auZGTcQ_mUOSZx#%4BMV?r&4mp^9@FC1SvURz#IM6 z$yW(}6Awn|)ZGI=w<3}g%0?$%uLXk2E{Pk@RE~J4BKtfYSxwcs;zqV~qUU)DJMSz` zP(05oQkm8rLEfjNL-!td57*P6L-bG~AsA)1BIEUA?bMlRN(p$@>Y=Ge+>T)c!Cj-N-5ctVZYU)1wOOQxHBjY_ttbh*5%swTxJv8Q9CWqA_9dd9p3^EnMy} zF8(HTt~j=~(kIc|%jJ2pRzUP4A9*cWJtxX{3LF@UVW{gICA}m4aam@80_Ol!KC7Lq zyq7(+)Iw3S!{pOL)(5Iz@<8L)xjsk{i!{`%%4zx)MrwSz?mj;OVaNdAcgid)e;23a zq>W)>?dzxoRmy5aOM)}_5PD1_!j~5!O3TVEqA_W31s_XhJ@?n1u%+p>-nXTcPsZEe z^W6~BMB|S!O8vE}1>VV>QkxdymxRk+WJJzXzN=CRhDd)JPkn<=$nq%QZCco3>wNw_ z(^y+SfdEO&SUn4|CdE5@p?xgi7*nK_@jrb>`Og2pw5$9D3+(KFboR-$rn#{#sj8Q~ z(o6@q#N7Ap0IA7oEw()2zce^^k4^>D^X;MRu+a0~n`yPZC!+1(J#k75gAxFvs*8O) z4?kuO!I7o{`L=RCnD2E8d3*c=ZwIuj@EQa-?*kuch2v9DEhGt~QdCs) zGFZPa@YPY6r#p@wxG<-yI2k+zt*i>Xe=l>6RxkGcNdr8m6~s-eC(2J&MRJuuy`f`u z}y0Y#{SbCqc;rFtj`^~Ya6Pm3pHx;V2Z25_c28pijx?)~raKi;odrhefI0Y*<2 ztocF$?=X8VBs{WOi<4k@T+E7ab#&tyV>Lq)gN471A@1avMkQsh9f;Z|6qXu!#gl$C z=DD_Ao%}gF(A*@B**k(;gLbj&k^t{1h|HJCkUyD)L5Ipvu0LEWy|pZcu$hHbR1L+o z>E<)%Y&g~E;^{cHPbAdEDVd<8rt>+!DWC5_fthPq{na6g#MzqLgBM4Ip~`-#T{$vp z2aLt=?yFqao9SPkmvEg~PS}@)1x-_IdekJ*PdATHeVLMbq(cOFQ%P`6mwn6BM&mY+;Q_&Y&IXGJb}$2SKs40_1ZOJxjs zBF>{tT`2V#Y_tV~dCNxAC>R%7E4sNm|d<-lL2e zm}xJuYH#cCOzQ57yHu)oAk1qWR|~wTy%72dB$v1nKRQf~dQ5IT_BV35c?yzhu)ebx zlG!E6GvR2M=&!#qP*z$t_!Vhv8iENCb1huPh0@jhzOeV{NW!ImFo7>abf#EnUk+}BirZ^(GW$Mp11v6R{J+%Ptjgxdqlz8oGbCkNH2zbfO2 zJXkYf758Kf+~nxapnih~ltRnlwxiP;?>JpZe@ zN5qqjvyabYG_ZU*`^fRWRNbdVf6A9-u!v~}sE+dtsXRk#fAWf{9yG1OCWO2M&YX8_D|7*`)1*^%B_B0B*GG&290m z;CuZPuTT|@)ojRor97X3HRk@h3VSw|$0k&F#*3ePy!^U@)A^z`@5Ta(H;@yhgAuUX z)8s~Ff1!xSMsR@do{(Nra$WSF=1Uc*$dXz$KYXD;2Ibv0OwV4M;zGs6RY>IpBFT?bmcvD4`)i3GNn^d9=#$L*k=t!ieq)WglNx0yKC3z(3aJ#I|`l& zP8)e@i1!c@(L$%V{2t_$wFV&#xUhCGzMq^sTPLvwrqww&QX1XBX!X^MgX?Nix##+zh^n3V7625G5lSu+X{$7wmi8!q&tTSvtsK zG$gAo`t?zjPvBm+o2-s;c-B+09(8$fhDt zJAe_It)np*-k$_(m6r^OAI(<{3*U_ptcX!!Zf5!1y!G)$-jn1o(8{?>8WR0yBVxWz zXY)>59fs^?4aWSkla6q|I|MRCEu3@40omt|Wi+M>C`nI2pGYRKKpy@*k65JEvoWwJ zZdie1L<|hFJMeWu0BH|Aw`lB+C35r4q{1Av6n30TXk&0DOrV{^2)fBeLV_w7O&xLr z3j|`H!Cb6KSk?oq_b*EAJSk}%Mys*qDICVV4#pPy$4VWE|;@h3NsuE2D zst!-5RQ5NA)Hm|zCGhEPfo4bsL=DxW=e9hc*o=Ta7#$QaAQEK<3kqQ%u5;vOt@Z4v z$o&%~H}|Z!V%|2_iyJk-);^piE^FeoV;MxX!3BPxHaIZJrbBscH4I6?E{zxh4h7h~s+yl0Qa*|mS>Zw)$#+bD#h@j_0Z~CC- z1*}S_{SD5V!pz+^H_w2hOf6Y;IE4-)imsSvfsvq%niQzYP=_I9R&?I$Z3)i9*aahf z`(jq=HFvpCvUmmixSbnSLjq;6}c%$p^yUW`&E zl?)M%Bh@9gCnDycx1Fpkzgo$JFhNJ6L^QW~pBL8h&eVWO?G5eodkb_N3++e?#xy-2 zb#s*zC_o8hgWpDE-D-EIsnT}W^R_;4MO$Y8cisVH+Y&MMb8xgu!jhw3oyw#nHtj%3 zyqRB^j#?G6)^;0|{!V`>sHn9|V8t8Ryai8Ttmo`Pjo$3vtd+O-0el6BJLW93%_?1> zZ_br%JpBBUUrpPTo*nNUp=`%RCvguLe3}MG+{R+zZLKmaCS;~LQi`B8w;NBe1N0N} z%(k%EduNs_T{js~pFeg{z3_QK@}%f2)-e?-3Lu7ucZ=LYZH0JjN-W%JvhHBY>}AX^4%7X7hb+c?G>1n(5he}O6hlam|$OoYHY#uGkF zY@5A>Ek&N8UOrRQO}?H-3h(;@NHE-}68p{BUZPbQ`vKP!{SPPdA9OxWsS{V&r{O(! zKXYY)vTA29+YWXPN8@d4gdD{{W?6Z4hCHRd-L0;wC^w!`+hXx=vhg2&TW^1M-e+M~ ztB3WeibZcyJsHLqojMO;gi01~N7hG(Aww02>$a6^4e19P-LkvxIMb!asq?&4Ut)PT z!ynXk)h*_r%*|94P-E<9>>e}ohU}d%LB+GXGFE!=*~x>RpOD4%S%15+B-R;4F}%mP z>3FF_GL8RIX3oONIu3>N?De+7UGq8xZGDBU90{cA)FZbjm(72XNQAC9Y&#Afol%s9 z^|sw)pU+2zoPr3;HqA7=v@Efl17ao2C6#qU#@AW+-wU^0ZbiMX=xXQ@_`04v3gw=K z)9Peec*8ZzhBEuM;`IhCm#(mv)+yVV%=J#j8jLAXT(e%YZyO!bKIp?#4@0e`u}N~8 zsIf9F9lgXx*!fyky5!V6|15!%Zcg2ig8O0i$|Dmm@!qB?-08UeEyJkacdI2lg&0Vm zw3i?@ZWOW)K=6uYjZc5IuQ(ox-?cJ(PlXK|pJg`bjDF>#B4$-P`$YQKu?0ztV?uZO zTQ0W-Fb;~_L$BW_NXo05tnM5wk1MhXW-2)x;N^Y^u2yf?zr7C*1e1uH`D=`vf|{yr zatn0syZgU+I7+jcQ*5fSLF9UMO3Wbg>ABk=N;+g&xS?GT0X#++X@`i^K>+}is4uG{ z);CAWCPiCJ$L%T-UK>gr>(f13+};OeH*fxRf~WNoB&j5v|hk*iU9pOPUc(-r*4W` zUt5Y)^0Ibm&CcEWK>gjR@wH1Fd^;+|8Lz~`C@w4et6KWa!T@Mi@>+&M3pBhb`ND^R zec3HB9Zy#_uDf!{PVcF;`?*qNgBl(zER3cay4%;0L~iDq9^&MRVCxacW8%DOFy_hL z*6}WY(9*AIh=9#^F5@Zz&Fy_cE^zDgiBcPIqL77QY0KnE)*OsJ!%8y}DuU)ws;!0m zOWW)y*U*9qql${8`QUlAVU`U^AvZ?Ps2df#ajN;G(k|#wl_lmwxk=PO;huIbDtor5WL8MFAt5EWbPNN@ zAW})nW~9Atd*D{i31YlLd*PBE5uHLfs%!QzM0jsfNfCt&iX4GkyJdaRAv2C1@A-CJ z5S4E8GWt{MR~QXQN29+-{)KMrp#m%52mxoE#wegm(xJBo_bNSEIo16Y+nXwwoi}s+ zq_!|Q-v~14CY1g0Ume*Tv6;V;W@%&O+kje~s6v(c#kZIoOzDb(>lx9H=Y;T@jgFna zB%bK#I$O$0`phKRj1fn=6w_+ayw!NrRl~Wm?)oH!KuA#BpP!Oo6>L5F{)8vf1?3vG zGy!|NP+bhEp5Aq0G~W#y9uA-Rc32HCx^ zPo)wBX0hl_(o~lls%Cb0z_Q(awp&JdsO$|?*_#;@&|hHYbj7j*yZ!=`F~0n&*sbq2 z8#7uHHP|?goeqPF%+^6}4kNT06TT4@Uy^)uG|I^JGT8%J8)L^Z9oLbuOlsP!8|{}I zs!VIh9rTNRy^R3CY1xs7)Q->wwng1m|4kC`14xh@x6+(5%1|K79r@-71m@lbL94EVF_Eem$%+juwwDpW zas?N_cElA73CH$~+Q6u(>5{`kIcp#~IiMI21VgZ9zkuH9uiJ1O)iL0#$*J4faH0@~ zZpN`p90cH&BVZ`_2;_(vj&^k&J2^?d0?2R(a0*;-kTwR}4%<7kCoD~E?k<`6BwJE| zc8wfu9?#VSM}pu3Yzne!9*p7KhvQTbMreZ*HRxq@hhNSYZv_iez@aZa0k&Dlv!$vR zU2L#3z9aQKHdW5~?5t*nb19zZT1Pv8Iy&tERh^D|++`xRIqeg*LGO#AH1 zkdp@)uQtM*g3MskXaHU_4^rlVIKq{mf{@z)PUUTr;Gi{r_(4%D5ZOL5eTakL_~Dxt z0ytP9ati~)7|`EM_03ndCo>YA%z}2kVvOPCJiL}S<2AFpt_yQmwc5o3c_?7>-|y&u zpyh!O>5u{V_jQ5)NQq#3s&802_75bdpBQNX*jwwaC#N9rDTq$_jh$s05GDSPTVno~ z*u3@dI%||e$Uo$jJ2pdtzQf*yD3bI%<2Q&by&P6O-$3;TssK3a-}P7cm4Ags`G3|M z&5HYU|D>VIeRcnI$i+l-Z^QmL#y^Zx3Hd)K1ubg%wkteTTh+`v~VW`>JbzCPM8 z-`%&?{bz&mpKRExI8Cg*Q@&NlLR1*Vx*WYXh33jaIHauA26=fMK~J1m z4LJ$&?gv2Cw1aI8z_!Ik21`e0H-#qFslnK|B3=M!U z@TXr>1%WaKb+-!c)ja-kpG+eNpX>@N?)B`Dzx@;&;N>WeI6(mMM`a36OizeULCNj7 zBU*ppN~#yI97Ds9$`|?mR#Iq!Ef=4H>Xoh1p8Wj!FFo|LPkv5_pR3_FdGT{K{9Fy0 zXW-X#`W`$H#r?KjfbT+fznp@mIZC}Chh{rsPOxtk3wC(28@xC_@X3Pi0nI5$9**4+ zPz5#}Pb8;GJ8nHd<%wwhf5!?C{nswc%eLoq*=R4SrN5N8{Ae*4vOS)h-wi}MOu&!# z0Z)#;#eCZ4_uugae$C8uMpbt|+uIL!Z3OuZi3=X;|8e`iEMb?1lta#>)r)Qi!)L5Q zQYdP93n#rDL_+Ij2WkcK)<%T;rp#6kZ@j%ho%`8k0i;dDPb5d9XoRiyd9V>ZR3kY|RrCKR%H_w!4yeKUmivT1EkR1mGdXyyFil{d6D3y}5mr z{;SvQt>Sh(UOLqBQ<%#sh|v^Egbv&uY_INpg3$#Bd(RUR(`_W-D zxkp-$zswmo?#MZF(W4-1$ok71UXTbETo$#p*}V<1z{cZfF%O*?6vIunms?0(Nvr@o zQ6c+tuPb)OOJ5>VYPCLIzHWP;?9uHg;!eUfe>#-#s}rSwzWOWJ^Z*Vh7s@C^?vhAw z0ITD%oM};hj)jGpWqZ2igt8p&HW9aG_t+^{7p|{eq3;8p>RLso04@$Q@7Wa4 zA=@+!#JQ@oEN}|UjiG66Ht>KU764NEvY^g3uyinYb3*&$k@riEi(1Y2Gcm`b>iHmD zO9sd7`DTgT^;_O?Or-~d7~RLS;k0GJen+m$Wu=-;hI|~hhIV5gDqU+v6P6K3I}6!c z+ab@yM9#HU_!@-?7Kv*{YAg-xo*!@IxS?ynaRlbZw7+~FXh&`ByF3)E84>d_>!9w~ z4pBeB<1^6xA=E0#)zNcm!Z$^u-_msk9&U+;4)>Igf4;R)mB8Y?W$>Upd7`)E?OV>O z3Q-Q?&B@n6aq^x1zD5~FDW*Xhq6eP$1~>L(?G3XH<@Od5zC8=$D~SAO&?Wz^ey>e% zC11e_qmv59&|$o_6@#T(%$mlg_IgsuYyL{z_iuQzyu0zFn5pUMK;45%EmE9DMHpn` z+$;d90?r*)&3P+{;TH)>*(0(794a8EAl3{3drTR%i+c+AeZ!UksFAW&gJl?l=?)~w z@=A=3k9D;Lp1z$WflaIp{Qw@xN&1K@tr3wWS7&YQs)93;!FK9a2Z4tMt+w0^^?cGgDg`#B}E);(~HzVP;?IZ?+| z7q$lj0Zs;pGq^!8y?C8bBlA)fLx>G(D;(oq*2e5h-iy*pW%r1CP+v~R&+LQ;(NpPzmWz&$4wsr#`R4oAe*m@?657s;|AmP6a}B1Wn$KN1%TH6($_n*;8KxR%FtuTlTuf5<=IVwtyUzZ zORa4|Z$QaZYq|W(y3A;<4>Zvm-J-HS*0!G}D%TZ=C)bN{4at;4a-xsos$at>oOvsf zQF5&kV+8lwL|McVMa!NtLaDE`Qc!E&($leC*+Xlgmab{ot2Izl2=mHCrDL5TI68*r z-eY_bz%?l46cjbulya_2ClpChi-$^_J!}qlB~|v{X3!WChm~8IPLW5t+B$N%TYmg1 zJ85~|_~uL-54&3le)5(vHUr0NAHX#vr#MnggNCT11G6#mi5doP%c_>@;-IdoytmpEr26EPDdFVLtJ{O2 znz`Nqj!9REg$j$5!+FLGnQUUyCuB{?e2`4p@zR!07F| zei1{NxeG=M%g=CvxN%E9^k)UqN$+Q}@}^BI zMF>uNFD>%ScicDQrFT?T78J86f)!V!j>=z#$K{6UsbR1D*mxQ3G*Lao%O?Ip|X@pBclMY*^hQGA7s79w#WLdJQ! zuuop|xH{mTYERmsl}G#opej9w{hA-_U(l5tTXAw2LSV0@nYjeTn{TO%qOFWNZo+l6 z083_%{rO{wfvX=(Xs_U(H+UU;=Q>AST9`0ldo|%kO0Gl*0u7nVZgpkAsG{2HQq9r+ zrIGf9oMC*zWVXH3W=+v`LjjhYuinhN%_OTpnnk{3tDs zmQ*Dptr=d&26dkuNh^-UuGH=vX?_rkP@z!cx&(ICRTU)#zhe%;(7>DZ(K@%$wi!^} z?YLJnq?2~*BgqWq7UCNPE|Klyify~5a#?%}jW+}dLG`=Q{_wVxj}hbXtTQxn}EJtNCq2pRF7xThfa(%%L}v8^}xwzfA< zqZQ}2wetybv2R(QZ1a=CHg!rl_^}@lu?Md5Z(Q##678swFoYc`wjVH{%0ED1ux-CK znQ3?#{DtWS1=ji@;rGRZ$>VKPN@7}MUbj@4lJ1Y=oWfdS@fdj_?)}PNz!xy0Sonq< z%RE+cPA96?XAbfrp*^J31Os``>SWqVAAk2zy?MRqcr%kvGUR3FLNsxYjt(d45JMBv zoD2rk$`A~73ay+Klzp4^6H2EALNkG;-qo!i%0h`XbvkpW+@f4+;&z0U2{Juuq`&rvKz$ieO=c3Z1mVNc4j)R4Qu*dy+>MHYOMHSZ4xjk%kjH!!R-o zeqXILBxC_MTwfc0t-q{}R*AnU-<_h$jkN{Au1tntf;%{~Kh&PlCOQlg=!cj)mK z8te{0Y)Qpg1Z%H>M^YBxbZAG^z0ujJOp0utI#^Lh_DVU9b@1H6LlwcjF59buuqx%N zpS1f1AY6Pi?kNswVM{G@d2_s*0KxH=cu9^X2UDSWH~r}hm92Kz1t97lU*-F?g4O)H7HyXZWQf#5LFsAL{J z1izLY+!OH*YIdUK&C)ozk4xCCG>nMx6(t+z`kRn{^6ai2q3*vFFAU! zl{q9#L_B=mr;HdMe&L>cm|{>vXUxP%jc5q`b~-jWUVI;EeN(4=(X#y!93w&4oN}~1 z3;{wyFpq%XC1fc>AdVCL6e^uIKGpiDUoJKK#_b8lj)g1I2qEA|B!-H|5_*D9mPBwI zb%e9o8=LPjqTBrFcca~e&rohI!3-vY5hwp}xMU&h! ztyjX9YOUtNDG9v24qK`d)Va$d0&K$1pZj!x|MYlN(;N|5E8sluN@j(&+_4v$MZ&x6 zIokG_)~*s^1=ify2FEnVpoU)iE023HhYfxCLl2HgHAlMM#J7NO|y=HZ=xC65^P&2DX!1? zb4cGSue3EVd17>qg5nxiK-m`~D%5TxJ&aOL#C6t@G}I-v!uBrL7mCO4-fe;mM8ai? zQq!PP0RC;J_Q-#zNPh?DJ@fMqg(?nB7&O*Md=d7 z7Rnr^a=kQX*!3dFzEKd9U1?KsNNY?^x*07NOCm*9Km_Czpv0%Lyo-IhjfV>n!DLJT z!|MUN1HA^^001!~mm~m<&q9DKf0pveGy&$!9K*KNGYm_*-FQt#e|VSXji}q2@zghq zU*QVxKV)ihCi9UlVwh>)=$e5C-5j697Nrz<7dTXpq|(=pD6-_t4kLIfjcMaw!Z|M8 zU}-!T>&qvrn)YLJ;4k3wkd;TLpiV91DTv|r!c;tOEG-W<1xI3TFB2Ce@~qVAgClc^ zAK4wVV(+#B; z*QzujoVJ8xt_>mo*o^7{VGHH)1>{bQE8ukA|M?{9Q+_U#01Y6HAA>{6bO`J!05sCO z636ldad!8LgPsuZ8G*TM&b$VT;6j-rlOA(^ESaC6lmw3i`vl z=_hz|gjfozBXz(WHn&Q)&mZNwuY+5~87x8m$k|O8CG?tyje@8^CDp5p2^$-0PGOaR z_hHoMQ;2}@h1Y0FTm!Q!E~ecw$QZ}kFC-`a9!UK9!Pd`NxQCR_R4M+-#QR9i^B_UR zg_Dt1Y1t3bRmcTdK=4@tUQx#v%I^JWn0qtQs7$Lzb^4dQfq=HD8Zt=`=|IZIZdD0x z8=@!+$>2|tpuUEKV99g$@Je?%aX^xhX+`)|$QA;-C-Ck|$|N|Jh2|uECxcLRNfo;f z$k8A+8`!kf$%>IQ5bp!wm*72AUA)E$ehWSv#U0c7ygCK>!?se*ms)Tun4DiK0C@!b zk!f0U&{Ar?Jm|2q*PZVcUgz|bQ?$<6deh{y-Zwkz z?Jd>y-FBHvb=KF1y*8`Wz!3}_lLn?#7;>v)< z3n*%T`GWaxUsycSIVQ4l2f~oP0Z*{HF<{SjZNZOH9{xCM0i|Dp@HukDco?>|51f4& zRDUSzU_Cn^E9?P~1@JaSWjOBX{lj)lZzc2-u&9uSed*odC+ooCAwm1$Sn!&x_5>Y} zhsUFUbV~oR{QHW~e_zpO_^%a(LBm+-_WAsJIhsNW}PL>>^E%G~zKje0IH;8ZBai!oA@xdkzZ>;7j{ajqZ*oVW$gr%7xAce-yelm|B5Q6TseEKAUf~KBK4vt>^WOL= z5DM5K^A6T^12LfUt6Tyi*`I*V)_Tq$sC4GY?|dOO3zvKO7uO6GR zW+8u&YbM|?)$xZwxK@1n3455ZuLY1_Bn7|wQBOm710E9 zMZ4mjCBSg!l)kGjSmbQ)G4U!e0qH2euaDAf%qRH_zoh9O`q-TJ09c4XLaR&JfcgD4 z1Y-f7zyYG;eKKH7d-|PI55Iq-P2}I6SEpr88Q|5NSuPqb!M$DCEk z0XYdH!%=EwTrqnrm(4QxvYy&X1X5w1=`|_s%c9Ob(2w2-^4YWGcH+5`N3iSyml6G%jnOtTz9u zJE^u2uT~qdgvUzJ)!d!$C0~<_OMqVe+UgDyotRK|w{>$GP-o4vlsaoS7!-U>eTC&x z(psln`farToV?$Ba?Kp=kmod|y`Hze^2fki1GdlbtEn3)HA`e7M1brgs%L6y5;T*Fa@`*p zt158vndgi9>tDOj8;-Gh?@eXEp4`JQ5fljKW9F36>?G~C`jR|P__sUBL7Tfk(( zVq4^2rq>vnjrv?}$e6saeBtb=X_6I(C(7aTvL%vZVc!z(!lhjiy47TkQMt>4+=Ftk zB70rOYUQbl>~$>?^QqM z>PY7-{uyhVjxVioIA5Lw<=bhw8l&Jk-*S;gL43zci=5_;k*u2M*%wU+J_okD}BmX z#rbAuzXQhy)FlLAM%>05E=EzwrDrx1EDLQ5COX`0c*bZ4%qo(|UP_=}kO##Yge{;N zoLyRme7{v?c{^$*nvP^j96S_r(H+fZ>N zeTVgo(SYZfhf&o~3B^xqhP$6Du5%`kzR6D5)SmT@{e9Y2$a>dBrb9P+X^mEY`1@)Kz0uLUwvg6~Iz`QE=u>1ldzpzz?j zR^wB7%h=rUbqP(_J)WHeb?dX1?fq09V$tS=q@CLX@3XKW*RkZbKGUJ$os@5A{~F~=Z6YJ3KqzGu{c6GMr# zJA+%RFhP>v8gw3yEC#pEP8S=RPhij!Y8l^A@F_# zCPb^=Kqb|F{HmI6e^Ab0pOg`&@5-F|YBKbJ?ZuKSTmbIIdy2T)`8F_JEz?Y-vY4}_ z*?OURq1LXkJ+t#v;bXe@+|Z-DAA@b9I66BE8eH$QOP*Kum525tTIUeN7`5%lIeWH? ziCWuHDVg$7$k{iAMOy_frNiEqZECh;oJM5a&kWVsyFPPWIiJ}ef6`pf(N}Bneig@u zYQ->T#pF%2d*1hRnp1OOe|?{o(Gx#Fyu>Qy7Fu(Td@0CYvJHa2KE)U70X{#zYAEAV zX5v(4I4sQ8zi1}CS(sK^^-*FbseJ3`9C!Cc9lSY;U9_pnN{@O4et$X_( z>+EHT-PPU;uX%2tS5SMmFyj`nOow8vXokILZ;E@lqQEq|w?#YQEqVLHcGuO5`q!LTMY@(-tH1_%tDH|2bo)Zx>H@jJ1eeFabd|m-uyjF1mV?w!%@VK>v>^!E?Jpxih3N> zM0Q&*5)k=VAUpTN{g~{%bmJWbs`M?wACDqr9LFnr;|}_*IS7VG$W~pqc-N%0-a)Bg zC4S7tc8mnoE8S8-)m11C`dgf%B`?M3QM8Skea=$+t+*jJcPkl}%16X=XS#*9#Re(c zRCnHMh=N-J)ZG^eBClcNzKYLpxmAnTw%_KtCw9Dl)mDz7JY0Kn{ambZ$}REMIm4l| zuauGe$46R2qG5F#B60Gt&|NQ3Lx4L(wEu*D= z+!eMu5%}|D>zndSeoyiDM=x`-%-ixV@k=Z#hhmkf(8kQHSHL@_tW1Tq8+Vq!F zL96Q*Br2;$A@ojM!%wR^8rN*H5~K617LzFlcjxpkNEET zclBn$tYN_7=qM?lQ*;zhB)MY=c+7c`C9m2;+uZ5g{P>1pFu3IIuB$r3YTQGINcJ>w zYtAE*j5y!I(;7m?$FR#&rrTaKv#1Je^zOqqh02t7pTnQ1!nd~f>RT2ZFjLDd;ms@q zPELph{o?F;>g%JtA4`}{jNJFAL}Aa-!mK?7Oz$HP z)YCNKfuB4d9txcB}Wela4i<#cTyb{ zJ^eAc*i+*qu#{3~+>zVmp>JHcE>t>O^{PQx^4zYG+rL19M>6O7`K0EMwPo?>lwacE z9QGic$?8o;=KEH)$Hqyvk}yw`Oyj?A2l_TyPV~TTa&!gx*B!f zwufsy;_(N~V-ZWJ9@-D-9=?j+HQj>r$}1Ac-~ysLqOYOL+xpfuk*&#tr}F1|pEH%Z zK78ormZrFLg8XpazQwyL@{pfTj^}Bv`VML?&`0CP{O< zb20mcsTqDb=%)j*GRfrYmQTpl;c`~R-ZrZf$6Aif%0mk*tlMw{V%9~&rKt4nxE5=z zvvwQ`=Zcxgp40F|gfo3lTogU~K;1Jbr zLTb)}H4(_@D2IPQ;KjnZztH#3R z^$tK&U9K9dPo}jV*x&GFk^wd{s-s5DQ&53B)+cz8XTu>gWs-^<# zlrAW68=c;vZH;^GZHFJ{GDX9E?5ZB8h9)V*rt7qGmnhXv51))-HPOv?kP{_Au6I#H zS-kh$eu!16Becf#F=$O)jFgE_m{afR#g8TO>zXtqub>ep*1r*fEoaZrkGHGN|yv9#=9w zYsso}f}|t|N7;{NbEIEr{=)2L5?m?8lZviBqq)gbgnaHXUnrRh>E{^CH+X{z)~<6s zNJin}6JZlN(%btroG>Ui5m~F9x6tuUy=C2uzh*f+VwKD)=@t*H?3hK7_HfkZEEE$+ z8Jzn;-ToE2{sP@SIJ0YhkgCE=5KrLaoP2hTJzgm`pY@_N%^8BENvNu0l7=>%M;+=qwt(jh7R;LU2Slo)0O$Ev>ZSyW@AuZ`h2b zQ59v~Nk2Kfpy9M^bbB?pt&RIOP1%D^pVPMVg~r-Bd`le_61-j+QyB7EH=HHN6J}>9 z7Dg`KZzqAi;$nNV!19Isb7$ul5mr%rcQ|9~?tQ<-(0z@(YB2z-O^f_JP;M zafNVEE7hl?wR`cPhhc?)CEII$&uBb{8Er`cw>dH+Vaj381@Z!@V0cnKw8ylgtPd)py zlPwQiA>nBhsPt&8mL+0{ej3_#*8%}0HT7_G3%jx$aEq#Qr+WDdTTH38bZ@PI`_=o1 zVoV_-J%s;dNEn}w&KF2%kqif-iJvo2H`=g)F=%2w;><&JVUjR4K>2nwm8Y|u#Y2C4 zPfHr351D53ddDMGi?|yTYe(s#Sx*#kZu@{H*Uwq3DZtuCd^=)YD5FaXy~2EP8>puD z3rNP{9Qs`pCy?5JK8B6Tl6FQSA|XmsGPDThUz1N?tOv$-8g`C@y7L2V9xWhw0G2jEuYCW_DH)uMycHdY!J}O?M z@K8GGOnz6d8))I+>`GodaM<-g8$qhlUtVp5&*L8>l{Rs_-Z^yL!^jLHZJQTOWh+5X z2c5RfwLQ}qol}+!U`~3Ra)p(iQK91s^{v!VtEGroL!db0UPz7yhgwYqDls$*;|0Or zI&&;oK3$7qR$J+)$X*$`{9FL%w|ek{nox)7j!W2k%Qv{Poi*L9-Xp;AcDwBJtEU$* zjRd;*+qS3}cPl9rg)QeTK&%x15F5M)Ju?l}%zP5kNjqEycjjq@*;ynoo&y zc1W44eAnQo)#vNsUVV3(9~oT#J{;gjhfIt2M8HDNbfdFw*QRSvA+GMM^Eft+{sP)7 zvNKNK3$QB~OC&0ms^l@%)E%>`#8usRhOATekb-;jNnB{s)Hl*`gFmuL$=m(NLVi zd|{HP{Z25EkEFLE>dolAi%i0?*`2q!hZ?mS!;u;3!Wv8LD`Xx6AZbI?Zqz5_pxOI7 zi<`ptMb{dG*Y=p-Y-YO>>R9U7ic2#W2Jy#94$&qcoe&gFC~&)k;n4dd?F`ddGqHk- z{+s|$ZMBjGJB~|j52J)4u6h(w zc;}<}>dps|b9x#}L(Co)2%>c7A`i`tg_%}ov{mhN4~#YHF2(#eY8n-q&#%5kjpI#C zwLxw)i}?WFr6}zk(S~pa(aj?I9bHp{kLDI{`Mw{tq;Wo}#IJ;1zbknjcSc-aR#z2S zEjrxGSaYIY@W^95z{M=SnHAXyn7dlS{cgl}>1`tv%j{+E8|ZwRN9giAEh^e$xIC8` zMR`4g0Ew$Yg)cb(a&jb-yo01ijPQW$MH;(%Y?=;-J$V%Kcfyy}xxD+)GgBRYLMZEY zX$_YyiC1PCqNBxC9o8Z;w`QTEcP@qEU%Ep)-{lFE069jjEQf^p0a>hBkm!u$CR}M5 zr#7b}c{8(duK-e9*y8PYO|`usS`%Xnn<-A}sB`_`z_T}ro)N8bcPQEW%J~f3M}BZ4 zvLV<8f49Nulyn|C)d)VLNhmfDUp%0%2krnKkfYnYhAE8GKs5Dz$nPac{#4RZ{;8ym z9dq2XD37GF;K}*c`|<*vH%yTj)^qN zZ+|uu^8fRLw9)8u*k0#pvfQHU#dM2^JkxcWUx(OhX`ugMbM8BJVvZdEz0}tK1>{tZ z+xhFTN`(Ieu8Z)W;nDmvv}eD9bNmUefW4t1(I%7hs&K8mpQDI8;|HDSon7T~K>HRy za*>)3S? z4BV{OLt3`s>%V~RtED^&{;`f$tFEaGR$Y^D>)_O`jFNBaWqV5f>aL8l3GuGhQab&1 zeOHh`bgou@k?si|e2_bajqfA*hNdLU5<~mNo)OT=$yyhFbKs0}r@kjFtk#h8TA1?2 z@tNNG==YqkfwB*lt_-b(v-P12EK>SpKO`rZ4#arfD;{F&qy$=i0m%;lmR%5l&B`07 zh5h0Y$v6Z_0mVs}HMCuZ*0!AV)!L<&clBV z_=loMHUJYgF#b2a(~!TzYxdgo3c=wG0m-BuiTZk6g_c)QKsE<|qPF-42)QB36M7(v zKnsFa8!#`20B!}aLrP5K1Ymong)V7fqdNqt%#0UXGumZ?=HqR>xN<)%+J3&%J3p zg}oIWn0|E27K|aQYK=s;Gd!-$BSF~@0FHG8-9ab|d`8=+nViQX2E`^P4v=ry(BXR~ z?i%KoFQLZ)TZ;~CEIq=#tQR@kk$;`~WiGRCq!(9StJb?o`bUd~9$IQ)-tGqGuGPkc znSG^$o&+y+%%a36H<2lwd}XZ9^R#-j)9ZZ;H*4L4wpXY5p4w}ue|ppM;QTBdzkALg zWN<}ed1<95r>TCn!Z-RoGoBz|iAMiGmH9 zO>arAVIuSS!b%|JtIPh7gHed#1^+p79u`R6i!npO%mM(s4Vw&3n+>o8mO$!HU|NTO z4Y;3)6NTCtvXpoK1XZk628aHd8F)Vk2y>F_2JH1Rz|FUr9?QE;Dc@05Kf3eG$Via= z@)K!`a69(Z)g>~#Au$NL7={IM`JRDS4AU(tfs_zJfJX}{kbW#`4Cetr_7TK9A|iXd zF>Es6d&x-IkZaZu z)!IR0WOY@Kq47=h-ji99OTk5e7nQ{_D7JjKQ@v^;vEIqv-P z)Xe(@WNimotih(GEWfPFp{KX}(R~pZU^ghZZ@o5zy+a)C1#NT40V)iy14)%fqo;{G zGoE?Ossj&|Krt77U;ga>=Rpl@jIW;7*mJDeY4{%q_d7t)RH(gpU#EgiKS*gsV`Ypw zVF#Ur_IH}_7zSo*Lj4y9JXyGJeu8e+P^Qh7{i^0~&f`=q;N=Gc1R0k14t?OyWsmtk?F&3@K-kYY^Mt3Vy?sD0}Ngo`n2;U(wV#&S*4std7 zxNa+`5&GB*s}g|S1=CeH&dLh+6$rt`bZ-=3rjv!*X$jTk4loW>O2(gtc+5bPd9u$UT3{1XJBK1j6N$b%H2+ z)8!>8Z(vobkqO6%fw`Mgj6a(41JH2S5`0gKXkn$hm+OdcxCD4zvX^d4r^%l1x!-&h zWfcPG6zpvJtB2<#6L~*q$FKEdT>5s&d6AfygSH3LjMfT)($OPWV79V@fd!kkxdX0F z3<*U!krj#BJ$fMD*WM8T4`@t--4$zZyxzr zgfmVB$QMFIr7jJYm%8MI{}8#44OBkg$8HODAm=+hv+dm`%T04rTsSlcSQ&ikzIa5u z&yMU53V!I-ge3c8MEqKI91)x3-YbzX&~|ZTIt-E^YOM@VoChtU)J9KeqrgEt-0g&0 zxw?83eRHU6L8*xAZqHST)KIb}2Jg?$&Ll!#x;AOb3aVDTFdj^jND@~5ai1`EhL(i* zzE7{)(j_^ayGN|dik}nd(J_mL@8W=$oBrIbc8-X^o})sDbs)|Yc5wh{YfRBXHfNj# zB}T)H_;-U-U41rLH4;Y^Ux#x(>oUPa&a9AhmQ{iuT6N}bp+`4O!7*wD#cibvyejIg z6e+h~cgJ;T;PY|4#qD`!Q0j+28rc)DsC=6hr>fZcs4x~6woQ}q`5BEH$-RBdMD0L! zygDeHoMOJC>pr%fgG`=$KfrmRu|f?QnbVa+Mt`O>tL|Af#@@>^ZLsHPZgZV%xix$* z%{i)rBm{^SFYq{%ky^_>luw`8eN!R6#!r_n4EZR*yrlN@&RxQ?&%?x}o^-!}=CsaN zp+Qf_xyLFSZXc7*$F@2~az;G8!4vTrB&?NjBfirUe_G-Bt7u;4Df_u|!jM$=fL5>^xVCP7&9FObZo!Ewr8ii`RLT6c=CFj&9$@dE zY6)$WWhqU*(Ga&ee0LuI^6*Faqv)IS;cSr%ZSkpJH8hqlp!ZRt!b3Th@A$rM^O2MK zZ!t63=S!PhwtV?4(9~=NM!to+iE?Oa%KhY6#!gIsVAL4S<9RKBGvVfYP`T9Co1-%h z=hXp}8pyBTAB|Nq@KurD7M%=2JVI~~#Fw|dota3xuU2{s>^23W1v$$zp>cf3`F>RE z^$(t7vXzfjZTVjH3X9xUOo&m^FOQLP`WQhrxtHRSXE&*BM|aPZA?bDMN4a-bl@u;r zW<9vfIz_*nPNIQk@)QdXZ%2D?r{ou93l-h^1!NP8c*#!m@)EOxH0YIcj8O4X99L;` zLkLdRu}XSow~0*S_G!quKncz{hB~h(l2q_CQ90v9l>11Qc@;asil(Gm_U{ z0y6X26s{rfID-QFrYLdhh|@f>z#y0)fV^KmK-za}G?6onKKS8oECUlUG1+BFjy$3k z5!ZeHW z(4bZ$N2Ge{n9H*xCc;j+(T1f}qa`@DO*gtSefaElb(%>f)n)T&*N6wZk>>saTHI76 zzGvyh`Jkdt$1+0dI@DKRnM7Ts+Ke(nt}JAY3w*Duc(+7(+%JufWj#y71#Umpk#CD4 z#*bD5eVE@Ob6ICUzx)jQSmct2VQKb)~r>ATHQ+j3FZ%%G2n(;_WSe=o47*Fm|g zzg97tQ(Kc_NM{eF{p|Q|FAng;V*92D_KowG`}~(NN6^IzI6vZxGcyz{9E@%r*=sb* zP|VoysxDmKHEK6ypAg{RIqLl}#qSEH*m|UIB9C6K=8-pax)bLvd@G_EN!rZmH@$Fm z6ib?qiC%WCS`W<&1YQU#PGeeWCM=Y@dC@!0CjCK%x49z2sUj3xKV&?Qp{(?q$cGLA zf>Vn+PSm#$a3xO%LKys#u=eeMlpmc&-h>IYMNZnwngYS9kLw!C$4d73BIw+wynK}G zKQ380NnZ{#u=Gg04Z4_ZdUBD~eA^>wnY%q7tFUw-|zb-vRs zZs^AAcFr(Hd1^7&Lr$KY6@q$y?_WUhD#}v~_+%5>6GC`iY<@-m${G9U#U>|4yGPlNVim|tJigl7-Bd9CY6777e?w!c>lJe09 zps4$q>H%#J4&czsexnPNt|NM#HFe{bo;i(aqkSrTOZwT*uk&)2_mJk!5nA{5N-N_B zmsr2ckXEUhQf4i0*wv z=uPXSK&w>$Ba4e`b?+&Uk{!zZZZrd?K^X}SIu@k2@6xu&`8L*9jS?N}c}>d^#z~l+ zsLaN3@4E;{YU)akk6uIY)*kr1AH%o|y}d&Yxy8Aq)b zkDgw?pg^zq8z@bqgf(IjWN%2jyKP$_R+}KGO^`e3ZEdie{#^!=z-PBcNk$|MY?s@Z zNP83s`+@)_Gz;FHmnyuiF`cJ$IW@B^#Y*C-%PKn*)M~V?;hZ zjmYSI2D(|!hm-KIe}Z|N??L)dC-taTbeg;IT&MoQ=$6~z{Fja(Y_Iset8P4Z6e1e} znirE~BoK?iiE={YGM*(K4O+emhINxpP7V%50y6J!j=!v&y{vnMfp%J%=rb9NeJ^%Z z+AW_%0!xW(*FdGe-7P+%r0y&K>J{P}^h@7f-BHxowzOCbv!HP=P2I(EpJ(YDpV;xOW;V!h0689yZoPUGWs+r%R<>;#S@l@j`Gfk=rL^^XjZJ9>SJ>k$oU4{U^Qfd` zzMb}Tctv~29fkvMq){UG@^Z1pD2GaVKfV#{^K9P+ts#j`_ z-d7`%+>qj#47zo9+?H!%!#Mj3?53~haykn}qRUNW%a3OAWtF|rV}eom!}22U7?qsr zBXS0cysX=VuPN*YlsgvzeHs;(Dz~@5-YsTRPAE*j_*vs;!vQJ2FY{dzmdeR}Ddj}# zI)nNo$f0*FRDRbmOiw3e6iYk;`b?haRF1tlNt`-=ybGUwc-Zf~-V$dZo>Uu~6(p~s zaFsO9u+iK>WO*_Z7wEEL#DsC>ClMquGkTa@)l^Vg)7)4atW8)MOB%`*e7ur&WwBQv zf8(i>-cq7{QmBZ%_8H(5&V^@P8y?pGOBsos0WFgo?JyIQVqn_X})r*5#poruN_}h z#EE$Aj7r{rC995rwwqn`Sb&n)!(CU!&tM^(b)F8mDPK#cSAq@^!UT2Yanc|AEaK|iw1Lc*H4@UuCw=EM z-fvsI)8zy?$xc(I9AERYV$Cu7)%6M6mIf_J`cuav%V8&~becIK8@0g7&0 zllOtbVBQ}H8SZl)dloQqFl0IO*off^vXO;htn&QRU?!9g?M0De?|nN?Iwgy?L5ukd zkK(0MXZ7>`dW2A!@-W=2YcV)^|NRk|%tmUyI?oj$>8e`9GSX36Hj)!XT07HvY8j;r ze-sfA!9?)vtjWVP7TI7h(#+Pmq9Rz#S#5ve<+&T7S?-&zAJy&HMW#0pWkl8R3f{M# zMd3T@FSCzu?_h!kH#3=Cotu$Gh_xBT{>W(*a@6xZ)Dqwby_2Go63D^+!g1gg4*w!k zh6BaXrLhdX(seSqZB=vgjNwbHg za@pabZAGu}rxR5^QfEi)i7z7e&NsS#==EJSvTD0u#xc-*-G>HnyaUq@cs@s{hYwK> z*^&%6xXN~RjLj+7+S_Com7u!HE_GE%lrR2hl;s{l132&pmx%S7huxw7LwrBPtUo-h@KO)wzn-8gq0JeS6nJ zi}$Y59jv`awsTSiKYkkU3Tv`#qIqsSjMZB19E;Z;&HLDQ65DJQVC2bm&=E_%VlVlO zLNBoEmEz(h4^BS#rE{;2}oRSFqh47F2AJR-c5&POa?}8do-wLA;3#fQhMp z@wiX$BDp?!tprfti%49&22Nb7408RmrwKQFdDK9^rfmK{?eoJC@>{TcDRkrY_yl=3 zHpCIKJxO^%VVL}<-E`_-Y9{h?J-jC28Z0vlG*)Z}Dg@~ZVsid2gbJ66geeJF?y(%d zMSw|dB-vBg&wv+&Q~Af z53vPHdsx)GbBN-6dT)v(10?Jlbk_@90K0cin~p_B<4$Q!-fYv)J-l)^U_0L_PnXhTe*rNBxL!tFQ@?p0`)KMzo(@i#O8OWPGdc53|vB&6H&D;o0<4!{`n2MxnS%opgOucuIW zvaw#8_DzVKs{ zX`69Qx4o|!AiPH)W)RK(e?{9mE=tqjcM!h%$W3XGlP73{1eUmNb{-vEKW zfk>ME6Rv=NawQ9x66iV*t^PY@KNI*eBFtxaq}qA$e1iT z&e+YUiBHymQD?H{cpg&hW;T-u@DJdcSbV{ZVJBC96qm{1X_t~)iLzgpztqDUZy*V; zngsy++hO>OsQ-OH^;?5pUjUT??pN}F!3r)jUWBnzR|;lqHvOal;8(gYO%JDdb& zm;iSTsr=68N?vacMnVa2U*?J*jAN2~pmOkxyr1}qKk;a#!0{c@doL9FB(1k%FMPE! zu-n`_C@*j)U>Om4{51&gDTw&FJo$sm4fnX~xC^)o=CU5KdrL zIuuw{OmWg);gP3vPM4Lv1%J5UkQ&+E$^y$bvAd@Jf-5wuGBtS@5vM=apU9=LTj#F# zbrV|Q9#Yw4I%cS0|0vO0iO}`_T!^n322LVJ^mdMt6&i*Q?*akk>3<<6C257 zcAj@2ig!Q*DK{yJ&TlWqNOybfha9W$V|DCmbkUO{Kfv^MW^i}^Y-CS%=dDZlZ)osttT`9uk{D`JotUX>xO@lg_JOPGAyRF4{tG zw;(!pBp%#9YqVuJCn02tFY!TuMclsbg`zD**UQ(nm#R*7f|iOE+E{3iZ{RIAo|{?X zbL5>j$iCi&y~Q8)O7Cv-%J)tcjp>gFR_6auf$uG-D5Tv_dMpxwhP{O@hgZSQ7y*ZS zBy$U9&F{UZHq;r)rkp^3LVrM;Xc4z8G$`EBg`U-IVYh#7J5iB5jRpKSg9RpAHf$;Y zZv;0$vy*Vl{cS(!5PK7Oych0WppY*%F_gw4de9b`=^QX%IoA|7#6M4cj4NL`bHx_av$HU)MLx7Nk|45LA!#TtDBV)z8 zD8)}y_0@8NbGtxs+_Z!<+P@;D_pVlf7pHvEa(EX~k?+PH^d;;%LiqM{rc3(0Xv3sm zb5)#%$>g`xw!~!hg`bC?lAKx8{>J;Ci7fus2>RdI^t!yXFGjg+z=d8u)#@d5=vE8b zZgWCMi3TJa%iCQ>7Ra2gK z!h}16qB1BNh=)f4H|%52ftQ#w;41)Fu^Hw1TIQV2fm{Z_fx81%P@>Gl7XD`soN5Pd zKzUaEfNs#A-J;96{{kQP^w}A>uMS)e`|Z!Hox%%1Kh&I#wZSj>6}RhhAqOSO|M>SO zE-gP%0d1H1lKn-O+#G`ZossqxWxw{^ZYJ zdjCQG@09-R{of!z_$PC~zs|_tm?Qe^jPXA(7IyOUu|M$o$@WiOlfSX^oCoUs55E1^ zbpH#!r2khl{~sRsm2_b3u>Udazvt^8ocY_r`+eE`uW|if_5KUj{}o?wd_pj$IC~Y05Py;^RCdP$uX&BIzy|1#*0Yx8q zP;#at;wP&%%ZdZSZe?@)UP$QI%(?|Kz0C2w)*rtmeoN&MNbJUQq z${t~Ax@gDGJf3dh8nt$_e4(`KS<227RqrQ!8lJiXXN*or(I&Uc>~|p;?LA$)A+v91 zj{#FxyBRHx4-<7LKe9X9UMAP#L1q{c&fMl3u~}{^q;Aizw$8^T&*90fffC}n_pq9? zrBW|)f3;$?GE%Nhx~EE|k+)c@%7jlwnY?LWew9tYaR(uEDs*o((@^LlRikpYZ;fvJ!%>H$0sGeK6Y=^Nk^KENUO@vNDjp;`&xw-b19Ea0xSz7J zhQUq>+C3D`SQDIyB5zL3YNg8|%sIG(er#%>z?QNr#1%UcyU#MOBk_r4^j@gYHL3Uc z_`7|)i1Q&hX_vYukG`?Z5K9hopod4(hv0=Xrcad{mbHmbn?#IMubHNz<7Ycr`v~0G z%9~j+`zVNl9Dky;2HhLvm#u1d7HGmt^2yZa=={A0%8$Iu<9h?q&cs(GV;;K2eFIyM zn6YS~YP!&83x&(7VvAS0;A*C(HSg0Fv~xA9t94JTzA2;UxcWTLv!SwOmqMuaxScc* zP$tZFM?Lgy-k4}Fmd*L=cCz|C*Zf9zx+zk33m4JSs;Z`bcQTId+Y$+hkGvT{XKqo- zhM0Xt%r=T%e@b+Kk(BwSa#ge%W0~+hyCmq#rrPq_w7EGm&f#pRH9rZT-c3~zs%M@h z-pk4zPBi<&M^q)V9QL|!-sYTQk@@cTqU!3QtU(V^(Cqn7jPjjBB>Po88I*PQ(vK&O ziWzUMPwcanhuJ>9yns*)H8h~0!ZXLSk|nfBt3p9{GcN#@*Ja($45Ek2uzf%;ff+u(0N$$X5E#Nn3pfvOWAQxCn8v+s->S1K z#kT3!N_>o#8=AldH5J2&;<$y%JIb7qoOTR8A~pFtuDL?J6mq^|a&Uw<))EUo2|SXrARmK-v62|I)YNhO5~RyH|~ zb=9Xf!wNRNj&}o14B@1=7$qmUbyOt!boBap8d9hINrl8VNApscy6fV-66Qk4>aO?5 zzTfe+4@V~XAMFzjk?aN8Fqj5`@_lDF?t@&s#FP4fgsC*kKA`@5~@So_?Y zEWzGgGBGl!2>YR6Z6P`;_PMm(g-n%63WnZ5o_{5#(Jt~!Y1`h&Uz54EQ`*QKSUz0!PFC_{Ib z$qn0;!WCL38TUw48SSlu9#|bLJFw|e^r_1fNs(u|3w<+Yc|ErBbwL3=-6)cO5jJhh z4|Q3;w>As4r+KQwRPzue9ewB4dHNl0Hm%GSf6==Olio9e0(<<_BXpj74B5{uUC{Y8 zF+>Qi8)vXS`>2s-a$7pawTXf8lWVp@L%BoG^L#V0k!Nqz%9{Fsbs1N3)XRHN!0|fl zj7;oh%5;?>eVozx0{ZKPgSSKZ)}AM=?GL%pqqV)}WZS&lshU-@G7OA-A=4^;lV11C zu~;tCKF6%G>`r}(rh!Ros3s=yX@GK2lmZX7RrQgltnvytv;@awhm#n=a^+961ED{R zFQy`$*h^E51NqE#x8n3ht*?`{=kR?kf)yz_hQJJZVL4Jglz&;N<}L^ox?qIjF1GRj6hq0*3H_ z8P+(`+C|^WoVGbpj}H$9)@WmhSkg0X7N_0VJIqWMmqV!+HP*jJfau*OPUUYn1MbDi zhmcS|a+G@q`I8631YQoXpdztICeykm2@&z^v5hHvuSC?WCyQox;`O%)c|G@6z7LL> zlDiW>)=Zm+QEd;ea3=4-wk8N8Kk7!%}uk(ey?y8L*f(ASbAPX}ii37%d4 zoTi=EihN``A39%$ee>5vqn=G^=N90e;Cf|%FIQjr~tgL*7 zo1Ro9>{S5+5A8bMC-v4u&_2BVvRXpqn%EH5&+r$}R0nj>UkWwacyNLkYUh{eu7;92 zVV`6hVcH*s?9wIE)Rf)Kk})!=;i_{I3Z9-rO5K(%91c-C#n-tAYo@Vlsa%8YYH>{# z(}%L!2ym80y}=Epp(p2e+3Q?|J}DHDU9;;cOU+0aR0W+$AixnB81E%tm#!0W7dt8& zw`+@HITcFrnrtQu#tyuk&r>o4`ZA7LU5uNeI|kJ5?#6d6us|sk++EOsQGR^qCN)iU zZGB9Bu(i2G)LdMKBU~M?N(pO zR^x~$-e8p3HyFhn+}6$SQt7A+KXXZzd%h`GYQX&(E$3`A+xIGg-iz>Lk*Td|w*o6Q0vdzq6Y;a4&nqf|;Hde^v<*yG-*vd%CJGUIf55w%P(I3wu* zuL=qr&?o{$m@pZRPbmc)z_$ixEl=wbr#nz{8chB$I(3lJxQszFd86`(_Ifp z6`#8alsq>JsjPz)Q~!V;wSJisEpO+%&0(-bH>Nbe45V8jDz}c)pZ|nxib_XTblhGx zp>Kyr<-9nsNfYpOyPFZLW5B12^RCUbbT{Xw>Z4k8zTcTCGo_vYo)K5_n0FBB2}x{u4!{Az3i14DrW3bx#N^8O7a*=BO1#8eum zJ!YqQ&^Ww zLjvCm>6)S@SR-F}tX~D4+|?t$@|dX(32CFe;o)L3DmJfY9Cjd0{^U{WO9Ae>amF#t zrm~vqa~Zu8$@)6iw8gwfXqbrPYymRYj1127~B_|CfId+5j5E1Lz4mP$%H)q=rs3 zPHz3zIJ}GGqT&A!hyC9Lnpgx-n*FR77YIZ(C+6n=2SeQW^zTWkM}9ZG{Y_5$XTj}~ zNAl*5k3^wqx4D>jO=*3?%a32fzr>1oa<=ple1xkz56S4Y0kcO2q&JgsutjKH@knX) zO5Ll;QFlwWiZ8ND&Y91C8S6ynylDEJhDxb{Jt3eIrlGAJwhjmxbLBuKJhEBqgUb;q5d^yj2ejjnB2m`ui}p_(9@#?maU^N-8_EQFLcnDe3@~#2 z0PrKcG>hd~qn%J^F#YWLTs*edNU&WeNmk|NfGn{Bay=wBc||i(Iq}6)>tx*z@1DeD zalDOBo`?fes^)hV4iILU-4B-BOXd>!!t%A8c7a$HuhWxefpx^JQ^HWDT4d`0zPT&i z{ZisRBYVG2vnAf#vs;DeDLvplAfzZFM2{hLn$__?yKrCETPYIKSs!LbO_OeStF+VqoN(H1kTquB8yhPM1PFBvZbi* zN+04>oLk-m6nk1&s~I3Gfi|87Sv zBvc0CbT#1eE_>v|7wiwhGCHIAmTrM>5-sknMCiVRgWv9vx7Ln{*7;4be|K&kr8~?v z)miQH=@)6e%ic(&6@|n5B*=eMx3@O#Fp7FSxz%>i!_;7;)I>L`D#}x)E>?T^MYmlB z()dU(IY}L}zQnJrR?}+ad)MQ%83-k+=c-5XjMoXsbRl6f{7cc-H{pq?C9_7~FA6Qh z0mmA~_j?1CTiPRzv_9j6svC295g5n{eTaYtHh9ZCPl(bu+$heubb$_&cxBJ!e)@ z8vaUx(~l7`nIA#kk477r(U&VLp64-1a$Zw(LfbTc_;4fS=}e`Z=NyrX;ep9!+y`4z zZlTgQe0cD7);m2*{#qQ#NPAc~3w~vJb&KzPRg0#oF(>|@s+`V_c!k2A5rYp=w`QgX z*oA}eIT)T1TB@TO0L8%cV{{kdxO$;=NcQrnbZr!?&gdqE+=wU(BUk0 zjohE1_Q}5PAAAXxD#co2++7N6&rF(gM9b~WJ6d@ROqeWjqYM0W_R+k(LAf?Fv@a~3 z?!06b0{Qz=USt7*kFsNjMa70g?TlC|Bl|>j60%j)ovPdAdV;Qgl=io0O7}KR?;*gU z&E&}H%6g(IR~h$UUfWeFgSjD^tMh$G1`bI%y;j+`a+`76kKK`}jl_$O?FX~A} zjOHad?oii7(p;+|CQaiVhgQC9S+DnV?a-EIc}p|$uwnVt_7?eze+ZiSN8sZp(8iX& z?1`31IJAWu_g0?92526K~o=s+`X}0V~G3(6j<+Aa5E3) zQQviC--^aK zn|ioWZQ7OP7)#DD9iEN$T1!rGwAJSzo(LM|P82i|RSWZH7PqkBR-%gUf*86BU z@r^eb6s1Qc$&h1v+y+jkKP_QQ8CMLQ2lx3iE7Eum<0;ZS!c!EW%*_6o*ny}NQRe7x z6mIQE>&Ve7gEz?Q!mvWC>Ft`JRv%2>N*tpIatKsUUZqH)f7Xs8T3pe<^+k`g>{kN@ zAkdDBl6^F;PxFf2dfwpTit0rYI19SyfD^@={t+?7e33-|+fS%v=f>j6EHo12b~j55 zP;FW&NreEK=vk~Sq#SYNbiUitBpFaJmS=7M)?_2~)FR*p^xG_8|0x|{D3Lzr zfhhg#Wb-!^qWj8D|#pY zf(du-1lYy8#l8=POssRH7Eq^K9NzF#DvT81`wdzpe=)~fx2{Yjm+k`G8$4GcLb(_+ z62t##r=emn)^`ZEYIZJW@O1>JK{yBG^!W9Lrjz_X4f220f9b#FPc-`9z0?pwuP@AQ zHd9TBk$$(`=ihxZ+nZBe&8a2o+_p2)rOY;W>8mnpGG=N?^Ro;yA{q~#k|O>8RQH}y zQG9E@aHAq9Npc1yi4v5IL=k~*kSwvu8QLc2s3=H~ELj1`8G(i-G$1)ikksVRB*`?f ziQYOhXU_c3%sTh|FtgTO?}u7YRTPzW?Y*Dp`GtNmN;@(2Jh@!l5ET93dj$7`Oc-=w zfR{F@O*YP{w&PcirNXB>(J~#_(A-)Hj+1`A@tVOL=FYsb&OFp8f)YW|(9=b?A`mhO z_GI*en;0aj_p?@aRa1C}PPAUi=1e;@WTcF4rZs(hcicie>p=N}JPnf9TpdAW&kd!YN_ygu*QIl`2*(Ic5HXXOCing@ zYg*&{94!a4U790nOYpXBH-xX;0H5r76AFUCKjZ7AD!Vz*E-su1FCl1aL2mYqcXN6A zp~hYyFYQH;49o>H38vjs_eemyyJ+B+-hbq@Kuxstw#jD4zkq;$o5p1 zg*P#ClqYV;{n~HeV7`v^GDTiXIhG<-n=}*QB4f2QWEOD{@7U^@=^mz^zo1>k)ih>z zs~;Rg5F~z`3>h&#m=dV5h%jS!3zCMm% z?rZOYRizV;*sU9YtII)hNFZShsfj&W&xEsiEE$aa#an6-KRrzyjh0LDxvwiwXdAC7 zGxg;Qb5?e~nv=aO!Qi_9KaXr&#KAnDnJP;O(M&6MeS}I$NuvJbTXSn#Cz?e@cXJ41 z*XDT;(2`Jh&NQ#S0z)f+cLR_wrOkJZ^yln-#{#(<0-RnVN6XwV(ACI;5ouALM)yNA zBi?*{$0@7TKxhMJ>4pp7)n%j&-GXVpe_$lEK8AqvkO^LVYM zv$(~dKNUDyIPpjZFmQb_+gncn{9Gc)|633cKcAz+E1Jig!GCZ+GF9e8XApU#s6X@vhcwJhR2JGneeGi9uS&%mAimM!Cfl;CrNVeqGr9E)f%VrzX@I#2d* z6&W%VEn)64;U>cS(aqC|AMQB06i?14 zx`&avwWqb!2F6{S!5Gm9{h6Gc;L-v*@%xzi3Sw`@wq{bXCrdNDg21IO!y$+=_E#hBy&lj3C8JSC8(6ABJTqP5 z;c{Clv(=kNpJMwuq9(OqMWe^E$PKxp%8NlC0B!7fzQrnuDeE3P&&wAFk_m4_cpb%b_jz}83Jwm zrKM@AWUqLpP@~<#TuZP>I}P13i)t*GQM8!7XZEMMAZbB)zP}hXpY1j)+Z?%lF>%h z)}I*A?SDYGaUTsLJ0!XiNdPjZ=8xo;4Js=gYp-AQ^e5_B{9t+uIj;EnRdo8Z7vS#+ zpdK4u&yD4@T*{thyp|E%x@Vl<6jWf)y#zri6nVqxZDKbeTq(#0yC%}j21)=UmHcMC zCC>v#16s;!+JXpS919!<9%&v8__mQ&n_d7leU|a8rt$ao8@@dbZq1kR%8jd0V0{oy9c_D!13_ILbUe4QlsEkW18-kbxjRPT+Z>cPo^xv%T5_ONJ*=Q4y>rMSe|Ai&U*iP zRDR4~1eT@WneT9rdwSB#GTx9Tz))Hh>m`*EF5~J&krl6Muew-q*J#Gr&}hT+urnZ^ zKgzYLC}C)H^k*k3B>V~Mo@uc9ybNObMV0C!gFm3wKofHYYAsm$dE>#6RPiaMxgJ0p zKbE(&EKvFuLowxT8Zh1-xz$(_7H>a4FU)x3IV+>-T0p!g^^2sF00-k2Xr-oxUrV8w za~>a-d7g0Mr>KbBLLX`XXCDn#l<7hR2L+4L2Hji6Hg!zf`~wvHsPc|nu#DF0eQ@pwASKT#kGQxU^=)!;CLn38 zL*9unS^(ztD9t;#90cL8*aoenwTU}mmC3&*Uy3DH%v%D_T0?8}nz0|fC!R@$JMCl< z#!`=GhHeXAz=a_1m6Oi)@)FDQ610)fTCf)9-Eb=YEb!`wct_)6T9=CbLt|WenJKQ8 z#AH-Of7_#E3;HZ@L8Lo&gNcNgOTeDg{4A2@@MbXhu9C>Ck-yl!$Y7Cm86*eFcan+U zgrMwhczDl{dHCf8{mXD73QN6Ns`%&h&xR5EwjtY65D&~2pA5GMY_wr*O|Zu%Ad)rZ zH=`wFH9P;H@r2uG5fA!U$1y#?@8}{*=W()X%hs+`f--iZqQGBbzjWHHxVgtYie+TH)U2`QT}}*XoC5_fTBVUA6QLZ*ksCj_ zC`92?I>&I%$-^hRcqHUrV)wZWd0g3VCt&O^XNq^J8N9pv3Mug_Il*3qCnaAZ5A`be z6}6J+Ht9&8Z@hq!@1%n)S+lskD1%y=kH^v;%k<``@$b`9!Fj&uqJppjXd`Xv++wKR z+;Ya8dOT~N_k^h6S;kK8hM{9fzQOMXX@sXI%{?VJ9Da8@n(l!{VHkme4hU~jFY~u7 z(e}|o7(;T$oSRM)`gp6+YqXSQ|7Fs-Ows{wg}o&)cSNu~Ig8I1)F{>Sy(;lv5*w|Z zuohG8eDW%EU_k+#3Qo28xStWBiO??0y1nzaRc^dS1x5vl2$171#b0XKZ~wmY*7PHn z|DjOh-G2@#{}OEeKhu9CwORfL-ic3DWA@)|#LWP0jMbu||G+x^!`Jcu3+r@i`tW%g zO)gra(+!09(ofP6NhR3D4)0}0_Jy^FTK-_lNW>zy*NcMey^}^YM^NTYFrXq+txE9z z2v(+I`l~lqal`F)Sy3wsdlbQLP7T=1Y$e1T5mP90-(gxx)G+9SM~ZclETggdQcoWn zIP8>0Pe@3){JFrHv-po*-sfF{O7WL`fCqyJioL)HH)DuZ%q&tU+NkX<+-UG9ss7!V z?ZeMe3r_d^9X;@#Bh1jKQpW^Odcc>rL0LsASzy48s2>@Wz%_1>1Byc& zM#NmONMliGTCK1-tJg`d%2%J=ipmj}Il^NNr_O9|C}vBtscZmo_i}XLK%|h0NGV1P zE0x`d!SCtvyh5C0dud#%hYH^#Lkw(E7)}M90UsI;5(Wt_?jH2_U*S0jELY-6%?k@7Qlk=(ryyyql2643| zl-W`qSW^g=COL23;q<&zv>_ueuPj%0cxKc0y?jwWe%?Tvba?RERN45;9Vfn$m*4X7 z+RKM(4(1CEa~{(5cIVsOTvZRgmciziFvf&2^kf)op;bfp%xdfWn#A-Q3eddoyxRPwNZa_AD?{Q(`FVowiod^ zL^^^HzM*qo%AkSyi zPl51xnEOT)mF9E0W{xorKGyc>jIx{!H<;InXM#E`ABqBI)KYea;^eDVQHF|m@{*4~ zt;F)IwM-4Jcf@&@U|2FSjmFkBeo^wOVKZ6P5F_yQK1y)`PN@dZf z^!!vGcZD!%qN=L0fp>2iqN5oPkp?ltQufy){mC(@j_GZNgNY?7bWyv}Up?^q3*VH& zAB3kIP=)Yqyc>Bdku%Z&MBL*Q7ddBo!oGT{tmicVB_!xE$OE|c|Ci3p)HwhpAD9Wv z{*A_0B4Q|uyU4ui0Z{SP|IaRqY2dH?yKi*>>u{(0$`@dTee2iOwuAzY3#|0#KfI>? zdrk1QJ0HY+qzrSw8St%3&yj3!zAVkm>QVt0D0AP?Zi5C{i1R&tF*d4O)iO#mwI1yr z3Uj?XCojbt#k5Pv?Td|Ayu{z9N0F7=OCaXOu{164Y!dL)#&o=W|C8Z=C5 z6<=Oxe@>Au+9gvNRP%4?XDST>f-+&3p&$%v2V#zUGwMQ8j~@j4kWS_$IDqA;Ie5r74Wr^6BmyQf*{Ps~ zobOVfbG|Ho9hV^}l(s)p@s{CMT5VhzbhZs`7?_Y}H`;WaZeK{B^=mF;ULSQVYm>=; z=HBy+z)=Sb+FZpAEHe5W6Y-R!Z~4uMs(9yCrN2T&A6R+`wcbG@pPnIaK-fIADZWcW zE>LLJ+`ti8viy#bi*DmQCr$7@QnceBG6`4Zy#Y7Yl#T6b&uu zFDcq>LAduzD<~V84ivJrajDNrJ&}qljg0S6-2YkJ{yVxr7^JB{^-qf~|36YY)Bo8w zQsF5AQy$_bM;-%&@e87L@10yk9VA19cZ*T6wXg72JXJjCR>CBDCJVEW>#w%8rut5>a`^oUR4zRx;tBmvDy!yXQt5}7VVNUR(4`=9 zV-x+~5(A+{Zuu?AKGb<*USw}pQ$70%e`+M@(uuE-k1>E2qBgKVPP!#ww* zzZYCs6<#A+s#**T`vClgDkmyml$gRU8m-u^sNKpOWeWpD$oE3y??}lNLG9Z%)gO}~ zl-UJaj0?$lpRX)utxUw_Xlb9gM7B8QHpFVKJIT97lmrCW=1&6gX39R9}n z{4Q1}0!n_PRDyahw2LlaSv#jbbj}MeM z_6f9nHEtpFWL+>r#D>89vK8rD^O@oJ3Xxo!W|fd_JPUo%YL&ztPR6F#LGYM#_R})E zH2%Lt>-;Me&%fHP`xi9L_}_pwyMG7T4E(R1;$NNmUu}02V?AI7M!X7r*`sF;4xxXY z>8nP)0S`d<~i|E0|$KzhJ4oL0K@Av@oAaveIJ@RyY_yu81UIJfz_N_hWP8G)^Z z-6il$wV?Ny1~&7yobf5cL+ts2hH1pkrSi#tz+6u|U>wKHl6Up77Fg z%LuT`T5b#_{-e65vv=rv*hPSfaIn7%R#Y6toTKj@ZTpq?)e z2Q^F^H0By7UmrUbt8PXFBo%KFd;WN)z^0#h8ht@%_~T<|vnbYGLIZBAja5x|U{KgC z!yC;3yZ6t?Qb74ox+Bn;4(Ly$0czYcnTVptfI8fatR?WX-g;;{mZ*FFX+5;e)(Gw1 zbQgdXwKMd7f$}D&1t(B!kaHj~@jlxtzAtMKdOC*Vicnb!l=J!Od=8dO zo5&`1mUB0{7AZ70Wqj4l1CwWRu^&$PW;gqhPvpmE>Qs75JqOVFL7n&b+FQ>%d`Tt>oQOrgrvB`0|as!b#Zi}NA6BP2gY+`jDtKJ#34K60YFbj4Cf ze=Q1XlP|X4p}l0IiC1EYWK?n$G1lGf*Qk$Gw~G(Q&sKW8_%c@9z$(&QAeOAri+?AT z@$I0{Aep~Mf!@y`{9P%Xpk=u3VW*Rimj^sM>dDTjXN!$r?x@F{389s9WhZ$OnC2N% zS8-XLM4_VLx$E1zKvCh}md<}*0-!pPB|&At6ev*r>c(5{UkX%seYj1uLG!*+SSd>4 zXG2+6LI8ER(&U1JH?zg`LYr6IdtjIXYF0^2g#++>oJALy-203<9Q@TIuvirC)dD{Q`MO~NDtG~_a3G4obE%^1Jj6ozv zOS8dPw&YrUxUWe}EB%9Ux(rwCxIfe~cSb(nXw#SfV?Ze`!@%j7(#786B+fb0T&Sn^ z5KR3mH&On+fpT%>I?Q*VJQBmKhf(@a^HtuU=}@mNLAs;1wo=Jq)aS(JwWf3Rn~NL;e^{OVTFrZA~5&u3V-m=fLK6Ymu4B z819SqtEJ1WMOh+Ty77L&_G!sRgTmZ(NTEEI7Fs*Lmo;jWb_gh%Wzv`+k}KOeI9QLK ziFM2LT7(;^^TMl)MT#a`@s=KC6U92 z)gFFAhh0wOmu6VfrW2<-xSXzOnGoAT(@yxwfUL(XwzeW`dPYTPcDj*HcOG+~pBQTL zkmLc2Hh%k90WR4bV@lDR<6Y5lGS8ddKF>Ic61ibtA$w9=1~1t>!KxSjtgTC%dTi*(MOHoixLA83mo{lakgwIR@{y8$u6J@DC{ytHU8UGS;|@nD($B<~ zIIL2HltJm`>tAb)ERV;IuV^tc`F!q#Z&o5-jv@wRmBuW;#~aX4M~!O0#v)KSr~gM<`A%9Gy5^++E5#-8>WdrmI!Tb`FAh> zt(rsU-g3)fg4PiEDf#vAHOss)&iW|*#_2UXmSWz4W_8!UM2v*LjvT>FHO7PuWUKhXkr7mWrjPY&Z;S}Lu=fmh)L+q^g$;4| zo?LFIUAoo9_+wJP?LWnOMY>l^B`?p zxRL5DAyH0E@&Tqp@2+~5iFX4&Q|bw-OMN+C zdwU>bzRwr^6@H zjqlg!C^sIyiQMX@D!2s`6yN^YO}iiF=n4nCMn`|K(#w~)1xyQQGl-IR=h&3Uz{sJQ zW!P#YgPuL3ZDeAR#PgD{%(h-#bWIm=IL@iRbDvfdPHd#Nzi`Q~PO)`;Z+~?mrpDli z;1|lPaDJ14NsVR&>OgZ-0TF+_+4qb=1?rbdZmSTr`++kWyT)+w2at&!3^F9$!wfB_ zfpBE4(*==^m-721m?s^3RJix;=gAQ=%o}SbbncDr)z_1Uyw(ksK|*Rtb}UOPyyo!= zDLX;Dg-YF1CmG`V1E*0n>K{E%0iE+Zw`0t0i;bs+1+$=%r)lCG5QCRm!TaD+@|15k zo$2Yfnq3kO$xK?xETP_h;OdDAl#-K8QPHL*bY^yrDb*?z9h5+$|F!a4+?1wsK&`5Ue(l~T3~@N!MC$YI7W7w zQgeTz3A1Bsg4M~rrp1{qmHBq7MZTgLD%?64C_)W+I3@*J8bR=zzSmVoI!=6kPa&2Z z1K;1NSr2Wo%cL(az(m3MJ;p|y5M_dXlGdZg!WW!BO~7?3pia2et9wWy4omZt*iF;l zSC(BsbMO#%k5a>ccMC2AqI4fIvDO;#m6{3$-`+@hbVT6tW32&|p{QOra6?NKk$P6Y zNJe*QF^0k~-E0=anv@lIhpxBvOh+f=%DDhu6wSP1gq4vhe(6*-NK=u4x*9>%TfZJF zGZmx?HFmb_*GjqVGZ4juB{!@kFFTR=%kK{?MDp^w;|#k7d5lff6W2zQz>cUL(TQ<| zZAvAM7?jwwU@r&JxqQ;GY-+w_%CFq^?+Sb$@Y6w7i=>bfW;^-=*`1p%+4I+fzcw2@ z%eY!F9CejJH#gBPXI@B|M`AoIscb}GGxncfb~5{-*kRiI*p+0F-RcGXicYw!YO>LI zf<_RT@u0ByqGe7$h0%`+9}WN%@W3(0lf09@PU}}==A+tOWB2{;5B~CH8?xk%?)o-p z-t7!#iR**mvg5B!^DN-e0aL-*-gj%Q@y490hAs3 zM?}8L8rQ@hzKZRq(i5YJ?xYtG$t@!;2?bqNu@fJO_h4!~k>4&0Z;k4`&{URVmSYXk z9(%HlNN0>vf1M$zqN1N+zn=QRrIX6iO;X62T8Sg$GeJ7vF9QY|q%}rbR2r%ZeFqnC z;+=)|zuC=N6o=@TT6*Z-cVvp@F(nv2e4e0cj89bu=uQ;-MqOpZnY$G`xN(-{eNmS> zRQAkuQ4|xZl%{^(EAyFb45`3Y)$ma}(Tq?g>wtt0M5V*Mmz|)Q`AUDCqLoTp2*Llo z>ZcJm1U$Jd%G{S*6`c2$Sjg{|2f;zst?cSI$1ui=IeE1j*HZ?o%69h<{Wm@q2A^*z zGIDRaimx-n)Cs=JCgKIQX}-=Ldt=j5Hg^FDt$?4R;M|I6F) ze*RNsshBb5jC3{#UCMgSR3q}=_1ZgtLfH!A|1=i0nl{p!g}5fnK0nx5Sm{LwXubvC zKa4ONVSB>Z@8VE%ko= z`Jc=NT<+`GGacJJju85tMT&24b)GpG9|1B-7)w+Bi{sn>opZ~*Dby`p(jQ3syP-|r z#Cxdgo(e(urHYWcAJt`3VyW7ewONW65i?4hg9q-D0dXcuJDRcvv-#vnYKhodep-4> zp+@lV-88CTDYHwK#9uq!+g(!nMQ_fi`gvXgW&zJVnEmJ@tJ#W|M2Fs{`#<>aXPWsT8hE773R|k9f3-A3b{nV-iHgM{Abs zX=i=y**i7ReNSzi_BHtv3LHP2bX2RUy0W%mWVZlf;;C;a0`;uJ|KVKLxc*o_(BrpP z#>3GE!FNhIK5E+UE+h1JcH!-g_SBsBd)Z2S9v~YYJ$Vmmi+D-l|wcv&SZOzj0yDiD?S}T;VKG#ep{f|UFmqD2lu;^ zu(1sEmIN?%P>(AiH71kdk{lBy4;|Z+60;X>ux|NyG~**&D3y{mzF6D%b$#@GErX~X z;hmZ|h*`OELX6FRci7RK5C3XSEsS1IqX}WRPTtMeKG~AU(MJ{k8%$?8DDcI_@YHuL z(wt%-pwJN7bs+rsV2H_KWNklJzWRZ1EarcRV&Bb%Dh0>F?j^QLh&?Yqav3&*$Rs#3Lc$Ck5Ko{LT zVt7^zJN8CJyo`1=oy<@^uG0x+UFozO2ZMCntRYB{~>)g_Q@#PZt8D*D-$GQZ%s zkoeN#_~@?xIPH560~sdo+UYK|u3z$$SDt=T?>L|PoW{IONlyM98aj773oE%pV&gy1>N?0o>MVc;{A86vE*~v1 zRxtD&I!t?f_x}U3eCa{YoULnn_x|kdaYf#rI|=u^TtZ|jkBnfyH9o_ zii-=0PLY-y+d8nukZMH6{x_Ff>W_4~)(G>y3w5c97q8Z4eUDSyIBwbWS?~NR*&$Kz zVPdAeO^@w*P-W80_+ZE){=Jk#HaK#{tcpPEH@)0CL4UFw?%h%g*+$wza1K!3m9rfa zZnyQLt0p(tbPWv-Vl!Cjkno?hChpR7GzJZhS6J*njNy~=v-a?_FEF+5cbJIKIwPmQ zM%z01=DiSdE^;oM>K-h;{ruJ`DYgqQE)nnkjSjqcX9DTo4Q*Qba=WUpbgu({Ne?Ag zToPd5VqLnr!Rvqu^>_giU$YF9fxzth@PN(b^<1|8&wXv z_CB_R^>s*CSjTXiFNBR|HY^DBgUq-5wQ_5#@_PIw&v4KZ^M2Fm$72#9XvFRWPncs! zXUCzObF+J=OxKVkmsQlepMGTQKEzL@Rodd9txHjCL@FvxGKAak2_BVGd;Z1eZwc3J zfa0HAd;B(J=%??*m(vrP)C--Cr#s>6GFA~O5mHXED=~4dVq$U`s-(ZZ$DxIca_PWO6u<^^0@ zgv547*Tt~IX-ViUKv`S*38oEXZ=DrQYKPm@Dh%DUpO>m0tLc@}_OTZ!ZTK{FLjlIi zyVwabV6&}H;eDpdVluniJ2&8NB2@Lu2_@;BwwHWjXP&f3&-paOF2{n=wTc{Jb-Y~W zMuJsWj#R@Y6}S|bw$lb5v**td=(jewkf5%uo0;CzLlfx(3Y^WO@uc;_EcW5Yr7io3 z<;gDayuPX)4>Hc>n%J1cnSq|DFe%DlIZXAZ#fg~n>$nd-0qLKNuhhTR1U%{R3S`-r zsWAs+G$wLvm$q1s7{fR-y4LJz#NNzuV5RdWd9ItE|Gu~Qe!yMuHw(8DL$BM_*P^f1 zs8{?6dX%i&$HSh)KZ1O!osv^fQR$ynR6hA1A93gd$$cf0Iu*gWHy6sM0DX?B&7x9g4wpp22>cCyS_BFEI2Yu+HR&g-X0El0ne z@v#dHc)?yuelu3c-rOosDS0%3n8ea#PiXSCDo(E6>N+JNk|8;-CwOgc5)tL#p(!2L{E0*v0lU4LS z{8*FT#G^A(8uj($+bz$RK1dfO;uWJV@(;n>2D`>;6kG|X)?EXB74l%sn1{S3ndmbX z>)Z|2ds0G61Ik1IGPOjsD9<~3qFb%D?o%W*JxUSd=fctK*wZifxT@#Q;NACMZkjhU zd)FVE?u5QKu)my0cbc&#cM4utxsYK$^n6=c)*sS!XI`H|AwYg<;htR}->~o=mAAtQ zvkGK<$GoW$g*3w&L1*uKuP8F>d=BQZ-B4l^)Tf)`I#TM%Bt0@#(Lz?E-G8H=7pB?N zrDbHHc}Gk|ewNmLH{hsBw7fmC-%M@!gE8E*=>Blcj_lG}rMXM?tZM#-Z**kfK|r)0 zbU?Rn(0dgH;hi^_hQxCpbUsCL#8OJJmhzRsOBbOqam!%3);mnfZ? z>`E%mkpqkdx-wq4Wa_=>^!D@a(DDVH{nFa$;91dR`ewFW&3m<({h{7WDPzjTtucx0 zH+nCX)t7>p`O7S`o}Y(IgkxZE(Eyl6hE6o>(NU*Dy`oO+=Kw{{sJrb4C8cGt(1*Xp zvx4z?ZrRh>*qTL9(Ktfx&j!u_*GzT zC$N5%!aN#*^c=TpE0tAV%~A-PazV9F&CF0pTI>F9yP2LjBf!D&&o% zG^%52)P7nj21d-`9gNovmBjV3hRBQ5G_@7azKs9i5hq`0R{rsEyEMJ}{bPbWRkiMy zY|91my>R!LD;|tkxZ!l$#WurWjNSh116#y}yUq5{mmdFmI$`+`yt?&>gD`)xWm6Jw ztpRtiN0C$c5kv{6PGS_*xL_rX+%YcGxCau4Wnokuw{~pM;(M&VVHzN#s>SggNeF~XyIc9 zSIck>-XpYA!RRGD6N6laS51oM4NG7flR`VG@B4BJ&NM8;^n$n2R{6j#)cgj|zxS?<<)Q91OIw4QQlRJi`7 zEtMUcvt$#P3eiX8=(mP<8Ee~5b~WImJ7D~V%%^6y?@g8znDR@AlLm6Sr9?{XOi1@9 z3d+4(_u!8F4`~_7PAVMv7BuSPL_Z)u2qis_U<=;FRjDz+)Pyx8S zF1v8!AJwY=s9OEyCyx@KuI%;)R1Zi%=sF;Ru&1&YaY5VTHvd`U`paMc-~QA8*1l)y ze~rZDUH(ZyA-}5@I8SWMpMS`e|E~n*|IUv68$BVJz{##7>GIxm%F?+-{V>39v$B9vWT$Fy8UG$>t%_$jKGyB;AtkV+PTYwl=$?*hPP8Ri5t^0~)12w5?f@i>1gpf2`v!j+gl$3| zmT6yo*0j7zm7#ut3PZ8xC?$;78fNc0>Ata!afOsuw+9_a`pf?Tl}~$Jr^nYjP3c{$ zmMjHbMWpFnCzScGIcd3-v3Lb}GX4R*V`;we#ZtAf#BbyeXe5zg4fvkveu`yI36%8-OgVJV$U^OXi?BfF%jLaqF|9J`Zz-%{}U9*8#xCJ%f7R<|lhM4> zVZC<1{#xdaw;qNhsb-msVQyiIf|bc%9+AE2r-(z-jIye-h(-%a#EF6o8+INbi0z&e!{ z8eD7YLw4y~8vQ+J=>9e(y~r{8tq-mV`#SUNd|38qGV!pWHRg<)6|ZGG5!Vg$12U`? z*_U`glk~$BTm{&%p1)BBP2#3N2}|nX-=aQ|h!kpbn9G+4$CYDa<;=$@2p6r$JN>Jd zm?f_%R0)>4GTmHwDQEo^u`d}yj(8}IHnlgLH-|gDeAc=-w2hu36)h|$O9_&~sBc_B zvFX>4k72S~^RidW%>KRmE!Wb4z#E>@z@iV(u-2cMdo4TTe?WQc-N2R6uCyHG$}Y2h zI9dpa^JZ+nri}M4y97rqszO#=)&_Fs2IGr&6<$H!SS7-H+By=z-+buKX*H0+qsuWN zaCnaXxA$#^M=seU#bL?57R7JHK_C$IifoPgWvC1lAPlkue23o@OnOU$dVTiMR}szk zfv<5u5Ro1KIew39cqAT?W{mM2?9kdS#%vCpTLnyA_(GWFCIP4iER6}45 max+;qVZIOx>ZRL1MQZ@(y+}J{_#cZ9{DpGz|0{iiss95b){-Is literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/create-function-detail.png b/static/img/210406-python-sentry-aws-lambda/create-function-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..7e4c777484b22e5b3a363e4a14cab578c59de4c8 GIT binary patch literal 188050 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%0A};mNGa0d8)eWA1_AXT~=X9gNncHvLNK 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\CP#Dr!>Ifv_PP&u2= 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�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 F{1129SW5r^ literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/create-function.png b/static/img/210406-python-sentry-aws-lambda/create-function.png new file mode 100644 index 0000000000000000000000000000000000000000..33706be60a3ff85c132ce9d6c5179a4ca6bf5f63 GIT binary patch literal 85806 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 literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/deploy-starter-app.png b/static/img/210406-python-sentry-aws-lambda/deploy-starter-app.png new file mode 100644 index 0000000000000000000000000000000000000000..4abdfe380da9da0c991efb467170ee65cfd0b09b GIT binary patch literal 74252 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�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 V5(QPCBLV*@$f!zxl{5+X{{RsD`2+v} literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/functions-list.jpg b/static/img/210406-python-sentry-aws-lambda/functions-list.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9229b338e5930044ca2d257983c5e3e9044f325c GIT binary patch literal 49733 zcmeFZcR&=~vM<^&L(Vx!P9iyjWJHpPNX|J9ISp9{6;R1RKtVtxi6jF#=O7{(BxfWD z3(#YtRn-bzwYmrNSM&lvdP`M96~Mp%0Cn&m zfL;V*R03g+0HCD>@BjdS3t(el0}v2l0GQx`{C5miz@P`Pew71&A;y(Iu_XrgKjDAkSY3Yz5?X+1@XnuQ30hfZDx+{DFbvOIq|I9;>sTpO>_tpog!3jlHL>gMgi< zyI`P=m!PnKkRTwd5a?xN=j!0cV(Z`p^N?fPt#4*yf!WKk8HsBNX?ZC-IK$L~eH`?H z@95hFyV_m1XH$@8kqwj%boX+1@UvkFba(Ucl@63+`^8)u#Fxc_Y%IS>{9NVOjJ58v zD0})iu!swY2?())wSDXzrFCzr{$3Znl4JW_$bf(VfdEkfPah{i;p^A03krz{iiq%o z6#TwH9)31~{2spSe{i_z;A`gt^YVjvdazt_w6XPs`^mAf34$#M{@%nT{8LtWmcP^A z7Wmr&e_P;h3;bWW&h&#Y?7JoY@kPq<+h=n}tVIBZLLJ4AdJ7*hv z5bJ}O&)wbg5{H498>IIF@f#3J+5Uy6(_gTSjqRWOZET$W#J}kU)&zyP3G?-GvkCfj z@xSxn?gj^K_bYLMM?z;GbzSfb>V)yt)l>5l6N31=hwUA05R-!#1p~GF4P)Xv!_^Hy z4ANsV*!e1hb_J+GEM#wUQxn7tAXfEoyK~w1m*uvOFjWl@gQEpA5ay?GX|Kz=PaJ$z z^gs;q$9(DIsr!3dm@gfDl$Cz3TV~?}qTlE{;I0Oj<(K@wIy-3m!T%uGS>FgO#|Hoi zzCXYcPS4j1B5NuS^2X37mW{G_fmciuw2T)L+u8LL3tqNjy|fFx?j?J zx%-0Xmu!$oXPCxiT~JQQb3bSO%YX#559F<#%`f?BL0skFq4c{=Am$Ff#+S1F(#ziA zrV5Bb-63BbJPdx<7c%GNcjL0H%eqJ}w_o!Fq=(`j^AN|X6 zP)_J=FTcB&HU#B_TD#cXx(i}Z9;iQX8&C#r0xSR=%(j3h-~zzDe6RivUj24Q6|ez( z04Kl!;Qzhkj~Yh5?s$MlJs=p^20TC--#_c!_;uF-@CVD!|1ABjE#qN=8m_<^ z*n&Ht3AlmRa1c9yb^d705Lf|AV1Hi!(YhTds~eav@BPOzB~Yu|V5^r@@IUynko-Z3 zt%7|MTOC^!`x=xUDi4)`-Ug3~U>1Q&L9hQI?LX+T*06@KmaxXK7O*C*U=Mx%#S&V; z0@%uLmT~~C_!o_#Tp&+z=nbeG$Q|SirH0Z2{7^Bl9VMs&*s?fSs{Feym%9I9_rL1& zrv|`3Z2mhPo)8`;9u1x%9{0c2B<3L&|3lwj7X8f{zuD|JS#AHc>K_vP$M*km2L{-K za%%oA>z|a6Cy?moxzIgZkIA0)zU~Kgu2+0Dzo58jWuFN7-#~PFF;L(|qk8WmlWP<$wkNdZO*% zKK{S)gI=Dnz}0{RoKbWD6Tl8|gBpnd5`YY#2&e$J0Bt}YFaa#VQRfVfXCEK{2n8Mh zkw7$%0HgrvKsJyIya7sq4?s200JH*KKp!v&i~-Z&_*n(E03>h(oMK>L;9wA8P+-tu zFk^6H@M4HyNMXohs9@a2(8Vypu*Pu0@W6m$gkn6xh{j05NXN**D8hJ;QH#-v(Tg#J zF^RE=v4OFVae@iKB*dh|WW?mc6vULmRKnE6)W@{Ibi(w;48{z{jKh46`5LnXvkJ2n zvk!9&a{+S;^AG|+2q4rDRtP^t3Ze|rhL}PeAwH1%kSIth+3fci3fi6Ok&N5tV*m-a5k-C9bsc*Q)6GnmIP;`3APJ%2zCs1CU!Y?3-%E9GWH=34h|g-FOD3J zHjWLBA5J9B3!D<1W}IQ1RU8y90WLGH2(BuwDXs_ZL)=u{x42EX!?@pYPw`0cIPs+M zwDIimg7D(;^6={L2Jlw#PVvd`uj0$$>*KrNKfr&EUxwd_KZE~+fPjFF;5va00gNDw z;5orNf*yiJf@4B*LLNe8LUTemVH{y0VGH3T;SVArA}%6DB2ywiqBx==qIRM=A`~$N zu>i3Ku{|+@ID@!~c$j#H1doK1M2Wk=B7Wing3~jP`_%g-(Uel`fI4nr@aJO3y>DLmxn&Mc+yP{R-t3nJacz zqON?nGR1(&z{8-+5W`_(Tni~V>{z_CTb={CKsk>OifH1%oNP>%rNF> z%+1W3EL1E?EN(2%SvpvdtPHH`tZ>#G)-SB5Y**O~*dDT#v(2*OvrDl%vOi;QV@Gl@ zb7*mdaujn+apG}GaXNFRadvb5l~&TtcPD{y;rzvdpj zhJ8)yn(MX9YlA$PJmNggJQ+L#yqLTayfEHO-XT6LzUzD*e6RT?_zC%y`2G2d`4++^*BY)VigW ztTl6o^Nz=zYHdJULpxb}_U_fY-goPDuyyY0WazBv3hRdIcI#2-S?RsiJJP?QAFn@c zz-<6GXfq@+G&d|V{AqO4D9LESSkU;Mai0mj3CyI%6vx!iw7~SxOvNn4Y}H)cJkosJ z;;KcUMXx2jrJH4=6^WIN)kkYAYa{Eo)@L@_Hm_|CZ8dCP+9K_g?b7VF>=o^w*>5<= zIV3rJbCh#Ta$I+kb4qsFa8__mb^Z=hhNZ*yT-05%U4FW1yB4~l-HhDI-ErNm-D^F_ zJzPCHJefQLJ%_w_y&}C9yrsQUypcYdJ_WuQz81bUew3i|{u#~EXd6qepe&jNxJ7%Mof3#gW93K9LiTWgcfgfj)sf`SMis>5HcqQT9=v zqJ^SUqt9aOVm`$R$3Blm$2rD*iI<4aO2AI=NElC4NPLq-mK2<{oUD~x^^E0N)U$&W ztCZeUvDEA|{4{vl!t>kDYhG}?NO*CU?wmfBaU-MrCBw_7FMnp*XAWm6W|d_#W=ChA zyn?;@nxmFe^_uH-YA$xJf9_hIVP1E>RDMwbeL-}=d7($)!W-Q;9YvBwMQ<72#usB2 z!;3dc%u5DKZkZN9gDKmI}UL)%BGk7X5{6)!6(Dx<0}s)DMJ z)y~xmH6}GfwYO^9>SXFF>jmly8(14M8mSuNoA8^$o6ya{&4(>sE#F(6T9@0b+NRr$ z+ebTeI=*yjcJ_3scC~jabvO6O^)&QK_tt)r`c&N~(O30Z{Bvc$cz@*=i7!gM}bl42mOw=st zZ0a1t-0S&k^W_T?3yq667e6oQEln@mEpM&(uAHrguMw@Keq;Vtv@WvVu%Ws!xM{Yz zy5+TX`aN=+Z2RR7_fEyG;_hdpF>-a!XAiv}^Mme3;epse+u_~Axg+AjWrP3Wja){dcJjBDNrlF;y=j6J|eT_#u}PtE>C zFEUUsOehor#ktfA12X{35Hctht1vdXk`9iIHwBx>16;}*i8=3E@z_OmkyN%mL-^Dj zVvC%6m#Y2J?B7%D;s26me=7D5y{19O8}nC!V1m5_fq*>)1rrty)@8!M1>G?);r^cR zekNeSCb@N&K0=gk4byEN{=Im{USVe(RLp$)OA3jSW_77+rOEz+Ty0 zXMDDy$Y~o(X2e2H>7Bl8gIZit__!(2TL}9(Fg3Z%#tPZ72(iK=TW#b zesV%d5~1~@gr+>7(3_igD94Victd#SW<#fBHyod_0z=+Rv_f<2jz>;PFHPU&( zJhD_j%2wGlC{DuUDt$$h<4032Ud`x^ZKMhzp*y+yYhhA$H-wN)wS&vP?2Up=8IPnf zS2&_+d}N?D##WQ-8O7e0F`V%ILo3kJzRIn6h||VQ92wy`Td8 z78>wXs~%C#r8cm>#UO+uCG~|Qr&GFNw^Jyap#N&DSS>l1Z8XApyHZeX)}kp5@|slM zBeEf{ELgpPUWtq%_ir15@ zja#LgTKdZO6GJGl^{cjb7_aJ&rTC|7d)&yX=mOZLsHP%DOAUq#?^V3 zROLrzVdCK1mr#q2_bo&zOXXCkohd|A;%4Ny1-l~h!04L0E8G_*EtZToJgXylp?d!hz>=J!!h_q%}GfHzOsU zlZRI=5aS=@CdR*DLIWy6SHnU>N>OPY^i5BfctfH zq5-*k+M*RGIpj{Cu9oinEjD!zfwG*4G7qM4JWpNq9n&k039Za8KQtkqVDM?14kOFk zJ#hmC7CjCKV9V(;Vk5(v(S6ZXno`p~idmuYRbmQoBMddn`nT5x7@wwlXKIL@%^!|M z(aOrwKVwO@)I3>#SR0AltDisvRh6*LPiA(f^3xvd)f}P2WXVms!ICzEM%pSqnM7A> z3@xj3VNL8qyA?!^%oWBihWnK)vDVhcqb^8-r}bF92nm^$Gm44P5q#x zWf$hj-+&Af)qoE6xhN}h_;mHLNs|gGJAU-bj=Ufm65#hZ*uvKMeu#Ido}aV?duch- zdIWQHOi~pXAo&zPF0(8<;j1F^-h?S21X3L;wANkCe)Cm#eF#fEiS$oni$Zd;Qw)a=m zUUfAzVIxbB=4P6<^fINU{Qd?%IF2i6EjToqe$obxZZlu&zEe3qq$Wzh9y53bSu7`U zrEonGp4CL~33`0Aw4AXN6VhNwS$aH>*rD?=tWyt2kioFXq||lu$LD?>_J31WKo9>m zr{5H&%LJyw?ofGWcPt-|R=y}f^hkKVMXb9j(sx}+@Lpw-n>cgc_fYtjeBbp#ylOtE zsUSmkB*0JyJ%3m1=J@VVbq@>^OLh0i@Jv5+f zI`Y>GXS%P|bDl*7BN@Arqa!dt$Lb}5Ucs3;jvle?lKpYFeSkbrrY%_ejMXdf*{0>S zk(F9y8FNj7HV(~tF9Iyx=to1fOHI#^YMoyX?uE3X0qiF3z=!RosQ4udo*$+UzbTFs zRuAobw@&%gOCgrb7h?OBc!T)pI1&O7U>vAW?RTPq?H5Rr+ep4_a=}CQ8~m8eRLu`p zYcD?4`)k?CP3H>dxn11lQA@{eo9E_yf}^=OuD22Qly4J_0hsj%R& zFuc-?QmM4BXne{Mhb6I}Va>thR@6XjD7VkRCL{O+4YWHbbdpTo?_1JpezJQ(xrN-M zCwECtLRtPW80njzRew0%@%e$E-OHPHLDm6eJ9O+m>3ldFV^sUQo!Zj`3-PV<)aEGW zPNTZYwT}fGdoFc((h{*DZv`^!1pEgAkA|cb^R7wR)m(#y;r0*E-k(swY@k2`xV|pZ zW3wk`iX-1f&!qhBiR>C&3|3d`JMNDUU$Y7#&e4Cv@e;mnOp^bmJh1`|Og}mb9lcNQ zf}otxA6*ze$P88>m@yg1o9%wf=xAL^_0r$cDwE>_FDB-r7>0#nj2#7nChm0w>ION< zCuedtrLgyA7LCuwr;d{0xwCmaPg&19XT0mVCTYmIx$o#R6a!%gQM~P;7)y;-9a&E7tey3{ORYO&oq^T!|)6VyHIkHSQ@T~iy?H%bg8+{-Fj z&W@bAU$lfnz9k_#=X{bERZnfUEf7$drPvrA%Y>Bn?F`=5H1xN-v$?23sY|P)LJ9mI z%jV1-1C;ZDysbtToFleTuF*!7`Wo%DJy}cKW-{usyh+!$qUQFf8$uP_8QV6}hKY z9lSTMr^b7uPEH`|xV@d3R%u!a$ zjA~t}(uWs06pDQCt#kP)I%|m$HLRwVXdZIy=XlrUP;%FN8oT|1-KkcYaP|-};_-B- z?6x`n_ah}{>Qy5G+evLO0b!<`qxe)4d*gQLV>%ffeJ3ERqUjo{dr=T~elwLmk3O&Y z>r<22Mk{~Slva{7ko)Jh4uU9x=>4h zd29nGE-$$KWyqC=fPs@ePKD);B-^b!tk$MCS#OO;WOsSu&TmPWsx;8Q(LA@@x)FJ# ziAUbEX_)1KA}pNfxmO;~ml!+!gwjW7O|3-7(wnAJ0e@!0l&RcN(8G3*fhK_7&)c+K zi)XTHSe-DG%KfeXqw!hdBluW2-nF)^+V}-` zQmwo{b3&$cmX@SS)K$)IZ=WA!V85UWe|TOvf>_=amLE)P^P*R?4o|_?a2N<$j3-~e z5E?9%ReSY$#Ke-9wy$eQy(C6wSbYX3PJPydkrvw!%A`UhUc(i8NM|jl&itaB85tS7 z)J*G4eZf(;SMc7B^T)u|$&!T;l?EOzxPE;9ht%6VZ|IzC@7xJ$Iifn0GAfDAF8c@+($j3U|~OA05oH&N7SNooy~-?fy1Cx3#Kt*SVfaK1RIe`qMCS5?F>(3&+1J_|^|$Iv=rkL3J# z7;$W&cE%#ljs|kjK!?@OZyIP|6&{+1Z$(_SVg|qPQi0$T!FdpfckLPKUXJ}yNLI<%|r|@A74P>8Ye-gZq zG(FJq{@QcVmvMpEL2x&tW|=2_5d-G~t2AifN*OW96B=FAVT0`WUMxpHXSfkU;;1=_ zGiBuZbPTz0%nH1;dhaN~V|SZxd$(NSxuav#xH1vg1 z^@G#Tq`2%q&l;vYdWc$8cWh>eS4^=H^M$a^?os%7B4PrWIUMxkgI zX_F*+g^3t(w-RVZiKs zb(soB##h~EcD3IX{$knOQvuIoG*El?8VxMNbKQ9dJSm4&2OFN03^hrzTI1=(#Kb+O z65dex^nPGcHs+%m?+ZfFURqm#LqPZ?AUa^pyV^V@xfCB83MqCrMTGC_ev+9sEBa;! z_4z2Ks~RQBVhs=m6Mk#Fr{eH)2MuiPSe>UfF`Sn-uh=8I&mZkJANYyyH6WtPBYSzq z+xxpT+V#I5zSJ8FV)k7eCywNm%U7eo;;!VUuNxN3mF>Qu7hI+}$1y?!z&08HM+tHW zLEF48-HgKVL<3!09mRUe!vYOTr5h(iPYr5D%W^87G|w8oXv3E8dzo!xH88j&yXK=4 z$(8HrdEaUcp{l>wkVNL2MV+o`w4-(wZ-NFQqfwwMss!$bw#XnZB-PHuthxkGh|4c9 zrqRG&U3TXj4hn8ln*I1bS>3p2gK>I9Q^rxoJR84=MjqTm?NgI2)@+y}J3GVSTX!T) zw~mV_?5FSg(b6!x_-fxK!BL2!{r-@nS9nR10Yh7~)OW!2?{u3UHII_i^!>JXe`bnTrqtTtY7C7C&e`AQb@bN^aX5JebUHYDWW$uP=lVgKz|rcpjW# zLui1AW-t2UQ85|_^G5?`9<{r)p)Ys716zIC!XZDvdd_x#Z9X8iprl&9os4bkU>Y8Hx~>4)n} zfl2u$gGYz#+$z0AcU)BpGa3)3?`=D(1j`EFi4i7iA9?1)Nx6(GXW4YCm-oayq^*6HvIS4DP3X~D@ry;VBG_q+R{ zB~^pn_cycKJMACt)r=6LpFc?_4}$FZ!))cP_Qsc>~|`U>pl-ps7x z_=2Ov(*&EJB0Es8`goV_8kCV=C~tmQnmciB={zdRf=Q;2|E9Ks7xeZbyG4$oR$fJ8 zRaFQ^bLA2o=epsWQbeW9tWPmV+3qf{1;^>Ua&}sT`IyvT-Vp-I@6=y9b!%>`vFv23 zqxqj_-ui!-IQlym*r=s>{o#rlj^W+rDgmeW57&l&eyP%|w+~3gGw0G(A*<;c`IOkY zbU7Bp_GljZ^(z>UIgON+iqjQTYKU#U_bc+o-W9pZs*i0^LW~C#;Xr){jF>x~E%GE6 z8*uL&7dljD|4f^UOP7+TDVEYJycPYd%KUx(eBWvLjuZHH>|e&*3&CyXy*S#u=dRxG zW9g9N{wNtGDXAC+2H*a`Ql$Viz?8;(*rk0Aok)|v+COS${5BiK(ERx@w{21sc276^ z0)u&90amf~xPD~YBfsnTRg`Ks#P^k5yjyy`N&3~Z2PFzy!{BgNDTPfO<}oh4I14i2 z)YS;Mo_!nx7T1GI)GLFx;1m$fKm$MB(ZB(IrQzoUFjNV>S$odA|@m08UtU35JU(kJ)lcFBAZH< zkF=(~~JeWkNMj?(U1UVuD!xi(8)LN+naX#+#CwIFr^wri!v(hX&IU zUkbDdL7d_<@=-LWTB!IVt|5ezh1KE`Z0g&?%538Nm%XKv+Dt_-r{EFunO7ogE$<45 zCw%suR?TCWzq)YOFsE6{p|nnKhVr9+>}4$Bv<+aIg{lq9OFE}g<9F*-jm#@IR#Zxa zTd4W8f2p+Y?2XxJA*hZ?m&Z9zyx>DYy0brMpU5>87MyVm%PQkU!Epub$joLo-&J)) za9k7X;Y@h_p>Wnbp%$}QfBp5seZAR>FBjJ>4(}_)t#K&XH>31j&a5u(9mf*ZS1;iLKIFH_^7KcL4gkD1y|B?dukTLhbY&L z(h~QiRld26soCWS{Z__THatB!0jWG11W_jey^p_~s-h*?TC z&P|tyv^ODZH8jFVd9aCl9eU5@Jojq^q*cK&R^n)4(VV{j%$+ccYfRjVOpP*1XL#PA zK51#zM4PoC^>&O=vo6ouu(tqU4F~~@5&SnZXFuKg)cSuo)W_&NQ${|^l1ARoS#-OgBDJ0Xha*W&r2V2dPp~x>k#Qo zwv^ciM#CV|y7{x=z8&-c9bR32g(Ws93F*+_AKG~=feyp8fJ}sBqbuf8#Y`D_-(CkVq`^{7S7dCE3A2`QqYn`5JFqDaK+{hM~ zdwC)l*1#IHaLRaxQCY`AcgtYRqtc{6)7$OAPSq;4(7uh4C$oh2M3y#Og;;9`k3D|) zj7x0(itC*4snK(Iy`0F%_fz2&@L7H@cWpko{_~F$Yxn8VZ*iI(^Z4CQmiOuqunYw1 zb}1jf?~3QC;MZqmyG^qF#~b_0bB+E{MmBcc4Jyc&t`{85dw64n%pMKM{`uq;&q*+h zTm76S6W~er`RQmz~LJnzJ_TJ8HgbzQPW1 zeL6E&HiU@sIIGn@P%ylScLh%6VJ`(VrYyX@0+f`h=8EIZN2z!W6@ z>tZ_&r^KjiU^lJ(KJAc4O@OGAY3~Q7Mo`4;@ zD@AI#Cz3hb7AYCA-5|p_GS|zHCMijy%dMKVw(nGvr4^mKf}VZ;Ue25mLiyam+N&pzA;vo?f$?Vt0u%IeC>kJ3f{*XBfIop2I^ zO28G>PIZ#K(4)=oP*nbKS|_v zc&))nYD3=z#V#56p~r(I=F@XUH6>R_G0G>Ar z87kdB-nb-4wpnM;70Xn}nPfI?(F;w(a<}3BGVhq`JSr+d>B;dR3ESHuza>>B!}ZM) zEL>IbQ-pHpCcy3udGjqj>y@9_IH7(xi-Z)1z2k@GO7JtNY=Z1Bf*04-j`HSzEczaU z0a!QpyPcps1g_iS`>G`V8#*Peq2iD?q^p)zq9ON}`}eyR_mi%7-ya*=kSA&$sw6n9 z7{fV|&z0*OP1W)sjOJ`xeAr(ffs=rrJUw0)zpc^yt?k z^1Qv~#}z3KYa_G2$gc1gyQzE~Ws417@(hK%nnzVlbW!A-T70mx?oQ)~?(h-n(q!pj zjts`1|BFz}Q^|;dh=Fh5_6kE@S(JZB`TTiuWwsj=|+mzj@!m}%HX}I zPL%FgJ-_YA#|7!;d>5m1fg-1pjW6tV?`opfu-U!HZ?sOZ*YvCeP;Jd4zhr~k0nla? z9q4O!bAv&N-(@tf$O%UCeTa+eRs%ze4NLsDq+Fhs?`WRIuTSm?XmZ!|QE3&PgMQ8n zPkmJRLZe!T;hbc2t2=B-e3W0DAmjPrb)tqOvz}P4o?GtN1{QgVUB10}$nvg9S;-{? zjVsRW=U-8EE3;Ze`4f|6rFrBsIdNVuUtT9l5IufmbU`-)?pXk7VE6KadlswA|12c$ zWUM?_tbr*dS6)Wyv!sS}Sk*If_kvx&-F>z2c>-yH@b{$NFg4SO4_ac$zU~~uF4OnE z*(}aaaZM;Tj+LuE3Xn~Y%*Q&p4QH6C@M=pqrV*9BJ>0$T0e+^Q*@&&pDA+lznN2*u zJ`qfpw1A34ki(34{d@QY))GFwHXc*UdegC&LMZ(p42D?Dlm}yWJOok%T#w^)!2Qe( zFlGJ%wdi1la-N9l~k;>j3{}BhixdWOEZ<)jTpnEE>A2EZOy6ea%CeNlm9)n;4NL zhCuJ)`Mt`q8rXf4r~ck#inW$^2<*>!3;#nOs-1}zf;%!8f*06eh`0A?wbL4vOko-r zHOh1SlWgg!L|Iw>@HLO*+OfzEWG6mZyKaZx-RL#VsjE(ob)QZpO5YD{Suq}HP734= zhYE^6OS@nhX;2Q}sC)3d&)a&);RfwdS6RZ_*g{AuJ4aNH0>e(}v{B87Uk=fi{H5oz znpZR=R^off9(lB|@HenxbqUuOQfdEJom^H@^EU5z^;Z5_(e!b>+UbCm%#P16Xt}6| zK7iSD55pK0@kTX zn~39&4{=N*yO)UyA0M34Xd%nO-ChkgC<#=%rP0KC;cHQJAY~{CeK_ozuQGUf_bL2W zefvIEfHQVR=!cQ}h6bfo1CLT$f!v4ef}$q%1b#UVc|Am44T`;K^GWR{EJ$ zl8dPAe3*1x)EphM?<*|W@qI|y%v5ivW9sJqA(vW5Ot>2Ti{}p>4H9xwt$`m7#Z8za z9Uh0PJPrH0Wtv)k6fY!%*v3gYYs^rU2&$P)e(6V7_VK^4<29q)j#$&IsS^`}!+D?8`Mp7+jD8g9J;SFU)?_><+U7Y|)$ z|HTq|oaZm)h5IQJV#&ot*ttyi=OJF~SIH?JWCfO!hYDxZRJ^NHK;j`1chsVM>_<*! z70!qi*6ydRXYXUb16M>%#5r|kp?<|yK*h+myF(YsI!dCO-G@al-Yu%$YCOR(N^Nh| zF;hc)W(~0>instb!XFsEEkEl57pU24@L9|=W+tKphBB95(nHW=|E(lCR{Z+N;s6*i$5S8li#kk8Se@wC};S?+Lg$S{i7hj|N=HF}@VRr_ZP2 zyW}O1kK50$p89st$Iv^xNVHK)dtDSLXQG+`fo$(h?wF_~z7SJU+gX~?|)Vu-L z|3W0U|At8ZW)!En`?m^e;XC$v@T*sar*J<##V_)os%`0mw+!fYg5AveKksJSn=S-GcY)rk z`D{VDY`sk5hCnePsnWXArS9PN_WxA*S1S*0$F%eCCA$0BB=kMRJz|T6=z;U--w^f6 zuQBky*S>YaX7ZcW2SB&i?;>7X2;rUzhU9 z|Ib#dzwP|*+Icvh3T2*v{oYn%`9l8JQtE%Xl$r!DT|MGQOv_M=tlT)wsf|kZaFgZyD7}@>hlydl~r; z5;U{qS=YAxFtsAMkPa0_wNgG^h;_M=d1D-!eyW*p9B_oyYZ$dg?#uAL?pfk>;cB8s zQDqvYM}t`oA?Alu+^_R;U!Z~K{oqfss?fj*mg(E(A9T&&h7lMFDHiL0WdVOuboo&k z273J8bkVY&t)2ECfu+VQ%Oi~ofkSw>8ArUVQYQK=c)HvOS2LE;n8hDpK@xydumRw)BCnx0rma#o) z2$^B#3yC^;=|@Xe?d8lD!%T#YNa`Y3z>zz%Np<5GOQ@L(rV?IM7o8XRn(>R<9oOt= zaZWpoz8-d<>KEt3L)~-RU%OWEj2~4CTbef3UxAgDv0C@?k#|-ud8vxzk>lY!vUmd! zA`Uk+3g4-S*RIf{-`$gp7w4)Q;fKrc;(q^bJo8DfmydAx1B)v0w7vOC`E5hSlugUI zjgxR!thcWw#9s|{0R$u`oDDH}?bRv0vi2CmjpJ9$T>VoPp0dN{KRe;mt>%V!P<{;!}*h6c>g*YqKs(->+YCmr)t=D-J0V6ohMP zz^`!{=LST`8wx*S4@Uzgf&$-gb7?o?1{6nSjo!NIPFY$^bz`RyC0Ul--4(Uaz)Lbv zTvN{zI;B zz`L$MNLI4uoNl>(aModY#`iH;B^sD<%JY5=M$TR$?#kO}rW#s#c)wA?(T7jH_lDkL%j4P@8ix&7;cxhWxafCp84!~)7qywvuysHA6c9**(xaI zjH-WvI=fV>cx=d`oa{z?!TP(&jXr_S1Olo2IQ0<@_AW14`xV~=1iiq6&I2c?tj1EZ zYe@zH>QKF6x<1fy4VR4^cU(baJLg8*bwY<{fCdZXXPoGS%YD|GcgV8rdp6RRvo7wg zp03_JK{_926UdDeRVg7gZ@RqWL=D|!i55@qiHmKW8pA2R$@TU6k_*G~y4LUk16qt5 zZvbvcrC&h0W9FO5O!$mxZI&U6u0a!{R47BaWji4;r@bz~I-}l%g5sJvpdi z60+>xcLf7@U9MxL2eCY3xglmUfwwt7J4&Va(+M|};aqtq8dtMc+`l-BxoE9%u%$sg znVDl4fg97K;qxj6vt#8X%eju&BtZ6u%9w|&ByxPjh^(agB)a4i$1&9o{Q7JXN)32mf2c)K} zTohRFpEa{Ns&6l;_d2qqCAQl2G62F+hfie{UiFEZYZjWymeaR=8O*VxU&g&7zuwZa z(NaufYWO15K{7Srj$@26Ym&J8-lH0Jd!L**#f>cIHDa}yy$m8dE97u_L{5EGjhXQ4 zuk3lOx^u7Iy~Hf!`{c${jQ@Bt>LH`_oN zEa!+EW!mJ^Y46y%bJ!179~skc*(QO}o%98D)*t=Mu3VY;n7R6t{F>n`N&0Hv?hktH zn#8iPyP6ckRcBPin-fD;-Q{1p?|y*CZI1NbGz;Ku{&^>&p=VZ|M`L#DQOo*tyCqXd zZTY-bg==)gHNFB$fz7^(NDd!-gpIVdsw5E0w5FQB0Rd_nl9((WY zjG4KM-ZbBP)%VAw-Mp$oF#*CX&3fIIST60010>VYIoKJ_4}Y?)@Nq+1_LcX35GHxK zs&0N6J{kL7ZW9+0ggp_ZLKq{5D|@-Vjb&XYiK*QEU<&Ky?>Nby9Yva#PqO_enHm-k zvb#yl=A&8G?ZiX%VX}*-DQ5`{P%Gun;(%|+8-`1_4Yl4RW%QlSi0QCgbymy|pjv&N znTJ(wfWSw&Xwp_piq)%DMtn|ev$+xVtr#Q5{-@mO=m02UuUEAXtSVN7P4xpU>4!Wu z?pMoUd4$1sQK3Cq8UeEVKRYeisw}Jw<3b!OK8{k{st9Y37g;=eb2~}1el?cMp93TL zq3G=~_sWdYkQ>7pMp0`^gL9j@v*LB`5w@|`ZC$0+toiQwPkHC1zKyI5SM<7by-OX& zuBvr{y%sLgpjWPq77)^us!B2y(n0HRXa+lLCg8#g{6-z7VPp-+ znE@y2*-{1p{ORJK0xiXo^>&rs!P-yZr3&pQ7O@Fr4L{0~v0mPN>hzIXm_jn0_Epfd z6T$xLNazkjwr@>kRekuh#m(fKUpYDMe)3OHRa$9Ohp#^CIvgCBv}%P`GyUG4PVn4TcaGEo(p_J8$Z5~^-pdGmhZw5k7yBXBTXU%5 z4xOsvqUk;le(TX>jSp4MP3IjCrJ{QU7N0DqOtTPX=GhzN^}k;KDIIQF+L_Xj_AZRQ zCh*y(=Npmi>~vBG{d^}9$-Yhk*>W$*&F*Y-ysL1r3viqkI0x|ImYUv3mg@*lX=X%RHeF=f9Ix|aHDv^~ zIDeRE1o-zJN!m(vJyttSuqbuZZGQh<561tFvq|v$*@JTM1XBCn=;ghU4Mj|i_qwM z&R9W}kLXyl>?R9A4sr#H7=!DGirB)g^*<2`9uHCU0l$Xhsat#Tv#rrM10|@Y_El5B zFPd!J=T+M%bVIWt>b0=zFhq4IUA}-QJPL{%&LwACN6 zFln#O7>v`$1kL>Cu>c25s6M0kH&(zs0bVwSTk;mNU#OWNgq1fY&G<+B+PV8SP!xcs z#mMxLu!U>Q4)nR!^-rCPw4h&mnU@oVUeqe$Xf`jvDY6I?MejStq(d+vX@cdCXtbj| zN(hso*r==d^S^Ts#V{Vpz*%k-&i3G9k}JOupfKtTC_UXaP{4_z#3fhO?`y*Jr^gd zvAMn`ZmcC$f^CV$zr3jB%NlXj9d-o1Z^nNel$-EQao|6XynQo z#p3+O(EoZr82kSsd0IC3msDFp=N~Z*oJb6|?oW{2U(qE0J*Nc2deDun{hSNMGOEMq zygblBUyJvMEK!$Q{l8K(FcFH1m>`hLeN?I1Z2N;`U9mBT`aSTf%@|Fcbzl4(bc@>q;wLZENGk}!6gw=g+iS@z% z;k@}_n4EB;)%jWlCqc4w)9VE$kqEHRu_Q!AUF4v?Qqt$5fZbBWhdF48$y*i+(ev{e zANt_2DHsO0*jfKeLe&X8vuA}B6@^Qmk?Deb z@?yeCC9`CC_wwzMTpLNQ(l$_;T+FL;GWTwjnZV{(#f$(Ki#To$K;L6CX0hoDVN#EPY-NAF!oaB@a_949 zF$c7GPT@y^z=tc4dnQ)xjiBFH!h|-l(n&Gd)i^)#qS!5@iaPZnjz+Mj zfTxZnDJZB;D@KNjEUpawdOcl0)3TfTmacL7^|XrsGi<$8Pa3$WDwCkd&a4+bFxfZK z{qTNz)^#RE1s9RQgNlC*CxSJ#o*%3h56c@)7N9{zi!HI;g#ObA1|hzKe|I516k5 z3Gd#-a+5K!u+JJ!;a1AqUyqHEn!JgUMMnXy%GUOT(Ec3b!U*R9bCqHYUF5CXm zDs>5M$o|+9)3ZpHxEudf1lg9}3^^tsn0AYeF7d^BRFN6vcuc;ZL3Wec&Iu{)7O!!D z)yJ=wUJvs&(&kl;6Z^%_eq;&e?O{P?M#vGO%_cpF;vVeF@gnA0Fqs(>q+xd9-gN%* zZ0J}de;x&Jw94A}2=^d5;R$ic!OvOO!jW2zq5c&SqfTGIp$77!0V1{z{wR=9ESJAM zq5x!g=S9P;b*S=ke~RawuVovc{+f3Yoi(I(bo$y)`6qWVRMd|#{w4uy6?pzq)rh_} zxE7T$=qhi%!p9Gk2L#%Slba5bt2Bs%AhusAjOm3oKmFp<$8-MtiMt>mcRn9riu%~M zO4rT`+D9gKb$3gdAm-mWx$vD!qeNR4NuC>}s70QLG@P)IkvnkMJn4UIKf(J*K#xZ8l`vr3&{Vil1t>~ zb4WTM&{KlRez&tC1RN-UevZ`YwG8*QShQLv0$}Z$UO60linbz59lhqORr!RK?hQ3m z57NcHwO*if?L&%PycKShy;eqTk9SJpg(5b(={;vMm{FDms0}0fiy9x^fYf#K*R{ci z>&c)9wO}QVp5IuHA8K$5b{<%Bi3EmBTHb-|Uo<1zQwku{JsHG^zC_PF$dgWA!I*N= zLO)lMnYq+Fz2|egjM~jU5nJ~e8vzFyyhqDY$Ja_)bsa=ChmV!TmUdjeysyeYjq%vv zGZ}BNUkKKOgUzi#&xeq-?m?Ux2U&&Ue7#eB>2hPO$w;*EEyPR0*I;ez)e zR_j#d+3Ri3ub(%i^;*!^B!k5aBM%Rq&uQN@hEZF*NPIRDF5U8|LJ(0HcgyE5IpMGB zS+Q&ebZD-K%&J7_%iqs%5RHJ6#3y(}l1OnM9hqq|)VfNX;t(=@;fbu%Y&@mdva>pN zeC+!P1SccCone+m9?0P!R)hVYkEqya6zy>FxqkAj)yqY1^8c$V}~Yl-=)s z&S%BmCiB9CsX#$g14flm`!P0&lj^=pw)Agz|4g~QVvp{-{{SBE!D}vs}jGW z4JUHwGPl7^cKFo+%42a8L%bWq$1pw9X*rRf9b~DiO0%`*pdRsdW{0yu7t_5ykTgTo z^3*VY^TMF`m83d<6X5_2Ito@kcsaF(Z`nHV^&OGQm0)@(3Ut zKcf913KQQ2b0SF z($}_-xE^}3DukcJ!f&BWJz1PQzy`OAPks|w(jU|Xs1?W1g9N*o8Bw71Qif5D{-6gkF6)gS!|R5B zy>19#1r}>|e(QDT$&K>jb&ez#CchW=h5F7}Y9x9IWqxh#Z;2GEKy2^yGm{`zGS`n8 z_inimX9>He`OBkdniblxJ@rCzO%SEUiwgU_h_)}>#6T|l!ywxrSa<&_Q>%I5!rlr# z_(``M3*u~rW%?Wl0_&?<>)OvT@Rp_xKjJI5%^<|hKIDuyNSX-7^5Vl^o-v9HoUmk+ z!IZh91!v{hP@fpW8Z6l~rzfk#a*Li51jFPtdz`&?86C%d+|%@5yuKIsBSpTpBFvNI z4jjh>v;5o_5py_#9_0A>0T1Pj#tJ6i2kD`1xNL(mYuj zeJe`zj@o$6CwGA!y&x2u3E6l67woTKM2YJms}P(GS-UGtC_A#S*VDDq!|p!raH0SW zTMOyjx8>B&UQ^YmR9yG+^`6$ZZz5IS`#;!#ybkH}#rs;`@4T38{(Oozn{Gepl&b2R zdu*NI@p^yvsFL2aXz41k{Uyy6p96K8Cr31y=r>nH#GTJ0j+tFF*nV&74X9I8{Nu8J zbzDF7e~Gl~A!x;bu3*V&RyinfxOj-iBN?%a5|<<56nY!@in?_B7B~BKaGp~>8_Op* zqeYLP7)yE?b!3C?WUW0vpxcxyhM_w(^nLK8OuFPN+_6iFmHbs0%t$?6cOlo__|e^1 zy1l7{Y!rrxH@FzeT#^s}pZ?c@u4=rGrgwFaag$v{IBV93} zpf?T+CzC%YT87`|GSsY!UTD5;=peeKcQhSDQs=JolkOWhO#NKdECdd^*+mzd_|GX` z&y;*x7+~?e=L#xHzXFhi4>?$@5;st=wh z?e~<4vK^H)(H!c3_|QaUX29B6V~j!279U$RL+1M>XHhsI#T zqt{d&nNsHJTb#c(v?F-Ibe`I3*l{d4Pw|UO4T$dpVVLTjG6&+vIsJ^TMf%SaLJf4j zW7;4};1mp$k^JEh{<)Fb{WZ)`@>j^E-mBoqM|po_!twt^CjbBT9<_0)JCH}2ai^lP z%J*pD`m!p%0gk3vTQUl3aYU#>Bg92Zg>h8N@x4{K{Ja;|9%2n{3LG_RIF*K+bmouO z!x$vSNZc|cP#lPHxLlnJ96;+p;uiq65lCecDCbWGN=69c4&ug_O>QPobz{8*%@!4; z0q+f*gkS(14(1A^VILeb80!&9JI6aC%^Y7`Ns8rcpDM7e_m6oq)+u-+*w$^fJMvI@ zKaasBKkMtg#4ZiJQw$T-9SYOuD$TywXw~)-Q5bNpNJ@^q4DgNgKRKdSja<4N2jCy= z%oQ|F82@1>$iBJ7_VcPAFETbK`r%BmY)h`p(uAXGKl|bX*7avBzGeSAD0QC=%xdqt zj#>oz{iu_q)f9#e7b%v+uc+IzQ%{-Y@RW>9reF~>-^CQ8yAL7!n zldS5I4^ZVCr`x|gztVjz51O-17 z?)9g#(=O>`faqMlXJdTRoXU+!K(5Va)(CcL?32iAq&!WK))ed7e;!FIN;E*NK{QBj z0^T{<)^jC~U+8*nj3e|!aSosdk_OHQr$XR&U zNSDfKH#bwyhqzBMXIh^fap2^!tUq+p0OR-Q>YH@!Ab4fV z7n^1#E;%k*wPyLTodM-pXyy<|FBPKfDGuWZ(9mt21jxOv6uZ6n=+KiH9`IG zXa2}VdIVec~et!6->Po{OF2MHguefNQLY2#av?tgSO2$nxT#YEAP zv~)_S5>#aY&hps0+W4~Y@q3VeeSJT1TBkjW2{*)ug7|P7T?9sF8RIeerq_IWN5Mwn2mY~}oh16$XKZ0=e1W|Zq zlB4P$odbw0ATCOXo7k`#b44~yj&gD6uqqF9=7B2D!$|Y}6YF5(`8i7MLXH{$25?}2 z5<<+IAa#(?qgWc_01^9>aTizF>d{xltn3ezi6a<`=|@@OeCxY<%1KGweUA@j5qdqo z7I8Uy?Tkh>6KB1X{BI)nwn<>7R@6p#k_P4A#%=DX;v?Q=`}}c%^`SWKIXQeZ?|crD zkG|kNaTTgVwSGeMv${=$fXA??XYeY)9-G>n>YZWOTP@K&>Nx}q*b8!QVSP`{ZkG7r zDV2(r47Q$*di^ESpR?P4)%xJx4;r?-+FP9}EZR^^J4L?)B1AdF@VPetxDdeGpTeVH{UOUw3dPPV($Kvh;qJ%m5-8=+(k&X@1l~#LQ3>IJ$~g2O!;Dp$WKqSauds zVK=>1-O*apR+p&bcB#TJz@_o|!4rx#_29tZ+H=8onS`F+?P=N*6ei~kH}d)!LA7Rl z@N12j*R_q22A|c5t5hOea&7qVM^n$Q{`fwdjI8>cg6xhzz`Ud0AnOWZSoi9$%9^)Y z7#0f}8fFS()e4%zehhD_@(uDvm}t{1Y1p<#eFxNVjDM8lf%!k3HR?8`mcqDFt6GSg zn9;_TOhai4;Cok@$-Ytsxi_JTt+8WjW4s4a+}G;f7}`bQcfegaCbVE%>go3jBVRXl zXMVOCsicFe0BGZ@E?y1E0zZ&7E-^u_8TR{rDuH4|w^9RAt{5ra<)saTteo^Lax9Nr zTE6}|i}TF+@O2VfisQSM`eUN5%I!9lNVBm^t7^F?aTkWI4L6ydfDc}U+=7rXZB95g>WeSP-H){I8&SVY){cmd_2g$27t6fAc#QV$?asXhuyk&FnwT`&A zIE|6svMCkFL33uRt*fm``LXZ-@iUw+y%+W|dqdA*Yy$JjQ+%Eb%NAo}1cG${!9#C? z_cobBw3>&r^|5yyb(C2sJxebBA4{Y?j_C$kbxn{E)nJNP4fj{Dx_~Nm(VRG@imW(Q z-J~7?efTXji}tE*>CC+b=v3VB)(8$TQQq{rpaqS!mo>PCmvVrNWq!1}EBuFCZ;2zd z%BoRobgw%f$=x1X+9S$LG1{SSHj0C^FNrPdf(z4Y{qOA%z2l)WqSTpOA=Yy?6ZK|h z5>+l3bz~7P881#v1ESsl)7a}B*2U1HJ3D7LDROreUavDrjdxpGMSV|cFuDc!Y3vU> z92B%?9*RHJq}=C=H`6>Fri`8(octWi>-_?SjYw2!n>Z&CS3Gf+k*siR=b8o_dh>5O z!hU?V)C&9j@wD}qyw`fJ<|=DB4RgOT&7IyemxUb+zTsnkm`Y+60e;9i*vM>Bp{3as zTm-W4Ud-J>0Fo^`2dzP^mS{Tqxu$ZqB!=f5X#`cll zHPA#REj(306q;AY*&HT}qlOHrTcl+XV&=`dos#N!e@ln~0DHq|B3eC3%cp_L0Ret_ zN@W&~WPT!#7os3?z4mv!GlzZ7ykej1d9|OI)hEJ zZzsNPXMhu78Z_T}FMQr(6X3-Dnw2o^^NLR|zMWg4mtdvzb~O17 z>nAg5=*Ds>M^1jza>wNtRuw^VE4w`%o9mzZaR04uB;t|0-3^;2a&|oS4DbMSr4NHH zmuEwNEVkt(H`i_D2|caR+A$sE(`0{}^$FPe{KptJ`+U3pc*;xN+`w!Lb>x$N3vPt@ zQDmxI%4>J4lJN^kLBXTEhRBuO@grTu`1aYvPmIWx*z`; zrNoG{`{QiHEHIVM?QxBX=yKK@=O!3@ ziXa}yYg9Hn0qr+qIHEc?X=r?mN)8;5v#$?WToIZ^yLwi8FnG#}Jbj2MR`c#{x|VW& zslKyKS6VoH5uPc&Ao1llmgAz5^_71H=`4QKVxQ(3D2OzFw5GK=2NuxwW!dFEyAUia z{zvBeLnVqQzKa*x4KoKG44OopscpxRbH=uchGJMm9?nop-L zxGi{Ro42hjaHJh~)^@h;k;{32ywOan5vKAtzr7G7^JYhLPHu=VI=LmszQ=Zn(tgv3 zn05zh6n9~XkS&kM`LXNU-ch)B#at6m(Fvy&)Za_kqtCKwO|VT64^vJzD~|5n$|9;V za)ckhP}eG63nB;>ax`77a^ z{s)WAcUX_&7f7|F5$+q}Js_y+`XL6j#-!C7M-z*-EbVr2ORvLoV+Ke$=qN6TO(k{%(cB+ltBlm)(vy#)Umximf8TXeK}y+SGFG{Rt+$&&ml!G;-2U%F{=Q>>zc7D)FMm%L zf6tcxx@P!=QLbQr4Y*>ef;GAfjd65yj7U`qyAsX zbh7L(f7sLgWR1LwVI!BjU7I!19Om241vxiI7!>legc001$zCP)e!R(3%INl%V9=`E zjNyE$E=|62`FYs{)hA8db;(z8q0*n-43b_-(qXMtmdD0o;>oWuVPZU+3rwTN6zYrS zr1QG6`Izbz$!)b2+uH-j9%`90x-5{dPjiWNkF})0{nWaXPnr;3($%P1wOovr*H;xkt_;Qy_0EC!N(kZ-_6x7=KuqZ81Oj z^_CKBsQTr6eM)ix*yfg7f(4CjGA>G&d4I zZ?;;(OVQjQqBI?M%XcUN}LO~uM4&x4}TKDiKa<>uKPjEOx9SE&s) zMxSnLQnH8I0^SalE&Rmb9Yvb^67jOB<7E$9y{C&IP*Z)AO`X|fVeiMxSw_QG^IiO} z&s-vX(=$TAavkNMiB$)8y!Xz>d|>F=QV-V~nGT`DJnd@X@&oGck|i_%;#PGZq`3a9 z=Z&CgQ_ZZuYTo_@jTeQ3qV%)s;Du-6x?_QhH1T}GcpA3$o3V;CDZbjnm2MxAx(?#g z<_~j>cD?uQPTc$9R)Xu|-p2(qb8%dUVrVpY>2VQFot&jk$}~2ES29_ z<*VYDHVA9R#cz;!p(2mXl!{>LR0Dd%Q8G3hq>Gf{unq*{U(c1qU)h3Js9VF>uRp zQ_^&j*^eL3i8LHOP`5w@IA;78?M`y+VtET1h}iomtSF8Me)RG*Sy111zZhJ&G(tJo zb_4*NQ<(Vr$t558ah5kP3r3C?f{g;}l7>iHy`$im01(G|{jH@A(VMva=y2TU%}n0}@094K>mCQV0V9X~^t5X5=z_$A^d zVu~YUR=z$gsiIaRar`m`i?NW+La@*v8`V}j1wuTs{5+Ey6`~ot zzusHkBK8GbcDPZQx|Pw#&6WYT?^=T8n&HRFf37)rug)gH*xy4Il6o9o+Y!mKTM44C zZ(2W;)|xygipTK!XbkI5!oc4jy^Hv2`7V+nY1gdwEv=T*?o0{P9-ZdeacQ3DUGsD0 zqk)+-*8)6?R1?jB4VLIt>=BziZ zi`_xgwW}1XD90`mxosLGe|eQBk=kTZs0SzgWcf>@KH76O_#>&CDmjfeBadd3kXdpAr&Vy9w!`$f~PiYOIFCP1FS+YDy;3!G~=^<)obUhBd?y49-A$hy9;rEKs4!Os2(#|{<8e13o4 z!>~F|7kI7bAY9Y`mQ#y+R^g4oC71=n$3Wcm_rvczW>n250h&(opKCyAOeYU=rrIYT zq-%9sFg=NSYO2WkfX`2)`*Cc9O=GPdqcjXR7V&XTFVf}Y=Mf@B>lPg zJegYfXSGQPyV^Kmg5UURt1At5-jX`FukLoJi+!=Ywgc=`VRP(!CEI$Ooi#i6`6 zAMn7dW!h%eWecp8TPx4}6V_Ya6!dnu(A3`a+m+Kijc#AOP^guQh}>Z|t(s6{$dy4R zKB}*~PkS$g-ruRpAvJyMYilz`=Y8$YO3Cg7Ub0L5wP=X)*}!ej@ItK5dW`b+kHUot z%H~=`H3-Y-2}acUA~BJi-~@u5lTQ0iMKwM1kMC{)kgjR9nW>ed{qGv?aDFYl*sd;F zxh?DZ7JJy^>zoV`NkeuOg<;0T&Z3I!v)LS*TO>S zHugGM`UD0azSt5rH{3En1eomlELaf;G4ESy1cRfm^9S-dKX<`!FAEK#g3*YZOrj|J z8R{P0`vG`~gFhA1(u%8FOu;q_=ZVk9&6mr zc&nMjOS_l60%>p%uynvB<5?Il3b`Xj#i&I|9k)T~A^_kRAJ1(x@M zY~(G+4}|6BUvbdW#Jvo{D*xbz@efq4h9)a_*^dPhRRg~?!)Hwi z5;9+*iqE!y{!e*6@BnFm{GINN)1@^5R^>JI4I1|S!v^z^+%Hy=lqGu0Ts6~bmKx$M zDa)spwxhzmcg8P+9|lUldt#>bPVS+-{C$7Py!~eDVq#c9rb}^<-Jl5A+l8ttOoxX} zj9`p#H{-k;Esyfv$RtH6b@|#t;b~QzF*&Bjs}9;6wHMw`x{27f;r1kxxYf}SG&iQ7 z@QeYhQ-OG>obgUM{HfYyv3ZqwCx7yCd*39qCWX37kt22TE`!XcN*{L_o8gBtF$?&3 zO}noigI`jVRRjQ%@+TMl_$!*{v&)c;rCmCChjyL?moaq~6@E_RxoABkSN96z#8`_9 zkK-g~apA6Re)Oc;q*jr+vVF^~lR)3+Cpg|4kE;_s6wcdl!UzKiTw4L&t{TM6qHx?plbvPeoWmG>0euK!f9oy5SUYXkl zknMpW6AL#V`pWj+_qdrI+%=)$J+-QwYiCA{fwlD78WGoyzMh3~Ye=n&piHOXQe(N) z`gH^Lcx_Dwx6;Szk+~v{I#I7;8*#F`6pRRR>q_Z>zr+Czu?HroaEz8u!6x+?(}YiM>>Ng@-Ng9)4H~ z6BZ!8LzgId9m2M~J8p`C1%<3gf+f$}h?GM#n&(6hO&4k_5E7B9ptdl-n zprHC%*JNg^>SC_#$C>X}p2T%u%_cf{T|Tx?G3AWQ+6B9%iINfhOpRNF;ixY%EUVlq zsXm0=D&jvRRpI6C+{HA>)F|}x-u1Y4fhLWv*hM_w3t6~4^qhu5!LzfoXL9`?Ehdhf za%T?fh)kTe*j3*q=04lRQ8OZ`UBh`vW@XkFf+SL&cahP;Vx3#^X``cjj`z=kNIuVFnvO9?3#U*gzKW}G$O&LvP<_*3~H zRsFRki3SlPAxZTRN9ZQZnlbul5U+3^Eef~9u}=+(Is*}D;`d5bM0zrq0~Ai*IDpTN zDQOQkKln(0sx=~H&KK@6p^EQ=3!hIKv3HMl>J~d&LrZ)YmR*(|Z>d%_-{yXsi_EMq zL^K3kG&>wF{A}l1Y?wE)yx+ZD|&wZ@<=xc%sapZ8j>=EtB!`S`Ib#GyV4{hzk9b83pB|Z6rpM0x-N&fv6ht~6Y7u!Race9pea@zh* z`Em>J|91M-TUH&!yjrmW(A_OgfzVng8Oy5lGH-t5T*k!iN17Uh)Qok>zTA zK+6}SaxK!q9?Ps#e)~;J@2WbT!_;YaCiPRd+9}Z*6LNwme09{v^&)3X5t02;nyli( zyXW5!Ey}WWGtbA^G6;2Y z^_BaibLDw4BlfpXQt=x2aji6R5ms=qxigf<;j_N_`3Gjbly2&e?phI#;C~$xv-5)V z`sWKCY{)g_-A-a8ecPX4J3RqP`cY431mF#+CVT>|@`Waf%x2QP_uGQ?D%XO=4>##g zR_V|j$c6}LD-E2tBCL5iIf*Q!uHxQa2JKXTsIw=LM$|4pOuZGVsD3uz(4pa0!LC;} z}(h&=%Rsiper0t;lw_*_9^^{07 z14ckVk(ODHTGa;24XLpi1<%Bk)R;GUo@6J$)xhzUy@eSf{Ud6pg2Ah}U>SxD3?UxX zVT?Ena=0Bstfc4cU45-@o0A(YbWjHgt9ztnj!-z8(B5ZfuN+D}J&p{*3gq>-LK^iP zzOIAF2)cMTl^Tp~H~n`|`GT7aeb zgn-DQmHv#!vx#`{*`oE=isM#Q5yTH;)0$y=(cv#dgWDpm$_%`Nti|m98=eShxK>Y4 zgs)iDhCHci4$7)`1rXK4EL=n5HI=4C)0wB0bCc8~5I7Oz0-@Dp-ozUeRxuJslOW=H z#Q=BEs-DQ2jJKU=B z#L0LUkhGSG>D=6+NZ(huK5E(3!0b`ko(|=&Y_a59lLHF~WOK9p`c#&;QKa|j5rhn` z8rJ^MUuH^<%R!JoBckj_K`znWJ^sAdL&o*ggF$AC2Sk@w&*64AFbJY`;g5P>Z;ONd^1chV)LD0Xg!XaDKAYl3KSmd(2Pt z0?O=NT_dpiWorTZY^R$ns+}5@n@4mbpkLF5Q6<&vCN4d_ENZs7=?xjO!q9jmnU|^` zjLl)cb9y&?9L-GCfQrdRi&rP}E1nuP%d!m-8aGo@F@71g}y3BESZ^ zTBdmS1!C4`Bn1;_{Wkm-M~lP)qSdz|h^aS&pSl+|Ygv^s*-G%Qi=B#YjJw`sJD;#u z@u_{fZ&uw`D8Ihbxf*rLFy(*8p}_yiv>SH(4Y2(O4-xr+$I^b*4~8cNUruZ8!do_RUW8&LzZVz+eG!bLKy6nNB%ux(X! z@!43Iqm(%zqXPC=IbYeMC`97YO9&-!zmfWqYWk1`x6AqqqC()st>o+JDu;FZeq@L0 ze1aZOrI+bW(HYv`pj)*7HuWSuw6d{)S3Q<&Smen#4cZ>%xfVnYgs7U&2mnl*B6%|_ z9bf_5#jba2Peg>4%zIcd zWf(keiVT>!@a0H!cBrte4=v{;C?Tbm_>}C`g=65}^qKKD765ICkna|)X6A2g)QC}g zIhX83E$*9su>;&WS5>BF8nL@fupmw8ei5sUw*0`srlYG?4OxLM}flX#rZoQ zz_q#1bd^riLypQ5^dz6gecMlzlGqAd)1vtsnc)@>P%b&Wa57r+K?gfmZx<`VFqmJH zO;a|=*o!Xp6444>l-6c<6Ydhb{P$ZCT$9Q7;!oTTZD$$p>>|qdF z{bV{lHV-$}%7KCHmU~$Ld@ox=x>uRys3C>@!kC)pIv)lLwIiD_!UGrn*R2|2gl4&l-&haZRCh6;t1SA|zviL-?78um)YHGsLv46O6^XQg z^rnuNlw`N2Er2!YIdHCLmY*`9bmnDkPdk4q)3?pg7t|Fvc#(2ujP1Gz(2=gYP_R{u zsj7UcpS8%dKErGFTO?vq0o3eKBh7lh9ekx$9ykuewTVv+*X>|P*&%HIw!(7(as zP%PW@!I~cpnBE|d{zhVv885RdwuHBqc=?uwj_FkV5jiSM})6p^$(q1SGrEMJE3-5vrtw&7lG0rd! zK)sCALRm4KNdUM2r7oWXw+WVKk|Z9w?=z|P-{MZLH#E(*s^%>ydzD|Dm{}@Nj8vtU zYqz}X1O}@rbwZ_sC?H-ZV*!fO`qde86Ga)2BQ|?DU*vvUH`pwuz$Gk*^=)jCBzQf!y>O!r$;W0$q6@@72-oHai;yyf`*zC2o!HR5jbH<5hx@nphI z=XaOoUW;(RJ3){AHjD9|W|<2y(yHZU<)Ay=&PQ)c+20RkTYV>1(Rz-uv6^f3K^&VQ zFB)t-eVCHQLtBNQu>J=Frw;85ZASB6ilyyp`N`@%;n}S};NMBU0kT>x%h8O;j^I>5 zGE{f>m1azGVXoO=0R7^q1LNF0uPcan&xEZfhI*pxd#r0n2KlNh0al7G+AyNTSy^3cA3b7}z0x~7GR%- z_}9jvA1rSQatj@GSIsoalx$qq#ZW~j=6i2}PaKn^Q%J?`T|D3GukQruaD{hx6h@`>G1pY9p#i)BnNK_MSG)%~l$WoE zNzP!Y$D{{0cH;AB=~$8}cr}}~Gq*I&inQHTjlF$ndum#Lt(@wUVg$KMJV9I^sMi`m z>TpX~hh$jvm#jq8#in}(SdqnA)hFsi+Dwa50vl<~o_-<2rFqerrPIU~o}{=(6`Qzz zrDNpoH$3bd*b)#Yi>{0GSys=t- zKW51USA6T!)(4G6dT)UPMlRphrJFu3nJrJep1{5Zq?PIP@9lLeVq|f?KB@!TU(2dA0tr`ODi<9P$(J)5vLet&k?SO zI=rE6%R>EETT`6c-Qvn7>VAdXxzo{W2{5r)=VnE^*Z2$pYyTMKEnL}ON zhbx)4E2}17(4K42H(?44j}v?7{cX}VoqhpZdt|_#hLTtz8!Hm1Nhs>x^#)n@;y9go zXT`4R&WHc2y(^7oJ6+>x6*Z`(LTN2iQCmgTSjScxq(lg34Gj8JwRk}IWW$P4KXbQVW=aS2nQwuPs>In;TYaShb+Och*voj&8Qdj(7 z^ead{=pf599Kl8=N{7morfQk^K1&RKokCQM!)^5Sr5O5!ZpYhQnjsoPPL)vVfg$o zjt*{^tK{AG(f!ker}lltrHy=qe3GnNX>*#)s&T|xS-gjTNQwRqJWlzzbxbd12=PN= zz+n+rtU7vL_azH#VzZYuFKizD2S{quSDJu3$qPCWsr;jzH_F?oyrqfQy#7*1E z!8gWG{#tqRxERet=hM|L@okf}-~R;J!AOa_^zvz91(eE8&XoF>l1x zr#t{(M~@T+&F!5sOq%qvk}pQFCNP~7<9P+v?_@jBcWB|yxowM%113U6DC*`uWC7~k3G04Z-&!3ZD3_=+3$5a&|z!f%n@#UroINebV#m^D-&OZlwLAU zi`}(DOVbKgMk>a9-FunTT1MUl`0>(^5QxO2TqxfgeAHGPGRc+rC^|Sza%o@OSIEP2 z72_M@SWVt}c?z8=t3?~~?56mYBvaom=&5UGfAz8An;S>hG{}cf*2H~Fkb(qiP}P=- zXdtnNU@g%o;3Iy@R{v{C{X83L{$`#KDa?y!i;Y{g)R*4T^JE=ygUy;ocCNZ6Igqzh z^5>lfrq!&FI|UDl@sKdrL&|7d@FrU7z(*!~CN>Aq5r`sRD1sV~&#Yzv+V%{p-?Zp$ z2J_la7my-VS#l{m-ynt0nb8Uw`osD(`0H&Q1gwpa2`rIE6}5X$!nF%|$d}GoAFV;@ z4=v6f?kh6-q4hya^|)g0xmyO~!n6pf=F1q*D1kS=+5#+FnWlV61zmIT-rS?Sq~C2E z5SEq$c3@gXWvlo#P05aqIOJ*dbSl1gxZTrXHWC}|#0!~c3G--dpDfOM1lO2g0bB;9|ow#q*{uVjDngQcF}cQtS9HDVQD9Du%^m(?~S zNtkFJ**6$5QF*qMlUm2F;hM(>6bJksqG`>L^N!1e;T-YB{GN)4g}=3RFn9 z2dTzVY7$GqsGDT8i;*Mmc$8|HQG2yptCSa@J^m~!UX)3Rl#lFF zo@d-?gk1NL8`vB}^I|2N!*EY0;R^TWZsWdn{!#c=)ba#Q{Nq|k;F&N5>}aY09&)}P zze^mh#vkR)G)-%lr?oYT^atl^%eVu+7Upxz+&!WwLWNO7Zv8!H0Dx4l%|Omh7N^{J zWkT61RI%)0t*@w0ip7M(W?#!rk(y2Q@E}HPK{Z!wSIL#=A}5;CK=+sZ+VA1H05rvg zLU_S^fey8~8E35=_ybBo_!K4`ic__T1Q!uBtK7I8Q!P` z*Cz%yx4woDY_9iikFQo+6B|FcSL!x|N7Pj%zLlKltVr%S-ZK zjSrE>ux*l*x%6l@Ny3j9-!fB1&@dGc-bqjzEdUIs)+AJab-y&d;?|QM$9_XiXeqb} zMT-KYGjT1mQ(o5xnaI_a^Mtoc(H=UT-Fx9Y`G-U4PKKp^b&Q?{nIXt-g_O9getNbuM-=1>7(`dkMU z$l$NgzCYM_7czAI*1LA4z2RJqnlq;HTMj>YS8^~3!OS(mS4nm(w;LgTRa187km5?! zi8+fq2ChJI3;dGhmHXKWM&CPYFuE^BrgBQ7O;lzn!w^nmE;zYvk?ka~JE7=9Q{=IcaFrsU8^R4pyjdRRNJ&91 zQYxaT!^6XjR@8BoIfPQanSTAuVRoCFG$J-wuXT8R7s*v@F&C`D%ld7@Sh0=ruSvh? zuquZg@>CN-z@s^x>er4IwzlO8KOtN|7$sN1CTRvM3r`Av#d_dI(u$fG`mTMi@PWeb zDqtG-LQD;n*mcN5ySg0hmU}}$vi87tgTD>a;p=Y=;Celi8A@dR{IKkWtgaNxQy;z- z=l425h6*O`_fiHPC76&R=JE_Y`u7#ReU|52YKU)SDEO`WCFJX8$314&>KGNF5{Il) z_53saB`(;?@6-S3Iv;rU4^Ri*Y1Mm6WUPO_KNgvYQ(^0DTHw`yz;5HD>jNi? zAca)@)cXrr|9+wWaL50Nl8vEhpuLXe_wUKjJ!a_TfQeDr)#RdoWrpJYsj2F2D zLdSxX_<}$}?T{l6M)UshL~>CA$PsixBoL8$>^oEjm73`m3lhnPH@!uK{r0&d?<`h- z?##>Z!NU%86Rlyg;Drsx6YT}xJN>`(-*m#??(f)G#SPN@_WIrg2}pye)<^v%OB(wV DoEQim literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/hello-world-python3.png b/static/img/210406-python-sentry-aws-lambda/hello-world-python3.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a9a81fa0a63091ccf77a11d2ce4d8b5ae81392 GIT binary patch literal 119295 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±>3Dz3EfgZJ^3771ZBfgxiTw} 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 XZStR`xc0wC(0}8(;eXQ9H}`)4W@7u` literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/lambda-search-bar.png b/static/img/210406-python-sentry-aws-lambda/lambda-search-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..8388871f392f50202192bfecc012375ceb9bba7a GIT binary patch literal 65193 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 literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/layer-with-arn.png b/static/img/210406-python-sentry-aws-lambda/layer-with-arn.png new file mode 100644 index 0000000000000000000000000000000000000000..70033365b7bbad970bee8d763ef48b2f94cc099d GIT binary patch literal 150571 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 literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/sentry-dsn-string.jpg b/static/img/210406-python-sentry-aws-lambda/sentry-dsn-string.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69a340fb84ca12f31aa6b3f594e21cb31fd89610 GIT binary patch literal 214288 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

    y$R9OI=7R@esCjVf~Mpt42z+0-PXeUa2 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 literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/sentry-error-dashboard.jpg b/static/img/210406-python-sentry-aws-lambda/sentry-error-dashboard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4fd7def937319ed0d1ec3db6f1d7b1900ef1499b GIT binary patch literal 94389 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 F{uk$k<=X%N literal 0 HcmV?d00001 diff --git a/static/img/210406-python-sentry-aws-lambda/sentry-homepage.jpg b/static/img/210406-python-sentry-aws-lambda/sentry-homepage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0fe92307a5786f6eff34959bde393636bc9029d4 GIT binary patch literal 246339 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

    =pH!^45Yt6X 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�=p0|Ce?9Y`HiXqVzc8`BN#PrF1Hv1G} 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%0Aj6EMi~Ruu19 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 z zu&=Y>?9T7%^LjnM$evzDW9K_R66-cdk$H(aNB*o_Adsi~t-}w_scIUH?yGV3o5$YZ zZBPc)RqKE|bNHH$(#l)gi0v&5L{s#p3VF%{SUQtQ+N^lvnH8&9Qf)OWB&jiQb*=1 zl)BUIY$Y&WMA1Gt+&ClD9*62HHC{8)EV^|gEt%{44mj&hRUqWnH-_~ex7i5gY|RJA z-|a8(xAZ>s(QU4IPodtWay_(dsj1;}k9wYFH?i&?0qpJK+cv2q-@mCse7Hyb`%T~QD)e=@kbJ66 z)B0D$=QH+|r8|)rH+gse0ER9!g%8ct`c__~OF@(U;a1PBQosKIkAL_Q*URFidUCO~ z7^Ng+j=zOEkaheiYv#`2qKYU3A6(FMZxU&e=-U09SN1b<(9FA(H)d1S9Cl?Phhtw7 z{7C(rHJuC2)w~X5)wJQ4Yd1N)fDV3Bz@0$!#DH}T*1qvI;=dezA-92iIc=rs*==jY zk0qU$PF@HKvdeR{bGtvggkbKGvw{@YP8~{84%c6SOlT@hnw-J&A`CEN`t$07|8<+WbgT!-At4$$x zS^4+{To#_E_w&(_67nKsIFRc|7#_yFnKEuvvnD-% zW%X-UjX3Q;fP1IYbP4aN43~&jY^?>e)-7;Sgb?xLoCoSgJE&0hQFX3$1R_i_+<8G| zXm1fPxNSuoXb8mH#`T+&g})&EmN$eCwnRtE;vZWtWuRS9j%z{9v4-fIj321%$~o8W zU1Z|<5c-oI)5FO)3ORUVql=6}&3<(Bm^jlIv9K-e_!m*)b+`8;K@h?{=2kmbo6DiR ze@Q_;Qui2VBz8k*f{;?7KT!kj<;y(;sAuc00r{Rnt}up*^S!v^o6k>g>Y{zqFa^68 z1Mk4DRc*~=x_5tcV&B74${C-fRDs8XTp~mRCEW!lET)nkgRE5=#=K~iVtbcIn%Dmb z@0Ib`#=PH;KCr*j?p+?bc4kEf`qz~~3U$V+)fqmtTsjPi{#!L$TqpH=lBrl^_Rb5iD3hHWe&s{vEqVAtcEzguMNOB-M;F& zCYj*vGinG`eXW0L=&?6>{mjs3-)ggo=EQusM$|ahfJ=nG!c+e|4BBuoogoW+q($HL+@CgHcN?zs!AKaYaISsW zsT^^!11eOEn@QKUv^O@+yGt_py4L=b=vAS6FqMEt!+ad=(~ol+psWU$#M{At#b_wA z_jF4>=+gIm9oKm0+^17j0!@k~<)Us;c1DTsz>O;$%WxsPDv#u!`glZI==c*t<3g`x zh?!iZ*MFd15nEA`jn1l+@vH6z*ASQV+oj0weXxStJz_)u^%MFnVCOj)h>wf#b8Czf zN*bkU-*qDBxU$K-d_KI6?m115JwB;l!=G!H5!%)Sl*TD@9JAZO=j*7>=hK+3b4KXC zQADvS3^7>Q#)*R_jQLIsZE|eX4t;*67go{19@iZcrSy@&pY0f9=QjYMi-*V0l*;7> zJ_*$Zu-Hd`pUgP}SuSbJmzIJ<%YzrJi_hbaE4m@){^P{2CougwO? z26L)n)6>@|dp&tm@d4+e@%kj_G|DBiLdqed$Nm<9_rp2IMU>d})OW_oB?#x0st zHMTO5)>&)|P0g!M<>isb$kk{eExpTyWmQ0=jf0N`cSJLG^iTCE8n&1|D2SJ$_;6bK zc4CL;n=@~pv)1ib7@(0bC4E}ontc@Qwvvad{RJ9wI{}}3T+s6rRMY+Ni^M#3#)myK zs7;Ktu3>Jy$qL==@g;6FVw0x)d->GWOZ#M&B!0iJQ^tZb(%&}^|KpFY-y1JYgm)1a z@vE>DNd9Ht?jSoPwV%kX$FbDQq zT$6^YJ)okm=z>}kT7{<{UO2jTTjEZ<)#S+=q~JX0?mF7L<FABZ)v0A9`MZV*OnQR~FE9%RzXPE|w28Q^9&+d#aP>+mg^^8{H(1GPkD-ne= z-)tTh1qWx%2U76Skehf<`krvQb9ny*P7g50!CLpHJ|7M@Z2+et3i-%Ow3j+6PUsqKt*oZ~JW zvNIIXkdq;|cm18M{V8SyB>>GcR3pqE`nT-=G(1W0k^OK6+fBP=liW8*s4I!6{_O3z z9QRWqo54yHdBw0}5t+=#@1AF=VTh;kwXSPcnZ@ouKss{Q{X|9IDatZiC4IS@`xB?D zt^BmXa3<%Mw;+aB{G1^XGws?5)2(p|_Z!91+(%#7h9=lWX~8R7UToQR~M!;i6xcf)*cUGr5dJ6y+{-7h-@&^pn{B;6-v z?r%#%cG^7(RrBQ;+u_~y{{ckOa0WHD05=F*LH0(KyQ)O7qdpx1qeT4^!K8&tywUq4 zwU(-|4&j(y$C!{2Y-Z{e9g`x$wkv_rC3Js)S2{sa7P z?^`iY7ZJ#$^N8?}IH;J<5Zg8_`4;*)ij_@4@l_OU&i{K}(wyTZ>BR&7 zNTc6LLkLg0r1C2%MFR}W>BR(WrW|H}KiO|;upEAB-%ep$~x z^ELg2Nh<_85T!~KV$-SD?l_@+3>=d!5;Vi#O1FLG<4<}+>98V;_Vgbhyx_|u%)y?k zt$9|m3=>P)+AN{*0@j2S=uo~D$gVJ79npglHIUl=_=_)$czPcxvo@g*p- zmZOOwtjfGlq_No!!rD^dJjPkEN)5fHsrY8lrA{1pS87^-Ou3y%uefRx87{?sxV)6> z+KP(5E>sB+HdW$2HC|mrCL^IXZK8!k^j!p=f>@(ZSUy_yImxS0=^_2Ret)Emp!|Vr zf5zlED>%cn4t;&FiBkCXLA)2yrG7*;T6=f{92rMobjWeba}P;#N412+TT&5 zRm&xV6$~L_O>uzt&}O0!BGi5ZWC9q^NDgU*^^`kFGl53QV5M$VwSvWp^a0ox^+eO$ ztkV$IejW0Mm+JJU04@0Bz_8W?pF#4nfQH6{r-<{^nQbkI#}`cBYfSN!ZCF>(d#!~J z5Y=7>joW?Ei*$b%+XlzMBzeMlA%)dG{e>Mu{w%>ncJe&#$i&v_94a>JB4oaz-q6f0 z5HDBIyhSj$YFIN{)>+YPR&eD`wyzcrG+)UlbG-##@CBy=?};r^NpI$LSH-|KuXk$R zgl%%BaH9uRqGCv=h^<3=N$Uo@cr$Py8{W!9GK~yxeE&|QeWQF{`H4h1El8UF zE|0}^r)@d=3PE1IG)}E2V)%W`D28Agp^|*dv|(9%7EIn_I!I((;cE`0<6D|n@Ji#$ z_ev)%{f?lO6$q3w;%%9~dH_ui z{X?RdG5|t;DL5MSH^OlcMw7L5P$5#06M;w^{bPstfhGySSa1r#HZAX&1k(Bt%SfWH z8dnv&Q}f_(uj3bIY9%Q_6@w!>#ORE^=>_MTZKwBQQ2f>Dq`NbF$z*DyPP*mX{UY6N zdO;Rd*YVjvsK3OypW}{cGC34IM{)frDbX&gQfIU74p`jn9OB@oUU%Fv`Y3#~X%zAw zV1sRB@_M>dX!()C!pL1GXNpA)bSL@UYSzl#MZk}@(iCYgz%eYirAS(8= zJwN7qdR?*l_qdml0a+{)za(G1-|#|3odl_>rceM)eryO*iA1b)pf0hrbKA|lN_S7L ztA>S%&k%#zf4APU5Zsp%Nll;B@geOwt2=!tIH8(U$!H&!#duK#F&WZ|pvf6!G_yDR zJG}hzlZ723qv>|h(P_eQfbK9oJ5ZojcRZY^iO{K3rn*VI(nKiM+*aq$jQb`if znQjgar7Q@!=#|9Z)sL4Z70L4?Rm;fozkk;UTEn`qI=R)0^ z5cf1E#z5_)sc`?aLfr}!9DT*Y_hMvZt8spnr!o!OPv^?hOfUJE_NJ(0*~TN$P=C)J zjOTyFV=UYee`wdqb>MDbdILX`IU^8*vifV!!ti{t(FJd|pM`MM(r)yAUtK2b4M)lW zq(LJ-i9WZLzWPmd(+-<96wFt{Ova)3j_EqW`vimU`D;8#5oB7ZN?l9zmsXg}MeHs9 zhrHIc`IzKM$%iCs}IdJh@6UOCFdF_L{_W~cZiX?vXOSgN>|J?HL zl)u|T-zBd)wfpXLyl>@H5B&7Uw3>c<@M~}_%Fxz6U*(clq})^ba@7z&D5`ZeHO+IQ zBdns_IJH-;yGoAz*U8oRAZ}34pMUqxLPtQoi)M0bPF0d-q9EZPkVSO(?8QwblDi`{ zUL0-Zm~B!01J8s+8}rSjP>Wlo6E6{P%V5zyYc{)~&uPlzMzGb=bp*>Sbjlt4{GPu# zBQ5k~G?uE`uW~F=ng5gB7?YsE??bJBf9GMg!^a~;jVQ!$`|Ujsc3uLw;w+QWb8KJs zuPM$ceukno)gA%@{4uY!r1LdjfyGLA<?cz=0B-oi zOwkzO^2M-;>^NSGEYPC6XF@@$}(}m7Cx7M`Y6J3kDhb*@_nvO z>{hQSnZm3Qxyq;9`bt@Dz);Eca(p~0XU}>kqEk4n0@tC#c3jJYqXBN@WAAZ}t$>03 z>f~r(=16}wPdRZrsQQw#?1WxmY&ES={4M@Nwa`P3V|-Q=a1;ofApKim5hfT+SiHQ5 zXf<0)R{s2o0}5N4%PU(P`cX5N*8Ps#iD85koj_zmqw?FVI2prW$n(Dpx7eGd7MT|z zJ^PUz2YQswuIoMFTKgXn+UGsIBvnX(!uMPan{?mLbK`_t;@((kU~dow>Dy>~dL&`> z17vG1nI_zAMAbZORWWVJpu=lVxO}H<$`aM5@)-KAvy<;cdqH!E=<~p!H+spVuNIh5 zf9<$i+p9vA*OVekWzTQ_9X{nZu@@G54VD_&;?DuaCk?2%CX-u~@B@R_H?`LJF;-}C z#pMMc$`gC=I=aOPQnV0~nLIUqQk4L~TBcwj-M5MiiI?T=&BLcbrGXW;Wpu5vg&Szh zupn2~-tTHd!bEc{WhdPEhDc;)-n4pn>EJih(Yn^|{n-<|it~|@qe@)c{L(j9!=N{s zhxGvihD9);NXnM5R`fME)JMPOpyrrfJ5sG=6dCXRt;$1a#LX(p$Xh8OJ{MM1G~l5% zlA6HjJw7CZ!EpeSslux_LdAzCzzDh;2X8kF6HM%UiXrMhKR{!e!Tou%hdEolJk@1a-u@&_cQTfypM zTYH+FaaE24^>N=alw(I`W?#2W4!&B};*-gytUP!vKQYTyK`9$II>$m@XY^>hA@|6l zcK?0{GZt=(>R44div7HAPpN1A==hNTZ2OY6k%cM`;h!JESlvx!9|o3qjv#Z&pUn!+ zkR3R*C4BFO%3$=Eyw)x8>9ZTg>jcv$L6N(aJ{O@*PJ&h^a13*He!nd7S!)Kt?P9=- z`!oTTzf1wjrRV?%ag>FOUZl|Z9J-Yg+Fn{6k_?$QTbXLJ=K!wBXp!tz$nuA-jwM3U z?hxss0{2{v$5SlMTg~1tRP2w|y6HJk$nJ(3P`kD`oopNvbX&q3$9WMwJw^ z4zN$Fehq?o!H4iLGWmz$=Ao4bMb0K~bMNqDB+cyKy%OS`la(*?vzGV=6Sq;9v-gz_ zyTUDbMEJ-F<451%_0RpXVw2Z*8gviDBzg&JjXsN*bBQ~5nQ=$f0bmHzq z65t(=*_qZMeSj+87txJQh`&d8TzGTj?_=eaul8O!yyTjEO6ZevM?FPi|0MUFpRh{F$9+fKQ z+bOQWo#Zawm5J-wRf;)#&Vv(X*$4XV{w~8VtuX$1zR`cRp)HWKdK};KR4>z<+)f&r zKc$ze)JRrBB5*kWQuY*F%8=2xDPH=4jjtaJ25BE3pEN<`;IHawQe_V(#IuMFZ*lT% zj7I&7ivC=a&Z;PxA=_kn4y#$P0449cXoS<7Fw!37Wu^z>%pLLxj~gc`#8KKsLvO?h zsS;VwS^GK(5(YqrBc#c(S~b_=vD*r^y2>X{)T2sN_7-vhE4j`V-$w3l{7J1XYA{nf zX&Ccx#{to{ni@@DNCvifV&EJE_VXSXZn5-%zsxJh9v?e0Pkj?}b!F2w$WnJS4rXYC z0qKPp_L^97V@K)IEXgj1g|)F%eUKeQuc+~4W+!ty@bEaM&Q~ThnufHQG5-x-BbCDv zjVyu7Ecf%-!{s!4@X3aO9q@uWMt44eEoInv13y=>nxvdnhF8$s*%#M9aMy_O?Sx_b z+$Gza<;J$yU_3B-lJTa+H4>B zdNJ9Rc>y-n;9Ps^m2fyFt)#N*h>c9^}A~H!IZk7`{uE$g^fT6YUulK$x=i?2ePkQ%?_A+m{iSr}( z2RqrbRrElTlp5s3EViznqm3&T1N^xi1e8}ETgmOjZ1+2JrXa}-rMzgywJsX zL3)d`tsyrYv`bXTQXyw(#VqU^E@I%&ALd5q@blzBQ`}h#U9eL4{AO#dnkmt}F|s1? zQzZ64L*==czV9A>Wm+AzuTCnx-{GZZ{pgK**j5kWpq$H8j77K{g=6@kh&aP^g2t?D zKKmauoE5^Zi`Mt&I-~3FJlV-|0oj8yf^7cN;%*PXG3-(A)2x9FL>ZR#4yL6;Sn&?p z-&sb6*|`=bZUgz-Wu;nz^h@)GxQ;Qp_gEXqxFWXZHC+B)%Y=B1jxc$K3S^VOIcyL_ z*O+?uqjIZXfsJyu!ezc!I+;hMMSD$4L1O=>f`S%wiI}ONbl|;JP8c>eWUDNFs}>%~ zuQZpE%l-S)+UDW}b*=2%CrMEb$-Jbeu7J0LtC?}~>#g9;f7se`+{x65Iy%*@YUFQp zc0$8=%3}kh|FzhIxbmD&v(Tme^Ne>($LO>YE>Ho~g*qR+{{RSN2ct98kIUQF zK`>|&HC2^+gy<(I250bFAo?Xd#}D;_#QjJXAyP3EtIR5xmJ#Syc62~XB69(i;ltaT z?i*HLp%?POiRvttQ%+e00!bk6bzkH4n|=-p)`n4Bu!JMX^4r@sqpPgU%gsdd{O&%j zXMbN4794s@AkrPYYYHe0cFfuxxeeB>gzsYO<+y-*fQ_&>Y$uWI!>1K2j5^p0AA8ghI(1fwP)V z>FS&=9a-vUwZPQsz2yt6y7%Y`wk9NSn2L`fu*xXB97X*?c^3i@@pyCg`?cF_38CHJ z>3?M$QAw%D#m$Y5%HM>uGm$t$f!S%0RKIyWj|u}0Vf~!fd=^hVk29StYX#5l^z}ba zg=TR(hxUpf6&50o^YoxFUWx{)KNuR%sx^3yGnkN&Rz zj@l`v>J*Au7|mLO)^>e8d@U12IELZ}+9Y!-F;@a%&vu8^e(fpj(fVtb|BPC|AHQi1 zm3RvB-*(^j)f?)KpiIcAB;8OVg|U2#7o)M6ldQvuc<#Vvb3ii!v4xXs*E0t<@*;*lpoyuVRWpLT zVI_)(RWOBdyK0YA9p0Ig!ILj3~R2eLU zat$w2pT6^uW{`1JDL<+F(ff%zCQ;!;)9hsCrjR+IpudH(HUwqaSY#r7tj;-OkyZ6; zzyrYqN%MtnO3gckVpEN`OUSqbzdzoXYUY+NN3If2DS4{IbRim7HP)R=$KX8vIV7CW z($|ZsA>KW4&E^};g*0HR&E4OHB+r>|{GXqXI-^wW8yQGre#-Lm>(4tX*1zPWPUA%8 z8A*rGzWCG^S91oUsg6^}CXsP_mQaIE`8R(@Vd2`0O8uPo1SIMb{fgmz&$~?VWf@jP zKKHc0-Pji95L>08QSc#jJ5g5XjSLC@d@!d&GuNTNg(~0cIQ=Kg-8SlTYHHVTLn})& zvM)w9%N-4F(Jg9?So|0UqB3)s=fY*WxBgt`bG<>dHw+r7uO(Gq4jQZiz9{8eX71!V zbbvEX??4GdUHibR@~0LBqIoZtb*P5rw-gO68rV+YnNF+FJ9yYy9AZS{NbC%v2LEH8 z`Aabv{a&LcyVJ6cLJXf76N|b9<>gK5_`hyKwCRW6;{rOA{eK+@a-4ev!^E+G-8FSX z?qh^sf@XAK)~7CIuQwSB)ZHnJk{=GBc1RkOs$cES9sIIsvMRG`H&d#uy>a0NSTDb( z9qywiH7AZUG~nr9&>R>_Y}vxZyrQ>UUfx0|hO`-wK!oddzI`GQ{X>bfFMb{q@E7$_2Eo|EIrSz=O=&Dd+jqhhPR=e(c zM0aigxw-Wg~$U0cM6q_d+KF*0@Y+!An36 zNr$2R{dSkYW^_9** z67>f05sZHB!%{09f&2hOGG!F<57Ctx)AoW`g-6GQ9r8*)@h2=VwWr>H(%6dy7USIz z)JYK|0jVz0YCJUFB$g{4BM!-=JlR%^1yw#Y~qMg5-Ps#BbHjq zJC^qs`r)x|eMwR&lKMMJ(wH0ts_bc}g7TT(Di1bWEkoaCEr#~{n@)&ytqWy#{wj;2 zqixkW_^E^s&3z}~6V&>3pqk+I>+qxhUWmLp1tN|jKOGi69o)zB@?8OpsUuq*ZeQJ> zeK>;E%!ZKkfjzTD9js65`K;PM0P#;+a_}bZoutDCmks;X2Ru`~uC5q^iwAf$53wqx ze3dFHRdn6oi#}kxshk}`;^7&i7dUy$lD@o(oQIVjV)?brdenV2wXV4nzq0(pt57G; z?G~>g1lmT@35Tjo6@yz$y}(nf^Sw#rJyfzDVj)T|`+}Pg6@7g9$*(2=4C!u{AqvWi zp7#;nn=-ygK6kvnF=!@}ERS?fi%tG{CytMEgU2laTJ+brih1)gEyk5!fs5%Wy)27} zwYC+(se@zLBprU8p^C=tj-*r_-wXXAy^`qr!nL8k(OhvknV9?{GpV}iL(c<8C+mIW zA5fij>;GhPr=}MV2^>@f53GtLdo)9O#~f!v+Mx`+B!id#t_-nuj52Qh1usS$rtKQ| z^QR2;OW#1rQdTLA8l&G01K5G$y)Y$T|G*2wT|ILH{}H#~V5X|&Y*!*;tLOPXWuA~K z&fl31EWmpjF5)YuzWOqWr8I< zH>zg8J(+z=_(ah8tMta={qi3nyWXOplJF95v44~E^(rCoH-F|FAOimZQga^}4_#d2 zo!^ad*q8(wVd{B}^wkG^09)RO8ZUBi#Khgzyx>h5AZ;t5rwPJw?k)vZKajRpMV_}P zXeVyut}&$igooO{YWlL@ZvLK*`8{>Z3?Sp}Jamm`zHw=`oWhjy@o+Lx%8_=-za`B{?9nBc0#wfmannFk7 z1xWHia;BTjB!AW)qu34S3?AH&l}OR`#AI9AFpLcf8oDXs23>9m)l9cboX7P!K%`si z8|EuvcM59tDiq#Hzm3=P%-P7d&T#v{B02Y|Vi%0U{?Wd8g8)Y<-UN=n@f)cZcysc# z-`i$(t^`wY15?lNwpQ(JYw4+&#U7ep@VX8iA8)JMzt)*DG2QChR%5=4$sDl9Di3k= z-+05j!cehrW6dch*@)O*!E(SA@kqlGykt$Ijkq8A1v}PlSnG0Ii~dWfl-3H z)zQV@4^l!tKYXXa((F;lu~JC@GVK?DoGbzU&v`pY(XeIT9sHbtC__bBC|%!CTu!V3 zXFV#9F%pxa4^1MXK~46jl&^BZ2&^_((+!?+C4lSQdsz%;1!Oe1g@#Cg7_<`JNcwEE zVnu^WJd>~bmNN56jh{~FKfr|UP#$PduYr=p=9HEHbiyZAJh*{?9QTHcTs&=g^7i^s zm3lxgo;Y-HA5uV(Ll0UI^ihxTH`Rl7XC>4GCt_+rIo4{@XMdBUt8|hT$g*#vbfMPq zm{1n)r6*&`4LD-W*T}CU-Q2GoL1O}x)=V>ht_x{&J>Rn8)@-F3|1Nl2{d@g?`2>A+eNv1RM< zVz|(kh_gH~DerIzh2{+4o2H$rnnnI7cQ{9idL`?}Lg6ip7uh18Xtap8bDjCe63`a6Tg+ z=)2>}F1zMAh~>z~nMl5euy>r3jR06O4N5SnvIzYg{sd^S(J7)TrC-_k13#nQRb&11!8`_sUzJwxr+D(ak7u}`MS6ee zV<0WiH;XGWnlFS=fJ&ZPyjQZ#@2LCT%Pv^|ksvNp)uP_Zn_O*Q!h>cPQHs)- zRR(_W`(D+%RsQCqXM6VP+ka|7O!BkAAEz0oP7bQY8qE&Uw{Kc)45_AX&RSkiy$rVs zRne_F4m|%AHo7OF35IOyKce#+HZPJJC}~o7vRgA_QFamf)nLR-yXuUBVDG7lkSsjo2VU;CeS-N zS_Cm!cjaOFTHJ3@t2y|$+PJEO?xbUMWK&e`z{7-IP0j7ZbK5pJO4>q$c@M>VLJ{kw z&TAfi0q>~~oRMp2?1;Cr!`YDp&b8ZvzqD%g{=*hj*bJI70N&b3<3BMqF%bL*@O$1v zc-@vH%l6)$>+{4^p7CA|wEPEPnvl5`EXLvFBR@?+XK9?{&glHwo4I9csEElf4;8~I*tzEu&r|Tde^GXU z^LHI>?9=ggLl}L5!mY5zEv_>YFOTxAF^$UycVVZmy|p$YiBY>($Yd5()gX$rCVDO! z@r(M%(J~YN)ERtF!PhIyP!97mB=QaL!{TE7}YcP$iVGhSG71*q-CLLM3_D*|9Qf<$ZWc$fD;_qaS(9{}LDC-y)jQ{U_ltw6Fc1T?N!rca$r_KyVZNf7>hUn8$ZB?@5G>qG4>7D~?R4!x3yr_k* zeHx3xhNi>v zYpQy{fX7qwcI@K%IxP9_FR2lRAhAVxw$V}Ux%ZlxpyWfITdD$V20f~7OhPWys)?*U zR-w6A#vUrIg->u@z9Sm*88mzGk1KfNK-Yi*Wj4p0?EDj?z#V&ubC6KKkPmIO!IzPKJDLInyb=G zB2X;xi+=s)UEI0d+x^zSzJ9&gQj8#R@>ku{pJjG8HzrYUgf5nB;}CnT2(c@H8M=o< zX@S@$?%=Q2aj@Ic3c3EEzc*HF?iJelHA^;S%y}+Yt944lMMB%WVh`zk&3_hFzBIDw zoV>jK58%s;uAkkKa9}uJubCirt00?58_=C^iz6)rDF3M1l_%jG?CFm%>!`DlA^Uvt z_Ia};&|^2_DUOCvBTT^{jpip#9AC5#X(r2o0ZYJXM>RqVRM>ObSG-K{MPvhuVDMlj zcCnPF3NOPGHEp;bN`YpmH9~guhnYR@aAN%~#bFNLEBc^WZg)s9+ExlBqyHVt| z&uDolk9mMIzd4qK{BW1tju>U-JF1Ido!c%_!P0nMOBz^KIG+2j5@rPP`kP~p`F3_t zZ8@0fx^ezTNQn?H-%SAnsc*biri-ikc1xsAG~!`v<^f402w8h2aoOgPt?!?$JM|-J zF;$gz29ni)WeP5BjU#+T&;Xi2wwiTzz2*NToaZ%|0t@-Ju1iN3#fK6*A2qAG@67oR zMBM7Qj;-&bG1%@p!V$JHGc`fsJ0H6ME^mcgkCc8LlS?;EnDRZU6VPN{dXIYzJRBLY z{!SU-JRE9MJUAhh8s~A~Tk(PNYckE{dHW_S?~q^ogE17IrJ%(*-ZM)* z6?pUwG2x6psI~Ai>-+s<0bqJR`lvHGqJ_ZG0)!2N@mAKXS*yPP+crap^t@11lSy~{ z07wbmg5nn5G*dh!@X=Id=h=SM#anFq_bcC_x}RNw*+p4M#_XA4`52M$%e1i`!cQQ* z{(u~W@(L$!@@RUp<|3hTyyOY-LOvh^&)_;0C$`d zLalC%yvA-@@3oMSnHZGgro`(QP)zD&5`2Q&+=oxV^zA+1jw(h=geIEt?$>pOU6!WU ze*odBO_qMGWwLE0@6wEYXr<+~{UNsbGu;AimmLmlS2B#1-B9{{4p{D0V|Y@(Zo;mf z!55@~6((`wiJVt?*Y_8lbH?9`$gx+97wy^BK>bD@FmlMuH@=?Zu_yB)RG&KXqhk5$ zezPK!N|wFq_Z0q|?+2%4dq#VPIm&55GoLkmE; zMh#RYz*BFD|BR7B1MnAOh{IJ|;=-@MSr*Tx83of;>Ou&tL8A^1R7pQFolUD^E8hx- z6fcS3s`c?i*HL}^7~7sq@FFmTaT)j@KtHdOEPCGVol04qlfj1+iVr0-nAgiT8;!`O zizV(#3$6CI=i_oY5*!|$1D$v;U33Zq+tV%eq^BC5RKTMI!MnJ-2CeDrn$^0j)ChOp z3X`Z6a3E->9~U6sglbLVRbKTuPdO>Wvth8ilC7U9AMEby1{V-SdJM0YzloN10w{?h zY%pby;)Uor(v|^R=sR1epHFhd2h~%KWr(##ni^lMnz?o6Lp=gaqY(|i5$;FfVNe7(sd? zw^=klD4oB_GNJY4fK1w8!Ur)#pvbl%zP=|8rbThAhjR&Vq?$$In3I#*RidC3@zgAF@A2MKREhFYmfE`I)#5xz8x(B?XahRNoorNB}3zBCW1_5v{MijW~RUsmL5ff&OVi&fS|&499Tbc~Xz z6yetMv19&qum1p>N_)}fVEzGcePTr*nM`KfX6o`3KV}h4Q3|7~`0<6`#vcRi6M<%P z(#$*bBdH1bu&=2)sb)IrjC9=lo$InK5hUp3$S6Ml)FWsWJ&cJ|(hT`Sth*`F{$@4)L92iz?aKXd05=2gAwG?}?m# zl@k4!-QHa4$A~xh<+&b!K02^t7@91BrCKMYoZezuVwgqCpG=ZSQxj}>5!OK#EQp2O zIJ-?$$xIaOi|-niqS^mOMDQHN5q$}{-;8*ji{LrGn7p?1Eh&oExBYsBwYIhrSlccV z_}Mv%BXBk;Nkb52gACIP6*(#kaqW5ANA$_ia2S1wW$$2D)|d7LjhObpVEndo8}lCC zFv9BQT>Fo*wYg&olD&#lppyJDqc<%&vmuSXfo$^%13xGm{oLc_Lgfz|VZG^NtCZ`C zL0SIZLao6xj)z{&+=P#QFFP(o-!k#ZO`tvaaqhdPYpN-@MZ;`%-lbPS=S#`5tGba) zCwT>3V_YJ>zi?fGlsud%{CKK_DkX_h`iVdryECQ?wF}J$rwi|)>O!XT3c-Jo`NyVj z>reC8din=?pvK-tsqgBdS1xnBl0&1x0h zmvNM54B6s+f54q%rd+KFgBP-~#1VZY+StRx&SE4HlyCC2foeu7w7^%SL@J-NN;_s@yE%1<3JMXY6!_NT{_S}eMG?!ysH%*Lm`cp%DH%lcwrtgl*GD#H z&7oEiJNo8Y+K2WCme*}9!QK#;g*8oS!?g)Fwi1%L)q(;00AH=Nd)r+xmRqlfn0#+~ z{xmEUnWq7=STNbvM5sf#j`qsE+!_ncK6iqy%ooJ>+|T4S6ni^zbAN~9TF3=}yp)|2 z&i66Om~PI8XP*0MQ{wq%s_d{4t)0C)n3iv;f#Gt`?ur~I>p=60>`oBnB`6V;i4kYJ zojGJ*Zi1n5wJTi#bIpVo`a+*enFKVSB$XW8qwR{<6uUR#!!#e_8Nky;9rd(OR7m;k_R<$FgzQ9m) z1JmOPyKkOaKsSvWFE@=_BDXwwJ70&*T921E8CQD$8WfM-J9YQxy|@iN{|_Kfm{P54 zQ@Fy!_}ln^e zlC3@Mk?y1IX_!NP46>Cb;7M{s?p_f~l}NSjEaPOabsDD&u8ym;OSV9&uel+Hr^q0BYxoPOUix#;$1#OVr&sdM_9OC zaP{_(<$J^RgKd__gWp;n_BW{U!Nd@pvlAowBVEU;g7Su?Ow1}r%M=fbMIETzxB>^8 zAcpIS5wK^bKxt^$_H@aIG=#N|uF|FgQ%^OjFXHQu-jOh7`PfcO_O}FwAVbe`-NiB2 zw=?T(52@Ida*VQ?Ys&9HS3@JFGDb0aea^%w3{L7vx_plk+%#?ZGM< zQTj#NVL6*`j~El{J&-_fVXCx_&GlA2D|haW_fS`UkF5CKQb?&`LhxSc2>+tR?nZu!&$$Tq|>OF)Kw z&ad1`O5JLsc=x2)J$+#w_JRgQiSu_2MCw-dUCija(r5E9cL<&?#wb%Ez=iZ{G?{8S z2-e0h^P(B6KDd0Ff`+Z&Izw=DKc_k^huSZHvVutjfbkwJ#C6wchcazO-fB*91V{I4 zUGO~_Cbc?jFAq~w?w5Zp^d+3DyQojboMF_8&ozC=J&~CZAVq9Ld# z0;U)mV3-M8uh=3A%+d2a_-M##npar zneRYzYr137XKqOucW?5bFZy4^5aw9M&RC*K#?~I<^TR}zMmGwHYXg5I6gPb$>3w+xb+`adQ;kEXJl3W`4Hio77Q8R#8g)K3Q|3 zYU$fUAF~1@M!1`T?B;1Lfgfj&;d!;Ui(brxO`;i$v^>WL>f=Ttgq455--o2p4wPsk zrbdR)OaD9#uZ56JR9L*}XKzFU-Bb$Py}X+v)1BG0sr5}6yJ^1Kt`d|FM%Hh0GicJ^ zgL|bXHubz8FhhZ6ET?UV)(LHKU$RzK8C~d4nfkYgmW zNTbgj{F~0^eINjr?H$k52<2Zl3tQYrVmiGu8($YAi7STd-;??7=*z(P@OJ)T$3N^g zp9Nq2Y*r-QY)@sst4?W+dtZ**tNqL~S(kj7H{$dDdjHj$o=*_}!Z;zubaDhV4ey#X zoDv*^Yc$GHrV3;0;82`S&s7@j12c2Ae1yj8rWXVxDOsT2+kPmEr&(Sh{A(kbBIB70 zFU~X6pdlbjw`f|iGcAzIW;VD7{|BhM3w@!#Rj@{Ckh^0@>Z09|%|dJAn^lALP|NAz zB0;UCT`mS%wcBWk)voUB+N7eUE3TI!_M_MA{&zQ(Bf7$nux%H$0-kpCU6^SZN%=Xr8|;LiNH*ZeZx=lYSxaosJ)G{Z=^n20Vu{@S#eYQA zNe72;S5aB#JK&>|px?v1;d-c2DslBGXHHjwD;hGI{`~?-a`j+a;o`TSRj;AaSh=Sn z{mov-c`l_nr;cokSVrAhR+zm6Mt5TUz#{p5hjq3%c3}Goq*;g|6*t03tu*WHW&Cr3 zY2351y3}@qC}4`(PNTf*;bphY;A7-QvKf> z3R5a~**6#!_c64>75at9eTUMjx3>d?0l_(ZH!l#~qfVap>?J}w4Mj$+R~Mk&(p=2! zw8Iy|`z*LFh2BvV7j2k`cdu*U4H-jrG5T6ti}V8Ls?Wa@LbuSM^ZhNmT%oA{02J&W z{dSy+$}==l6Ye6mP!V>yGmcK2c7tb({-)VROB)Z;n)i+@047Qx{=OsFEQQXSLyYw5(;vy@rXM1wq-pA!*k2X`~5(%#WE+>o`n+aV+)sT!v_8^Y-U9-nqOk(xaSN2lK%0FtJ zDAE({PzoKsZjFe`poOqKsvl7N!N@0mB-~exsrO_B*{uE+&2^SRuVXQ^-uet$%W5VV zS~2Mw1ZAHW#-o22$Sv_Ap0yIF%8VMe%Pr?7RNuA|&cEG-{pzBe4_uiE$FM^Vd2)~L zLir-Bx=3d`KakR$P)N4qBOB<&4%8l2RLj*={k+%3<}lu-_^suR|HafTHRYbqcu-7yhq0qF(->F#EPfKsDHYABr(=}s9vq=s~lhS4$Rf8YP3--8{;c)~Gm zwtLt6yw3A=ZW;etv46oLi?}uj!xdcu2&q% zR=M{?z~O=)&Fm&#OL@e(27{K>bQ>ag+2#!hnC?fhbkYeWE*>sv6)n#o2J`8x4Uu%o zB_e?ql*rR;H6F2^XFuY!b>=Rq^}j`O4%vkBRL8J4hQG<(D8G;$v)P@9e0#j7FN=V! znT{F)qL9b}9J^MP^Qg$5b$>1Psh1I=w+iTU)OGaBkUTD#XGi(dZ&tY|;JbmIJg^a@}uTyGPgL!N7Lo%eF<2Ec-9^@O@V>5AcR}LqguUZo- zOr(r2f`S6Wl>Y=F;xWR7*PRGG?4O89b=9h41J-RJ7b`a2H>m3-{tdkb^29KPMn;kS z;L7a_?&p?c<6yO$&z{{sYA<2mkNcuM@{b$b3=9renqc04P}ey%$}fNTh(I*swVUr$ zEiYhCGl&=H)|A%8f$3-2XZtxhl?ySg9ogz%pjD~0{-7_ogo>U>Y}{9|bNiOqp7-CY zIg4<0vh5~3-55)>pN6ohm<1CJ((iK5Adro8_{{!?(9boZhY69Y=i4j2iCVwqo_Egp z<{50O@)mPH_{m~w=GkupiyfJFL-Wy%bC64I3Leb`yn zY163AXkENw;F2QVl#yS*dqSN(D|i|IQ&LevPgd#jaKGL=sTsyk9#d%%lAiH*Z{1Vm z=Lrt8^3jh~HpUrO_|cDLnG(ynSDR->IpII!g-fg{X_=htUQ}D4myY;f+C1a#meijQ zCZGct<^|NSe8?l5I(yD~MtzYbM}2lP!Q8^!x7dL~``;btr8KR~+# zs0=rc1zie!QzYfNqU~79CzF=yU!N(tUmkh$W)U@+uj&?AKuWF_gw8(l*a^(-!^L8f zoT5ifbH)?Bf_@U^-o~}%ExxC&3+GI5{aF*ZTd2z7cw z^q%1;gXX*2C%1J)1lO~>k!vtFQf$hN{X}p|E`MgTxx%}?l_k1Z;!N4jOYRAh|Kk3M z?-S+Wvv&x(Q$r_eGt$+x#q1s=E0;(!(-$UE4}n0KTH~+A`cLxi4DkQhJ|z&C)efx& zoO@imap|?mpqBUD$QOB<%e^qiM|-MR zD&~a~dKtrh>)mx6)luiVIGFXoBSYX^Ag<(3W2r7yBVZ*7`z%L=ZAwO_XEV*mYYE1~ zqWl76zBvmVDWlyOvD&Mh z8~VfuM%Gq5De&oL0uU9u=4|Vs1rntU|E$=M!tiv-7Wd|ou>obB=s9Il0VP@Pw3WA1 z2Rf*HB{9@&*^s|Xc;bTmLAzm^7Kx52O9J|R5{eJDi^i2<-X%z!j|bUf&}K|m9GcC) zrX!E;o-BGb!{scOT>N*Or}1aH8C8GjT%!FZ;NT{^uBo7i8D)Nr>1 zXlN<@aoqmQ7c)vcrUdA&g@y@n?xJh$j&9``^$Ud#AwmywnX7UkYQNOSDCXO%3I!%l zgk<@;&ag*EzL1*=vn5&ofRcB<|kM-;2jzc+tA3| zV>fRZj{2h%e2(alXCB`MklNG)L)3P>Rp~0cT$b=XdsdU~6Wj&_2-^dpf&F#~bRw@tis2Z4V}t)iysNo?fi zsDD}}d|dTI0EgSh5d-2<3EK;OCi=e@NF(^*w=#;V<5~p2$U=Dv8~%hCmle2b872K@ zgud$i&lGqu`wkm#M*Y)!`)aAfatFt@(VR^x)nK2d@f5l8ViSa{r$myEuKxtB2~Hj{ z^%cTBD+Z;F`;CQ2zUI#r^{5{QIHcs}oX;QQYQDz{myvkGanVU0C^ijA+ zg#gj2MAZy~dT>{_TYaMmQ;_od-9~iWl#0?Z4`WN$ar6Qm$Uu}kfK{v6Q>??=yGr$b z;p@VqTSb-`%$fP;vd!isK_tg~Hk6~U^x`V@rnK|N-+7a{e!he6Nz2dwym%i60uX3U zDnSEljorNv7*pkf62clsgO(`-`(FjY07`mjkeaq>K_4e-zrHKM)5uH8uQmH zV;%~7j=++3cG^;zgc39mr;0 ziIq`sX)+M6{ADzk9K4nh%efb5phKKJXJP7W2fDhy25T`-Lf$2jR~4o3gJj_Tx*^skG8rnwh=tc?R2k@1z5i2S`}z zz90Va^(JvU{VL}Fk z0p7ntI2Yi@PvIE!$)w8g9okgk@n2yLAURXniU>QI_z{!exT5EF;<%clOVyab&(siz ze?x1YT*o>ePoI?cUUqvgXZoQ&Q#<4@1umsu>Q?%oQyC3Tyl`hQ5p~ZH zT!Nsxy4<3eZ;mMgpoVCRAGa~JV%stb#H5PEU|%AuJuQw78#vbxeqtXzoUzTi-BB)f z!s=u=yS<583r|T3Y>^>U$?|&B7bSV#UBbbN?DR&+E!W3Oto#Dlx~$@o^0Gopol!5d z=XO&B9x^>0yeO^OVWhxpGNl%M2--@b3iE;541aOU60!0ZAaVjoZTiZ!=Z5lF_E?Z0 z<#_i_aVQc-X5xO>Wq#G}U32m&rRXXy3AAYgTXuOR?)oNSZ|n{60jl3Hnoe@;FJ*vq zU)b~OylU08l_%V$#tUVx>Uv%SBq~~7O5(ykIMfotqs8g2sTWI!la?cW=rE#drr?)7 zj3K8#fe!6ZI$=#^gM-Q|eGek4Y_a%)0BQNA6I_tH6JD~w++%c<8K`no^6hqr$CvFy zij3R%Rc<2A!FPzvzSz>qqvt83`D%OJ)qS(un)S_l`maluA?k+F&kN3sv|M!~ zS~JmL71t#2mU0{$VYy?xHGC^~=)ZN5TejO+`trqN%^pQ6LtTGC`S;?>qOz}7f|4Kq z?}TP-cve2Djzr#-&NoEcI&o)>+6dhSLBK&rBZ1~V#ivpNm)nLiaP4cy)oL}Yxw`h` zq-jp(8N2H#r(gHY&nhC>6G>Tzs5Se(?cSO%cyhobA}=Of(i=Gm+jw&kikFAqh7v1s8je zOc<9kg@f}A%R}tr6N}tG%O(!9G*^NWskBK1WHqtRqNe{-wiqZ%nO9o;J0!V39_oEj z6RZEFBn76WJCYP0O5i=dFzy+5>A~f-a(pV+L_j^{dnU88Zr`Vf-fDB6e^6w>8B5OQ z{28hDNDvv`r9jZIenb9*C|hh6?~~ z|GJ!}ZO5W^Q8%|o9hJSqh*fYbhJ0koJ$rETPM@)@nRiWik%@B^7pNbW&fZ>~MNPeJ z%+B?q4gZzAT3GnKk1e8wKnoXdldM_q>#1}sn!i3?H+k16KFKEa>dRxn<$cP*p7)%0 z6Z4yir#8W;$3x~TM6uoa)#8t;X^xw4OHNY%*@52lr(ez65g@1*nkY`^XkAr-qx~vIX;%i*8_w^PHLR6XEUEQxx{sF8PW~clo2#1yJDv+u+1m}3_fO^16HV5Z z*Sa%Y`E-5SfJd2jy#=B(8y3^B92IW!^M4>M7D$8?9o+{~@}Gy8 z>`dL49NBCRoIPa|w9oWt>7#nDRpKE%3EzB0HJzscCQp^iA%T2XR+;*B+;-E{a=6Tm zPJ*m4(zH!OeRAkGA_P7rbB=prxIyg!=R@nAL6Mep7>$lZl-a|ZxL1k|*`hebS)E{I##%8?^W4oh4ADja6g5@Nrq71mKB0VlZfv93 zxn1Wb0;HZFF4>T8KaExXV%2KqdsnMsw2GeW%xlSB?s<2m!~5S6Q(BJ=&N?MK&{Dvu zsyJcQjAqE}xdME|OKLb+Yt8}cI;p7-fzBkHY$YU?q>}h&z$s^?m!Z4K-+b;Cd>-E4 z8EZ$JOIi?}muQ)1!)idPwrS2ZE@_se*c1=K2!B$m|9713x17?ByhZa zWk4_hJTS>QEm9V;@15dP6S62U&^^)+F6*I+UmZ$_FYp_gt-sR@?{ZIDJVpBm)PKLL zXh$?*r~+~E*hhK<7TcaR--9M$pok)%Zw=Bnx+fa2QZSb6dY)($GO zlozeC(~HE zxzXFs$mW<9xfWGdAegK(ljMK6r|Xn~Rh5z%dm@s*got;XBj#eq&;<*SfE)!jK;E!O-N<}uZX;vnhq=k%F9q&cWeffE^A{}!#5;p~^hVUSGLhsDfz~{%ZyH)p{$$Qh%6pa! zZYxGAG^&vJo-Pz}olBr{QIZ?K*Fu|)SFOUZu#qh_L=K5nqopKHYziJG9Yn%keweCZ#P)XvnJgzR@|V|k|+ zl$LutpsI{~jkl2D_R_w0ay?Ij@hu>wi?2rUEyw7N4CB)cPzG{No%BB%*2ST4@9fD| zZ?bH7GtrH{F*E63QKvgf$AiKNWNBKPwRLgrHO?PaZe5{Cu8Rs)Fin*;D{~V!Y;tIg z8z~`7#<}O6doDs>D$O*7hn;|`gNifnG-xLdVM}!fuNWE`5*&{Xd~teW<$$K}+;>k; z_m_qBHZX9tIXYZ^ZAk4>!9rZD?ZrMjZfhjE8+4C^uKBZ}1fg3NS`;S>JxYn1s9mbP z-;0=p>we*CGjKaNFJK^Bc|J|%BeFik`X3;96j$MdEBlr%0w8&sKjKf(kA*?P4SM?~ zR$*0$+7Rl}&?aR{)5NK_IWdoJlD(8KsHfAC#aU!EJT1r?e@**b!~}mlRRKibkc1k0 zIM?GWKPKH=VrR=eQ(LAjk2d~}AV;jxBB6zvs0r;pJr9GQZlqFCNkl)Z`2X84|NghK z;-*QLIr9Xv;l20|@Jssk{Mgh`igwOA72S~2Z1v?`Dm@LozP6H4>L9tBB#gT@>OGoZ zX!Zyy!D3$KL;TPNBsQV)@Q$VBFiv23Jna5lNq<8J+Tv>bD$mw0O|@cW(6$qLZv$;D zESZ6Skd-(z4=plfr5yBH!oA<>XjTk=_NiOHdQS>@ehC5|Gy`ywvA!KS#m?pF!OYu6 za%h`3$qU@(t`Sf72B~4o4JGdSj?mx^ZVSq5$lVrT%Mj}KkopkxKeC+TZ!jaN`e`nD zF-$ay;G%ldT3xj;FVy-&AC3zw)=-|sdPiL=7g9*7Y&3m!$M0#3=@udB~=z>~cm zIO>~k=zs6Xsk_4~YwOQdJvQ^j`ZMS8^zEdsRhu%?n#zTYUTl5OD z)y7zVx)LD2pB*B+GS9S&OPJm9#=39i>T;G}kocMiTObB3o=+i1zGd#>?MtwC=A=i0 znP!u(Awkql#;^O&`x6A=VPt{0>Zz^TY?x@3*8|;0OQDH&ClXRgXC;Z5AVy8GQtgG> zITOs=c0H0%N2V&Nb{8AOssj0J`!LQ?cT~LI)-YMcXY*@nY}0|mn0~YQtyMm8nLfu9 z8+x)ui+(S4{;dd)IMB7tGPisv2LCGSmWCex?7RltcexsOn|GktdvH;FY`z{=HqW(?(|B5n8jyw3xjQ7xk(&lZP^+c)ChRJYa z#SsdFf0T?N<9rgXC>CeK(!oW%8KrT2qgRcf{xL^L)AJzj-Q%d-sT}~0+WmhYcq6lU z?`ej9OG-@-64kjDS#|foC$sl4deOfGcXbG&vwi6(f$;3K!@2?Co;YXz4|nD4pKNvRD`xEE%i@sot7~5Egb`3)|G6f=u(mExL4?Iy*IeT(Iv+5rvJe^<{}^%1U=Gg_SDj;j#t-N2uE5WP7q z-Q@QII^O|h9dFEJ-#iJtEKg3BJl6gZ*(Hu^F5CdK>|!Y!PhTu}m#ehIt;jr+aZh8W zo$z&=F6NWb767xEhZdJ3$`)PcO3fZMcgjPuj}u;(~5 zMzMP3-Y=IpP==mONK)9|Gg%{SR9ZJI5u>`n?Ec%|YjMR)YGE);-KYp;pGc%QFJUcR zN1BHCd3EX%*(i6amB|C!f#i>0$0V6MG>nN)UDz*Np7nWCBHZ?QHHB(E3H`iejnXz> zF`4UOA6u-XdY{lHxOV{r<1R^l*{;-{j)-)0RQP z)_YogsNv*VTT4o|{d(xArX6Ir|rk zuha^?CAb%FJ{>&_58Q5ldBjQzaWf<^{Z z3}N4Fr)#G>@=SLt>T0)aTk^~Z40RG4{wx9C?m_>%;E7!*E~ta#)>&=3oJgHCUm|4p z!~OiNkJN=JRXNzwrc;B`-un%%=eB*hsNsD@9K%9WNYzz?GT;YVKINHBv#As}|EylD z;+aNoNPj5-`d;lx&=)$la9RY_Y-wrCe2_)S%Fi+FX--^aee`#1h)eM|Yu?G|>RdY; zYB)LN+=Kj#u$2!xGZdi7#eiduNvkV2Z{)xK2Z(?vtJA&4JH?_PTk6ynxi61KdbM-Q z3t46CD%9<3%%JD01x+l~PgRt+he2xll$;xDRCotmW0TD+AEvHom;I_3zV?snfS&9L zJvY6#+e*JM^+_U={jAe>A}VlV7b!4RJ%$T5O;6%qyW^kNe3P24%pBKZ$@o<33!T5K z$0X8F#@&Hn+aFB={9iW!=65qwY?`B0hpwJw_oK-&h!wVbb6$_r2mn~-==SH^-g|hF zvsN3leR1Q<7sBH$bqnmX!Nqv>&`))B+_uIOm|Rk}vHvv(Gy6Gf%EY6alX}+$r@@^q zM2m*S<87_EA3TDA*iN1ydWJsT$Pa$enZoV;a4$k-5Y8G@ZPxWAd5GyDHDX+XxfQ9Mis#}pu2pbs5xfrh&k=8DeqN@AUg=`!BiH9osGe&hMJCyAfO&%q6x-wO^3Dzecqt&hWk-B zQSPNS-TD>sODLZ%RyWaBN82JhzV!e;5lz8RdM{J{M%ZMxFgG65 ze!x4Y-_E;qFk~OH4rV!j6A9^!mfACI`*t(LsDgN>llpp->DC%nrIO_W5FV0&7OT;E zG71PH8#P=HMwxY`N0K3}o)fom{nI`z?_5O$>wNde$N%omx0W8K2C$YRs4$<1Rk>Av zEEbe{e>%xXiM43`)U2O5Eyz;MxTeK|7=mfglzn2VC1Q?US1$H)Fa7OWvEbDBIzgJf zUmbC@$*2lch*WN(M&8$2^X3?*lYWetxPli{RZ0vk&SsZoWcHUoGy=YS&9TjzkncFO zRe_3>Uk#N?<&ixmiIybEzd?-cClw}LFlvZ-0R6yianWoknz_qW$le5%!)TXGe88sP zZ#{8A7-vzqGHZ#VU41xAa#3;gh(;ZJ!UcOE-?{-CGb5aayK#IA5yDq1N zDs)6&DEDfFJU#4XIlL;M(r80vDs@(P(lqs>d(F&qFnYs0=Ia_C&%4*G(I1~BlU{dU z5esw`yUF%*3iJb{aK~D?4Cs+fk^a59P9@(`2ifBg*7B8&JAeKB_a5&ApxlCc0$GC? z=dvjozVEwg48wn@pzBsGkm=i*zToD=MB&}GTxdbbw-V3DHIJ}w7Z=-g8OE~w-<{%v zax#N|q>HHk5|wlT0DxMj&Y^A_GRLGvq^_GEeNoNlHFRoi%y~)c%EP6=FLF>#XRpCE z0Tqe&g$a~IN_(1503?>bWp-$j)zNn6GtD~)Zie)IQ?7;5s_`ra1_+~IN= zFJChy%awesI|3TH?!-N|e}1>g-=uqM_%nnmQbGpoq7KcT-3??4?G6HWI}dkG5vPiW zL5DjS*Is^Sz`U8#*UKC6XpsSryaY|QpgrQgi*Jrr3>W>Ffz*Hc_4WooZ5nTXOr-P5 z%R|b8K#{f4pGDn&+{1||>rMM={?gg8B@uV#Oa~bOW#0&s>bK7bIueZeK1<-Tcjk^1 zagy?@g`8?-Gf`*BoksCbl8PpW)iJKm=Cu~-cccv|rIDcyu?GSy&=;qg!UGyXH&l`p zS`%AvX(hQ*@pT0GE(`mFTYZPy%qv$jH{!l+WoBkN9J%U0uo?!5zKX_}of@ zu~U`RgC>}6U}n|MQ9zs5-?|mL{C*{~GyE>VDy*iLHS3#eZIhyUj4RU@}<^qqFRXLfpI*FYb2*9webirp_wzLyN1s7N|2N z-b8*JKkU9ju-DDE!eY9}L?Q9>5uNRh^<9ttzSCLX^7a; zo9F2DoAz`6K!W5pe;=+fbH9tmm&@QWRP$skzG6=*CDF?imhpfhHt&vWQ2uP_ujx^> z(A2vVY>MmJF_{Tp%vZZdF$C;cwRe-a?#c`VFDlh>HdD$jt#rX5o3F@^!8Vev+SO`} z)dD4JJa>8&X2gnCB>F?ZP1B*%6kRJ{sfx7Z-CFBjW zNmE(kTF{-kD0B)6Yv{AP;=WyMD*?lM{sBC2ON?Ejr5gWtIL~%Bd~jv5_4$?aju&F} z9tDl_FJq_DHirx7J-Mm~vU-=h9sc4+@hJqhtDGJRRwJ@gG^VX++#JLbOX z3gsp)XyC(_w1TP*D>PY#55rv@IeU+7ivDcm+0hC@m-5LA$+fUuPCITED?{D_gkpo- zLHBYEWYDKAr`DDkN&!rqI5a`U@1;*VZ%6W~9=k5%kYkolv-EYGP$LFq#RjJnr-#Pu z#z|gQ9JmAc{#_g@$L%#{3ii zOQ+4*Ye#A}X}w(g$<}7=7sRzs3c$Jd&Y4Zhd7rcspeHpY%b=H{5cbbULCA45{&nc_ z*FD=rXGQNMv~m=dHcv+@E?>0%fh)sP(IE*MWKtG|s!YKB=AaVo-Db_IUyb0oE57!O zuPXLsz_@Jdasid&tecQXB`cKgHOS9jH#Mk$gU(K(wAzVe9r2k#Ii|fKO<~fFWp5L7 zTiNku2LJQTUGIZIzjF?bhM@eSQM5?S!na&Oj&hE2jPsTtU6YIq)UwUuxUDgM`%0!l zFZ3d`i+y3F?Jj{ViYmRMoM!`KgoA9nX7wr2T__d`r}C{{;sW{d*cbAjRz06>eZnYb zR?#tM4^lf98gnkbcd`BKS7JusPs2ty9#(*rfQh5sn~_;ZOi`x){jg{q`yAl{Yuifc6indcXfMB!D>VALh2nOlaC4dge$R3Vu7X8_^dV~dovd$(D2_NKOP ztl7Y?C>J;Uqhu|5IANz{BRZ)Z@Icu(*7JooV9d{de|v5Sm51Cm?ae{ztnlwPT{+ZU~> zXpM&{n3~L#%+$O~O#kwj0=`4;y$A2wGIA--@!O`;5nRZ>;L()^76JdE zV^CBoF6lP>^>IszI+fjxKPR&af}@PEVuX=)u`LF0Lnz=y4)dP4)xUf{tU#L7o^ZsI+w-P?YR3S*i93>7nm5(h{rK?@!BW%tM1aO z9k$xJ6r>%33uX7tNRwHkx!UL99F629$_;_}#Z0ZVi8S}kzmR;Rl!8pk9$7tXko6m| z46-i9Iir8|t59l6D^jqWk2t!|R+CI}6%ZQD#S&bR*}XJ`AY!WXhHFkojf6ZmU?+O_ zA!;$mo+ab4hjB=an6HQG5Hm<>aw(DN0%>FZG0}DF6H`Tvq5nvRgye3*(;GvAjs4R2 zzEsnJ*L=Jx3xR}UvcmazSTmoR8m^z?`gDThM3!G$fF>Ilp9Czk{kx2_)o!3aLG8-E z{+n!l+A_oPAlGC^@h_z&6`~n)pF>I%V@Dy61fj`kw|1>0p>M{qPx%u2y~F$et3Jau zRZ3#GvP0~aCq?PZ%J?9<`Y@5uS6F$ztsISf^tuD zIxgwIg+=ckCj1^LO4`rrQmNg;h`lP235hufkY-lM|g z)h*$Mo-5rL#G3ZOrb9`!jYbxY8Ixz425+&d!8o{Dkj~Z5>ybAzQL~GM zDP#Vp$m2en#|)<$kL+$h%hY@S0JJwVDAs9Y+D?K^=Nm#zC1Febh^fc4o6fo$%JZF1 ze>$6Ta(oUu@|-H6BLkDIwXj zr>rTh7JS0rvi$G}K~0uX)aPU(dcQd(7|14*X(ye9<-nZRG;-=tgi9VdRT^qX7Hhd9 zZ!rXFY3X^!$G86#SMa!dwsc4nyZ+9r9t|@?^OSE8rQGNb56_4`oH`uMBImKS(K;4i zoAVVN$Xzgl=>~G1?m;Bb{4pYoZxU_jnmW^t8tUl2DPMiI5ZneXtqrYbP;`xXYN{E4&3tGx z{5_}t)&b}+^}ItKV^HS`zFWJ64pf1AEp3TL%I7V1QL_#txFIFtrD9P0Z;}L|2jpeA zf+4x-a*a}=zmp)ic->EjRF%B#5DI!*RbVwsS#ZScc!T(zM7z{a&NqQRwj^iM?X zxU5v%=rrcZkL5Iu^jeK%9iuMa7mWeZUz@L}5kumi>jh};$;zEN?7sM!zeqX+s>)R& z8hqe$hL&yMm)>2jidb~WpOun=qP2;nAY5B+gO8BJuz=Npx0yyvrA>M1x6(znZeRRZ z-JRhuTadO17h6iBejL<|C$+?))nU9M;HqwhS?Hq1|2NAsE%M!xHEP?|Z|#*v5cFVh z{+*r|_|=6-_OyZDq}d8{ZEx}NyA5L54)8Y^U8ptaKWB|{C(6$j?|wUye$$Vmn0OHI zYDo*Wr9{h@TRNs4T#07k5lFBa(YQmLymGt^?f*5zTjTcXh_0jmAkgm^`6DUZu=Ltq zCBcct#_d4!n++UIcJEY^RuuSLo;gr*H}0rD-RStxMn3u}2k_*%7JZ_d!52E07uxM9 z|EBIGvbG(`@9e(2HSj|BKjLmx(;Bl~EO+nj!=#_<*TOp_bC~pO%5JBi)q;u4%CleO zt}!?=?`)=4Cy2N#e2?=-+5c@D`rmVW`t>3vQeDGpsgl>PgP_&yTzg^l8P7mrgo5u_ zJZDqT0Q&%`K=a2tAN))UAC%1Dn z7fHjYLYEyZ>Z`9b{*EzGic1v9+H?YLQALH_|Pl>Y(VP;c54 z)ZjQwf1!mQ12pLZo|SZW2tPh5Z8Ov#g6G8rQ%S4u+onYBBntz8j!|A7CxHqpX?X-%CqiKg|n@P&0$orfpf> zl!-=o{sTPkaL4xg18?c8-5-MoO>v?rETHRL47RWfyL4E&vAJPAaYEcz7+~#h^2Vkg z`?`u&wHN(qcac?y1XU}pWk9w6@Vc>CwG_PWzv4PgyFMH<1+8gc1F?!Dz}s!`xmXRu zlxNA|3TC|Zy-r!$A@*$;>tsm$^RlW^-?s0*_;|@bABK8p%I<%faiRD+@)OQgKi9f{;*1dGzZki&L@ANgFY3CNm%K`N>i8-ayf(7akVvzj6JQ|8 zPMXR|&+^el`!m8?o^`%)LqdY-qy0sVa<}Cv*E|^M486zA4;(ANBOLPPbRXkoVP6_M zOJSSr<(Z~+>r2gWzotW0(tg{PXP;{l-H85@#Ges@vb;Nd42p6719v+6gmaio`~x5n z*g@RS^4MU*FlkN8x1Jv^!wSn8i}_f6V4`k*k(jQ;=WB`lS7G&_710l}M!Bz~;v%=V zrF|DySA$6Z0km~FR+DdAgmohp1IQrQ}zRFsX$A9S4vS+#ZZIGZH z7hG(^^65foNzY;Z$a|u(dW58`@R_Up%4~aDza{!Y{BC8#0(x?XRXiTK$-Y(7<7zb< zbAk{TJKkxU?l?fn6mfaZ=fNW#Z&3tx=|#$*^D(g+xt8*e6VIKEpG~Fmg#J<_Rw{G~ z*;8eUfKE0U{sY(phf5mwIqt(u{{eQWV_vjxko>+-ns(^bF*F~m7FUO8HpM;jmvJaF zZG4TwZ(wNXHwpU|ST;oG>54zBBq^<|HY4i{MO$LxZkz4{M=+IZHWtNZI(e#MH($3y z(|39^DYZ+gs&6T5j(+aEwmN?X+}B=eCs6E$9zgYs*$CdHod=9Z7I1BeRX^sv|Y4&NpESh}hM-FqQ7 z56!?xy?=lSjUd_M<%<5_+=(xK?wwD4gakYwFoH|ak14Pnb-Uh#2G98KfR?FB3u?T- zE1LOd9r+1Ah4$UNFFsX~gjXwd?JG|fX>F8oRk|2O{LOksw+uFEf{NmM(0bxCG1(OB zH2edY0`F%0_%BGX7gpNN-a+p2lRaA%q?^DgjMI}r=FbmZ_%1f$y1cKfZ)dIUChtve zvRP{jCCm-smyP0D&aO_UYT+^V&uL`?1~wqW&CUph{iePzo#WqI{!1)n$!P&qe{}9T zWopHte!4O~@-Mnq2U7{0BNgD)7R85NjyRNgroGV9LHnDWGto)Md8*faWfo9Dp-C#V#VZ-^`>?$C-xZb4^{V0XdBaVm;r%nns zJn+2q!B2f`h4b;BRwA%9mRCgBNFFGp>D~uN6=OSUkX8BZ;8R;SLY~L9Y^;y;^LWgZ zKuT(#U7oi`2;ip6m*$tK#7QY=6!6~5a!cQ%?x!%yfgES%(L0qvA|~{i?~Zhs=q!7>bd#F8 z>%gLC#AM4DIaW^V-Upk347w*e6YcpNcGDm!QqPtoG5wLVTnbwK?5=)o#yRmwFTXG$ zE=Lc=mMnOv&wwH1j!%_!GVYpH#-9BTy=1ZiIV9FTH%9{{Sfb)SxXuu$)iY~8 zc2Vz2uqnXmA9dk}uzObS3k5VCKBjJrTO$qNWBWB8{rZ6VL8I!BBy4(kE*hw}NiM_LW)oKwG0p<# z)Hl_RVoRfr#diHa;&|}lEg;qrReT7At(WBAVG=Mk+jU?&aJ@y+%D3g!V#dz6?b)b1K{JgF(MjJ#_d^!i zm|kX&EPVN3*@nJ@Buc1=$8f*3D)j<>I^O4nOWB5oe5k8yiDTm*W23o(nAur^$D|be zZxxw|ytLR(HJ$PyxEt2xKR_*q+CRW#O!ZUjPuxj!-0@9x`J{msI88zz!`^hc;%E|Q z=F#d9%U#0O&z}^x%;V^r&-fjo=+l)WQ6HNlq$EzQ8v!@Z{DHJtV9ha45&alzZAI#N z?`SG*dF}sI@ICotM=S&$=gDeqi+bM*)nv?6_v?{h^im3t-28AwJ*j?0j=R~jnkhD6 z5`rN2K9=_YLs&ZdAyaE*nAKxZkv~>?@OmaniOU*@YMoT^9K6XP8EZe|bJP#$Pl z;l8>5C-5d4Xg>|POE)Aj;boe$Vb3|4o{1_m>0_>cApr+?1=r&0_GZNjs=VZTk0e0n)G9Vz0h^o z4aEiIjtGG(!a#oM_p}%n+A|P*i7R{xCEV{j3vkyLw{TwB`>7sM%Es9CDRffteqwMy zOttA9z zxEyJV`9e;maKl;wAxLZBN4aI`hPK`yp%%BP>5%tJwYQ0^c*sX2ICJ!aPARnb0FWwR z6_cSv%Gi&5GBo4rf zJNtitLW4FBL9;8G-I7q$33AmiT8{Z$cJ-oTrSs84jbI`2SJV6_CU3oJ6H?#B3JJ>U z0SX)223xb9rfrMi>d%(om=N;YBj@N29Eql-Yrhb8X)o)pl>`!ARHfaMgZOhxxzscd zGaOCHV#M)MS}UInhZUSSa>6p(Oj%M5?Y{*St|I!tvV{et&>qkct$JfnOs(1>|5sy4Y6S$-^BhKZHHL){ZNt`}><| z@EATSBiQ3G5#xwD0`|5{PI#FJ(^vV`{StiCO-dOkhi!mgue@QX`Qq)! zLoR8E_;UK1{6D_5mE=d=xXrG6%Rj&a9FIH-D~rMntAXHi!kS^qkfB^^$~xsdhpS`o z+MV;NO2#Ss(vZD;V)q45O`glk#w_xh*Bi++3yubF>NfoYgqbvv->%_ixLQpfO9LB8 z*(W?+&5S}Vqy?yCgBD9VpzxajecUxsYuaQ2k0_4$(scQPmQ!2YslkKKyY~0U?-}Zi zx#N2H*Xn%N#P(`q)|7}!sY&$j5M9^V1v5YVKMIX#SYKh`Iwt^vm^}f&OHt$)j97Ou8`9wEO0BI3Y$EL)hgyx^!~>^i*tUS7G04;*@R1 z4b&Kkx~{Wms#%ihWbj&96kW$vSw3HZ-y(lG15bH}uxnKkm+7qPI3)&XqsAp}bBb91 zGhXcho)_IRkp?!tlxDcFj0c@kL+>{%bPK`o`FrQ-UY@ldP@BxA{!srlW~Bh$LcO<= z%x73dpDV*w%o$e_$&13HZB?p-i=ApS!)TlpVG>vzL>!8?VEd`Zl;b&l{yeTCRZUU1 z!uj&Q`Y*O04rj6uoE*5g|*@h4QS&EQ!bptyq|1%gdD7EHqL8|_G%M8>P7*hosEuXN=;jG zUR^UKQIVb${sh8;ZjSpb_ioM3@%SVMj%)=n>|Lg+*XPCIJknYU9c zluVzvcdaIl`w#3C_y%_>yrh LFw^x#{r{T)(* literal 0 HcmV?d00001 diff --git a/static/img/headers/python-lambda-sentry.jpg b/static/img/headers/python-lambda-sentry.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18f0d40db9126fc68a8174b567522a7773857d13 GIT binary patch literal 26907 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 R|93yof3{Hlzh1-me*lcQ|9AiZ literal 0 HcmV?d00001 diff --git a/theme/templates/blog/monitor-python-functions-aws-lambda-sentry.html b/theme/templates/blog/monitor-python-functions-aws-lambda-sentry.html new file mode 100644 index 000000000..e681592c2 --- /dev/null +++ b/theme/templates/blog/monitor-python-functions-aws-lambda-sentry.html @@ -0,0 +1,6 @@ +Learning Programming +Web development +Monitoring +Sentry +Sentry homepage {% include "blog/external-link.html" %} +Sentry Python Quickstart docs {% include "blog/external-link.html" %} From d15c06a4de8e3982558525baaaf5027bf305b064 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 22 May 2021 18:53:59 -0400 Subject: [PATCH 261/302] new resources for jupyter --- .../06-jupyter-notebook.markdown | 7 +++++++ content/pages/05-deployment/38-serverless.markdown | 6 ++++++ content/pages/10-working/00-gpt-3.markdown | 7 ++++++- content/pages/meta/00-change-log.markdown | 4 ++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/content/pages/02-development-environments/06-jupyter-notebook.markdown b/content/pages/02-development-environments/06-jupyter-notebook.markdown index 5b2b44a06..58c9c32b6 100644 --- a/content/pages/02-development-environments/06-jupyter-notebook.markdown +++ b/content/pages/02-development-environments/06-jupyter-notebook.markdown @@ -146,6 +146,13 @@ like advanced interactive visualizations. code that is suitable for [deployment](/deployment.html) to a production environment. +* [How to use ipywidgets to make your Jupyter notebook interactive](https://www.wrighters.io/use-ipywidgets-with-jupyter-notebooks/) + is a tutorial on how to use the + [ipywidgets](https://ipywidgets.readthedocs.io/en/latest/) library + to make Jupyter Notebooks respond to users' input and go beyond + simply presenting data into having users be able to do some additional + analysis themselves. + * [28 Jupyter Notebook tips, tricks and shortcuts](https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/) explains many of the lesser-known keyboard shortcuts and mechanisms to output settings. diff --git a/content/pages/05-deployment/38-serverless.markdown b/content/pages/05-deployment/38-serverless.markdown index 306caa320..ad05af5f1 100644 --- a/content/pages/05-deployment/38-serverless.markdown +++ b/content/pages/05-deployment/38-serverless.markdown @@ -101,6 +101,12 @@ iterations so there are many ideas and good practices yet to be discovered. These resources are the first attempts at figuring out how to structure and operate serverless applications. +* [What's Serverless?](https://technically.substack.com/p/whats-serverless) + is an accessible "first read" for both developers and non-technical + audiences alike. It breaks down the differences between what most + developers consider serverless and infrastructure-as-a-service (IaaS) + offerings. + * [Serverless software](https://talkpython.fm/episodes/show/118/serverless-software) covers a range of topics under serverless and how deployments have changed as new options such as [PaaS](/platform-as-a-service.html) diff --git a/content/pages/10-working/00-gpt-3.markdown b/content/pages/10-working/00-gpt-3.markdown index bb50342a2..04e1726a5 100644 --- a/content/pages/10-working/00-gpt-3.markdown +++ b/content/pages/10-working/00-gpt-3.markdown @@ -120,6 +120,10 @@ is trained. researchers on its usage, and some initial resources to get a better understanding of what this model is capable of performing. +* [What Is GPT-3: How It Works and Why You Should Care](https://www.twilio.com/blog/what-is-gpt-3) + presents a high-level accessible overview of GPT-3, how it compares + to other language models, and resources to learn more. + * [How GPT3 Works - Visualizations and Animations](https://jalammar.github.io/how-gpt3-works-visualizations-animations/) contains some wonderful animated visuals to show how the model is trained and what happens in various scenarios such as text output @@ -139,7 +143,6 @@ is trained. with its strengths and weaknesses. - ## GPT-3 tutorials * [Building a Chatbot with OpenAI's GPT-3 engine, Twilio SMS and Python](https://www.twilio.com/blog/openai-gpt-3-chatbot-python-twilio-sms) is a step-by-step tutorial for using GPT-3 as a smart backend @@ -164,3 +167,5 @@ is trained. * [Control a Spooky Ghost Writer for Halloween with OpenAI's GPT-3 Engine, Python, and Twilio WhatsApp API](https://www.twilio.com/blog/ghost-writer-spooky-openai-gpt3-python-whatsapp) * [Generating Lyrics in the Style of your Favorite Artist with Python, OpenAI's GPT-3 and Twilio SMS](https://www.twilio.com/blog/generating-lyrics-in-the-style-of-your-favorite-artist-with-python-openai-s-gpt-3-and-twilio-sms) * [Automated Yugioh Deckbuilding in Python with OpenAI's GPT-3 and Twilio SMS](https://www.twilio.com/blog/building-computer-generated-yugioh-decks-in-python-with-openai-s-gpt-3-and-twilio-sms) + * [Build a Telephone Chatbot with GPT-3 and Twilio Autopilot](https://www.twilio.com/blog/build-telephone-chatbot-gpt3-twilio-autopilot) + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 8ad49d56e..9f52bf150 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2021 +### May +* New resources on [GPT-3](/gpt-3.html), [Jupyter Notebook](/jupyter-notebook.html) + and [serverless](/serverless.html) pages. + ### April * Published new post on [How to Monitor Python Functions on AWS Lambda with Sentry](/blog/monitor-python-functions-aws-lambda-sentry.html). * New [SQLite](/sqlite.html) resource. From 5187a35a2faa19b03639fef4a79b5c786271ad85 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 1 Jun 2021 20:21:01 -0400 Subject: [PATCH 262/302] fixing broken links --- content/pages/meta/00-change-log.markdown | 4 ++++ content/posts/190626-dev-led-sales-startups.markdown | 4 ++-- .../posts/200630-report-errors-flask-web-apps-sentry.markdown | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 9f52bf150..f73ac97fc 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2021 +### June +* Fix broken links across the site. It's a real shame people and companies don't use + 301 redirects more often rather than just breaking their URL structures. + ### May * New resources on [GPT-3](/gpt-3.html), [Jupyter Notebook](/jupyter-notebook.html) and [serverless](/serverless.html) pages. diff --git a/content/posts/190626-dev-led-sales-startups.markdown b/content/posts/190626-dev-led-sales-startups.markdown index 55e4ec431..ba8066e9e 100644 --- a/content/posts/190626-dev-led-sales-startups.markdown +++ b/content/posts/190626-dev-led-sales-startups.markdown @@ -456,9 +456,9 @@ tactics.

    Oms`I_9Z_k4ljtyZHu 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ʐ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%0Ao_o2Hpb&vFUCL2qD#_rnUzV_y& zy7Jsnk53?dxomhAWTAbJMUNtk!voF65Ij?REhJ{>CgZt(dggYmb5ZO#TzNo>>)MTB zAaD*v^Wzs|8$<{mo5o55yId#RK1D@Wf^Xm0qM8I0t!vK1pL>XtNy|lT3`MKXL`xEo z{iW=sSeeAIhgNpr2T{_hsGMMu5#z!WR`pn3a!0swsDK#b81X5 z-cs&N8;D_fI={X|DrckXBcaE&$w6}tdKD1CKi?#?@3aYyvSnnP-dfBu|Dr3&0dVxC z%QH3WlAXdW_zbw%gYl%|FV|GZ9~y;>sb6cKsAbsyM)1HY2TC-)5yQ6{sqA4K6IjQ_ zE%iwgLrozngQUTh+nxy@Udi1^w{R8Y;Ciyr?^w|YcOZCG5+iZu5gTdGz5Y)6V4@Zi z{S_xA^%;u2!or0~Wb%_ZzH?^L)MwO8l&ChALLOZ5!xeE+Io|wt2nko&J|ZQ+5MSGu z2J+Iw`zSEKZ;Dcdz2Z|e3PHP2_hCUHh8G&;71WLCYH#nzS7kf1vbx!_XGYW+GiTRV z9=|vq--wFe4UzEyJ8}c++UYnaGK8XM*Aa@5W{+p80|Qv$z<zzaBO_)6J?5O!MR0DT;9yKp@e=_5#e`b*~d{DZhK zSF_sJI@+WJiwxFFD#G&&Brbn_t3h)RM7j!J<-bGQxD-6Fz%jGF1_NX*zGYsnd3Da` zEV4Pvt0rs=^M!Z;A;0n3e?fh2*SZ&Zjw9)7)^Iig=F)ceoBbX$L91WwXJe!!=Za7Q z7gekd!t?IXY4vME}_NljbwR{pI5DygI>2E^rs6hpXgQM46qCO zlkUOZ_%V72;DAV%^0#1)_zkO9Og$XAHU$Nt9^;~Ztd_j>MKNX=y=V@2P@=$F;A8Suf>wx*?zY; z6MYxg5wEEZH^ONRN6C*AawNF6NAo6Ge-E)s>;UXS&qT~#J#hQna}cm(J$k27{Z&`C z{hjOnYcQqoP(f)%I^}s=l+k;F?l77?Gr?c%%X=TIb*^?hV`1Bc9vSk(CN~=TswM~8 zs`CdJBVm5Iq0HddaQ#uo6Q^rZnPY*unp4P`!OVxG(?k3YN@6WW=X>iF!}THBx!T** zW);%WWq+GFPE~7xEc;$?c8691+!^=V`Kk!%1tkaOi%g1Z@>b0q#s2>O3L4rW)^NYHv=(-WUH^io9gH|Es{Ylr zmX-9ZHOj!rX*bA+p`IFcqwzJf&RaQ~AR`Wv@B+-)fhfRm&?1SZhk;SFpS;)E@w}RM zW+5J)Wm9uf`y#!bWp|i6P~7hF?5<+w(AOT^<655!k}`v_dmBYZ0!_NPQ{n1gb_zX+ zcViNPZ$oPHS=L1mz*J5xyB5-W@GnT~e?3mdYKwjNPy?I?$C-2u#9SbAL|+#m_!F{r zQu_dFARhNqV88ptG;hP`utK)QeKUU&i|ZgICI*?IjYLgK+}ZFVArLn`6k2##Aa#)U zjt6KBJn&`fu(LodGRtJQQ~IwzjDNz{TwhwPD6`bqhlVULdpjz1wdX$WvI8sn+)64A z_%$VLFVJJb^=Fu*UW@Rb$C+D7Fp_~@ebN0FH1s%H*wssHS6%Dye;1;BS}B^0V8@vDD6hHoG1FjJ z%wShXoPt-6YJ=ChAd)8-l`x-k$TU9i+?D&L!75CW+W?Hj4QTTI3;NIi6q6u9pq{VI zz?bglZEBIAz0PX#tKjw0fq8Lg5osO?+X#Y$GnsLS4!Co@kTUt zZQY?M>FcY2nq8yYzXC^0oyZPV*M_6tMLS4z_Y#7)9K`zz{ZZh0O@mgcr@OlYGk?A& z*Uh3ycl4O;N0l~rg2+_>Htiu`B}%!bBO1><3n}(6SQt>uFF)gy zoYT&^RgN50;|pwJWc3V{iwWMq zAG#7SZ>b*zjNPeA4gIY0gn>$fYLs$cW|;9Mf_Dz-eF;tD83Bkjo)KC}uDI*6dbE?b zfXBSA6EsfMOy%HhOhgAw(|*8KVo1Nl^w2f?Of+Zox6;;)R%}W81_#{5eLMtuXHw>7bI$radRR1F z#83BTh{bu_mnYgH4C`v$BWu$Tmj+MLU;d;-{w81p`+$^jV4BL?sLqR%XLZ4=MmNDw zVN}FL@!Pz%Kl&@Dsj1PIB0uBPm9Pp0Kzj zlkqo(%1cVRy3V_0(AoF2C{cyP5M2Jc$$IO7yM|7c3SX8oR*K?iP*Z3Qq8u#3GFiC} zbwAd@TH73Kd%h`8unO{foY+SeJo7@!p!HX)Oq@X5>ljv|4K{|sk>E3IyOUyW|LdaA zn{~;~J41d%17#|H7#E(*b@)Wn7FyefuJ;oG3^-WJ^T zM;Q;qrE}kxd?rw$%B+i$%|OnEvhjvQ$No89a23WdJhOoIg<|Pnc700oU|+o*aN1Oz z?OHH-cZA`u*%$))=JtpRB^aC3F90lSQ5Kj8Fe!x1SXpM;_)?cFxV@EHW*${)`R8uE zP}ZAFDEAIXz>6@_hhVy@Xgx}DRGR_T`&|Z43uO{oiz!j3Ji{N`!wQ{eZJ|om*brwm zHN%_f&K9ZFW0opun|^sX@5yU%Yq;thT&4=vzWAseO64uURF)tmHtX`tev&8e*wW*C z9Nyi|H3njJDjYvP7~f9#6X_+o%L2VMna+@dvwqNvC97qx?Kaj=BJ*3`x=ql?*A~-?@a{vdP?bEZmBol8e;3G-*8`ELwbP1IBjEJ6mU|Kmhvk zo-soRZZY|9jF=3k!|qL4pY~hF9A-iGtgXuS)q>Hg25wVha!RMavj*O|7Llh2M+YtS zKRX#ax+mas{dI=mfr_EOmLiHE@Je}@HIHF6ztqBi&~w1HT1&pK+OC&-`ea;q(xTaMjX`no`55) z6xb&sy{5jN?PBlkNPawwpqiEWTf4XHZ1CewQJOLB)oZHCPGeY5ZY6;^2fYk*HvL*#Y_H%W%JY4;td=%_&2;%Qh{ z)b@fh-jIB#HH$9WAOk#%Z?d%11Jwe;7eS^VDvC0>Ro_3V;FNRxn0Vu4dTF#L=?QXB zi}?s4b3NVe#2C#CjH__cO`kTrZ9~f_+MXBs9uvI7f8gi_H64z_LP=M*m zuic3%1W~*lw!VICV-Tq6yw%p)a?gV&d_XXlS5>|V+pfl!0io4W>8^C?e|&I%MvS*i zH_5*%l49k9Pqp^@pZz?VS}Bzo9}ey)Jv=yX=_mwUvEn;2cL)-=Qz9_rE-BiINm-Z2 zyQeg)E9FIW)cRKbV$~03%JKXzoZ*^Bl_*%n8Z%C1<$M$^imyz9KL&gONC996CuR0gdi>gh??6R8O(2s!ZHkt9H^03ntSu%qaGJ#%^UIC^q+ zY6?Cr?yu>-Run$9?n(LrpNJGsg+ps#sn3}ws@K;XM`Jq@BCAWDc7FzX%jsM1+`rWP zJxW4SMvKB97w$5G2w{&FdB$|@!75>O>WE)q?&fBz2jJ$wzM;SpA>3gHM#KGR@LIU3 zb2bFb{f{z7hpB?ukRT|}?Fp5N;02R5SsXP8_3^*U%5O~mw=|bOF+J?RXgJs-%W>2f>M*<=nPYNXj3&FLK*(Xv)k4ueGF`A=$r_PdenP06_ zZg7xNK~;vrk%^js;YpZKfHii)9%YQ6O6g&w1CL>;$4A=pI|${QT<4aut59LcGrPd3 zhR*YFa7rWn+_lWFoaiYfCran`?kwvjeBMIOqD{Kp8?n~>RUr&<WQl~< zX$)c71=oT?f57{_xxR_pNcmfoL23V)^;~Y!EhN3wj5Q%&j@tee)l<1jGEk&)GF;+6 z$;W;ve{5qc;y&HE(5GEO|ck%vwa9@Jf zN4Ru1K_B;c@M5x|7^`7BYqoeI!{lJMy74eyjxvslW35CH^dd}_m+r~oYB!Q8S|oY` z2m#n&ra?=~gyY)~c9)t5WkyoN*(vUG& z6UUk93sDUQ;v`PrA%>B)%Q2qzDsh+4Il<->4vVO9_J&-V3X9hsT$AA+2-LWafh|l& zQjZ}9uoj_zwqdo{rHDMVJr@~2@)IIO^V*tGGa`>tTpvvbC}9;{Iz0l8v*@B{nt)!F z+x#_?%}@wuvikz2cQ(YJry_G^ajK)cL@w;Sq6E94LiOkaNoJ75isFB;S)5J+e@jz1 zF8D48K?1asn9E`nBQj;vv8ryP$Y6iTAUSFtor{( z?ag^%&d(d~&{eX2h#gD$vr`hPXPxc*)YR&y2aWC%mvMkBIIJtIB!@+tmrk>CE9P6T#dc77rd3k#ao!N`MrXG84_N^4gB#FE|HATJXENm@g;v zI^&!6UN;P-Pnc{L9{=P;HAFwE0{h#)+a~oEU?76NX@b24S~-9%@2H21LkRI)ecVPu zOj|{J%PgifURe$r$RwxA(EOSU4llYVnh^pBG1_ol(*pvakhB;&Xe~_1iNS~7|HJyO zyv^4Xjmb`flH)a7r`3n6cPU|}CFP5;a7n@nuH7jC(AE+*%6!xsvOQ|szmz$7h6UI; zF0W1s6hLASp5H$PIed|f4x%B}=s(7Tw<`OfDUaa_xE~`)aNUnE{r(8Qicf$CKE(Sh zK_o}H&9gG!xcn#6EVok5*HG8sd%Qabw{d>}l_*gHH$AMy2!UMlrVTrCbuKj2Wn2vr zGM(?-xs?-SNK>azqCNfaLIM>Hy2{t&g&X3W1~rT@C)X{?X+VR!M ztJBVU^V3c4p+oM|SFBp0Jy}@brhl|tIRXSDo(s_a4&_&je}uD2^7yVm?I*3!M3(-; zMx>W%bZS#BV?dPGgZ7 zC5Q0gtFLcqXx)3dPcwnard!}8k}g_|DE9qGA$E&%!S(_?vE0a`D(RXjOy$KuGbr}g ziiWm<*7c9mW0(Xg!vBD|oM?XO5gP))Yvdo}v+?w8pVF$(L)Z-I!$@;&xfMv9ct?)N zt!dsmT@HtITJ~e$YjVjrxWRy6fve8`)y72j@~l{Q`%>7ocK0;5d?{3HkL<9IDPP_9 zawQei#Bs+R3JSba_`fj!{7-sxlqwFMKrqBRym6)HG!gOOzHw|KzoK}-9auxO!g-{^ zZvv~p{?K^^B-?IEg@f1UrE{U7A07FglRcLcolX)yoRncA6El;>m1J9zO8lSLx=~4HjB*xW`V@AuVL#wXd#)mXg>RvU!8w!6#ELkJ&FP_vwB&=~qs3Zcu zVuUm8V5_re@S67HXae z^=<-Y#CL%1z&|3oKX3kFTpn?H?RPNEdl8mFIbm9+_?&82+Yg zMECXaRs6}6Uq@JG`cf_QV?}SF>4T*ogm|f671tfst#=)D=vJ103|toj1_Lh;JcJGu zIxFSL{Neudq%X7MzsH_Q{YbISckV^SHuo^cW}Y|LS>ic|oyeAdX{zJJ8Y{eQ-OC~? zZFX%Hd$V8I4plV|Hd&6$9k~T7k7xm2CKo)b6>h2w zyC(y(S<)pdR46$0l4@_5=Kt+zmtyeXe(>kv^qd>Ye*OJtx1EM8KMUt{Neteouz{sw8KD16}=3YZy5dE7b%qd2k+(J0exw zd0OKvs+0B!TmH_kKBT?=vihhCzUX`0?YRqCbVm+O#DLK-&4CT9)MW2ZM2Tlt;aoge z=FPg*o$T8&GJeNZWuXDG_Ds_m*UB6}S{swvBO~{tJRaL$(b}P}Vir!1&;$W}ycOWm z@U4L5n)|cvS(=(m21V<2`hLahzXgkX-YF_>4$SdU$A~8=3Q!Yt6!8p$jk{;8yXc7z zWZ=Ew^<6I3yp+)4ccppv8p14#RiDZ-zqT(5%#u!9??u~H9j{3#{B%fd+fPSk6xLtB z%or(uHGWe zHVK!TqCQZ3>r2?A!*+(?rkZNujxn5jOv!)iNsTTUQfY;`{rul(tP;qY5AGWjsA$Ec zGeHfv4!|gWAzWhRdzjOsq=$2gRL0HgUmL}>(Ril zmrN@3W6y=4m5e>iXaG603<$v(g8NgyhDznXsScab{?(jwSKpO7?4k6>0?39O^ zmC5f;T1($bRL#QXXO+P^P+gq;2Vw&=H>*C+x1Br3DZmuc^vU$U=rp&@^}Fy_@%Jtc z7BUoI97s)Y3t0krE}!fk_}uUi(Pv2@%gwPq5ji%T4AP{=8LtB#=G-CMlU1vWk>o~F zz(6h;dU{uS!pC(z_$9YHgd$X&eW67q>M5+M{R?|_qp{G2QN8Qs#9WCnTjU|E00pFz z;M#-_oUst84@0${nv@*q#7h6*h-XsLA>t0FpC4jXxo6l=ad#_hntG~8!yIbhzCOsr z0`ydF<%Bb~eGWVr;CUv>V;%B^VMxa!uE&$H_zP5)ZUND@>7UFalYZjFMUjuGvO~p8n_< z1Us$XN^do2e0@KeOgp!4+V&`4Lh8BarJc%P{#bCZa?g3Lw^Gn<-GOUye)fcVcZ@?? zDTC__oKXTU+>xNUjYfP=(0`W7L^ za@Im-xuFg&EBdjH)tZ~?em<@#+s{_Ecx#)^01XrV2(Z%j&o^Tjh!2W}^OZR8=n)TJ zzKpKcPezedUq9M3f7NEu7qsWy;!~|FR>p)4)zj(-Fe)%|F4@2wZ*xoeyR^Rc32isN z9n&%*Ug*4D6)IT~M5!|U;NUaMyBf1<&f7ssyLx9`@KeXrj+U9}5YCFF*Y)m*qrQsE z`*787ZCa!R|0rcfe@FI>ezX?V7m$z`xiXn_txfaR8RSe z-}ASEv)lTwy>kZ@f<#~3w*+kJp#f9^uyj&8Ew&zRy!Z%@Ni{}_)9TxPE1%g{Tf@@{ z^|y_Q_tpo@-@1$mr++xB>vh2_qBht)7e4!3T&MZhcmgFtNkT}awY^B-svTv% zVHd$w)W@>o6_IW^5!#dz;!(^NRjAY<#(R%*620?P0!dkw3TK6x z)jo}r)w^NM+>J67nG%ocB}(qTFRprjC;kO_*n%T9a0LToyP6_|wCdkXD+F(w!@7M1 zPq&r8a1mpgNrjf2@znIC4E@IwO7hkbjliuvqYIg)Aj7q~cg=3M!8jC2UnBN5;-(vd zxvu1C(MMD)*Gi&&@VnDrnMwt%k1{-mHK$CyR24&Og39+-taAJg%GZl*q^){^;A!?0 z0a(K2ok3_quEpDZ-S-~ie$++t0>n3u&XP;hLQ{EdFrEKxmfF!Ja}z^S#kaUY3w&jw zo#?M7IE+yb=G#-vTTO zMr*9stY8f#2bo7U^*{oaJut-N+=Uf6z!B$vwVgmYtwk#S0Xf{c;E*vWq}o0 zB-!>L?Vj1BrRitXZ!)odsV}p(plRU{7FVswR3|<0{Qhpf@TKG7l)P~pSaiZo>|$(U zUO3;X>(5;{Egou7gf&USP~!9Rwj!m1rY;QKXAj7~GuJv|sIC5K0PcHGA;C-dI(UGu9xCS95 zYHNdzur;iPNFBrc@_%nfe`nkdcDk;YYOg-N-Q>zmMot6b-CmGF4mhRoC}q{bXa}Q3 zXMG{!)nhRtGNSM5Yiy-1Avq6tYj35ItYXGlNHlick|*ZoeyiL@EBh(iK7^0iQai2| zRyDMTb-PvisQ(Lc(lT9V!Y!mD>7xaRx}`eZc@SC9PB7 zDN-8u5K8!l3ZJUIt_yU(khRV?8#H>knt6yTH0-I(+qX-9-jNIiVezls5>YbV6_Yrk z72#;Y8dq);N0o@&`s~TfJMkLh&8rp-()DS*aR6Y-choZY?X{pR>BH%1; z{2$3+*#H(r&?j?$mp{3&try4_aPh4e2A_4YIk*Kjaj`DMu3z)5=l8rzGP`&CWI399 zLe2q5vBNs=7!ZMfuOID*tXy>%3PKOJ)p$3xdXEbmYoFC9ZB2-U3&*2-(CoLIg#qkd z&{?=$#$vda=&VP`@9%jcKm3vkbn%QMNG4&NbOOex$cfPrRx~(`_$BuDef5o!i?7N0xtL@_z;wl@Rz^nn|YY$KsoU%H}KkSCudN&ar> zZ~jGyEkc~}oI??zZO#q$j?2IE+Y5U_4-4g;>{6D7Zcx+ZXoH?J+<)sXH40&jM(`xf z?OJ}|stG-_OG7HR8ESg)SxM)2&s;eEd zDr_YlSAH;}%B|>5h{1ygZ4Z%QxJBC;DTO1JwPGDCz1fV-c1uq-yGTAosyQ96pt^m) z>fg;jRzuEiDYZN%g_dUmLO zyZqYM3S^8h>1DY}dH|~9VIZ8lwHXK8@8x|$*l+|R+brv@oL#BmQ-|F1`c_wop4szw zRZ@YB=bEfI_Om#mbHj$`;`c0ipE?XKXe$XIC99gGSwA9JS%Fy0QJjI1TB-b!hwCVZV`^_SIV2Ov7H%(0j z({~F09PgUneu}L$lcpD2F|PN8?QtA-H|E~)?d(<5?81fQy=%AX=op_S&$pYy(At@Mmu@1{jkkw;oVL`t$W>Tusj9 zh#XXmi1uhYYNywHJ-+L9lrMPN$amEmqRxD&;#26J$Cix>p%=5^cPC#<*cW6_0a^Vm zrPj?A8+@RSmau5TVzttQaoSeFiuB3|2-!ov&K+xan!=uufl?c%!9w_gVtL!pI_+DV&5N(48M`XpfA`( zc4eS5lWjAgOk6--_U8-8FcSK=*9y~~aLGrYwIZZos^JbTLlJ*%Lto33nzVDJ2Ac6jI@npST0kWnJoWok&o?-kqG06qmU?O}-clk@)0!Mj!U0HP`_#MyQg?ATM=|qu>U)1JDK^;S&+tALN(GX? zjj6;yoFC(|df&z5(I9K!2Vf7{9qbFfX0iKqJrT$j#ND8|)bzIEkIv_%anPFM?ad>4 zBIvu8M|Cu?@!ub2JM|%a%cz$VIxD>3=PQMn`gZ=C9W|CO+t2c4z3Hv!lMkKZyc>hl z8NkG~4H_RBL#e6wOKolPQ(B#a50CFzQp3T)4r2sWzN+Pq?*`yEH_Eq}`viBEAOiJp zf!P?BlcbR@&H8GX<0aODs8sr-JCWXYgaazcTB~~OKx~yYC{MV#6#t3@go{B#`;fHH z>uG_6-VkF#dzh_B%GTPQ(@ifcR>iUA-p|=W`HF9snv7=x7)kxP$Wl>Pd4`*%Z z4eq}ZNBQBY7oDFPxOy%Xt8nskto&_N`j1_<%D{kHQx_uO;uJ!`%1AA7CLWcFUO zpEWc4sh>~KnIJiU4c8WLitWQtZn22y);OhRVPjy9Y;QKr>PypjXG34Rcz%4+Mv|3a zO^&~conFKoc4X1v*~dKG3g)={4Csw}M$jxj^0<{-%)K9FQXE*RxeODf;P z&o%CX&&*$3|t>SR^(!)#qVfT zp_1n~R5BhW-XwQ;feb`aeNR58l-{@$F|-Cg@IB2^6QvB72=A3Ce2*Z;sO2fgJ?N|gO z4hXiz64)L&odSmpf%i6wP+==M+)OKm|1vMEin7_JpPz+A{gaiQFax`=MK< zjS@J%of*BlP}MrEr%kdOpA*V^+_;*}n%gzTLd!$$`+gHqBI$q)3<8AO+0rJNqH!{@IcljAikk3-MnOyh-br+FSHJ=aXsfnB}o7mSD zc=tKRuR2B98|kT)(D$S5WNFtMDtGNPEDAS1wmXEAQ4h1yT7Nnu{?t48>g zoOyFgXW5Rej5cKtx$Srfjb*OSRAu(ud7lkI!JjEfPHwiBt%KR_huGq+OW(SJG{^%^ z-cV1dp9rHu769g)xkC(N#z5XXQx$YfQ4EVrT;&9mW@|*{>?<$k9$vj4DB*jHZ|);# z3C5?di0pV>v#L?=ZRWvZSX&ztJNralP3?$cZ}uLY!uN4g!x1vX_Luv?W7__ES&WL8 zVCF55%LK{=DmK_UQL1K$a|CRd`qlL9bDd1h5}G!Z8|Q(_#Mz@qgNJ2G?C7UhF|=-H zDGflin$Q+UYfV}cO|XT8Nw_HpJs#yyJ|o}n;l3NBeDThc^FgM~cG5k=UkRiqq6BkX zevBdoOs+K`BHYJKbm9TCP}ICp=FZcG3=ZP%mTxj*vo|G2j?p9|tt++NwvE7Za(4>G zj}{7%7kg)BL3aVK-sJ@=8hG6&>7|5iM5yv6_eigf3PcA4w0UH4=>|3Oi_Qd9Qv68^%)t0I5VM0;iM=x zf?yrQnOmX8N(FuTW#=s=nPj=MrG8lPUQFx}NFq-%ZHB&j_^eYJ6(R*WPq=wvH0_w0 zd2ZZ3e7C*+u^HvT>C&`){yQy{S5-%&@;G`di-en#FItm(asrG+VIsaC*`Y1zCpt4( zaqJNoDBa+Ve!rIVXP24G;woy9eAqrN?OMG#LVxmMz z@uLFs^=%IB#gS)@Q3Abb4oMfb;gVD!(GQ{|r6>BZQgnRbV(F!|IX0}w(0+q1;|5TS zZcLo6Z<5NEd;RS7Dg6VJhr4;FtKD7DSypCfqy%cJdGP=`c&>0%D7rRY zkuj*`f*(N+gY%^Ry~M_Mh8 zk_SGW&B!xyniT#90wr~w$s2DLgtIlAW)Kvxhgw+b%gs_F(2kCYNR%g6n&H%JY&2qM z#f~qIB|#9>`@9OEQZ`)JVw6`u;ek0O{alL@4H4dC zOBCdq{FaX))y5I7h#TvR_pr;$rEPAI)`SJ`VFP^e(brs#G~(A1P`$z1!uhbP?LlRL z>R^IJhLs}7ED3@W1XG^)eIzYx6>xRWFvlkMc)g#TcVQYfvox9fcDG-kh?QPCBZ}|K zR$OkmP?>VROD6dA151ZBJ;B%~-xL5z{Pa?hr288Kx2$Uh`z(!@G4?m z(JbVwgYD)nVjMzdhwDClJKs9T@f;K4RK#kuWBqxKJx1TeY|`?>_KEJr1{;Of%G@Co z+>w-JZCI4a^9B1T^gQL}FrKAl2;b0=o)rVvVjGz*ZmLcR6byTFr|Y_w_? z2#EK9Bht59dzvr7VPzBhEL7S)1m*V|%wz{cR_b1!9VG@PtB<3S)%~8dd0q3WaWZt? z$(rU|`S5c2R<%CvAM^!?}-O-jHY>y2j2p&?t*5ipP-=$ zh7*CDtM$F~!imlx^El`va<|Fc<9tMO|w}T5L z_mFLR1n3r~0f+zfjH82S$k?|cV(>elEUAkSIx|YN4+In-8dY2yF&vO`FTkA{3%E^z z4iquG?~e}S!58|(5(2NJ~Njig5YJP&QlxFef{Ozq2nsiqjhLG4%YnGp&HCNPcA_D_WR>+#`D1;wM z6tPy+S3j;xK@N#SuvdP95}yWSOznXQ5=@;xLC4J7KS93+sRQjUx?>ih-<$t>Pu7<| z;T{WMaJD_24qp1@hPdwPY_AM5oJvw;ma`{kvV2D z;*{p)Ptb3&%K4+69c3kL^UDCFr-V-UO@jVYJ}GibK~tT; zxH^V1;>bKRMwwOdW>Xx)Lq6{Ef@2bQP-)g$&Z%YZ7PROuxy)uM{{;Q9rGUh&-^9o8 z=N>EhqvQW;dCvc*^2~X3TGT8z^S-;$x}ad-2|2LTIRV-l%M%rX1#Tb|65gnb(VA7! zsdLOUxpBeOKCC@br(3_-SWmrw)GHmw$3K>%mch&SAp3<;k7Lqnw}wyI(frE)boQB^ zSoTz2R&+T!qr#iuqbF?LaU+pqv&Mdy7>x~b;)pF!T9=l#d{{|ds<;qen> zB?@fH$-h82@^=~cN?W&&uKXQ@W0Y{N&gg03?GT;A1+Q;oW+x|VSX7H{2%t6+uHiTV zh(+CafRE$|D&&1a_4??efPi?P6PcCmE5pOSYd+m}u9p`{JpEB@a5}6|hcz4CX#T(g zTE!E+huo6eqHtMCAxIxA(|gy~`r5K82|sFVICIt_+)$4$%CR(0@fxBJb)k_o+i8x+ zJPzD0%l@u_hIb<65h4z{9I*t-_Y-mv6b>yVjqC(TwN)#87jd@8# z*TW@;%~_;i}vP)5e zT+Ei2zNIX`jO&zs*kIb#oj#fAoK!A$3Vw*iX)5BDBa*Qaur~$sy8Mfsht<6vj{BXH zDDJO}*3Ep5R*Je^ePCxQpajP)YQabI&C3) z4qMpNwL47a24a_f9C>xq1bL)y!WB*!;1&~mZhU(^@7AYF8XixFzkKU#R_R;czg2sc zjxmRmU73=)*Po^OO%Mrgi}5hwJL*Jmeg2}4rD5aKr}^d`PLBWpjjS!7it%fxPtzfq z#Y&>wjRueJwx=vP%y$6CsYAb(HZDE_4dDKVazD4IPRGct$t#nk!*4V8?3UbiivlRz zQtzs`e|IEZ&5ujumlST}{2j`uGpDo);#>^DNTfz!N3?K(`OhYFE3i|cYK_>+Rv6Un zdNP;O(hG8xov z%CS*q4f>K#_E<=XWQUw_Z$21l2adLq9jPid_{vWsIn$P2vCiC{UbQhvqiB*X+P(Wy z%`i&Z=!xzZB|YU?Q|k*5duUW92~Is6&d=SHSp|tTWKqsiYtZVmywmUjv0|YneJig9 z#AqVvyA(v1=~!Bb;2`#7U6dzB2U>SnyAAoQ$;*j9*-Uga`xp>6p8Qx&eHv{toJjH6 z2H1fbpSj@Gy$@0zh0vaTOZHzhqW_)3u>lH#-9oa%!Xb1s8v#1WJF4<1=W*zB-3sON zm*rLx8QDL_KT%T+Ogp)Y=$RG@at9k?!yDdCuOB1Bze`ZPX4yhWjjq%>e)}?h@S|Zl z-T+k#3YyWGe@HhtozCwPwYzj@$8EDr%NC;KvM1JtDyK*&gp-cRYkOdHsgbQ}5>2xF z=EE3`ms&Mdwc(O3PhZX~=gm|sUkru|cRoGhX?59xp!3@&@U|E_Dm;JJxdOmNoF%cp zgq$v<_S9t%WszBg4TYOlB-hS0(Vpc1bIZ!R8mRL1wU9kbXnk$1ju=;D9fI@V4m+E{ z0G4NS+WSct`W81A=Md>fQIEnxvg1L0mx8~gA9el>7O2!1$QO0#oM)E5LuAL=ee`T< zYM7n1u(($}UR{k_5U=>M@a*0j+H*W_rET7_>#GKeEJCInFifE+G;;%!tYTFzzEnTr z?nqS}lfL<>%=V2$wKDncXj|7eJGl>8S!2P zat|iJ_7{4ZMO!tq{9b%ud19b5N3xR@13oWrjfHkHDN^C`%4gc*;lM7UWbuk-?$ezfr{B4`8IjOWi3O^*$ zTcyRn66St~x!qn{Zs1uz@lCd;()aQwpSHM=%F&*z#aGEyt9L#qU}-UF3}ye?nwDUR?F{oP0uW|~8JO+yqtS?;>9*^5WbJ{Ycfh5Aq?X|ABMOR4939~lBEtg zCbJu|?pc^LxN^~J=r>IP;kj3tlFBR$^t`@114?tsWJFKlYmuB}Pn7o=K+}JHS&IcZ zwd%&J<7dg`@XmbyaIF6#Lr0-nb_Ax zs3(|4Zb&8GfsC7f9xi;$6L#yq$KIw@Ft%tRDQ?oUZZh-bho+$#$xoPc-zl27%L8BmSRs1wwEygGs zd69);+C?)Q`?HBdKR;FPW!i3c_Z05PZ)vuyB#}ce9yJQD6QJ0f&tQ6peZRwEeh7kX z7OnuLvz`H1g})#Argy&N=YsOZWPH3)BeYvjQ}O^kFAV}`JTNFv;nvlA;>7!pQ?Q8= z?bimq0JyC>(-!Ec&eG-=iTAkQ;@+_lq!!g_$#Pj-iYwcB^M>}Q)C1@6-4AEnsz@~^ z@8azprzS*~-BUd2l%8w+^4KQj+q_fQ1+tl}EZPn=owE!iJ1`@T#B-#DU3ZnvNwaAq z(p-qN00G$<7exlV?jj^&LJ>fT(3aDxpV(g=b$81Pt1`Yukwp!9f1PV#nd;$9dshs9 z*3>3iswGetGapOjm>k6PQ+}Q<$;w#^cwD1vcQDhWBkgW0<=GKF1!d?4L+9EmI9Yi? zgs&W-p)Cw4ht^w~SUF`ZDoCCRaOx;B)?>vH{P7qzmA0B1dYy4Uk5F+>m6cGAXjo`< z&-rqAs0~|dGsAC++b`wq|8h}DTH}r=PrY?l_}8t&=66IakQ1?}V@c+t4}C-kP^eo{ zNazUU$2JhvW~~b=TJ8LZ?PIR8Q4so|eb}Ge;Xo0r1Vi)rx%OFELDU2<8oDpVikM%x3H9 z-@Yf%X0Wvi-GKE~xXXQ3dZHqTuwXgqMDtVq= zdKgQ6@rT@Lz-neC$+7LD1tA7FCE(K1N28)w1gT7LK%7WY-11_{!%SahpDzX$y4ABw zhDy;7L^#-T-to~v3oI(Lu=mX!{H0uRY_ZPm2`LoOC|=0y5^jX+IGvD|y5dxB=h?n5 z;Mv6%B_qA~-b4Q=0rlmZpMy-#0HVo}bgyC2T%G6pNbZbcR~%6gmY2ptolmh%7Mhuc zX*&F@$dBEQkheWiY{Rh3m@5~baU$SG1|U(Z%IAm0@RZ>(ENi;JdKK7`m>km}VAyAGXw_IK40P7vC>M*J6|pn_@SU79>W;G%fm&I85#|1sx$eb zJkZGj*h^FwhsyVCe<+KS9Ik#x`sGa{h7s3CZV^5k3&thpy_+_ytJa)>htJbkGM|91c(1I25^8 zF5Ab_Y53{gxj7BD#)%~{Ibo9c+p*NiPZU0=)}=kju4XK&dn!4SRO{^uwiu$^0JPc5 zYY0(14{oB}in(5^Sm*&hFYk(-?!KQ0m*i%X*J09>6lwRP5K&>5XJuK2;Ilx<+?2O= zKv!G+8^!B5naa^Bf!A72_w`SQUV${CA}=O=CTXBmUm5n}2+<^4+MRpD;97wm4~P3YN&feG!0yLU}GU6XHfn@&>n z6(Z*@?R=6rx+JWcHZE4Dav^`zA=E%&w(V`)n-sm4+=HDM4^Vkllgdw&;?0XRx03Jou$Y+)TP*T~ z=!gdBQO-h03EV{l-P0HHe%QXxIP(nzuQlV^@!PM6VKOFqGgWF$u1Fr(aM0r?2=}{5 z6QwWUmrgSj#Vp|F@pCh6_qBvV;mUb8sxM=PsIJ$DSg^GZMzm{~ADW-aPISj`e%N9Y z%X$)+ppW-?AI`DlvjyxjFT^aEN2o<5 zN4_F-=a3e|g>>w1X-NSIu`)Ma|HG*m*nh&AtH_6q=ty`LV3h~8!z5hAJF^7R%SGKe z^TS+bIn~853EPmT4!$WL`{qJEn0o9~w)aH8KE6*kY&G5fVy?%#q^Z|Ij0|Fz_s*Z& zdrLPuPlJ~;!-KJ*Z9ts9naf|+FG}7Nr`~q_J}diZsNajRIJbIO%ZqQOF*0~cX#hjJ z-1E)Ds@MZ-4XDVcl>kj1saa<0;OBasJY>XWJ@dxEw_=VFnqKqS$Oi>8`)C@b)Qh-M(e=XiKNk8uBUrMsj76bJ>>0_TXn4${9 z(()*K%EH>>6PKzR_4Dq}wp?6yzbke3kdksLs2TyKDJrVXFSW-6m#gZZ1#^k14Qo7$ zMJKhEzwrto=~Cb&Rs2H*q3n#~|L7<>aJyiiC)m0We6INd+@bz7PF_D7W~);76m@ko zK;bl2WY9e>FgG%L*TOwbDK7d^Qg13H`4eq~neqJ`7@(4#=1$1odigXEN-3sLRe5;! zjl(S)bwhy4hLv>>2&VM<>nprbq#p*|Thb8vQIWU3 zfJ)GZ6Zx?Gg~N7e7_yS$`6BAdH=*E4H}g&@>#1g5XqmI*aOK3ML7J}A3K@~_c3iz5 zKGX@uRbfp8FD$`N`AXRX40(UCH&nu-w2Pf6(u+hM>oRqwcIKk3c2pD)=hr zA6KU@_8ARO9r2zhw{&{E(W8`8Rn(Z14>-_!EmbVPN2iC3~3MR|El4Qj~zQ3INdLadq_}JZuZ&5*QLFM7$)eaD1))c?pdhFK) zrG`u3GYZ$u2BRbr!co|0Sc&F)6^EzA4IjtH{iMzdQ-vj6S$xh{BHEkZrzqfpx(qOT z+F}rOxY?~rZSzi-_b}VmX6A6mdzaG#b33&P1>XfPoja4W_!R!bmU@yp7|Fc_Pz~3{ zQ#}^dSk~7!mgxb3-m)eKP}6Jv(Dqj386sF_H-fP#X4Yn!;ty30@D5>f;+>L58y~wx z6@NVN7>Ncg=XnVvT-*3=LgW$e9jO@JSGfK4$8qnt(?Xfy(C#Xd+~AQm0;jXJV8%_E)#OaTW_Ql4U6Fh(&r7M+T4;-b3$ ztl*EU$x>o7eeQmuXWGsfs8Q-$_~uj8dAP9GdANxiN$m_gOzh$a_3->Epws3+c`bxp zWY_O49e_(WHGw&d%)|xlEpGNmp zgq|jFJV7e*I|cnPKmju!mzn)@jCJG)K17Jwk=g#kaB<~Jer9v`8g)DRo`*?=QLOKg zzFLKH5i56)z%Em0v=i4h#PHY4n^=|y;bkmT;se#qmbYE^t?8VF9G)_a8>fDcHFyBy zjtjr4GjV<+;KCC+0JJxhIA#U_G)rLbw`9>O@@@eBs@tPg8O9v}I|^U??wbjIZMK1We^YOXdW&R_AUXnN4$$%iXl9+z72?#ffwiyj_GuLOy%Wk-W}{|{FM z5T*eqA}8(;ZJJZ?0Bav7Th}QJh^XW|Doy|R8~5nOzi^L=4~s&6j{k>2(tipb{OwEp zzxA`f#v;2C31axL9Q=kG^MtjmK)IE=ZGdkJSK+0|sYqi;gAJD+<*lMY#$%rkTDZ)U z12=pTCMzy|Hb238%l2O7Yt50$G|U+IZgbk&@;!zsBE{BghV%2c>k*n-#h^TCmwUuM0*y$UH!z^j1Sr-uX zzwFX1JPy~)v2?u5?DivZIxwTr?;%)rf0olcJd%gRUq;&cRU*mJyhlQ%R@GgatuRh9 z>b*7v4s_zcWbYbGF^ zFBB=r+0^)qt9-r8<%-b=cl~+twzqak2Vv7Ku!T!U*R0(LCII1IQ7e-CA)XWa+;~)8 zXS%w)`5KO*slZe*>mUk~&==18?uGvwMq^)@Z^}n8BAl4J|FRrU4e&H*aCCsw_lbN> zEH`<63_K9iP^7J8VUU<1r~1{#=Z02ttRR}cPg%!jSdYVhT2?KZNqQMa;nvO5T zi&)yoY3;DtJw@&1<@PUJnJae|ANpxv^B!Q^V;SGlrCw9C2%gnFZwlKEtt7%q=NQZJ z5esxt0hgn4U7Qw>p;n-gJ-6#CECq&JRa>`rxSh7pk#CcCTtda2AJg{6(#-`fAgqbQ z0jTebNC4_BHVd>@v?X4WyjdL6@ro&fPzF9;eYnfJdoTIgAX8iRSqk}w2Hhkx4l>(YG56xK+lAu^ulS)o*={! z?}c6LLd_f?1SV{lBf|GfFPPoFrmeH6(*^~?;HFFUJy#MROX|puLqbqar2v(aI=*5- zH!6J~e_;j^8PMi3eq5bE{ZiW%08W+2Yu8KS`lLy%pY#2*t1#D@I-Ksb5XQJ|OSg?k zgNI;W%zc9ye;%)~^I=&d_DkjzI2)WR;n_J$!%UhO?R$zjvvppBvS;s)f@`g_*20%9 zd+ThPL>U~w@%#tRRYnwV!Xenz)>G2Y(_evK;Ba~VN0>ooSiD|%=gx_N7gu7Losb_t zpKPRlI9asj6;()#NNv2TCn-poFW}-DqUsp(o?wV)!)2k>+fe5S4mcwedJ%g{lQNKE zYp1ZETIF`(%uSM*C*iAo)&h-Lq9My7iF+iA*42m4Dv?x(p@1XocMrXP{vy?fTu<0F_fRRw2Gj#YsV>Zr+Ik;Yh%-_EU$*`X#_m(QSn8{z4Va3^$mo` zgjvx=&MD#|V#TfF>%T~{)8Uq6$K%itGHv>!-RUX+a29;d13Ej#Mv>TiU5D`t1XTUt zOPH22z8H;shCB~os>*(0KQm-MG#J~XTQu8 z4H6(YYcx~GU~n^#HHL$BngQWVrk4Afq;2m_6i(llK3qMN8@{Z}HhNZ)vvxW+^*oG^ zqy;g@Oc`ET8u!)3iYe@RB@W0AbomKti0L*?J>oLu+KHqPyA~;PTl7k@KM#aqVhB|^ z*s)0$JI?@Z)Xg@l%1ofXT<`vpI_R81XD8&AkQiCqcdfE6C8Z5oM8NO5RRc1d2oCK) z$PLL$_z?3AN52a^UIlZ{e$kUsXf~x&sGqoKuE;*_PEaT|b@3ITU+KiKyfO_pvt(HF)mh?Ql%WHQ0&xs%@Id(53Z&jQv>n4>`eG++qG~hzC~{1|^Pd3yDKn6~ro> znC@wQRl+4$>S4RAPG-3i@qBuFQ{MY*4j0cds}$k9LVMA~EA)g^>GO&Tcp6MrNP1RB zlU6&p((T!Fd|ZLqyw2q@9v|kE_H4^71~QGF@E1Hhwu}O_q9D11Nu>G%94cBqkUizJ zB5)z=Ja87LJ&v?bb<dpL1W&6NBj#ITLgf2&nZN7Q6{CRs@_3Ns%Kp(HZEB_|q%u+J^WFn@3S@ae?;<-_;rJoGe7ED%>tm$G0+hxJ6P--CfO_$!Mi>pc4 zvID%o#2NlOpPUXnt_pnQy2((SQCRoV{c2K0(9*;TYk_{VJ+%o%x6DZ!+^L zK%pk;Uf$81d^0O7meZ=zYMgR$@YjHVnW7ZW!g_^RU`8xgea-@;&Wlpx^G$&N7P5EC!Ph z+DLOE3TfLW9~95z$BpN$;IokxJ@hl{zGSDVoiaG^D{fc$20x*GUI@&gTan6&AXSOa zdOHWVs;Wg{KQ#{IGq6mn$K@p6y5m~Xdqbq+!<%vnQkfRe5`l41m!2SpQ%#7K=MI!i zD_Z{uK$%j^i{40Lmh9Z~S!N6F&7?uR!3zO-@DuM4gI0q0E*yVHefaz7Il#@0*V1XY zaAaWBO*g%5qIyP5@B@V&U0)qorgw1x9JK=%7;P4I?#K4Kiz6xe3$iDxzIbYKHi%789-P6u+J0^Ey5Cv)$=jQ)hOtN!4NMAZ}yA*w`Y=p@LsXHGl)|BMRu^#IaP-IVh}fj!2vKb_0KlL3)HEz zoF0h6>1J!9-Wh$>o14EzHWmDO#vg5RZXjpUEPfP3l79C|E(7R={@s8fV5pEY=q_*G zA8is%t)HOroGK8*i=5*>r|`#=^zZ&LC9>=n!_z_M@9LjA{+q{~(ZB1sr9{rnORPNq z>*)%Pz(ihF{hD|5pY1$xU*P3lAkD~sb!S!r6VjRvqL03*`e)l9T~3cg^Dd*e)87=CkllYz ge`^rJp8^SezeQJXVrz(M{0YZ9zeiW;2Y*ieKXT6Tg#Z8m literal 0 HcmV?d00001 diff --git a/static/img/210105-django-assemblyai/twilio-console.png b/static/img/210105-django-assemblyai/twilio-console.png new file mode 100644 index 0000000000000000000000000000000000000000..7f0a3a66a96e1c1337297eb9e4b93a4fb4d47c2c GIT binary patch literal 248523 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%0DFLtp%2i~deCUYB>c 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 literal 0 HcmV?d00001 From 3155ee360e4ae22f741f2acf4731a36b9a58f883 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 19 Jan 2021 07:10:19 -0500 Subject: [PATCH 248/302] add new env vars resource --- .../14-environment-configuration.markdown | 7 +++++++ ...9-transcribe-recordings-speech-text-assemblyai.markdown | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/content/pages/02-development-environments/14-environment-configuration.markdown b/content/pages/02-development-environments/14-environment-configuration.markdown index 2c87e88fb..d65114eb7 100644 --- a/content/pages/02-development-environments/14-environment-configuration.markdown +++ b/content/pages/02-development-environments/14-environment-configuration.markdown @@ -34,6 +34,13 @@ Either one can be used in your applications but there are slight differences that can make one better than the other in various situations. Other useful environment variables resources: +* [How to Set Environment Variables in Linux and Mac: The Missing Manual](https://doppler.com/blog/how-to-set-environment-variables-in-linux-and-mac) + is a wonderfully detailed guide with many tips and tricks throughout + the walkthrough such as quickly setting environment variables for a + single command, passing environment variables through when using sudo + and executing a command in a "clean" environment without everything + you have already set interfering or being accessible to that script. + * [The Twelve-Factor App](https://12factor.net/) describes a method for securing environment data for your applications. The twelve factors are commonly referenced across many programming ecosystems, not just Python, diff --git a/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown b/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown index 61e5084b9..96926ddc2 100644 --- a/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown +++ b/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown @@ -3,7 +3,7 @@ slug: transcribe-recordings-speech-text-assemblyai meta: Learn to transcribe speech in recordings like MP3s into text with Python and AssemblyAI's API. category: post date: 2020-08-09 -modified: 2020-08-30 +modified: 2021-01-18 newsletter: False headerimage: /img/headers/python-assemblyai.jpg headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. @@ -137,7 +137,7 @@ Create a new directory named `pytranscribe` to store these files as we write them. Then change into the new project directory. ``` -mkdir pytranscibe +mkdir pytranscribe cd pytranscribe ``` From 2d8f665896330c5271245c4c2294cd0dfd293603 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 27 Jan 2021 05:59:36 -0500 Subject: [PATCH 249/302] cleaning up old links that are no longer relevant --- .../02-python-programming-language.markdown | 3 --- .../pages/03-data/10-no-sql-datastore.markdown | 4 ---- .../01-web-frameworks.markdown | 4 ---- .../pages/04-web-development/02-django.markdown | 5 ----- .../pages/04-web-development/03-flask.markdown | 3 --- .../04-web-development/36-unit-testing.markdown | 4 ---- .../django/django-extensions-plug-ins.markdown | 16 ++++++++++++++++ 7 files changed, 16 insertions(+), 23 deletions(-) diff --git a/content/pages/01-introduction/02-python-programming-language.markdown b/content/pages/01-introduction/02-python-programming-language.markdown index 87a44028b..6cc9be260 100644 --- a/content/pages/01-introduction/02-python-programming-language.markdown +++ b/content/pages/01-introduction/02-python-programming-language.markdown @@ -108,9 +108,6 @@ Dictionary comprehension: * Armin Roacher presented [things you didn't know about Python](https://speakerdeck.com/mitsuhiko/didntknow) at PyCon South Africa in 2012. -* [Writing idiomatic Python](http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/) - is a guide for writing Pythonic code. - ### Python ecosystem resources There's an entire page on [best Python resources](/best-python-resources.html) diff --git a/content/pages/03-data/10-no-sql-datastore.markdown b/content/pages/03-data/10-no-sql-datastore.markdown index 05e47b705..c6c9b4683 100644 --- a/content/pages/03-data/10-no-sql-datastore.markdown +++ b/content/pages/03-data/10-no-sql-datastore.markdown @@ -189,10 +189,6 @@ representing a person could have a property of "female" or "male". * [CAP Theorem overview](http://natishalom.typepad.com/nati_shaloms_blog/2010/10/nocap.html) presents the basic constraints all databases must trade off in operation. -* This post on [What is a NoSQL database? Learn By Writing One in Python](http://jeffknupp.com/blog/2014/09/01/what-is-a-nosql-database-learn-by-writing-one-in-python/) - is a detailed article that breaks the mystique behind what some forms - of NoSQL databases are doing under the covers. - * The [CAP Theorem series](http://blog.thislongrun.com/2015/03/the-cap-theorem-series.html) explains concepts related to NoSQL such as what is ACID compared to CAP, CP versus CA and high availability in large scale deployments. diff --git a/content/pages/04-web-development/01-web-frameworks.markdown b/content/pages/04-web-development/01-web-frameworks.markdown index 6b52e3680..ef862c747 100644 --- a/content/pages/04-web-development/01-web-frameworks.markdown +++ b/content/pages/04-web-development/01-web-frameworks.markdown @@ -150,10 +150,6 @@ frameworks, templating engines and I agree although I've found sessions and database ORMs to be a helpful part of a framework when done well. -* "[What is a web framework?](http://www.jeffknupp.com/blog/2014/03/03/what-is-a-web-framework/)" - is an in-depth explanation of what web frameworks are and their relation - to web servers. - * [Django vs Flask vs Pyramid: Choosing a Python Web Framework](https://www.airpair.com/python/posts/django-flask-pyramid) contains background information and code comparisons for similar web applications built in these three big Python frameworks. diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index 79add9f0e..b5a5cea0c 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -50,11 +50,6 @@ groups such as [Django District](http://www.meetup.com/django-district/), [San Francisco Django](http://www.meetup.com/The-San-Francisco-Django-Meetup-Group/) so new developers can get help when they are stuck. -There's some debate on whether -[learning Python by using Django is a bad idea](http://www.jeffknupp.com/blog/2012/12/11/learning-python-via-django-considered-harmful/). -However, that criticism is invalid if you take the time to learn the Python -syntax and language semantics first before diving into web development. - ## Django books and tutorials There are a slew of free or low cost resources out there for Django. Make diff --git a/content/pages/04-web-development/03-flask.markdown b/content/pages/04-web-development/03-flask.markdown index 18c708e54..2de57acbb 100644 --- a/content/pages/04-web-development/03-flask.markdown +++ b/content/pages/04-web-development/03-flask.markdown @@ -205,9 +205,6 @@ combined with the example real-world projects listed in the next section. is a killer Flask tutorial with all the code needed to create a web app that can dial phones and receive inbound calls. -* Jeff Knupp provides some solid advice on how to - [productionize a Flask app](http://www.jeffknupp.com/blog/2014/01/29/productionizing-a-flask-application/). - * If you're looking for a fun tutorial with Flask and WebSockets, check out my blog post on creating [Choose Your Own Adventure Presentations with Reveal.js, Python and WebSockets](https://www.twilio.com/blog/2014/11/choose-your-own-adventure-presentations-with-reveal-js-python-and-websockets.html). diff --git a/content/pages/04-web-development/36-unit-testing.markdown b/content/pages/04-web-development/36-unit-testing.markdown index 86bebc128..9002c90d6 100644 --- a/content/pages/04-web-development/36-unit-testing.markdown +++ b/content/pages/04-web-development/36-unit-testing.markdown @@ -70,10 +70,6 @@ Python-specific applications. is a detailed tutorial for using the nose test runner for ensuring a Flask application is working properly. -* [Understanding unit testing](https://jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/) - explains why testing is important and shows how to do it effectively in - your applications. - * [Unit testing with Python](http://www.drdobbs.com/testing/unit-testing-with-python/240165163) provides a high-level overview of testing and has diagrams to demonstrate what's going on in the testing cycle. diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 39f74cc70..743e55411 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -592,6 +592,22 @@ under the [MIT license](https://github.com/yunojuno/django-user-visit/blob/master/LICENSE). +### django-version-checks +[django-version-checks](https://github.com/adamchainz/django-version-checks) +([PyPI package](https://pypi.org/project/django-version-checks/)) +is a code library to ensure external system dependencies match +desired versions. For example, a specific version of +[PostgreSQL](/postgresql.html) or [MySQL](/mysql.html) as your database +backend. This is different from using `pip` and a `requirements.txt` file, +because those are Python dependencies, rather than system-wide software. +The +[introductory blog post](https://adamj.eu/tech/2020/12/14/introducing-django-version-checks/) +for the project has some good reasons why these external dependencies +can cause problems if they vary from the expected versions. + +django-version-checks is provided as open source under the +[MIT license](https://github.com/adamchainz/django-version-checks/blob/master/LICENSE). + ### django-webshell [django-webshell](https://github.com/onrik/django-webshell) is an extension for executing arbitrary code in the From 2157ddea53efb23e82051a9df910f049cdb56009 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 27 Jan 2021 06:42:22 -0500 Subject: [PATCH 250/302] new code examples for django --- ...go-template-base-filterexpression.markdown | 25 +- .../django/django-template-base-node.markdown | 25 +- .../django-template-base-nodelist.markdown | 25 +- .../django-template-base-parser.markdown | 21 +- .../django-template-base-template.markdown | 21 +- ...template-base-templatesyntaxerror.markdown | 25 +- .../django-template-base-textnode.markdown | 25 +- ...django-template-base-token-kwargs.markdown | 25 +- .../django-template-base-token.markdown | 21 +- .../django-template-base-tokentype.markdown | 25 +- ...emplate-base-variabledoesnotexist.markdown | 21 +- ...django-template-base-variablenode.markdown | 23 +- .../django-template-context-context.markdown | 186 +++ .../django/django-template-context.markdown | 1070 +++++++++++++++++ ...go-template-defaultfilters-escape.markdown | 142 +++ ...ate-defaultfilters-filesizeformat.markdown | 137 +++ ...ango-template-defaultfilters-safe.markdown | 102 ++ ...o-template-defaultfilters-slugify.markdown | 276 +++++ ...template-defaultfilters-striptags.markdown | 159 +++ ...ngo-template-defaultfilters-title.markdown | 124 ++ ...late-defaultfilters-truncatechars.markdown | 223 ++++ 21 files changed, 2637 insertions(+), 64 deletions(-) create mode 100644 content/pages/examples/django/django-template-context-context.markdown create mode 100644 content/pages/examples/django/django-template-context.markdown create mode 100644 content/pages/examples/django/django-template-defaultfilters-escape.markdown create mode 100644 content/pages/examples/django/django-template-defaultfilters-filesizeformat.markdown create mode 100644 content/pages/examples/django/django-template-defaultfilters-safe.markdown create mode 100644 content/pages/examples/django/django-template-defaultfilters-slugify.markdown create mode 100644 content/pages/examples/django/django-template-defaultfilters-striptags.markdown create mode 100644 content/pages/examples/django/django-template-defaultfilters-title.markdown create mode 100644 content/pages/examples/django/django-template-defaultfilters-truncatechars.markdown diff --git a/content/pages/examples/django/django-template-base-filterexpression.markdown b/content/pages/examples/django/django-template-base-filterexpression.markdown index aa466b309..6a5d325a2 100644 --- a/content/pages/examples/django/django-template-base-filterexpression.markdown +++ b/content/pages/examples/django/django-template-base-filterexpression.markdown @@ -1,14 +1,27 @@ title: django.template.base FilterExpression Example Code category: page slug: django-template-base-filterexpression-examples -sortorder: 500011364 +sortorder: 500011370 toc: False sidebartitle: django.template.base FilterExpression -meta: Python example code for the FilterExpression class from the django.template.base module of the Django project. - - -FilterExpression is a class within the django.template.base module of the Django project. - +meta: Example code for understanding how to use the FilterExpression class from the django.template.base module of the Django project. + + +`FilterExpression` is a class within the `django.template.base` module of the Django project. + +Context, +Node, +NodeList, +Parser, +Template, +TemplateSyntaxError, +TextNode, +Token, +TokenType, +VariableDoesNotExist, +VariableNode, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-sitetree [django-sitetree](https://github.com/idlesign/django-sitetree) diff --git a/content/pages/examples/django/django-template-base-node.markdown b/content/pages/examples/django/django-template-base-node.markdown index a7557b13a..d12b75a6f 100644 --- a/content/pages/examples/django/django-template-base-node.markdown +++ b/content/pages/examples/django/django-template-base-node.markdown @@ -1,14 +1,27 @@ title: django.template.base Node Example Code category: page slug: django-template-base-node-examples -sortorder: 500011365 +sortorder: 500011371 toc: False sidebartitle: django.template.base Node -meta: Python example code for the Node class from the django.template.base module of the Django project. - - -Node is a class within the django.template.base module of the Django project. - +meta: Example code for understanding how to use the Node class from the django.template.base module of the Django project. + + +`Node` is a class within the `django.template.base` module of the Django project. + +Context, +FilterExpression, +NodeList, +Parser, +Template, +TemplateSyntaxError, +TextNode, +Token, +TokenType, +VariableDoesNotExist, +VariableNode, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-angular [django-angular](https://github.com/jrief/django-angular) diff --git a/content/pages/examples/django/django-template-base-nodelist.markdown b/content/pages/examples/django/django-template-base-nodelist.markdown index c178a8121..82615eb0b 100644 --- a/content/pages/examples/django/django-template-base-nodelist.markdown +++ b/content/pages/examples/django/django-template-base-nodelist.markdown @@ -1,14 +1,27 @@ title: django.template.base NodeList Example Code category: page slug: django-template-base-nodelist-examples -sortorder: 500011366 +sortorder: 500011372 toc: False sidebartitle: django.template.base NodeList -meta: Python example code for the NodeList class from the django.template.base module of the Django project. - - -NodeList is a class within the django.template.base module of the Django project. - +meta: Example code for understanding how to use the NodeList class from the django.template.base module of the Django project. + + +`NodeList` is a class within the `django.template.base` module of the Django project. + +Context, +FilterExpression, +Node, +Parser, +Template, +TemplateSyntaxError, +TextNode, +Token, +TokenType, +VariableDoesNotExist, +VariableNode, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-angular [django-angular](https://github.com/jrief/django-angular) diff --git a/content/pages/examples/django/django-template-base-parser.markdown b/content/pages/examples/django/django-template-base-parser.markdown index a3e3fdbe2..d935c982b 100644 --- a/content/pages/examples/django/django-template-base-parser.markdown +++ b/content/pages/examples/django/django-template-base-parser.markdown @@ -1,14 +1,27 @@ title: django.template.base Parser Example Code category: page slug: django-template-base-parser-examples -sortorder: 500011367 +sortorder: 500011373 toc: False sidebartitle: django.template.base Parser -meta: Python example code for the Parser class from the django.template.base module of the Django project. +meta: Example code for understanding how to use the Parser class from the django.template.base module of the Django project. -Parser is a class within the django.template.base module of the Django project. +`Parser` is a class within the `django.template.base` module of the Django project. +Context, +FilterExpression, +Node, +NodeList, +Template, +TemplateSyntaxError, +TextNode, +Token, +TokenType, +VariableDoesNotExist, +VariableNode, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-sitetree [django-sitetree](https://github.com/idlesign/django-sitetree) @@ -84,7 +97,7 @@ class TreeItemChoiceField(ChoiceField): context.update({'request': object()}) choices_str = sitetree_tree( -~~ Parser(None), Token(token_type=TOKEN_BLOCK, contents=tree_token) +~~ Parser([]), Token(token_type=TOKEN_BLOCK, contents=tree_token) ).render(context) tree_choices = [(ITEMS_FIELD_ROOT_ID, self.root_title)] diff --git a/content/pages/examples/django/django-template-base-template.markdown b/content/pages/examples/django/django-template-base-template.markdown index 70cb7dca7..23d44a910 100644 --- a/content/pages/examples/django/django-template-base-template.markdown +++ b/content/pages/examples/django/django-template-base-template.markdown @@ -1,14 +1,27 @@ title: django.template.base Template Example Code category: page slug: django-template-base-template-examples -sortorder: 500011368 +sortorder: 500011374 toc: False sidebartitle: django.template.base Template -meta: Python example code for the Template class from the django.template.base module of the Django project. +meta: Example code for understanding how to use the Template class from the django.template.base module of the Django project. -Template is a class within the django.template.base module of the Django project. +`Template` is a class within the `django.template.base` module of the Django project. +Context, +FilterExpression, +Node, +NodeList, +Parser, +TemplateSyntaxError, +TextNode, +Token, +TokenType, +VariableDoesNotExist, +VariableNode, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-cms [django-cms](https://github.com/divio/django-cms) @@ -27,8 +40,6 @@ from django.contrib.admin.sites import site from django.template import Context ~~from django.template.base import Template -from six import text_type - from cms.api import add_plugin from cms.models import StaticPlaceholder, Placeholder, UserSettings from cms.tests.test_plugins import PluginsTestBaseCase diff --git a/content/pages/examples/django/django-template-base-templatesyntaxerror.markdown b/content/pages/examples/django/django-template-base-templatesyntaxerror.markdown index 4dd549d7c..9050c318a 100644 --- a/content/pages/examples/django/django-template-base-templatesyntaxerror.markdown +++ b/content/pages/examples/django/django-template-base-templatesyntaxerror.markdown @@ -1,14 +1,27 @@ title: django.template.base TemplateSyntaxError Example Code category: page slug: django-template-base-templatesyntaxerror-examples -sortorder: 500011369 +sortorder: 500011375 toc: False sidebartitle: django.template.base TemplateSyntaxError -meta: Python example code for the TemplateSyntaxError class from the django.template.base module of the Django project. - - -TemplateSyntaxError is a class within the django.template.base module of the Django project. - +meta: Example code for understanding how to use the TemplateSyntaxError class from the django.template.base module of the Django project. + + +`TemplateSyntaxError` is a class within the `django.template.base` module of the Django project. + +Context, +FilterExpression, +Node, +NodeList, +Parser, +Template, +TextNode, +Token, +TokenType, +VariableDoesNotExist, +VariableNode, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-sitetree [django-sitetree](https://github.com/idlesign/django-sitetree) diff --git a/content/pages/examples/django/django-template-base-textnode.markdown b/content/pages/examples/django/django-template-base-textnode.markdown index e47a68846..ba9d0fd65 100644 --- a/content/pages/examples/django/django-template-base-textnode.markdown +++ b/content/pages/examples/django/django-template-base-textnode.markdown @@ -1,14 +1,27 @@ title: django.template.base TextNode Example Code category: page slug: django-template-base-textnode-examples -sortorder: 500011370 +sortorder: 500011376 toc: False sidebartitle: django.template.base TextNode -meta: Python example code for the TextNode class from the django.template.base module of the Django project. - - -TextNode is a class within the django.template.base module of the Django project. - +meta: Example code for understanding how to use the TextNode class from the django.template.base module of the Django project. + + +`TextNode` is a class within the `django.template.base` module of the Django project. + +Context, +FilterExpression, +Node, +NodeList, +Parser, +Template, +TemplateSyntaxError, +Token, +TokenType, +VariableDoesNotExist, +VariableNode, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-angular [django-angular](https://github.com/jrief/django-angular) diff --git a/content/pages/examples/django/django-template-base-token-kwargs.markdown b/content/pages/examples/django/django-template-base-token-kwargs.markdown index ecafe2225..0daeda14c 100644 --- a/content/pages/examples/django/django-template-base-token-kwargs.markdown +++ b/content/pages/examples/django/django-template-base-token-kwargs.markdown @@ -1,14 +1,27 @@ title: django.template.base token_kwargs Example Code category: page slug: django-template-base-token-kwargs-examples -sortorder: 500011375 +sortorder: 500011381 toc: False sidebartitle: django.template.base token_kwargs -meta: Python example code for the token_kwargs callable from the django.template.base module of the Django project. - - -token_kwargs is a callable within the django.template.base module of the Django project. - +meta: Python example code that shows how to use the token_kwargs callable from the django.template.base module of the Django project. + + +`token_kwargs` is a callable within the `django.template.base` module of the Django project. + +Context, +FilterExpression, +Node, +NodeList, +Parser, +Template, +TemplateSyntaxError, +TextNode, +Token, +TokenType, +VariableDoesNotExist, +and VariableNode +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-floppyforms [django-floppyforms](https://github.com/jazzband/django-floppyforms) diff --git a/content/pages/examples/django/django-template-base-token.markdown b/content/pages/examples/django/django-template-base-token.markdown index 6c9da8eaa..5610cf6fe 100644 --- a/content/pages/examples/django/django-template-base-token.markdown +++ b/content/pages/examples/django/django-template-base-token.markdown @@ -1,14 +1,27 @@ title: django.template.base Token Example Code category: page slug: django-template-base-token-examples -sortorder: 500011371 +sortorder: 500011377 toc: False sidebartitle: django.template.base Token -meta: Python example code for the Token class from the django.template.base module of the Django project. +meta: Example code for understanding how to use the Token class from the django.template.base module of the Django project. -Token is a class within the django.template.base module of the Django project. +`Token` is a class within the `django.template.base` module of the Django project. +Context, +FilterExpression, +Node, +NodeList, +Parser, +Template, +TemplateSyntaxError, +TextNode, +TokenType, +VariableDoesNotExist, +VariableNode, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-sitetree [django-sitetree](https://github.com/idlesign/django-sitetree) @@ -84,7 +97,7 @@ class TreeItemChoiceField(ChoiceField): context.update({'request': object()}) choices_str = sitetree_tree( -~~ Parser(None), Token(token_type=TOKEN_BLOCK, contents=tree_token) +~~ Parser([]), Token(token_type=TOKEN_BLOCK, contents=tree_token) ).render(context) tree_choices = [(ITEMS_FIELD_ROOT_ID, self.root_title)] diff --git a/content/pages/examples/django/django-template-base-tokentype.markdown b/content/pages/examples/django/django-template-base-tokentype.markdown index ff8af3738..6064b392d 100644 --- a/content/pages/examples/django/django-template-base-tokentype.markdown +++ b/content/pages/examples/django/django-template-base-tokentype.markdown @@ -1,14 +1,27 @@ title: django.template.base TokenType Example Code category: page slug: django-template-base-tokentype-examples -sortorder: 500011372 +sortorder: 500011378 toc: False sidebartitle: django.template.base TokenType -meta: Python example code for the TokenType class from the django.template.base module of the Django project. - - -TokenType is a class within the django.template.base module of the Django project. - +meta: Example code for understanding how to use the TokenType class from the django.template.base module of the Django project. + + +`TokenType` is a class within the `django.template.base` module of the Django project. + +Context, +FilterExpression, +Node, +NodeList, +Parser, +Template, +TemplateSyntaxError, +TextNode, +Token, +VariableDoesNotExist, +VariableNode, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-sitetree [django-sitetree](https://github.com/idlesign/django-sitetree) diff --git a/content/pages/examples/django/django-template-base-variabledoesnotexist.markdown b/content/pages/examples/django/django-template-base-variabledoesnotexist.markdown index cd6ea6d80..a1894a291 100644 --- a/content/pages/examples/django/django-template-base-variabledoesnotexist.markdown +++ b/content/pages/examples/django/django-template-base-variabledoesnotexist.markdown @@ -1,14 +1,27 @@ title: django.template.base VariableDoesNotExist Example Code category: page slug: django-template-base-variabledoesnotexist-examples -sortorder: 500011373 +sortorder: 500011379 toc: False sidebartitle: django.template.base VariableDoesNotExist -meta: Python example code for the VariableDoesNotExist class from the django.template.base module of the Django project. +meta: Example code for understanding how to use the VariableDoesNotExist class from the django.template.base module of the Django project. -VariableDoesNotExist is a class within the django.template.base module of the Django project. +`VariableDoesNotExist` is a class within the `django.template.base` module of the Django project. +Context, +FilterExpression, +Node, +NodeList, +Parser, +Template, +TemplateSyntaxError, +TextNode, +Token, +TokenType, +VariableNode, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-pipeline [django-pipeline](https://github.com/jazzband/django-pipeline) @@ -34,7 +47,7 @@ import subprocess from django.contrib.staticfiles.storage import staticfiles_storage from django import template -~~from django.template.base import Context, VariableDoesNotExist +~~from django.template.base import VariableDoesNotExist from django.template.loader import render_to_string from django.utils.safestring import mark_safe diff --git a/content/pages/examples/django/django-template-base-variablenode.markdown b/content/pages/examples/django/django-template-base-variablenode.markdown index 8a0e361a0..a2d26decd 100644 --- a/content/pages/examples/django/django-template-base-variablenode.markdown +++ b/content/pages/examples/django/django-template-base-variablenode.markdown @@ -1,14 +1,27 @@ title: django.template.base VariableNode Example Code category: page slug: django-template-base-variablenode-examples -sortorder: 500011374 +sortorder: 500011380 toc: False sidebartitle: django.template.base VariableNode -meta: Python example code for the VariableNode class from the django.template.base module of the Django project. +meta: Example code for understanding how to use the VariableNode class from the django.template.base module of the Django project. -VariableNode is a class within the django.template.base module of the Django project. +`VariableNode` is a class within the `django.template.base` module of the Django project. +Context, +FilterExpression, +Node, +NodeList, +Parser, +Template, +TemplateSyntaxError, +TextNode, +Token, +TokenType, +VariableDoesNotExist, +and token_kwargs +are several other callables with code examples from the same `django.template.base` package. ## Example 1 from django-angular [django-angular](https://github.com/jrief/django-angular) @@ -126,8 +139,6 @@ from django.template import TemplateSyntaxError, NodeList, Variable, Context, Te from django.template.loader import get_template from django.template.loader_tags import BlockNode, ExtendsNode, IncludeNode -from six import string_types - from sekizai.helpers import get_varname from cms.exceptions import DuplicatePlaceholderWarning @@ -147,6 +158,8 @@ def get_context(): context.template = Template('') return context else: + return {} + ## ... source file continues with no further VariableNode examples... diff --git a/content/pages/examples/django/django-template-context-context.markdown b/content/pages/examples/django/django-template-context-context.markdown new file mode 100644 index 000000000..5b3926fb2 --- /dev/null +++ b/content/pages/examples/django/django-template-context-context.markdown @@ -0,0 +1,186 @@ +title: django.template.context Context Example Code +category: page +slug: django-template-context-context-examples +sortorder: 500011382 +toc: False +sidebartitle: django.template.context Context +meta: Example code for understanding how to use the Context class from the django.template.context module of the Django project. + + +`Context` is a class within the `django.template.context` module of the Django project. + + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / test_utils / testcases.py**](https://github.com/divio/django-cms/blob/develop/cms/test_utils/testcases.py) + +```python +# testcases.py +import json +import sys +import warnings + +from urllib.parse import unquote, urljoin + +from django.conf import settings +from django.contrib.auth import get_user_model +from django.contrib.auth.models import AnonymousUser, Permission +from django.contrib.sites.models import Site +from django.core.cache import cache +from django.core.exceptions import ObjectDoesNotExist +from django.forms.models import model_to_dict +from django.template import engines +~~from django.template.context import Context +from django.test import testcases +from django.test.client import RequestFactory +from django.urls import reverse +from django.utils.http import urlencode +from django.utils.timezone import now +from django.utils.translation import activate +from menus.menu_pool import menu_pool + +from cms.api import create_page +from cms.constants import ( + PUBLISHER_STATE_DEFAULT, + PUBLISHER_STATE_DIRTY, + PUBLISHER_STATE_PENDING, +) +from cms.plugin_rendering import ContentRenderer, StructureRenderer +from cms.models import Page +from cms.models.permissionmodels import ( + GlobalPagePermission, + PagePermission, + PageUser, +) +from cms.test_utils.util.context_managers import UserLoginContext +from cms.utils.conf import get_cms_setting +from cms.utils.permissions import set_current_user + + +## ... source file abbreviated to get to Context examples ... + + + + def create_homepage(self, *args, **kwargs): + homepage = create_page(*args, **kwargs) + homepage.set_as_homepage() + return homepage.reload() + + def move_page(self, page, target_page, position="first-child"): + page.move_page(target_page.node, position) + return self.reload_page(page) + + def reload_page(self, page): + return self.reload(page) + + def reload(self, obj): + return obj.__class__.objects.get(pk=obj.pk) + + def get_pages_root(self): + return unquote(reverse("pages-root")) + + def get_context(self, path=None, page=None): + if not path: + path = self.get_pages_root() + context = {} + request = self.get_request(path, page=page) + context['request'] = request +~~ return Context(context) + + def get_content_renderer(self, request=None): + request = request or self.get_request() + return ContentRenderer(request) + + def get_structure_renderer(self, request=None): + request = request or self.get_request() + return StructureRenderer(request) + + def get_request(self, path=None, language=None, post_data=None, enforce_csrf_checks=False, page=None, domain=None): + factory = RequestFactory() + + if not path: + path = self.get_pages_root() + + if not language: + if settings.USE_I18N: + language = settings.LANGUAGES[0][0] + else: + language = settings.LANGUAGE_CODE + + if post_data: + request = factory.post(path, post_data) + else: + + +## ... source file continues with no further Context examples... + +``` + + +## Example 2 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / sitetreeapp.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./sitetreeapp.py) + +```python +# sitetreeapp.py +import warnings +from collections import defaultdict +from copy import deepcopy +from inspect import getfullargspec +from sys import exc_info +from threading import local +from typing import Callable, List, Optional, Dict, Union, Sequence, Any, Tuple + +from django.conf import settings +from django.core.cache import caches +from django.db.models import signals, QuerySet +from django.template.base import ( + FilterExpression, Lexer, Parser, Variable, VariableDoesNotExist, VARIABLE_TAG_START) +~~from django.template.context import Context +from django.template.loader import get_template +from django.urls import reverse, NoReverseMatch +from django.utils import module_loading +from django.utils.encoding import iri_to_uri +from django.utils.translation import get_language + +from .compat import TOKEN_TEXT, TOKEN_VAR +from .exceptions import SiteTreeError +from .settings import ( + ALIAS_TRUNK, ALIAS_THIS_CHILDREN, ALIAS_THIS_SIBLINGS, ALIAS_THIS_PARENT_SIBLINGS, ALIAS_THIS_ANCESTOR_CHILDREN, + UNRESOLVED_ITEM_MARKER, RAISE_ITEMS_ERRORS_ON_DEBUG, CACHE_TIMEOUT, CACHE_NAME, DYNAMIC_ONLY, ADMIN_APP_NAME, + SITETREE_CLS) +from .utils import get_tree_model, get_tree_item_model, import_app_sitetree_module, generate_id_for + +if False: # pragma: nocover + from django.contrib.auth.models import User # noqa + from .models import TreeItemBase, TreeBase + +TypeDynamicTrees = Dict[str, Union[Dict[str, List['TreeBase']], List['TreeBase']]] + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + + + +## ... source file continues with no further Context examples... + +``` + diff --git a/content/pages/examples/django/django-template-context.markdown b/content/pages/examples/django/django-template-context.markdown new file mode 100644 index 000000000..5600af98b --- /dev/null +++ b/content/pages/examples/django/django-template-context.markdown @@ -0,0 +1,1070 @@ +title: django.template Context Example Code +category: page +slug: django-template-context-examples +sortorder: 500011357 +toc: False +sidebartitle: django.template Context +meta: Example code for understanding how to use the Context class from the django.template module of the Django project. + + +`Context` is a class within the `django.template` module of the Django project. + +Engine, +Library, +Node, +NodeList, +Origin, +RequestContext, +Template, +TemplateDoesNotExist, +TemplateSyntaxError, +Variable, +context, +engine, +library, +and loader +are several other callables with code examples from the same `django.template` package. + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair_mail / models.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair_mail/models.py) + +```python +# models.py +from django.conf import settings +from django.core.mail import send_mail +from django.db import models +from django.db.models import ForeignKey, OneToOneField, TextField, CharField, \ + SET_NULL, CASCADE, BooleanField, UniqueConstraint +from django.db.models.signals import post_save +from django.dispatch import receiver +~~from django.template import Template, Context +from django.utils import timezone +from markdown import markdown +from html2text import html2text + +from chair_mail.context import get_conference_context, get_user_context, \ + get_submission_context, get_frame_context +from conferences.models import Conference +from submissions.models import Submission +from users.models import User + +MSG_TYPE_USER = 'user' +MSG_TYPE_SUBMISSION = 'submission' + +MESSAGE_TYPE_CHOICES = ( + (MSG_TYPE_USER, 'Message to users'), + (MSG_TYPE_SUBMISSION, 'Message to submissions'), +) + + +class EmailFrame(models.Model): + text_html = models.TextField() + text_plain = models.TextField() + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now_add=True) + created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) + conference = models.ForeignKey(Conference, on_delete=models.CASCADE) + + @staticmethod + def render(frame_template, conference, subject, body): + context_data = get_frame_context(conference, subject, body) +~~ context = Context(context_data, autoescape=False) + return Template(frame_template).render(context) + + def render_html(self, subject, body): + return EmailFrame.render( + self.text_html, self.conference, subject, body + ) + + def render_plain(self, subject, body): + text_plain = self.text_plain + if not text_plain: + text_plain = html2text(self.text_html) + return EmailFrame.render( + text_plain, self.conference, subject, body + ) + + +class EmailSettings(models.Model): + frame = models.ForeignKey(EmailFrame, on_delete=models.SET_NULL, null=True) + conference = models.OneToOneField( + Conference, null=True, blank=True, on_delete=models.CASCADE, + related_name='email_settings', + ) + + + + +## ... source file abbreviated to get to Context examples ... + + + + group_message = models.OneToOneField( + GroupMessage, on_delete=models.CASCADE, parent_link=True) + + @property + def message_type(self): + return MSG_TYPE_USER + + @staticmethod + def create(subject, body, conference, objects_to): + msg = UserMessage.objects.create( + subject=subject, body=body, conference=conference) + for user in objects_to: + msg.recipients.add(user) + msg.save() + return msg + + def send(self, sender): + self.sent = False + self.sent_by = sender + self.save() + + frame = self.conference.email_settings.frame + conference_context = get_conference_context(self.conference) + for user in self.recipients.all(): +~~ context = Context({ + **conference_context, + **get_user_context(user, self.conference) + }, autoescape=False) + email = EmailMessage.create( + group_message=self.group_message, + user_to=user, + context=context, + frame=frame + ) + email.send(sender) + + self.sent_at = timezone.now() + self.sent = True + self.save() + return self + + +class SubmissionMessage(GroupMessage): + recipients = models.ManyToManyField( + Submission, related_name='group_emails') + + group_message = models.OneToOneField( + GroupMessage, on_delete=models.CASCADE, parent_link=True) + + @property + def message_type(self): + return MSG_TYPE_SUBMISSION + + @staticmethod + def create(subject, body, conference, objects_to): + msg = SubmissionMessage.objects.create( + subject=subject, body=body, conference=conference) + for submission in objects_to: + msg.recipients.add(submission) + msg.save() + return msg + + def send(self, sender): + self.sent = False + self.sent_by = sender + self.save() + + frame = self.conference.email_settings.frame + conference_context = get_conference_context(self.conference) + for submission in self.recipients.all(): + submission_context = get_submission_context(submission) + for author in submission.authors.all(): + user = author.user +~~ context = Context({ + **conference_context, + **submission_context, + **get_user_context(user, self.conference) + }, autoescape=False) + email = EmailMessage.create( + group_message=self.group_message, + user_to=user, + context=context, + frame=frame + ) + email.send(sender) + + self.sent_at = timezone.now() + self.sent = True + self.save() + return self + + +def get_group_message_model(msg_type): + return { + MSG_TYPE_USER: UserMessage, + MSG_TYPE_SUBMISSION: SubmissionMessage, + }[msg_type] + + + +## ... source file continues with no further Context examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / tests.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/tests.py) + +```python +# tests.py +from __future__ import absolute_import + +import json +import uuid +from datetime import timedelta + +from django import forms +from django.conf import settings +from django.contrib.auth.models import AbstractUser, AnonymousUser +from django.contrib.sites.models import Site +from django.core import mail, validators +from django.core.exceptions import ValidationError +from django.db import models +from django.http import HttpResponseRedirect +~~from django.template import Context, Template +from django.test.client import Client, RequestFactory +from django.test.utils import override_settings +from django.urls import reverse +from django.utils.timezone import now + +from allauth.account.forms import BaseSignupForm, ResetPasswordForm, SignupForm +from allauth.account.models import ( + EmailAddress, + EmailConfirmation, + EmailConfirmationHMAC, +) +from allauth.tests import Mock, TestCase, patch +from allauth.utils import get_user_model, get_username_max_length + +from . import app_settings +from .adapter import get_adapter +from .auth_backends import AuthenticationBackend +from .signals import user_logged_in, user_logged_out +from .utils import ( + filter_users_by_username, + url_str_to_user_pk, + user_pk_to_url_str, + user_username, +) + + +## ... source file continues with no further Context examples... + +``` + + +## Example 3 from django-appmail +[Django-Appmail](https://github.com/yunojuno/django-appmail) +([PyPI package information](https://pypi.org/project/django-appmail/)) +is a [Django](/django.html) app for handling transactional email templates. +While the project began development as a way to work with the Mandrill +transactional [API](/application-programming-interfaces.html), it is +not exclusive to that API. The project simply provides a way to store +and render email content. The library does not send or receive emails. + +Django-Appmail is open sourced under the +[MIT license](https://github.com/yunojuno/django-appmail/blob/master/LICENSE). + +[**django-appmail / appmail / models.py**](https://github.com/yunojuno/django-appmail/blob/master/appmail/./models.py) + +```python +# models.py +from __future__ import annotations + +from typing import Any, Callable, Dict, List, Optional + +from django.conf import settings +from django.contrib.auth import get_user_model +from django.core.exceptions import ValidationError +from django.core.mail import EmailMultiAlternatives +from django.core.serializers.json import DjangoJSONEncoder +from django.db import models, transaction +from django.http import HttpRequest +~~from django.template import Context, Template, TemplateDoesNotExist, TemplateSyntaxError +from django.utils.timezone import now as tz_now +from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy as _lazy + +from . import helpers +from .compat import JSONField +from .settings import ( + ADD_EXTRA_HEADERS, + CONTEXT_PROCESSORS, + LOG_SENT_EMAILS, + VALIDATE_ON_SAVE, +) + +User = get_user_model() + + +class EmailTemplateQuerySet(models.query.QuerySet): + def active(self) -> EmailTemplateQuerySet: + return self.filter(is_active=True) + + def current( + self, name: str, language: str = settings.LANGUAGE_CODE + ) -> EmailTemplateQuerySet: + return ( + + +## ... source file abbreviated to get to Context examples ... + + + + def save(self, *args: Any, **kwargs: Any) -> EmailTemplate: + if self.pk is None: + self.test_context = helpers.get_context( + self.subject + self.body_text + self.body_html + ) + validate = kwargs.pop("validate", VALIDATE_ON_SAVE) + if validate: + self.clean() + super(EmailTemplate, self).save(*args, **kwargs) + return self + + def clean(self) -> None: + validation_errors = {} + validation_errors.update(self._validate_body(EmailTemplate.CONTENT_TYPE_PLAIN)) + validation_errors.update(self._validate_body(EmailTemplate.CONTENT_TYPE_HTML)) + validation_errors.update(self._validate_subject()) + if validation_errors: + raise ValidationError(validation_errors) + + def render_subject( + self, + context: dict, + processors: List[Callable[[HttpRequest], dict]] = CONTEXT_PROCESSORS, + ) -> str: +~~ ctx = Context(helpers.patch_context(context, processors), autoescape=False) + return Template(self.subject).render(ctx) + + def _validate_subject(self) -> Dict[str, str]: + try: + self.render_subject({}) + except TemplateDoesNotExist as ex: + return {"subject": _lazy("Template does not exist: {}".format(ex))} + except TemplateSyntaxError as ex: + return {"subject": str(ex)} + else: + return {} + + def render_body( + self, + context: dict, + content_type: str = CONTENT_TYPE_PLAIN, + processors: List[Callable[[HttpRequest], dict]] = CONTEXT_PROCESSORS, + ) -> str: + if content_type not in EmailTemplate.CONTENT_TYPES: + raise ValueError(_(f"Invalid content type. Value supplied: {content_type}")) + if content_type == EmailTemplate.CONTENT_TYPE_PLAIN: +~~ ctx = Context(helpers.patch_context(context, processors), autoescape=False) + return Template(self.body_text).render(ctx) + if content_type == EmailTemplate.CONTENT_TYPE_HTML: +~~ ctx = Context(helpers.patch_context(context, processors)) + return Template(self.body_html).render(ctx) + raise ValueError(f"Invalid content_type '{content_type}'.") + + def _validate_body(self, content_type: str) -> Dict[str, str]: + if content_type == EmailTemplate.CONTENT_TYPE_PLAIN: + field_name = "body_text" + elif content_type == EmailTemplate.CONTENT_TYPE_HTML: + field_name = "body_html" + else: + raise ValueError("Invalid template content_type.") + try: + self.render_body({}, content_type=content_type) + except TemplateDoesNotExist as ex: + return {field_name: _("Template does not exist: {}".format(ex))} + except TemplateSyntaxError as ex: + return {field_name: str(ex)} + else: + return {} + + def clone(self) -> EmailTemplate: + self.pk = None + self.version += 1 + return self.save() + + + +## ... source file continues with no further Context examples... + +``` + + +## Example 4 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_rendering.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_rendering.py) + +```python +# plugin_rendering.py +from collections import OrderedDict + +from functools import partial + +from classytags.utils import flatten_context + +from django.contrib.sites.models import Site +~~from django.template import Context +from django.utils.functional import cached_property +from django.utils.module_loading import import_string +from django.utils.safestring import mark_safe + +from cms.cache.placeholder import get_placeholder_cache, set_placeholder_cache +from cms.toolbar.utils import ( + get_placeholder_toolbar_js, + get_plugin_toolbar_js, + get_toolbar_from_request, +) +from cms.utils import get_language_from_request +from cms.utils.conf import get_cms_setting +from cms.utils.permissions import has_plugin_permission +from cms.utils.placeholder import get_toolbar_plugin_struct, restore_sekizai_context +from cms.utils.plugins import get_plugin_restrictions + + +def _unpack_plugins(parent_plugin): + found_plugins = [] + + for plugin in parent_plugin.child_plugin_instances or []: + found_plugins.append(plugin) + + if plugin.child_plugin_instances: + + +## ... source file abbreviated to get to Context examples ... + + + placeholder_cache = self._rendered_plugins_by_placeholder.setdefault(instance.placeholder_id, {}) + placeholder_cache.setdefault('plugins', []).append(instance) + return self.get_plugin_toolbar_js(instance, page=page) + + def render_plugins(self, placeholder, language, page=None): + template = page.get_template() if page else None + plugins = self.get_plugins_to_render(placeholder, language, template) + + for plugin in plugins: + plugin._placeholder_cache = placeholder + yield self.render_plugin(plugin, page=page) + + +class LegacyRenderer(ContentRenderer): + + load_structure = True + placeholder_edit_template = ( + ) + + def get_editable_placeholder_context(self, placeholder, page=None): + context = super().get_editable_placeholder_context(placeholder, page) + context['plugin_menu_js'] = self.get_placeholder_plugin_menu(placeholder, page=page) + return context + + +~~class PluginContext(Context): + + def __init__(self, dict_, instance, placeholder, processors=None, current_app=None): + dict_ = flatten_context(dict_) + super().__init__(dict_) + + if not processors: + processors = [] + + for path in get_cms_setting('PLUGIN_CONTEXT_PROCESSORS'): + processor = import_string(path) + self.update(processor(instance, placeholder, self)) + for processor in processors: + self.update(processor(instance, placeholder, self)) + + + +## ... source file continues with no further Context examples... + +``` + + +## Example 5 from django-easy-timezones +[django-easy-timezones](https://github.com/Miserlou/django-easy-timezones) +([project website](https://www.gun.io/blog/django-easy-timezones)) +is a Django +[middleware](https://docs.djangoproject.com/en/2.2/topics/http/middleware/) +[code library](https://pypi.org/project/django-easy-timezones/) +to simplify handling time data in your applications using +users' geolocation data. + +[**django-easy-timezones / easy_timezones / views.py**](https://github.com/Miserlou/django-easy-timezones/blob/master/easy_timezones/./views.py) + +```python +# views.py +from django.conf import settings +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render_to_response +~~from django.template import RequestContext, Template, Context + +from datetime import datetime + +def with_tz(request): + + dt = datetime.now() + t = Template('{% load tz %}{% localtime on %}{% get_current_timezone as TIME_ZONE %}{{ TIME_ZONE }}{% endlocaltime %}') + c = RequestContext(request) + response = t.render(c) + return HttpResponse(response) + +def without_tz(request): + + t = Template('{% load tz %}{% get_current_timezone as TIME_ZONE %}{{ TIME_ZONE }}') + c = RequestContext(request) + response = t.render(c) + return HttpResponse(response) + + + +## ... source file continues with no further Context examples... + +``` + + +## Example 6 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / management / modelviz.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/management/modelviz.py) + +```python +# modelviz.py + +import datetime +import os +import re + +from django.apps import apps +from django.db.models.fields.related import ( + ForeignKey, ManyToManyField, OneToOneField, RelatedField, +) +from django.contrib.contenttypes.fields import GenericRelation +~~from django.template import Context, Template, loader +from django.utils.encoding import force_str +from django.utils.safestring import mark_safe +from django.utils.translation import activate as activate_language + + +__version__ = "1.1" +__license__ = "Python" +__author__ = "Bas van Oostveen ", +__contributors__ = [ + "Antonio Cavedoni " + "Stefano J. Attardi ", + "limodou ", + "Carlo C8E Miron", + "Andre Campos ", + "Justin Findlay ", + "Alexander Houben ", + "Joern Hees ", + "Kevin Cherepski ", + "Jose Tomas Tocino ", + "Adam Dobrawy ", + "Mikkel Munch Mortensen ", + "Andrzej Bistram ", + "Daniel Lipsitt ", +] + + +## ... source file abbreviated to get to Context examples ... + + + if '.' in field.remote_field.model: + app_label, model_name = field.remote_field.model.split('.', 1) + else: + app_label = field.model._meta.app_label + model_name = field.remote_field.model + target_model = apps.get_model(app_label, model_name) + else: + target_model = field.remote_field.model + + _rel = self.get_relation_context(target_model, field, label, extras) + + if _rel not in model['relations'] and self.use_model(_rel['target']): + return _rel + + def get_abstract_models(self, appmodels): + abstract_models = [] + for appmodel in appmodels: + abstract_models += [ + abstract_model for abstract_model in appmodel.__bases__ + if hasattr(abstract_model, '_meta') and abstract_model._meta.abstract + ] + abstract_models = list(set(abstract_models)) # remove duplicates + return abstract_models + + def get_app_context(self, app): +~~ return Context({ + 'name': '"%s"' % app.name, + 'app_name': "%s" % app.name, + 'cluster_app_name': "cluster_%s" % app.name.replace(".", "_"), + 'models': [] + }) + + def get_appmodel_attributes(self, appmodel): + if self.relations_as_fields: + attributes = [field for field in appmodel._meta.local_fields] + else: + attributes = [field for field in appmodel._meta.local_fields if not + isinstance(field, RelatedField)] + return attributes + + def get_appmodel_abstracts(self, appmodel): + return [ + abstract_model.__name__ for abstract_model in appmodel.__bases__ + if hasattr(abstract_model, '_meta') and abstract_model._meta.abstract + ] + + def get_appmodel_context(self, appmodel, appmodel_abstracts): + context = { + 'model': appmodel, + 'app_name': appmodel.__module__.replace(".", "_"), + + +## ... source file abbreviated to get to Context examples ... + + + for model_pattern in self.exclude_models: + model_pattern = '^%s$' % model_pattern.replace('*', '.*') + if re.search(model_pattern, model_name): + return False + return not self.include_models + + def skip_field(self, field): + if self.exclude_columns: + if self.verbose_names and field.verbose_name: + if field.verbose_name in self.exclude_columns: + return True + if field.name in self.exclude_columns: + return True + return False + + +def generate_dot(graph_data, template='django_extensions/graph_models/digraph.dot'): + if isinstance(template, str): + template = loader.get_template(template) + + if not isinstance(template, Template) and not (hasattr(template, 'template') and isinstance(template.template, Template)): + raise Exception("Default Django template loader isn't used. " + "This can lead to the incorrect template rendering. " + "Please, check the settings.") + +~~ c = Context(graph_data).flatten() + dot = template.render(c) + + return dot + + +def generate_graph_data(*args, **kwargs): + generator = ModelGraph(*args, **kwargs) + generator.generate_graph_data() + return generator.get_graph_data() + + +def use_model(model, include_models, exclude_models): + generator = ModelGraph([], include_models=include_models, exclude_models=exclude_models) + return generator.use_model(model) + + + +## ... source file continues with no further Context examples... + +``` + + +## Example 7 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / compat.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./compat.py) + +```python +# compat.py +from contextlib import contextmanager + +import django +~~from django.template import Context +from django.utils.datastructures import MultiValueDict + +MULTIVALUE_DICT_TYPES = (MultiValueDict,) + + +REQUIRED_CONTEXT_ATTRIBTUES = ( + '_form_config', + '_form_render', +) + + +class DictContext(dict): + pass + + +if django.VERSION < (1, 8): + def get_template(context, template_name): + from django.template.loader import get_template + return get_template(template_name) + + def get_context(context): +~~ if not isinstance(context, Context): +~~ context = Context(context) + return context + +else: + def get_template(context, template_name): + return context.template.engine.get_template(template_name) + + def get_context(context): + return context + + +def flatten_context(context): +~~ if isinstance(context, Context): + flat = {} + for d in context.dicts: + flat.update(d) + return flat + else: + return context + + +def flatten_contexts(*contexts): + new_context = DictContext() + for context in contexts: + if context is not None: + new_context.update(flatten_context(context)) + for attr in REQUIRED_CONTEXT_ATTRIBTUES: + if hasattr(context, attr): + setattr(new_context, attr, getattr(context, attr)) + return new_context + + +@contextmanager +def render_context(context_instance, context): + if context_instance is not None: + with context_instance.push(context): + yield context_instance + + +## ... source file continues with no further Context examples... + +``` + + +## Example 8 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import datetime +import json +~~from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 + from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise + + +## ... source file abbreviated to get to Context examples ... + + + item['items'] = item['models'] + return item + app_list = list(map(map_item, original_app_list.values())) + + current_found = False + + for app in app_list: + if not current_found: + for model in app['items']: + if not current_found and model.get('url') and context['request'].path.startswith(model['url']): + model['current'] = True + current_found = True + else: + model['current'] = False + + if not current_found and app.get('url') and context['request'].path.startswith(app['url']): + app['current'] = True + current_found = True + else: + app['current'] = False + + return app_list + + +def context_to_dict(context): +~~ if isinstance(context, Context): + flat = {} + for d in context.dicts: + flat.update(d) + context = flat + + return context + + +def user_is_authenticated(user): + if not hasattr(user.is_authenticated, '__call__'): + return user.is_authenticated + else: + return user.is_authenticated() + + + +## ... source file continues with no further Context examples... + +``` + + +## Example 9 from django-markdown-view +[django-markdown-view](https://github.com/rgs258/django-markdown-view) +([PyPI package information](https://pypi.org/project/django-markdown-view/)) +is a Django extension for serving [Markdown](/markdown.html) files as +[Django templates](/django-templates.html). The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/rgs258/django-markdown-view/blob/master/LICENSE). + +[**django-markdown-view / markdown_view / views.py**](https://github.com/rgs258/django-markdown-view/blob/master/markdown_view/./views.py) + +```python +# views.py +import logging + +import markdown +from django.conf import settings +from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin +~~from django.template import Engine, Template, Context +from django.utils.safestring import mark_safe +from django.views.generic import TemplateView + +from markdown_view.constants import ( + DEFAULT_MARKDOWN_VIEW_LOADERS, + DEFAULT_MARKDOWN_VIEW_EXTENSIONS, DEFAULT_MARKDOWN_VIEW_TEMPLATE, + DEFAULT_MARKDOWN_VIEW_USE_REQUEST_CONTEXT, DEFAULT_MARKDOWN_VIEW_EXTRA_CONTEXT, + DEFAULT_MARKDOWN_VIEW_TEMPLATE_USE_HIGHLIGHT_JS, DEFAULT_MARKDOWN_VIEW_TEMPLATE_USE_TOC, +) + +logger = logging.getLogger(__name__) + + +class MarkdownView(TemplateView): + file_name = None + + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(*args, **kwargs) + if self.file_name: + engine = Engine(loaders=getattr( + settings, "MARKDOWN_VIEW_LOADERS", DEFAULT_MARKDOWN_VIEW_LOADERS) + ) + template = engine.get_template(self.file_name) + md = markdown.Markdown(extensions=getattr( + settings, + "MARKDOWN_VIEW_EXTENSIONS", + DEFAULT_MARKDOWN_VIEW_EXTENSIONS + )) + template = Template( + "{{% load static %}}{}".format(md.convert(template.source)) + ) + render_context_base = {} + if getattr( + settings, + "MARKDOWN_VIEW_USE_REQUEST_CONTEXT", + DEFAULT_MARKDOWN_VIEW_USE_REQUEST_CONTEXT + ): + render_context_base = context +~~ render_context = Context({ + **render_context_base, + **(getattr( + settings, + "MARKDOWN_VIEW_EXTRA_CONTEXT", + DEFAULT_MARKDOWN_VIEW_EXTRA_CONTEXT + )) + }) + context.update({ + "markdown_content": mark_safe(template.render(render_context)), + "use_highlight_js": getattr( + settings, + "MARKDOWN_VIEW_TEMPLATE_USE_HIGHLIGHT_JS", + DEFAULT_MARKDOWN_VIEW_TEMPLATE_USE_HIGHLIGHT_JS + ), + "use_toc": False, + }) + + if getattr( + settings, + "MARKDOWN_VIEW_TEMPLATE_USE_TOC", + DEFAULT_MARKDOWN_VIEW_TEMPLATE_USE_TOC + ): + context.update({ + "markdown_toc": mark_safe(md.toc), + + +## ... source file continues with no further Context examples... + +``` + + +## Example 10 from django-smithy +[django-smithy](https://github.com/jamiecounsell/django-smithy) is +a [Django](/django.html) code library that allows users to send +HTTP requests from the Django admin user interface. The code for +the project is open source under the +[MIT license](https://github.com/jamiecounsell/django-smithy/blob/master/LICENSE). + +[**django-smithy / smithy / helpers.py**](https://github.com/jamiecounsell/django-smithy/blob/master/smithy/./helpers.py) + +```python +# helpers.py +~~from django.template import Template, Context +from requests_toolbelt.utils import dump + +def render_with_context(template, context): + template = Template(template) +~~ context = Context(context) + return template.render(context) + +def parse_dump_result(fun, obj): + prefixes = dump.PrefixSettings('', '') + try: + result = bytearray() + fun(obj, prefixes, result) + return result.decode('utf-8') + except Exception: + return "Could not parse request as a string" + + + +## ... source file continues with no further Context examples... + +``` + + +## Example 11 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / templatecolumn.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/templatecolumn.py) + +```python +# templatecolumn.py +~~from django.template import Context, Template +from django.template.loader import get_template +from django.utils.html import strip_tags + +from .base import Column, library + + +@library.register +class TemplateColumn(Column): + + empty_values = () + + def __init__(self, template_code=None, template_name=None, extra_context=None, **extra): + super().__init__(**extra) + self.template_code = template_code + self.template_name = template_name + self.extra_context = extra_context or {} + + if not self.template_code and not self.template_name: + raise ValueError("A template must be provided") + + def render(self, record, table, value, bound_column, **kwargs): +~~ context = getattr(table, "context", Context()) + additional_context = { + "default": bound_column.default, + "column": bound_column, + "record": record, + "value": value, + "row_counter": kwargs["bound_row"].row_counter, + } + additional_context.update(self.extra_context) + with context.update(additional_context): + if self.template_code: + return Template(self.template_code).render(context) + else: + return get_template(self.template_name).render(context.flatten()) + + def value(self, **kwargs): + html = super().value(**kwargs) + return strip_tags(html) if isinstance(html, str) else html + + + +## ... source file continues with no further Context examples... + +``` + diff --git a/content/pages/examples/django/django-template-defaultfilters-escape.markdown b/content/pages/examples/django/django-template-defaultfilters-escape.markdown new file mode 100644 index 000000000..b4a4d96b3 --- /dev/null +++ b/content/pages/examples/django/django-template-defaultfilters-escape.markdown @@ -0,0 +1,142 @@ +title: django.template.defaultfilters escape Example Code +category: page +slug: django-template-defaultfilters-escape-examples +sortorder: 500011383 +toc: False +sidebartitle: django.template.defaultfilters escape +meta: Python example code that shows how to use the escape callable from the django.template.defaultfilters module of the Django project. + + +`escape` is a callable within the `django.template.defaultfilters` module of the Django project. + +filesizeformat, +safe, +slugify, +striptags, +title, +and truncatechars +are several other callables with code examples from the same `django.template.defaultfilters` package. + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / pageadmin.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/pageadmin.py) + +```python +# pageadmin.py +import uuid + + +import django +from django.contrib.admin.helpers import AdminForm +from django.conf import settings +from django.urls import re_path +from django.contrib import admin, messages +from django.contrib.admin.models import LogEntry, CHANGE +from django.contrib.admin.options import IS_POPUP_VAR +from django.contrib.admin.utils import get_deleted_objects +from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.models import Site +from django.core.exceptions import (ObjectDoesNotExist, + PermissionDenied, ValidationError) +from django.db import router, transaction +from django.db.models import Q, Prefetch +from django.http import ( + HttpResponseRedirect, + HttpResponse, + Http404, + HttpResponseBadRequest, + HttpResponseForbidden, +) +from django.shortcuts import render, get_object_or_404 +~~from django.template.defaultfilters import escape +from django.template.loader import get_template +from django.template.response import SimpleTemplateResponse, TemplateResponse +from django.utils.encoding import force_text +from django.utils.translation import gettext, gettext_lazy as _, get_language +from django.utils.decorators import method_decorator +from django.views.decorators.http import require_POST +from django.http import QueryDict + +from cms import operations +from cms.admin.forms import ( + AddPageForm, + AddPageTypeForm, + AdvancedSettingsForm, + ChangePageForm, + ChangeListForm, + CopyPageForm, + CopyPermissionForm, + DuplicatePageForm, + MovePageForm, + PagePermissionForm, + PublicationDatesForm, +) +from cms.admin.permissionadmin import PERMISSION_ADMIN_INLINES +from cms.admin.placeholderadmin import PlaceholderAdminMixin + + +## ... source file abbreviated to get to escape examples ... + + + site = self.get_site(request) + language = get_site_language_from_request(request, site_id=site.pk) + languages = self._get_site_languages(request, obj) + context.update({ + 'language': language, + 'language_tabs': languages, + 'show_language_tabs': len(list(languages)) > 1 and not context.get('publishing_dates', False), + }) + return context + + def get_preserved_filters(self, request): + preserved_filters_encoded = super().get_preserved_filters(request) + preserved_filters = QueryDict(preserved_filters_encoded).copy() + lang = request.GET.get('language') + + if lang: + preserved_filters.update({ + 'language': lang + }) + + return preserved_filters.urlencode() + + def _get_404_exception(self, object_id): + exception = Http404(_('%(name)s object with primary key %(key)r does not exist.') % { + 'name': force_text(self.opts.verbose_name), +~~ 'key': escape(object_id), + }) + return exception + + def _has_add_permission_from_request(self, request): + site = self.get_site(request) + parent_node_id = request.GET.get('parent_node', None) + + if parent_node_id: + try: + parent_item = self.get_queryset(request).get(node=parent_node_id) + except self.model.DoesNotExist: + return False + else: + parent_item = None + + if parent_item: + has_perm = page_permissions.user_can_add_subpage( + request.user, + target=parent_item, + site=site, + ) + else: + has_perm = page_permissions.user_can_add_page(request.user, site=site) + return has_perm + + +## ... source file continues with no further escape examples... + +``` + diff --git a/content/pages/examples/django/django-template-defaultfilters-filesizeformat.markdown b/content/pages/examples/django/django-template-defaultfilters-filesizeformat.markdown new file mode 100644 index 000000000..6847f62c8 --- /dev/null +++ b/content/pages/examples/django/django-template-defaultfilters-filesizeformat.markdown @@ -0,0 +1,137 @@ +title: django.template.defaultfilters filesizeformat Example Code +category: page +slug: django-template-defaultfilters-filesizeformat-examples +sortorder: 500011384 +toc: False +sidebartitle: django.template.defaultfilters filesizeformat +meta: Python example code that shows how to use the filesizeformat callable from the django.template.defaultfilters module of the Django project. + + +`filesizeformat` is a callable within the `django.template.defaultfilters` module of the Django project. + +escape, +safe, +slugify, +striptags, +title, +and truncatechars +are several other callables with code examples from the same `django.template.defaultfilters` package. + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / images / fields.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/images/fields.py) + +```python +# fields.py +import os + +import willow + +from django.conf import settings +from django.core.exceptions import ValidationError +from django.forms.fields import ImageField +~~from django.template.defaultfilters import filesizeformat +from django.utils.translation import gettext_lazy as _ + + +ALLOWED_EXTENSIONS = ['gif', 'jpg', 'jpeg', 'png', 'webp'] +SUPPORTED_FORMATS_TEXT = _("GIF, JPEG, PNG, WEBP") + + +class WagtailImageField(ImageField): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.max_upload_size = getattr(settings, 'WAGTAILIMAGES_MAX_UPLOAD_SIZE', 10 * 1024 * 1024) + self.max_image_pixels = getattr(settings, 'WAGTAILIMAGES_MAX_IMAGE_PIXELS', 128 * 1000000) +~~ max_upload_size_text = filesizeformat(self.max_upload_size) + + if self.max_upload_size is not None: + self.help_text = _( + "Supported formats: %(supported_formats)s. Maximum filesize: %(max_upload_size)s." + ) % { + 'supported_formats': SUPPORTED_FORMATS_TEXT, + 'max_upload_size': max_upload_size_text, + } + else: + self.help_text = _( + "Supported formats: %(supported_formats)s." + ) % { + 'supported_formats': SUPPORTED_FORMATS_TEXT, + } + + self.error_messages['invalid_image_extension'] = _( + "Not a supported image format. Supported formats: %s." + ) % SUPPORTED_FORMATS_TEXT + + self.error_messages['invalid_image_known_format'] = _( + "Not a valid %s image." + ) + + self.error_messages['file_too_large'] = _( + + +## ... source file abbreviated to get to filesizeformat examples ... + + + def check_image_file_format(self, f): + extension = os.path.splitext(f.name)[1].lower()[1:] + + if extension not in ALLOWED_EXTENSIONS: + raise ValidationError(self.error_messages['invalid_image_extension'], code='invalid_image_extension') + + image_format = extension.upper() + if image_format == 'JPG': + image_format = 'JPEG' + + internal_image_format = f.image.format.upper() + if internal_image_format == 'MPO': + internal_image_format = 'JPEG' + + if internal_image_format != image_format: + raise ValidationError(self.error_messages['invalid_image_known_format'] % ( + image_format, + ), code='invalid_image_known_format') + + def check_image_file_size(self, f): + if self.max_upload_size is None: + return + + if f.size > self.max_upload_size: + raise ValidationError(self.error_messages['file_too_large'] % ( +~~ filesizeformat(f.size), + ), code='file_too_large') + + def check_image_pixel_size(self, f): + if self.max_image_pixels is None: + return + + image = willow.Image.open(f) + width, height = image.get_size() + frames = image.get_frame_count() + num_pixels = width * height * frames + + if num_pixels > self.max_image_pixels: + raise ValidationError(self.error_messages['file_too_many_pixels'] % ( + num_pixels + ), code='file_too_many_pixels') + + def to_python(self, data): + f = super().to_python(data) + + if f is not None: + self.check_image_file_size(f) + self.check_image_file_format(f) + self.check_image_pixel_size(f) + + + +## ... source file continues with no further filesizeformat examples... + +``` + diff --git a/content/pages/examples/django/django-template-defaultfilters-safe.markdown b/content/pages/examples/django/django-template-defaultfilters-safe.markdown new file mode 100644 index 000000000..b4b6211df --- /dev/null +++ b/content/pages/examples/django/django-template-defaultfilters-safe.markdown @@ -0,0 +1,102 @@ +title: django.template.defaultfilters safe Example Code +category: page +slug: django-template-defaultfilters-safe-examples +sortorder: 500011385 +toc: False +sidebartitle: django.template.defaultfilters safe +meta: Python example code that shows how to use the safe callable from the django.template.defaultfilters module of the Django project. + + +`safe` is a callable within the `django.template.defaultfilters` module of the Django project. + +escape, +filesizeformat, +slugify, +striptags, +title, +and truncatechars +are several other callables with code examples from the same `django.template.defaultfilters` package. + +## Example 1 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / gis / widgets.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/gis/widgets.py) + +```python +# widgets.py +from django.conf import settings +~~from django.template.defaultfilters import safe +from django.utils import translation + +import floppyforms as forms + +from urllib.parse import urlencode + +try: + from django.contrib.gis import gdal, geos +except ImportError: + + +__all__ = ('GeometryWidget', 'GeometryCollectionWidget', + 'PointWidget', 'MultiPointWidget', + 'LineStringWidget', 'MultiLineStringWidget', + 'PolygonWidget', 'MultiPolygonWidget', + 'BaseGeometryWidget', 'BaseMetacartaWidget', + 'BaseOsmWidget', 'BaseGMapWidget') + + +class BaseGeometryWidget(forms.Textarea): + display_wkt = False + map_width = 600 + map_height = 400 + map_srid = 4326 + + +## ... source file abbreviated to get to safe examples ... + + + map_srid = 3857 + template_name = 'floppyforms/gis/osm.html' + + class Media: + js = ( + 'floppyforms/openlayers/OpenLayers.js', + 'https://www.openstreetmap.org/openlayers/OpenStreetMap.js', + 'floppyforms/js/MapWidget.js', + ) + + +class BaseGMapWidget(BaseGeometryWidget): + map_srid = 3857 + template_name = 'floppyforms/gis/google.html' + google_maps_api_key = None + + @property + def media(self): + qs_dict = {'v': '3'} + if self.google_maps_api_key is not None: + qs_dict['key'] = self.google_maps_api_key + + js = ( + 'floppyforms/openlayers/OpenLayers.js', + 'floppyforms/js/MapWidget.js', +~~ safe('https://maps.google.com/maps/api/js?' + urlencode(qs_dict)) + ) + return forms.Media(js=js) + + + +## ... source file continues with no further safe examples... + +``` + diff --git a/content/pages/examples/django/django-template-defaultfilters-slugify.markdown b/content/pages/examples/django/django-template-defaultfilters-slugify.markdown new file mode 100644 index 000000000..ab2ba8cc6 --- /dev/null +++ b/content/pages/examples/django/django-template-defaultfilters-slugify.markdown @@ -0,0 +1,276 @@ +title: django.template.defaultfilters slugify Example Code +category: page +slug: django-template-defaultfilters-slugify-examples +sortorder: 500011386 +toc: False +sidebartitle: django.template.defaultfilters slugify +meta: Python example code that shows how to use the slugify callable from the django.template.defaultfilters module of the Django project. + + +`slugify` is a callable within the `django.template.defaultfilters` module of the Django project. + +escape, +filesizeformat, +safe, +striptags, +title, +and truncatechars +are several other callables with code examples from the same `django.template.defaultfilters` package. + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_pool.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_pool.py) + +```python +# plugin_pool.py +from operator import attrgetter + +from django.core.exceptions import ImproperlyConfigured +from django.urls import re_path, include +~~from django.template.defaultfilters import slugify +from django.utils.encoding import force_text +from django.utils.functional import cached_property +from django.utils.module_loading import autodiscover_modules +from django.utils.translation import get_language, deactivate_all, activate +from django.template import TemplateDoesNotExist, TemplateSyntaxError + +from cms.exceptions import PluginAlreadyRegistered, PluginNotRegistered +from cms.plugin_base import CMSPluginBase +from cms.utils.conf import get_cms_setting +from cms.utils.helpers import normalize_name + + +class PluginPool: + + def __init__(self): + self.plugins = {} + self.discovered = False + + def _clear_cached(self): + if 'registered_plugins' in self.__dict__: + del self.__dict__['registered_plugins'] + + if 'plugins_with_extra_menu' in self.__dict__: + del self.__dict__['plugins_with_extra_menu'] + + +## ... source file abbreviated to get to slugify examples ... + + + if placeholder: + plugins = (plugin for plugin in plugins + if not plugin.requires_parent_plugin(placeholder, page)) + return sorted(plugins, key=attrgetter('module')) + + def get_text_enabled_plugins(self, placeholder, page): + plugins = set(self.get_all_plugins(placeholder, page)) + plugins.update(self.get_all_plugins(placeholder, page, 'text_only_plugins')) + return sorted((p for p in plugins if p.text_enabled), + key=attrgetter('module', 'name')) + + def get_plugin(self, name): + self.discover_plugins() + return self.plugins[name] + + def get_patterns(self): + self.discover_plugins() + + lang = get_language() + deactivate_all() + + try: + url_patterns = [] + for plugin in self.registered_plugins: + p = plugin() +~~ slug = slugify(force_text(normalize_name(p.__class__.__name__))) + url_patterns += [ + re_path(r'^plugin/%s/' % (slug,), include(p.plugin_urls)), + ] + finally: + activate(lang) + + return url_patterns + + def get_system_plugins(self): + self.discover_plugins() + return [plugin.__name__ for plugin in self.plugins.values() if plugin.system] + + @cached_property + def registered_plugins(self): + return self.get_all_plugins() + + @cached_property + def plugins_with_extra_menu(self): + plugin_classes = [cls for cls in self.registered_plugins + if cls._has_extra_plugin_menu_items] + return plugin_classes + + @cached_property + def plugins_with_extra_placeholder_menu(self): + + +## ... source file continues with no further slugify examples... + +``` + + +## Example 2 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / utils / files.py**](https://github.com/divio/django-filer/blob/develop/filer/utils/files.py) + +```python +# files.py +from __future__ import absolute_import, unicode_literals + +import mimetypes +import os + +from django.http.multipartparser import ( + ChunkIter, SkipFile, StopFutureHandlers, StopUpload, exhaust, +) +~~from django.template.defaultfilters import slugify as slugify_django +from django.utils.encoding import force_text +from django.utils.text import get_valid_filename as get_valid_filename_django + +from unidecode import unidecode + + +class UploadException(Exception): + pass + + +def handle_upload(request): + if not request.method == "POST": + raise UploadException("AJAX request not valid: must be POST") + if request.is_ajax(): + is_raw = True + filename = request.GET.get('qqfile', False) or request.GET.get('filename', False) or '' + + try: + content_length = int(request.META['CONTENT_LENGTH']) + except (IndexError, TypeError, ValueError): + content_length = None + + if content_length < 0: + raise UploadException("Invalid content length: %r" % content_length) + + +## ... source file abbreviated to get to slugify examples ... + + + for i, handler in enumerate(upload_handlers): + file_obj = handler.file_complete(counters[i]) + if file_obj: + upload = file_obj + break + else: + if len(request.FILES) == 1: + upload, filename, is_raw, mime_type = handle_request_files_upload(request) + else: + raise UploadException("AJAX request not valid: Bad Upload") + return upload, filename, is_raw, mime_type + + +def handle_request_files_upload(request): + is_raw = False + upload = list(request.FILES.values())[0] + filename = upload.name + _, iext = os.path.splitext(filename) + mime_type = upload.content_type.lower() + if iext not in mimetypes.guess_all_extensions(mime_type): + msg = "MIME-Type '{mimetype}' does not correspond to file extension of {filename}." + raise UploadException(msg.format(mimetype=mime_type, filename=filename)) + return upload, filename, is_raw, mime_type + + +~~def slugify(string): + return slugify_django(unidecode(force_text(string))) + + +def get_valid_filename(s): + s = get_valid_filename_django(s) + filename, ext = os.path.splitext(s) +~~ filename = slugify(filename) +~~ ext = slugify(ext) + if ext: + return "%s.%s" % (filename, ext) + else: + return "%s" % (filename,) + + + +## ... source file continues with no further slugify examples... + +``` + + +## Example 3 from gadget-board +[gadget-board](https://github.com/mik4el/gadget-board) is a +[Django](/django.html), +[Django REST Framework (DRF)](/django-rest-framework-drf.html) and +[Angular](/angular.html) web application that is open source under the +[Apache2 license](https://github.com/mik4el/gadget-board/blob/master/LICENSE). + +[**gadget-board / web / gadgets / models.py**](https://github.com/mik4el/gadget-board/blob/master/web/gadgets/models.py) + +```python +# models.py +from django.db import models +from django.contrib.postgres.fields import JSONField +~~from django.template.defaultfilters import slugify +from authentication.models import Account + + +class Gadget(models.Model): + name = models.CharField(max_length=40, unique=True) + slug = models.SlugField(null=True, blank=True) + description = models.TextField() + users_can_upload = models.ManyToManyField(Account) + image_name = models.CharField(max_length=140, blank=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + @property + def image_url(self): + if self.image_name != "": + return "backend/static/media/{}".format(self.image_name) + else: + return "backend/static/dashboard_icon_big.png" + + def __str__(self): + return self.name + + def save(self, *args, **kwargs): + if not self.id: +~~ self.slug = slugify(self.name) + + super(Gadget, self).save(*args, **kwargs) + + +class GadgetData(models.Model): + gadget = models.ForeignKey(Gadget, db_index=True, on_delete=models.DO_NOTHING) # Add index on filtered fields + data = JSONField() + added_by = models.ForeignKey(Account, on_delete=models.DO_NOTHING) + timestamp = models.DateTimeField(null=True, blank=True, db_index=True) # Add index on filtered fields + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return '{} {} {}'.format(self.gadget, self.timestamp, self.added_by) + + + +## ... source file continues with no further slugify examples... + +``` + diff --git a/content/pages/examples/django/django-template-defaultfilters-striptags.markdown b/content/pages/examples/django/django-template-defaultfilters-striptags.markdown new file mode 100644 index 000000000..5d837a866 --- /dev/null +++ b/content/pages/examples/django/django-template-defaultfilters-striptags.markdown @@ -0,0 +1,159 @@ +title: django.template.defaultfilters striptags Example Code +category: page +slug: django-template-defaultfilters-striptags-examples +sortorder: 500011387 +toc: False +sidebartitle: django.template.defaultfilters striptags +meta: Python example code that shows how to use the striptags callable from the django.template.defaultfilters module of the Django project. + + +`striptags` is a callable within the `django.template.defaultfilters` module of the Django project. + +escape, +filesizeformat, +safe, +slugify, +title, +and truncatechars +are several other callables with code examples from the same `django.template.defaultfilters` package. + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / templatetags / wiki_tags.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/templatetags/wiki_tags.py) + +```python +# wiki_tags.py +import re +from urllib.parse import quote as urlquote + +from django import template +from django.apps import apps +from django.conf import settings as django_settings +from django.contrib.contenttypes.models import ContentType +from django.db.models import Model +from django.forms import BaseForm +~~from django.template.defaultfilters import striptags +from django.utils.safestring import mark_safe +from wiki import models +from wiki.conf import settings +from wiki.core.plugins import registry as plugin_registry + +register = template.Library() + + +_cache = {} + + +@register.simple_tag(takes_context=True) +def article_for_object(context, obj): + if not isinstance(obj, Model): + raise TypeError( + "A Wiki article can only be associated to a Django Model " + "instance, not %s" % type(obj) + ) + + content_type = ContentType.objects.get_for_model(obj) + + if True or obj not in _cache: + try: + article = models.ArticleForObject.objects.get( + + +## ... source file abbreviated to get to striptags examples ... + + +@register.inclusion_tag("wiki/includes/form.html", takes_context=True) +def wiki_form(context, form_obj): + if not isinstance(form_obj, BaseForm): + raise TypeError( + "Error including form, it's not a form, it's a %s" % type(form_obj) + ) + context.update({"form": form_obj}) + return context + + +@register.inclusion_tag("wiki/includes/messages.html", takes_context=True) +def wiki_messages(context): + + messages = context.get("messages", []) + for message in messages: + message.css_class = settings.MESSAGE_TAG_CSS_CLASS[message.level] + context.update({"messages": messages}) + return context + + +@register.filter +def get_content_snippet(content, keyword, max_words=30): + + def clean_text(content): + +~~ content = striptags(content) + words = content.split() + + return words + + max_words = int(max_words) + + match_position = content.lower().find(keyword.lower()) + + if match_position != -1: + try: + match_start = content.rindex(" ", 0, match_position) + 1 + except ValueError: + match_start = 0 + try: + match_end = content.index(" ", match_position + len(keyword)) + except ValueError: + match_end = len(content) + all_before = clean_text(content[:match_start]) + match = content[match_start:match_end] + all_after = clean_text(content[match_end:]) + before_words = all_before[-max_words // 2 :] + after_words = all_after[: max_words - len(before_words)] + before = " ".join(before_words) + after = " ".join(after_words) +~~ html = ("%s %s %s" % (before, striptags(match), after)).strip() + kw_p = re.compile(r"(\S*%s\S*)" % keyword, re.IGNORECASE) + html = kw_p.sub(r"\1", html) + + return mark_safe(html) + + return " ".join(clean_text(content)[:max_words]) + + +@register.filter +def can_read(obj, user): + return obj.can_read(user) + + +@register.filter +def can_write(obj, user): + return obj.can_write(user) + + +@register.filter +def can_delete(obj, user): + return obj.can_delete(user) + + +@register.filter + + +## ... source file continues with no further striptags examples... + +``` + diff --git a/content/pages/examples/django/django-template-defaultfilters-title.markdown b/content/pages/examples/django/django-template-defaultfilters-title.markdown new file mode 100644 index 000000000..97ac646e7 --- /dev/null +++ b/content/pages/examples/django/django-template-defaultfilters-title.markdown @@ -0,0 +1,124 @@ +title: django.template.defaultfilters title Example Code +category: page +slug: django-template-defaultfilters-title-examples +sortorder: 500011388 +toc: False +sidebartitle: django.template.defaultfilters title +meta: Python example code that shows how to use the title callable from the django.template.defaultfilters module of the Django project. + + +`title` is a callable within the `django.template.defaultfilters` module of the Django project. + +escape, +filesizeformat, +safe, +slugify, +striptags, +and truncatechars +are several other callables with code examples from the same `django.template.defaultfilters` package. + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / models / placeholdermodel.py**](https://github.com/divio/django-cms/blob/develop/cms/models/placeholdermodel.py) + +```python +# placeholdermodel.py + +import warnings + +from datetime import datetime, timedelta + +from django.contrib import admin +from django.db import models +~~from django.template.defaultfilters import title +from django.utils.encoding import force_text +from django.utils.translation import gettext_lazy as _ + +from cms.cache.placeholder import clear_placeholder_cache +from cms.exceptions import LanguageError +from cms.utils import get_site_id +from cms.utils.i18n import get_language_object +from cms.utils.urlutils import admin_reverse +from cms.constants import ( + EXPIRE_NOW, + MAX_EXPIRATION_TTL, + PUBLISHER_STATE_DIRTY, +) +from cms.utils import get_language_from_request +from cms.utils import permissions +from cms.utils.conf import get_cms_setting + + +class Placeholder(models.Model): + slot = models.CharField(_("slot"), max_length=255, db_index=True, editable=False) + default_width = models.PositiveSmallIntegerField(_("width"), null=True, editable=False) + cache_placeholder = True + is_static = False + is_editable = True + + +## ... source file abbreviated to get to title examples ... + + + slot=self.slot, + location=hex(id(self)), + ) + return display + + def clear(self, language=None): + if language: + qs = self.cmsplugin_set.filter(language=language) + else: + qs = self.cmsplugin_set.all() + qs = qs.order_by('-depth').select_related() + for plugin in qs: + inst, cls = plugin.get_plugin_instance() + if inst and getattr(inst, 'cmsplugin_ptr', False): + inst.cmsplugin_ptr._no_reorder = True + inst._no_reorder = True + inst.delete(no_mp=True) + else: + plugin._no_reorder = True + plugin.delete(no_mp=True) + + def get_label(self): + from cms.utils.placeholder import get_placeholder_conf + + template = self.page.get_template() if self.page else None +~~ name = get_placeholder_conf("name", self.slot, template=template, default=title(self.slot)) + name = _(name) + return name + + def get_extra_context(self, template=None): + from cms.utils.placeholder import get_placeholder_conf + return get_placeholder_conf("extra_context", self.slot, template, {}) + + def get_add_url(self): + return self._get_url('add_plugin') + + def get_edit_url(self, plugin_pk): + return self._get_url('edit_plugin', plugin_pk) + + def get_move_url(self): + return self._get_url('move_plugin') + + def get_delete_url(self, plugin_pk): + return self._get_url('delete_plugin', plugin_pk) + + def get_changelist_url(self): + return self._get_url('changelist') + + def get_clear_url(self): + return self._get_url('clear_placeholder', self.pk) + + +## ... source file continues with no further title examples... + +``` + diff --git a/content/pages/examples/django/django-template-defaultfilters-truncatechars.markdown b/content/pages/examples/django/django-template-defaultfilters-truncatechars.markdown new file mode 100644 index 000000000..96cc9ffa6 --- /dev/null +++ b/content/pages/examples/django/django-template-defaultfilters-truncatechars.markdown @@ -0,0 +1,223 @@ +title: django.template.defaultfilters truncatechars Example Code +category: page +slug: django-template-defaultfilters-truncatechars-examples +sortorder: 500011389 +toc: False +sidebartitle: django.template.defaultfilters truncatechars +meta: Python example code that shows how to use the truncatechars callable from the django.template.defaultfilters module of the Django project. + + +`truncatechars` is a callable within the `django.template.defaultfilters` module of the Django project. + +escape, +filesizeformat, +safe, +slugify, +striptags, +and title +are several other callables with code examples from the same `django.template.defaultfilters` package. + +## Example 1 from django-appmail +[Django-Appmail](https://github.com/yunojuno/django-appmail) +([PyPI package information](https://pypi.org/project/django-appmail/)) +is a [Django](/django.html) app for handling transactional email templates. +While the project began development as a way to work with the Mandrill +transactional [API](/application-programming-interfaces.html), it is +not exclusive to that API. The project simply provides a way to store +and render email content. The library does not send or receive emails. + +Django-Appmail is open sourced under the +[MIT license](https://github.com/yunojuno/django-appmail/blob/master/LICENSE). + +[**django-appmail / appmail / admin.py**](https://github.com/yunojuno/django-appmail/blob/master/appmail/./admin.py) + +```python +# admin.py +from __future__ import annotations + +import json +from typing import Optional, Tuple + +from django.contrib import admin, messages +from django.core.exceptions import ValidationError +from django.db.models.query import QuerySet +from django.http import HttpRequest, HttpResponseRedirect +~~from django.template.defaultfilters import truncatechars +from django.urls import reverse +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _lazy + +from .compat import JSONField +from .forms import JSONWidget +from .models import EmailTemplate, LoggedMessage + + +class ValidTemplateListFilter(admin.SimpleListFilter): + + title = _lazy("Is valid") + parameter_name = "valid" + + def lookups( + self, request: HttpRequest, model_admin: admin.ModelAdmin + ) -> Tuple[Tuple[str, str], Tuple[str, str]]: + return (("1", _lazy("True")), ("0", _lazy("False"))) + + def queryset(self, request: HttpRequest, queryset: QuerySet) -> QuerySet: + valid_ids = [] + invalid_ids = [] + for obj in queryset: + + +## ... source file abbreviated to get to truncatechars examples ... + + + + exclude = ("html", "context") + + formfield_overrides = {JSONField: {"widget": JSONWidget}} + + list_display = ("to", "template_name", "_subject", "timestamp") + + list_filter = ("timestamp", "template__name", "template__language") + + raw_id_fields = ("user", "template") + + readonly_fields = ( + "to", + "user", + "template", + "template_context", + "subject", + "body", + "render_html", + "timestamp", + ) + + search_fields = ("to", "subject") + + def _subject(self, obj: LoggedMessage) -> str: +~~ return truncatechars(obj.subject, 50) + + def template_name(self, obj: LoggedMessage) -> str: + return obj.template.name + + def template_context(self, obj: LoggedMessage) -> str: + return self.pretty_print(obj.context) + + def render_html(self, obj: LoggedMessage) -> str: + if obj.id is None: + url = "" + else: + url = reverse( + "appmail:render_message_body_html", kwargs={"email_id": obj.id} + ) + return self.iframe(url) + + render_html.short_description = "HTML (rendered)" # type: ignore + render_html.allow_tags = True # type: ignore + + + +## ... source file continues with no further truncatechars examples... + +``` + + +## Example 2 from elasticsearch-django +[elasticsearch-django](https://github.com/yunojuno/elasticsearch-django) +([PyPI package information](https://pypi.org/project/elasticsearch-django/)) +is a [Django](/django.html) app for managing +[ElasticSearch](https://github.com/elastic/elasticsearch) indexes +populated by [Django ORM](/django-orm.html) models. The project is +available as open source under the +[MIT license](https://github.com/yunojuno/elasticsearch-django/blob/master/LICENSE). + +[**elasticsearch-django / elasticsearch_django / admin.py**](https://github.com/yunojuno/elasticsearch-django/blob/master/elasticsearch_django/./admin.py) + +```python +# admin.py +import logging + +import simplejson as json # simplejson supports Decimal serialization +from django.contrib import admin +~~from django.template.defaultfilters import truncatechars, truncatewords +from django.utils.safestring import mark_safe + +from .models import SearchQuery + +logger = logging.getLogger(__name__) + + +def pprint(data: dict) -> str: + pretty = json.dumps(data, sort_keys=True, indent=4, separators=(",", ": ")) + html = pretty.replace(" ", " ").replace("\n", "
    ") + return mark_safe("%s" % html) + + +class SearchQueryAdmin(admin.ModelAdmin): + + list_display = ( + "id", + "user", + "search_terms_display", + "total_hits_display", + "returned_", + "min_", + "max_", + "reference", + "executed_at", + ) + list_filter = ("index", "query_type") + search_fields = ("search_terms", "user__first_name", "user__last_name", "reference") + exclude = ("hits", "aggregations", "query", "page", "total_hits_") + readonly_fields = ( + "user", + "index", + "search_terms", + "query_type", + "total_hits", + "total_hits_relation", + "returned_", + "min_", + "max_", + "duration", + "query_", + "hits_", + "aggregations_", + "executed_at", + ) + + def search_terms_display(self, instance: SearchQuery) -> str: + raw = instance.search_terms +~~ return truncatechars(truncatewords(raw, 5), 50) + + def query_(self, instance: SearchQuery) -> str: + return pprint(instance.query) + + def max_(self, instance: SearchQuery) -> str: + return "-" if instance.page_size == 0 else str(instance.max_score) + + max_.short_description = "Max score" # type: ignore + + def min_(self, instance: SearchQuery) -> str: + return "-" if instance.page_size == 0 else str(instance.min_score) + + min_.short_description = "Min score" # type: ignore + + def total_hits_display(self, instance: SearchQuery) -> str: + if instance.total_hits_relation == SearchQuery.TotalHitsRelation.ESTIMATE: + return f"{instance.total_hits}*" + return f"{instance.total_hits}" + + def returned_(self, instance: SearchQuery) -> str: + if instance.page_size == 0: + return "-" + return "%i - %i" % (instance.page_from, instance.page_to) + + + +## ... source file continues with no further truncatechars examples... + +``` + From 2498b2b539acc1e59d7f4e461601d5b38c2098f9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 30 Jan 2021 11:37:25 -0500 Subject: [PATCH 251/302] add new django extension --- .../django/django-extensions-plug-ins.markdown | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 743e55411..632cde7da 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -333,6 +333,18 @@ The django-jsonfield project is open source under the [MIT license](https://github.com/dmkoch/django-jsonfield/blob/master/LICENSE). +### django-linear-migrations +[django-linear-migrations](https://github.com/adamchainz/django-linear-migrations) +([PyPI package information](https://pypi.org/project/django-linear-migrations/)) +is a [Django](/django.html) code library to mitigate conflicting database +migrations, which can cause non-deterministic behavior in different +environments. The +[introductory blog post by the package author](https://adamj.eu/tech/2020/12/10/introducing-django-linear-migrations/) +does a good job of explaining the problem and how this library prevents +the issue. This library is open sourced under the +[MIT license](https://github.com/adamchainz/django-linear-migrations/blob/master/LICENSE). + + ### django-loginas [django-loginas](https://github.com/skorokithakis/django-loginas) ([PyPI package information](https://pypi.org/project/django-loginas/)) @@ -608,6 +620,7 @@ can cause problems if they vary from the expected versions. django-version-checks is provided as open source under the [MIT license](https://github.com/adamchainz/django-version-checks/blob/master/LICENSE). + ### django-webshell [django-webshell](https://github.com/onrik/django-webshell) is an extension for executing arbitrary code in the From 58e639147b4fe50c2e5d8e41c7aa107cd769aa53 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 2 Feb 2021 06:41:55 -0500 Subject: [PATCH 252/302] new examples pages and new web frameworks resource --- .../01-web-frameworks.markdown | 20 +- ...ango-template-loader-get-template.markdown | 469 ++++++ ...-template-loader-render-to-string.markdown | 1293 +++++++++++++++++ ...o-template-loader-select-template.markdown | 124 ++ ...go-template-loader-tags-blocknode.markdown | 192 +++ ...-template-loader-tags-extendsnode.markdown | 188 +++ ...-template-loader-tags-includenode.markdown | 124 ++ .../django/django-template-loader.markdown | 1119 ++++++++++++++ ...emplate-loaders-filesystem-loader.markdown | 59 + theme/templates/code-examples/django.html | 25 + 10 files changed, 3609 insertions(+), 4 deletions(-) create mode 100644 content/pages/examples/django/django-template-loader-get-template.markdown create mode 100644 content/pages/examples/django/django-template-loader-render-to-string.markdown create mode 100644 content/pages/examples/django/django-template-loader-select-template.markdown create mode 100644 content/pages/examples/django/django-template-loader-tags-blocknode.markdown create mode 100644 content/pages/examples/django/django-template-loader-tags-extendsnode.markdown create mode 100644 content/pages/examples/django/django-template-loader-tags-includenode.markdown create mode 100644 content/pages/examples/django/django-template-loader.markdown create mode 100644 content/pages/examples/django/django-template-loaders-filesystem-loader.markdown diff --git a/content/pages/04-web-development/01-web-frameworks.markdown b/content/pages/04-web-development/01-web-frameworks.markdown index ef862c747..2adde9c83 100644 --- a/content/pages/04-web-development/01-web-frameworks.markdown +++ b/content/pages/04-web-development/01-web-frameworks.markdown @@ -90,15 +90,15 @@ but it'll make most developers' lives easier in many cases. ### Comparing web frameworks +[Talk Python to Me had a podcast episode](https://talkpython.fm/episodes/show/149/4-python-web-frameworks-compared) +with a detailed comparison of the [Django](/django.html), +[Flask](/flask.html), Tornado and [Pyramid](/pyramid.html) frameworks. + Are you curious about how the code in a Django project is structured compared with Flask? Check out [this Django web application tutorial](https://www.twilio.com/docs/sms/tutorials/appointment-reminders-python-django) and then view [the same application built with Flask](https://www.twilio.com/docs/sms/tutorials/appointment-reminders-python-flask). -[Talk Python to Me had a podcast episode](https://talkpython.fm/episodes/show/149/4-python-web-frameworks-compared) -with a detailed comparison of the [Django](/django.html), -[Flask](/flask.html), Tornado and [Pyramid](/pyramid.html) frameworks. - There is also a repository called [compare-python-web-frameworks](https://github.com/mattmakai/compare-python-web-frameworks) where the same web application is being coded with varying Python web @@ -112,6 +112,18 @@ frameworks, templating engines and and the many other pieces that combine to make web frameworks useful to web developers. +* [12 requests per second](https://suade.org/dev/12-requests-per-second-with-python/) + examines how the traditionally synchronous web framework + [Flask](/flask.html) compares to an async framework like + [Sanic](/sanic.html) in an artificial, simple benchmark. The + results make it look like Sanic is far faster than Flask, but + once you add even a basic amount of functionality to a + project, including [databasel](/databases.html) queries + and templating, the results even out. Miguel Grinberg + also has a great read with broader results in this + article asking readers to + [Ignore All Web Performance Benchmarks, Including This One](https://blog.miguelgrinberg.com/post/ignore-all-web-performance-benchmarks-including-this-one). + * When you are learning how to use one or more web frameworks it's helpful to have an idea of what the code under the covers is doing. This post on building a diff --git a/content/pages/examples/django/django-template-loader-get-template.markdown b/content/pages/examples/django/django-template-loader-get-template.markdown new file mode 100644 index 000000000..1665b4ca0 --- /dev/null +++ b/content/pages/examples/django/django-template-loader-get-template.markdown @@ -0,0 +1,469 @@ +title: django.template.loader get_template Example Code +category: page +slug: django-template-loader-get-template-examples +sortorder: 500011392 +toc: False +sidebartitle: django.template.loader get_template +meta: Python example code that shows how to use the get_template callable from the django.template.loader module of the Django project. + + +`get_template` is a callable within the `django.template.loader` module of the Django project. + +render_to_string +and +select_template +are a couple of other callables within the `django.template.loader` package that also have code examples. + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair_mail / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair_mail/views.py) + +```python +# views.py +from django.contrib import messages +from django.http import JsonResponse, HttpResponse +from django.shortcuts import render, get_object_or_404, redirect +~~from django.template.loader import get_template +from django.urls import reverse +from django.utils import timezone +from django.views.decorators.http import require_GET, require_POST + +from conferences.utilities import validate_chair_access +from chair_mail.context import USER_VARS, CONFERENCE_VARS, SUBMISSION_VARS, \ + FRAME_VARS +from chair_mail.forms import EmailFrameUpdateForm, EmailFrameTestForm, \ + MessageForm, get_preview_form_class, EditNotificationForm, \ + UpdateNotificationStateForm +from chair_mail.mailing_lists import ALL_LISTS +from chair_mail.models import EmailSettings, EmailFrame, EmailMessage, \ + GroupMessage, MSG_TYPE_USER, MSG_TYPE_SUBMISSION, get_group_message_model, \ + get_message_leaf_model, SystemNotification, DEFAULT_NOTIFICATIONS_DATA +from chair_mail.utility import get_email_frame, get_email_frame_or_404, \ + reverse_preview_url, reverse_list_objects_url, get_object_name, \ + get_object_url +from conferences.models import Conference + + +def _get_grouped_vars(msg_type): + if msg_type == MSG_TYPE_USER: + return ( + ('Conference variables', CONFERENCE_VARS), + + +## ... source file abbreviated to get to get_template examples ... + + + ('Submission variables', SUBMISSION_VARS), + ) + raise ValueError(f'unrecognized message type "{msg_type}"') + + +@require_GET +def overview(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + frame = get_email_frame(conference) + return render(request, 'chair_mail/tab_pages/overview.html', context={ + 'conference': conference, + 'frame': frame, + 'active_tab': 'overview', + }) + + +@require_POST +def create_frame(request, conf_pk): + conference = get_object_or_404(Conference, pk=conf_pk) + validate_chair_access(request.user, conference) + if not hasattr(conference, 'email_settings'): + EmailSettings.objects.create(conference=conference) + email_settings = conference.email_settings + frame = email_settings.frame +~~ template_html = get_template( + 'chair_mail/email/default_frame_html.html').template +~~ template_plain = get_template( + 'chair_mail/email/default_frame_plain.txt').template + if frame: + frame.text_html = template_html.source + frame.text_plain = template_plain.source + frame.created_at = timezone.now() + frame.updated_at = timezone.now() + frame.created_by = request.user + frame.save() + messages.success(request, 'Reset existing frame') + else: + frame = EmailFrame.objects.create( + conference=conference, + created_by=request.user, + text_plain=template_plain.source, + text_html=template_html.source, + ) + email_settings.frame = frame + email_settings.save() + messages.success(request, 'Created new template') + + default_next = reverse('chair_mail:overview', kwargs={'conf_pk': conf_pk}) + next_url = request.GET.get('next', default_next) + return redirect(next_url) + + + +## ... source file continues with no further get_template examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / templates.py**](https://github.com/divio/django-cms/blob/develop/cms/./templates.py) + +```python +# templates.py +~~from django.template.loader import get_template +from django.utils.functional import cached_property + + +class TemplatesCache: + + def __init__(self): + self._cached_templates = {} + + def get_cached_template(self, template): + if hasattr(template, 'render'): + return template + + if not template in self._cached_templates: +~~ self._cached_templates[template] = get_template(template) + return self._cached_templates[template] + + @cached_property + def drag_item_template(self): +~~ return get_template('cms/toolbar/dragitem.html') + + @cached_property + def placeholder_plugin_menu_template(self): +~~ return get_template('cms/toolbar/dragitem_menu.html') + + @cached_property + def dragbar_template(self): +~~ return get_template('cms/toolbar/dragbar.html') + + + +## ... source file continues with no further get_template examples... + +``` + + +## Example 3 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / compat.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./compat.py) + +```python +# compat.py +from contextlib import contextmanager + +import django +from django.template import Context +from django.utils.datastructures import MultiValueDict + +MULTIVALUE_DICT_TYPES = (MultiValueDict,) + + +REQUIRED_CONTEXT_ATTRIBTUES = ( + '_form_config', + '_form_render', +) + + +class DictContext(dict): + pass + + +if django.VERSION < (1, 8): +~~ def get_template(context, template_name): +~~ from django.template.loader import get_template +~~ return get_template(template_name) + + def get_context(context): + if not isinstance(context, Context): + context = Context(context) + return context + +else: +~~ def get_template(context, template_name): + return context.template.engine.get_template(template_name) + + def get_context(context): + return context + + +def flatten_context(context): + if isinstance(context, Context): + flat = {} + for d in context.dicts: + flat.update(d) + return flat + else: + return context + + +def flatten_contexts(*contexts): + new_context = DictContext() + for context in contexts: + if context is not None: + new_context.update(flatten_context(context)) + for attr in REQUIRED_CONTEXT_ATTRIBTUES: + if hasattr(context, attr): + setattr(new_context, attr, getattr(context, attr)) + + +## ... source file continues with no further get_template examples... + +``` + + +## Example 4 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / sitetreeapp.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./sitetreeapp.py) + +```python +# sitetreeapp.py +import warnings +from collections import defaultdict +from copy import deepcopy +from inspect import getfullargspec +from sys import exc_info +from threading import local +from typing import Callable, List, Optional, Dict, Union, Sequence, Any, Tuple + +from django.conf import settings +from django.core.cache import caches +from django.db.models import signals, QuerySet +from django.template.base import ( + FilterExpression, Lexer, Parser, Variable, VariableDoesNotExist, VARIABLE_TAG_START) +from django.template.context import Context +~~from django.template.loader import get_template +from django.urls import reverse, NoReverseMatch +from django.utils import module_loading +from django.utils.encoding import iri_to_uri +from django.utils.translation import get_language + +from .compat import TOKEN_TEXT, TOKEN_VAR +from .exceptions import SiteTreeError +from .settings import ( + ALIAS_TRUNK, ALIAS_THIS_CHILDREN, ALIAS_THIS_SIBLINGS, ALIAS_THIS_PARENT_SIBLINGS, ALIAS_THIS_ANCESTOR_CHILDREN, + UNRESOLVED_ITEM_MARKER, RAISE_ITEMS_ERRORS_ON_DEBUG, CACHE_TIMEOUT, CACHE_NAME, DYNAMIC_ONLY, ADMIN_APP_NAME, + SITETREE_CLS) +from .utils import get_tree_model, get_tree_item_model, import_app_sitetree_module, generate_id_for + +if False: # pragma: nocover + from django.contrib.auth.models import User # noqa + from .models import TreeItemBase, TreeBase + +TypeDynamicTrees = Dict[str, Union[Dict[str, List['TreeBase']], List['TreeBase']]] + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + +_ITEMS_PROCESSOR: Optional[Callable] = None + + +## ... source file abbreviated to get to get_template examples ... + + + return [] + + tree_items = self.filter_items(self.get_children(tree_alias, None), 'sitetree') + tree_items = self.apply_hook(tree_items, 'sitetree') + self.update_has_children(tree_alias, tree_items, 'sitetree') + + return tree_items + + def children( + self, + parent_item: 'TreeItemBase', + navigation_type: str, + use_template: str, + context: Context + ) -> str: + parent_item = self.resolve_var(parent_item, context) + tree_alias, tree_items = self.get_sitetree(parent_item.tree.alias) + + self.tree_climber(tree_alias, self.get_tree_current_item(tree_alias)) + + tree_items = self.get_children(tree_alias, parent_item) + tree_items = self.filter_items(tree_items, navigation_type) + tree_items = self.apply_hook(tree_items, f'{navigation_type}.children') + self.update_has_children(tree_alias, tree_items, navigation_type) + +~~ my_template = get_template(use_template) + + context.push() + context['sitetree_items'] = tree_items + rendered = my_template.render(context.flatten()) + context.pop() + + return rendered + + def get_children(self, tree_alias: str, item: Optional['TreeItemBase']) -> List['TreeItemBase']: + if not self._current_app_is_admin: + tree_alias = self.resolve_tree_i18n_alias(tree_alias) + + return self.cache.get_entry('parents', tree_alias)[item] + + def update_has_children(self, tree_alias: str, tree_items: List['TreeItemBase'], navigation_type: str): + get_children = self.get_children + filter_items = self.filter_items + apply_hook = self.apply_hook + + for tree_item in tree_items: + children = get_children(tree_alias, tree_item) + children = filter_items(children, navigation_type) + children = apply_hook(children, f'{navigation_type}.has_children') + tree_item.has_children = len(children) > 0 + + +## ... source file continues with no further get_template examples... + +``` + + +## Example 5 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / tables.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/./tables.py) + +```python +# tables.py +import copy +from collections import OrderedDict +from itertools import count + +from django.conf import settings +from django.core.paginator import Paginator +from django.db import models +~~from django.template.loader import get_template +from django.utils.encoding import force_str + +from . import columns +from .config import RequestConfig +from .data import TableData +from .rows import BoundRows +from .utils import Accessor, AttributeDict, OrderBy, OrderByTuple, Sequence + + +class DeclarativeColumnsMetaclass(type): + + def __new__(mcs, name, bases, attrs): + attrs["_meta"] = opts = TableOptions(attrs.get("Meta", None), name) + + cols, remainder = [], {} + for attr_name, attr in attrs.items(): + if isinstance(attr, columns.Column): + attr._explicit = True + cols.append((attr_name, attr)) + else: + remainder[attr_name] = attr + attrs = remainder + + cols.sort(key=lambda x: x[1].creation_counter) + + +## ... source file abbreviated to get to get_template examples ... + + + order_by = self._meta.order_by + if order_by is None: + self._order_by = None + order_by = self.data.ordering + if order_by is not None: + self.order_by = order_by + else: + self.order_by = order_by + self.template_name = template_name + if request: + RequestConfig(request).configure(self) + + self._counter = count() + + def get_top_pinned_data(self): + return None + + def get_bottom_pinned_data(self): + return None + + def before_render(self, request): + return + + def as_html(self, request): + self._counter = count() +~~ template = get_template(self.template_name) + + context = {"table": self, "request": request} + + self.before_render(request) + return template.render(context) + + def as_values(self, exclude_columns=None): + if exclude_columns is None: + exclude_columns = () + + columns = [ + column + for column in self.columns.iterall() + if not (column.column.exclude_from_export or column.name in exclude_columns) + ] + + yield [force_str(column.header, strings_only=True) for column in columns] + + for row in self.rows: + yield [ + force_str(row.get_cell_value(column.name), strings_only=True) for column in columns + ] + + def has_footer(self): + + +## ... source file continues with no further get_template examples... + +``` + diff --git a/content/pages/examples/django/django-template-loader-render-to-string.markdown b/content/pages/examples/django/django-template-loader-render-to-string.markdown new file mode 100644 index 000000000..ac9390c29 --- /dev/null +++ b/content/pages/examples/django/django-template-loader-render-to-string.markdown @@ -0,0 +1,1293 @@ +title: django.template.loader render_to_string Example Code +category: page +slug: django-template-loader-render-to-string-examples +sortorder: 500011393 +toc: False +sidebartitle: django.template.loader render_to_string +meta: Python example code that shows how to use the render_to_string callable from the django.template.loader module of the Django project. + + +`render_to_string` is a callable within the `django.template.loader` module of the Django project. + +get_template +and +select_template +are a couple of other callables within the `django.template.loader` package that also have code examples. + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / auth_app / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/auth_app/views.py) + +```python +# views.py +import json +from urllib.request import Request, urlopen +from urllib.parse import urlencode + +from django.conf import settings +from django.contrib.auth import views as auth_views +from django.contrib.auth import get_user_model, login +from django.shortcuts import redirect, render +~~from django.template.loader import render_to_string +from django.core.mail import send_mail + +from .forms import SignUpForm + +User = get_user_model() + + +def signup(request): + if request.method == 'POST': + form = SignUpForm(request.POST) + if form.is_valid(): + recaptcha_response = request.POST.get('g-recaptcha-response') + url = 'https://www.google.com/recaptcha/api/siteverify' + values = { + 'secret': settings.RECAPTCHA_SECRET_KEY, + 'response': recaptcha_response + } + data = urlencode(values).encode() + req = Request(url, data=data) + + response = urlopen(req) + result = json.loads(response.read().decode()) + if result['success']: + user = form.save() + user.is_active = True + user.save() + login(request, user) + + context = { + 'email': user.email, + 'protocol': 'https' if request.is_secure() else "http", + 'domain': request.get_host(), + } +~~ html = render_to_string('auth_app/email/welcome.html', context) +~~ text = render_to_string('auth_app/email/welcome.txt', context) + send_mail( + 'Welcome to DCCN Conference Registration System!', + message=text, + html_message=html, + recipient_list=[user.email], + from_email=settings.DEFAULT_FROM_EMAIL, + fail_silently=False, + ) + return redirect('register') + else: + form = SignUpForm() + return render(request, 'auth_app/signup.html', { + 'site_key': settings.RECAPTCHA_SITE_KEY, + 'form': form, + }) + + +class PasswordResetDoneView(auth_views.PasswordResetDoneView): + template_name = 'auth_app/password_reset_done.html' + + + +## ... source file continues with no further render_to_string examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / adapter.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/adapter.py) + +```python +# adapter.py +from __future__ import unicode_literals + +import hashlib +import json +import time +import warnings + +from django import forms +from django.conf import settings +from django.contrib import messages +from django.contrib.auth import ( + authenticate, + get_backends, + login as django_login, + logout as django_logout, +) +from django.contrib.auth.models import AbstractUser +from django.contrib.auth.password_validation import validate_password +from django.contrib.sites.shortcuts import get_current_site +from django.core.cache import cache +from django.core.mail import EmailMessage, EmailMultiAlternatives +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import resolve_url +from django.template import TemplateDoesNotExist +~~from django.template.loader import render_to_string +from django.urls import reverse +from django.utils import timezone +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +from ..utils import ( + build_absolute_uri, + email_address_exists, + generate_unique_username, + get_user_model, + import_attribute, +) +from . import app_settings + + +class DefaultAccountAdapter(object): + + error_messages = { + "username_blacklisted": _( + "Username can not be used. Please use other username." + ), + "username_taken": AbstractUser._meta.get_field("username").error_messages[ + "unique" + ], + + +## ... source file abbreviated to get to render_to_string examples ... + + + def stash_user(self, request, user): + request.session["account_user"] = user + + def unstash_user(self, request): + return request.session.pop("account_user", None) + + def is_email_verified(self, request, email): + ret = False + verified_email = request.session.get("account_verified_email") + if verified_email: + ret = verified_email.lower() == email.lower() + return ret + + def format_email_subject(self, subject): + prefix = app_settings.EMAIL_SUBJECT_PREFIX + if prefix is None: + site = get_current_site(self.request) + prefix = "[{name}] ".format(name=site.name) + return prefix + force_str(subject) + + def get_from_email(self): + return settings.DEFAULT_FROM_EMAIL + + def render_mail(self, template_prefix, email, context): + to = [email] if isinstance(email, str) else email +~~ subject = render_to_string("{0}_subject.txt".format(template_prefix), context) + subject = " ".join(subject.splitlines()).strip() + subject = self.format_email_subject(subject) + + from_email = self.get_from_email() + + bodies = {} + for ext in ["html", "txt"]: + try: + template_name = "{0}_message.{1}".format(template_prefix, ext) +~~ bodies[ext] = render_to_string( + template_name, + context, + self.request, + ).strip() + except TemplateDoesNotExist: + if ext == "txt" and not bodies: + raise + if "txt" in bodies: + msg = EmailMultiAlternatives(subject, bodies["txt"], from_email, to) + if "html" in bodies: + msg.attach_alternative(bodies["html"], "text/html") + else: + msg = EmailMessage(subject, bodies["html"], from_email, to) + msg.content_subtype = "html" # Main content is now text/html + return msg + + def send_mail(self, template_prefix, email, context): + msg = self.render_mail(template_prefix, email, context) + msg.send() + + def get_signup_redirect_url(self, request): + return resolve_url(app_settings.SIGNUP_REDIRECT_URL) + + def get_login_redirect_url(self, request): + + +## ... source file abbreviated to get to render_to_string examples ... + + + min_length = app_settings.PASSWORD_MIN_LENGTH + if min_length and len(password) < min_length: + raise forms.ValidationError( + _("Password must be a minimum of {0} " "characters.").format(min_length) + ) + validate_password(password, user) + return password + + def validate_unique_email(self, email): + if email_address_exists(email): + raise forms.ValidationError(self.error_messages["email_taken"]) + return email + + def add_message( + self, + request, + level, + message_template, + message_context=None, + extra_tags="", + ): + if "django.contrib.messages" in settings.INSTALLED_APPS: + try: + if message_context is None: + message_context = {} +~~ message = render_to_string( + message_template, + message_context, + self.request, + ).strip() + if message: + messages.add_message(request, level, message, extra_tags=extra_tags) + except TemplateDoesNotExist: + pass + + def ajax_response(self, request, response, redirect_to=None, form=None, data=None): + resp = {} + status = response.status_code + + if redirect_to: + status = 200 + resp["location"] = redirect_to + if form: + if request.method == "POST": + if form.is_valid(): + status = 200 + else: + status = 400 + else: + status = 200 + + +## ... source file continues with no further render_to_string examples... + +``` + + +## Example 3 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / templatetags / cms_tags.py**](https://github.com/divio/django-cms/blob/develop/cms/templatetags/cms_tags.py) + +```python +# cms_tags.py +from collections import namedtuple, OrderedDict +from copy import copy +from datetime import datetime + +from django import template +from django.conf import settings +from django.contrib.sites.models import Site +from django.core.mail import mail_managers +from django.db.models import Model +from django.middleware.common import BrokenLinkEmailsMiddleware +~~from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.encoding import force_text, smart_text +from django.utils.html import escape +from django.utils.http import urlencode +from django.utils.translation import ( + get_language, + override as force_language, + gettext_lazy as _, +) + +from classytags.arguments import (Argument, MultiValueArgument, + MultiKeywordArgument) +from classytags.core import Options, Tag +from classytags.helpers import InclusionTag, AsTag +from classytags.parser import Parser +from classytags.utils import flatten_context +from classytags.values import ListValue, StringValue + +from cms.cache.page import get_page_url_cache, set_page_url_cache +from cms.exceptions import PlaceholderNotFound +from cms.models import Page, Placeholder as PlaceholderModel, CMSPlugin, StaticPlaceholder +from cms.plugin_pool import plugin_pool +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils import get_current_site, get_language_from_request, get_site_id + + +## ... source file abbreviated to get to render_to_string examples ... + + + Argument('edit_fields', default=None, required=False), + Argument('language', default=None, required=False), + Argument('filters', default=None, required=False), + Argument('view_url', default=None, required=False), + Argument('view_method', default=None, required=False), + 'as', + Argument('varname', required=False, resolve=False), + ) + + def __init__(self, parser, tokens): + self.parser = parser + super().__init__(parser, tokens) + + def _is_editable(self, request): + return (request and hasattr(request, 'toolbar') and request.toolbar.edit_mode_active) + + def get_template(self, context, **kwargs): + if self._is_editable(context.get('request', None)): + return self.edit_template + return self.template + + def render_tag(self, context, **kwargs): + context.push() + template = self.get_template(context, **kwargs) + data = self.get_context(context, **kwargs) +~~ output = render_to_string(template, flatten_context(data)).strip() + context.pop() + if kwargs.get('varname'): + context[kwargs['varname']] = output + return '' + else: + return output + + def _get_editable_context(self, context, instance, language, edit_fields, + view_method, view_url, querystring, editmode=True): + request = context['request'] + if hasattr(request, 'toolbar'): + lang = request.toolbar.toolbar_language + else: + lang = get_language() + opts = instance._meta + if getattr(instance, '_deferred', False): + opts = opts.proxy_for_model._meta + with force_language(lang): + extra_context = {} + if edit_fields == 'changelist': + instance.get_plugin_name = u"%s %s list" % (smart_text(_('Edit')), smart_text(opts.verbose_name)) + extra_context['attribute_name'] = 'changelist' + elif editmode: + instance.get_plugin_name = u"%s %s" % (smart_text(_('Edit')), smart_text(opts.verbose_name)) + + +## ... source file abbreviated to get to render_to_string examples ... + + + extra_context = self._get_empty_context(context, instance, None, + language, view_url, + view_method, editmode=False) + extra_context['render_model_add'] = True + return extra_context + + +class CMSEditableObjectAddBlock(CMSEditableObject): + name = 'render_model_add_block' + options = Options( + Argument('instance'), + Argument('language', default=None, required=False), + Argument('view_url', default=None, required=False), + Argument('view_method', default=None, required=False), + 'as', + Argument('varname', required=False, resolve=False), + blocks=[('endrender_model_add_block', 'nodelist')], + ) + + def render_tag(self, context, **kwargs): + context.push() + template = self.get_template(context, **kwargs) + data = self.get_context(context, **kwargs) + data['content'] = kwargs['nodelist'].render(data) + data['rendered_content'] = data['content'] +~~ output = render_to_string(template, flatten_context(data)) + context.pop() + if kwargs.get('varname'): + context[kwargs['varname']] = output + return '' + else: + return output + + def get_context(self, context, **kwargs): + instance = kwargs.pop('instance') + if isinstance(instance, Model) and not instance.pk: + instance.pk = 0 + kwargs.pop('varname') + kwargs.pop('nodelist') + extra_context = self._get_empty_context(context, instance, None, + editmode=False, **kwargs) + extra_context['render_model_add'] = True + return extra_context + + +class CMSEditableObjectBlock(CMSEditableObject): + name = 'render_model_block' + options = Options( + Argument('instance'), + Argument('edit_fields', default=None, required=False), + Argument('language', default=None, required=False), + Argument('view_url', default=None, required=False), + Argument('view_method', default=None, required=False), + 'as', + Argument('varname', required=False, resolve=False), + blocks=[('endrender_model_block', 'nodelist')], + ) + + def render_tag(self, context, **kwargs): + context.push() + template = self.get_template(context, **kwargs) + data = self.get_context(context, **kwargs) + data['content'] = kwargs['nodelist'].render(data) + data['rendered_content'] = data['content'] +~~ output = render_to_string(template, flatten_context(data)) + context.pop() + if kwargs.get('varname'): + context[kwargs['varname']] = output + return '' + else: + return output + + def get_context(self, context, **kwargs): + kwargs.pop('varname') + kwargs.pop('nodelist') + extra_context = self._get_empty_context(context, **kwargs) + extra_context['instance'] = kwargs.get('instance') + extra_context['render_model_block'] = True + return extra_context + + +class StaticPlaceholderNode(Tag): + name = 'static_placeholder' + options = PlaceholderOptions( + Argument('code', required=True), + MultiValueArgument('extra_bits', required=False, resolve=False), + blocks=[ + ('endstatic_placeholder', 'nodelist'), + ] + + +## ... source file continues with no further render_to_string examples... + +``` + + +## Example 4 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / toolbar.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/./toolbar.py) + +```python +# toolbar.py + +import uuid +from collections import OrderedDict + +from django.apps import apps +from django.core.exceptions import ImproperlyConfigured +from django.template import TemplateSyntaxError +~~from django.template.loader import render_to_string +from django.urls import path +from django.utils.module_loading import import_string + +from debug_toolbar import settings as dt_settings + + +class DebugToolbar: + def __init__(self, request, get_response): + self.request = request + self.config = dt_settings.get_config().copy() + panels = [] + for panel_class in reversed(self.get_panel_classes()): + panel = panel_class(self, get_response) + panels.append(panel) + if panel.enabled: + get_response = panel.process_request + self.process_request = get_response + self._panels = OrderedDict() + while panels: + panel = panels.pop() + self._panels[panel.panel_id] = panel + self.stats = {} + self.server_timing_stats = {} + self.store_id = None + + + @property + def panels(self): + return list(self._panels.values()) + + @property + def enabled_panels(self): + return [panel for panel in self._panels.values() if panel.enabled] + + def get_panel_by_id(self, panel_id): + return self._panels[panel_id] + + + def render_toolbar(self): + if not self.should_render_panels(): + self.store() + try: + context = {"toolbar": self} +~~ return render_to_string("debug_toolbar/base.html", context) + except TemplateSyntaxError: + if not apps.is_installed("django.contrib.staticfiles"): + raise ImproperlyConfigured( + "The debug toolbar requires the staticfiles contrib app. " + "Add 'django.contrib.staticfiles' to INSTALLED_APPS and " + "define STATIC_URL in your settings." + ) + else: + raise + + def should_render_panels(self): + render_panels = self.config["RENDER_PANELS"] + if render_panels is None: + render_panels = self.request.META["wsgi.multiprocess"] + return render_panels + + + _store = OrderedDict() + + def store(self): + if self.store_id: + return + self.store_id = uuid.uuid4().hex + self._store[self.store_id] = self + + +## ... source file continues with no further render_to_string examples... + +``` + + +## Example 5 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / fields / folder.py**](https://github.com/divio/django-filer/blob/develop/filer/fields/folder.py) + +```python +# folder.py +from __future__ import absolute_import + +import warnings + +from django import forms +from django.contrib.admin.sites import site +from django.contrib.admin.widgets import ForeignKeyRawIdWidget +from django.core.exceptions import ObjectDoesNotExist +from django.db import models +~~from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.http import urlencode +from django.utils.safestring import mark_safe + +from ..models import Folder +from ..utils.compatibility import truncate_words +from ..utils.model_label import get_model_label + + +class AdminFolderWidget(ForeignKeyRawIdWidget): + choices = None + input_type = 'hidden' + is_hidden = False + + def render(self, name, value, attrs=None, renderer=None): + obj = self.obj_for_value(value) + css_id = attrs.get('id') + css_id_folder = "%s_folder" % css_id + css_id_description_txt = "%s_description_txt" % css_id + if attrs is None: + attrs = {} + related_url = None + + if value: + + +## ... source file abbreviated to get to render_to_string examples ... + + + if not related_url: + related_url = reverse('admin:filer-directory_listing-last') + params = self.url_parameters() + params['_pick'] = 'folder' + if params: + url = '?' + urlencode(sorted(params.items())) + else: + url = '' + if 'class' not in attrs: + attrs['class'] = 'vForeignKeyRawIdAdminField' + super_attrs = attrs.copy() + hidden_input = super(ForeignKeyRawIdWidget, self).render(name, value, super_attrs) + + context = { + 'hidden_input': hidden_input, + 'lookup_url': '%s%s' % (related_url, url), + 'lookup_name': name, + 'span_id': css_id_description_txt, + 'object': obj, + 'clear_id': '%s_clear' % css_id, + 'descid': css_id_description_txt, + 'noimg': 'filer/icons/nofile_32x32.png', + 'foldid': css_id_folder, + 'id': css_id, + } +~~ html = render_to_string('admin/filer/widgets/admin_folder.html', context) + return mark_safe(html) + + def label_for_value(self, value): + obj = self.obj_for_value(value) + return ' %s' % truncate_words(obj, 14) + + def obj_for_value(self, value): + if not value: + return None + try: + key = self.rel.get_related_field().name + obj = self.rel.model._default_manager.get(**{key: value}) + except ObjectDoesNotExist: + obj = None + return obj + + class Media(object): + js = ( + 'filer/js/addons/popup_handling.js', + ) + + +class AdminFolderFormField(forms.ModelChoiceField): + widget = AdminFolderWidget + + +## ... source file continues with no further render_to_string examples... + +``` + + +## Example 6 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / panels.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./panels.py) + +```python +# panels.py +import datetime + +from debug_toolbar.panels import DebugPanel +~~from django.template.loader import render_to_string +from django.utils.translation import ugettext_lazy as _ + +from haystack import connections + + +class HaystackDebugPanel(DebugPanel): + + name = "Haystack" + has_content = True + + def __init__(self, *args, **kwargs): + super(self.__class__, self).__init__(*args, **kwargs) + self._offset = dict( + (alias, len(connections[alias].queries)) + for alias in connections.connections_info.keys() + ) + self._search_time = 0 + self._queries = [] + self._backends = {} + + def nav_title(self): + return _("Haystack") + + def nav_subtitle(self): + + +## ... source file abbreviated to get to render_to_string examples ... + + + if query.get("additional_kwargs"): + if query["additional_kwargs"].get("result_class"): + query["additional_kwargs"]["result_class"] = str( + query["additional_kwargs"]["result_class"] + ) + + try: + query["width_ratio"] = (float(query["time"]) / self._search_time) * 100 + except ZeroDivisionError: + query["width_ratio"] = 0 + + query["start_offset"] = width_ratio_tally + width_ratio_tally += query["width_ratio"] + + context = self.context.copy() + context.update( + { + "backends": sorted( + self._backends.items(), key=lambda x: -x[1]["time_spent"] + ), + "queries": [q for a, q in self._queries], + "sql_time": self._search_time, + } + ) + +~~ return render_to_string("panels/haystack.html", context) + + + +## ... source file continues with no further render_to_string examples... + +``` + + +## Example 7 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / dashboard / dashboard.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/dashboard/dashboard.py) + +```python +# dashboard.py +from importlib import import_module +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +~~from django.template.loader import render_to_string +from jet.dashboard import modules +from jet.dashboard.models import UserDashboardModule +from django.utils.translation import ugettext_lazy as _ +from jet.ordered_set import OrderedSet +from jet.utils import get_admin_site_name, context_to_dict + +try: + from django.template.context_processors import csrf +except ImportError: + from django.core.context_processors import csrf + + +class Dashboard(object): + + columns = 2 + + children = None + + available_children = None + app_label = None + context = None + modules = None + + class Media: + + +## ... source file abbreviated to get to render_to_string examples ... + + + user=self.context['request'].user.pk + ).all() + + if len(module_models) == 0: + module_models = self.create_initial_module_models(self.context['request'].user) + + loaded_modules = [] + + for module_model in module_models: + module_cls = module_model.load_module() + if module_cls is not None: + module = module_cls(model=module_model, context=self.context) + loaded_modules.append(module) + + self.modules = loaded_modules + + def render(self): + context = context_to_dict(self.context) + context.update({ + 'columns': range(self.columns), + 'modules': self.modules, + 'app_label': self.app_label, + }) + context.update(csrf(context['request'])) + +~~ return render_to_string('jet.dashboard/dashboard.html', context) + + def render_tools(self): + context = context_to_dict(self.context) + context.update({ + 'children': self.children, + 'app_label': self.app_label, + 'available_children': self.available_children + }) + context.update(csrf(context['request'])) + +~~ return render_to_string('jet.dashboard/dashboard_tools.html', context) + + def media(self): + unique_css = OrderedSet() + unique_js = OrderedSet() + + for js in getattr(self.Media, 'js', ()): + unique_js.add(js) + for css in getattr(self.Media, 'css', ()): + unique_css.add(css) + + for module in self.modules: + for js in getattr(module.Media, 'js', ()): + unique_js.add(js) + for css in getattr(module.Media, 'css', ()): + unique_css.add(css) + + class Media: + css = list(unique_css) + js = list(unique_js) + + return Media + + +class AppIndexDashboard(Dashboard): + + +## ... source file continues with no further render_to_string examples... + +``` + + +## Example 8 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / templatetags / pipeline.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/templatetags/pipeline.py) + +```python +# pipeline.py +import logging +import subprocess + +from django.contrib.staticfiles.storage import staticfiles_storage + +from django import template +from django.template.base import VariableDoesNotExist +~~from django.template.loader import render_to_string +from django.utils.safestring import mark_safe + +from ..collector import default_collector +from ..conf import settings +from ..exceptions import CompilerError +from ..packager import Packager, PackageNotFound +from ..utils import guess_type + +logger = logging.getLogger(__name__) + +register = template.Library() + + +class PipelineMixin(object): + request = None + _request_var = None + + @property + def request_var(self): + if not self._request_var: + self._request_var = template.Variable('request') + return self._request_var + + def package_for(self, package_name, package_type): + + +## ... source file abbreviated to get to render_to_string examples ... + + + method = getattr(self, f'render_{package_type}') + + return method(package, package.output_filename) + + def render_compressed_sources(self, package, package_name, package_type): + if settings.PIPELINE_COLLECTOR_ENABLED: + default_collector.collect(self.request) + + packager = Packager() + method = getattr(self, f'render_individual_{package_type}') + + try: + paths = packager.compile(package.paths) + except CompilerError as e: + if settings.SHOW_ERRORS_INLINE: + method = getattr(self, f'render_error_{package_type}') + return method(package_name, e) + else: + raise + + templates = packager.pack_templates(package) + + return method(package, paths, templates=templates) + + def render_error(self, package_type, package_name, e): +~~ return render_to_string('pipeline/compile_error.html', { + 'package_type': package_type, + 'package_name': package_name, + 'command': subprocess.list2cmdline(e.command), + 'errors': e.error_output, + }) + + +class StylesheetNode(PipelineMixin, template.Node): + def __init__(self, name): + self.name = name + + def render(self, context): + super(StylesheetNode, self).render(context) + package_name = template.Variable(self.name).resolve(context) + + try: + package = self.package_for(package_name, 'css') + except PackageNotFound: + logger.warn("Package %r is unknown. Check PIPELINE['STYLESHEETS'] in your settings.", package_name) + return '' # fail silently, do not return anything if an invalid group is specified + return self.render_compressed(package, package_name, 'css') + + def render_css(self, package, path): + template_name = package.template_name or "pipeline/css.html" + context = package.extra_context + context.update({ + 'type': guess_type(path, 'text/css'), + 'url': mark_safe(staticfiles_storage.url(path)) + }) +~~ return render_to_string(template_name, context) + + def render_individual_css(self, package, paths, **kwargs): + tags = [self.render_css(package, path) for path in paths] + return '\n'.join(tags) + + def render_error_css(self, package_name, e): + return super(StylesheetNode, self).render_error( + 'CSS', package_name, e) + + +class JavascriptNode(PipelineMixin, template.Node): + def __init__(self, name): + self.name = name + + def render(self, context): + super(JavascriptNode, self).render(context) + package_name = template.Variable(self.name).resolve(context) + + try: + package = self.package_for(package_name, 'js') + except PackageNotFound: + logger.warn("Package %r is unknown. Check PIPELINE['JAVASCRIPT'] in your settings.", package_name) + return '' # fail silently, do not return anything if an invalid group is specified + return self.render_compressed(package, package_name, 'js') + + def render_js(self, package, path): + template_name = package.template_name or "pipeline/js.html" + context = package.extra_context + context.update({ + 'type': guess_type(path, 'text/javascript'), + 'url': mark_safe(staticfiles_storage.url(path)) + }) +~~ return render_to_string(template_name, context) + + def render_inline(self, package, js): + context = package.extra_context + context.update({ + 'source': js + }) +~~ return render_to_string("pipeline/inline_js.html", context) + + def render_individual_js(self, package, paths, templates=None): + tags = [self.render_js(package, js) for js in paths] + if templates: + tags.append(self.render_inline(package, templates)) + return '\n'.join(tags) + + def render_error_js(self, package_name, e): + return super(JavascriptNode, self).render_error( + 'JavaScript', package_name, e) + + +@register.tag +def stylesheet(parser, token): + try: + tag_name, name = token.split_contents() + except ValueError: + raise template.TemplateSyntaxError('%r requires exactly one argument: the name of a group in the PIPELINE.STYLESHEETS setting' % token.split_contents()[0]) + return StylesheetNode(name) + + +@register.tag +def javascript(parser, token): + try: + + +## ... source file continues with no further render_to_string examples... + +``` + + +## Example 9 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / decorators.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./decorators.py) + +```python +# decorators.py +from functools import wraps +from urllib.parse import quote as urlquote + +from django.http import HttpResponseForbidden +from django.http import HttpResponseNotFound +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +~~from django.template.loader import render_to_string +from django.urls import reverse +from wiki.conf import settings +from wiki.core.exceptions import NoRootURL + + +def response_forbidden(request, article, urlpath, read_denied=False): + if request.user.is_anonymous: + qs = request.META.get("QUERY_STRING", "") + if qs: + qs = urlquote("?" + qs) + else: + qs = "" + return redirect(settings.LOGIN_URL + "?next=" + request.path + qs) + else: + return HttpResponseForbidden( +~~ render_to_string( + "wiki/permission_denied.html", + context={ + "article": article, + "urlpath": urlpath, + "read_denied": read_denied, + }, + request=request, + ) + ) + + +def get_article( # noqa: max-complexity=23 + func=None, + can_read=True, + can_write=False, + deleted_contents=False, + not_locked=False, + can_delete=False, + can_moderate=False, + can_create=False, +): + + def wrapper(request, *args, **kwargs): + from . import models + + path = kwargs.pop("path", None) + article_id = kwargs.pop("article_id", None) + + if path is not None: + try: + urlpath = models.URLPath.get_by_path(path, select_related=True) + except NoRootURL: + return redirect("wiki:root_create") + except models.URLPath.DoesNotExist: + try: + pathlist = list( + filter( + lambda x: x != "", + path.split("/"), + ) + ) + path = "/".join(pathlist[:-1]) + parent = models.URLPath.get_by_path(path) + return HttpResponseRedirect( + reverse("wiki:create", kwargs={"path": parent.path}) + + "?slug=%s" % pathlist[-1].lower() + ) + except models.URLPath.DoesNotExist: + return HttpResponseNotFound( +~~ render_to_string( + "wiki/error.html", + context={"error_type": "ancestors_missing"}, + request=request, + ) + ) + if urlpath.article: + article = urlpath.article + else: + return_url = reverse("wiki:get", kwargs={"path": urlpath.parent.path}) + urlpath.delete() + return HttpResponseRedirect(return_url) + + elif article_id: + articles = models.Article.objects + + article = get_object_or_404(articles, id=article_id) + try: + urlpath = models.URLPath.objects.get(articles__article=article) + except ( + models.URLPath.DoesNotExist, + models.URLPath.MultipleObjectsReturned, + ): + urlpath = None + + + +## ... source file continues with no further render_to_string examples... + +``` + + +## Example 10 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / snippets / widgets.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/snippets/widgets.py) + +```python +# widgets.py +import json + +from django import forms +from django.contrib.admin.utils import quote +~~from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ + +from wagtail.admin.staticfiles import versioned_static +from wagtail.admin.widgets import AdminChooser +from wagtail.admin.widgets.button import ListingButton + + +class AdminSnippetChooser(AdminChooser): + + def __init__(self, model, **kwargs): + self.target_model = model + name = self.target_model._meta.verbose_name + self.choose_one_text = _('Choose %s') % name + self.choose_another_text = _('Choose another %s') % name + self.link_to_chosen_text = _('Edit this %s') % name + + super().__init__(**kwargs) + + def get_value_data(self, value): + if value is None: + return None + elif isinstance(value, self.target_model): + instance = value + else: # assume instance ID + instance = self.target_model.objects.get(pk=value) + + app_label = self.target_model._meta.app_label + model_name = self.target_model._meta.model_name + quoted_id = quote(instance.pk) + edit_url = reverse('wagtailsnippets:edit', args=[app_label, model_name, quoted_id]) + + return { + 'id': instance.pk, + 'string': str(instance), + 'edit_url': edit_url, + } + + def render_html(self, name, value_data, attrs): + value_data = value_data or {} + + original_field_html = super().render_html(name, value_data.get('id'), attrs) + +~~ return render_to_string("wagtailsnippets/widgets/snippet_chooser.html", { + 'widget': self, + 'original_field_html': original_field_html, + 'attrs': attrs, + 'value': bool(value_data), # only used by chooser.html to identify blank values + 'display_title': value_data.get('string', ''), + 'edit_url': value_data.get('edit_url', ''), + }) + + def render_js_init(self, id_, name, value_data): + model = self.target_model + + return "createSnippetChooser({id}, {model});".format( + id=json.dumps(id_), + model=json.dumps('{app}/{model}'.format( + app=model._meta.app_label, + model=model._meta.model_name))) + + @property + def media(self): + return forms.Media(js=[ + versioned_static('wagtailsnippets/js/snippet-chooser-modal.js'), + versioned_static('wagtailsnippets/js/snippet-chooser.js'), + ]) + + + +## ... source file continues with no further render_to_string examples... + +``` + diff --git a/content/pages/examples/django/django-template-loader-select-template.markdown b/content/pages/examples/django/django-template-loader-select-template.markdown new file mode 100644 index 000000000..1b4a15d0e --- /dev/null +++ b/content/pages/examples/django/django-template-loader-select-template.markdown @@ -0,0 +1,124 @@ +title: django.template.loader select_template Example Code +category: page +slug: django-template-loader-select-template-examples +sortorder: 500011394 +toc: False +sidebartitle: django.template.loader select_template +meta: Python example code that shows how to use the select_template callable from the django.template.loader module of the Django project. + + +`select_template` is a callable within the `django.template.loader` module of the Django project. + +get_template +and +render_to_string +are a couple of other callables within the `django.template.loader` package that also have code examples. + +## Example 1 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / templatetags / django_tables2.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/templatetags/django_tables2.py) + +```python +# django_tables2.py +import re +from collections import OrderedDict + +from django import template +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.template import Node, TemplateSyntaxError +~~from django.template.loader import get_template, select_template +from django.templatetags.l10n import register as l10n_register +from django.utils.html import escape +from django.utils.http import urlencode + +import django_tables2 as tables +from django_tables2.paginators import LazyPaginator +from django_tables2.utils import AttributeDict + +register = template.Library() +kwarg_re = re.compile(r"(?:(.+)=)?(.+)") +context_processor_error_msg = ( + "Tag {%% %s %%} requires django.template.context_processors.request to be " + "in the template configuration in " + "settings.TEMPLATES[]OPTIONS.context_processors) in order for the included " + "template tags to function correctly." +) + + +def token_kwargs(bits, parser): + if not bits: + return {} + kwargs = OrderedDict() + while bits: + match = kwarg_re.match(bits[0]) + + +## ... source file abbreviated to get to select_template examples ... + + + self.template_name = template_name + + def render(self, context): + table = self.table.resolve(context) + + request = context.get("request") + + if isinstance(table, tables.Table): + pass + elif hasattr(table, "model"): + queryset = table + + table = tables.table_factory(model=queryset.model)(queryset, request=request) + else: + klass = type(table).__name__ + raise ValueError("Expected table or queryset, not {}".format(klass)) + + if self.template_name: + template_name = self.template_name.resolve(context) + else: + template_name = table.template_name + + if isinstance(template_name, str): + template = get_template(template_name) + else: +~~ template = select_template(template_name) + + try: + table.context = context + table.before_render(request) + + return template.render(context={"table": table}, request=request) + finally: + del table.context + + +@register.tag +def render_table(parser, token): + bits = token.split_contents() + bits.pop(0) + + table = parser.compile_filter(bits.pop(0)) + template = parser.compile_filter(bits.pop(0)) if bits else None + + return RenderTableNode(table, template) + + +register.filter("localize", l10n_register.filters["localize"]) +register.filter("unlocalize", l10n_register.filters["unlocalize"]) + + + +## ... source file continues with no further select_template examples... + +``` + diff --git a/content/pages/examples/django/django-template-loader-tags-blocknode.markdown b/content/pages/examples/django/django-template-loader-tags-blocknode.markdown new file mode 100644 index 000000000..908fd9095 --- /dev/null +++ b/content/pages/examples/django/django-template-loader-tags-blocknode.markdown @@ -0,0 +1,192 @@ +title: django.template.loader_tags BlockNode Example Code +category: page +slug: django-template-loader-tags-blocknode-examples +sortorder: 500011395 +toc: False +sidebartitle: django.template.loader_tags BlockNode +meta: Example code for understanding how to use the BlockNode class from the django.template.loader_tags module of the Django project. + + +`BlockNode` is a class within the `django.template.loader_tags` module of the Django project. + +ExtendsNode +and +IncludeNode +are a couple of other callables within the `django.template.loader_tags` package that also have code examples. + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / placeholder.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/placeholder.py) + +```python +# placeholder.py +import operator +import warnings +from collections import OrderedDict + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db.models.query_utils import Q +from django.template import TemplateSyntaxError, NodeList, Variable, Context, Template, engines +from django.template.base import VariableNode +from django.template.loader import get_template +~~from django.template.loader_tags import BlockNode, ExtendsNode, IncludeNode + +from sekizai.helpers import get_varname + +from cms.exceptions import DuplicatePlaceholderWarning +from cms.utils.conf import get_cms_setting + + +def _get_nodelist(tpl): + if hasattr(tpl, 'template'): + return tpl.template.nodelist + else: + return tpl.nodelist + + +def get_context(): + if engines is not None: + context = Context() + context.template = Template('') + return context + else: + return {} + + +def get_placeholder_conf(setting, placeholder, template=None, default=None): + + +## ... source file abbreviated to get to BlockNode examples ... + + + validate_placeholder_name(slot) + placeholders.append(placeholder) + clean_placeholders.append(slot) + return placeholders + + +def get_static_placeholders(template, context): + compiled_template = get_template(template) + nodes = _scan_static_placeholders(_get_nodelist(compiled_template)) + placeholders = [node.get_declaration(context) for node in nodes] + placeholders_with_code = [] + + for placeholder in placeholders: + if placeholder.slot: + placeholders_with_code.append(placeholder) + else: + warnings.warn('Unable to resolve static placeholder ' + 'name in template "{}"'.format(template), + Warning) + return placeholders_with_code + + +def _get_block_nodes(extend_node): + parent = extend_node.get_parent(get_context()) + parent_nodelist = _get_nodelist(parent) +~~ parent_nodes = parent_nodelist.get_nodes_by_type(BlockNode) + parent_extend_nodes = parent_nodelist.get_nodes_by_type(ExtendsNode) + + if parent_extend_nodes: + nodes = _get_block_nodes(parent_extend_nodes[0]) + else: + nodes = OrderedDict() + + for node in parent_nodes: + nodes[node.name] = node + +~~ current_nodes = _get_nodelist(extend_node).get_nodes_by_type(BlockNode) + + for node in current_nodes: + if node.name in nodes: + node.super = nodes[node.name] + nodes[node.name] = node + return nodes + + +def _get_placeholder_nodes_from_extend(extend_node, node_class): + block_nodes = _get_block_nodes(extend_node) + block_names = list(block_nodes.keys()) + + placeholders = [] + + for block in block_nodes.values(): + placeholders.extend(_scan_placeholders(_get_nodelist(block), node_class, block, block_names)) + + parent_template = _find_topmost_template(extend_node) + placeholders += _scan_placeholders(_get_nodelist(parent_template), node_class, None, block_names) + return placeholders + + +def _find_topmost_template(extend_node): + parent_template = extend_node.get_parent(get_context()) + nodes.append(node) + elif isinstance(node, IncludeNode): + if node.template: + if not callable(getattr(node.template, 'render', None)): + if isinstance(node.template.var, Variable): + continue + else: + template = get_template(node.template.var) + else: + template = node.template + nodes += _scan_placeholders(_get_nodelist(template), node_class, current_block) + elif isinstance(node, ExtendsNode): + nodes += _get_placeholder_nodes_from_extend(node, node_class) + elif isinstance(node, VariableNode) and current_block: + if node.filter_expression.token == 'block.super': + if not hasattr(current_block.super, 'nodelist'): + raise TemplateSyntaxError("Cannot render block.super for blocks without a parent.") + nodes += _scan_placeholders(_get_nodelist(current_block.super), node_class, current_block.super) + elif isinstance(node, BlockNode) and node.name in ignore_blocks: + continue + elif hasattr(node, 'child_nodelists'): + for nodelist_name in node.child_nodelists: + if hasattr(node, nodelist_name): + subnodelist = getattr(node, nodelist_name) + if isinstance(subnodelist, NodeList): +~~ if isinstance(node, BlockNode): + current_block = node + nodes += _scan_placeholders(subnodelist, node_class, current_block, ignore_blocks) + else: + for attr in dir(node): + obj = getattr(node, attr) + if isinstance(obj, NodeList): +~~ if isinstance(node, BlockNode): + current_block = node + nodes += _scan_placeholders(obj, node_class, current_block, ignore_blocks) + return nodes + + +def _scan_static_placeholders(nodelist): + from cms.templatetags.cms_tags import StaticPlaceholderNode + + return _scan_placeholders(nodelist, node_class=StaticPlaceholderNode) + + +def get_placeholders(template): + compiled_template = get_template(template) + + placeholders = [] + nodes = _scan_placeholders(_get_nodelist(compiled_template)) + clean_placeholders = [] + + for node in nodes: + placeholder = node.get_declaration() + slot = placeholder.slot + + if slot in clean_placeholders: + warnings.warn("Duplicate {{% placeholder \"{0}\" %}} " + + +## ... source file continues with no further BlockNode examples... + +``` + diff --git a/content/pages/examples/django/django-template-loader-tags-extendsnode.markdown b/content/pages/examples/django/django-template-loader-tags-extendsnode.markdown new file mode 100644 index 000000000..61b2dd957 --- /dev/null +++ b/content/pages/examples/django/django-template-loader-tags-extendsnode.markdown @@ -0,0 +1,188 @@ +title: django.template.loader_tags ExtendsNode Example Code +category: page +slug: django-template-loader-tags-extendsnode-examples +sortorder: 500011396 +toc: False +sidebartitle: django.template.loader_tags ExtendsNode +meta: Example code for understanding how to use the ExtendsNode class from the django.template.loader_tags module of the Django project. + + +`ExtendsNode` is a class within the `django.template.loader_tags` module of the Django project. + +BlockNode +and +IncludeNode +are a couple of other callables within the `django.template.loader_tags` package that also have code examples. + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / placeholder.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/placeholder.py) + +```python +# placeholder.py +import operator +import warnings +from collections import OrderedDict + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db.models.query_utils import Q +from django.template import TemplateSyntaxError, NodeList, Variable, Context, Template, engines +from django.template.base import VariableNode +from django.template.loader import get_template +~~from django.template.loader_tags import BlockNode, ExtendsNode, IncludeNode + +from sekizai.helpers import get_varname + +from cms.exceptions import DuplicatePlaceholderWarning +from cms.utils.conf import get_cms_setting + + +def _get_nodelist(tpl): + if hasattr(tpl, 'template'): + return tpl.template.nodelist + else: + return tpl.nodelist + + +def get_context(): + if engines is not None: + context = Context() + context.template = Template('') + return context + else: + return {} + + +def get_placeholder_conf(setting, placeholder, template=None, default=None): + + +## ... source file abbreviated to get to ExtendsNode examples ... + + + placeholders.append(placeholder) + clean_placeholders.append(slot) + return placeholders + + +def get_static_placeholders(template, context): + compiled_template = get_template(template) + nodes = _scan_static_placeholders(_get_nodelist(compiled_template)) + placeholders = [node.get_declaration(context) for node in nodes] + placeholders_with_code = [] + + for placeholder in placeholders: + if placeholder.slot: + placeholders_with_code.append(placeholder) + else: + warnings.warn('Unable to resolve static placeholder ' + 'name in template "{}"'.format(template), + Warning) + return placeholders_with_code + + +def _get_block_nodes(extend_node): + parent = extend_node.get_parent(get_context()) + parent_nodelist = _get_nodelist(parent) + parent_nodes = parent_nodelist.get_nodes_by_type(BlockNode) +~~ parent_extend_nodes = parent_nodelist.get_nodes_by_type(ExtendsNode) + + if parent_extend_nodes: + nodes = _get_block_nodes(parent_extend_nodes[0]) + else: + nodes = OrderedDict() + + for node in parent_nodes: + nodes[node.name] = node + + current_nodes = _get_nodelist(extend_node).get_nodes_by_type(BlockNode) + + for node in current_nodes: + if node.name in nodes: + node.super = nodes[node.name] + nodes[node.name] = node + return nodes + + +def _get_placeholder_nodes_from_extend(extend_node, node_class): + block_nodes = _get_block_nodes(extend_node) + block_names = list(block_nodes.keys()) + + placeholders = [] + + for block in block_nodes.values(): + placeholders.extend(_scan_placeholders(_get_nodelist(block), node_class, block, block_names)) + + parent_template = _find_topmost_template(extend_node) + placeholders += _scan_placeholders(_get_nodelist(parent_template), node_class, None, block_names) + return placeholders + + +def _find_topmost_template(extend_node): + parent_template = extend_node.get_parent(get_context()) +~~ for node in _get_nodelist(parent_template).get_nodes_by_type(ExtendsNode): + return _find_topmost_template(node) + return extend_node.get_parent(get_context()) + + +def _scan_placeholders(nodelist, node_class=None, current_block=None, ignore_blocks=None): + from cms.templatetags.cms_tags import Placeholder + + if not node_class: + node_class = Placeholder + + nodes = [] + + if ignore_blocks is None: + ignore_blocks = [] + + for node in nodelist: + if isinstance(node, node_class): + nodes.append(node) + elif isinstance(node, IncludeNode): + if node.template: + if not callable(getattr(node.template, 'render', None)): + if isinstance(node.template.var, Variable): + continue + else: + template = get_template(node.template.var) + else: + template = node.template + nodes += _scan_placeholders(_get_nodelist(template), node_class, current_block) +~~ elif isinstance(node, ExtendsNode): + nodes += _get_placeholder_nodes_from_extend(node, node_class) + elif isinstance(node, VariableNode) and current_block: + if node.filter_expression.token == 'block.super': + if not hasattr(current_block.super, 'nodelist'): + raise TemplateSyntaxError("Cannot render block.super for blocks without a parent.") + nodes += _scan_placeholders(_get_nodelist(current_block.super), node_class, current_block.super) + elif isinstance(node, BlockNode) and node.name in ignore_blocks: + continue + elif hasattr(node, 'child_nodelists'): + for nodelist_name in node.child_nodelists: + if hasattr(node, nodelist_name): + subnodelist = getattr(node, nodelist_name) + if isinstance(subnodelist, NodeList): + if isinstance(node, BlockNode): + current_block = node + nodes += _scan_placeholders(subnodelist, node_class, current_block, ignore_blocks) + else: + for attr in dir(node): + obj = getattr(node, attr) + if isinstance(obj, NodeList): + if isinstance(node, BlockNode): + current_block = node + nodes += _scan_placeholders(obj, node_class, current_block, ignore_blocks) + return nodes + + +## ... source file continues with no further ExtendsNode examples... + +``` + diff --git a/content/pages/examples/django/django-template-loader-tags-includenode.markdown b/content/pages/examples/django/django-template-loader-tags-includenode.markdown new file mode 100644 index 000000000..412c41d09 --- /dev/null +++ b/content/pages/examples/django/django-template-loader-tags-includenode.markdown @@ -0,0 +1,124 @@ +title: django.template.loader_tags IncludeNode Example Code +category: page +slug: django-template-loader-tags-includenode-examples +sortorder: 500011397 +toc: False +sidebartitle: django.template.loader_tags IncludeNode +meta: Example code for understanding how to use the IncludeNode class from the django.template.loader_tags module of the Django project. + + +`IncludeNode` is a class within the `django.template.loader_tags` module of the Django project. + +BlockNode +and +ExtendsNode +are a couple of other callables within the `django.template.loader_tags` package that also have code examples. + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / placeholder.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/placeholder.py) + +```python +# placeholder.py +import operator +import warnings +from collections import OrderedDict + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db.models.query_utils import Q +from django.template import TemplateSyntaxError, NodeList, Variable, Context, Template, engines +from django.template.base import VariableNode +from django.template.loader import get_template +~~from django.template.loader_tags import BlockNode, ExtendsNode, IncludeNode + +from sekizai.helpers import get_varname + +from cms.exceptions import DuplicatePlaceholderWarning +from cms.utils.conf import get_cms_setting + + +def _get_nodelist(tpl): + if hasattr(tpl, 'template'): + return tpl.template.nodelist + else: + return tpl.nodelist + + +def get_context(): + if engines is not None: + context = Context() + context.template = Template('') + return context + else: + return {} + + +def get_placeholder_conf(setting, placeholder, template=None, default=None): + + +## ... source file abbreviated to get to IncludeNode examples ... + + + + +def restore_sekizai_context(context, changes): + varname = get_varname() + sekizai_container = context.get(varname) + for key, values in changes.items(): + sekizai_namespace = sekizai_container[key] + for value in values: + sekizai_namespace.append(value) + + +def _scan_placeholders(nodelist, node_class=None, current_block=None, ignore_blocks=None): + from cms.templatetags.cms_tags import Placeholder + + if not node_class: + node_class = Placeholder + + nodes = [] + + if ignore_blocks is None: + ignore_blocks = [] + + for node in nodelist: + if isinstance(node, node_class): + nodes.append(node) +~~ elif isinstance(node, IncludeNode): + if node.template: + if not callable(getattr(node.template, 'render', None)): + if isinstance(node.template.var, Variable): + continue + else: + template = get_template(node.template.var) + else: + template = node.template + nodes += _scan_placeholders(_get_nodelist(template), node_class, current_block) + elif isinstance(node, ExtendsNode): + nodes += _get_placeholder_nodes_from_extend(node, node_class) + elif isinstance(node, VariableNode) and current_block: + if node.filter_expression.token == 'block.super': + if not hasattr(current_block.super, 'nodelist'): + raise TemplateSyntaxError("Cannot render block.super for blocks without a parent.") + nodes += _scan_placeholders(_get_nodelist(current_block.super), node_class, current_block.super) + elif isinstance(node, BlockNode) and node.name in ignore_blocks: + continue + elif hasattr(node, 'child_nodelists'): + for nodelist_name in node.child_nodelists: + if hasattr(node, nodelist_name): + subnodelist = getattr(node, nodelist_name) + if isinstance(subnodelist, NodeList): + if isinstance(node, BlockNode): + + +## ... source file continues with no further IncludeNode examples... + +``` + diff --git a/content/pages/examples/django/django-template-loader.markdown b/content/pages/examples/django/django-template-loader.markdown new file mode 100644 index 000000000..6eb9853b6 --- /dev/null +++ b/content/pages/examples/django/django-template-loader.markdown @@ -0,0 +1,1119 @@ +title: django.template loader Example Code +category: page +slug: django-template-loader-examples +sortorder: 500011368 +toc: False +sidebartitle: django.template loader +meta: Python example code that shows how to use the loader callable from the django.template module of the Django project. + + +`loader` is a callable within the `django.template` module of the Django project. + +Context, +Engine, +Library, +Node, +NodeList, +Origin, +RequestContext, +Template, +TemplateDoesNotExist, +TemplateSyntaxError, +Variable, +context, +engine, +and library +are several other callables with code examples from the same `django.template` package. + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / plugin_pool.py**](https://github.com/divio/django-cms/blob/develop/cms/./plugin_pool.py) + +```python +# plugin_pool.py +from operator import attrgetter + +from django.core.exceptions import ImproperlyConfigured +from django.urls import re_path, include +from django.template.defaultfilters import slugify +from django.utils.encoding import force_text +from django.utils.functional import cached_property +from django.utils.module_loading import autodiscover_modules +from django.utils.translation import get_language, deactivate_all, activate +from django.template import TemplateDoesNotExist, TemplateSyntaxError + +from cms.exceptions import PluginAlreadyRegistered, PluginNotRegistered +from cms.plugin_base import CMSPluginBase +from cms.utils.conf import get_cms_setting +from cms.utils.helpers import normalize_name + + +class PluginPool: + + def __init__(self): + self.plugins = {} + self.discovered = False + + def _clear_cached(self): + if 'registered_plugins' in self.__dict__: + del self.__dict__['registered_plugins'] + + if 'plugins_with_extra_menu' in self.__dict__: + del self.__dict__['plugins_with_extra_menu'] + + if 'plugins_with_extra_placeholder_menu' in self.__dict__: + del self.__dict__['plugins_with_extra_placeholder_menu'] + + def discover_plugins(self): + if self.discovered: + + +## ... source file abbreviated to get to loader examples ... + + + autodiscover_modules('cms_plugins') + self.discovered = True + + def clear(self): + self.discovered = False + self.plugins = {} + self._clear_cached() + + def validate_templates(self, plugin=None): + if plugin: + plugins = [plugin] + else: + plugins = self.plugins.values() + for plugin in plugins: + if (plugin.render_plugin and not type(plugin.render_plugin) == property + or hasattr(plugin.model, 'render_template') + or hasattr(plugin, 'get_render_template')): + if (plugin.render_template is None and + not hasattr(plugin, 'get_render_template')): + raise ImproperlyConfigured( + "CMS Plugins must define a render template, " + "a get_render_template method or " + "set render_plugin=False: %s" % plugin + ) + elif not hasattr(plugin, 'get_render_template'): +~~ from django.template import loader + + template = plugin.render_template + if isinstance(template, str) and template: + try: +~~ loader.get_template(template) + except TemplateDoesNotExist as e: + if str(e) == template: + raise ImproperlyConfigured( + "CMS Plugins must define a render template (%s) that exists: %s" + % (plugin, template) + ) + else: + pass + except TemplateSyntaxError: + pass + else: + if plugin.allow_children: + raise ImproperlyConfigured( + "CMS Plugins can not define render_plugin=False and allow_children=True: %s" + % plugin + ) + + def register_plugin(self, plugin): + if not issubclass(plugin, CMSPluginBase): + raise ImproperlyConfigured( + "CMS Plugins must be subclasses of CMSPluginBase, %r is not." + % plugin + ) + plugin_name = plugin.__name__ + + +## ... source file continues with no further loader examples... + +``` + + +## Example 2 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / management / modelviz.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/management/modelviz.py) + +```python +# modelviz.py + +import datetime +import os +import re + +from django.apps import apps +from django.db.models.fields.related import ( + ForeignKey, ManyToManyField, OneToOneField, RelatedField, +) +from django.contrib.contenttypes.fields import GenericRelation +~~from django.template import Context, Template, loader +from django.utils.encoding import force_str +from django.utils.safestring import mark_safe +from django.utils.translation import activate as activate_language + + +__version__ = "1.1" +__license__ = "Python" +__author__ = "Bas van Oostveen ", +__contributors__ = [ + "Antonio Cavedoni " + "Stefano J. Attardi ", + "limodou ", + "Carlo C8E Miron", + "Andre Campos ", + "Justin Findlay ", + "Alexander Houben ", + "Joern Hees ", + "Kevin Cherepski ", + "Jose Tomas Tocino ", + "Adam Dobrawy ", + "Mikkel Munch Mortensen ", + "Andrzej Bistram ", + "Daniel Lipsitt ", +] + + +## ... source file abbreviated to get to loader examples ... + + + def use_model(self, model_name): + if self.include_models: + for model_pattern in self.include_models: + model_pattern = '^%s$' % model_pattern.replace('*', '.*') + if re.search(model_pattern, model_name): + return True + if self.exclude_models: + for model_pattern in self.exclude_models: + model_pattern = '^%s$' % model_pattern.replace('*', '.*') + if re.search(model_pattern, model_name): + return False + return not self.include_models + + def skip_field(self, field): + if self.exclude_columns: + if self.verbose_names and field.verbose_name: + if field.verbose_name in self.exclude_columns: + return True + if field.name in self.exclude_columns: + return True + return False + + +def generate_dot(graph_data, template='django_extensions/graph_models/digraph.dot'): + if isinstance(template, str): +~~ template = loader.get_template(template) + + if not isinstance(template, Template) and not (hasattr(template, 'template') and isinstance(template.template, Template)): + raise Exception("Default Django template loader isn't used. " + "This can lead to the incorrect template rendering. " + "Please, check the settings.") + + c = Context(graph_data).flatten() + dot = template.render(c) + + return dot + + +def generate_graph_data(*args, **kwargs): + generator = ModelGraph(*args, **kwargs) + generator.generate_graph_data() + return generator.get_graph_data() + + +def use_model(model, include_models, exclude_models): + generator = ModelGraph([], include_models=include_models, exclude_models=exclude_models) + return generator.use_model(model) + + + +## ... source file continues with no further loader examples... + +``` + + +## Example 3 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / rest_framework / backends.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/rest_framework/backends.py) + +```python +# backends.py +import warnings + +~~from django.template import loader +from django.utils.deprecation import RenameMethodsBase + +from .. import compat, utils +from . import filters, filterset + + +class RenameAttributes(utils.RenameAttributesBase, RenameMethodsBase): + renamed_attributes = ( + ('default_filter_set', 'filterset_base', utils.MigrationNotice), + ) + renamed_methods = ( + ('get_filter_class', 'get_filterset_class', utils.MigrationNotice), + ) + + +class DjangoFilterBackend(metaclass=RenameAttributes): + filterset_base = filterset.FilterSet + raise_exception = True + + @property + def template(self): + if compat.is_crispy(): + return 'django_filters/rest_framework/crispy_form.html' + return 'django_filters/rest_framework/form.html' + + +## ... source file abbreviated to get to loader examples ... + + + return AutoFilterSet + + return None + + def get_filterset_kwargs(self, request, queryset, view): + return { + 'data': request.query_params, + 'queryset': queryset, + 'request': request, + } + + def filter_queryset(self, request, queryset, view): + filterset = self.get_filterset(request, queryset, view) + if filterset is None: + return queryset + + if not filterset.is_valid() and self.raise_exception: + raise utils.translate_validation(filterset.errors) + return filterset.qs + + def to_html(self, request, queryset, view): + filterset = self.get_filterset(request, queryset, view) + if filterset is None: + return None + +~~ template = loader.get_template(self.template) + context = {'filter': filterset} + return template.render(context, request) + + def get_coreschema_field(self, field): + if isinstance(field, filters.NumberFilter): + field_cls = compat.coreschema.Number + else: + field_cls = compat.coreschema.String + return field_cls( + description=str(field.extra.get('help_text', '')) + ) + + def get_schema_fields(self, view): + assert compat.coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`' + assert compat.coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`' + + try: + queryset = view.get_queryset() + except Exception: + queryset = None + warnings.warn( + "{} is not compatible with schema generation".format(view.__class__) + ) + + + +## ... source file continues with no further loader examples... + +``` + + +## Example 4 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / widgets.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./widgets.py) + +```python +# widgets.py +import datetime +import re +from itertools import chain + +import django +from django import forms +from django.conf import settings +from django.forms.widgets import FILE_INPUT_CONTRADICTION +~~from django.template import loader +from django.utils import datetime_safe, formats +from django.utils.dates import MONTHS +from django.utils.encoding import force_str +from django.utils.html import conditional_escape +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ + +from .compat import MULTIVALUE_DICT_TYPES, flatten_contexts + + +from django.forms.utils import to_current_timezone + + +RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$') + + +__all__ = ( + 'TextInput', 'PasswordInput', 'HiddenInput', 'ClearableFileInput', + 'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', + 'CheckboxInput', 'Select', 'NullBooleanSelect', 'SelectMultiple', + 'RadioSelect', 'CheckboxSelectMultiple', 'SearchInput', 'RangeInput', + 'ColorInput', 'EmailInput', 'URLInput', 'PhoneNumberInput', 'NumberInput', + 'IPAddressInput', 'MultiWidget', 'Widget', 'SplitDateTimeWidget', + 'SplitHiddenDateTimeWidget', 'MultipleHiddenInput', 'SelectDateWidget', + + +## ... source file abbreviated to get to loader examples ... + + + + if value is None: + value = '' + + if value != '': + context['value'] = self.format_value(value) + + context.update(self.get_context_data()) + context['attrs'] = self.build_attrs(attrs) + + for key, attr in context['attrs'].items(): + if attr == 1: + if not isinstance(attr, bool): + context['attrs'][key] = str(attr) + + if self.datalist is not None: + context['datalist'] = self.datalist + return context + + def render(self, name, value, attrs=None, **kwargs): + template_name = kwargs.pop('template_name', None) + if template_name is None: + template_name = self.template_name + context = self.get_context(name, value, attrs=attrs or {}) + context = flatten_contexts(self.context_instance, context) +~~ return loader.render_to_string(template_name, context) + + +class TextInput(Input): + template_name = 'floppyforms/text.html' + input_type = 'text' + + def __init__(self, *args, **kwargs): + if kwargs.get('attrs', None) is not None: + self.input_type = kwargs['attrs'].pop('type', self.input_type) + super(TextInput, self).__init__(*args, **kwargs) + + +class PasswordInput(TextInput): + template_name = 'floppyforms/password.html' + input_type = 'password' + + def __init__(self, attrs=None, render_value=False): + super(PasswordInput, self).__init__(attrs) + self.render_value = render_value + + def render(self, name, value, attrs=None, renderer=None): + if not self.render_value: + value = None + return super(PasswordInput, self).render(name, value, attrs, renderer=renderer) + + +## ... source file abbreviated to get to loader examples ... + + + except ValueError: + pass + else: + match = RE_DATE.match(value) + if match: + year_val, month_val, day_val = map(int, match.groups()) + + context = self.get_context(name, value, attrs=attrs, + extra_context=extra_context) + + context['year_choices'] = [(i, i) for i in self.years] + context['year_val'] = year_val + + context['month_choices'] = list(MONTHS.items()) + context['month_val'] = month_val + + context['day_choices'] = [(i, i) for i in range(1, 32)] + context['day_val'] = day_val + + + if self.required is False: + context['year_choices'].insert(0, self.none_value) + context['month_choices'].insert(0, self.none_value) + context['day_choices'].insert(0, self.none_value) + +~~ return loader.render_to_string(self.template_name, context) + + def value_from_datadict(self, data, files, name): + y = data.get(self.year_field % name) + m = data.get(self.month_field % name) + d = data.get(self.day_field % name) + if y == m == d == "0": + return None + if y and m and d: + if settings.USE_L10N: + input_format = formats.get_format('DATE_INPUT_FORMATS')[0] + try: + date_value = datetime.date(int(y), int(m), int(d)) + except ValueError: + return '%s-%s-%s' % (y, m, d) + else: + date_value = datetime_safe.new_date(date_value) + return date_value.strftime(input_format) + else: + return '%s-%s-%s' % (y, m, d) + return data.get(name, None) + + + +## ... source file continues with no further loader examples... + +``` + + +## Example 5 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / fields.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./fields.py) + +```python +# fields.py +import re +from inspect import ismethod + +~~from django.template import loader +from django.utils import datetime_safe + +from haystack.exceptions import SearchFieldError +from haystack.utils import get_model_ct_tuple + + +class NOT_PROVIDED: + pass + + +DATE_REGEX = re.compile( + r"^(?P\d{4})-(?P\d{2})-(?P\d{2})(?:|T00:00:00Z?)$" +) +DATETIME_REGEX = re.compile( + r"^(?P\d{4})-(?P\d{2})-(?P\d{2})(T|\s+)(?P\d{2}):(?P\d{2}):(?P\d{2}).*?$" +) + + + + +class SearchField(object): + + field_type = None + + + +## ... source file abbreviated to get to loader examples ... + + + return [] + + elif not hasattr(current_objects, "__iter__"): + current_objects = [current_objects] + + return current_objects + + def prepare_template(self, obj): + if self.instance_name is None and self.template_name is None: + raise SearchFieldError( + "This field requires either its instance_name variable to be populated or an explicit template_name in order to load the correct template." + ) + + if self.template_name is not None: + template_names = self.template_name + + if not isinstance(template_names, (list, tuple)): + template_names = [template_names] + else: + app_label, model_name = get_model_ct_tuple(obj) + template_names = [ + "search/indexes/%s/%s_%s.txt" + % (app_label, model_name, self.instance_name) + ] + +~~ t = loader.select_template(template_names) + return t.render({"object": obj}) + + def convert(self, value): + return value + + +class CharField(SearchField): + field_type = "string" + + def __init__(self, **kwargs): + if kwargs.get("facet_class") is None: + kwargs["facet_class"] = FacetCharField + + super(CharField, self).__init__(**kwargs) + + def prepare(self, obj): + return self.convert(super(CharField, self).prepare(obj)) + + def convert(self, value): + if value is None: + return None + + return str(value) + + + +## ... source file continues with no further loader examples... + +``` + + +## Example 6 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / renderers.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./renderers.py) + +```python +# renderers.py +import base64 +from collections import OrderedDict +from urllib import parse + +from django import forms +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.core.paginator import Page +from django.http.multipartparser import parse_header +~~from django.template import engines, loader +from django.urls import NoReverseMatch +from django.utils.html import mark_safe + +from rest_framework import VERSION, exceptions, serializers, status +from rest_framework.compat import ( + INDENT_SEPARATORS, LONG_SEPARATORS, SHORT_SEPARATORS, coreapi, coreschema, + pygments_css, yaml +) +from rest_framework.exceptions import ParseError +from rest_framework.request import is_form_media_type, override_method +from rest_framework.settings import api_settings +from rest_framework.utils import encoders, json +from rest_framework.utils.breadcrumbs import get_breadcrumbs +from rest_framework.utils.field_mapping import ClassLookupDict + + +def zero_as_none(value): + return None if value == 0 else value + + +class BaseRenderer: + media_type = None + format = None + charset = 'utf-8' + + +## ... source file abbreviated to get to loader examples ... + + + exception_template_names = [ + '%(status_code)s.html', + 'api_exception.html' + ] + charset = 'utf-8' + + def render(self, data, accepted_media_type=None, renderer_context=None): + renderer_context = renderer_context or {} + view = renderer_context['view'] + request = renderer_context['request'] + response = renderer_context['response'] + + if response.exception: + template = self.get_exception_template(response) + else: + template_names = self.get_template_names(response, view) + template = self.resolve_template(template_names) + + if hasattr(self, 'resolve_context'): + context = self.resolve_context(data, request, response) + else: + context = self.get_template_context(data, renderer_context) + return template.render(context, request=request) + + def resolve_template(self, template_names): +~~ return loader.select_template(template_names) + + def get_template_context(self, data, renderer_context): + response = renderer_context['response'] + if response.exception: + data['status_code'] = response.status_code + return data + + def get_template_names(self, response, view): + if response.template_name: + return [response.template_name] + elif self.template_name: + return [self.template_name] + elif hasattr(view, 'get_template_names'): + return view.get_template_names() + elif hasattr(view, 'template_name'): + return [view.template_name] + raise ImproperlyConfigured( + 'Returned a template response with no `template_name` attribute set on either the view or response' + ) + + def get_exception_template(self, response): + template_names = [name % {'status_code': response.status_code} + for name in self.exception_template_names] + + + +## ... source file abbreviated to get to loader examples ... + + + serializers.JSONField: { + 'base_template': 'textarea.html', + }, + }) + + def render_field(self, field, parent_style): + if isinstance(field._field, serializers.HiddenField): + return '' + + style = self.default_style[field].copy() + style.update(field.style) + if 'template_pack' not in style: + style['template_pack'] = parent_style.get('template_pack', self.template_pack) + style['renderer'] = self + + field = field.as_form_field() + + if style.get('input_type') == 'datetime-local' and isinstance(field.value, str): + field.value = field.value.rstrip('Z') + + if 'template' in style: + template_name = style['template'] + else: + template_name = style['template_pack'].strip('/') + '/' + style['base_template'] + +~~ template = loader.get_template(template_name) + context = {'field': field, 'style': style} + return template.render(context) + + def render(self, data, accepted_media_type=None, renderer_context=None): + renderer_context = renderer_context or {} + form = data.serializer + + style = renderer_context.get('style', {}) + if 'template_pack' not in style: + style['template_pack'] = self.template_pack + style['renderer'] = self + + template_pack = style['template_pack'].strip('/') + template_name = template_pack + '/' + self.base_template +~~ template = loader.get_template(template_name) + context = { + 'form': form, + 'style': style + } + return template.render(context) + + +class BrowsableAPIRenderer(BaseRenderer): + media_type = 'text/html' + format = 'api' + template = 'rest_framework/api.html' + filter_template = 'rest_framework/filters/base.html' + code_style = 'emacs' + charset = 'utf-8' + form_renderer_class = HTMLFormRenderer + + def get_default_renderer(self, view): + renderers = [renderer for renderer in view.renderer_classes + if not issubclass(renderer, BrowsableAPIRenderer)] + non_template_renderers = [renderer for renderer in renderers + if not hasattr(renderer, 'get_template_names')] + + if not renderers: + return None + + +## ... source file abbreviated to get to loader examples ... + + + if not hasattr(view, 'get_queryset') or not hasattr(view, 'filter_backends'): + return + + paginator = getattr(view, 'paginator', None) + if isinstance(data, list): + pass + elif paginator is not None and data is not None: + try: + paginator.get_results(data) + except (TypeError, KeyError): + return + elif not isinstance(data, list): + return + + queryset = view.get_queryset() + elements = [] + for backend in view.filter_backends: + if hasattr(backend, 'to_html'): + html = backend().to_html(request, queryset, view) + if html: + elements.append(html) + + if not elements: + return + +~~ template = loader.get_template(self.filter_template) + context = {'elements': elements} + return template.render(context) + + def get_context(self, data, accepted_media_type, renderer_context): + view = renderer_context['view'] + request = renderer_context['request'] + response = renderer_context['response'] + + renderer = self.get_default_renderer(view) + + raw_data_post_form = self.get_raw_data_form(data, view, 'POST', request) + raw_data_put_form = self.get_raw_data_form(data, view, 'PUT', request) + raw_data_patch_form = self.get_raw_data_form(data, view, 'PATCH', request) + raw_data_put_or_patch_form = raw_data_put_form or raw_data_patch_form + + response_headers = OrderedDict(sorted(response.items())) + renderer_content_type = '' + if renderer: + renderer_content_type = '%s' % renderer.media_type + if renderer.charset: + renderer_content_type += ' ;%s' % renderer.charset + response_headers['Content-Type'] = renderer_content_type + + if getattr(view, 'paginator', None) and view.paginator.display_page_controls: + + +## ... source file abbreviated to get to loader examples ... + + + 'put_form': self.get_rendered_html_form(data, view, 'PUT', request), + 'post_form': self.get_rendered_html_form(data, view, 'POST', request), + 'delete_form': self.get_rendered_html_form(data, view, 'DELETE', request), + 'options_form': self.get_rendered_html_form(data, view, 'OPTIONS', request), + + 'extra_actions': self.get_extra_actions(view, response.status_code), + + 'filter_form': self.get_filter_form(data, view, request), + + 'raw_data_put_form': raw_data_put_form, + 'raw_data_post_form': raw_data_post_form, + 'raw_data_patch_form': raw_data_patch_form, + 'raw_data_put_or_patch_form': raw_data_put_or_patch_form, + + 'display_edit_forms': bool(response.status_code != 403), + + 'api_settings': api_settings, + 'csrf_cookie_name': csrf_cookie_name, + 'csrf_header_name': csrf_header_name + } + + def render(self, data, accepted_media_type=None, renderer_context=None): + self.accepted_media_type = accepted_media_type or '' + self.renderer_context = renderer_context or {} + +~~ template = loader.get_template(self.template) + context = self.get_context(data, accepted_media_type, renderer_context) + ret = template.render(context, request=renderer_context['request']) + + response = renderer_context['response'] + if response.status_code == status.HTTP_204_NO_CONTENT: + response.status_code = status.HTTP_200_OK + + return ret + + +class AdminRenderer(BrowsableAPIRenderer): + template = 'rest_framework/admin.html' + format = 'admin' + + def render(self, data, accepted_media_type=None, renderer_context=None): + self.accepted_media_type = accepted_media_type or '' + self.renderer_context = renderer_context or {} + + response = renderer_context['response'] + request = renderer_context['request'] + view = self.renderer_context['view'] + + if response.status_code == status.HTTP_400_BAD_REQUEST: + self.error_form = self.get_rendered_html_form(data, view, request.method, request) + self.error_title = {'POST': 'Create', 'PUT': 'Edit'}.get(request.method, 'Errors') + + with override_method(view, request, 'GET') as request: + response = view.get(request, *view.args, **view.kwargs) + data = response.data + +~~ template = loader.get_template(self.template) + context = self.get_context(data, accepted_media_type, renderer_context) + ret = template.render(context, request=renderer_context['request']) + + if response.status_code == status.HTTP_201_CREATED and 'Location' in response: + response.status_code = status.HTTP_303_SEE_OTHER + response['Location'] = request.build_absolute_uri() + ret = '' + + if response.status_code == status.HTTP_204_NO_CONTENT: + response.status_code = status.HTTP_303_SEE_OTHER + try: + response['Location'] = self.get_breadcrumbs(request)[-2][1] + except KeyError: + response['Location'] = request.full_path + ret = '' + + return ret + + def get_context(self, data, accepted_media_type, renderer_context): + context = super().get_context( + data, accepted_media_type, renderer_context + ) + + paginator = getattr(context['view'], 'paginator', None) + + +## ... source file abbreviated to get to loader examples ... + + + except (KeyError, NoReverseMatch): + return + + +class DocumentationRenderer(BaseRenderer): + media_type = 'text/html' + format = 'html' + charset = 'utf-8' + template = 'rest_framework/docs/index.html' + error_template = 'rest_framework/docs/error.html' + code_style = 'emacs' + languages = ['shell', 'javascript', 'python'] + + def get_context(self, data, request): + return { + 'document': data, + 'langs': self.languages, + 'lang_htmls': ["rest_framework/docs/langs/%s.html" % language for language in self.languages], + 'lang_intro_htmls': ["rest_framework/docs/langs/%s-intro.html" % language for language in self.languages], + 'code_style': pygments_css(self.code_style), + 'request': request + } + + def render(self, data, accepted_media_type=None, renderer_context=None): + if isinstance(data, coreapi.Document): +~~ template = loader.get_template(self.template) + context = self.get_context(data, renderer_context['request']) + return template.render(context, request=renderer_context['request']) + else: +~~ template = loader.get_template(self.error_template) + context = { + "data": data, + "request": renderer_context['request'], + "response": renderer_context['response'], + "debug": settings.DEBUG, + } + return template.render(context, request=renderer_context['request']) + + +class SchemaJSRenderer(BaseRenderer): + media_type = 'application/javascript' + format = 'javascript' + charset = 'utf-8' + template = 'rest_framework/schema.js' + + def render(self, data, accepted_media_type=None, renderer_context=None): + codec = coreapi.codecs.CoreJSONCodec() + schema = base64.b64encode(codec.encode(data)).decode('ascii') + +~~ template = loader.get_template(self.template) + context = {'schema': mark_safe(schema)} + request = renderer_context['request'] + return template.render(context, request=request) + + +class MultiPartRenderer(BaseRenderer): + media_type = 'multipart/form-data; boundary=BoUnDaRyStRiNg' + format = 'multipart' + charset = 'utf-8' + BOUNDARY = 'BoUnDaRyStRiNg' + + def render(self, data, accepted_media_type=None, renderer_context=None): + from django.test.client import encode_multipart + + if hasattr(data, 'items'): + for key, value in data.items(): + assert not isinstance(value, dict), ( + "Test data contained a dictionary value for key '%s', " + "but multipart uploads do not support nested data. " + "You may want to consider using format='json' in this " + "test case." % key + ) + return encode_multipart(self.BOUNDARY, data) + + + +## ... source file continues with no further loader examples... + +``` + + +## Example 7 from django-request-token +[Django Request Token](https://github.com/yunojuno/django-request-token) +([PyPI package information](https://pypi.org/project/django-request-token/0.13/)) +encapsulates the logic for issuing expiring and one-time tokens +with a [Django](/django.html) web application to use with protected URLs. +Note that [PostgreSQL](/postgresql.html) as your backend +[database](/databases.html) is a dependency for using this project. + +The Django Request Token project is open sourced under the +[MIT license](https://github.com/yunojuno/django-request-token/blob/master/LICENSE). + +[**django-request-token / request_token / apps.py**](https://github.com/yunojuno/django-request-token/blob/master/request_token/./apps.py) + +```python +# apps.py +from __future__ import annotations + +from django.apps import AppConfig +from django.core.exceptions import ImproperlyConfigured +~~from django.template import TemplateDoesNotExist, loader + +from .settings import FOUR03_TEMPLATE + + +class RequestTokenAppConfig(AppConfig): + + name = "request_token" + verbose_name = "JWT Request Tokens" + + def ready(self) -> None: + super(RequestTokenAppConfig, self).ready() + if FOUR03_TEMPLATE: + check_template(FOUR03_TEMPLATE) + + +def check_template(template: str) -> None: + try: +~~ loader.get_template(template) + except TemplateDoesNotExist: + raise ImproperlyConfigured( + f"Custom request token template does not exist: '{template}'" + ) + + + +## ... source file continues with no further loader examples... + +``` + + +## Example 8 from graphite-web +[Graphite](https://github.com/graphite-project/graphite-web) +([project website](http://graphiteapp.org/), +[documentation](https://graphite.readthedocs.io/en/latest/) and +[PyPI package information](https://pypi.org/project/graphite-web/)) +is a metrics collection and visualization tool, built with both +Python and JavaScript. Metrics are collected by a Node.js application +and displayed using a [Django](/django.html) web application, +called "Graphite-Web", which is one of three core projects under +the Graphite umbrella (the other two are +[Carbon](https://github.com/graphite-project/carbon) and +[Whisper](https://github.com/graphite-project/whisper)). + +Graphite is provided as open sourced under the +[Apache License 2.0](https://github.com/graphite-project/whisper/blob/master/LICENSE). + +[**graphite-web / webapp / graphite / views.py**](https://github.com/graphite-project/graphite-web/blob/master/webapp/graphite/views.py) + +```python +# views.py +import traceback +from django.http import HttpResponseServerError +~~from django.template import loader + + +def server_error(request, template_name='500.html'): +~~ template = loader.get_template(template_name) + context = {'stacktrace' : traceback.format_exc()} + return HttpResponseServerError(template.render(context)) + + + +## ... source file continues with no further loader examples... + +``` + diff --git a/content/pages/examples/django/django-template-loaders-filesystem-loader.markdown b/content/pages/examples/django/django-template-loaders-filesystem-loader.markdown new file mode 100644 index 000000000..88ec1cc4a --- /dev/null +++ b/content/pages/examples/django/django-template-loaders-filesystem-loader.markdown @@ -0,0 +1,59 @@ +title: django.template.loaders.filesystem Loader Example Code +category: page +slug: django-template-loaders-filesystem-loader-examples +sortorder: 500011398 +toc: False +sidebartitle: django.template.loaders.filesystem Loader +meta: Example code for understanding how to use the Loader class from the django.template.loaders.filesystem module of the Django project. + + +`Loader` is a class within the `django.template.loaders.filesystem` module of the Django project. + + + +## Example 1 from django-markdown-view +[django-markdown-view](https://github.com/rgs258/django-markdown-view) +([PyPI package information](https://pypi.org/project/django-markdown-view/)) +is a Django extension for serving [Markdown](/markdown.html) files as +[Django templates](/django-templates.html). The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/rgs258/django-markdown-view/blob/master/LICENSE). + +[**django-markdown-view / markdown_view / loaders.py**](https://github.com/rgs258/django-markdown-view/blob/master/markdown_view/./loaders.py) + +```python +# loaders.py +from django.conf import settings +from django.core.exceptions import SuspiciousFileOperation +from django.template import Origin +~~from django.template.loaders.filesystem import Loader as FilesystemLoader +from django.template.utils import get_app_template_dirs +from django.utils._os import safe_join + +from markdown_view.constants import DEFAULT_MARKDOWN_VIEW_LOADER_TEMPLATES_DIR + + +class MarkdownLoader(FilesystemLoader): + + def get_dirs(self): + base_dir = getattr( + settings, + "MARKDOWN_VIEW_BASE_DIR", + getattr( + settings, + "BASE_DIR", + None) + ) + dirs = [*get_app_template_dirs( + getattr( + settings, + "MARKDOWN_VIEW_LOADER_TEMPLATES_DIR", + DEFAULT_MARKDOWN_VIEW_LOADER_TEMPLATES_DIR + ) + )] + + +## ... source file continues with no further Loader examples... + +``` + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 7b6c539bf..682db8f15 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -198,6 +198,31 @@

    Conferences split into a couple of categories: community-run and vendor-run. For example, -WWDC is Apple's vendor-run +WWDC is Apple's vendor-run developer conference. They run the show and control the messaging. -PyCon US is the community-run +PyCon US is the community-run Python developer conference. There are a ton of vendors there as sponsors but no one company controls what happens at the conference.

    diff --git a/content/posts/200630-report-errors-flask-web-apps-sentry.markdown b/content/posts/200630-report-errors-flask-web-apps-sentry.markdown index e55c14c5c..2e9ec9684 100644 --- a/content/posts/200630-report-errors-flask-web-apps-sentry.markdown +++ b/content/posts/200630-report-errors-flask-web-apps-sentry.markdown @@ -260,5 +260,5 @@ or [@mattmakai](https://twitter.com/mattmakai). I am also on GitHub with the username [mattmakai](https://github.com/mattmakai). If you see an issue or error in this tutorial, please -[fork the source repository on GitHub](https://github.com/mattmakai/fullstackpython/blob/master/content/posts/200630-report-errors-flask-web-apps-sentry.markdown) +[fork the source repository on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200630-report-errors-flask-web-apps-sentry.markdown) and submit a pull request with the fix. From 048ed83e5c355650223ad9ce11da5ade10b30190 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 2 Jun 2021 09:54:05 -0400 Subject: [PATCH 263/302] fixing broken link rot --- .../01-introduction/01-learning-programming.markdown | 9 --------- content/pages/01-introduction/04-python-2-or-3.markdown | 2 +- .../pages/01-introduction/09-best-python-videos.markdown | 2 +- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/content/pages/01-introduction/01-learning-programming.markdown b/content/pages/01-introduction/01-learning-programming.markdown index 217546782..83a5ac56c 100644 --- a/content/pages/01-introduction/01-learning-programming.markdown +++ b/content/pages/01-introduction/01-learning-programming.markdown @@ -125,11 +125,6 @@ repositories and sites with practice problems and solutions: * [TeachCraft](https://teachcraft.net/) combines Minecraft with Python to learn coding. -* [500 Data Structures and Algorithms practice problems and their solutions](https://techiedelight.quora.com/500-Data-Structures-and-Algorithms-practice-problems-and-their-solutions) - covers a large swath of the computer science space. It is not important - to know all of these algorithms and data structures but experience with - many of them will be greatly beneficial in becoming a better developer. - ### First-hand advice These articles are written by programmers who explain how they learned to @@ -170,10 +165,6 @@ your teaching experience: is an awesome resource that explains how you can use simple but fun drawings to teach otherwise difficult technical concepts to students. -* [Teaching programming to working professionals](http://pgbovine.net/PG-Podcast-21-Trey-Hunner.htm) - is a video podcast with [Trey Hunter](https://twitter.com/treyhunner) - about his experience teaching Python to experienced professionals. - * [Teach Yourself Computer Science](https://teachyourselfcs.com/) is intended as a self-teaching tool with many resources that are classic computer science textbooks. There are also nice explanations for why diff --git a/content/pages/01-introduction/04-python-2-or-3.markdown b/content/pages/01-introduction/04-python-2-or-3.markdown index eaf166982..a362e7b49 100644 --- a/content/pages/01-introduction/04-python-2-or-3.markdown +++ b/content/pages/01-introduction/04-python-2-or-3.markdown @@ -78,7 +78,7 @@ gone through the process and have advice for making it less painful. implementations. There is also a [quick reference for writting code with Python 2 and 3 compatibility](https://wiki.python.org/moin/PortingToPy3k/BilingualQuickRef). -* [Upgrading to Python 3 with Zero Downtime](https://tech.yplanapp.com/2016/08/24/upgrading-to-python-3-with-zero-downtime/) +* [Upgrading to Python 3 with Zero Downtime](https://adamj.eu/tech/2016/08/24/upgrading-yplan-to-python-3-with-zero-downtime/) supplies advice on transitioning a large existing Python 2 web application to Python 3. Their process involved upgrading dependencies, testing and deploying the new version before going back to clean up unnecessary code diff --git a/content/pages/01-introduction/09-best-python-videos.markdown b/content/pages/01-introduction/09-best-python-videos.markdown index 85000438e..14be9bccd 100644 --- a/content/pages/01-introduction/09-best-python-videos.markdown +++ b/content/pages/01-introduction/09-best-python-videos.markdown @@ -163,7 +163,7 @@ like [PyCon US](https://us.pycon.org/) and Python language. * PyCon US videos from - [2020](https://www.youtube.com/c/PyCon2020/videos), + [2020](https://www.youtube.com/playlist?list=PL2Uw4_HvXqvbpFquYIE57BEAqkQWk-iFg), [2019](https://www.youtube.com/channel/UCxs2IIVXaEHHA4BtTiWZ2mQ/videos), [2018](https://www.youtube.com/channel/UCsX05-2sVSH7Nx3zuk3NYuQ/videos), [2017](https://www.youtube.com/channel/UCrJhliKNQ8g0qoE_zvL8eVg/videos), From a0fec6273e09ba322e8b36ca67c572f581851275 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 2 Jun 2021 12:03:33 -0400 Subject: [PATCH 264/302] removing 404 resources --- .../02-python-programming-language.markdown | 4 ---- content/pages/01-introduction/03-why-use-python.markdown | 7 ------- 2 files changed, 11 deletions(-) diff --git a/content/pages/01-introduction/02-python-programming-language.markdown b/content/pages/01-introduction/02-python-programming-language.markdown index 6cc9be260..dc605bc74 100644 --- a/content/pages/01-introduction/02-python-programming-language.markdown +++ b/content/pages/01-introduction/02-python-programming-language.markdown @@ -164,10 +164,6 @@ the very beginner topics. covers what the code for list comprehensions looks like and gives some example code to show how they work. -* [An Introduction to Python Lists](http://effbot.org/zone/python-list.htm) - is a solid overview of Python lists in general and tangentially covers - list comprehensions. - ### Python generator resources * This blog post entitled diff --git a/content/pages/01-introduction/03-why-use-python.markdown b/content/pages/01-introduction/03-why-use-python.markdown index 505585cf3..8c036951b 100644 --- a/content/pages/01-introduction/03-why-use-python.markdown +++ b/content/pages/01-introduction/03-why-use-python.markdown @@ -133,13 +133,6 @@ language. system versus statically typed languages, be sure to [read this thorough explanation of the topic](http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html). -* [Why I swapped C#.NET for Python as my default language and platform (and won’t be going back)](https://medium.com/@anthonypjshaw/why-i-swapped-c-net-for-python-as-my-default-language-and-platform-and-wont-be-going-back-e0063a25e491) - provides a viewpoint from someone who is not a professional developer but - uses coding to hack out some projects. He found Microsoft's .NET ecosystem - lacking when it came to satisfying his needs and Python filled the gap for - him with its wide array of open source code libraries, package management - and ability to work well on platforms other than Windows. - * [Python, Machine Learning, and Language Wars](http://sebastianraschka.com/blog/2015/why-python.html) compares Python with R, MATLAB and Julia for data science work. While Python is great for [deployment automation](/deployment.html) and From 7d07a8c0976b869b98c91d96ef2faae20bb34238 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 3 Jun 2021 11:28:30 -0400 Subject: [PATCH 265/302] removing many more 404 links --- .../02-python-programming-language.markdown | 3 --- .../01-introduction/10-best-python-podcasts.markdown | 8 ++++---- .../00-development-environments.markdown | 6 ------ content/pages/02-development-environments/02-vim.markdown | 5 ----- .../pages/02-development-environments/05-pycharm.markdown | 4 ---- .../02-development-environments/08-bash-shell.markdown | 2 +- .../pages/02-development-environments/12-tmux.markdown | 2 -- .../15-application-dependencies.markdown | 6 ------ 8 files changed, 5 insertions(+), 31 deletions(-) diff --git a/content/pages/01-introduction/02-python-programming-language.markdown b/content/pages/01-introduction/02-python-programming-language.markdown index dc605bc74..a3b046bb1 100644 --- a/content/pages/01-introduction/02-python-programming-language.markdown +++ b/content/pages/01-introduction/02-python-programming-language.markdown @@ -79,9 +79,6 @@ Dictionary comprehension: ### General Python language resources -* The [online Python tutor](http://www.pythontutor.com/) visually walks - through code and shows how it executes on the Python interpreter. - * [Python Module of the Week](http://pymotw.com/2/index.html) is a tour through the Python standard library. diff --git a/content/pages/01-introduction/10-best-python-podcasts.markdown b/content/pages/01-introduction/10-best-python-podcasts.markdown index f0181a269..a2c528fee 100644 --- a/content/pages/01-introduction/10-best-python-podcasts.markdown +++ b/content/pages/01-introduction/10-best-python-podcasts.markdown @@ -42,16 +42,16 @@ listen and learn. [web application development](/web-development.html) in Python using the [Django web framework](/django.html). +* [The Real Python Podcast](https://realpython.com/podcasts/rpp/) is a weekly + podcast with interviews, coding tips, and conversation with guests from the + Python community. + * [Teaching Python](https://www.teachingpython.fm/) is a podcast by two teachers about their adventures teaching middle school computer science, problem solving, handling failure, frustration, and success with teaching Python programming. -* Professor Philip Guo has a video podcast called - [PG Podcast](https://podcasts.apple.com/us/podcast/philip-guo-podcasts-pgbovine-net/id1276072242), - which typically covers Python subjects. -* [The Real Python Podcast](https://realpython.com/podcasts/rpp/) is a weekly podcast with interviews, coding tips, and conversation with guests from the Python community. ## Favorite podcast episodes Here are a list of my favorite episodes from various Python podcasts before diff --git a/content/pages/02-development-environments/00-development-environments.markdown b/content/pages/02-development-environments/00-development-environments.markdown index cb27c7ee4..4b7dc8b94 100644 --- a/content/pages/02-development-environments/00-development-environments.markdown +++ b/content/pages/02-development-environments/00-development-environments.markdown @@ -121,12 +121,6 @@ configuration as a starting point and customize it from there. [which version of Python to use](/python-2-or-3.html) and adding [code metrics](/code-metrics.html) libraries for checking syntax. -* [Three Ways to Install Python on your Windows Computer](http://blog.yhat.com/posts/installing-python-on-windows.html) - provides multiple avenues for Windows users to get Python on their machine - before setting up the rest of their development environment. Unlike - macOS and Linux, the Windows [operating system](/operating-systems.html) - does not include Python with its default installation. - * [PyCharm: The Good Parts](http://nafiulis.me/pycharm-the-good-parts-i.html) shows you how to be more efficient and productive with that IDE if it's your choice for writing Python code. diff --git a/content/pages/02-development-environments/02-vim.markdown b/content/pages/02-development-environments/02-vim.markdown index bb3895f79..10acf60ef 100644 --- a/content/pages/02-development-environments/02-vim.markdown +++ b/content/pages/02-development-environments/02-vim.markdown @@ -171,11 +171,6 @@ to get started with these tutorials. * [Vim Adventures](http://vim-adventures.com/) is a cute, fun browser-based game that helps you learn Vim commands by playing through the adventure. -* In [Vim: revisited](http://mislav.uniqpath.com/2011/12/vim-revisited/) the - author explains his on-again off-again relationship with using Vim. He then - shows how he configures and uses the editor so it sticks as his primary - code editing tool. - * [Things About Vim I Wish I Knew Earlier](https://blog.petrzemek.net/2016/04/06/things-about-vim-i-wish-i-knew-earlier/) explores the lessons one developer learned while exclusively using Vim for several years. The author includes using relative instead of absolute diff --git a/content/pages/02-development-environments/05-pycharm.markdown b/content/pages/02-development-environments/05-pycharm.markdown index c6810f26c..c464d6e87 100644 --- a/content/pages/02-development-environments/05-pycharm.markdown +++ b/content/pages/02-development-environments/05-pycharm.markdown @@ -29,10 +29,6 @@ Python code. is a solid discussion thread with different developers' perspectives on using PyCharm for coding their applications. -* [How to Get Started with PyCharm and Have a Productive Python IDE](https://pedrokroger.net/getting-started-pycharm-python-ide/) - covers the basics of configuring PyCharm for running code within - virtualenvs, macros, using the console and code completion. - * [Using PyCharm with Pyramid](https://docs.pylonsproject.org/projects/pyramid-cookbook/en/latest/development_tools/pycharm.html) is specific to developing and debugging [with the Pyramid web framework](/pyramid.html). diff --git a/content/pages/02-development-environments/08-bash-shell.markdown b/content/pages/02-development-environments/08-bash-shell.markdown index 7fd89c38e..22c7877bc 100644 --- a/content/pages/02-development-environments/08-bash-shell.markdown +++ b/content/pages/02-development-environments/08-bash-shell.markdown @@ -219,7 +219,7 @@ to try to avoid as you work with the shell or write scripts. their destructive abilities by reading through the descriptions provided by the author. -* [Faster bash startup](https://danpker.com/posts/2020/faster-bash-startup/) +* [Faster bash startup](https://danpker.com/posts/faster-bash-startup/) and [Even faster bash startup](https://work.lisk.in/2020/11/20/even-faster-bash-startup.html) are two great tutorials that will save you a bunch of time if you frequently diff --git a/content/pages/02-development-environments/12-tmux.markdown b/content/pages/02-development-environments/12-tmux.markdown index 1813d8f4f..4b95fba6c 100644 --- a/content/pages/02-development-environments/12-tmux.markdown +++ b/content/pages/02-development-environments/12-tmux.markdown @@ -38,8 +38,6 @@ easier to use many shells at once and attaching to both local and remote * [Using tmux Properly](http://danielallendeutsch.com/blog/16-using-tmux-properly.html) -* [Differences between tmux vs screen](https://wtanaka.com/node/8136) - * [The Power Of tmux Hooks](https://devel.tech/tips/n/tMuXz2lj/the-power-of-tmux-hooks/) * There are a slew of "cheat sheets" for tmux out there, here are a few diff --git a/content/pages/02-development-environments/15-application-dependencies.markdown b/content/pages/02-development-environments/15-application-dependencies.markdown index a01f2eba9..513b62081 100644 --- a/content/pages/02-development-environments/15-application-dependencies.markdown +++ b/content/pages/02-development-environments/15-application-dependencies.markdown @@ -165,12 +165,6 @@ so far to get up to speed on building and releasing your own packages. is an amazing post that takes the reader from simple Python script into a complete Python package. -* [Perils of packaging](https://malramsay.com/post/perils_of_packaging/) - covers several edge cases that come up when trying to put together - pieces like Travis CI, PyPI and conda. The post walks through the errors - and how to get around them until they are smoothed out by updates to the - tools. - * [How to Publish Your Package on PyPI](https://blog.jetbrains.com/pycharm/2017/05/how-to-publish-your-package-on-pypi/) is for developers who have created a code library they would like to share and make installable for other developers. From 37f0867537a98e300e6357378e009eb1ff07be49 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 3 Jun 2021 12:14:33 -0400 Subject: [PATCH 266/302] fixing more broken links --- .../04-sublime-text.markdown | 4 ---- content/pages/04-web-development/02-django.markdown | 5 ----- .../pages/04-web-development/27-task-queues.markdown | 7 ------- content/pages/04-web-development/28-celery.markdown | 2 +- .../04-web-development/29-rq-redis-queue.markdown | 2 +- .../pages/04-web-development/42-websockets.markdown | 11 +---------- content/pages/04-web-development/46-webhooks.markdown | 2 -- content/pages/04-web-development/53-stripe.markdown | 3 --- .../04-web-development/56-web-app-security.markdown | 7 ------- content/pages/06-devops/00-devops.markdown | 4 ---- 10 files changed, 3 insertions(+), 44 deletions(-) diff --git a/content/pages/02-development-environments/04-sublime-text.markdown b/content/pages/02-development-environments/04-sublime-text.markdown index 841687737..196df3b51 100644 --- a/content/pages/02-development-environments/04-sublime-text.markdown +++ b/content/pages/02-development-environments/04-sublime-text.markdown @@ -68,10 +68,6 @@ links should get your editor customized with linters, is a spectacular tutorial that covers installing Sublime Text and configuring a multitude of helpful Python programming plugins. -* [Sublime Text 3 Heaven](https://www.kennethreitz.org/essays/sublime-text-3-heaven) - is a quick overview of the extensions, packages and bonus toys that - one developer uses for his own Sublime Text development setup. - * [Sublime Tutor](https://sublimetutor.com/) is an interactive in-editor keyboard shortcuts tutorial that plugs into Sublime so you can learn and become more productive as you use the editor. diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index b5a5cea0c..47b59b9e1 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -338,11 +338,6 @@ out how to build your own projects. This is a short list of some real-world example applications, and many more can be found on the [Django example projects and code](/django-code-examples.html) page. -* [Browser calls with Django and Twilio](https://www.twilio.com/docs/howto/walkthrough/browser-calls/python/django) - shows how to build a web app with Django and - [Twilio Client](https://www.twilio.com/client) to turn a user's web - browser into a full-fledged phone. Pretty awesome! - * [Openduty](https://github.com/ustream/openduty) is a website status checking and alert system similar to PagerDuty. diff --git a/content/pages/04-web-development/27-task-queues.markdown b/content/pages/04-web-development/27-task-queues.markdown index 073759f6e..10ba31986 100644 --- a/content/pages/04-web-development/27-task-queues.markdown +++ b/content/pages/04-web-development/27-task-queues.markdown @@ -100,13 +100,6 @@ when scaling out a large deployment of distributed task queues. ## Open source examples that use task queues -* Take a look at the code in this open source - [Flask application](https://www.twilio.com/docs/howto/walkthrough/appointment-reminders/python/flask) - and - [this Django application](https://www.twilio.com/docs/howto/walkthrough/appointment-reminders/python/django) - for examples of how to use and deploy Celery with a Redis broker to - send text messages with these frameworks. - * [flask-celery-example](https://github.com/thrisp/flask-celery-example) is a simple Flask application with Celery as a task queue and Redis as the broker. diff --git a/content/pages/04-web-development/28-celery.markdown b/content/pages/04-web-development/28-celery.markdown index 5a614855c..5d8a3c746 100644 --- a/content/pages/04-web-development/28-celery.markdown +++ b/content/pages/04-web-development/28-celery.markdown @@ -7,7 +7,7 @@ sidebartitle: Celery meta: Celery is a task queue for executing work outside a Python web application HTTP request-response cycle. -[Celery](http://www.celeryproject.org/) is a [task queue](/task-queues.html) +[Celery](https://docs.celeryproject.org/) is a [task queue](/task-queues.html) implementation for [Python web applications](/web-development.html) used to asynchronously execute work outside the HTTP request-response cycle. diff --git a/content/pages/04-web-development/29-rq-redis-queue.markdown b/content/pages/04-web-development/29-rq-redis-queue.markdown index d984e121a..b9fe01a39 100644 --- a/content/pages/04-web-development/29-rq-redis-queue.markdown +++ b/content/pages/04-web-development/29-rq-redis-queue.markdown @@ -19,7 +19,7 @@ track of tasks in the queue that need to be executed. ### RQ resources * [Asynchronous Tasks in Python with Redis Queue](https://www.twilio.com/blog/asynchronous-tasks-in-python-with-redis-queue) is a quickstart-style tutorial that shows how to use RQ to fetch data - from the + from the [Mars Rover web API](https://data.nasa.gov/Space-Science/Mars-Rover-Photos-API/929k-jizu) and process URLs for each of the photos taken by NASA's Mars rover. There is also a follow-up post on diff --git a/content/pages/04-web-development/42-websockets.markdown b/content/pages/04-web-development/42-websockets.markdown index fb8293c46..5e1f78d64 100644 --- a/content/pages/04-web-development/42-websockets.markdown +++ b/content/pages/04-web-development/42-websockets.markdown @@ -175,9 +175,7 @@ own project. * The [realtime codenames game](https://github.com/joshporter1/codenames) source code is a full-featured example for using WebSockets via - Flask-SocketIO. There is also a - [multi-part tutorial](https://secdevops.ai/weekend-project-part-1-creating-a-real-time-web-based-application-using-flask-vue-and-socket-b71c73f37df7) - that walks through the code. + Flask-SocketIO. * The [python-websockets-example](https://github.com/mattmakai/python-websockets-example) @@ -192,13 +190,6 @@ own project. Flask web app implementation that allows the audience to interact with WebSockets as I built out the application. -* [Creating a Real-time Web-based Application using Flask, Vue, and Socket.io: part 1](https://secdevops.ai/weekend-project-part-1-creating-a-real-time-web-based-application-using-flask-vue-and-socket-b71c73f37df7), - [part 2](https://secdevops.ai/weekend-project-part-2-turning-flask-into-a-real-time-websocket-server-using-flask-socketio-ab6b45f1d896) - and - [part 3](https://secdevops.ai/weekend-project-part-3-centralizing-state-management-with-vuex-5f4387ebc144) - are a complete front-to-backend WebSockets, Python and JavaScript front - end framework example with open source code. - * [Real-time in Python](http://mrjoes.github.io/2013/06/21/python-realtime.html) provides Python-specific context for how the server push updates were implemented in the past and how Python's tools have evolved to perform diff --git a/content/pages/04-web-development/46-webhooks.markdown b/content/pages/04-web-development/46-webhooks.markdown index 01d76fe43..6307fe02e 100644 --- a/content/pages/04-web-development/46-webhooks.markdown +++ b/content/pages/04-web-development/46-webhooks.markdown @@ -44,8 +44,6 @@ otherwise independent web applications. * [Should you build a webhooks API?](https://brandur.org/webhooks) -* [Webhooks do’s and dont’s: what we learned after integrating +100 APIs](https://restful.io/webhooks-dos-and-dont-s-what-we-learned-after-integrating-100-apis-d567405a3671) - * [Why Are Webhooks Better Than Serverless Extensibility?](https://developer.okta.com/blog/2017/10/11/why-are-webhooks-better-than-serverless-extensibility) * [Webhooks Provide an Efficient Alternative to API Polling](https://thenewstack.io/wonderful-world-webhooks/) diff --git a/content/pages/04-web-development/53-stripe.markdown b/content/pages/04-web-development/53-stripe.markdown index aee4f6f98..82aba71f0 100644 --- a/content/pages/04-web-development/53-stripe.markdown +++ b/content/pages/04-web-development/53-stripe.markdown @@ -23,9 +23,6 @@ for processing payments. the subscription data in the [Django ORM](/django-orm.html) and create a pricing page. -* [Switching from Braintree to Stripe](https://www.deekit.com/braintree-to-stripe/) - covers one development team's experience with moving payment providers. - * [Dirt Cheap Recurring Payments with Stripe and AWS Lambda](http://normal-extensions.com/2017/05/05/simple-recurring/) explains how to use the Stripe API with [AWS Lambda](/aws-lambda.html) to handle recurring payments instead of using a more expensive service diff --git a/content/pages/04-web-development/56-web-app-security.markdown b/content/pages/04-web-development/56-web-app-security.markdown index 2b1ee70f9..6d15da25d 100644 --- a/content/pages/04-web-development/56-web-app-security.markdown +++ b/content/pages/04-web-development/56-web-app-security.markdown @@ -14,8 +14,6 @@ request forgery and usage of public-private keypairs. ### Security tools -* [Bro](http://www.bro.org/) is a network security and traffic monitor. - * [lynis](https://cisofy.com/lynis/) ([source code](https://github.com/CISOfy/lynis)) is a security audit tool that can run as a shell script on a Linux system to find out @@ -132,11 +130,6 @@ resources can also give you a good overview of how HTTPS works. * The [/r/netsec](http://www.reddit.com/r/netsec/) subreddit is one place to go to learn more about network and application security. -* [Hacking Tools Repository](http://gexos.github.io/Hacking-Tools-Repository/) - is a great list of password cracking, scanning, sniffing and other security - penetration testing tools. - - * The EFF has a well written overview on [what makes a good security audit](https://www.eff.org/deeplinks/2014/11/what-makes-good-security-audit). It's broad but contains some of their behind the scenes thinking on important considerations with security audits. diff --git a/content/pages/06-devops/00-devops.markdown b/content/pages/06-devops/00-devops.markdown index c1a95152a..722ca59f1 100644 --- a/content/pages/06-devops/00-devops.markdown +++ b/content/pages/06-devops/00-devops.markdown @@ -88,10 +88,6 @@ teams, culture, processes and tools into software development organizations. your pager goes off, ownership and how startups can be different from large companies with their incident responses. -* [Bing: Continuous Delivery](http://stories.visualstudio.com/bing-continuous-delivery/) - is an impressive visual story that explains the practices for how their - team delivers updates to the search engine. - * [Why are we racing to DevOps?](http://www.cio.com/article/3015237/application-development/why-are-we-racing-to-devops.html) is a very high level summary of the benefits of DevOps to IT organizations. It's not specific to Python and doesn't dive into the details, but it's From 71576f7429439af3fdd4534723d056b8fcf843a8 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 5 Jun 2021 13:44:13 -0400 Subject: [PATCH 267/302] removing malicious link on a domain that was re-registered --- content/pages/03-data/19-bokeh.markdown | 6 ------ content/pages/04-web-development/04-bottle.markdown | 2 +- content/pages/04-web-development/12-jinja2.markdown | 11 +++++------ content/pages/04-web-development/17-css.markdown | 4 ---- .../50-django-rest-framework-drf.markdown | 4 ---- 5 files changed, 6 insertions(+), 21 deletions(-) diff --git a/content/pages/03-data/19-bokeh.markdown b/content/pages/03-data/19-bokeh.markdown index 668538d90..b215de42d 100644 --- a/content/pages/03-data/19-bokeh.markdown +++ b/content/pages/03-data/19-bokeh.markdown @@ -61,12 +61,6 @@ basic syntax will change as the library's API is not yet stable. an appropriate format then explains the code that uses Bokeh to visualize it. -* [Data is beautiful: Visualizing Roman imperial dynasties](http://machineloveus.com/data-is-beautiful-visualizing-roman-imperial-dynasties/) - provides a walkthrough for creating a gorgeous visualization based on - historical Roman data. The post is about more than just the visual, it also - goes into the ideation, data wrangling and analysis phases that came - before using Bokeh to show the results. - * [Visualizing with Bokeh](https://programminghistorian.org/en/lessons/visualizing-with-bokeh) gives a detailed explanation with the code for number Bokeh visuals you can output while working with a [pandas](/pandas.html) data set. diff --git a/content/pages/04-web-development/04-bottle.markdown b/content/pages/04-web-development/04-bottle.markdown index 1f40db51c..01e543da4 100644 --- a/content/pages/04-web-development/04-bottle.markdown +++ b/content/pages/04-web-development/04-bottle.markdown @@ -29,7 +29,7 @@ Bottle is awesome for a few web development situations: Prototyping simple ideas is often easier with Bottle than a more opinionated web framework like [Django](/django.html) because Django projects start with a significant amount of boilerplate code. The -[Model-View-Template](https://docs.djangoproject.com/en/1.9/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names) +[Model-View-Template](https://docs.djangoproject.com/en/stable/intro/tutorial03/) structure for Django apps within projects makes maintaining projects easier, but it can be cumbersome on starter projects where you're just playing with random ideas so you aren't worried about your diff --git a/content/pages/04-web-development/12-jinja2.markdown b/content/pages/04-web-development/12-jinja2.markdown index 23137b27d..5197fc9d8 100644 --- a/content/pages/04-web-development/12-jinja2.markdown +++ b/content/pages/04-web-development/12-jinja2.markdown @@ -8,17 +8,17 @@ meta: Jinja2 is a template engine written in Python for outputting formats such Jinja, also commonly referred to as -"[Jinja2](http://jinja.pocoo.org/docs/dev/)" to specify the newest +"[Jinja2](https://jinja.palletsprojects.com/en/3.0.x/templates/)" to specify the newest release version, is a Python [template engine](/template-engines.html) used to create HTML, XML or other markup formats that are returned to the user via an HTTP response. -Logo for the Jinja template engine project. +Logo for the Jinja template engine project. ## Why is Jinja2 useful? Jinja2 is useful because it has consistent template tag syntax and the project is cleanly extracted as -[an independent open source project](https://github.com/mitsuhiko/jinja2) so +[an independent open source project](https://github.com/pallets/jinja) so it can be used as a dependency by other code libraries.

    Jinja2 is an implementation of the template engines concept. Learn more in the web development chapter or view the table of contents for all topics.
    @@ -31,9 +31,8 @@ end a developer can code whatever she wants. ## Jinja2 origin and development The first recorded public released of Jinja2 was in -[2008 with 2.0rc1](http://jinja.pocoo.org/docs/dev/changelog/#version-2-0rc1). -Since then the engine has seen numerous updates and remains in active -development. +2008 with 2.0rc1. Since then the engine has seen numerous updates and +remains under active development. Jinja2 engine certainly wasn't the first template engine. In fact, Jinja2's syntax is inspired by Django's built-in template engine, which was released diff --git a/content/pages/04-web-development/17-css.markdown b/content/pages/04-web-development/17-css.markdown index f7d3658b2..332ed565d 100644 --- a/content/pages/04-web-development/17-css.markdown +++ b/content/pages/04-web-development/17-css.markdown @@ -186,10 +186,6 @@ web application's design. talk about tables, because that was the only way to position anything back in the day. -* [30 seconds of CSS](https://30-seconds.github.io/30-seconds-of-css/) - provides short useful code snippets for you to learn from and use for - building your own web applications. - * [CSS: The bad bits](https://www.joeforshaw.com/blog/css-the-bad-bits-and-how-to-avoid-them) examines global scope, implicit percentage styling rules and the z-index which can be difficult to use and require some restraint to ensure they diff --git a/content/pages/04-web-development/50-django-rest-framework-drf.markdown b/content/pages/04-web-development/50-django-rest-framework-drf.markdown index 5824966bc..8e37986e0 100644 --- a/content/pages/04-web-development/50-django-rest-framework-drf.markdown +++ b/content/pages/04-web-development/50-django-rest-framework-drf.markdown @@ -60,10 +60,6 @@ typically abbreviated "DRF", is a Python library for building web * [Optimizing slow Django REST Framework performance](https://ses4j.github.io/2015/11/23/optimizing-slow-django-rest-framework-performance/) -* [TLT: Serializing Authenticated User Data With Django REST Framework](http://gregblogs.com/tlt-serializing-authenticated-user-data-with-django-rest-framework/) - -* [Building an API with Django REST Framework and Class-Based Views](https://codeburst.io/building-an-api-with-django-rest-framework-and-class-based-views-75b369b30396) - * [Simple Nested API Using Django REST Framework](https://blog.apptension.com/2017/09/13/rest-api-using-django-rest-framework/) * [Building APIs with Django and Django Rest Framework](https://books.agiliq.com/projects/django-api-polls-tutorial/en/latest/) From 233fb4d9839ce7eeab56f5b47f5e3684ebe2baf4 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 9 Jun 2021 07:54:52 -0400 Subject: [PATCH 268/302] fixing a ton of broken links --- content/pages/03-data/00-data.markdown | 5 +++++ .../04-web-development/11-template-engines.markdown | 4 ++++ .../31-static-site-generator.markdown | 8 +------- content/pages/04-web-development/35-testing.markdown | 10 ++-------- .../04-web-development/37-integration-testing.markdown | 3 --- content/pages/04-web-development/41-https.markdown | 4 ---- content/pages/04-web-development/44-web-apis.markdown | 5 ----- content/pages/05-deployment/22-wsgi-servers.markdown | 6 +++--- content/pages/05-deployment/23-gunicorn.markdown | 4 ++++ 9 files changed, 19 insertions(+), 30 deletions(-) diff --git a/content/pages/03-data/00-data.markdown b/content/pages/03-data/00-data.markdown index a2c996e10..493ebd45f 100644 --- a/content/pages/03-data/00-data.markdown +++ b/content/pages/03-data/00-data.markdown @@ -154,6 +154,11 @@ sets. have evolved over the past 20ish years based on his first-hand experience as a leader and member in that community. +* [Automated Data Wrangling](https://catalyst.coop/2021/05/23/automated-data-wrangling/) + covers cleaning, labeling, and automating the bunch of activities + that are typically necessary before analysis and data usage can + begin for a project. + * The [Open Source Data Science Masters](http://datasciencemasters.org/) is a well-crafted free curriculum and set of resources for students who want to learn both the theory and technologies for working with data. diff --git a/content/pages/04-web-development/11-template-engines.markdown b/content/pages/04-web-development/11-template-engines.markdown index f8b7bac06..551a70bfb 100644 --- a/content/pages/04-web-development/11-template-engines.markdown +++ b/content/pages/04-web-development/11-template-engines.markdown @@ -161,6 +161,10 @@ know how they work to aid your debugging. The following resources examine existing template engine design as well as how to build your own engine when that's necessary for your projects. +* [Writing a Jinja-inspired template library in Python](https://notes.eatonphil.com/writing-a-template-library-in-python.html) + walks through how to create your own a simplified version of the + [Jinja](/jinja2.html) template engine as a learning exercise. + * [How a template engine works](https://fengsp.github.io/blog/2016/8/how-a-template-engine-works/) uses the template module in Tornado as an example to step through how a template engine produces output, from parsing the incoming string to diff --git a/content/pages/04-web-development/31-static-site-generator.markdown b/content/pages/04-web-development/31-static-site-generator.markdown index 7b07bc047..d7f3c0983 100644 --- a/content/pages/04-web-development/31-static-site-generator.markdown +++ b/content/pages/04-web-development/31-static-site-generator.markdown @@ -206,12 +206,6 @@ point a domain name to your site as well as provide HTTPS support. These guides walk through various ways of handling the static site deployment. -* [Static site hosting with S3 and Cloudflare](https://wsvincent.com/static-site-hosting-with-s3-and-cloudflare/) - shows how to set up an S3 bucket with Cloudflare in front as a CDN that - serves the content with HTTPS. You should be able to accomplish roughly - the same situation with Amazon Cloudfront, but as a Cloudflare user I - like their service for these static site configurations. - * Google Cloud provides a tutorial on how to use them to [host your static site](https://cloud.google.com/storage/docs/hosting-static-website). Note that you cannot currently use HTTPS on Google Storage servers, which is a @@ -221,7 +215,7 @@ deployment. making static site deployments and redeployments to Amazon Web Services easier. -* [Deploying a Static Blog with Continuous Integration](https://www.loxodrome.io/post/hugo-on-ci/) +* [Deploying a Static Blog with Continuous Integration](https://www.jameslmilner.com/post/hugo-on-ci/) uses a Hugo (a Golang-based static site generator) generated site as an example but the instructions can easily be used to deploy a Python-based static site generator output as well. diff --git a/content/pages/04-web-development/35-testing.markdown b/content/pages/04-web-development/35-testing.markdown index 1a5e2912e..7594935d2 100644 --- a/content/pages/04-web-development/35-testing.markdown +++ b/content/pages/04-web-development/35-testing.markdown @@ -176,10 +176,10 @@ use mocks in your test cases. provides a whole code example based on a blog project that shows how to use `mock` when testing. -* [Python Mocking 101: Fake It Before You Make It](https://blog.fugue.co/2016-02-11-python-mocking-101.html) +* [Python Mocking 101: Fake It Before You Make It](https://www.fugue.co/blog/2016-02-11-python-mocking-101) explains what mocking is and is not, and shows how to use the `patch` function to accomplish it in your project. - [Revisiting Unit Testing and Mocking in Python](https://blog.fugue.co/2017-07-18-revisiting-unit-testing-and-mocking-in-python.html) + [Revisiting Unit Testing and Mocking in Python](https://www.fugue.co/blog/2017-07-18-revisiting-unit-testing-and-mocking-in-python.html) is a follow-up post that expands upon using the `patch` function along with dependency injection. @@ -191,12 +191,6 @@ use mocks in your test cases. examines when mocks are necessary and when they are not as useful so you can avoid them in your test cases. -* [Mocking Redis & Expiration in Python](http://malexandre.fr/2017/10/08/mocking-redis--expiration-in-python/) - is a specific scenario where you would want to test your - [Redis](/redis.html)-dependent code but prefer to mock it rather than - ensure an installation and connection are present whenever you run - your tests. - * [Better tests for Redis integrations with redislite](https://www.obeythetestinggoat.com/better-tests-for-redis-integrations-with-redislite.html) is a great example of how using the right mocking library can clean up existing hacky testing code and make it more straightforward for diff --git a/content/pages/04-web-development/37-integration-testing.markdown b/content/pages/04-web-development/37-integration-testing.markdown index 72d844b82..8594b4492 100644 --- a/content/pages/04-web-development/37-integration-testing.markdown +++ b/content/pages/04-web-development/37-integration-testing.markdown @@ -36,9 +36,6 @@ during development so they can be addressed immediately. gives an example of a system that needs integration tests and shows how context managers can be used to address the problem. -* Pytest has a page on [integration good practices](http://doc.pytest.org/en/latest/goodpractices.html) - that you'll likely want to follow when testing your application. - * [Integration testing, or how to sleep well at night](http://enterprisecraftsmanship.com/2015/07/13/integration-testing-or-how-to-sleep-well-at-nights/) explains what integration tests are and gives an example. The example is coded in Java but still relevant when you're learning about integration diff --git a/content/pages/04-web-development/41-https.markdown b/content/pages/04-web-development/41-https.markdown index ffe55e7c9..3bbb8239a 100644 --- a/content/pages/04-web-development/41-https.markdown +++ b/content/pages/04-web-development/41-https.markdown @@ -64,7 +64,3 @@ client web browser. cover the high-level information on the latest approved version of Transport Security Layer (TLS) 1.3. -* [How https works](https://www.sudhakar.online/programming/2015/08/09/https.html) - is a fun cartoon illustration that demonstrates the basic concepts of - a secure HTTP connection. - diff --git a/content/pages/04-web-development/44-web-apis.markdown b/content/pages/04-web-development/44-web-apis.markdown index a0e1eea19..0981c2743 100644 --- a/content/pages/04-web-development/44-web-apis.markdown +++ b/content/pages/04-web-development/44-web-apis.markdown @@ -91,11 +91,6 @@ on the number's page on Twilio as shown below. provides context for why JSON-based web services are more common today than SOAP which was popular in the early 2000s. -* [API tools for every occasion](https://medium.com/@orliesaurus/api-tools-for-every-occasion-10-api-tools-released-in-2015-i-can-t-live-without-d5947d9ca9c3) - provides a list of 10 tools that are really helpful when working with APIs - that are new in 2015. - - ## APIs learning checklist 1. Learn the API concepts of machine-to-machine communication with JSON and diff --git a/content/pages/05-deployment/22-wsgi-servers.markdown b/content/pages/05-deployment/22-wsgi-servers.markdown index 35174df41..036bdbe54 100644 --- a/content/pages/05-deployment/22-wsgi-servers.markdown +++ b/content/pages/05-deployment/22-wsgi-servers.markdown @@ -177,9 +177,9 @@ The following are WSGI servers based on community recommendations. is a good read to understand basic information about various WSGI server implementations. -* A thorough and informative post for LAMP-stack hosting choices is - presented in the - "[complete single server Django stack tutorial](http://www.apreche.net/complete-single-server-django-stack-tutorial/)." +* [What is WSGI and Why Do You Need Gunicorn and Nginx in Django](https://apirobot.me/posts/what-is-wsgi-and-why-do-you-need-gunicorn-and-nginx-in-django) + explains the breakdown between a [web server](/web-servers.html) + and a WSGI server in an application deployment environment. * The Python community made a long effort to [transition from mod\_python](http://blog.dscpl.com.au/2010/05/modpython-project-soon-to-be-officially.html) diff --git a/content/pages/05-deployment/23-gunicorn.markdown b/content/pages/05-deployment/23-gunicorn.markdown index f7098a1b4..e0c8a7f14 100644 --- a/content/pages/05-deployment/23-gunicorn.markdown +++ b/content/pages/05-deployment/23-gunicorn.markdown @@ -120,6 +120,10 @@ perform the request handling. Each worker is independent of the controller. documentation each contain instructions for deploying the respective frameworks with Gunicorn. +* [Dockerizing Django with Postgres, Gunicorn, and Traefik](https://testdriven.io/blog/django-docker-traefik/) + is a more advanced tutorial with a complete project deployment + that uses Gunicorn within [Docker](/docker.html). + * [Set up Django, Nginx and Gunicorn in a Virtualenv controled by Supervisor](https://gist.github.com/Atem18/4696071) is a GitHub Gist with some great explanations for why we're setting up virtualenv and what to watch out for while you're doing the deployment. From a8ad4f4bcf7f8c101be4b7e6075d01415cdc8d74 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 10 Jun 2021 06:57:08 -0400 Subject: [PATCH 269/302] fixing more broken links --- .../pages/04-web-development/00-web-development.markdown | 5 ----- content/pages/04-web-development/17-css.markdown | 4 ---- content/pages/04-web-development/32-pelican.markdown | 4 ---- content/pages/04-web-development/43-webrtc.markdown | 5 ----- content/pages/04-web-development/48-api-creation.markdown | 7 ------- 5 files changed, 25 deletions(-) diff --git a/content/pages/04-web-development/00-web-development.markdown b/content/pages/04-web-development/00-web-development.markdown index 29b3fb98b..c23e05a2b 100644 --- a/content/pages/04-web-development/00-web-development.markdown +++ b/content/pages/04-web-development/00-web-development.markdown @@ -100,11 +100,6 @@ world. something obvious you can handle in a few minutes that will improve your site's security, performance or usability. -* [Web application development is different and better](http://radar.oreilly.com/2014/01/web-application-development-is-different-and-better.html) - provides some context for how web development has evolved from writing - static HTML files into the complex JavaScript client-side applications - produced today. - * [The Browser Hacker's Guide to Instantly Loading Everything](https://www.youtube.com/watch?v=7vUs5yOuv-o) is a spectacular technical talk given by Addy Osmani at JSConf EU 2017 that has great bits of developer knowledge for both beginner and diff --git a/content/pages/04-web-development/17-css.markdown b/content/pages/04-web-development/17-css.markdown index 332ed565d..96c1b3ec8 100644 --- a/content/pages/04-web-development/17-css.markdown +++ b/content/pages/04-web-development/17-css.markdown @@ -149,10 +149,6 @@ web application's design. * [Google's Web Fundamentals class](https://developers.google.com/web/fundamentals/) shows how to create responsive designs and performant websites. -* [Tailoring CSS for performance](http://programming.oreilly.com/2014/04/tailoring-css-for-performance.html) - is an interesting read since many developers do not consider the - implications of CSS complexity in browser rendering time. - * [Can I Use...](http://caniuse.com/) is a compatibility table that shows which versions of browsers implement specific CSS features. diff --git a/content/pages/04-web-development/32-pelican.markdown b/content/pages/04-web-development/32-pelican.markdown index 064a3adf9..c1b0c0810 100644 --- a/content/pages/04-web-development/32-pelican.markdown +++ b/content/pages/04-web-development/32-pelican.markdown @@ -76,10 +76,6 @@ to hosting services such as Amazon S3 and GitHub Pages. take in new input markup formats, modify the generator process and add handy features such as a custom table of contents. -* [Pelican Sitemap and Pagination](http://www.vcheng.org/2014/02/22/pelican-sitemap-pagination/) - explains how to generate a `sitemap.xml` file for your static site that - includes all pages instead of just auto-included top-level pages. - * [Getting started with Pelican and GitHub pages](http://www.mattmakai.com/introduction-to-pelican.html) is a tutorial I wrote to use the Full Stack Python source code to create and deploy your first static site. diff --git a/content/pages/04-web-development/43-webrtc.markdown b/content/pages/04-web-development/43-webrtc.markdown index 36cf18799..297c12b9b 100644 --- a/content/pages/04-web-development/43-webrtc.markdown +++ b/content/pages/04-web-development/43-webrtc.markdown @@ -26,11 +26,6 @@ browser) and server (usually a [web server](/web-servers.html)). dependencies. It allows 2 web browsers to exchange audio and video streams by using the `aiohttp` and `python-socketio` modules. -* [A real world guide to WebRTC](https://deepstreamhub.com/tutorials/protocols/webrtc-intro/) - goes through WebRTC fundamentals such as data channels, audio and video, - screen sharing and file transfers with the JavaScript code provided - for each concept. - * The [Introduction to WebRTC video series](https://www.youtube.com/watch?v=ujpIAWmK2Vo) ([part 2](https://www.youtube.com/watch?v=cw2iTgIW-uk) and diff --git a/content/pages/04-web-development/48-api-creation.markdown b/content/pages/04-web-development/48-api-creation.markdown index da38541c2..fb21280d5 100644 --- a/content/pages/04-web-development/48-api-creation.markdown +++ b/content/pages/04-web-development/48-api-creation.markdown @@ -26,9 +26,6 @@ applications through machine-to-machine communication. [own GitHub organization](https://github.com/flask-restful/flask-restful) so engineers from outside the company could be core contributors. -* [Flask API](http://www.flaskapi.org/) is another common library for - exposing APIs from Flask web applications. - * [Sandman](http://www.github.com/jeffknupp/sandman) is a widely used tool to automatically generate a RESTful API service from a legacy database without writing a line of code (though it's easily extensible through code). @@ -154,10 +151,6 @@ equivalent of browser testing in the web application world. will use your API, as well as what the documentation for endpoints and other important pieces should look like. -* [1-to-1 Relationships and Subresources in REST APIs](http://developers.lyst.com/2015/02/20/1-to-1-relationships-and-subresources-in-rest-apis/) - tells the story of design decisions that were made during an API's creation - and why those choices were made. - * [How many status codes does your API need?](https://blogs.dropbox.com/developers/2015/04/how-many-http-status-codes-should-your-api-use/) gives an answer from a Dropbox API developer as to their decision making process. From 25366e593e8dc58f5761294c4e6e9098c6c49a60 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 10 Jun 2021 07:09:07 -0400 Subject: [PATCH 270/302] updating flask examples to remove broken flask-wtf link --- .../pages/examples/flask/flask-app-badrequest.markdown | 2 +- content/pages/examples/flask/flask-app-flask.markdown | 8 ++++---- content/pages/examples/flask/flask-app-headers.markdown | 2 +- .../examples/flask/flask-blueprints-blueprint.markdown | 4 ++-- .../examples/flask/flask-extensions-plug-ins.markdown | 2 +- .../examples/flask/flask-globals-current-app.markdown | 4 ++-- content/pages/examples/flask/flask-globals-g.markdown | 2 +- .../pages/examples/flask/flask-globals-request.markdown | 4 ++-- .../pages/examples/flask/flask-globals-session.markdown | 4 ++-- .../pages/examples/flask/flask-helpers-url-for.markdown | 4 ++-- content/pages/examples/flask/flask-json-jsonify.markdown | 2 +- .../examples/flask/flask-sessions-badsignature.markdown | 2 +- .../flask-templating-render-template-string.markdown | 2 +- .../flask/flask-templating-render-template.markdown | 8 ++++---- content/pages/examples/flask/flask-views-view.markdown | 2 +- .../sqlalchemy/sqlalchemy-extensions-plug-ins.markdown | 2 +- 16 files changed, 27 insertions(+), 27 deletions(-) diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 76ff30b02..3063a6da3 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -149,7 +149,7 @@ def rison(schema=None): ## Example 2 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) -([project documentation](https://flask-wtf.readthedocs.io/en/stable/) +([project documentation](https://flask-wtf.readthedocs.io/) and [PyPI page](https://pypi.org/project/Flask-WTF/)) provides a bridge between [Flask](/flask.html) and the the diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 33f54b1ef..b8ab9467b 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -19,7 +19,7 @@ application's functionality, including URL rounting, and ImmutableDict are several other callables with code examples from the same `flask.app` package. -These subjects go along with the `Flask` code examples: +These topics are also useful while reading the `Flask` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -380,7 +380,7 @@ libraries that are commonly used in Flask projects, such as [SendGrid](https://www.twilio.com/sendgrid) for transactional email, [SQLAlchemy](/sqlalchemy.html) for persistent data storage through a [relational database](/databases.html) backend, -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +[Flask-WTF](https://flask-wtf.readthedocs.io/) for form handling and many others. flask-base is provided as open source under the @@ -677,7 +677,7 @@ class HTTPAuthTestCase(unittest.TestCase): is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) JavaScript plugin with the -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) form-handling +[Flask-WTF](https://flask-wtf.readthedocs.io/) form-handling library. flask-phone-input is provided as open source under the [MIT license](https://github.com/miguelgrinberg/flask-phone-input/blob/1a1c227c044474ce0fe133493d7f8b0fb8312409/LICENSE). @@ -729,7 +729,7 @@ def index(): starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The boilerplate relies on many common Flask extensions such as -[Flask-WTF](https://flask-wtf.readthedocs.io/en/latest/), +[Flask-WTF](https://flask-wtf.readthedocs.io/), [Flask-Login](https://flask-login.readthedocs.io/en/latest/), [Flask-Admin](https://flask-admin.readthedocs.io/en/latest/), and many others. The project is provided as open source under the diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index cbbeeabc3..f16fe863b 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -22,7 +22,7 @@ Flask web applications. and ImmutableDict are several other callables with code examples from the same `flask.app` package. -These topics are also useful while reading the `Headers` examples: +These subjects go along with the `Headers` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index d74117ac5..07e39cf51 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -309,7 +309,7 @@ libraries that are commonly used in Flask projects, such as [SendGrid](https://www.twilio.com/sendgrid) for transactional email, [SQLAlchemy](/sqlalchemy.html) for persistent data storage through a [relational database](/databases.html) backend, -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +[Flask-WTF](https://flask-wtf.readthedocs.io/) for form handling and many others. flask-base is provided as open source under the @@ -649,7 +649,7 @@ def swagger_static(filename): ## Example 10 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) -([project documentation](https://flask-wtf.readthedocs.io/en/stable/) +([project documentation](https://flask-wtf.readthedocs.io/) and [PyPI page](https://pypi.org/project/Flask-WTF/)) provides a bridge between [Flask](/flask.html) and the the diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown index 9467b3f26..de0d41668 100644 --- a/content/pages/examples/flask/flask-extensions-plug-ins.markdown +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -219,7 +219,7 @@ building on, and the source code is open source under the ### Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) -([project documentation](https://flask-wtf.readthedocs.io/en/stable/) +([project documentation](https://flask-wtf.readthedocs.io/) and [PyPI page](https://pypi.org/project/Flask-WTF/)) provides a bridge between [Flask](/flask.html) and the the diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 8dcdeaf60..fefae63cc 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -630,7 +630,7 @@ libraries that are commonly used in Flask projects, such as [SendGrid](https://www.twilio.com/sendgrid) for transactional email, [SQLAlchemy](/sqlalchemy.html) for persistent data storage through a [relational database](/databases.html) backend, -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +[Flask-WTF](https://flask-wtf.readthedocs.io/) for form handling and many others. flask-base is provided as open source under the @@ -1894,7 +1894,7 @@ except ImportError: ## Example 14 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) -([project documentation](https://flask-wtf.readthedocs.io/en/stable/) +([project documentation](https://flask-wtf.readthedocs.io/) and [PyPI page](https://pypi.org/project/Flask-WTF/)) provides a bridge between [Flask](/flask.html) and the the diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index e84628965..8fced1573 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -679,7 +679,7 @@ class HTTPBasicAuth(HTTPAuth): ## Example 6 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) -([project documentation](https://flask-wtf.readthedocs.io/en/stable/) +([project documentation](https://flask-wtf.readthedocs.io/) and [PyPI page](https://pypi.org/project/Flask-WTF/)) provides a bridge between [Flask](/flask.html) and the the diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 4368a1a2f..b67c2a446 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -1997,7 +1997,7 @@ class marshal_with_field(object): ## Example 12 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) -([project documentation](https://flask-wtf.readthedocs.io/en/stable/) +([project documentation](https://flask-wtf.readthedocs.io/) and [PyPI page](https://pypi.org/project/Flask-WTF/)) provides a bridge between [Flask](/flask.html) and the the @@ -2159,7 +2159,7 @@ def generate_csrf(secret_key=None, token_key=None): starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The boilerplate relies on many common Flask extensions such as -[Flask-WTF](https://flask-wtf.readthedocs.io/en/latest/), +[Flask-WTF](https://flask-wtf.readthedocs.io/), [Flask-Login](https://flask-login.readthedocs.io/en/latest/), [Flask-Admin](https://flask-admin.readthedocs.io/en/latest/), and many others. The project is provided as open source under the diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 6659b6dbf..9ff29a99a 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -730,7 +730,7 @@ def login_required(func): ## Example 7 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) -([project documentation](https://flask-wtf.readthedocs.io/en/stable/) +([project documentation](https://flask-wtf.readthedocs.io/) and [PyPI page](https://pypi.org/project/Flask-WTF/)) provides a bridge between [Flask](/flask.html) and the the @@ -845,7 +845,7 @@ def _get_config( starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The boilerplate relies on many common Flask extensions such as -[Flask-WTF](https://flask-wtf.readthedocs.io/en/latest/), +[Flask-WTF](https://flask-wtf.readthedocs.io/), [Flask-Login](https://flask-login.readthedocs.io/en/latest/), [Flask-Admin](https://flask-admin.readthedocs.io/en/latest/), and many others. The project is provided as open source under the diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index a82f0f96d..ad0cc1b93 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -350,7 +350,7 @@ libraries that are commonly used in Flask projects, such as [SendGrid](https://www.twilio.com/sendgrid) for transactional email, [SQLAlchemy](/sqlalchemy.html) for persistent data storage through a [relational database](/databases.html) backend, -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +[Flask-WTF](https://flask-wtf.readthedocs.io/) for form handling and many others. flask-base is provided as open source under the @@ -759,7 +759,7 @@ def ui_for(api): starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The boilerplate relies on many common Flask extensions such as -[Flask-WTF](https://flask-wtf.readthedocs.io/en/latest/), +[Flask-WTF](https://flask-wtf.readthedocs.io/), [Flask-Login](https://flask-login.readthedocs.io/en/latest/), [Flask-Admin](https://flask-admin.readthedocs.io/en/latest/), and many others. The project is provided as open source under the diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index ae6a13eca..ea045cad1 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -770,7 +770,7 @@ def get_component_module(module_name): starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The boilerplate relies on many common Flask extensions such as -[Flask-WTF](https://flask-wtf.readthedocs.io/en/latest/), +[Flask-WTF](https://flask-wtf.readthedocs.io/), [Flask-Login](https://flask-login.readthedocs.io/en/latest/), [Flask-Admin](https://flask-admin.readthedocs.io/en/latest/), and many others. The project is provided as open source under the diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index c7b207921..5208b7aed 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -88,7 +88,7 @@ libraries that are commonly used in Flask projects, such as [SendGrid](https://www.twilio.com/sendgrid) for transactional email, [SQLAlchemy](/sqlalchemy.html) for persistent data storage through a [relational database](/databases.html) backend, -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +[Flask-WTF](https://flask-wtf.readthedocs.io/) for form handling and many others. flask-base is provided as open source under the diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 563672ef3..ddddb67b9 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -20,7 +20,7 @@ the `.templating` part. render_template is another callable from the `flask.templating` package with code examples. -These topics are also useful while reading the `render_template_string` examples: +You should read up on these subjects along with these `render_template_string` examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index f47d4a348..ed4c35fdf 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -21,7 +21,7 @@ the `.templating` part. render_template_string is another callable from the `flask.templating` package with code examples. -You should read up on these subjects along with these `render_template` examples: +These subjects go along with the `render_template` code examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) @@ -310,7 +310,7 @@ libraries that are commonly used in Flask projects, such as [SendGrid](https://www.twilio.com/sendgrid) for transactional email, [SQLAlchemy](/sqlalchemy.html) for persistent data storage through a [relational database](/databases.html) backend, -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +[Flask-WTF](https://flask-wtf.readthedocs.io/) for form handling and many others. flask-base is provided as open source under the @@ -801,7 +801,7 @@ def update(c_id): is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) JavaScript plugin with the -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) form-handling +[Flask-WTF](https://flask-wtf.readthedocs.io/) form-handling library. flask-phone-input is provided as open source under the [MIT license](https://github.com/miguelgrinberg/flask-phone-input/blob/1a1c227c044474ce0fe133493d7f8b0fb8312409/LICENSE). @@ -1020,7 +1020,7 @@ def ui_for(api): starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The boilerplate relies on many common Flask extensions such as -[Flask-WTF](https://flask-wtf.readthedocs.io/en/latest/), +[Flask-WTF](https://flask-wtf.readthedocs.io/), [Flask-Login](https://flask-login.readthedocs.io/en/latest/), [Flask-Admin](https://flask-admin.readthedocs.io/en/latest/), and many others. The project is provided as open source under the diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 25ca74e2d..1f8e51936 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -20,7 +20,7 @@ and http_method_funcs are a couple of other callables within the `flask.views` package that also have code examples. -These topics are also useful while reading the `View` examples: +You should read up on these subjects along with these `View` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index 0ff095a54..c24866e5f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -49,7 +49,7 @@ libraries that are commonly used in Flask projects, such as [SendGrid](https://www.twilio.com/sendgrid) for transactional email, [SQLAlchemy](/sqlalchemy.html) for persistent data storage through a [relational database](/databases.html) back end, -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +[Flask-WTF](https://flask-wtf.readthedocs.io/) for form handling, and many others. flask-base is provided as open source under the From 09010fdb424185c5870a072a7f5c86ba24423336 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 10 Jun 2021 07:40:07 -0400 Subject: [PATCH 271/302] fixing more broken links --- content/pages/03-data/18-data-visualization.markdown | 5 ----- .../examples/flask/flask-example-projects-code.markdown | 2 +- .../sqlalchemy/sqlalchemy-exc-integrityerror.markdown | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/content/pages/03-data/18-data-visualization.markdown b/content/pages/03-data/18-data-visualization.markdown index af18aada8..3fa0856fc 100644 --- a/content/pages/03-data/18-data-visualization.markdown +++ b/content/pages/03-data/18-data-visualization.markdown @@ -91,11 +91,6 @@ Sometimes you need inspiration from other sources to figure out what you want to build. The following links have made me excited about data visualization and gave me ideas for what to build. -* [Roads to Rome](http://roadstorome.moovellab.com/) is a beautiful - visualization showing the data behind the expression "all roads lead - to Rome" and whether or not there is a "Rome" central city in every - country. - * [Monarchs](https://thebackend.dev/monarchs/) is a wonderful 1,000 year history visual of European rulers. The developer also wrote an in-depth article on diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index a4b3d973e..e8a469a5d 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -99,7 +99,7 @@ is configured in JSON. The code is provided as open source under the is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) JavaScript plugin with the -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) form-handling +[Flask-WTF](https://flask-wtf.readthedocs.io/) form-handling library. flask-phone-input is provided as open source under the [MIT license](https://github.com/miguelgrinberg/flask-phone-input/blob/1a1c227c044474ce0fe133493d7f8b0fb8312409/LICENSE). diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown index 615febd9c..88658c4f4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown @@ -142,7 +142,7 @@ libraries that are commonly used in Flask projects, such as [SendGrid](https://www.twilio.com/sendgrid) for transactional email, [SQLAlchemy](/sqlalchemy.html) for persistent data storage through a [relational database](/databases.html) backend, -[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +[Flask-WTF](https://flask-wtf.readthedocs.io/) for form handling and many others. flask-base is provided as open source under the From 2d0ae8c5bc7c8cf413bf90eae371625f9d4985b5 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 11 Jun 2021 09:48:03 -0400 Subject: [PATCH 272/302] fixing more broken links --- content/pages/03-data/04-sqlite.markdown | 5 ----- content/pages/03-data/18-data-visualization.markdown | 4 ---- content/pages/05-deployment/00-deployment.markdown | 2 +- content/pages/05-deployment/20-caddy.markdown | 3 ++- content/pages/05-deployment/36-docker.markdown | 10 ---------- content/pages/05-deployment/37-kubernetes.markdown | 8 ++++---- content/pages/05-deployment/38-serverless.markdown | 3 +-- content/pages/05-deployment/39-aws-lambda.markdown | 3 +-- 8 files changed, 9 insertions(+), 29 deletions(-) diff --git a/content/pages/03-data/04-sqlite.markdown b/content/pages/03-data/04-sqlite.markdown index d5aee3aaa..5c7f3fd00 100644 --- a/content/pages/03-data/04-sqlite.markdown +++ b/content/pages/03-data/04-sqlite.markdown @@ -155,11 +155,6 @@ you are having with SQLite rather than going through a general tutorial. [object-relational mapper (ORM)](/object-relational-mappers-orms.html) to implement virtual tables and aggregates on top of SQLite. -* [Use SQLite with Django On AWS Lambda with Zappa](https://blog.zappa.io/posts/use-sqlite-with-django-on-aws-lambda-with-zappa) - provides an example `dev_settings.py` file for - locally testing a [Django](/django.html) application intended for - [AWS Lambda](/aws-lambda.html). - * [SQLite Database Authorization and Access Control with Python](http://charlesleifer.com/blog/sqlite-database-authorization-and-access-control-with-python/) covers how to control access to the SQLite database connection and file even though SQLite normally allows unauthorized access by design. diff --git a/content/pages/03-data/18-data-visualization.markdown b/content/pages/03-data/18-data-visualization.markdown index 3fa0856fc..e56c2b2dc 100644 --- a/content/pages/03-data/18-data-visualization.markdown +++ b/content/pages/03-data/18-data-visualization.markdown @@ -102,10 +102,6 @@ visualization and gave me ideas for what to build. and dark sides, the main characters, various bits about the Force and other data extracted from the movies. -* [Big League Graphs](https://bigleaguegraphs.com/) presents a bunch of - creative ways to view data for sports such as basketball, baseball and - hockey. - * [What do numbers look like?](https://johnhw.github.io/umap_primes/index.md.html) is a Python 3 dimensional visualization of millions of integers, colored by special factors such as prime and Fibonacci numbers. diff --git a/content/pages/05-deployment/00-deployment.markdown b/content/pages/05-deployment/00-deployment.markdown index a7080da8a..7475b8e54 100644 --- a/content/pages/05-deployment/00-deployment.markdown +++ b/content/pages/05-deployment/00-deployment.markdown @@ -51,7 +51,7 @@ guide as they are considered advanced deployment techniques. * [teletraan](https://github.com/pinterest/teletraan) is the deploy system used by the development teams at Pinterest, a huge Python shop! -* [pants](https://www.pantsbuild.org/index.html) is a build system originally +* [pants](https://www.pantsbuild.org/) is a build system originally created at Twitter and now split out as its own sustainable open source project. diff --git a/content/pages/05-deployment/20-caddy.markdown b/content/pages/05-deployment/20-caddy.markdown index 1b27e6d11..56ca43167 100644 --- a/content/pages/05-deployment/20-caddy.markdown +++ b/content/pages/05-deployment/20-caddy.markdown @@ -15,7 +15,8 @@ and design emphasize HTTPS-everywhere along with the HTTP/2 protocol. ## How can Caddy be used with Python deployments? Caddy can be used both for testing during local development or as part of a production deployment as an HTTP server and a reverse proxy with -the [proxy directive](https://caddyserver.com/docs/proxy). +the +[reverse_proxy directive](https://caddyserver.com/docs/caddyfile/directives/reverse_proxy).
    Caddy is an implementation of the web server concept. Learn how these pieces fit together in the deployment chapter or view the table of contents for all topics.
    diff --git a/content/pages/05-deployment/36-docker.markdown b/content/pages/05-deployment/36-docker.markdown index 8017a95da..6fe74a04c 100644 --- a/content/pages/05-deployment/36-docker.markdown +++ b/content/pages/05-deployment/36-docker.markdown @@ -48,20 +48,10 @@ on Amazon Web Services, Google Compute Engine, Linode, Rackspace or elsewhere. repository and tutorial that shows you how to recreate a simplified version of Docker to better understand what it's doing under the hood. -* [Andrew Baker](https://github.com/atbaker) presented a fantastic tutorial - at [PyOhio](http://andrewtorkbaker.com/pyohio-docker-101-tutorial) on - [beginner and advanced Docker usage](https://github.com/atbaker/docker-tutorial). - Andrew also wrote the article - [what containers can do for you](http://radar.oreilly.com/2015/01/what-containers-can-do-for-you.html). - * [Docker curriculum](http://prakhar.me/docker-curriculum/) is a detailed tutorial created by a developer to show the exact steps for deploying an application that relies on [Elasticsearch](https://www.elastic.co/). -* [How To Install and Use Docker on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04) - provides a walkthrough for Ubuntu 16.04 for installing and beginning to - use Docker for development. - * [It Really is the Future](http://blog.circleci.com/it-really-is-the-future/) discusses Docker and containers in the context of whether it's all just a bunch of hype or if this is a real trend for infrastructure automation. diff --git a/content/pages/05-deployment/37-kubernetes.markdown b/content/pages/05-deployment/37-kubernetes.markdown index 3e029b97d..039c1b270 100644 --- a/content/pages/05-deployment/37-kubernetes.markdown +++ b/content/pages/05-deployment/37-kubernetes.markdown @@ -30,11 +30,11 @@ applications. * [Kompose](http://kompose.io/index) ([source code](https://github.com/kubernetes/kompose)) - translate Docker Compose files into Kubernetes configuration resources. + translates Docker Compose files into Kubernetes configuration resources. -* [skaffold](https://skaffold.dev/). [Using Kubernetes for local development](https://nemethgergely.com/using-kubernetes-for-local-development/index.html) - is a good starting place for more information on getting started with - Skaffold. +* [skaffold](https://skaffold.dev/) + ([source code](https://github.com/GoogleContainerTools/skaffold)) makes + it easier to develop locally with Kubernetes. * [kubethanos](https://github.com/berkay-dincer/kubethanos) is a tool to kill half of your Kubernetes pods at random, to test the resilience of your diff --git a/content/pages/05-deployment/38-serverless.markdown b/content/pages/05-deployment/38-serverless.markdown index ad05af5f1..aea641dff 100644 --- a/content/pages/05-deployment/38-serverless.markdown +++ b/content/pages/05-deployment/38-serverless.markdown @@ -83,8 +83,7 @@ include: which is a useful but generically-named library that focuses on deployment and operations for serverless applications. -* [Zappa](https://www.zappa.io/) - ([source code](https://github.com/Miserlou/Zappa)) +* [Zappa](https://github.com/Miserlou/Zappa) provides code and tools to make it much easier to build on AWS Lambda and AWS API Gateway than rolling your own on the bare services. diff --git a/content/pages/05-deployment/39-aws-lambda.markdown b/content/pages/05-deployment/39-aws-lambda.markdown index fec7e2944..c4242c570 100644 --- a/content/pages/05-deployment/39-aws-lambda.markdown +++ b/content/pages/05-deployment/39-aws-lambda.markdown @@ -38,8 +38,7 @@ has support for both Python 2.7, 3.6 and 3.7. * [Zappa](https://github.com/Miserlou/Zappa) is a serverless framework for deploying Python web applications. It's a really slick project and used even by internal AWS developers for their own application - deployments. Be sure to [read the Zappa blog](https://blog.zappa.io/) - as well for walkthroughs and new feature announcements. + deployments. * [How to Setup a Serverless URL Shortener With API Gateway Lambda and DynamoDB on AWS](https://blog.ruanbekker.com/blog/2018/11/30/how-to-setup-a-serverless-url-shortener-with-api-gateway-lambda-and-dynamodb-on-aws/) builds a non-trivial URL shortener application as an example Python From ec696ce5aa7b0817d2985f5cc003b9fa88050c84 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 14 Jun 2021 07:41:17 -0400 Subject: [PATCH 273/302] fixing more broken links --- content/pages/04-web-development/27-task-queues.markdown | 4 ---- content/pages/05-deployment/00-deployment.markdown | 8 -------- content/pages/05-deployment/19-nginx.markdown | 4 +--- content/pages/05-deployment/24-uwsgi.markdown | 4 ---- content/pages/05-deployment/39-aws-lambda.markdown | 8 -------- content/pages/05-deployment/40-azure-functions.markdown | 3 --- 6 files changed, 1 insertion(+), 30 deletions(-) diff --git a/content/pages/04-web-development/27-task-queues.markdown b/content/pages/04-web-development/27-task-queues.markdown index 10ba31986..9533a586d 100644 --- a/content/pages/04-web-development/27-task-queues.markdown +++ b/content/pages/04-web-development/27-task-queues.markdown @@ -121,10 +121,6 @@ when scaling out a large deployment of distributed task queues. is a detailed comparison of Amazon SQS, MongoDB, RabbitMQ, HornetQ and Kafka's designs and performance. -* [Queues.io](http://queues.io/) is a collection of task queue systems with - short summaries for each one. The task queues are not all compatible with - Python but ones that work with it are tagged with the "Python" keyword. - * [Why Task Queues](http://www.slideshare.net/bryanhelmig/task-queues-comorichweb-12962619) is a presentation for what task queues are and why they are needed. diff --git a/content/pages/05-deployment/00-deployment.markdown b/content/pages/05-deployment/00-deployment.markdown index 7475b8e54..48ad4e8c1 100644 --- a/content/pages/05-deployment/00-deployment.markdown +++ b/content/pages/05-deployment/00-deployment.markdown @@ -132,14 +132,6 @@ guide as they are considered advanced deployment techniques. is an awesome in-depth read covering topics ranging from git branching to database migrations. -* In [this free video by Neal Ford](http://player.oreilly.com/videos/9781491908181?toc_id=210188), - he talks about engineering practices for continuous delivery. He explains - the difference between - [continuous integration](/continuous-integration.html), - continuous deployment and continuous delivery. Highly recommended for an - overview of deployment concepts and as an introduction to the other videos - on those subjects in that series. - * [TestDriven.io](https://testdriven.io/) shows how to deploy a [microservices](/microservices.html) architecture that uses [Docker](/docker.html), [Flask](/flask.html), and React with diff --git a/content/pages/05-deployment/19-nginx.markdown b/content/pages/05-deployment/19-nginx.markdown index afe620d84..98626e467 100644 --- a/content/pages/05-deployment/19-nginx.markdown +++ b/content/pages/05-deployment/19-nginx.markdown @@ -74,9 +74,7 @@ HTTP(S) configurations. * [Strong SSL Security on Nginx](https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html) shows how to mitigate high profile SSL attacks like - [Logjam](https://weakdh.org/), - [Heartbleed](http://heartbleed.com/) - and [FREAK](https://freakattack.com/). + [Logjam](https://weakdh.org/) and [Heartbleed](http://heartbleed.com/). ## Specific Nginx resources diff --git a/content/pages/05-deployment/24-uwsgi.markdown b/content/pages/05-deployment/24-uwsgi.markdown index 985d326fe..7561de3da 100644 --- a/content/pages/05-deployment/24-uwsgi.markdown +++ b/content/pages/05-deployment/24-uwsgi.markdown @@ -42,7 +42,3 @@ implementation that is typically used to run Python web applications. is awesome because it shows you how to code a quick WSGI application without using a framework then builds up an example with deploying a traditional Django web app. - -* [Deployment Notes for Pylons, Nginx, and uWSGI](http://tonylandis.com/python/deployment-howt-pylons-nginx-and-uwsgi/) - gives the code and instructions for setting up a Pylons application - with uWSGI. diff --git a/content/pages/05-deployment/39-aws-lambda.markdown b/content/pages/05-deployment/39-aws-lambda.markdown index c4242c570..e775cc20b 100644 --- a/content/pages/05-deployment/39-aws-lambda.markdown +++ b/content/pages/05-deployment/39-aws-lambda.markdown @@ -69,14 +69,6 @@ has support for both Python 2.7, 3.6 and 3.7. * [Code Evaluation With AWS Lambda and API Gateway](https://realpython.com/blog/python/code-evaluation-with-aws-lambda-and-api-gateway/) shows how to develop a code evaluation API, to execute arbitrary code, with AWS Lambda and API Gateway. -* [Crawling thousands of products using AWS Lambda](https://engineering.21buttons.com/crawling-thousands-of-products-using-aws-lambda-80332e259de1) - gives a real-world example of where using Python, Selenium and - [headless Chrome](https://developers.google.com/web/updates/2017/04/headless-chrome) - on AWS Lambda could crawl thousands of pages to collect data - with each crawler running within its own Lambda Function. - -* [Going Serverless with AWS Lambda and API Gateway](http://blog.ryankelly.us/2016/08/07/going-serverless-with-aws-lambda-and-api-gateway.html) - ### General AWS Lambda resources * [Getting started with serverless on AWS](https://emshea.com/post/serverless-getting-started) diff --git a/content/pages/05-deployment/40-azure-functions.markdown b/content/pages/05-deployment/40-azure-functions.markdown index 4cb8243e1..7f718f64a 100644 --- a/content/pages/05-deployment/40-azure-functions.markdown +++ b/content/pages/05-deployment/40-azure-functions.markdown @@ -44,6 +44,3 @@ in other Azure services. what is confusing to newcomers that hopefully will be addressed as Microsoft continues to work on their Azure platform. -* [Azure in Plain English](https://www.expeditedssl.com/azure-in-plain-english) - covers all of the Azure services and explains them because their - default names are often too vague to understand their purpose. From 8cf4fd927fe656811c6b01857bc3b7a77feb5ec8 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 16 Jun 2021 10:52:35 -0400 Subject: [PATCH 274/302] fixing two broken links --- content/pages/04-web-development/28-celery.markdown | 12 ------------ .../pages/04-web-development/38-debugging.markdown | 4 ---- 2 files changed, 16 deletions(-) diff --git a/content/pages/04-web-development/28-celery.markdown b/content/pages/04-web-development/28-celery.markdown index 5d8a3c746..de2c60027 100644 --- a/content/pages/04-web-development/28-celery.markdown +++ b/content/pages/04-web-development/28-celery.markdown @@ -163,10 +163,6 @@ web framework of your choice. is a detailed walkthrough for setting up Celery with Django (although Celery can also be used without a problem with other frameworks). -* [Introducing Celery for Python+Django](http://www.linuxforu.com/2013/12/introducing-celery-pythondjango/) - provides an introduction to the Celery task queue with Django as the - intended framework for building a web application. - * [Asynchronous Tasks with Falcon and Celery](https://testdriven.io/asynchronous-tasks-with-falcon-and-celery) configures Celery with the [Falcon](/falcon.html) framework, which is less commonly-used in web tutorials. @@ -186,18 +182,10 @@ adds some additional complexity to your [deployments](/deployment.html). The following resources walk you through how to handle deployments and get the right configuration settings in place. -* The "Django in Production" series by - [Rob Golding](https://twitter.com/robgolding63) contains a post - specifically on [Background Tasks](http://www.robgolding.com/blog/2011/11/27/django-in-production-part-2---background-tasks/). - * [How to run celery as a daemon?](https://pythad.github.io/articles/2016-12/how-to-run-celery-as-a-daemon-in-production) is a short post with the minimal code for running the Celery daemon and Celerybeat as system services on Linux. -* [Celery in Production](http://www.caktusgroup.com/blog/2014/09/29/celery-production/) - on the Caktus Group blog contains good practices from their experience - using Celery with RabbitMQ, monitoring tools and other aspects not often - discussed in existing documentation. * [Three quick tips from two years with Celery](https://library.launchkit.io/three-quick-tips-from-two-years-with-celery-c05ff9d7f9eb) provides some solid advice on retry delays, the `-Ofair` flag and global diff --git a/content/pages/04-web-development/38-debugging.markdown b/content/pages/04-web-development/38-debugging.markdown index e2936c6ae..8cf576d27 100644 --- a/content/pages/04-web-development/38-debugging.markdown +++ b/content/pages/04-web-development/38-debugging.markdown @@ -137,10 +137,6 @@ give solid programming language-agnostic debugging advice. * [The art of debugging](https://remysharp.com/2015/10/14/the-art-of-debugging) provides a whirlwind overview for how to fix issues in your code. -* [How to debug JavaScript errors](https://rollbar.com/guides/how-to-debug-javascript/) - introduces some key debugging tools such as source maps that make - identifying errors on the client side much easier during development. - * [Linux debugging tools you'll love](https://jvns.ca/debugging-zine.pdf) is an awesome comic that covers the Linux ecosystem for debugging. From 5a0518b766d57cf7ecc437bddc0832dc8432c379 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 17 Jun 2021 07:00:08 -0400 Subject: [PATCH 275/302] fix a slew of broken links --- .../pages/01-introduction/05-enterprise-python.markdown | 2 +- content/pages/01-introduction/06-community.markdown | 9 ++------- .../15-application-dependencies.markdown | 7 ------- .../18-source-control.markdown | 6 +++--- .../pages/02-development-environments/19-git.markdown | 4 ---- content/pages/04-web-development/28-celery.markdown | 2 +- .../posts/160626-django-gunicorn-mint-linux-17.markdown | 4 ++-- 7 files changed, 9 insertions(+), 25 deletions(-) diff --git a/content/pages/01-introduction/05-enterprise-python.markdown b/content/pages/01-introduction/05-enterprise-python.markdown index f6f1ea7f8..d96558641 100644 --- a/content/pages/01-introduction/05-enterprise-python.markdown +++ b/content/pages/01-introduction/05-enterprise-python.markdown @@ -70,7 +70,7 @@ best maintained and fully featured pieces of code for any language. Meanwhile, some of the traditional enterprise software development languages such as Java have languished due to underinvestment by their major corporate -backers. When [Oracle purchased Sun Microsystems in 2009](http://www.oracle.com/us/corporate/press/018363) +backers. When [Oracle purchased Sun Microsystems in 2009](https://www.oracle.com/corporate/pressrelease/oracle-buys-sun-042009.html) there was a long lag time before Java was enhanced with new language features in Java 7. Oracle also [bundles unwanted adware with the Java installation](http://www.engadget.com/2015/03/06/java-adware-mac/), diff --git a/content/pages/01-introduction/06-community.markdown b/content/pages/01-introduction/06-community.markdown index 1baec5f4f..a5f463319 100644 --- a/content/pages/01-introduction/06-community.markdown +++ b/content/pages/01-introduction/06-community.markdown @@ -77,7 +77,7 @@ resources provide perspective on offline events like and [PyCon US 2016](http://www.dreisbach.us/blog/pycon-2016/). There are many other retrospectives for other - [community-led conferences such as EuroPython](http://www.artima.com/weblogs/viewpost.jsp?thread=261930). + [community-led conferences such as EuroPython](https://www.artima.com/weblogs/viewpost.jsp?thread=261930). These summaries can be a great way to get a slice of the experience before purchasing a ticket and booking a trip. @@ -112,16 +112,11 @@ the community. provides a starter page with links to community-run newsletters, resources and conferences. -* There are many large active online communities on - [Reddit](https://www.reddit.com/r/python) and - [IRC channels](https://freenode.net/) such as #python, #python-dev - and #distutils. - * The Python community has a concept known as "Benevolent Dictator For Life" that may appear odd to newcomers. Essentially, Guido Van Rossum created the language and still has the ability to decide community arguments one way or the other. This post on the - [origin of BDFL](http://www.artima.com/weblogs/viewpost.jsp?thread=235725) + [origin of BDFL](https://www.artima.com/weblogs/viewpost.jsp?thread=235725) has more context about Guido's role. * [Python Community and Python at Dropbox](https://talkpython.fm/episodes/show/30/python-community-and-python-at-dropbox) diff --git a/content/pages/02-development-environments/15-application-dependencies.markdown b/content/pages/02-development-environments/15-application-dependencies.markdown index 513b62081..4fe802b6a 100644 --- a/content/pages/02-development-environments/15-application-dependencies.markdown +++ b/content/pages/02-development-environments/15-application-dependencies.markdown @@ -39,9 +39,6 @@ all yourself. A few of the best collections of Python libraries are shows the open source Python projects trending today, this week, and this month. -* This list of [20 Python libraries you can’t live without](http://freepythontips.wordpress.com/2013/07/30/20-python-libraries-you-cant-live-without/) - is a wide-ranging collection from data analysis to testing tools. - * Wikipedia actually has an extensive [page dedicated to Python libraries](http://en.wikipedia.org/wiki/List_of_Python_software) grouped by categories. @@ -224,10 +221,6 @@ developers. dependency management tools including newer ones such as pipenv and Poetry. -* Occasionally arguments about using Python's dependency manager versus - one of Linux's dependency managers comes up. This provides - [one perspective on that debate](http://notes.pault.ag/debian-python/). - * [Open source trust scaling](http://lucumr.pocoo.org/2016/3/24/open-source-trust-scaling/) is a good piece for the [Python community](/python-community.html) (and other programming communities) that is based on the diff --git a/content/pages/02-development-environments/18-source-control.markdown b/content/pages/02-development-environments/18-source-control.markdown index 83913183d..c96745a51 100644 --- a/content/pages/02-development-environments/18-source-control.markdown +++ b/content/pages/02-development-environments/18-source-control.markdown @@ -194,9 +194,9 @@ implementation. free online version of the O'Reilly [Version Control with Subversion](https://www.amazon.com/dp/B002SR2QIW/) book. -* [How to use Subversion (SVN)](https://deveo.com/svn-tutorial/) lays out - the basic concepts and provides the first few steps for getting started - tracking files. +* [How to Host SVN Repositories](https://www.perforce.com/blog/vcs/how-host-subversion-svn) + lays out the basic concepts and provides the first few steps for getting + started tracking files. * [10 Most Used SVN Commands with Examples](http://www.thegeekstuff.com/2011/04/svn-command-examples/) is a good refresher list if you've used SVN in the past but it has been diff --git a/content/pages/02-development-environments/19-git.markdown b/content/pages/02-development-environments/19-git.markdown index ae0fab9b8..9fdab73f2 100644 --- a/content/pages/02-development-environments/19-git.markdown +++ b/content/pages/02-development-environments/19-git.markdown @@ -174,10 +174,6 @@ workflow. These resources will come in handy for specific Git subjects. interactive mode or on its own with `git bisect run` to find the problematic code commit that needs to be fixed. -* [How Microsoft uses Git](https://docs.microsoft.com/en-us/azure/devops/learn/devops-at-microsoft/use-git-microsoft) - gives a high-level overview of their repository structure and hosting - at the extremely large scale organization. - * [GitTips](https://git.wiki.kernel.org/index.php/GitTips) is a list of pro tips to clean up common issues and how to dive through Git history to find specific text. diff --git a/content/pages/04-web-development/28-celery.markdown b/content/pages/04-web-development/28-celery.markdown index de2c60027..aa05b783a 100644 --- a/content/pages/04-web-development/28-celery.markdown +++ b/content/pages/04-web-development/28-celery.markdown @@ -11,7 +11,7 @@ meta: Celery is a task queue for executing work outside a Python web application implementation for [Python web applications](/web-development.html) used to asynchronously execute work outside the HTTP request-response cycle. -Celery task queue project logo. +Celery task queue project logo.
    Celery is an implementation of the task queue concept. Learn more in the web development chapter or view the table of contents for all topics.
    diff --git a/content/posts/160626-django-gunicorn-mint-linux-17.markdown b/content/posts/160626-django-gunicorn-mint-linux-17.markdown index 688adaaf8..8ab8836ff 100644 --- a/content/posts/160626-django-gunicorn-mint-linux-17.markdown +++ b/content/posts/160626-django-gunicorn-mint-linux-17.markdown @@ -3,7 +3,7 @@ slug: python-3-django-gunicorn-linux-mint-17 meta: A step-by-step walkthrough on configuring Linux Mint 17.3 with Python 3, Django and Green Unicorn (Gunicorn). category: post date: 2016-06-26 -modified: 2016-07-22 +modified: 2021-06-17 newsletter: False headerimage: /img/160626-mint-django-gunicorn/header.jpg headeralt: Django, Green Unicorn and Linux Mint logos. Copyright their respective owners. @@ -32,7 +32,7 @@ their current versions as of June 2016 are: * [Python](/why-use-python.html) version [3.5.1](https://www.python.org/downloads/release/python-351/) * [Django](/django.html) web framework version - [1.9.7](https://docs.djangoproject.com/en/1.9/releases/1.9/) + [1.9.x](https://pypi.org/project/Django/1.9.13/) * [Green Unicorn (Gunicorn)](/green-unicorn-gunicorn.html) version [19.6](http://docs.gunicorn.org/en/stable/news.html) From 4d1aaa9775a319ec79dd27c14118282b21ce364d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 17 Jun 2021 07:42:52 -0400 Subject: [PATCH 276/302] clean up more broken links --- .../pages/04-web-development/03-flask.markdown | 2 +- .../pages/04-web-development/12-jinja2.markdown | 2 +- .../04-web-development/44-web-apis.markdown | 2 +- .../04-web-development/45-microservices.markdown | 16 ---------------- .../django/django-template-context.markdown | 1 - .../django/django-template-loader.markdown | 1 - 6 files changed, 3 insertions(+), 21 deletions(-) diff --git a/content/pages/04-web-development/03-flask.markdown b/content/pages/04-web-development/03-flask.markdown index 2de57acbb..fd7625f0e 100644 --- a/content/pages/04-web-development/03-flask.markdown +++ b/content/pages/04-web-development/03-flask.markdown @@ -295,7 +295,7 @@ about how to working on your codebase. * [Bean Counter](https://github.com/BouncyNudibranch/bean-counter) is an open source Flask app for tracking coffee. -* [FlaskBB](http://flaskbb.org/) is a Flask app for a discussion forum. +* [FlaskBB](https://flaskbb.org/) is a Flask app for a discussion forum. * [psdash](https://github.com/Jahaja/psdash) is an app built with Flask and psutils to display information about the computer it is running on. diff --git a/content/pages/04-web-development/12-jinja2.markdown b/content/pages/04-web-development/12-jinja2.markdown index 5197fc9d8..75feb4fdc 100644 --- a/content/pages/04-web-development/12-jinja2.markdown +++ b/content/pages/04-web-development/12-jinja2.markdown @@ -71,7 +71,7 @@ open source project author from having to reinvent a new templating style. the template engine. * The official - [Jinja2 template designer documentation](http://jinja.pocoo.org/docs/dev/templates/) + [Jinja2 templates documentation](https://flask.palletsprojects.com/en/2.0.x/tutorial/templates/) is exceptionally useful both as a reference as well as a full read-through to understand how to properly work with template tags. diff --git a/content/pages/04-web-development/44-web-apis.markdown b/content/pages/04-web-development/44-web-apis.markdown index 0981c2743..77ce68888 100644 --- a/content/pages/04-web-development/44-web-apis.markdown +++ b/content/pages/04-web-development/44-web-apis.markdown @@ -43,7 +43,7 @@ Webhooks are important because they enable two-way communication initiation for APIs. Webhook flexibility comes in from their definition by the API user instead of the API itself. -For example, in the [Twilio API](https://www.twilio.com/api) when a text +For example, in the [Twilio API](https://www.twilio.com/docs/api) when a text message is sent to a Twilio phone number Twilio sends an HTTP POST request webhook to the URL specified by the user. The URL is defined in a text box on the number's page on Twilio as shown below. diff --git a/content/pages/04-web-development/45-microservices.markdown b/content/pages/04-web-development/45-microservices.markdown index bdf34a8b9..0b06889e6 100644 --- a/content/pages/04-web-development/45-microservices.markdown +++ b/content/pages/04-web-development/45-microservices.markdown @@ -40,22 +40,6 @@ ease further development and deployment. This approach is called the article is one of the best in-depth explanations for what microservices are and why to consider them as an architectural pattern. -* [Why microservices?](http://dev.otto.de/2016/03/20/why-microservices/) - presents some of the advantages, such as the dramatically increased number - of deployments per day, that a well-done microservices architecture can - provide in the right situation. Many organizational environments won't - allow this level of flexibility but if yours is one that will, it's worth - considering these points. - -* [On monoliths and microservices](http://dev.otto.de/2015/09/30/on-monoliths-and-microservices/) - provides some advice on using microservices in a fairly early stage of - a software project's lifecycle. - -* [Why Microservices?](https://dev.otto.de/2016/03/20/why-microservices/) - presents advantages microservices can bring to an existing monolithic - application where it is clear what needs to be broken down into smaller - components to make it easier to iterate and maintain. - * [Developing a RESTful microservice in Python](http://www.skybert.net/python/developing-a-restful-micro-service-in-python/) is a good story of how an aging Java project was replaced with a microservice built with Python and Flask. diff --git a/content/pages/examples/django/django-template-context.markdown b/content/pages/examples/django/django-template-context.markdown index 5600af98b..9bfe9e562 100644 --- a/content/pages/examples/django/django-template-context.markdown +++ b/content/pages/examples/django/django-template-context.markdown @@ -582,7 +582,6 @@ __author__ = "Bas van Oostveen ", __contributors__ = [ "Antonio Cavedoni " "Stefano J. Attardi ", - "limodou ", "Carlo C8E Miron", "Andre Campos ", "Justin Findlay ", diff --git a/content/pages/examples/django/django-template-loader.markdown b/content/pages/examples/django/django-template-loader.markdown index 6eb9853b6..9098f4881 100644 --- a/content/pages/examples/django/django-template-loader.markdown +++ b/content/pages/examples/django/django-template-loader.markdown @@ -178,7 +178,6 @@ __author__ = "Bas van Oostveen ", __contributors__ = [ "Antonio Cavedoni " "Stefano J. Attardi ", - "limodou ", "Carlo C8E Miron", "Andre Campos ", "Justin Findlay ", From 7193d6904e8dd745f0ffc32064f34a1dc13f5764 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 17 Jun 2021 10:33:55 -0400 Subject: [PATCH 277/302] fixing a ton more broken or redirected resource links --- .../05-deployment/03-static-content.markdown | 6 +++--- content/pages/05-deployment/04-cdns.markdown | 4 ---- content/pages/05-deployment/09-paas.markdown | 5 ----- .../pages/05-deployment/23-gunicorn.markdown | 4 ++-- .../27-continuous-integration.markdown | 5 ----- .../pages/05-deployment/28-jenkins.markdown | 4 ---- .../32-configuration-management.markdown | 11 ----------- .../05-deployment/38-serverless.markdown | 19 ++++--------------- 8 files changed, 9 insertions(+), 49 deletions(-) diff --git a/content/pages/05-deployment/03-static-content.markdown b/content/pages/05-deployment/03-static-content.markdown index 8c6e88262..7d458e27c 100644 --- a/content/pages/05-deployment/03-static-content.markdown +++ b/content/pages/05-deployment/03-static-content.markdown @@ -21,9 +21,9 @@ Django framework calls these two categories *assets* and *media*. ## Content delivery networks A content delivery network (CDN) is a third party that stores and serves static files. [Amazon CloudFront](http://aws.amazon.com/cloudfront/), -[Akamai](http://www.akamai.com/), and -[Rackspace Cloud Files](http://www.rackspace.com/cloud/public/files/) -are examples of CDNs. The purpose of a CDN is to remove the load of static +[CloudFlare](https://www.cloudflare.com/), [Fastly](https://www.fastly.com/), +and [Akamai](https://www.akamai.com/) are examples of CDNs. The purpose of +a CDN is to remove the load of static file requests from web servers that are handling dynamic web content. For example, if you have an nginx server that handles both static files and acts as a front for a Green Unicorn WSGI server on a 512 megabyte diff --git a/content/pages/05-deployment/04-cdns.markdown b/content/pages/05-deployment/04-cdns.markdown index 027f064d6..89d2f9656 100644 --- a/content/pages/05-deployment/04-cdns.markdown +++ b/content/pages/05-deployment/04-cdns.markdown @@ -29,10 +29,6 @@ servers to improve web app loading speed. [django-storages](https://django-storages.readthedocs.io/en/latest/) library to deploy static assets for a [Django](/django.html) application to a CDN. -* [Building your own CDN for Fun and Profit](https://pasztor.at/blog/building-your-own-cdn) - is a great high-level overview of how CDNs work and shows you how to - create your own, albeit simplified CDN. - * [Do not let your CDN betray you: Use Subresource Integrity](https://hacks.mozilla.org/2015/09/subresource-integrity-in-firefox-43/) describes the security implications for CDNs with unexpectedly modified content and how Subresource Integrity in modern web browsers can mitigate diff --git a/content/pages/05-deployment/09-paas.markdown b/content/pages/05-deployment/09-paas.markdown index 9416e971f..81831f637 100644 --- a/content/pages/05-deployment/09-paas.markdown +++ b/content/pages/05-deployment/09-paas.markdown @@ -156,11 +156,6 @@ running to someone else. on Google Cloud and posits what they may be paying to run their service. -* [PaaS (false) economics](https://blog.drie.co/paas-false-economics-13f72d87b485) - gives some quick back-of-the-envelope calculations on why running your - applications on a PaaS is obviously going to appear more expensive if you - do not take the cost of your own software engineers into the equation. - * Two blog posts on using AWS Autoscaling in [Automatic replacement of Autoscaling nodes with equivalent spot instances](https://mcristi.wordpress.com/2016/04/21/my-approach-at-making-aws-ec2-affordable-automatic-replacement-of-autoscaling-nodes-with-equivalent-spot-instances/) and [Autoscaling nodes: seeing it in action](https://mcristi.wordpress.com/2016/04/27/automatic-replacement-of-autoscaling-nodes-with-equivalent-spot-instances-seeing-it-in-action/) diff --git a/content/pages/05-deployment/23-gunicorn.markdown b/content/pages/05-deployment/23-gunicorn.markdown index e0c8a7f14..1973ab6ff 100644 --- a/content/pages/05-deployment/23-gunicorn.markdown +++ b/content/pages/05-deployment/23-gunicorn.markdown @@ -49,7 +49,7 @@ file with the following contents: It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see - https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ + https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/ """ import os @@ -115,7 +115,7 @@ perform the request handling. Each worker is independent of the controller. screenshots along the way with what to expect while you are configuring the deployment server. -* The [Django](https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/gunicorn/) +* The [Django](https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/gunicorn/) and [Flask](http://flask.pocoo.org/docs/latest/deploying/wsgi-standalone/) documentation each contain instructions for deploying the respective frameworks with Gunicorn. diff --git a/content/pages/05-deployment/27-continuous-integration.markdown b/content/pages/05-deployment/27-continuous-integration.markdown index 835f5589a..ea620e337 100644 --- a/content/pages/05-deployment/27-continuous-integration.markdown +++ b/content/pages/05-deployment/27-continuous-integration.markdown @@ -127,11 +127,6 @@ programming language agnostic. Learn more via the following resources or on uses well done drawings to show how continuous integration and delivery works for testing and managing data. -* [The real difference between CI and CD](https://fire.ci/blog/the-difference-between-ci-and-cd/) - explains what advantages CI provides, what constraints it operates under - (such as total build time) to work well, and how that is different from - the related but distinct concept of continuous delivery. - * [6 top continuous integration tools](https://opensource.com/business/15/7/six-continuous-integration-tools) gives a high level overview of six CI tools from a programming language agnostic perspective. diff --git a/content/pages/05-deployment/28-jenkins.markdown b/content/pages/05-deployment/28-jenkins.markdown index 46a711870..463e1f04c 100644 --- a/content/pages/05-deployment/28-jenkins.markdown +++ b/content/pages/05-deployment/28-jenkins.markdown @@ -77,7 +77,3 @@ used to automate building, [testing](/testing.html) and * [Automated API testing with Jenkins](https://assertible.com/blog/automated-api-testing-with-jenkins) walks through how to use Jenkins to tests your [API](/application-programming-interfaces.html) upon each deployment. - -* [Continuous Delivery with Jenkins and Rollbar](https://rollbar.com/blog/continuous-delivery-with-jenkins/) - is a tutorial on using Jenkins for continuous integration paired with - [Rollbar](/rollbar.html) for tracking deployments and errors. diff --git a/content/pages/05-deployment/32-configuration-management.markdown b/content/pages/05-deployment/32-configuration-management.markdown index 252df484e..a6885787f 100644 --- a/content/pages/05-deployment/32-configuration-management.markdown +++ b/content/pages/05-deployment/32-configuration-management.markdown @@ -59,17 +59,6 @@ management and application deployment tool built in Python. is a fantastically detailed introduction on using Ansible to set up servers. -* [Ansible Text Message Notifications with Twilio SMS](https://www.twilio.com/blog/2014/05/ansible-text-messages-notifications-with-twilio-sms.html) - is my blog post with a detailed example for using the Twilio module in - core Ansible 1.6+. - -* [Python for Configuration Management with Ansible slides](http://www.insom.me.uk/post/pycon-talk.html) -from PyCon UK 2013 - -* [First Steps with Ansible](http://labs.qandidate.com/blog/2013/11/15/first-steps-with-ansible/) - -* [Red Badger on Ansible](http://red-badger.com/blog/2013/06/29/ansible/) - * [Getting Started with Ansible](http://lowendbox.com/blog/getting-started-with-ansible/) * [An introduction to Ansible](https://davidwinter.me/introduction-to-ansible/) diff --git a/content/pages/05-deployment/38-serverless.markdown b/content/pages/05-deployment/38-serverless.markdown index aea641dff..f6a4bb0fd 100644 --- a/content/pages/05-deployment/38-serverless.markdown +++ b/content/pages/05-deployment/38-serverless.markdown @@ -188,21 +188,10 @@ have varying degrees of support for Python. AWS Lambda has production-ready support for Python 2 and 3.7, while Azure and Google Cloud have "beta" support with unclear production-worthiness. The following resources are some comparison articles to help you in your decision-making -process for which platform to learn. - -* [Serverless at scale](https://blog.binaris.com/serverless-at-scale/) - compares the "Big 3" AWS, Azure and Google Cloud in serverless performance. - The author provides some nice data around average response times and - outliers. - -* [Serverless hosting comparison](https://headmelted.com/serverless-showdown-4a771ca561d2) - is a broad overview of documentation, community, pricing and other - notes for the major platforms as well as IBM OpenWhisk and - the [Fission.io](https://fission.io/) project. - -* [Microsoft Azure Functions vs. Google Cloud Functions vs. AWS Lambda](https://cloudacademy.com/blog/microsoft-azure-functions-vs-google-cloud-functions-fight-for-serverless-cloud-domination-continues/) - presents an overview of Azure Functions and how they compare to - Google Cloud Functions and AWS Lambda. +process for which platform to learn. +[Microsoft Azure Functions vs. Google Cloud Functions vs. AWS Lambda](https://cloudacademy.com/blog/microsoft-azure-functions-vs-google-cloud-functions-fight-for-serverless-cloud-domination-continues/) +presents an overview of Azure Functions and how they compare to +Google Cloud Functions and AWS Lambda. ### Serverless vendor lock-in? From bc4c7dccd38494c428f8a13b2f83fada99623ac8 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 22 Jun 2021 06:42:27 -0400 Subject: [PATCH 278/302] remove broken links --- content/pages/04-web-development/56-web-app-security.markdown | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/pages/04-web-development/56-web-app-security.markdown b/content/pages/04-web-development/56-web-app-security.markdown index 6d15da25d..1462eb77a 100644 --- a/content/pages/04-web-development/56-web-app-security.markdown +++ b/content/pages/04-web-development/56-web-app-security.markdown @@ -153,10 +153,6 @@ resources can also give you a good overview of how HTTPS works. important technique to use to keep your database passwords and other secrets more secure if the hashed strings are leaked. -* [An in-depth analysis of SSH attacks on Amazon EC2](http://getprismatic.com/story/1409447605839) - shows how important it is to secure your web servers, especially when they are - hosted in IP address ranges that are commonly scanned by malicious actors. - * [Cloud Security Auditing: Challenges and Emerging Approaches](http://www.infoq.com/articles/cloud-security-auditing-challenges-and-emerging-approaches) is a high-level overview of some of security auditing problems that come with cloud deployments. From 2617df406dd19b6349b20cf202c1a56af2715a67 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 24 Jun 2021 06:34:46 -0400 Subject: [PATCH 279/302] fixing more typos --- .../pages/04-web-development/42-websockets.markdown | 4 ---- content/pages/04-web-development/43-webrtc.markdown | 4 ---- .../pages/04-web-development/48-api-creation.markdown | 10 +--------- .../04-web-development/51-api-integration.markdown | 3 --- content/pages/04-web-development/52-twilio.markdown | 4 ---- .../04-web-development/56-web-app-security.markdown | 2 +- content/pages/05-deployment/02-servers.markdown | 4 ++-- content/pages/05-deployment/19-nginx.markdown | 4 ++-- content/pages/06-devops/18-web-analytics.markdown | 11 ++++++----- 9 files changed, 12 insertions(+), 34 deletions(-) diff --git a/content/pages/04-web-development/42-websockets.markdown b/content/pages/04-web-development/42-websockets.markdown index 5e1f78d64..8c11ce936 100644 --- a/content/pages/04-web-development/42-websockets.markdown +++ b/content/pages/04-web-development/42-websockets.markdown @@ -173,10 +173,6 @@ own project. that demos sending server generated events as well as input from users via a text box input on a form. -* The [realtime codenames game](https://github.com/joshporter1/codenames) - source code is a full-featured example for using WebSockets via - Flask-SocketIO. - * The [python-websockets-example](https://github.com/mattmakai/python-websockets-example) contains code to create a simple web application that provides WebSockets diff --git a/content/pages/04-web-development/43-webrtc.markdown b/content/pages/04-web-development/43-webrtc.markdown index 297c12b9b..e34ac044a 100644 --- a/content/pages/04-web-development/43-webrtc.markdown +++ b/content/pages/04-web-development/43-webrtc.markdown @@ -33,10 +33,6 @@ browser) and server (usually a [web server](/web-servers.html)). at points but overall has a ton of good information that gives a solid overview of the technology. -* [Building a Snapchat-like app with WebRTC in the browser](https://tokbox.com/blog/building-a-snapchat-like-app-with-webrtc-in-the-browser/) - walks through the front end JavaScript for building a photo filter - application using the WebRTC browser APIs. - * [WebRTC issues and how to debug them](https://blog.codeship.com/webrtc-issues-and-how-to-debug-them/) explains the various ways that implementations can go wrong and where to start looking when you run into errors. diff --git a/content/pages/04-web-development/48-api-creation.markdown b/content/pages/04-web-development/48-api-creation.markdown index fb21280d5..aa49c5aa1 100644 --- a/content/pages/04-web-development/48-api-creation.markdown +++ b/content/pages/04-web-development/48-api-creation.markdown @@ -130,12 +130,8 @@ equivalent of browser testing in the web application world. compatibility and a whole slew of other great advice for developers and API designers. -* [Self-descriptive, isn't. Don't assume anything.](http://www.bizcoder.com/self-descriptive-isn-t-don-t-assume-anything) - is an appeal that metadata makes a difference in whether APIs are descriptive - or not. - * [Designing the Artsy API](http://artsy.github.io/blog/2014/09/12/designing-the-public-artsy-api/) - has their recommendations list for building an API based on their recent + has their recommendations list for building an API based on their experiences. * Hacker News had a discussion on @@ -212,10 +208,6 @@ equivalent of browser testing in the web application world. [Serpy](https://github.com/clarkduvall/serpy) and [wrote a blog post with the results of its performance](https://engineering.betterworks.com/2015/09/04/ditching-django-rest-framework-serializers-for-serpy/). -* [Designing a Web API](http://restlet.com/company/blog/2015/03/16/api-design-designing-a-web-api/) - gives a detailed walkthrough of concepts and design decisions you need - to make when building an API. - * Microsoft's [REST API Guidelines](https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md) are a detailed set of considerations for when you are building your own diff --git a/content/pages/04-web-development/51-api-integration.markdown b/content/pages/04-web-development/51-api-integration.markdown index 09c6e8099..ee646bfa9 100644 --- a/content/pages/04-web-development/51-api-integration.markdown +++ b/content/pages/04-web-development/51-api-integration.markdown @@ -63,9 +63,6 @@ across many implementation areas. is a nice tutorial for easily re-executing failed HTTP requests with the Requests library. -* My DjangoCon 2013 talk dove into - "[Making Django Play Nice With Third Party Services](http://www.youtube.com/watch?v=iGP8DQIqxXs)." - * If you're looking for a fun project that uses two web APIs within a Django application, try out this tutorial to [Build your own Pokédex with Django, MMS and PokéAPI](https://www.twilio.com/blog/2014/11/build-your-own-pokedex-with-django-mms-and-pokeapi.html). diff --git a/content/pages/04-web-development/52-twilio.markdown b/content/pages/04-web-development/52-twilio.markdown index 9ba51f456..e038e3907 100644 --- a/content/pages/04-web-development/52-twilio.markdown +++ b/content/pages/04-web-development/52-twilio.markdown @@ -77,10 +77,6 @@ for fellow developers. [Twilio SMS API via some Python code](https://www.twilio.com/docs/quickstart/python/sms) to send a text message with the results. -* IBM's Bluemix blog contains a nice tutorial on building an - [IoT Python app with a Raspberry Pi and Bluemix](https://developer.ibm.com/bluemix/2015/04/02/tutorial-using-a-raspberry-pi-python-iot-twilio-bluemix/) - that uses Twilio to interact with the Raspberry Pi. - * The [Python tag on the Twilio blog](https://www.twilio.com/blog/tag/python) provides walkthroughs for [Django](https://www.twilio.com/blog/2015/12/city-chat-with-python-django-and-twilio-ip-messaging.html), diff --git a/content/pages/04-web-development/56-web-app-security.markdown b/content/pages/04-web-development/56-web-app-security.markdown index 1462eb77a..992091dbf 100644 --- a/content/pages/04-web-development/56-web-app-security.markdown +++ b/content/pages/04-web-development/56-web-app-security.markdown @@ -110,7 +110,7 @@ resources can also give you a good overview of how HTTPS works. learn about web browser internals, session attacks, fingerprinting, HTTPS and many other fundamental topics. -* [The SaaS CTO Security Checklist](https://cto-security-checklist.sqreen.io/) +* [The SaaS CTO Security Checklist Redux](https://www.goldfiglabs.com/guide/saas-cto-security-checklist/) is an awesome list of steps for securing your infrastructure and employees as well as what stage and size company it is recommended that you put those procedures in place. diff --git a/content/pages/05-deployment/02-servers.markdown b/content/pages/05-deployment/02-servers.markdown index 90bb07951..f66f68977 100644 --- a/content/pages/05-deployment/02-servers.markdown +++ b/content/pages/05-deployment/02-servers.markdown @@ -128,8 +128,8 @@ provides a unified API for many cloud service providers. * [Amazon Web Services has official documentation](http://aws.amazon.com/python/) for running Python web applications. -* [boto](https://github.com/boto/boto) is an extensive and well-tested -Python library for working with Amazon Web Services. +* [boto3](https://github.com/boto/boto3) is an extensive and well-tested + Python library for working with Amazon Web Services. * [Poseidon](https://github.com/changhiskhan/poseidon) is a Python commandline interface for managing Digital Ocean droplets (servers). diff --git a/content/pages/05-deployment/19-nginx.markdown b/content/pages/05-deployment/19-nginx.markdown index 98626e467..fc37f678d 100644 --- a/content/pages/05-deployment/19-nginx.markdown +++ b/content/pages/05-deployment/19-nginx.markdown @@ -63,7 +63,7 @@ to make sure you are avoiding the most common security errors that plague HTTP(S) configurations. * [HTTPS with Let's Encrypt and nginx](https://botleg.com/stories/https-with-lets-encrypt-and-nginx/) - walks throough installing a free SSL certificate from Let's Encrypt + walks through installing a free SSL certificate from Let's Encrypt to secure HTTP connects to your nginx server via HTTPS. * The [Nginx Config](https://nginxconfig.io/) tool can generate strong @@ -101,7 +101,7 @@ several years. * [Test-driving web server configuration](https://gdstechnology.blog.gov.uk/2015/03/25/test-driving-web-server-configuration/) tells a good story for how to iteratively apply configuration changes, such - as routing traffic to [Piwik](http://piwik.org/) for + as routing traffic to [Matoma](https://matomo.org/) for [web analytics](/web-analytics.html), reverse proxying to backend application servers and terminately TLS connections appropriately. It is impressive to read a well-written softare development article like diff --git a/content/pages/06-devops/18-web-analytics.markdown b/content/pages/06-devops/18-web-analytics.markdown index 28c0a58a9..b24e32439 100644 --- a/content/pages/06-devops/18-web-analytics.markdown +++ b/content/pages/06-devops/18-web-analytics.markdown @@ -38,9 +38,10 @@ application before taking some action, such as purchasing your service. ## Open source web analytics projects -* [Piwik](http://piwik.org/) is a web analytics platform you can host yourself. - Piwik is a solid choice if you cannot use Google Analytics or want to - customize your own web analytics platform. +* [Matoma](https://matomo.org/) (formerly Piwik), is a web analytics + platform that you can host yourself. Matoma is a solid choice if you + cannot use Google Analytics or want to customize your own web analytics + software. * [Shynet](https://github.com/milesmcc/shynet) is a lightweight, privacy-friendly cookie-free web analytics application written in Python. @@ -142,8 +143,8 @@ application before taking some action, such as purchasing your service. ## Web analytics learning checklist -1. Add Google Analytics or Piwik to your application. Both are free and while - Piwik is not as powerful as Google Analytics you can self-host the +1. Add Google Analytics or Matoma to your application. Both are free and while + Matoma is not as powerful as Google Analytics you can self-host the application which is the only option in many environments. 1. Think critically about the factors that will make your application From 1eede9a44e0680b7ae712d08286b5a240247d89c Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 25 Jun 2021 10:47:46 -0400 Subject: [PATCH 280/302] fixing more links --- content/pages/04-web-development/17-css.markdown | 8 ++++++++ content/pages/05-deployment/09-paas.markdown | 6 ------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/content/pages/04-web-development/17-css.markdown b/content/pages/04-web-development/17-css.markdown index 96c1b3ec8..b248828f8 100644 --- a/content/pages/04-web-development/17-css.markdown +++ b/content/pages/04-web-development/17-css.markdown @@ -119,6 +119,14 @@ web application's design. provides advice on how to write simpler, easier-to-maintain CSS code to reduce your need to rely on CSS preprocessors and build pipelines. +* [How to Detect Unused CSS or JavaScript](https://javascript.plainenglish.io/detect-unused-css-or-javascript-in-your-code-8d200ef07e50) + explains how to use [Chrome DevTools](https://developer.chrome.com/docs/devtools/) + to analyze a page's CSS and identify parts that are not used. Note that + even though a specific page does not use that CSS (or JS), there might + be another page that uses the same CSS files and *does* use that "unused" + code, so test your pages before and after making the changes to ensure + you did not inadvertently break something else! + * [CSS refresher notes](https://github.com/vasanthk/css-refresher-notes) is incredibly helpful if you've learned CSS in bits and pieces along the way and you now want to fill in the gaps in your knowledge. diff --git a/content/pages/05-deployment/09-paas.markdown b/content/pages/05-deployment/09-paas.markdown index 81831f637..c89a37439 100644 --- a/content/pages/05-deployment/09-paas.markdown +++ b/content/pages/05-deployment/09-paas.markdown @@ -69,11 +69,6 @@ of controlling and modifying the project for your own applications, but prevents you from offloading the responsibility of keeping servers running to someone else. -* [Kel](http://www.kelproject.com/) uses Kubernetes as a foundation - for a custom self-hosted PaaS. Note that it was created by Eldarion, - which had one of the first Python-specific PaaS offerings on the - market around the time that Heroku was launched. - * [Dokku](http://dokku.viewdocs.io/dokku/) builds on Docker and has hooks for plugins to extend the small core of the project and customize deployments for your applications. @@ -82,7 +77,6 @@ running to someone else. designed to run on top of AWS services. - ## Platform-as-a-service resources * [The differences between IaaS, PaaS and SaaS](https://www.engineyard.com/blog/the-differences-between-iaas-paas-and-saas-and-when-to-use-each) explains the abstract layer differences among "X-as-a-service" offering From b03fccce4d7d2395520ffdb56ceeb6f7d1eb25c3 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 27 Jun 2021 14:52:24 -0400 Subject: [PATCH 281/302] removing additional broken links --- content/pages/05-deployment/19-nginx.markdown | 4 ---- .../pages/05-deployment/32-configuration-management.markdown | 2 -- content/pages/05-deployment/36-docker.markdown | 4 ---- 3 files changed, 10 deletions(-) diff --git a/content/pages/05-deployment/19-nginx.markdown b/content/pages/05-deployment/19-nginx.markdown index fc37f678d..3f17e6524 100644 --- a/content/pages/05-deployment/19-nginx.markdown +++ b/content/pages/05-deployment/19-nginx.markdown @@ -116,10 +116,6 @@ several years. as well as the Pagespeed module that Google released for both Nginx and the [Apache HTTP Server](/apache-http-server.html). -* [Nginx for Developers: An Introduction](http://carrot.is/coding/nginx_introduction) - provides the first steps to getting an initial Nginx configuration up and - running. - * [A faster Web server: ripping out Apache for Nginx](http://arstechnica.com/business/2011/11/a-faster-web-server-ripping-out-apache-for-nginx/) explains how Nginx can be used instead of Apache in some cases for better performance. diff --git a/content/pages/05-deployment/32-configuration-management.markdown b/content/pages/05-deployment/32-configuration-management.markdown index a6885787f..d4b43ec30 100644 --- a/content/pages/05-deployment/32-configuration-management.markdown +++ b/content/pages/05-deployment/32-configuration-management.markdown @@ -78,8 +78,6 @@ management and application deployment tool built in Python. * [Idempotence, convergence, and other silly fancy words we often use](https://groups.google.com/forum/#!msg/Ansible-project/WpRblldA2PQ/lYDpFjBXDlsJ) -* [Testing with Jenkins, Docker and Ansible](http://blog.mist.io/post/82383668190/move-fast-and-dont-break-things-testing-with) - ## Application dependencies learning checklist 1. Learn about configuration management in the context of deployment diff --git a/content/pages/05-deployment/36-docker.markdown b/content/pages/05-deployment/36-docker.markdown index 6fe74a04c..f133b70f0 100644 --- a/content/pages/05-deployment/36-docker.markdown +++ b/content/pages/05-deployment/36-docker.markdown @@ -77,10 +77,6 @@ on Amazon Web Services, Google Compute Engine, Linode, Rackspace or elsewhere. is a short tutorial for creating a Docker container with a specific configuration. -* [10 things to avoid in Docker containers](http://developerblog.redhat.com/2016/02/24/10-things-to-avoid-in-docker-containers/) - provides a lot of "don'ts" that you'll want to consider before bumping - up against the limitations of how containers should be used. - * [Docker Internals](http://docker-saigon.github.io/post/Docker-Internals/) presents Linux containers and how Docker uses them as its base for how the project works. This article is a great way to bridge what you know about Docker with a more From 2c35cfbe35ea4cb6f1362721d538822ef2c143ab Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 28 Jun 2021 11:44:47 -0400 Subject: [PATCH 282/302] remove broken performance link --- content/pages/06-devops/06-web-app-performance.markdown | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/pages/06-devops/06-web-app-performance.markdown b/content/pages/06-devops/06-web-app-performance.markdown index faa195727..8a954546f 100644 --- a/content/pages/06-devops/06-web-app-performance.markdown +++ b/content/pages/06-devops/06-web-app-performance.markdown @@ -49,10 +49,6 @@ database queries, page size and many other factors. is a 20 minute code-first demo that shows how to get a realistic estimate for how many requests per second your web application will be able to handle. -* [How to Interpret Site Performance Tests](https://fly.io/articles/how-to-understand-performance-tests/) - covers the difference between client, page and connection speed tests - as well as a bit on caching performance. - * [Practical scaling techniques for websites](https://hackernoon.com/practical-scaling-techniques-for-web-sites-554a38dbd492) examines how to improve your website performance with asynchronous [task queues](/task-queues.html), [database](/databases.html) optimization From 1136a5a80d011c6ba606fbafcd211606eb3a1a87 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 29 Jun 2021 13:49:55 -0400 Subject: [PATCH 283/302] removing dead links --- .../05-deployment/37-kubernetes.markdown | 2 +- .../05-deployment/38-serverless.markdown | 32 ++++++------------- .../pages/06-devops/01-monitoring.markdown | 7 +--- .../pages/06-devops/18-web-analytics.markdown | 4 --- 4 files changed, 11 insertions(+), 34 deletions(-) diff --git a/content/pages/05-deployment/37-kubernetes.markdown b/content/pages/05-deployment/37-kubernetes.markdown index 039c1b270..96e69ef62 100644 --- a/content/pages/05-deployment/37-kubernetes.markdown +++ b/content/pages/05-deployment/37-kubernetes.markdown @@ -88,7 +88,7 @@ applications. cost-benefit analysis to make sure the tool's scability, reliability and related functionality will outweigh the downsides. -* [How Zolando manages 140+ Kubernetes clusters](https://srcco.de/posts/how-zalando-manages-140-kubernetes-clusters.html) +* [How Zalando manages 140+ Kubernetes clusters](https://srcco.de/posts/how-zalando-manages-140-kubernetes-clusters.html) covers the architecture, monitoring and workflow of a team that has to run a decent number of clusters for their development teams. diff --git a/content/pages/05-deployment/38-serverless.markdown b/content/pages/05-deployment/38-serverless.markdown index f6a4bb0fd..9dbb4a663 100644 --- a/content/pages/05-deployment/38-serverless.markdown +++ b/content/pages/05-deployment/38-serverless.markdown @@ -45,9 +45,8 @@ These implementations are under significant active development and not all of them have Python support. * [AWS Lambda](/aws-lambda.html) is the current leader among serverless - compute implementations. It has support for both - [Python 2.7](/blog/aws-lambda-python-2-7.html) and - [Python 3.6/3.7](/blog/aws-lambda-python-3-6.html). + compute implementations. It has support for + [Python 3.x](/blog/aws-lambda-python-3-6.html). * Azure Functions has second-class citizen support for Python. It's supposed to be possible but @@ -62,11 +61,8 @@ and not all of them have Python support. * [Google Cloud Functions](/google-cloud-functions.html) currently only supports JavaScript code execution. -* Webtask.io also only supports JavaScript but there is a cool - *prototype* project named [webtask-pytask](https://github.com/tehsis/webtask-pytask) - to run Python code in the browser via webtask. This demo is definitely not - for production code use but awesome to see what the programming community - can put together using existing code and services. +* [Webtask.io](https://webtask.io/) started as a JavaScript service but + now also has a Python runtime as well. ### Serverless frameworks @@ -91,8 +87,6 @@ include: ([source code](https://github.com/aws/chalice)) is built by the AWS team specifically for Python applications. -* [Apex](http://apex.run/) ([source code](https://github.com/apex/apex)) - ### General serverless resources Serverless concepts and implementations are still in their early @@ -198,16 +192,8 @@ Google Cloud Functions and AWS Lambda. There is some concern by organizations and developers about vendor lock-in on serverless platforms. It is unclear if portability is worse for serverless than other infrastructure-as-a-service pieces, but still worth -thinking about ahead of time. These resources provide additional -perspectives on lock-in and using multiple cloud providers. - -* [On Serverless, Multi-Cloud, and Vendor Lock In](https://blog.symphonia.io/on-serverless-multi-cloud-and-vendor-lock-in-da930b3993f) - is an opinion piece that for *most* cases the additional work of - going multi-cloud is not worth the tradeoffs, therefore at this time - it's better to go for a single vendor such as AWS or Azure and optimize - on that platform. - -* [Why vendor lock-in with serverless isn’t what you think it is](https://medium.com/@PaulDJohnston/why-vendor-lock-in-with-serverless-isnt-what-you-think-it-is-d6be40fa9ca9) - recommends using a single vendor for now and stop worrying about - hedging your bets because it typically makes your infrastructure - significantly more complex. +thinking about ahead of time. +[Why vendor lock-in with serverless isn’t what you think it is](https://medium.com/@PaulDJohnston/why-vendor-lock-in-with-serverless-isnt-what-you-think-it-is-d6be40fa9ca9) +is a piece on this topic that recommends using a single vendor for +now and for organizations to stop worrying about hedging their bets +because it typically makes infrastructure significantly more complex. diff --git a/content/pages/06-devops/01-monitoring.markdown b/content/pages/06-devops/01-monitoring.markdown index 95efe2cf4..50021eecf 100644 --- a/content/pages/06-devops/01-monitoring.markdown +++ b/content/pages/06-devops/01-monitoring.markdown @@ -112,7 +112,7 @@ Application Performance Monitoring (APM) * [New Relic](http://newrelic.com/) provides application and database monitoring as well as plug ins for capturing and analyzing data about - other devleoper tools in your stack, such as [Twilio](/twilio.html). + other developer tools in your stack, such as [Twilio](/twilio.html). * [Opbeat](https://opbeat.com) Built for django. Opbeat combines performance metrics, release tracking, and error logging into a single simple service. * [Scout](https://scoutapp.com/python-monitoring) monitors the performance of Django and Flask apps, auto-instrumenting views, SQL queries, templates, and more. @@ -146,11 +146,6 @@ Incident Management * [The Virtues of Monitoring](http://www.paperplanes.de/2011/1/5/the_virtues_of_monitoring.html) -* [Effortless Monitoring with collectd, Graphite, and Docker](http://blog.docker.io/2013/07/effortless-monitoring-with-collectd-graphite-and-docker/) - -* [Practical Guide to StatsD/Graphite Monitoring](http://matt.aimonetti.net/posts/2013/06/26/practical-guide-to-graphite-monitoring/) - is a detailed guide with code examples for monitoring infrastructure. - * Bit.ly describes the "[10 Things They Forgot to Monitor](http://word.bitly.com/post/74839060954/ten-things-to-monitor)" beyond the standard metrics such as disk & memory usage. diff --git a/content/pages/06-devops/18-web-analytics.markdown b/content/pages/06-devops/18-web-analytics.markdown index b24e32439..6430b1057 100644 --- a/content/pages/06-devops/18-web-analytics.markdown +++ b/content/pages/06-devops/18-web-analytics.markdown @@ -110,10 +110,6 @@ application before taking some action, such as purchasing your service. is not for everyone but it is really useful if you want to avoid the Google data trap. -* This beginner's guide to - [math and stats behind web analytics](http://www.seotakeaways.com/beginners-guide-maths-stats-web-analytics/) - provides some context for understanding and reasoning about web traffic. - * [An Analytics Primer for Developers](https://hacks.mozilla.org/2015/03/an-analytics-primer-for-developers/) by Mozilla explains what to track, choosing an analytics platform and how to serve up the analytics JavaScript asynchronously. From 29fe5f2cbbf8e0543b056706ffc305a2b1dd8674 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 1 Jul 2021 09:46:17 -0400 Subject: [PATCH 284/302] cleaning up more broken links --- content/pages/05-deployment/38-serverless.markdown | 4 ++-- content/pages/05-deployment/39-aws-lambda.markdown | 9 --------- content/pages/06-devops/00-devops.markdown | 14 +++++++------- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/content/pages/05-deployment/38-serverless.markdown b/content/pages/05-deployment/38-serverless.markdown index 9dbb4a663..a5236c280 100644 --- a/content/pages/05-deployment/38-serverless.markdown +++ b/content/pages/05-deployment/38-serverless.markdown @@ -58,8 +58,8 @@ and not all of them have Python support. [Apache OpenWhisk](https://github.com/openwhisk/openwhisk) open source project. -* [Google Cloud Functions](/google-cloud-functions.html) currently - only supports JavaScript code execution. +* [Google Cloud Functions](/google-cloud-functions.html) has + [native Python 3.x runtimes](https://cloud.google.com/functions/docs/concepts/python-runtime). * [Webtask.io](https://webtask.io/) started as a JavaScript service but now also has a Python runtime as well. diff --git a/content/pages/05-deployment/39-aws-lambda.markdown b/content/pages/05-deployment/39-aws-lambda.markdown index e775cc20b..80efa5ef7 100644 --- a/content/pages/05-deployment/39-aws-lambda.markdown +++ b/content/pages/05-deployment/39-aws-lambda.markdown @@ -52,10 +52,6 @@ has support for both Python 2.7, 3.6 and 3.7. provides a screen capture of one developer deploying their application to Lambda. -* [Automated SQL Injection Testing of Serverless Functions On a Shoestring Budget (and Some Good Music)](https://www.puresec.io/blog/automated-sql-injection-testing-of-serverless-functions-on-a-shoestring-budget-and-some-good-music) - is an awesome operational security post that uses Python to test - for SQL injection vulnerabilities in serverless functions on AWS Lambda. - * [Building Scikit-Learn For AWS Lambda](https://serverlesscode.com/post/scikitlearn-with-amazon-linux-container/) follows up on the [Using Scikit-Learn In AWS Lambda](https://serverlesscode.com/post/deploy-scikitlearn-on-lamba/) @@ -76,11 +72,6 @@ has support for both Python 2.7, 3.6 and 3.7. guide created by a developer who used all of these bits to learn AWS services herself. -* [AWS Lambda Serverless Reference Architectures](http://www.allthingsdistributed.com/2016/06/aws-lambda-serverless-reference-architectures.html) - provides blueprints with diagrams of common architecture patterns that - developers use for their mobile backend, file processing, stream - processing and web application projects. - * [Security Overview of AWS Lambda](https://d1.awsstatic.com/whitepapers/Overview-AWS-Lambda-Security.pdf) (PDF file) covers their "Shared Responsibility Model" for security and compliance. Although the paper bills itself as an in-depth look at diff --git a/content/pages/06-devops/00-devops.markdown b/content/pages/06-devops/00-devops.markdown index 722ca59f1..f6053c2e4 100644 --- a/content/pages/06-devops/00-devops.markdown +++ b/content/pages/06-devops/00-devops.markdown @@ -35,8 +35,8 @@ tools and services for DevOps environments. which when used properly can enable continuous software delivery. * For an Atlassian-centric perspective on tooling, take a look at - this post on how to - [choose the right DevOps tools](http://blogs.atlassian.com/2016/03/how-to-choose-devops-tools/) + this guide on how to + [choose the right DevOps tools](https://www.atlassian.com/devops/devops-tools) which is biased towards their tools but still has some good insight such as using automated testing to provide immediate awareness of defects that require fixing. @@ -47,10 +47,10 @@ The following resources give advice and approaches for building the right teams, culture, processes and tools into software development organizations. * [DevOps vs. Platform Engineering](https://alexgaynor.net/2015/mar/06/devops-vs-platform-engineering/) - considers DevOps an ad hoc approach to developing software while building - a platform is a strict contract. I see this as "DevOps is a process", - while a "platform is code". Running code is better than any organizational - process. + considers DevOps to be an ad hoc approach to developing software while + building a platform is a strict contract. I see this as "DevOps is a + process", while a "platform is code". Running code is better than any + organizational process. * The open source [PagerDuty Incident Response guide](https://response.pagerduty.com/) is the @@ -58,7 +58,7 @@ teams, culture, processes and tools into software development organizations. their services running and putting them out for other developers to consume. Highly recommended. -* [Introduction to DevOps and Software Delivery Performance](https://www.stridenyc.com/blog/introduction-to-devops-and-software-delivery-performance) +* [Introduction to DevOps and Software Delivery Performance](https://www.stridenyc.com/blog/devops-and-software-delivery-performance) explains the four key delivery metrics of Delivery Lead Time, Deployment Frequency, Time to Restore Service, and Change Fail Rate, and then gives a high-level overview of technical, process and From 7851a3f059fddba28f7fff539a2a22dd81251c70 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 1 Jul 2021 09:51:34 -0400 Subject: [PATCH 285/302] fixing typos --- content/pages/06-devops/14-logging.markdown | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/content/pages/06-devops/14-logging.markdown b/content/pages/06-devops/14-logging.markdown index 3fa5b0e30..9738d98fc 100644 --- a/content/pages/06-devops/14-logging.markdown +++ b/content/pages/06-devops/14-logging.markdown @@ -55,8 +55,9 @@ certain threshold. There are libraries for most major languages, including python. Saves data in Elasticache. -* [Logstash](http://logstash.net/) Similar to Graylog2, logstash offers - features to programmatically configure log data workflows. +* [Logstash](https://www.elastic.co/guide/en/logstash/current/index.html). + Similar to Graylog2, logstash offers features to programmatically + configure log data workflows. * [Scribe](https://github.com/facebook/scribe) A project written by Facebook to aggregate logs. It's designed to run on multiple servers and scale with @@ -112,7 +113,7 @@ certain threshold. * [Good logging practice in Python](http://victorlin.me/posts/2012/08/26/good-logging-practice-in-python) shows how to use the standard library to log data from your application. Definitely worth a read as most applications do not log nearly enough - output to help debuggin when things go wrong, or to determine if something + output to help debugging when things go wrong, or to determine if something is going wrong. * [Structured Logging: The Best Friend You’ll Want When Things Go Wrong](https://engineering.grab.com/structured-logging) From 85e98bcab3a492400154b974d0fa298ded8e9645 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 24 Aug 2021 16:32:29 -0400 Subject: [PATCH 286/302] new blog post and update changelog --- content/pages/05-deployment/04-cdns.markdown | 4 + content/pages/meta/00-change-log.markdown | 4 + ...ance-monitoring-aws-lambda-sentry.markdown | 262 ++++++++++++++++++ .../210823-sentry-apm-lambda/arn-region.png | Bin 0 -> 57149 bytes .../layer-with-arn.png | Bin 0 -> 115791 bytes .../performance-results.jpg | Bin 0 -> 146212 bytes .../210823-sentry-apm-lambda/performance.jpg | Bin 0 -> 120136 bytes .../sentry-dsn-string.png | Bin 0 -> 384533 bytes ...onitoring-aws-lambda-functions-sentry.html | 7 + 9 files changed, 277 insertions(+) create mode 100644 content/posts/210823-performance-monitoring-aws-lambda-sentry.markdown create mode 100644 static/img/210823-sentry-apm-lambda/arn-region.png create mode 100644 static/img/210823-sentry-apm-lambda/layer-with-arn.png create mode 100644 static/img/210823-sentry-apm-lambda/performance-results.jpg create mode 100644 static/img/210823-sentry-apm-lambda/performance.jpg create mode 100644 static/img/210823-sentry-apm-lambda/sentry-dsn-string.png create mode 100644 theme/templates/blog/application-performance-monitoring-aws-lambda-functions-sentry.html diff --git a/content/pages/05-deployment/04-cdns.markdown b/content/pages/05-deployment/04-cdns.markdown index 89d2f9656..6f59ac4e8 100644 --- a/content/pages/05-deployment/04-cdns.markdown +++ b/content/pages/05-deployment/04-cdns.markdown @@ -16,6 +16,10 @@ servers to improve web app loading speed. is a fantastic post that goes into great technical detail on how CDNs and caching work. +* [The 5 hour CDN](https://fly.io/blog/the-5-hour-content-delivery-network/) + explains the basics of what CDNs are and how they are a combination of + many standard web server components, but used globally and at scale. + * [MaxCDN vs CloudFlare vs Amazon CloudFront vs Akamai Edge vs Fastly](https://www.codeinwp.com/blog/maxcdn-vs-cloudflare-vs-cloudfront-vs-akamai-edge-vs-fastly/) compares and contrasts the most popular CDN services based on features, performance and pricing. Note diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index f73ac97fc..4e19b4cb0 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2021 +### August +* New blog post on + [Application Performance Monitoring AWS Lambda Functions with Sentry](/blog/application-performance-monitoring-aws-lambda-functions-sentry.html). + ### June * Fix broken links across the site. It's a real shame people and companies don't use 301 redirects more often rather than just breaking their URL structures. diff --git a/content/posts/210823-performance-monitoring-aws-lambda-sentry.markdown b/content/posts/210823-performance-monitoring-aws-lambda-sentry.markdown new file mode 100644 index 000000000..40cf73c7a --- /dev/null +++ b/content/posts/210823-performance-monitoring-aws-lambda-sentry.markdown @@ -0,0 +1,262 @@ +title: Application Performance Monitoring AWS Lambda Functions with Sentry +slug: application-performance-monitoring-aws-lambda-functions-sentry +meta: Learn how to use Sentry Application Performance Monitoring on AWS Lambda. +category: post +date: 2021-08-23 +modified: 2021-08-25 +newsletter: False +headerimage: /img/headers/python-lambda-sentry.jpg +headeralt: The Python, AWS Lambda and Sentry logos are copyright their respective owners. + + +[Amazon Web Services (AWS) Lambda](/aws-lambda.html) is a usage-based +computing infrastructure service that can execute +[Python 3](/why-use-python.html) code. One of the challenges of this +environment is ensuring efficient performance of your Lambda Functions. +Application performance monitoring (APM) is particularly useful in these +situations because you are billed based on how long you use the +resources. + +In this post we will install and configure +[Sentry's APM](https://sentry.io/for/performance/) that works via a +[Lambda layer](https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html). +Note that if you are looking for error monitoring rather than performance +monitoring, take a look at +[How to Monitor Python Functions on AWS Lambda with Sentry](/blog/monitor-python-functions-aws-lambda-sentry.html) +rather than following this post. + + +## First steps with AWS Lambda +A local [development environment](/development-environments.html) is not +required to follow this tutorial because all of the coding and configuration +can happen in a web browser through the +[AWS Console](https://console.aws.amazon.com/console/). + +[Sign into your existing AWS account](https://aws.amazon.com/console) +or sign up for a [new account](https://aws.amazon.com/). Lambda +gives you the first 1 million requests for free so that you can execute +basic applications without no or low cost. + +The AWS Lambda landing page. + +When you log into your account, use the search box to enter +"lambda" and select "Lambda" when it appears to get to the right +page. + +Use the search bar to find AWS Lambda. + +If you have already used Lambda before, you will see your existing Lambda +functions in a searchable table. We're going to create a new function so +click the "Create function" button. + +Click the create function button. + +The create function page will give you several options for building a +Lambda function. + +The create function details page. + +Click the "Browse Serverless App Repository" selection box, then choose +the "hello-world-python3" starter app from within the +"Public applications" section. + +The create function details page. + +The hello-world-python3 starter app details page should look something +like the following screen: + +Hello world Python3 example app and Lambda function. + +Fill in some example text such as "test" under `IdentityNameParameter` +and click the "Deploy" button: + +Click the deploy button to use the starter app. + +The function will now be deployed. As soon as it is ready we can +customize it and test it out before adding Sentry to capture any errors +that occur during execution. + +Go back to the Lambda functions main page and select your new deployed +starter app from the list. + +List of AWS Lambda functions you have created. + +Find the orange "Test" button with a down arrow next to it like you +see in the image below, and then click the down arrow. Select +"Configure Test Event". + +Configure the test event. + +Fill in the Event name as "FirstTest" or something similar, then +press the "Create" button at the bottom of the modal window. + +Click the "Test" button and it will run the Lambda function with +the parameters from that new test event. You should see something +like the following output: + +```python +Response +"value1" + +Function Logs +START RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 Version: $LATEST +value1 = value1 +value2 = value2 +value3 = value3 +END RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 +REPORT RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 Duration: 0.30 ms Billed Duration: 1 ms Memory Size: 128 MB Max Memory Used: 43 MB Init Duration: 1.34 ms + +Request ID +62fa2f25-669c-47b7-b4e7-47353b0bd914 +``` + +The code was successfully executed, so let's add Sentry's performance +monitoring and test some code that uses it. + + +## Performance monitoring with Sentry +Go to [Sentry.io's homepage](https://sentry.io). + +Sentry.io homepage where you can sign up for a free account. + +Sign into your account or sign up for a new free account. You will be at +the main account dashboard after logging in or completing the Sentry sign +up process. + +Select "Performance" on the left navigation bar, it will take you to the +performance monitoring page. + +Click the 'performance' button on the left side nav. + +Click "Start Setup" then go back over to AWS Lambda to complete the +steps for adding Sentry's Python layer to your Lambda function. + +The easiest way to add Sentry to Lambda for this application +is to configure an +[AWS Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) +with the necessary dependency for Sentry. Sentry has concise +[documentation on adding via Lambda Layers](https://docs.sentry.io/platforms/python/guides/aws-lambda/layer/) +so we will walk through that way to configure it and test it +out. + +Scroll down to the "Layers" section while in your Lambda +function configuration. Click the "Add a layer" button": + +Add Lambda layer. + +In the "Add layer" screen, select the "Specify an ARN" option. + +Select Specify ARN in the Add Layer screen. + +Now to specify the Amazon Resource Name (ARN), we need to use +the Sentry documentation to get the right configuration string. + +US-East-1 is the oldest and most commonly-used region so I'll +use that here in this tutorial but you should check which one +you are in if you are not certain. + +Select the AWS for the ARN string. + +Copy that value into the Lambda Layer configuration, like this: + +Select the AWS for the ARN string. + +Then press the "Add" button. You now have the Sentry dependency +in your environment so code that relies upon that library can be +used in the Lambda function. + + +## Testing performance monitoring +Let's change our Python code in the Lambda function and test out +the APM agent. + +Make sure you are signed into your Sentry account and go to +[this specific AWS Lambda set up guide](https://docs.sentry.io/platforms/python/guides/aws-lambda/). + +You will see a "DSN string" that we need to set as an environment +variable on AWS Lambda to finish our setup. Copy the string that +matches your project as shown on that page in the highlighted green +section: + +Copy the Sentry DSN string so we can export it as an environment variable. + +We will +[use environment variables on AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html) +to store and access values like this Sentry DSN key. + +Go into the Lambda console to create a new environment variable. To do +that, click the "Configuration" tab within Lambda like you see here: + +Click the Lambda Configuration tab. + +Then click "Edit" and add a new environment variable with the key of `SENTRY_DSN` +and the value of the DSN string that you copied from the Sentry screen. + +Add the environment variable in AWS Lambda. + +Click the "Save" button and go back to your Lambda function code. + +Update your Lambda function with the following highlighted new lines of code +to send errors to Sentry. + +```python +import json +import os +import sentry_sdk +import time +from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration +from sentry_sdk import start_transaction + +SENTRY_DSN = os.environ.get('SENTRY_DSN') +sentry_sdk.init( + dsn=SENTRY_DSN, + traces_sample_rate=1.0, + integrations=[AwsLambdaIntegration()] +) + +print('Loading function') + + +def lambda_handler(event, context): + calc = 1000 + + # this is custom instrumentation, see docs: https://bit.ly/2WjT3AY + with start_transaction(op="task", name="big calculation"): + for i in range(1, 1000): + calc = calc * i + + print(calc) + return event['key1'] # Echo back the first key value +``` + +The above code imports the Sentry dependencies, and then runs both +[automatic instrumentation](https://docs.sentry.io/platforms/python/guides/aws-lambda/performance/instrumentation/automatic-instrumentation/) +and [custom instrumentation](https://bit.ly/2WjT3AY) on the +code. Click the "Deploy" button and then "Test". The code will +successfully execute and when we go back to our Sentry performance +monitoring dashboard we will see some initial results, like this +following screenshot. + +APM results shown in the Sentry dashboard. + +Looks good, you have both the default and the specified transaction +performance recordings in the dashboard, and you can toggle between +them (or other transactions you record) through the user interface. + + +## What's Next? +We just wrote and executed a Python 3 function on AWS Lambda that +used the basics of Sentry APM to get some initial performance +monitoring data. + +Check out the [AWS Lambda section](/aws-lambda.html) for +more tutorials by other developers. + +Further questions? Contact me on Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). I am also on GitHub with +the username [mattmakai](https://github.com/mattmakai). + +Something wrong with this post? Fork +[this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/210823-performance-monitoring-aws-lambda-sentry.markdown) +and submit a pull request. diff --git a/static/img/210823-sentry-apm-lambda/arn-region.png b/static/img/210823-sentry-apm-lambda/arn-region.png new file mode 100644 index 0000000000000000000000000000000000000000..4bca3e0215a9d85b924c8ba343b7ae42d8f086c2 GIT binary patch literal 57149 zcmeFY_dnb3_dkvnEk(E1E~RSMtgW=v-qfzzEB1;_QB}KYQ?+B)2q8wPQG3QnL{Y?w z6+uM4dA?rH=jZ+Yer~VVKk&VM^TQ*TbDeXp@i@+PuKPKO)6r6)p<a8qmoUZSoh-&TxgV>7&&o_zJT+NbL;evU$_B3zo)P4 zPLEzG=JpM#Vn8(; zt70e5O+K?$OqwaVg1FVDhkvTv`|-14z2C+*`apH-`N6RH8(9s*$nvM@h+9vCxgy`~Q@&*X`XHNLN{EN-l@1~B zb!8|dawlTqTg1b_X-e3g zp$FrnXB?sr9YXS+0q7*52Rbr0zbo12#^sP1!>P}IFL#eONKAW)c~*Kk;B#bRg-=22 z4ALJN$x9ySDsm?xN2mQ}PgvgR8Xj+-m)ndmfOz~J*USj;+AY5KA;;h^b7ZcpepJ#i zdEKbYoKv4dp`&S` zbCll%eD=`SJ~f-aQ}c8R=mrnUQ#f&jyY#of@$XH-w?omPl@L@1W80 z#~A_?dni1z$L;b|Ft6v*X7VXXayGLidKR9w|KKrd03dsk`rbHK*IJj(UfjX8GoG3av=*W%d>- zKo4f>dVUnk{{7=e*Ax{uuU&ceg721eFZqGO-0PdS6MNaNzh+2{TVvCE88`g0L+Mw_ zp8-?bJ9<$UkxVZWA2}rZt#Ns=q7*G3vFhF^DWoWubWTcqInPa*pqw^--H}#`oL_mP zD1Jh%kpU4mThu@9y=mBZB_#3W9m&*>%*=c1AM2k9+>b4>na^a(Nl3T8_eRVpR;-(F zY*%$;cOKb%d4>N6XEN>oPx{ zE7Dr?6n@ruF{k!i;W??l{*&MQDX(pBGk@stkSM+79VhZ3{=;@$Tii&m--^;Z!MK;g zk6M$-R6QTdRU{jznJO))N~u9!Zas!RaY^AHWLdlBC1s)}@W?pXKRGE`Fr^?F#|^nF z{ZXDXk-b=>jIYqOP*hhyN9t*afh_2XSaSBuk&@9OBfahNC*}U-wM~tURZSO-ea@&}MGyAx8?zE;~;Gz-=>RwsoW)fV0@h?|P+a_x%cX@SdP$EQ%y$3Kr5&OOg%&x71z zPOiD-H|qo?`lb6pPdIn!rS39IGbfI|%zKwdl@}sK?*s9D3ORw8TXgKXB6tu{5SVWe z<^gaI=m{hT#vl7_=1l~Fv?swZIvD-d7z|kzW=?o?#b!>Z&j)M6J6cm z4#_S$fV!ctBVYSLw zmC>JKAI3h2|1|W;pV3O}((#Azb%{X{6Z^@xUa-3ozT(U-QZqhLsOwXE))YNtG1p_# zX%?k-zC3hZcm48KyvMa+KCr>koBHUrch(uh(ds(lzDE4bc=P!5`zm}8zK364e7QZ8 z{zZkqp#FvllaX9y>dddLdf|qT-}Ox0zB@N;HTczOH4D@)xrM-DoO_xFn@yai-c8xK zI7#>UmAX~$@=JeYUet00FYJ9rNC#2k3~;PFj5`HV52W{*J~BHq?>(Pnj$$r*ZX|8# z$u3o&cbGdXZQ-Mw2hICAYB)-7u0zjCA2$TdIQjklcW6&ZPi3r?e@UyCdAzxc1v=?% z;)jR2!r!cW<5QYBrc?wN1D)6CCEUTmV157?fkCLWWwc1Nb{=}1+zc=XG(RW~QVtkB za6Jx2{aN8WTv+z)$@wkYhoeN_M~}&M$axh=6$n_FAvKV`9k6+doq!Ye6DRpdt8ye$ zr&1{EMaTs;9(zuBxXh4DU&pbG;*Qn*rfa4wd!vzdjS@h$bL}0u9R>dG^exwW!*n&Y zp*P>%VZSlYaQJ?;cks{7TKhF$>hxHaYa#uZjnNhHSZnJPYddSV-{-#vf4lUcU%gRT zdpWIq{1T`#`oT4k{pBka{&>i!$j0>mvG)9ljv|KyKtk!OC(5-6p*L5VIFg(gq7om< z+W*XyuJ@~-oQrvWvp?SKmcPW(qfoVrTAMhV)qbOdklf{bA(7t(>>QqYD~Y{e)k0PE zRKOEyF5WaVJs&+`J!ie8l9&acW1RE8Pg8K2yQNJ25Oq+-}v@P-81N6sIHE# z;RLSYsXkV7Du*l2FBEcg96eQVSLH52=1Re%%n9Ks=k@k1tb?b$TXw?mXf{H)-+uH$ zGS8c115lunmmz@$-v+1t;dJj%$JaP@oL#gYv4*mqg}7DtRkR3^%J9aC^X6 z&pjKX=~~-rKC?6XnPNi+o^~Gbn$jAhn!WN*6|UwsZT6^aZI_=ewMNlKyOs{kfZq`R z?dWYmw`=n{;E7~FKkr4Q-FlK#u#zhUl-fTo6uESu&9^IX zd%odabJ>nPyV4m*@cTMaR(%TZ0E!UShs<7q&jDjlr51fZV=UmOY(vmYr!>B!t*2~tA76*tV0|ptg4fyK zKjZjWq@8!fI>l-%Qy;8%G`)%{tocwAKh`I|9V`&E1hY7gU1Hs~eBLofa2P1q2dsomPDrN0fI3`Yl+wtnC<&GyxXVk}I!SUi$tfQijW$Cf z2@jWa>vKp%wRMqVhKld~qY4xaHbM0s0;kH;*zsDgi)KpDwe~JBzLP}t*N2?hYhPT5 zcMfyAH>&oUnj}2L_BE2Lq!c7qh%HhQGUDU*-)&N2oBMz0u}&mc|HVVRu@JvWNXWjD z{X-##f4%Zgo7CX1&igV32qFvE$>5F88%+%<8+SJWYg_ksb^-xz9)B^A$OK3cn{IYK z)@%W8t^jYT09p2baYzx{e~|^*+5W}i<08xcMpK7P$=%D2O-w*kK!{zAij9p;#>>`T zO7Ere-{Qo-WZ4~kd_1HC1^xZ~1^h(>+`SwGpGite3JM7e3JdcSIrzN;0Y26N`~Yu` ze=GS%&r3UR8!smhA18MJ+h2OE-?{tx$g;ElHPHY0{Cl20PWJyZ62SZKWf2!B_*akM zGXWvN|0HG?;PhX_{_6R+*uU2G@8M+rQYNKm=k4z5``4@t0Zu-0!ZQCFGqh`MV0(Zrx$7qPKE4klZw3QjxWBbnW*1=rRayp@7QWSebn}u^HuZZ5zA=s z7#ux}U$O&)bcR@!^@F9iv$8gZ^Q4cmL^cfG>~bn8l8|1#sqh~k5$#uJhg<;m%Kx$V z-(ptb;nI|3WY^fjN&e&G`n8)L+9WA_|78fG61L^hXa7Z*s8xZC>?-_@!ei?HHc8T} z*IK-9{I}t+u_cF-kYcai93=a%%OoY+W4iKR7jW${n?jc?>C5l`d5`|mO5B3}|GfHt zY5o7Vfb9PZTTu6cEO0IF=hjT+$clESP$%IawxaQ%uN0Wz9JrxMagD9c{%R<0*S{g) zfd29a$YAN0tKpfIi+wjAInhW4^uv#g^TUS|6=KMc!O&hlLSVE>?GK>+hJ|w`X0~Wp zJI1HPOL#P|#0y-f_qR3be7t%{+cJh*<`6m9b24$)Th-snmWtg&k6}-X#qqhz&ib@&(-z&Ex_7hFbnBftCGSVU=~F}B8?FmW@Vgp?z@<6Hx#<>&Q&_rlEC;e z%;)lARomOEhjzVTtV4LwRsZL3z>c4O#bjTEg*Y=ceds$=F?r+w?sPRth{Jt{Ub?NV zQvf|P(+F66>}RUH#wBDs?&uB6qdOIGhs<-?kG3V{U|<`{QW7KZbx3IMRguf)!OLM7 zat_H9bn&~@uGid&{JUfl6gMg}bx^hUFt2P<;ByN3z1Le8n2QF%oTIVr?OGQc?a0W_ z3}2p2VA;?`j(dklSzd6WNymjl1I)5%WUWG?B&WUCGwkv#qt$;!$^NoE>B5Ol)-`Nu za}B~dT6SHyRrvzeDJ~(s(*mu~wUKThkOn=(C-!nmbjBnkio`O9zJ(We@B1%Zc4@S_ zmm+I1v*#Jhzj79Rj4+D)>1;6bV8cpn16C{Me z2)W^%He~)S{fGKrLM2kA{FN0yM?_@pO$paMtz!S%1>Swlh7QN2HQ48!B8QZ+R4< z60upTEAdN>H7Hab-y*XSj>{+rv-uK=g%-eaCDFJ7PeLos<&rXfh07*@g^X%zt{C07 zH4_#HWx~$dY6f=@mM*>>O{&CSZ=t^?n{zbB?k;Z&%;y>3N_C?kQ_bsa?A&eY#-T$p zyHlwp227zM1NG8A8}K@NwdZ>!-Db+}is@MyL9 z+%oDW+KRJ|RoU?Lh)bV>oAe%n>Ya?LdD8mTztqA?ag9~3blY)%d(%Pcs;2TcKWTU= z%!sC``~oZ`z7)`-BQJZ6O$SKMq!#*>^}#d8dzb86OI^JELo>rPaPWdr2Of}>N6nM-IB(@V*GazCp$X~2XOnT62u)5MneA~S)6lG~WOG|VCrz%7jaIW;b=Pdpc$W~R8PX4$U z6*j}EJkxEP4RVF1w;rs&C>$glFYKMo@}|g#EwPK7%*J)M&|3zKe1h72LoHOh3GsoH zI8V_zqCJhS-fGj1G3mD>cAJrXGMCc`W%tG!uqAmzneoi63Rh~6J-$U;Qj^NR7ZdS= z`Z0qC(tfd8$v4{pa!xhA+kj@t(i-(4Zsy0U;zS?d-4zj(@lEWVA@Q(|7{2;Eti&Ja zv9;QLmB*lPxuu$AZQ|jW?Y+&ViOMor3p~ofAK;`V{U`UUbH{c}!m|w@H;Z>UY{thO zvrOJQ*7mrqMT%`T71W(_=%PT0d&!%kT=M7s>l*!^{_$>FS8vm_Y}l0Mv{)Hku4H^! z@Tv@p{;nq*G4$nf8Me{t)&#nI4pnSFoe~^@W9b7p?Ts=`oBV{^W|t%@CyhEU4lAu{ zThu%%QcAYOKxY^pfT3jj#rUtaxuSCeCuHT(ns1nQhe3ftr|DjKoZHU>R zkq#zh@KlC*2EOb7pbiGCzxF?-e z4X$Bo{kTBkHuNjKGp4Wdz@R!_)0wZjICa7*__7Imzn4`x!F~Q1hYrishGOa~-u?Xe z5aCm4IUUH#Ct48Luam&sECRVz)ofv?U#Mt5Q)s*W7AA-&JDe7;0WSeBrRIGn>d$6i zNQ(YV3dXyHg9nB$FU6j)(PdGo)E{X+I)F!q~p@MK2WA)+wc)6pFPOHo?x7KLgn-0V?r#MeL zaL#U%>1#~?XCHvhB8e1>A;c1=n}Ft=ajZ=A%(IcZJQdNeU!mwgSrTgU{4A(_JJb;J zK|3Zx(giQW(80M(ms6paEAh2>e36arMlTdQ&wqkrZu)=>BOs_VL+tMJo4R(K0psQY zZEpCZmkG?Eta2OJx^+?*Gj{LU$sc-TW~(=SCMS{)lay}Sw#(Ei2MS%GMn9P0J84BLCt&Yld~{*KhXK(C!Fy1O_B1{z=^ z6DpAEE;)l`9moa39(FsHHB^{&^Ay`rJJY<_X9ml|+pr_NcCZFh?v1*-7!Rq?Fifbo zua@ptE-||x`1=zqZC1#JugsReN~bZPC)Y1eT`CNJJT+z?0Y={EJDqby<+Yu_E5C$w zsBWY{^0u_!v2FoZIM5GH$8oa8yRXjqYyaTyZ%YVO9OuAhM~mZLxg9s6=imfD5~IkV z6>*Q`J{xvHi!mT`JM}5|u2-e{IF|0>g0Pd4d8ZAA7h&f8_nK!$8CP)cxUMzEk5PU7wWeMBu&&FJ&RXbIrXnih|+PJh&1TUohs6XJ6VSOar53415=b#MLvWkYB_*~GLD}=@hL(l8e`48 z*Rwl}%^jxeoD8JSHL~zSJ$2{u<7+QFg za*+qrvdVUKqQI-6#|%HEj=R#_+&7Otm2SkG3qp#EBnjV63atTS4ceU#AlJdG$84)D zMP_rB1n-qK#$oGN)&~ssLDL_cVctN>{xs$qZ9{L-!}CxlY>)u$p75lvmF%+ezrv?9 zbJ^n93W(;tzXGQ9^o;eZ4XD#SUpw$uD~WN5PwleDJfT99+t2HlChYgcGH?;H{w<5u zUH)M2+D{j9+#iZ~NDQpd573y<65eymw+sHxEVhLds8Q^?u~f(2E&HAKE|H#qesw}n z&oSg8`*n~eY@TuM{8gfBNT|wP|d*T})fY+8ii$v}2 zvM!F7<-`J>Z_mj09dFKX2F(3VGzJ57&_`Rqj_=w&qmH(r3%V@{1D%`K{;# zY8a*ZH1aPz2BvCq5(}4%eMB4rXnrc^G4A^47UV7X)79Kk4(zukULKS+*Xg7?U966F zL7UcsqaIuqzdnA|USceX3fk#F}}gRL z>XGk>NLtyFZIDty$(esqv3FTp=h44CM&uIkNY=jBclBcFezlgkG2O1U$~|0r$OYbh zz_1Aadt}VfHpU!>McdrQHO~Eb@DEC`U8T^Hxn;VbF@xGHmDgwJGHu?8ee1KK1=S$% zs=Qokbo{p1rzu`mF#A(blVy0#=dW1bX$$(DiQW}fOr^%VT%9VW`Z!&oQMJ1&wv-4? zbI3O(if@)E49^-~3fM78dQx1uw=Z8}T{ic&?YoW;G!)^N@XL@P8oVvAK8VXzgt*pOOvyfTX|6B^YuYYrtXhTq;h!29 z;sE5_(~xZPd~!5?{7oSZ;EE{L(-3dnc8EnCWp{%!#rXw4HNixwHVb?dr8}o<&Jk+@ zHtQT?nSC@;FDVwq#vI~1MgO`-Wl63&NyLAGG$q}8({}OwQHsR5_#MQjCKq38+oDj_ z{MyE_#_9z+UDY1#=gsMX=M{uk38MjTYWI}z;gz!J;?Z&&&4>?v)q;meaW&>zy`Ji^ z=knrnH7Lwit&L<_H^C#Mf$B&PqQ6KvQG#C^eLt5{zidW{+YJlHeq_l8trck=eh_Jx zf(xGm7M)Hs^-D}{Z#-j8D-)NK7M`m~PY$YFM<{NLz5R2Edf>nPcxq>QG^N{5liiAZ zuu1ShqX!_#>;!^B!PZykSWDZ`58)!!Wb)np5pAv5%+F zmL5`5#gvZ$K?)(Y5B54AW}+@orRrO!de)R7V9Y)o&(bn9>w(|9!74t>oU4mX8ujh* z+Bj!(UN87UAAQ<2(I`oXk@dHqrxvcZ(#-x(xDsMLv>eZqrcu-G6Z-4A8>G`b;E z?Hx-6=p|olx(WT`eePs2l28Po`(mQkuPuMyg0UoLR+h4LD*XgW;}1pP9l+fPbq; zmO;%DB2+9(AsbPpQnYWHMZk5!M(PT|r>p6(nJWMx z3Al_Ac3-PL?Qz8zX}WjErPpAj@BCPD9zAtw^ZTnIwi8-aP}Yjg(sSj zi=eS&0t{#^n~Va~24N&r>{v%((OWBH_R{4T8B`MLAbZkIc&l)RdJg%%;cNc`0lRnP zpWzT&(}T_Yjj9co2s-#mT&Ryh*lJg$zwle?W9jOqcRCB_6*{3qwY3} zbkU{SId)tK5d>>>Du`zS0otwbJA7Ag5|lD@#xsT2cP%ubP3}Bt&^!;#ooY?D0vQ)5RzL?K+RITPk<%sf22|@zxCf)GbZhB+#Cx*o{;=C#*8vqcSrdx32QuNR)UiCySq@JT>l91$ije;5RgxUn!gHX-Vi+YV_Ct3 zkn{HeYl%;p%f?6>l`Y5%7|TpM50~5tC@*t8?@m=l9@mygTu8azd6N8zc{0>|%yD9F zx~jFvFq{(qWM=4QH$*5;{a$C>X@vwM$-nh*F{ht~BE= zsK-cu$uh63uI(;TLcljwzQb z{+GdRX>(;~HCK)}{(Xci%-`bnCiS0aJ|gQ2IrpQUp@es=qAXEE@llMcjLMq(k*FuJ zTTUTfM!Mr~=tJ&6jei-^RcZpEhP4TxU$;2Zj~Tb1--w~#ws=y@*q3VU>tuTnYaI+j zENh@g{a{n#Nu(YJ=A);ass!hrW&_B_aju2CrMheGmI}+eY>C}1qz?DjQiXzQZG&zm z@S0@-@0bMhs2s-|PDz#^`0w>$ae7LL^d4x;DBu{xq_d3Gs|B)hR>v}WpqCodb;@j# zO|ofc<|}yIKidbrm^j(Jq%AhAX}5FL;pdTdLsx@ou0uaobsurYqu?6doBXv|I1t{!fgfxf^+#NWOJXnl{F-meBf#1Q zn79rCAY>o%%n0AW^Seg$XC;u!qRV1x4fxls-}t0$JoiuD27LM(W-!!g)*PF(72#JI zK5^N)T63!~ytbnU=;%;+S5Lu=bQpSx_kU_kUhB>hLM*lbviZ*>?{!PQH8$J{{>k+34?=N=FjW}q0)qS)>DNj_dlmu97xU&tpSx?E zkaf~q!XNp-=j~)qyH=a0u;6}xkWi@-r&W5b=92=iNUNrBHzma$X&_AqNQ#AgdNnl? zc($jMryffK6?^lZjBp;>;%n_MSz8@;>CMVOA!0j!PTv|-*e;+8NO+-qe^v3V%_xOddq!q?>nyqGL&_t z1D+qLI$s;pq+~H@zf?uQq37#2iXbb<>i{*domPU5d{aMaH{0m!WXHEg+RO;y{B}Hqznu^suhi|AlSMXYN|}>?6j_c+ zWnp?n&bg2`GhHrckh7G1)Ui9fslQz)L4Lgd0uuxwaz_LeRk4{tyiMdbc>M|7r^yVi zu=DbKpvhYH^yW8QxO>-EbtO{T9Q3OUKPvJQcx-?mkdDr6vQ@$D#vG-eUkk&NHeowi zE6f%~D`PtGg|kiEud-VInh7sgU|)rn3a*cNLr$T7s#5LoqETdw@8+9hk_j#S4`V}6 zHb~H?MLX`y)yuv1%X4YJ&x8uS>E`JUisKU&V5zuV z2_L*rxwxc>r?4=uqKR^AZx*j%42+gGso#5i@;hiLCupy=(VY;lh*agDCWHncMe_U) zRY6ZeSLEFfxmlstH$%$|bzac1y6WZ7XBF4BQ#4>aX7G&LhMeMcNKEOghNBA}X?Scb zFg&%!TB%I~`eM__yQrB-uTrjI%Kj*;_dsk8$2{Tw>%%rKCUVzL_Sgb2U0#0kJ%fQI z;~*Y7h{?=7CpOeeAx=IkOIMSroN(`$?N44@jc~>Y<@8 z$Qgs_DDIaR@!HQvc-14f+-s1S0>d3?~zMx z7x-wvZP(wQzbd)#i7MAi6^CM%f)|~RDU{9iP;2H>l&pL=>}Rk%HQmq1Zy-oUi7*WH zdi<8-^2`&a40!ly?5%zvJeZ*dOa<|C*_IFfKy_T6KRFGNM*v^wAB}DV|Jf@rs$Q+E z)+N?om7X2lCvVuoRqiIKeSh#f-N2|x%US5;b=g`2&I1&RCn$g6HqNIqZHf4UU3w~Y zsh3e9kzjBr!c$Rb3R{f|eAS=XS3yOVW3VEPi5O7QnlX|>{+S#oACb?|Hte~V0biY` zsc|{?XMQ59u>ioiu{TUKw`|mD%U#NNK{P0uPe3y9>TV17@B*mZZ_4*qQz_0OJ|E#qXCJ?T?#G?i9njT`*D|oyKrk5EWmwi zGYGV`3!kpnk8kW$-)jUu5ZZyrb+cJS(LNNF+8k@*h+9=h2H{Ivx`W!}fOYk~m9u;P zwIG?Cj?)#F#a3ncw3gD>&e0g@VnrTZ)!l1MzYS6E^yM}r{~Yu&zJkF~AaMgR1wc0L zk_-%fi?Boab1*B)!4v@-r#3^h9i&)K z>tqHls86=A7YvaMK8ThW##xRZ6p0HXi?9m56)N&pQ@U7=+Y@G-Q1|rf+bPB+m(vP&;W^K+ zfSD_;sQ9tYgKa&d<++ifFZ4nm)v206wg3pvot1UpD@H+RjQ_pIo>PznOAsgr+1_{b zEpmw}acZwPR3g@Kj1Ov+A8)I^1b~{(#<77uW6Yfi$mra4L0%Ex! zUxOe1e|}j(#RV?q`Vd`>ECyxLl$Be&IR+r9jAFF$3@F{kL6hcv$oU|B3Z3x12XR3P zmBVRL0E1Vt)$bG&%6P(2HJuA4b*hHrw)(H&?Pss(yq(d_@grP^`gC~+sXato>Rc?~ zN=gvgVsWJ7jlU}L&pVOg8y@Oa+wgDaSp6yMr89;8k9cO?d!nFOUSu&cn_9q`6*S48 zCW8^ee^ZxYn5nNW-s)foD%oFU(XdS|D^=Y(os8;)wfo&%$`*m)_)RtmrE@Mb8n6Ewt!y zym@W3-qFa$0-KoN`K`Zeb0QS~%5lOH<}*E&)Xg{4EZMq4WLtY5=3W;+BBMv8GCsc? zqOK|CvdB%sGSquj-hG`{s)MJJ^EuqwY4ZJ+)amx!>QME?D~sc{TBwR4I%OMJ5jsWF z-uDykHk*)tIsG~#b*s{7zf(EEBkz}U`FJU1nVkJ`hN{;U`7Di2uG0D7qmfAg`y>93 zeY`>&rDD6u0y-tijtJ3B0vYFE zQ5uVueLEYLwCQj|MsgSSit0EYrzy>z{vGGCUrp!?{LNty`fZZB{I&BbU%tzoA)g|f z{@piM)A3EEOdu|POMgYzNE)Rhq=5s`Z(V7fx#|84HDym zD2>w%l2ijlmZljOKo|60XPiqLdOJ#mgw2#jX{xY#JI)f1SoaO@#Y~lUsc|=<#(uk~ zku*z-#k1nzB*DC#W93yEA}%(|TY!1m+pcP^|G3q1uj!3J$KIJ2#;UT2YtS)s$=O%` z&o5LhKgg*1wnqNmNdDVzGSa^$(aNeh+1pJz&K+mwjK%A(PaY)OJ?V;W^@gJ2*X3 zuKlD1?JQqwQR`;i5S`2FU%4>37jA%PaD$##&&;jzxn}_?STt>;P>_eCSYMw%8%vqx zo$aNH&p+QCf9>FQR^2FNfGG$BXYlDSH9GFhSYVo*b-(-Xd$DiA!gM^uePdDQJ@=0P})JGH=Yx zhS#XdN22Wwn5@$CDJtXvHn~SY9#j{>Y&^M9)t^tN`7QQPI6)1RhTwu~if$xe-&N8~ z`S3hq@(n2rbX#pKa&PIWRB3ymg&E&&|9XC`?KVAV#Shhdz5?<5xgb-wojd3t*PpTU z8WmvVf0Q~k8vTWc*3%v?OjVe;s5CUdW(i)aVDo!rQMZ(RF!KHbMnr;a@B**{ir^HH*6mn=I$Ph>L|9d?6!5p#Y} zLj36nO&2o*k6UeyJ$Tw-lJTq5TLh1#!B%@{6oDb#4_r}1&o_XfA<0phE(4K05Iq$p zXd8BvQ+@1b2@$`h;go-AoG3&DpK9m5YfVG%1JmIhCsi@J7@)7Jss#H_0ib$z#pfhJ zP1=f*53Ko;-7Pcqy}F?3b~o30XSJ`oGm6FHI;izDH;YX_OYnJ&Aaq#;a*Tl?qm?Ty zBE+&Tv0=5bk-JZ3r5AkKmaBAZf=yWspXqNJl&G~7pMsI04&Ok&b=wETVuQKSDmg^z z`+}g72yfNB91djhPS5lO+__^C8n@qcXFz>K2@en>`}G8qkj#-N^W0#|WX4}i>MTGc z$WON@+xab+uh=cOnTbJEX4ZUTrldgi7lx?{)H7K!4bD&lu09s1eVmk|uPy!TT1zFv zBl1wJ^jmlDTKznY98t_XK@r8G zwJay#+g~`J_H=Yy;g!FZ1& zUS32F&<)#CQH-1)lNXedfRyYYWYpCCZ*SyIe&^ofs8dWWV3lWQ`h9lm)?`HkIV$1(m^V6DxxP>bv~pBtTi;xt9THkxLvk%=A2- zOVhjv!_8u6dV_^fV#0QqSm+jgzf6MEbs?qz3M_tJ3*?)!BP_aP^p^TV(aCtZjN>eq>l%4E2%g5B@4IE8l<>x> z(HX?jr?xa1K=TshyVIswPuqkXxW9av9BRuK7GAmXnLm{Y)jOFG23pv)9v{se0ZG*R<=;Q(l-cGmFr+s3ujaLJv{f)j35ZF1f0lgO_SZgz(AKNhIES&9{u9A_K3lU_-am18#mWop^4QpYwSj7xto#dw7%=M3UsP5m z7M(_U&igzLWEt{l4carDCjRrP=XZQeUfv${?2 z-WqB|m1Hal{Z%*|6s3)Dh0w%Pa8QkVmil`?OgAlie7qXkA!L+6B3^vi|Xs; zEsCdIx2zyS!VGIL$q==o#1zsf_YTW<>+P71yr0~2j%iz|{#X8l2(TLM#OzVll8&CZ z31S%K^zoHFF-z~J_f4I>DtlY7OR*Xdy_t$52p$wauW8e6+>c28wAWG$N%MLAF3*6_ zs7XbvLcvU*HyAQhnxqM=0|ie@@xp$?kEP=YD5HwPuC94z0W1R+_bgMn+m0N~wUlPI zul#WL`w(p*>T$e%B@br%7j zFyG<(Q*N_$6|uEBgJ&r6j?C%60kXiCN|7(5%9#94BVL3Vs1#WC47=3EsMGMyg`%RP z6w@T+FzRTSM*$)eD6ntU6_EOv%aPdOGYr%QSkoeRsSTeeGzA*FE}vNv!>b zFO>b*f<`mBR0Vby;47?|BPP`3jNUP}E5Rh;q{o9!gNDQCsJ%MIg62}xCm9(-a8?h7 zK}S_JL0+1`_*cGXPtw23b{yZ&+NuH%Rxb_Entiv;YTfx(>FTak;7iMYj+m5$bYdBE z&iBpf^bj#lMfX1wOIQp#TwF2}jdLa~-1DdRJN<+SZ8DRUNAgXw6c#o#n-V;kS~xL` zlqj)2<##?2bsg2@3Dy|^i=;i@=ym;N%9^{~^un2ug;>4XJa=YJenp_eyCQ1&v zok$sp14~hgi?fbeeb&9yc>gybVrTU>>U-z)EVmbVJts$3`XP@dte~q4nKnt%@Y>qo zsE>@9#8fW7!MSjQxp#pYDJyv>+*sXr%9L2fnUV!sOQi{@I5sMsaT7h>;%}zAWguMa z8AZGPSzlWex7%5Ewu+U289>N{OIE_->MTLw2AzrGg3{E3X; zuz6{+k{26NbcWb<3{@@~&^tG+;U_QG7IQ77HbOYE`puErcgK*a$4AeA&HB3ca=VUG*RCt3V4|;Yd{k$4OyCqMckwDug_aj^j&Hp&4p3!wAE=Hoq!pm z!W7P9*X@}CB&NMtnI@J8)vi+uVC=m0$L;@N?=8ck+`71NK}rxX2muK}kOt{a1?e18 zLXhqlIs{ZyQt2+Kp*sc`LO|*6MrvSa7@GI?cs%EMJdZx_hySPl`&`$2fSG;Y_u6Z( zz1DBVUUy}Ikq8n#<1#z(rjr%OI191vO(a>&Zf?!WBqiu3&vfVXy9)E2ei4)g68B7L zTiR16k8m$xD+ajURq-Y}WROa|jjMRV_fNkr_MTty9&#MO6)d^vzi6R7O|=2S3up2%77WYAmlNV^wtVk+JTYC7JC|RGr{?ah7*7G95I*ui z*NSX>#8q#0%{WYWDktPNC@ty)!@tm?RKeqk&8+D#Q0ADeenOc&sin%k0ajyWTy1gp1I8b>f}5Vk|zHSoc5Vrdt*ffVf6 zDjU~$5^f`}aPZSySA{u@5uK{Htmu@_zdEmSFO%6(e2rlp=2=tX^*ITW9Sx~Y*D8KW zn?m4L2D(OXU!=OBvgRKo5bM-yN5N#+$nf55^YhyJHyqU^V ztQ&yC7m5ogt}L7km`hQQ;NDB_%bi6H*Wk6o3P$SN(wT1q@zza9xft~WcfzeaJ?upH zaq30#5^nJ3a*ggTF-e?ulW)1K&x0%nTrC?xG4Vc{*YTxlhCR`)*5gHeMGPXnT>D7Z zHRd!9uqIz5H834M3x(do<}-6rTkc6va78cLnYWVOf0#6Z#FD*avgh*FQK`W1P{I$` zzacx@`SgQq&f$hrGKt55LemCtc;R^;!i9^!AerRuP3ykNTLRK!m}0f}G#J)$hO%sK z59YsgVcf56@Se-S6jwRm&nvg<6joWu{vK%~VLXH+H@q}bbCBXzzCMR%oSg}w$O2bYrvMJ15jt_zOlUw=dXXxn_ zG50)pzz`gN3NzQ`nAW>i{IU1t)WAM%x95haUGo>IwfQxrSRB?(UnX;JoRnlD|ojFSH{m>1EDZ6EzjL4D-gnT}NP1I?Z8mdg?Aa+* zkY4?OOU=iQsH*D_7L{E7Dq8oYm651wn~H)#)@D6SBv`cD894Qm5NM`|Rexd4IoSQ= zG_THjC}%5BS}7Q%{>Q~dUC*^0H@xIS#KXn$R;0no$lzJ53w6h28~@a z;kH`18GQfYw<27(OgpA5(|Kgxevc$)djd{9nFA7J6_OvdRFW}pPf3KcALds=JBg5R zbtJv%gd7c}<=U(|Kb)LkmhX;#e6Td(C&NE>rYbsJt2KR~nACG1*otzQ?O&pCFUlQ=uMIg?$kH|xNg!RH)R55=4mHA z<#Ngnd+rW*6Xsjx-8SMp8S(Q8*Ifi}WJk-&!M!riz}D-68LF3uQ|a@vaJ#;3t-Z0^ zuE(utYAEk`>9 z1T1obYvoT4$UJ6;5<)0~&Gl3x4&V0FtAJIZvxCzdSh9edwCcsPKcU~mxXzM_p=b z#Cih{V=tMu(n=Gi&K44<*FcWC=qT2Xd88#R9Oqq!N2+=YqqAI%zTpWT!j`ZyS9ch! zz8(|k>oHnP8vO;F*~6yfHv2^?WPQTgUx`H;UzXC%JU>?xmcz)7^k`R11f2SACivjF zO@6IHRNwvarc4P+CkigMpoNdqKTwp5B4G^fgv-h(m`NFgUEp5Y z3F%5iR_Q)eWuRv8dzt1b&8*c`?*|VQ8=6GhKMQkP%&zL>WT=sY;I5-d46rYH{FHbSEf_UzY ztOsq)cy7|UO6{FGpkOA0uG1~nA8C09bRfP?C!J|rCIjg_i3k(rWYRb@a$ZzZ9lkOC zRWCY=#Rd<;YmhlQl2@EuWnhJd62qs)U0!QBZ0EC>3K@}>$-XL#rK&uD`;I5y)l_)^ zRHVjh_ug~5Tc;2%u0eQ@u&yzWB7BuDr<`^;;Iu}wpl54lN52z?f-$F@C*rVsCB@e! z+G{T<7d~CgP+S;@Ci5VP4D55XmYq_+w~*y?@Nk?}`k;aBVqdPzaf!`zP=R-6cdX%) zwZB`KHn#L^T`mS->PMOJRIF1JSR>mt`f3ThLlvJ)Vg7C*wmiuH!VdqHuLhkz`Y z-k6-@cwkbRV|)UKV_j&&$DnNbZUwrbT=F`vw zi2}K&4UF$0Rcwr)iO)G`7Fom4%;lI*BI;M;f{0jn2IZXuB9wmoyWOU#N7VX`ua zBjL(;3=s1wNLyd2x{aC)KJDUe|F(4z!@v?Kx^0bgoF}|4N|WkI(}KiC9=FYh zPyA*IMP<>NZ>+9D$vw!v<`qRB;R`vl`0YBH{^$izdvUUcb9LZE(wi6atoM1E>!?KGGMc2_%6C}PWotBzkR@MED6jLX)bnfiTJCi{m+L&s?0#0( z&BJ}V0hMkO((B#4tsau9`kv7{w-KVdD;u|lF;k#n^dS3UGnjZ;K8H*b9d%zbK0@~M z(k|RBty1Px3PtIhkYjBsR)?Bta%qi)7@a2KNi9m@8v5;n7#l~ji=mbd@VznCt8qC) zdbJ;1$8}m2ieBi6h(oKrGG0G$pL(>E@`*i(QmyxW&DR8gmr)FB6YQT&>SMF*Q5nSx zVG?vnFeiRZsRFgiQ34hB$ku1IQi?W)Wz4qHaDfL7Ju=-+His)tHio0R_#YN$EQ<%X zf1EJF`pT$mdv&wMpY~yj?9t4_`3tH%jRGYFT~h6XN+3ZRQg4Z&eiHst>=x=Fq3P1_ zXr96OoWQBn$UQg)3wMDmNyH6$1gb|+b3p=kMgQDD!$m&jkMRGGs0UW00?JI1F3u?; z^Rk}Aa;_LWsWw>nN_K+6W9&i-cmKI=h2%sqiFP6SROOX@Y;Zd#G-15AenFFAFFVs*G?+D?6LD1G>gHfZf;*Aq-sE3LT(Pct+*b(wABP+{iP?5jU&ME>qPKp%O9 zb_$0!fo|3UUx+9eWSn7@uJgjs&lzZ-*a)0DGFP;l>65SV%@X}~G*151C8q6Um3w_t zKfwDwnk@7M9Gb%A;87e;UWd`Qf5Lz5KRlrvXqO;?BmEWD4xG47)0Y%ZaK|+}*l@D_ zL~vaqbsN<~cL8q2%3I+&+xk@0(O-oDS^bd*!($(=x_x4{7~Q)KHkivX#^X+5y=b28 zlf)OKD#9Hp@g7nEcWD~ORri z{blXSv^_fHDGk5PUCbjo-&L~Hk}RviC#Ohuc*$(5V=ktq4c!m!#A9~LZ zERibl3fnXzgogv@BT|#An)z<{F9D3VcXfT_8-59fWDVo|} zTEmYS4X6;YbeVE!XI?f`{p$QOo;pm|7_!cf;RH8u_KD9JN<^Ck*GFV^l+8Z=@)xf-l#})sc_Gg7geYtU~yeY?LtUt4kD%`2j zdl&+`ILY%mT)#z1~K5#H(KX5%&9u^gsT644CmC=GDIm{~K_9|BK2Dum${s4{83Q^9R%Z zveN(my@%gRbO2%DW{Cd1N`KCNNgOcM?qi+SzvPQp(>GI{7>oWFpMK_lB<43W`;4tD zM1~K(_8I-tlN*Lin#-g$n+@= zIVRuyYK*cyKq~qJQ<)}5L?%XuAL2?Li}@} zd(Gk$XP05mtj}q;e3HPh*U4J;#Sktj7yBuq$^gTOUe3go1vm^kPvQnfBR{qacr+ zR$>LfiG7DY*_nqq`3s0@BKP9friqnrL4;MFrBz!PrCnPnIaJY>lI+z#=Klv{mLvgI zACL8Bx-h{mFFc)E2{mIi_1!av3Tc>L|L04vo>MDZUfsn01e5~yW~pY%`WPpz@hk%& z#_MpRBAp7$jgOG9vy3ni4jf`ut_17Sx4C-I%3PI<*V?}42gWNhmY?uN&kTW%CB}PS z9;C!}^Uh8U0lIUexCJlkTOSrS33sof`9L4z^mw}%J(q{jtp?9FFeL8+JltLg9JPs2 zusN8NyQ6Nq8OMeF$6?x^g;Xq;m_7;xY2bT4oM_*C4P^#!cZ>joMYInkhlG9w`fK51 z2%l}YNQoQrGNeux8HnxyW%e}z0h>}Gq;Z|B&@SuBanq*aj{*(nhq_L~AWf2CC5osX zkyGoz5@YGICX5}Z#H90jK^5r|VHChBlUf%9Tr}|wsi^DbQy4)Fsjz~A$9C#cmCfWx ze$~t@=!A*gcj4`WEJZld6+XnkRp+$QBQ+T=7tdv(Npy4qbnd%}AB5dT-= z$b&9xl93AoNc#MUwqS8!3wB9CTH(0Vp?nD#Ciw&&8zbQ4ix$fHa(BXMCQOoZWqc2w zR}^pB9p8#E8FgOmuz2?305IS|EDHFyG4Ls@G4Sr*A+sKp$9|du9P?N%f?Y61w{!Li z8BbJLnSG1PYU%UNxB-nf&i2l$(75FBg*X&EaPEx`)q>XzM>^SHQ@-qJm{;z9Hwlh6 zwE%l`3_LP;2CI{o0e>k|Nap8#`<(HHLB7D?UD;#j4CydD|KV@O+bq%HHUHOe$+KHa zz*`F*8n*@S1oSWpi#V?;!*+V^^T_y_4=dPGUNIlX28yO9ZGAv2y~4;uO8U{#8E>SX z6A+<_Yw$jOO;n(|gD-Mq$iA`Nf{&ED*s2)S_W=uriJauP&-r1V?Q|GVlv`v0I-+Uc z<4!-!_cGOBkK1-?Yy%L^3jz8&qVBuTee2-Lnn?bY#6`{d!8A!s(JMsW*J3dwgsQH+WmoHxOp08!61ay++D8MfLCus?Un z6X5%YBB#BUKZxRr9%R;=OnxV4;!YKW06lemD0fjaH{AlzRW=!_OEN=iA}$+askM;+ z)JmANgH6+~+79|*QkVnncSJKjOv^%evK|K!`H0OZ?u{9TjVoqY+7X0T4L6v-T%I-0 z2=Q+`m&6w)z^-2R^T$21I4m)U<4EbBie*XCFbS_Z&rgY$K`beL z$Q~Y{B(fH>JOe<#+t(_K^y??&Q$&QdhF%ft-vQ2y-Gq2vtY(DaQDEnAdG;m?Bg_X& zP2^zDMsazk`VxIk*3t~2Nl(Djd9oz5=v|RX?{F-HdvP$_5eqez){S2v)8#xfSwc)%N85U51 z>H?tHaTW3?hMRnl)2_s1$pT_14(J^=6xjPv+RiYc-OoeX{uh9>W1t|zL@)U66oz^q zj<;Xp;5vJ#FR)fTN`aJ)8wIhP<+@B*WE)z7;y9mwz5#O>W~rLuxKoJ7O_X34P=dXW zPs;V#3wT0WU4}=f0GuAybC%<9UGfieK}C!rtTkd6PC*6zf-&tn_AGEL5bgm*l=X_> zfM|^Oa@2EG)9qZwy^jA1L4IEyEnf7IwHK#tWOf^xB}VJ~nuJW2cfn!8hwPWfy}n&2 zn0MziJJUZPRMr4Xr8qeT5e$RBu0lZ`@2x;Hy7INlB+hMn>)iMJXNF!t$F5F#zH?ply7Fs?yt}LlZJvm1YDFOAnp2-u$5#_I#ov{zY7vh)9Row#7GMk z0`pJlmch=kxp9smjXupS4=%~pAj>v{!hKvRBPYQFSK-!qA4~Rj{|Xv@M-<8;-zEWd z$%Q!ecUO?El*@?Qp6BX=X@|oK+a!QWSx>>Ymn6h*@D=uz!gM9h0Mw7Iz+u?dRV*S8)?>P9nkQKhi?*JNi06+oszU8E%tpSR^TE{-st8&D+Wf1$uL{;Aw*w5Qy1 zm~rTiWmaeLV9mO9V5_$(zHQ?5mOr8zyEpr`>L=*>11xk)rutf$`Swp?nH@c>aFww_MtB}cX}F-n>YO_Sx$2LRd%y8LwTCLIWOI7 zKQdbEGeQ*z8P$uEw7nrJpsKIaFR$J10u1Nf4#~-kfi>u6ZC?NSj*iRLOugh_wQ&40 zu(tbo?Qt9??_lSfZs=6D^#>YGqk68#gO7)uwiGEx3#zUqd%$yzKvRzt>}Jv4khZgb zSH`=9#hC+x=+hO!)gKUOlY7%wyTbkr2t*qAsgl?$*(6$j`9SOQg5Q!iGny_eUaCbs zr3P*{Itye8HZ{9<_Xm|Q53;RDqtJjBW9R1sc5uzbjNF4pD>tA}8qUKYRw$*-d9B$B zY7>ynIKGK73CN$;H!BGfxSLQV0;oswD&9({Vv>NAFJpI={k+5;FsUO@V~!;$E&7Z} z#%oc>>*ZWu)BwV`Lj?$5N_`5nkEE;BtT5KZto+mW8s z-cW1WvySjz#U{65vAsTVTI*kj^Q@TyrDQN<-dmLlrnL*8ICoD3 zuxdOwPJo*k2dKp?tzx~~-=JZWbDVPyT0OiPM96Xbfg%^NftLe&0;vYbLXV;sbs$KcNAl!P)~5Ir=7x+c~ub+E9CA7Pffi9 zOefbLRtW$F)OPvYX{30<`+brD?hPmKyi`G;nFm`2{F$}mdRSG<#tKlmV%ru>vZ%Sf zJL9=E-sHpJJn7UYj)_h?i(vPLl%Gty&LZ%z!LZX!=*1zRQYX(2Mh(&&;3_X*fOSZl z2apgr2L@ogv_MJ#HTakd0o@$Gp{7Vvzv@&^xPV%zFzBVv56|v9iuHSnCTr6;jq48s zz}7Ngbg+gq3k~;@TxTqj-IwFW5DkDTke_YvJ{RbjEVnQgIo&8T8ic4p$`QjN&uyxvi691g_^8(L4~?ZtFflBjg1>%#Z`z;!*rn7c z<^1Geuj=xH9P7gv1D~2>KykfO$bgtkm2Wki*4FzVLj^bQTvvEg zHUnotzz2~@0G2^Ci#B=3AeaQ$%YRyF`fgMJ8q{Ax4*(qgQbWz}FvrqN;&y+)zwLLR zt@CSCLJd!b77NLU@elnnQCRpU7fNBWMab2D8cTI{d6ehq5jLuXoWK)H>z8x0lR2(p z;$24{4tUQ%eih^T_PUD_Nutx%+40`FzyRo-h#o|{EQ^H8Je(4%YS5x8r#6<%wz>)L z-I)-OR**QT@3anLsoc&U4!Aa~BI-%ISq8`kG=peAam@BBy zzD0Mxh3ZoP7p$|Hf8g(kZFtFx`smV84U*o^FMql!Q;}-rg(nbjKMMhrkzE%M8JC-W zT_W*gn3x4|A9rM7X5>Z%$il#EB0vPphZ4Hu3H!Ypz_0&gg~}>DT$tcWwM4MDzktv$hRQY>({W3L%*hp zA5D*TQEN9;lMoQ8wrJ~Fz)_P&OjJY|+~NPpZ~*RM-PKK<#nvF=1X{W1{GBK>zrUuV zO{Dzg5QsjNFx#Q7hyJ@!ox{3+%U;t5C~0Mvi(%#NjA7#iN*_4fi4t8k-YfplEr!!K z`p908*_6Lmxta?pOR{`E5^~<5@vqwc3aSQG$qQ(AxYCb{{;AkHGQ@g9vZAG#D@lIZ zCV&6y#|H#V9XPK4mAd#heg1766%H^$+wdX7znhzXotFckKNp|h`Dw2IvVX;hfDvVl zMn7d|{w4zjZ2<_Lwtr#2`>)^q8!bSd2dmo5ul3^(M*k}X-@p3=sE4qKXMDe=R2#^` z_o4>L{Inzf?{6#lSppbAq$U5$Vt^N7iGbDOBYFMH1UgmtD_{h3aqKV6 z=av5n$lo0Q5ANst6Q@`Qu~UMo z+FX_s3k&35VG|myxUV4ayCP3bF&4u_mX)0(>NEU(1pec$_+yRi(XnsYr?A_Wk_a4` zy7K!V@n7?iAlM z5^hE=dD^dK3iyiNU3XobarS_sM^mo##*5JeJD47+U_oVzg6~qX;^vw2FSlv_B@)u+y2kZQr8Dp>mdU=+h^exF08%@{imzNrvnq5lcTs7XH>LSAe$# z-NLU{^4)%0&a~ecDLoh(M(W;o?=*IFS?Jc;w{}~cK;ic?{GPCUR6!MX_wFSk3A1jb ze6&3v{ZezvGwnqV7M?o64HEwiprMfGRy`6!{4l(}3XA>?c6zD0SR^f8Vzv0={q7=r zk3kXODyhnetr=zw*1!%g0oO*hpTU`iwb9YorBdU|itHMV=K8 z=F7)q+kGu->OG0Q0<7)+dGkl_+8-Ccq2xI-X+IF6Lb>(3kKdDPpFr~s&O3Rbrz>pX za+xv-I#CR|pKmsp&y%)0M&|cT=<+K%_Y*vN4^9FY>brkOKPTp+0`dhxB+`@_x>#(Q62toqk!rWIl8iMJO z3~Eo#w|q5qpJ`^*se*E}aUoc3POiQ3IsR!ZnyPnJbu@Z${~DMOx{NR-zW(bd&)e8+~iLUr8sVO zfT@~b3xvu=v(E9g8D&mZBAj2M3%(#DJ)T7NXE$^l>VO$@R-A-yGc&9|eMi8ce%VBh zx&Yqf;@d#iyvl0&TOkW?G?AlX#YRT4BH5ACzF{7WoyK@MBos156y8%7{0&_dpCOC> zSom|zSx!}^5b3SxX9n(eaHu*A1wp=()|K+myM!hf^S&7B?>;x)iFIKk0hy9x(K~@G zifEUKIsk%;{LSgYtK-lp%f6g<{!1SBRcmx)4y;GI zLgg?HD2qe{-G=@zR#J+}lyWn{U^eUG=sa?fLM|p>?FdJDq-Zjo5yWtl%d&DMS#^&n zv~1Dq@?0iLSWf2jj^JW@k1DM!VexsJpdto;^};)*q40S<^@b@$*cK3}_X*E)d-q?q zKq8t^rM&@ZhHh-D$Ij4`B_P#RLiCio=yc&|6dtAB*_B$19Q>$IPv32Nf%u8DppDIo%Z0w!V_F))|c=%b58aq9ZbW0H}ydCXWU*!?6LoaF=y94eY8&z zbMosg#VSx|Of zR1b+akz|~_StJ{!IySZobXUrCtwNNBwM@&zab&`WGA+dReZ1SyUcMsh1DakPJZamX zmogLjFI%=4>rsKdL4}d=mF58x9E_Ll=mae9*{JT=nxwx!LwAB?C;JRJtc4<=!|PtSV5I;+4osS1!_2ZK??@CuJEwKZjBBC^78qq;aq+5SjtA6N?RLp9p&^X87 zJ8v}mESBfW`+y?ix9Z{kjVC)P(Jv)8-~VLSdYWSZC{8q5iELJW)keuYSN_I}`j{Vf}xOJikbN ze3$Jpeem2WYmu6G3rCixj>(e*e)GFU5&bj0@jZ+&jEeJ*-|yg=Y40uH zQl#(H;fuVrP@GR&{Kh%VgoVS1+3NichjCec9GApaS^g{2ufzc+-C@D5e4X*UG4>ML zBh6`%Hv&yq{2t%;?2j&cve{JqUG{fq=5p-=OTGJFU%NS*Y1EXZ!Z4LlpAsiNGx_nR zM@p9@=Wb9_>9Ta2V4_KPf*fBOv(>z^?3)%TVX z#lJVW9?dPvF*DC>HS@Ijnu#_}psK{(=n6EV_ZyFOd#GzL7eD+V(VxPu=yiMwqgDI8 z@Kgt1Q=a!Bxjgc6{=Lv1-2{Z&hdJ)n?~ol}bmbcd1EIuW?E_|NaRX*M0w#ga?uD77 zjW#{dW^VSBmI~{lSu|-g)#e0vZ>EjY{h1A;GoF%U%RZXhj&=TJY5prohI@FOI;cTU zkXj?uG;O6sBy5~Ko$)d>`y!n>=2AWnwMNc9y9JizyE{FUL{iS=iip&;Twf6RgRn+g zDXLaqohf(y5_hS_^jzgPF+IBNtR2+V*coqBN9%>6znrFlRB}b91<}PJMgl_kf$44iJnmK0^K9 z!wWIg7=Aw{*1eUL#ow#5aIvRY%JUS&!SXMEs|4m8ABep=UD8KAI{OtvzJKp<571Fh z**R|hUMf11t`Kg^`#pW1UIF7Anm#}Jy~<;C1yq^AChdz}rQgFYVqjc5I?e6h z1MKRlZ^B&@b45h-w^I9m&%E$mN6f|*B;9s@U`mchg<#G%=m&y4l>o1gHw!M%-gsw5 zp9p&`;J#}H25L)kz(w7v0L11{ak^Mub_E5Q3Kw_|fNa2P8fzxy5wH&!@87A)t8uvg5b$!m;8A%Q>BsxdgrwQj$f;R zw6vW%M13^JbF*Ge_|O~!l;!m->fvC3O6EC$H*?q2h;+7SZ&e?RB!KcN!5{!ZqYj+T zo#PYoNl{-SeJ{%fzGaQP*(Q%Kq~X)9uDJo2czNfiqH5Vnmzf-<(B z{dG4-3Dd^dbc&_Yd_o=p302$SVj1pPx$v3N)*=Xyl+0yo;7jXCdyO5hF}uUe?T z9XJMs-qmjQ2nC8jr3>_rYdyB6r{Q~x2DyOOq^79{j`BE4bB2o~%>qE2gRDz$-dd zISyXf-9^6rx_=H9)m6Rw4NZENUWOki`kwWR=OxZf`p$YIbEepytG&Wr(Qussd#XOC zWkpusm<_k*ya1fmypoKpJlMs_B=SR~roM$Yr|P=LMq1!tE+(byIvFp;gY9WX0Mdbo zXB^rKED!QHhqy=2Qp^UHp@$1Wy?H8&9`0?>$gBMrQhLE#Eq>l9x%Hk%rZZdDX>X`( z0$l}T&TL@av15)^ksO#obQ!((bb~~0X!}`2f!B44iN}O2$w>bdhKC&XyX`5%J@_K3 zDXY8tJJKnTFi{cn>E)RrSIBjefxPC&`pV-eo{Z)R#?95^@Rt|KCo&z848yp*Pt7V? z`d-(|jn1Y$8hA8WWRf5N2U59vb!dpdQQrEDO52%d74K8L7$X=p({jw7a^A3kA|_qp z#qS}D`Vix_xQw}67HWaP>xA=jCH3&ee!WmNl0o4Dj*s0NSc@p%Rcou<3v6T%vZ^MP zU(oTW`eY|CC12fi0zssyw zuE?TOO-Ci9E|x~^KE&B8a`Oga3)Y*X(vl7N!q$t+hnWdq=B?D8cPeGo%&0)6OYG6F z-e@;pBG|l{J7lHxSkFDvNp%8MG5`@v?DBCNFGk27R}<$O~vnZx)bOMRq9oN*qmZO zR0b`v-z5dfMYwkT){gk&XVefGSyu#s_`MB2R%Mqfd_pWs(Y z=luzYLUlpRW0Badm^UfDg^L3`a|*|VT6O~2JC-D`U_ZnLe#(@b8|!BS ztt}jocO05K!CZTNK;?!kN=tcy-C!%;yi!`S93ZyQ;@yF~qcLM^0wo;Jp7Co{<@(Uk z0=YR7Hk? z>W%FW-9>h4A#gC>QT?->)k=>u`z;g@)Ku`5A|&QMhQXeQTlA)0;JA3$bNQkU&~@7+ zqM}`=gJI1{WXSWCS}YdnE!2-p3(~2DR_AOQ)GC-nV4u;Mri%(;L$F-+q&o zpT5cVaUFCWOW*u0-6gR=@BEDKsi0uNR&`A2bP`77RyV1u=H5!abIQWQYg%Yo3fid< zknLKowJVK89Fu-^rG#e_i%7SSD_8r&hEu{$ZWXqWge9z)tFH0-Tig?LNrKlM=_enu zvpYZMm7!bZnP?i1d@Gb8V4mgv;SZ27=YM;f3o-u&j(({Z`-h8xmC*S5Ko=D8TCXLP zl9`&hT!(uL@y35`d8tD6_DFZ^y9PO>2Nc4V@xnOEtMA#$hgZ$HnS(=dB7v7J<2rn# zgr}M$)H0^HnB9_Z3yGUA7Gcz!GB0%=Lk4~8P~l1TG9hGi$p zaObj2J3hH%6K&q0H>-8No1O*qVPX7I$1~&AT|Qr#4sy!w4D4U@$h$metELvxUwYu% zlxW#=_E21}qY-s`>6+7q^`a{Ss50EUE9uic_TpK$NeGGS3qmjuod9{*khmAP1RPAe ziZXUBH0BdU8hnOCkqtZbnyC;n5m$vC8*HG_DUqcYLN9crC1B?#3Ez(94|Ncd-Nmk6 zR`AHt6vE- zG&*koU0UP$&&HcFEVEn=DlHauZz)vC zL36w9Sk!?=J5l7zGZv$1X&yp*G%oBDVh6Gczxr*r6L zVV;|;+{iPeqV_-B=;Egt4&l{j6Bn;K$8@pxGCrfWb2o;zY%e`SNCip!0ov@3Z*2o8 zu7U69>o+WEzjotAFJfMjE{`E%nV%!1C!9X&?t^ANt&H=Egm+We6PKqin#gT@6Srsa z@)n49g|i_Vme1N>kzpPgDkYuR&O%cM2Ww62PKENbO|UD;S4;L)F(rQV0&v=6;e|Y{ zDf39=CocC|v%;elh%|4JLf2steppg2;jH{Sn=Yw*Rb}Lc+B~00?ku0L( zGx~A$T_Pb!`;kPIXRfOVoSNG=QH}`oFX2R|q(}Q(yv6n2!Q^#L2V@!}tem?!vP<#f zwjY#}bM0MI->uEX4){+Ve%#+XNL@l?<)~$B3??uE7?bRgj2!$OKEqCb@o*>DsQnrSTU+NSeWnQ5{ z6ZE&j3{YZ8I4nP_>}06UisNyLElP2HYi3LN#240VKp)5J`idOgrmIUy*pkvI@Vj=} zrMaQ`N-z>#OMR=cK@v_TJbl-v^da_ncqKb_y(ql$lA4KGICt7eB9-6wn07v z;wW4)wfGo_zOt-eXKuW&;rlJjSn-4?i?Bs=A^<-dOs`^eZZS_rkhG?RPoYwbRi~-@ z#?bjLxjUPmCpwqQvxgRpK>g_w$&S}%?y2chAz}g{t<_E|4FSD`id$@7d{vsh(CS^{ENm4Poc9{mRR;hvkZ)g|)Q> z>(Od(7!-|ciwJTL@uY;UH7SK^!5BK=Eny$k)&^#Xc{sIBn$s7{dP8-hQ|Z^upSmxN zdfV;s>G+tEZhA+mXa$OGHmvldj?l)cUPgrmc{OT+*{xKZ!;#)+aVLr}JHzDp_xqu) zBS~Ry_4ofj5F+x0KuX>cpky{4IS-dH7` zU}-lSL3MC*If~l%pj5bUYk%x>if}!s@xi;v41dljLo1ZX0&i=>trcL7RS66x9h4&< zKE6BT>&5p4?UNs2I#$PCV_K3>Cl|riZT-z6S%Lzl{$b$#>A7$VCIL|rUXLt<9Fcnx zmr1zG)<6fFht|A(;6Q_d{{cV7RXRnAIqhYnIWfjU*xk2PmU^RQK5awuih2oS*shahC~+M3C<%C-s;h5+I)v z*nGZcY>)(vyP(82IubdE&;fT&0ypFLTCF}Pcz?9Bz_b=OS>UmwKX_~Jv5hunt7ZNz znd56NY+a~1+65KeBuk!$Q~esc_r|~_$wB+4ex*SI*Jg#zX3`$PIlM;umUnfAj)rnY zD<(60!DL@!Pmr@^8ueH>=TDYDez+R|yns~?Uqm-r{J2tAQ<15l^O1qP%8R-nOv( z;kStG(%m3_B`9#S1ye~ChbX^PFoBN8YpB-6uJBvZq)%J2ow2=aMWFjl6{3DgM`izm z2apN3?v(j>(3D)Ekx}KlRbm;MOozY5n_92&LBy~|ls$@mMCROJb838O?xvm)A>*wF zLoQ*JmK)>V)dlw*+uMat@HcPtJD{ZImiHF*Z?><)V6)B)5ZFRkW<11Cxte)$c z<8v0{%+Q`mX5j*STLSq`oy13Rt3#P@AsUNMpXT2Zb>9B;!flS%>$z*E>VqfI1!}8q zxNzhL$r2NNPFo34P`R5v=jRe%c-SCBcO^|DyWc^Ak_u*A9u#1IpU5X|AW-h=QO>LC z&frrWW;ePHZTce&-1Uvn^k`aqNdDtNRD=L7gSjw&3)k@m!pGBXhxv><##9DodH?(9j65N_R+M;T@-N%a8 zNz9DJZLt8n3`d!3t~WAFWc;IQ=7}gLeZF_K^o^j0KJaVT;^_wT^hb0yTwwR=Xn)(iz4j)l5xVyaW8I^mH^Y&vN^>B}F+CNgB#itl) zjR^U4&5X?Act`H`ab6l`sCm#KVuR+iw??*Qq|OpQaw+dG~}JKPs)~y&}tA?ww61^I9NP|j^;E>EJgFjnl9to z#BeO(B#4is`}ccEc0`&RGL_92n(VDl4o_4R2~HH-pO#v-NCm014nNa$v_w*C-cZP83?tFx3LIW13zr^inb34FOb0(&mHfdJ? z1VjfNspOje!tb{IN6iJRG^%2DvC0iG=`zdK<R}SSiG4X5b!c}L5WPa3dFp1G| zmJ6`Wb1odB1f?t=%l#)B7zGMxrf=Ke;8*OGZ?f7^cjfy2p#r%08x)o;> z;+RP)Ai%iES1tYCpPP`>G;7NDvi@+sZFHs-*_||6(JYTfegK3|I@64C@>FiBmG}$A zFlx+dj)z*M<})Y4vW!VZnp@m`KJ7)s`nsO$2F)Q`P<8Z^Zb!aNo|ektp4j5Rpy<1~ z^A6Joyf5Kn&vH|?BgS@Pa;LSTI#5%)mH({AWFPgtZ6-sHc(?)mmF~5$l^(v!uq1=+ z-JqVR&vtEsG|!etyf9T*<;5|rR#V?X)K10mOg@lc!Z4HFw_jX~j;eEKjrP{k;3=F1 zfvtJ_G#aZ1TLhK!m02q6FD#J^>vw{Djppe@O$4d$T>=SQH9K3p4MSbr!+3J9C`2{I z2v3gLh@~boHJ$IZy~&I7Q3IcB|JTHfAKFV}CGTI4Of|;lrJl!fOPgs)Ii4!+kR%~$ zl20>4H90d5Gb_$G+ubWVY^b?v1>u?S&3f`h6&*FJsaALmMUo zIX{;5CJDvav!JH*d`Pu_tasL4NI1_(8wUA>iM zGAAkJ{h}20F|k+r>DvlEQ=hHYhuxKTpYlers?0*NyH8et9BWyGR86FS)eO_Mr5iU5 z5kb5398M=jo#~*^X4Kx+SM*<@V?=->jYClrs-YH>7eIBpL4OV^7;59trlKtZVZOKR9P8&FYMCg zC-@cJ$j55C{x!ENd()K{pKp7d<90<~*Yr6Z9`AX--bX}VfXQ4JiFgy>LU$tQgTVbn z!eO7zZPl5V^ltCQ^^XJ$%7e+T+*tRgE}O4PTOH&xc2P-^waD3r0U;lO35r`=ab_vu zdRBsRu-iFu=V+Wlq}&Cj^|$RGFGt7DUdvE;=Sr<*&}*&M#r@Q|X7A-<)r?nfnot`v z+Iy{a`ZAlljJ=M%hLc)*0i`Nz?+$amUh|f55>sq82{L=+tx_c=Xf+b{(l|l5eem#J zWcmL zbN*?1*<6+?!((jGxX)w@jk3P|15U?}&y;(^_?qs|z@Sq&YV{9uiVdI$_9($+>d>S5 zlB3&GZw)d0?WIV!5izj2y#}JfH#Fq;;a(NtR)^!=Q7^(lQ-PA*pabOpY45G#;%e4)-{1rZE&&<{65QQA z1Si278Yg&wMjLkt5(tDKA-Dv0cPGJ}ppCm*1C8wd=A3KoZ|}9vJm>zbz8V+(t1(8| zsH*pQ{x9DJ;YXU;(SmPA6Xsq5$>OuMHp~xJBS3SA`kJD6+%+1-@PKorPt({)M$`1Q z#AjDc*4#&FeW|?V8=N^5&vTGDfjV%c$_yQ8{ZGccYz#CZ z$BdmyU;S3oGP$+Ty=;+MJnK!Qa^e168L8CfIQ6Ui^Na-Q=Z9(utYas*{FNl%{Z3zHfxb?zQTugH9g5fV1o|(*N-`o4!vg>|- z4B~%v;?q%2ON>OsoWD9CW^kR5)YKOkF>ER;TuQnI;{Q_`A$Ht6qHex38pp1H)vn@i z?w_k>iN4;GKm$vJJa>G@?NjQU8E+t zWW?zsUr6amnn()@6R5U0*Py!0hId6FB=;J?OzQm2d}o- zPF2U1gLdpn&Pz(UE1t%6gI3|O-c-u^HO7>@p1~omU35(j$>xna7h_Tu4d1f3If`*# z-CaBV^h1%NJWG7^^z|9GPK4pr=w|pl+Ljo>Css759Fpg2k_@5`q85uiedY4}KDDj_ zI`mr{TKD%8lh9mae~bZjFNHC#yYAU@)f^rr8CA$SE#EyycZVF`kGJc_XjSi~lG-cvTITda#3rt50=fCowdKrP1+FH9k#$;T|EKZ$mhJ_Ug9u*O&)Oa5OzQNA zlD!HXyh6nh)!z-|DDp4)BtGD>x3*pR4P5kmr-p*39thj}Jd-yeasj5WQNLoXh5{M5 z>2}-5gJ%bkRr=oXff;&KE!(Ns^*A5%gP|nHBpOQKYr~JB+BHB>R65k)e*?aj# zYK07L*KD~KB#&$EQ-gBZcUQF;5~nR5d(Fl$MN3kq6%L$n(<b(PRBGE877cynn`c zIW>@Z*p^26WVqeQ9WCTfoqJ`OEpgeLfkEh6jT;7yKLfGj!M?(>NRQ{6GO^)KauP;0 zDiK}vB)p;rr!WVPm8Ed%r#Vm}QW{<)>C~d zxpLd6dDk|IMM~SnpzB}t=-+j2mEmKd6`X^;at!zP?f}&^p|cB{z8RumgG^f!8!4V7ioiURMWyKQ

    r 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 literal 0 HcmV?d00001 diff --git a/static/img/210823-sentry-apm-lambda/performance-results.jpg b/static/img/210823-sentry-apm-lambda/performance-results.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e9d3f96d2d166bc51357137d04c3d616d1d9e9a GIT binary patch literal 146212 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≀C&$lAG1`ks#=Gz)4#WG_=7poPo+gV1Y1`0RI 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

    1x1oD8Gx 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�y2%chMcN&%Eut!6Ve7$v&n+ZY&Znzt#uOdUh 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

    f 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%0A{h3KunaUN)5pQ}!?yf@ zzP;0%Zg`!^@?%0D3FD2eMZu3OVsEMtf?-*S8*CSA!4RZiOj;N8JI}AKpD8K|WC)DL zk%rx^Wt0$(;~uc7c#^pnn`!eGCmf|v<>NY)d(=GjZiUnA4!$FMq}^P82f3oWc;Gms zJZa2YBssj=CbYvB_glgdHkp6ZJNMn?+DohIoUeh|js`ExmGklhg1k^N9oxXxd@8P?&}LlWog2fISWWfN3>Z3v&d zkskVBi1_VC^V`K)eky6h#b#W%rQp2_u~9m1(Cr3<8OZD9?c>MeaoQZ>B&h8RkK~l{ z(6f8W=HrrL2u8)()NK{s_M7%tBO$o}Lqu9=N8SYAdv1WYIJOID9T8^d&#kAwQlhFr zM862j6$t^*@vg~hz6SB~RGS*Phsk{0Lw*nE--YsiqOCt)*-VEi+-W0{Y$Pw!%>H8q zAeDIHCYt)3mNlT;2oVOT?d-jg(E3#+UWD{6HL<+Eu3BwCDWq*T7gYap+Fa$)Hn?!T zUpD%K)-$J~@9b%`Bij05$-yNx%QcJ+>1&)OQoj29-O^?*m-MR9?9r`%qIdIt9uWmR zLnxLDyYcw3{q>yLaEI%?J-u83HZ(qX{6$r&rD;ejjt6CIz2sFx0I|kw_k?b0wKUHL z+B6YT_l1#caEYF}bG?mu3PUM~gw`NFZTTJ6*S`j=3f<2jvOGcpw8B558tc}0l$lWL zb#_0W=~6dSxGOE_Y_NaArEgYz^4Y~<5Ln5mh^7oFI337Q-+qW=+&QkJA313&6ZOyCNL-gd;TUl z)lb1(J0DbNEAmN<(!b7}#$Kb>?+! zAfrGps<4klVM!jV4~@^REmwSp;$s~7F|ZZ++R>moG{?aY4_3fl%$ty~`LMhK7`6@8 z+ER}YA?^H1PGKPUW)RDE_XUdNm|!7Y$-fdFn)gVoR_CCa%i<%*zJwfbjwmvWTCVf2azv16yzss3m=mi{;~ps!^^JT@DvYG9IBvcu+GB= z3(D_@=lNk5Iec~%h&i`2NvO)f6(z~P|lwH4!li7wVv zX4OSjwAl7ok?r7h1)QaT@A}M-=Tj+SuHQ1Vvrtd)#qSW4n7f4AWG@3C(^52Z{Z){U z(<52<3A6H)`|Ql0xl{hM8QQhRla6o{6lmN{qL8StDMbR4Rt*3>sIX39LnG;`2+gN$ z7vN}h589k$gyz20ETb{?!;yd4g$&9+OA}JzFu+!~`o6MOYVa!$^6XMa z?^Erxe8Gh5j2Yzzp1@l6W>Se?md5~hih~$Q9B8sNlKYoDtoWd@(6T;(rv`_;vaAwd zm<;rXEK3I7*I4E=z>*wsl!Ex;Qh-j1ajM-X3ef-L03h$)a}4nv`h8V8#Tz6W9;IeS z04rfA`z$?w2A;J=f9-oqgwhik!@YG`k7alg!9uVRmLH<39{fJNN5O!D3Fv;q_Rs(M z!FFsgOIkWiG)1UKyU7Y^)y2kR)@U%==Euc)z`Sc%qNBB#@@J)BRU!s7*$EAku|Wgb zEXGP7OtId8`RgGRxXz$rtjb}!l1gzrxOvrNeELqdLeE33$Qhv04Wb0B~%(aEufpXDElbB``1LwnvX7dDF; zq3iMMpPHh_1WNmUn(aW|MG<~!#uQtL9IV#uRG5w$hXKWbcXN?-Ny62A{oLk%z8kS8 zvuFoN)@d=oCE?Fh?OQq|Y-U08?u!)MUSvgn&w{c@j5ctM%hWTg7xguy0K12;pw;;n zmYtz77^;XO?x}FZa2efS(06CcuQE|~WGr1OKb1@WlUDjy$u0C6|3~=$=W*N4zZ)az z*BnFoN}H34hGD?%{RjdoikQ1ILL*=^2ts$Ou4;_b^@3BJ?L(}Hzpj;qe0$fwA{(WS z@2p4vq}kkr-6YJ1>MsfzUe1oXu2v8hIS~y!=>OA_(xmZGsR)M-ZkpevDbFQ410s$^5NFfc<>Tfpz*HzPh|(`te+x12Z3F6y^n01@Xjus{09 zslvr7si_(-d0a0_u1ZiZ$<+7%7XM%6W&c_Yh!6s?10s*V?VjCQ>|zT_;k5UR#7I5q zEB|(rQR8Rzv9Zq+gMOCh@$+@dx~KE`%qPT+i}we(dDc131KtS;d3l5wL}k>&>c2I8 zC3F>5G>x0NQ0iHm5J=jJKObgL%SnezO8+1akC65FlL)_{+Yy_YzCB)Rkb*7SlvD)g*3^yax>=zO(7Ase>g>SUKLAdHVIMS=XFrWcNk^wEXlLd($cdd3EaN@Ya8f~i%B^AftZ10BsJQXM$$~6 zwQTn_Yg{A1yQlYM&h!fXku548I0C;*D&`Iag zGd_j8vm|-y07;@^GZ`nBclY7Dar~6@W&MJ=rFp-I6UP*=d&=oBIPhVnO07)Q1?R;9 z^pmM4bS5A!Uh%8$YL6FaMCQmtpY8yd_*kbk{Er9s-%m350R4)5PQIQ!CN!bK(dnK- zfHJWx4d&$6$2e`QI|Y?7reRhwd3|hecV#iirkKkoD+%?_zkdfPD)amOt%CTZ_q&T-cUV$1djkK z`jLyB0quHfODpiRY~M&&>2AMJmh}F>pj5f}h~80R^Nd4WJq@sU7h!HH0nU}vYWc4~Bf zb>+YUZ*UXia6`Phbyk z%CgdT_E3eMFeT~s$lwS+CU@||>_|5bU*!6~m-9dWY9I5<;#-TALQ9P0Q}~}?j71)NG1_tRt0mEHwrvO>z|zX(|5i(H zAqe=vt8WyKMHT_wIm9r1zg`l!V=1QoZAkvtcR|1i!xX4;DXe|Tm3rF;#~!~loV-x_ zw^gb3+)kDe=}5f56iNmFg|bQMsTGy44{-j%-0y>79)PxF;#vOymH)?9|BpTghha>^ z-%MokBbmqWV;N_)=GIrGW4DnqSyTtY_j-R&hGK`Jn4B<`z9|cbnjFER^`=3KIWsxp zmkt3U^MAqI7IZe`W??Nae5?QUwf}zHexrg7=Px8 z7G^@lY!uI(^W)=Vvx2IYUW`k5Xh^{7-b-xcjTA@x}lBS>5DU zZ5Zgm3y?wD0rzt2lHxDvG;xddU8M`{0)hfF!}c=3=p7p0-u1GwioxFmU4P<`d7zX) z^9x*m%G%)otKarABb3CwO(Io|Q6fGCr!*BaD5V0bBH6QY%DedA>qX>)zF%C#69_}^ z$2K_vKHR!!H@oP6J3u_duoAT6Lt{iPiNTDOWxu*&SbKldqeu;=6)y*x1{M{4bLWg^ zJM5oo>p6|p@lxKM;O-`pu?*umuYi$_2Mi@|q&_`SGClczoNV)k#T*VKa-9?jlng8Z z2l{KK8b$heNM4~`NkUQ2SEOrFc zh9{ZJ+a!jo$@$4>sTo9+q}odieIxygO8XnSu!N0xRh29v6bEZ*O%!00{_L$k32$49O{#a`xml2&P>*__-H}{JtuP;v*;QxfO zQ8CzFnzouu+)OMdq*bR{wYi=5M7YWKD=1~fkaqAJA0~c$^w{L1Zi z@`WSTQ>hl7gnu2ge88Qj*E-S zqsQH+cBhLE%UKCw%CbXAiAg4V_sojNbpaTiIj$S~O4Pgi8-&D!fxSM3iR$Ha;uBcL zwf#SoUS}%N}rgYjVP^-MXQ zbB{F3PfNv4V>n~B`2cS%iFNPxZJTxK7iR>d%jtp3<;{qEdKDkb?+I(ha}Qcd#uWb} z*Tkrz8N~0-5`ww_*wxjv29!9>A3N*mPGK^H<0gw5@t^Z$h37uQETcikrlV`|ojcdN zzDdn~SsMF0Hmkc~FeX3x}=6TY+Z9G%krMr+$q|!Op zy7x?fsaT$Q5_}>95Hee#zFN=BU=l^CI4$>_9;503mi2&z^tD3^PhQiVaocVM&t29+ zt;B-DmbzzJOJDBU{&C3hVWY9%D|q_{!iSiw2c?uSy@J7s*!n}R=NN>T;bkWbciDuV zH>D+IWnx`IKFV5Z@Jbw$_frMuJY_zOt_T5Mgv_*=;{#SgnwQnDiY`n3#iRiWr;Vo1 zK#;P&a`beG$d@l)N-6@4@#bhTN!l7Urn0<>OkY}UR@2K>?hmaPPiIQK_{4^{PhI5k zn2g#LC-xktB@A7KFxLi40!aHw4S=M_j~*9%Gz8}C+xtFe*(Q6|=#Onw_UicdfAM#} zTou=h9kucZWWqJ!#x54A4mE+J$9D~ZmQ~Ow=KJ@ak);lo?rSGrB==e+z?q7GO&+WD z0;Y2}>anEzX@Ci<+)E3i+|ZmudJc^%=tTBq4K(fh79p8hgMW5cH#f8D!|5||XTe;x zvGp~}w{gh9t$OX&ey?q8uM5hDAI~4T{`AUy&|H)RF1MsA@{hRxv)%pHYNvPG$Rr7l zPE4o>wA`O0v0Wnp5N^yIPEO_J({Qz-Ui3PX@ldX^pYfr zHFVr~{t%dw;zWH*51ojo#;>2uAUMa|4jfC#N$TB8TT&$BLR=eD)?T+k|Cq!=~C29UC`4c!Krnm0v zrEUGNXflbrI$AV<+qX^#3rR*8cGqkEj_7(etjy}{p)-~fnHwH1I}Wjh`GgdK!-c68 zvesj@F-2N_(4k1BBDql-%!)1o!^oZ!tB z=W-_?rL1_rI7_iQ=Rj9YEq@e402a?{ldp4QDqAxoBFCEewW69YOELfTVALcosR2Gg z=qcW4v)n~}JfjWWuKl{|*`!L)U=Es%Sq05MKp7|P4q&`N6HJ+3Z#V*H4=0ME*3@e* z<}PN}Ue`COp8$fLXdrEYiXdX z4L4A&=YnoxiU!Zxq+-gX6!?~K-(tGNGUev%q1D@M$$;O@^toQ=G0{igqHOP{>~l_Y zhZpF2qY1=rz4#F8Ihj?5uGeT|YERhUB=}n!);THlpUFVriKc4qSya zG&Hzh4=nLcF{|zH`59z$I{iBy1<`}$>EMb@yYGd!+g(803eKq})2!5qqBHb^QR;ZY z6v}w|O6$Y<5y?+So;IB>xmwrXe9Hrewd0NUKHiefw~~)Vrk^x}*fX|?E(f0aY#`60 zi`+?%RCN|h{qHv&R>uxzc*Y->lahwtFce9BnLO`L^JaVcbTedrsAwfM`R^rl^QMMK zO><=yprN3szzbD8xp02E$Jt96uvXSoFQr6sVr60fm%%kvDzdYBOfCR9F#qJ-F{VK+l^GqGX3ULyQgPp*Xf+KuVZ(j`+QuStVO`d7d1KN zBG3|iO6<&A8FcCnb&XEVTUKA!XY%%1k>;FbiG5g&*jd|;^v~AK0QNK$)|$_HeU9*&~%Z4z-3C=Enie;l};OOaW+@UN2ejh zjQ+U;OFkFfu;N!|V#K=QIG*R%__U;eu_1#{6At`=u=xlkrt_!cdR@w&L(vA!w|_xd z$n+y}DTQOUX@+K%yGmK$4-DlMZn2X}VlJLC#RMD;>g;ij9Ca034UV8Et5%O902i<8c3ig=3ni(S)sG z7lK`Lv=sBwra+_*M`v|XyX{E92`XKP^rgvhmgRu-p-#b$g1JfG>Q~y>7~)s!oOZ^$bVl19 zO>}v7U4}<6_+jWW-I0M{$FV8@asdSK%MLdoHAqsDM(WM6*!=9K3QF4dl-eyBKXl-k>B;fc z+TezFT3TBE;n;6)>y6SiqfvCa(+Lg6rQDi79tI4M3pQ*fy*{;B{C_!E_^_zq@3uak zIICql>Kdv<1GhX-w!mz7(5X%(B^BG=^W9H1>14%7>^oyh>|XRh>B*R&!hx&e)-umD z;(}l4WqdX|ZA5m0PrMM&{12wAHaLTqBGc_@2tyJb5TIfX*j~??<-!28(QKb0g04qR z_iB9yT))hJ}iOos@}Hd!G32Kf*LiZHJcr8T~B@mq9Gk z?mTHH4M-`8rb?D9-E>DnOu|{vemiwV=J$%t8{T-g;L(CK7s18*@#kwe3BJG?kCc!| z%I2|bhopc+rt8dE629-I%+W#@qovvmcGQU?bMnFDr)e{;`LD4MXb(cPl#O?y6NP3? z6T%p7#lSC$R}E75=|M2D&exROPgX58&hEUd@cVnn?A-r2%AVuvt}ia`H^=bTcZqgv z7o!o_bEb1emCdg?+_Ah5RC)Q8rXxW*ED@2vy5GUxD7BrG5q=eV{Qz!AF|i${9o@=_ zz{r?03*Y#pv;257W+E*e8=l*@pBov^;NsGN@afaHcQM*aiqzU-VgX6m(jGdz1Lq&` zi_>sPl&UD{DT5sY0xH2tWWXjq7OUT--{=$vtJz3TwX4yebdOH+!C#s0GL>X4wY83r z&7iO;wIJzbcGi)4Aai&?m1@jd+3JI#`bTs;Z0wRnlaEiy3<1P=tcpO2hk?Y!m8qzo z?h?)E*5}6e%{uD^iqGy`ll%{a-e8EjzW2xzbflHC6*4f}jgPb$s6n$s+bAWWS{08O zdA{1DVOFW#iQBYs^UG>&B%#>ketlxNh&qXFlYw65?t-6eXI~BOPv~qkM%)fVR3ft? z8={!eY0pIUHhG4(PNt{lO+jTS8<3a*K#nAK%u3lnXJjBQ#zb7Wr9SH`3wz33>>h@d z-zO5^tG6jRJ7~PKBM&_2mme*UugAd&4U2NEw`;AFKX$t~nrXIzlS`>0sr~VUZAK(H ziu*HQ*%L!IJR-bQcQ=a77xAYvEXypn?Zxk(h73%8>Vy!c6oeq4D^DK3Kkut}wrmY#I}*SO8* za--|1L1@j$GA&)9sgQSe-Rm;w1NO>a9PIgrH*oe#b_yP>THma9wByjqgWDzVrC`?! za!ZVI@mH9;51i|0kq@Tk>qD51H6qX2pC1N2AoNTEln+IoF5DDp4uV4W*CyF`bwiKs zkYN8Wwr4+D4_6rr*X3A+C8IL>RmYMQjxW6Iu#Vwx-%c^a=~IU|vZDe6U*{`ySSRrm z>^h>@je=TTk&_(4+H-uLaRi^{(RF$J=nZD`IrAPD;JMd68E!UwW@3_7)NQhr8C#U! zec7gW;!tsl+Z3T3M9iKk16M5UzbMb})L1oKkW^LPdh0NOB8ay9U?UMDH!?HzNxcl? zgE>-#gZ=IhS#2w8{eeW+sr7)pe0UBHGPGFbP~XuBSz+Uj8iCfUZG#fA|`%1OA9&D8oWv{bf^r^-;qF6Pr{b zxO>R)#wv~-Ru^vYKZJ$gDjE4&4xIJCNUTINds)yIUv4CQHqufV+5x{`?Jy-f_z9eQ z*3cVpl5?f)V!EdGe@(vQFHKfb*c?(>Z*;FJ{j`93l_Xq}#bQ(wZRM#BL@fA)sV#u( z6AFCBxY`Xue4l_cy1OoK8=3;q;+)pzM3nFq^pQ1eq=;^_8u_N%#S(PDhZg?qjsVkr=2sSL}44SS_;T8oHjI=a7gG}#6p z)=KgG_FPUjy}d@3dm-35S|@D0&We4pkTPVhcd~xZrzxYq-#i{8MEuRj@3mu(82+;T zF04d;M|-f`Cx$Ecn+qrkjjdKI!{qn#+!d?TNH2yZzEbSX&3$Ji-X4?~F-A|@#fGzN zCrFP}(ESZ``&7I&y%9hL?0i(Kw&k7~#Yvv8u!LUS(DF`f@eeW^q^MqKfOYQtN}a;W+nUJtliL=dzQ8F+x0mh{IO9D+sT# zXJ2hC%Fts6%U9H~P@{ZN+enl?vq<4Jt7^ydL%{o^^zw_MiHt_x6Zjoa&r421&KAwS zQ5!$j4_3Yc&G825pD#b3ZZ!6Hj=x=YzF}6bwTC&Z97&@hqU3J8;D*Z*QW|;P`GiNe z7}|d%r4r6jAmP`eCPYZVRd|2UDNgt?a3(UbJu(RV4}uaqRO_Ao=t6rhg?W*(z-MR0K5`u_c6Dk)O<2%@%#O zYK%cLuQ1pCH%E2H+y%BQm%Pi0Y#1G{heNkJ)2v4aDVv8cJ5oYISuJD<1qvmd{@zv_ zl&Pd1+X@uW0;8tvu_VUD*}@I@>xSDR>1to^Ddq*)dadq0OW}A zcFnG?aC4<=su2FtC%O}CLfw_>1p@IX?D~Nne$V5ePbaQ^C6kW8V@`qiL37h_-)vSY zSmeHKh)hscW4|Xz6?$5JL)-~+%{6o%IA{VnZ3O3RY<}^aj}c?Zy-8wRngwtRi{*cV zbWi!BQ7jv|?4aA!7}Gl1e96x3e;qNOmO6b3 zNnCA7~>Sbet&oI<*`h@xC~Y=cvsf-&in9dZllk{aP%Y(fSy{K}-k ztfHGrv914k#|Mf1Jy40Z<5nd1a{4*eFX5sEg!r49Dw{s`@nQXmnpv+=>||^kjgVF7 zjaHa03%{@P_Jr~B3Y0=C*mK0b}56FFU8cCi!@?BUg!ezg1a z2{qQL-P=kf;9HzJD}#g(ey`|zp-zhV13u+Vh#EOrNgtJ1>JO)+7}`Cl@uCByCAAyK zml-y>NV)uBxZInJcl2)F0$~+ovb73%&4M&ru<9G1-xvG;GEP&ZIz2Y;(X!5W{or_> zfkvldBF0c@_%{ra+NzIBMqUvMT*?7Xw{K}8>~I~l@qPg|(ab8t$z?{pc+y6_xze6T z@rz_=UKYfWDPac0$C|9P(1`L>8?0dlO7s=ny(H4eAD-j7`n?o&+=#VUzX+|iI;5Z* z38UnQmf*4eK!^ZV72zOp@l4XhbEo#ZvoPV<8;%=oioW|TLIirkmQ@=0p?dkw2QrA3 zXCCu@EcNllqaQiB{X3BihZp+Xdc#|VSXwA8Lk?l_)hX?i$rt1hZ`%Mx4=cY6jx8vcKbsEg_PqtiHPAMIg`HY6%Q1_Ssm@EuK0j9IUt zFgS|R-62C7>t~0QIB92y(Ca?qNW{QtU(BYQUSs6$#|2SBdlxNDk~XyzNKKSYk;VFyUm1+E+_lz(|H*;=jhXsS2HnlFwA-Huwv-2C=q?Xq}Mxx9a1-^pPe2tgxKpz6%*r|!n4 z-8`(Bh%@p0JwgzR?Z|xp%^rF7Y%e$e*gwS1#DqEC(BqgwQ#@-wwfJb|N_Wsx%NF*;v#$4BgD^W&pM6#i9$iVJ}sHk|BLSlo!C2@_4)uq&mH0T>^R@p)dp+HtX3}b zyG;pNN88*b!?$>Eu+`|2fpl?$)xv85gh{tqeKddTuo#BAFZ?cHrDznR+}3cu>uPt; zTTtPs+n>5o=8i*-z)*?&cD2DyAp(!pl%K8ic6Cj>;$=KuS_WSA@yS{aP0*Dy0UOC; zxBYEeL+fD=Qk~2<#GZR~TNhK~d07o^ufmA`-ankn)MJK`P7c@ga_l5)!eIqz_o$#< zH>i4TT(d2(91Fg2Y6-~ped1~jL`+d9}1aYRfxZ`{L4K#Ok<(f!q z)f{BB*%j@u-)=~`accOD%k&s}(Fx?D_&rT8oea5Iv+%WT0xf3^2d)!7UruwUB9Jlr z41#|4CQPjlo%_fVaTQOKF$$UfbZ5dNG8?n;+&%W%_ZZ@QJh*yO1tp`T*(>Db z_q3P1al*VpnWE;gcb>PEV2~pG$%!O`fBDG}0Z%_0d zt}~l6zbSgkP-CSm15!l)p1!_8$P%1<Mf}}SlSW}CydUHLVARm1Og$K3vN$o zM>1r7Um^jQ17QY}a4327w6vq6c3oO@{dL5=NVXp;_2Xhuj5P{ENFl$% zW~);(4HTf`lAXs#qJy(g-BYEz;p377zJ=?=FH;`89v{V-G;%-imp8cnyxT-Oo)r>w zXHm*SC0UymkI~!vKI?5wT%m6q^+C;L<%xsE7B3;Z_Ws$);(Rsg%X7$s#cA?+eGD)n zB{g!u=OZl^trA89>--%~LUIId#lbaq%+Lbt>R#iyh^+4-s3!Njo z*$pW1swA9m)Wd2$fG}z!O=y+bPXfIoC7f6YvL-Rm94{`+tKuH2w~CnxJNVI*b58kH zPNNlQ_=Q$eZ+_aH%yd9~7ck;`0VuTy8w~AT%@EGowAQ!P`-@dppi$>r0$?!lV>H*# z*T2*E*Qfah-b?rHYw)Z-rlx3&j+60##)s^;)j?Ggu4L`Hj;F_zMrNX2>L`s#8>7yL zd;sKf>_C9|>CbrrcV|QG=gLe|5NO!4kp`qW#w%Co@QhDHRO(z1^JMZj>U?g*L(w(+ z{1xxp^8ML59q{a4=N{Z^@p9BK!<8JF-~=gSez_}eS{3p+<>xizF)uuiaPvzvwYeXn zTXB!G8k^#`@rpV9@q02Z*c(cPodUuji>Zqu65JS^^>Lisr#9Nd^F|5T&pcmU!F(v> z89ni*R3<>!UQtv~XkcgWPY-XO{~NO~T0-QKT3hFN=gHKze>oQuB6lZ0xJKH3Nw5Z* z>e#VBb;w#ZFf(nC4D-6p#j|;PIPof+y=>iMUy~y9J;pYV5~uxH0Evv0ms zKXR-60x+yl{`MNC=ckDM%e3*s^tasZG|T(7ZwX&$1!3*vS(yrdw4H>n0e&hvbfQTx z+kk+qiGP>RRhto1agJQ>!;rJ^#XBP24W zs?w7W7c#L9AFPjnf=5`D7xu^Ev7!7!TZddmF&jNMdDb$x5_FSLbqU-*Ddd z22p~}%5G9#{V7H2n4OU@1SD;gN$~xuv7CC_;9}#{kXfx~euuMU-TSw&ya2VnZ{L4! zxnM6F(_>AUTg-EHKKV~;nbF_wfxOn@Z0W{ zK;C7!W~I}9nt(@HB|}5g&cmm>zn}h|hYcAvzHTvIau^N)1X)`q?-w(~NuJWY5BS6Y zTYlV{yMs|#{lE#E!xr)VT(CIT_5c^~F-_Q}k2BD#-gCi|zV7E8oKUq@pWPosQ@?DB z)9Ggh-q$;=$g~nw7vKA1twu!vb0i*1eKvp=O~GMpUq-D(z9LFvoCbC3SIZj{&Zwm? z2Wi}JS)8{bI8&! zpqyL*;SN)4!ZoSqpzCNhr$J&~^NdhO2-v9_dW_#JtE3eH&D`dzLove7vy0VJOj7|$CY^S%-GulGFM*>X_yh0h331}7pq4JxZcEVQ8re$l`deoI zw$6~x0UDk68V4DQnP(O=LqQwhn)1{DnSdR&Ou0>UZ+m3OsJ7#_S1&q!;wweo znYX3j+z%(x2dK49XX=5&M zph$gJzvevTS?H1^_ZqLc?9Z;-s0flinHR(z=pTAm@ zjGeF;_WvODqqonUICaIu3ZYbi!C6lH0AH%Zn0)y8bDpaK)gw}nnG*xGKxnV&$@I|_ zotk_Co7KEPI;D1^Rsf|v1;sCii0MXvoG0iG?dZ+$?VF7(#RY84+J&x6m>p8B8% zj;7_weBnpADdO#F^F=NGf)Vx@_Uu(ATr>=`UKK9=Q;kAqxny@aA;W|^Y&r8Man0ra z=baaa+kUkzwY8rx*o4P@wUxy2B*S|{u2bmKsD}i3}2HixY^d76z@Zi2_r?FMJy#Tvvo#R^<2X=)C)#cou%%xE{5w;9i>R`J$wp@88vL z*DjlaUL;ROQh8tWuf7X)fe) z?wnK-D)#zmv(jC3R8?n;o}-Mkyrg9|AI(S(1kt8-P1}62K?n+*H>0}kTM?D;3y(VK zx!+`JQ!HsS&c{zC_R1#pIfF^=UQ@7Zzo#g#`btTA{F#zc{z^;;_zoFkoOGyWuEA@G z)YcsTl>-1@zQXl`ep`ajokW!aCCu7tH}=0y~4=CB$=6Apc%Q;=S-|<_zG@Dyn zTXCo^5`h)t#Eo0<3(bQ}1N+upXd0!8Y{+nR^L0K|A=tZqTV#f1!b@9$grl%8dzM{H zni+y(fK?r%;7VYS*Jgzfk#7_6JDqsPY$li=r9cWLSyeugV&qoa?EoeWgKn!t+j@%u zo7RUae#u!INZ$GFEF+p+U##NIcgu#&4gTxP?AM1VKhw3Q!Ph#Qrjbj0;rzMf)1wb= zJ~BHLr1Oo|_$k$Uv95vKnxr4q-3wydNB({Ykn6F-6O(o1GZ5Uy6skV#E>YRT*X{gS zRiO7kEn)L&4BlaE{#x|6d8%f_Y(AEz&48q~b=fgsgNJsCrYGaPGwq!WJM1z{zm_-b zDM5oef9|JnYtAXuf&}|q?2^)j;)Su+qODM$F^f&7M!Op{eXcPW<_lY!L`asrb zWhmzBc>X6rqsf!7!Ez&X^K08dSwrW*IiQ=B>w~*?4!#re#tl&|w!S2J_cs>^I<8b2 zQ@%;pbjILf2v_sxhOw3Nb#~V(I@H*6y_YKIJ=eNr9vDt8|8qh6wM^IbB zGJ3B8#K0#z7m6mAK$uR_^SjKLe((HK3%|f=IG&2#nmY^++It7Nmw~$9hh9gH*h7zW z1ZYDsmgRapUL!14*;am`;} zHXF!MxVL}`EsQR;ttX#fj16g~q@c#mInbj*b#U`pNf|jMK{7oS9_wJ%Xm*UznTD;3raJPYbQiM-W)&;QjWD$7C#)sYn$H^GUpbO6^+^oU7SUA*EQR8r9}cfmCFssgP{~`sz%$~=?dRb z6j*-Ne-Czd03Hk#@=w7xLPrBUQp3*gEq{C)ejBj>nV0pyQmvBY!z-d9{8)+kRufCr z9@P_x4Y3gSYB%1(BVYbU-%AqR^s)#g!mOX}GNDB~9PAUiPx!dvEz0?)Xkj(9j8ef{w`3$u4&)WTnr7sE0C96D` zHDP(dKU}Lx*4~~tPZ972#lxpl`1nrwdgjel))?N~10Leyl4#|!JRlOzcZ&o~M7|>5 zeevDP=^SqF&eDh0F$bi zlS0es8`4!c(%?bI(+2+3v;dqJK4?1B8WuloJ=OV9YMWH>t}onIbgpmMCra z6G+opM&-k5r%gAdL*9C;>)6p>%h_KpY+(1t0yMJ{G+w-)oKEXc-5Iu8w3Ij~@`hN} zTi2Y)ThPG4XTln!6G=e%=G8+9_Yp?|9DL{~D13RHAK{zsZ(xt6ZDCRboP*llPSev- zo17J92$S-$wIY80QJe> zt>7rMJHQ*LovWoq$$_)ad6MRAE+NzX)j?cZJVC;nDi_!DGZw8Zv0hd`vGV0Ot_cek z>-Uh+==_Xh-)cb>J0p=lA>ztqssShV{w$z$(OBSH7oxyE5@}Q}MOAC~=~5K(Nt;^T zp|vNxLLm+_GlgI<+Yt9O9e0Ml?pcTjYi(R$1LA~fIiqdAGjky>5!7^ngi1A4&P=Vh z)nYs32Hmsa2smV2@vtb{bPS&>fGsq*_cV$4~I)EK8j{+X9q#rJAXBM z@%(7XO3tWSB4i0fn08y*3L}Bf9?Bji9`;a}g`&A<$hZUj@3;D}!pr^Au*_GlL+ELpZDGUCfW0iq9z|9PtU_~ zxSZ$1LNf=vdr%4sKhstYhxNIYUwkZeWG1Nf6Q^KU{G9|eaDmqm+>)X2YqD`Aa&)U) z&C6OG8Ofi|Je^DQwughJlGqO$#GS3BJu(`s$h5yRNij{O6^x=FmcMMoJHdL+eH()Ii^KXG|AGIJ^6;ySC}tT z{+MSPb69Ou6~W#E!t*>}uWUx;j*i9TaOK``KT9A8ft0uD@fDiIzLRuucD{DOx7cXx z)1}1Sn@`{o#_twhPK{tNrizP!!1La8wfNa_d)r`Z=>gieOa_Ts11#T^?wvO1UuD8W zSx)UD=jP~1mqfh$?1!}l&g#Pp0S8wn@w7m0l%B{r7af_#WktDm!+{rT<-7=XMz4=K z83(PlR-=H~DD@H%y^Z&qbA7{Py*VU4KAqAc?S_C9HJxB4$PWHebSSF@wqIxRan#bUGdk1b#`8uv>h_*OYWVw9 z(oL!+;@DFJ7vh%v7!%{e(g|gT8d;>&?h=3j)WAN3Y(*0Zvx*WELP^k43Tut z_ZhU^Kj4Vg)#PmFV?!rxG>0Q~AZwX-ht!UoERleN4uT9MwA%!bV=lD3)E~rZ7PWW# zS$<#JMN_mgzZE<2;&f$YB8w>p`gs5mk2+8s9(KT_qpb`qL941W?4~mlb{BSF&LHi{tucjPq_1gEnD@*C%CU-XGMEvaHz zw5{z=c*-k=4wSIb%yl3{s+9CNvt)V8goMxuIxAnWB+-eoiq@=LZ*zU+nMc%_3RSJ8 zJaM*8b$tn%iS2%UzJ$_YC6aO)bt>jtHBEY?Ary1UcG}3Dx3e4sx{F0mRGPSD<87JQ zOk=wRSo2^wShvs}59dEIoJGK2cgNtC&-TnD1BHI9zzqS(*0sJ(4ym>}V2{mG>B{T- z#WUH#JgSy=UXQ|`E`75#}630zVUXBC)QIUvPymRFzRfo)IJ%k7OFKb=sJ zHQM}?VDlix`Mom&54;3yyT|ot_&h8y6*8Ynw9Mk5>Tp-9%`yYGC6)bnP6V_M&VM!5 z%9iiz`fxcYPk>72%Xshb9v9oQ3vC&keW)h~vaF1>b6qQw$)3zwuq2(aHXpND-A}GZ)c~r{dWhHx!pKqG-rCly%*)na;BlQ#<;vU)5+4w)(j=d zK3+#^-ye86Q?|W%0-NdYnRUuiZ*}oz$>9%KgE0Ca>}kEd6X`uE$=6~s6R|bH^Z>28 zckj;OhXF|RMIqhH13r%%%QTfA-h&$ZPja@e1P58Psi4JwQxxB8yP3HA_$xVnt0EbIS_ zh@Xz0W(K7^yB)TOybzAk7TM4SNIciNzJZp2V@{hHcDm1)bowuCPfx?=C%SHZGYOT= zWvU5W$jfol8owjaTl0 zR}yzU^#-~TLp*;q>*HA+|T>DcU+$TYK;`7&ra_FG8F;n zV5}1~QziUZuXZ{E5p^Y^PoccTctDWR;o;DY8{bq8663?v@|E}>(D_Fp z5!H(=j{@AvZ?v5r{VP?EkTz zi6(I%#CEQpVt@4U=>dK`z2jcwZ|c)zWN-~!03q9 z(uTkV3JY(>$6E~>N_!hF&9M2YI^cWz#Dngql$2Bw7~N|i7-coo4`@7^whK0R&TG^k zwy=o(hn~G8it_UGZUs_kOuWls3>FgL`EZH#@YmuJ68g83wF-gu^WPGbMG1TqmnRW* zqBFyH+`QtixDHL{L(cpJbtNS|M7netDjmIf)`07YD)FR(n4`g;zFB}>d&mUK{6=KS zA|N=Wqw@o6Me**Tt|TO8Q`+_L_~_rGCYqiW;q2;0p2|G|kP(L$sVcykw_fO*S3d^{ z63jn(BM>1<$8ovsu9O)dKCS6wB1J168__=@blIKH zdQU}-bzH3-DL=lukZO5-@ZR8rn)QG5eK6~8bqabaKZb?UUSbb=$;w6-BNM<~;&L|N z@OXw3oC;k#Q~ZXu6SPI10)IuHn%eTbL>ffR-_0%z|Gg0hjo#-Rh-Jh1nD>H{%z9T2 zB(simKQqol7MGZazv*F<5%Z4aUwtG7x(!>^<@0D`dKx3RnS4i?cr899n&cLE6Z``7 ztK_@cJ~%91#0@1rZvYxIl!BT%V=^(p4Cy+qLeZaH7!GrQZ`ONcPBzF$CoZsKBr3{R z1@5P$isnijj>|o_NV^zM8h7sG1}A9`gFWwWi_nlrLzC^(SFeCT72tpGKuWa`z<}1 zn1h~%%7x(wdD@YWadGndA5fWkJ2l*F#A=5U#asH+^iL=*H_(SifLa#9FfH1NEQj~~ z-$n`seN5n9GQJ&-y$iUcvv^;{1g+DA@0>1BmE+BT&jCF+zw2x6cD~(U8JqLh`a$9l zzU7N2Q_$X_aTrFkK}_YlBxbBF=mU15=O;q%E#h}eJ6Y*%nnBSkOs#8Np)12$7s(tApQ4Rp4mXbDHN}!*J zAcsP`nuylNctrK$osS9jExAYQ{b?RzAq+h1bL^vII?R>lE-Ttf@!E2nqglTy%s;#w zJqsNA@cxRlgaxWCjk6$<`7-~c>mb;z*nfdr0+KW%j6y6*3BFsN~ zeMnp0_JUG2&>oVOIXCq$T1)22Drw8rLn+8I;XLJuqdz#HqPbLjP_~yU`lTR;SyT#T z_Y2ivEU^+qlNb_r~uH4Td8#^ zyR_1!q6x}U2zN#+Pf@AL++TdtmY=tal`_cXmYvLlII_GKr+eB!Sw(qafq4}^5@-ugH?bFf3Ar%j}N8Z(k*+zMx75k9=2x5GB`KA%0(}r0I zojCHaj+3}}q}ZB$S4pkmC!+_vsP97C{Cq(Bn3-0^T3ac#;!TQvqmiWX0Ma^+v#WztY0~jV(jMG@tPth z^|Kdg+^LVzOZPMEji)xAnWNfnD~*yb3J*i|N9|3odIQ-O?`%P#yW>pBo++Qn&I&_o zSDaIgE2VXUxim^uvr@xNUmo1OIj3foOZzNtbCo^a=P}y05sM$Z>2_R^+$%$QCvhQ7 zw~6aWN3XI;cEw~9{b`7WK0k z`Vx^5spRGj9bcP8{GIpq+B5cKpg)SsVu?nc9t^GbsiVAdJBMr zh4CJ6=(0}L#0tT5+N(#C23^yXhb0$jRvM7DDY z0mKS_)cyYbt0z35-ig|zQoS`VxZTyz|GxjPKeM)kXC;;XIVq*mpbXel{^`*F^|IY7 zzzf+7b(Lun^^fcQ|Kpp~c%bp#ZQhoNj!OT(ylft_56r%EF^%B*iWksCuOW~5vj1!Ap1~2SSIo~l($yO5c*}DxZ++`kw0*fIF)@+St0}ua7*qlK2EF>%Z-H~Z@lEzim zlu}Vp|5o~0zfESmOD@$@>SQg=!Ge~{9+u|9C1NXz9l}he^Yr18T*JFqp^>O_i!e6!&}O1~ z`xz8WW+)QWN?Q5lcIfv<{UJ#8<~`~FM0oz81%`Mn!ZfW*#!{G3Y~byrfs{w$L3tuh>pnoY663{C3prCv1K zo6Zy>=<NlH!U<7m1pu6ori`I)%ZjaR}q z_7&Pl2AH7?2qq>gSNQr|p&Zb#sPlOWE3L zu8#Al2xJU&!3pOLwSrKkEIaPGz!i=nHr%A9&9^%G$%6+~fRF|MituLetJ;>ukHF=M zt7(wyJCuu$OAz6CzhY_KJ+z#!l(553qjk;zuO<&`#!lNEq3M>mgb}of3G^<3KuR=A zFpY;#l1wpSn{U_p7E*R9uXM{AcA3gf+|$XYv@TfEm@#*tdK;hloPNjpgn3gajg=(T zhX&ry2kkOfx-oxI`#4NuGqK8u_XUK@#$pqR#7+A_qfum+Sv%zBL^AtYz(HOtZBdGZ zh&Pgg&Q`zw^e|swq>=JGRyL(6;9>%VgXHd#W9~V3bbD)>{=asfzZ=k(GAM6mz~WOu z{Ili{h{xQ@54@D`J29n_i5c01U_y$08xc!?Br~x&q;WEtjCbxU;*(tb)$JiULfq{J zA$?ISDT&b*$l_b;WWg8fRoz+?D@H+REMu7{7=q~K>xzXZPLZ(?$$V*5%Uxfa6{Ma{ z)4|V7NxptW%Bqj@sqMXhzXp3l{OVqX?WGd^HlxBZoaF9a;ozdXgD}cH+@IUUg3YeT z+d^rK1b;5G$(>17`Zvi$8p%hTaQl2O<&l)=ZhJhBR2$PA#`RLvSP*-)hAnf|-h4F9 zABxZ4aVgSybc$=-qz4&8TZANsHF3UoKh_q{&vbrSphwq-zL>7%dEqe!nB_5cOufyW z!9o*TV(5<} z3jt@`yxg9d$P-JxA?@bHCvtwJN>$=^MwCUE;7_C~O{R(oH;=au)_(^6WL0y-%qq~Q z9N*i_gHghsOAym!sn=)Gm1*a(4=_jUzS)LfZQ!ItV=_kWkF*8mRepPu|9Pd@GI<>M zFg!7_z=y?7f8z6h6Bj+uao1{xB{K14o9NxeB6;&McH|ABv-MBe&`WdbGEz`huPiqzYf&orTyn}QEFb(aQKIAd?6-9L z(vE7Mz~q)?)+T!fD@B&M6r~?DmFo&~T8$@3jZH;K;zR;()qH0ABdWa2jQ0pLcPO-* z9KQIKJxC!xOAawOKTooy(IV)p#PidYdpX26}G zYMi4DuIIBJ#u(a~zhoMd4Y^FS?rnhX$~p|eucRa=(bX`$TB~^@h2)=QBM;vZ6h(%j z-ZM(u+Qhq(#^gSxX{2o5LEY#2 zm9W`zB}3n!{6W*7y@>_z9o-cnD43kRa&hV|<|{$5$SE5#`>2i?iVfffeF@uWAQeBW z(g9c@B4CLMtv9ve2juP77Ozm;@pm;7M!FKpVc*x51H!GSR%;#6F4h~9Fz9uI-YkYy zk2+6oc!GdD8iaE7y~+Q(>i_fn6^Ez2n!v%qF}m*zcQT6)5C}+Z&@?$} zRn*qOE=(Wqt2Z{qDj+_rv-XF&P|uQ1L3cscoJum3Sr!Cy5t=_+B~c`uFXBg(SX`z| zX*AfNPL$=~PXVtprh&>jUvCvzOx*0;tam%&KAowedT6WUP^vl+w8o(fL z+!vZLUudVVHfO2TlxDhglY@D6D)NwfHjGi-+#HO-6va(gE~69>NUT=X$|S%SpIZp`?!CwvY)8%5UhoP{fXyk z-XCBjqbA%@b;^6u))-xjN0v09BeJyV$|jL;Lp0e4T#37`0>LKw`oZYVeq=!%>zRBE z0~<{V9RiW7e1SRhlLS{cy3Q4b#rFbO6cy(ngrm`fsNrN@lIR%EgvI9G{DdL@KvrdG zOkE+YF+vc-^0{rVcuPu4(1VGCAt|tfBT+tfR*j&VdE(20Y2))c0l9ZJ3<3Zoj*GS) zEX+8GBRUoSKV%Kr$BPcc@B?WhpPK11TG$42mW(tn+H}5DSOgXq`z?a>zqtSiyYS#z z&tDDW6Fh^JY1RcwZd~Te?Se%|fKe4X34*gH)vb>qE;dui%s7hcYoQ^lHZbbcO~F?u z&(2Md4r{Lksa;;$!bp%#cZoCI{dtr%DSOd%AI@Y!p)&E-AGa6m;~P4&wGu`_s1aa% z$vI0a_pLUm6CEqF`W!dx3_j9_{^;E`))4rBS5QXVu&KS6Tb?xMO9cE)Eb>txkTn5K zx1*q1V=7D*j)_lC7S~YqJsqMcQV7zXIKC}w8_6Epr}J90jWMQRcMZRNJ_90Z;LP0^ zi0OrNl=lV-VG(WqP-C5Z$=+SbwuvV+i%W#*R~R29#uO4njfA6|q1+WK3_fM~fpiN4 z#(%n?yCBZ;DIOz{AH*P4d)bXuc{Sc>T(H3BA1lES#dC{#Z@@xALc59}7QkT_<(Z*ptm!(U z^z!p=q?O#jmio5TiD`V(Pyd0Mre8euK?mN`>zWrWJ1?agJ4 zX@=V(|As@?9$D67Hltr}FaUgeU&VLf%Ii9=&XXDIy~ime5^4amc7-tpjkGvg{p3i? z71sH-RaLH}?8okCH7Rf9iQE(;#$G2%X%{kiLz@B0huW_u{Vu+^3BTR_;N9JK3+o19 zfw#PzB*?T>TC1G|0m#<^gdy=|Pe8He+3CD<(qIu`yXgV_cDChh*5pYpaohWMgi;#OybJ%WvDF>Z&L~FpI|ES6U<$nzO)|rl|2>rs(Ni zO{819>?xtdEdvsXMcf=orYkMpjNe%pN-Ua4<{MNnF*rX};Da$^Fj_V$0P+ez1uNcZ2jlu~%`oU2F#WsL|G2ljGr zE+a6g_BZ3pOj7krP~~6cdsf26l`F6i;ULlZ3RMr|4{5mlJg_$?;Z4_JDlXa%kH390 zOPIOnLIO79On6HFEkSwq8@7ykunwn%nCm+nRS7t3Es@elzTBg{EU73v18}lk9}b_S<5#6(>(vTo zzYoZyo!TgDtUAO&ESM&#BEN##0DS~DGA|6$K0ZlFgG5uUy%s3(g;Y^nR_mmkk@ll* z$}(+>i)-85X0wN47hkhG_Ort}u6;O+!KSl{SLIT|4>;U}Dx_$lK1QVku0>wkskyOQ z8X&IE>{eiUVEtOC2RK;Far%3G9Il zaYDsrr+HC<+%kn{p>ZOGp;G5*we9*J4}2{B+k^8jt1_JmMAh$i1|rg&H}%P;+M>Ji#x92q&(#h(KLU(5g*wN?kiuDt)=*cIJS@jZ zpaumbJUkxT=jx+OswRqIZSg%p_YBc0UP5my<}nEPf67u7}Q6 z090;3qD+EtcZ#EWgH^8|yPq(01|Iu<0GJ3lIk(@d=2pl8*#)Nae(7A1M}S=ROp^4*IMSS_T)eYL&Ub z3IgMEmbnsbXbu9=$->_EJjL-iR{kD*?nW6=#GbTuzaYVL)co!6n=q5P)C_**i}mKH z)&~m#d|d~!LN(_T_72YA2cQ5e2KDSf=)-VW zE4NFTcMn*E6g5-55mN_dP?f9KCwTr5fv%=Xa>bLVM2}0)My)_xJ1EBFFKW4R`$#SiVDl(`QQkF$*qV*AQ@zZ{OW zbY{mY?Zz7Q{qao~Y>V77TN1H2^aNucS|KkeG1tbWReN~D|S0L-oThH0{cfPX)_^dxJ6 z+Ry7f(R_B*t{EBen3{h4S2>Xm;YGozPavt(BY}t4GvTzhTdpI?FQp~tH5~u&*`J+0nPvJ;h=$QO7CGVpeLan2-441)xVMA+6s*^%`Gc9WUNYdr_*m6XR@-o^vY zN8Sxn`vKP<(-f5?$r>$w_i&eZdkjaC1Eic*0Wcfg_^I-V8g*3q_c2IP*d1E14O^~J zfN@mE%8*cYT;t&KNBk9o-VP762;`x2sWa$+dz6y6vJ9&$xgo@4s?=wL#>35RtbsVp zlixX=V}-o^@rc5`kwAuP_rI0wA6*e{su0h1j);ySe@hl+c-p<*;a6swKmb8l-lvro zds6@l%iabWHJU2-Irl-;v%anm)fWZf&tM4{PT3FyG=3d)1_1+y zD#kNc*&)%&0SDjRF+Mzu=jG)U(=M1a&iYce(P!sz(cM$;Ibr#u?C7f6?pft*;r2hJ z0*wU(&*kxgOZ0+$U^bt8s}_jQWMRzCC(^|V76QT=A~@ZGBak|s#{tSh+tYi!W4#!! zDHxl^Uw*1ART(40ndGeM_7-EL_jcC$f^;AaibLafeL8_P0- z3>WReFL9o^=g?Q9(-N|dTxas3IQX<8&X9Rl19Ue(6s@h3cqWfZW1Ysx+9Q;Nx4P$0 z!1q3Ml^0tJKPCL1ts&a*{md+o#kz+bGk~hq0SZmuYj`n-?!{ZP4f0-0EZF^K;igR zYzUMJY=XgjV|bMg2m}D4Qut9~EC=N+#qJ>E^CpjE3XSb0NG6jflLq3ewItktz+wE} z$nZSi-RO3fvl(l&E|RGu8qAyNgxD?vd;v3D4QTWZ$?eM=Lu^@Tj@2wL1=WdE$V}j;J=}JQu-iTq! zFu5U3nq!>dk%-8Y4b89FW%i*7(+9vRu+GHK23>b?6sYI;&o%MSC(UDs=4M6wrqc!E zvBy81@qX{%q(6k-Rnk(KOC^LvqGlkM5f=YBhP#D)0nI@hiC7#{1f3)WHJ!I7Zcapd zvw7bHi&7BzaYJ1HocF=0rDBM55s2>N^TZ2|W|0! zw02)z`4z$SEW(J4on4-2DH4ZET%*ad2=4QZizyO@P-V%~p7pEvSsB39i!Wp4q~789 z&Es|CEd5Xzj_aNKW$8Y5CeJhX8#wHA*%wPJdwp2GfJ=aVyb?Nm_N8n`U>R#gP((~G ze`4%j6QAe|UutElnNn{W&Td#(q}{5J4fs95|1@S;jUcwQ$}qaxETSaxbiB}|D%R?A zr>B3XGMT|XoGlH_T#l#Iog8XZ=2dRQnry5-*gtd^J^Pu$V^eU;>9d>s0*8jvC2Cl#b_tYwW&aZA7^o}7<)oC1z1Gpzcj=DYM?NLV%hgw zs<_IoMh2MXTAB!4mH?h+;TsN3aP`(dU<>7HemtHyIV4h;GpP$_CII-1{hrj4^=Am9 z&8?|t)Lq{0?w-+np`r3WaY%mtzY)3o?Tk|j;!(ft#~)3h2zSykT5 z%uL2eoy%T+0pt1Mtm8B}yXMY4`?YKw`=^e+65$67Mu$^L*Q<}I61S$w`#~?y-2Hvz z)_gak(TR~fxG#=yRGL)@Iv96B#7mGMmA3yGcU4D1iacWUx_{uiI!4-eN1f5e-c_78LqPb*P^HGTK_qyCP83XJJ*G+hU zdENr4WB$8ZeZAXNGvG}aSY>HJl{d%%ySs6w}D6ol&9l$y7Gpy-h)$_E%=cJ zKSrg|I0b!SUEDo7RxULV8cfzgHA|KAw%PgaPmZo+_4IzY0K!g7Tkeu0V&w5jNitWR zPhR^2@{W5$6WJVBtwNpcmaEMP7E$-PgHn3rzfNsyYt(;nI+T!7+ll-~kg0nGuiJ6+ zIRo~Odfy;Iz4eK@91B-Vp{xDCLI%;6jpJa!`PvACN%&tK{0-ikO(h9bsjk-RsI=m) zLc7IMdpfDr^X=tjQRO0v;M$2$HsiVMIEHY(#11?(Y;6G1q-4J8%b?!v>RABFCH?!z_wj-NR(7hEs6|0Tv%_64@kkphaR`&Z_F^S19XTx&Jv#sO zLc;owKKc0pIBFo9Z_mknqJPnRx_hq>jEUy|{xtR4#~AyJj_3L+i!gQ(+6EEYCPRVZ zOH4@_c;sQGjZuzsyj&Kd;rhzZoGDE(E759WKL4{LV$)B19(G0C`Kzoj6|Hqxmd7!d zH$E{$YX>_Mr%caO) z_55_#cHW$nnpOL28~-~vZ_P(woql@&WxV>uWcU2$Bw_7@7(#UP^;dG z2DPVuaPgzqChRA3qh(1ne&rA4*}(YS0LHN}Hq>sszR~Z|>LVd0^(Gh6t@gZVrOGf! zO(>&>EJQjh&ilgZE6)8D+N~juR$DSGTMWDaFH}C;E9r!F)WwGbwbg2^Ywu%4^ZMw( z*-EEkr?Z`ZlTh($50XBWjMM3S2TU9sb?z+*e6sij3hR=^DWe5zQ3`9E$Wv%Hn2$H~ z1tF(r+05a@n(=f63v25}t{RP_+E#o>Q25=&<(iq zFe|gd@QpsF-|ul-AcUnn5msE35f@3npX|vt(ae=%DEw35*eW<_$xhP4?)s*&1pmb* z^l$a=-;(hQ#m6q!j>&0|KJ{@9q*N{M`+}ZHe8X7d?6Q?7lKhV_9W@}1DyNra%1}P~ z6i!2{;G$mNyn35~N%?)uY1)_Z&3%@m$+y}Un@D)sp(qT-i0#($yI4C+z&ZDuR z_o9GP5uw{|iqL<3eLY#yuSY8vCrML?D)lk-`@in8Ci61=!^fN zZ2{#+EnBU~dVna3zE&X`bM*CC3VflV$NcZtdXaGMhaJW)RVl zgtA!bPv;eYc;0S}Ro= zfOV}9`SB0C>Hbgdsh#zQl4DW2h@W(+v8>#dS0DhGy3ui}*;`y$8U;YNv3`Ayb2^Ew zRGC%LiO6p-V~L?)D&lH;5=*JjaFnn1!oyZ*dh*u(H_YbmEP4S08)K>soj^?D)4UbBo(z_BB};7Dtb^ z#kwdUEtebhmM4xFx4n4m)ieo> zc_pCscFo#vn_t-5>bdpUIu^%oVFbfRv8eQLwaPZNFCg1DFo%Sc_)7;vD|b z!)3ZoZIboSuoTU0Sw%%j0Mk|Wc{pdN>CayW`e{P4U1n~gujM+Z0M~{aIejCwg<4Y> zY~i8om~@S81*Wo9oSDGqgxRj~PWgiUTXb1Tp&QK0j6AF~-u#41IFNQFpw_w2Qm#>^ zOSqeQP-_2RtyZHReq~vklD-I}+wor>xi}J-6CNwLgfceI^+EXp(qg%9UamU>MdvEP zE&AYJ3k8EUbh*19^K((xF3IqYTOYJpoo~9yTviZ#9S&BS>|D>=9mvNUfu|yF3cZ=o z++9JZ-|P2kw6z8+I=nCcr->^IItdTFxUqvsinS_!;}%EWWXx5erQ<0C>84NILr-Pz zD^VuP_abUi{`ZX6fG=hQfyHH~HSj(56+}Hx$LEcJhPsNrX19&JPnGoKYaIv0S}Hyv zDS~u^s|Ho&-gvr~qIYpRUgZB(sluZ;StO$>>IB^)yh>)sZ#EfkFn>1sIG>{-LC#}& zZ?Demg{{R<45xHZMbU8PJSXL(7E9ap&KcBLz9|&dZcDMIf0w;7hdLJuh8f^(r+?Ct z+EB_Mz&qb*2K6EkfYg;GG{G(;cgGAv&cx=oNNpHaq=iqxzG7P2Jjnu zJoK=ZYH#!!ytGHm=L(dI!sqI=0aAb<{Nh#xzQcreyM%Vv>>}mb{xF&L?Gu8%eQjR0 zzRULQ<$pEo|M~hlCWeeX6L5!haAR5GD4>L*BL!F2YWi@Bwp+9;N!PYqrKZD3h4ZFkqC|% zEtY!LqN?i!dBc7Thz{7-Ar?}V0<~7ZTsQ(llzZRl$Tm?+J5J)i5QP9;4KRC{NpBUqI3bccQ-s)Aa#k9XN}Scox+Jnv(*#(@=<){ zga&K?n4bFQrv}!1q#sT$4^*Tq98OuX*6&udEKky`3B9$iT zucjbdsNs#WK+$0Xql4(CF7SoAvITzPM$bLkn0EoLi#C>mmAJ$jEjHx^3wU8Eje*+H z^0ePYzly(`Z0JBh{0{f#6`*}wwuTlVhRORdzHhpFzVe#KD?JnIPbLp~7dDumw+Rkm z1Pzyqw#;4pMfWo)@h;(goe+`mNb)(w&W(A4{NF?USD8vD261Ky3xCKtVNjW^rV)|f z>P(U!lD-(HuTrc~{h_?qfP5>J)e_2+85r;CM3JB-0}5<}IERjSml@XFRSR(EekHJ{ zzZDDt=Fgh`ug@BN7ZOopXa%xIu5o1lQf`3`vRu10Mx%<~f`bWZ%`lP9u}mO3R=|7I z(4sNSkw>EIVjWect&wEQ7aVjkygZr(8;_Cyg5D z4(XN}sWJ%7st5ofo&-`YvIIghAvGpkqXbl6Y>2i1F!7EhgE3xDX6l`dj1Bqy1sm-h z(#cbLst~j&Rgw53rNd(#g_N3%eZPHjs}QO;aY%=^mPMl47GlGq_rCXK0D-p!5Kxd8 zTUwCh1~*zP3*aLFxbWL($(Yb}<$>{yMA_q+N~`I2mgn$Km@kgN7=O#M#F#T66?s|c zywD>l)2Ox=@*`Spj8?#cNZ+eqH)sSWzuE+z-QSc6c~qW~gq)D4ov^xD)!#h4+H9zu zyzCn1%H0`*7`8QC7Qu3*RPRG+beJPCnagLfKN$;Lus3DHX}=1m3#o#xi*e>IG+P2} zWoY1V0e7y6Bc8wfIRA5OQ9)F7u#Xyk*9}(u$vC9clzkMx-VA!s(B+HSr%Ln8$w*_` zYjrp~KAy>&uh3utfBBB}r^6)?4NPNqO^tW|XBD;_oOK{AN&24nVx#-psVA*@4d zenYbFudp_|wS$5k?sAP5p~VafcIE_TN$#UsqZJRTLcsJof&##QeckLr_Wu>fIeb@VrW=S+q^ZQd<+_Q+rR1LMVT-q(Jbn z^WXlUq}i>e6j2%M2%2O^bS2XR9iQf@*hx<8yy;ueCrTF)c@x?JMsrD%M@BWu(OiNJM^#cYa98IA9a&moN~MRLVQ z@iHUkYI5PAEtbxGhyW9|N}_|eVcw!K>mMoaZcjFu)0Cdx7=ykJ>hD#mlW4pLgHrQ9 zLDj!giz!HO{xWULUh%d{jmGdz*F89Q;Fac5)oLA76cmTWeVoN5H4}`QdI3|JUZaSE z_gFrSyV_I{?;ucJe$o>t}M?9%G_F&9S@! z;H7w7v0NAg!J;rKK3_js*-=yl_{Rx?Qe#V&-z?&3g=EGI`l=D0o}KC&=L`#QaLCXs z>?GmvA{}iBvS~2>Up$m7_b|gixxvcrW1jvZ?jSgy47En1549o=X2}9=yA5xOyh~2IS z!DpT8i|I(a|Dr!#X-@FO1MtQUv2NEbw|F|)neWJtYhN#n%InQZe}mG4H8L`a?e6Xt zs%)*xPRq+9YI{uQGTn^KQlei~EYPJs4i^1a#f1M@FvU^)jplSTuyJCYZ)^plie1EP zY!*CDt7w@bqIa9Ph=|*G8SCaJK*F3H|dwjayoVPC=1o)r7 zbz*GFw0=xXWO+<`9;9g|qVORxQ|@55hQD-taLZ;W#Ya9oM43lX1^!;vNO3Bw@GzOw z%4>S!<`t=A6d{(BA_~h5g~tYo>M0c1j+f|3V-te_qlX8-{fQv>fHkX;CuqJblfX>G zK`wAR)@4^A)ASMdE;AK9hMsPxGdrHE$ICFnL5SI5CVT0qr-Oj}>sHZkxXPODlzjLS zzaoJT`qQt=+@pyv&!38q81n&ZcxW*?nkbNj83A9%63j=`*1<)-z0i%+^-K1S;o>vy zcyVpt?qMXGdHua7wW**O5%;v(TXeI2!D8U7Qgk~+G*^*alXb@&bp~~}^Ccu$cBvZa z50oi5Gbr#Md`0<*ZP5q_EM#98cub~nx$h=^UOzpF>FMPX!IhVn0~^T|gA2h@wtl}t zwjx#Bog5vk-Dq2)5F=S0h>SqACvs%+I8;c)P^N@#y^S}I>^i}Q#avZ{?wR;9DjZuB z&bY{9BwIDyotGPHE>x#LB2w@6#95?U4H|vYSp3>QCj7{`iXR?V8UGER1P z;x4@y?P2ueeAof!c*o&EdP?CF3#ck6sC~DJGU;6x z8qxUqPB${P%M|O#PmAv+M)N}qfhWuRLc;rTuXukv z0|x9(l!>59$uwn8>ms0Mr$fs+cUKo)7wu}Hktk%!h;oW zumMtZ7T#m}yLpjJ1#m!_IDX@TJrYS0?vfq9#dC+uCH;uK`Po{*0#FXUd4(3uQ7nLej(I%f|g60l$xL)q(4_6 z0CgS&1VrhfLiNrtF0vg}AoFcOWnpi*i&?p9nbPKR69xrDtU|miETJd#7_pGk-PVR_ z5<~gVghD`kq($zj89xIa8Ee+S>7XX!9H|rsE-H%5thWVVTH@9JTp==pS1Ha$@HETf z!=3WAaQqL{dm>_sCHT55^nm1oD%SQubk_1jLM~*7WKad&5%4#n6_3rqX&dlnW(D)2 zBDE|ee|FEV^e&P6(R*@jjvL6{m=nYr$M=p(ekTX0IGb8qt0W*fZ`%u&j4%G@qR2(6 z5$-u9Ib|PCY&}fEhmEJAqk|U;hV4CFDCfwr^h2~qLqlt*Ty$SWzY}=~nlqKhin_%0 zuT2OkCyH#$#~taKPz@?rYu{r)_i4fp^U9C?LmYf}tFjtGojZA>;&_4|L9Y8a(91K* z?o6P~@q)ux$`>4YTs(FzoME%8&O%Kq%OU6JXfJ1s^Pw1a{{uKDxATzxfUk=Pxt#pO z2Ft+aKd^|A$UL4^Es>(h>yMqFCKz8N<8Ok;&A;L?IFL4&n;S%tY&msZ`If`$Sgp zTnR^Zx>9j%%MNU>UyieMnDJaWo%?3-|2BfZy{ty0XJz%xqbkg(%B>L6a04A3Js8KP z1F7C*x@a!wl7gN-BqRh91_lNZ7x$g#yhpw-YCk$K#&VklbMB;*z67I zImp#u_g=oND=P!Oq(#w@#x+#IZdcEC|5@Oetpy^dqa8}@v54x;Rw3IammIlGOn=5_ z2|6c)(nSkF6DHKO7tx{Np-Xgo_wTgF6YOnKxzquV!kWau+sjCtEG{6 zM4~t&Xt1#J9M&2>(Z*S@1uG{EGnI~C0Gh~*d+-to)w%Fb&p!JI@>|9)EV2q5rmG4u zh?img{I#9)^-d1|gEtabqiwq|MMqFx9?9R|KQXY2s;mb6U}{OfD*TWN1zz z@^wFuU6F#eqyQRI^S+G?B;xA{j@Q)-{>;yQir};?FK<=c-+Ib}8fnw5*}g?iULhc? zS+|_KSS4wxFI+f#IXr>Y>+{i`l*eVfb1w?Hgl`tPlH21@Oww=-Q>k*+PDGhcMO zINWzfW@Bybt>O6XrSrHOhq2a-@ui5X*7JpNK)Chh8+}=ki6FVf&T}=y!rV_Q){B|% z<`xkL5?+6A7yq%zUw;MqMp=<(ikJ7b;BXqwqv=U4&ba5-x=WF0~#W<%y;zX#YiC7Wn$=(L7EM zIT%#fz_H}}=bAuS###krY@BLm@2pS>P+o41h>Tt$Ri22Nl;4u8R9f)*>_%w+e@{&&ecQbBBG1BtIQZ}U zRnhdx=us*mStXCT0YG#8=eC3ZY?nxD98KvkSx$;cvUzv@PxoyoHa2#6dOCLD>dC>uL)HcgB=k;PuZgsY#MrlxZ~We(49$#}dq>bO z>cP2)C^x?{*+SX()NEKlvHh-Me95-E_=4NOqk3eqL4L0%uHyum(VjHtFf+8>{r8Fb z?{Q(o{B@K}&e7hXag@>@3^z=kY&Nf0$m;K?G+w(_SKF> zXN~IKD)kTzx5Brf$JxgX@3>7O>bY&)EOml6mw-;8g9nlB(Z;prO!=qT|BfI2>#Ll? z{7^K6J4V#zMM5F)%H8lN%~{+yFV0omoHD>iTHFzV%Xq<|(oqs<#{UXD{xRHbDuJF@ zqM!3zT;@#zvsh+afc$AQ-~`}<2WJL(+G~k!!}#A`1KQymku9D5g_fPFo~mO4&=!7I zem%y7+o=6E*0lA~QQ8P}TYG?$ivRuXe~&?x^zRTvQCJhQiMSM07Vo(nnS8_apOL`- zH|ib{LfcX3mf&E~^A%@AI5=r`r`rPa#QX#>PM4_Q=IW#7b$m%sA*LxUwoP`E`%|vH z!1XhuAZ<;Ap57V!4fnwu7j03T#LrIGEJkAJg;v(ZKOJy~Zjr3mN9Go%wQiGi_dgcF zvUM)mC2$M)4!xM@$KN~L)ZKOebLRg)7yS1;*gh4@ohv-`7ocESWYh1T<)NUh@a@dv z(a@CH>8V0_KL4neQ&F%>4`qU)bhs_ecMyH+`Wd~S5qQ7HF)~TRQ0G<78`qbhr;|Mc z(a1u)73oOT&vBcYLTZK+6u9mQ8|5TTWl=1XrQ{{LVL!_h~#zbFwg z@HtX_n|A4Bj+1{7$@rNSw&3xFm0ambHps zd}2bt>@G|)77WMH!378#0!C6%TOB&7h%uGSSRAKt8yz(df;Y$}R0OP`h#T5$v`Ozq zKU&=EuLU~l77s2(m>MMV=wG?%Zp3?nNz9p4sXn(3;cB{scDC{_mX=mB?WL@<$G|8Y z2v`YpLEF)jtdCMh`XxWE+^Sn2J{wq1-2z(i{WG#U;ewnh|12*H3Z4PX)Q2x(YdaEH zs_!JC2f*i7SB3i;ufd}J&N=>nXBYeSkdkj3HM)mKRJ^u{Uj8*XIY~i9qr4xV(H^#} z@o<1Xzrfrxw2193kR2|!CY&_6kpWNq+k~X4awBA9iZIpnPQ0P1$zW<&QeJ~Uo`x4w z6D#GaSn)E}Oi@o>o` zOak6FvjVb3vk?}kBTq3!AJUnR#}sp<-{Z7lx3O%Inu2%a?|OoPv)x;VQySg=Yt(uD z<`^72=+$tmidb#>y*5mLx&4EJRqdkh0zp<`|2K_H_5EN2s2K1Z(INruLt{~-<;t%` zVZt<>w(y|AYA(^zq zv#fC+Rk5^Rj)EvF_*IOWcXbUeEE+=PVan>fc#Uw=7d0o^v#_Bq5pbdA^A|!l10H_1 z^~79gv+f6MnwNvP+Bb^PCe2IyVxU~H-%RcL#$3ze<1Zx@CBvh({+7K_93+$<(YJMg ziT5)MK&J%VaIR0MQSL%X%y(p84?TCLTG_W-$Q?^G{3yo__I_ZGXWdpmWWER=vy zoeWdxX-R%W=NNUo)#H?N%T4mx_K)L$EX_y5o$jUGUW{TwPC8h~g!tO?h^WN(GccTZ z=!F9(Oy)Mo;HcATsL|Fh?Qpz|N5k7l#^ov2drZU_BsN$jWAYyoiY+6(No}Dja0@=n zpj#*)JE6k6l`StMhf+Dg{0Oq#TrTJ^r`X#@hLxf2gzY3zz}A14k`D^OnJJaxt=ZD< zQ*t(qk!(k$1-Q_M#xO63J9;r8dj@g9g}S@yzI^l2Of#H#ckW|MgLGS(w4eGr&n8=A zmqc3ZW|n@`&`{_$Cd#sqBpWHvb9}sF=;KLi`h8K2!3E3{EHhQKU|gn@QTSFewnKD7 zA;%M!1I6TiQ>jkA_~iKg6Yxd?1!9U-08JFSWUrOTJR0`;e_kekX?U! zCDr-9(Mi8}Ct3>n%D{|fls@8sg+{~>NXA4e3o|q2VWJ&Y15cku`UprSf z(tA#q7^VFTKo4J?nlklU6H2@odIfTUwsp45^~00GaGpOl>PbMZ9-k8pvg6~UbK-fq zYJ`DiS;!!%a2dP$v-1UBdBOI+@R$BZjlm~+Vu}*g!u&wC-Gs$jlPfE2rn2aV81c2C zkZ*G{Sk9FOpl2nHn}{^fomX>SMyWS=I-EA_ij#K>*=BN212D7d&@D2Lkp|cmDU_eb zI@8eD7EQVnO(q;jLp78>9L^q)lQyg$yAl@c@VgPrmFS2y6E!{HNC;e`WRB~Je?7&? zKs>z+9v0P!>8^anrW}qYo>+i}BT0+ojC{wlDzuuKdMv4^5K@=t>C590cdwmpBrDY$ z-5YpLNW7dJugWXyYG(*b#4ef?cm9)Z)m(cJ6KG_opQOO@aBV9nEuBxa#LW(mC%F>Z ze&wEXz`mF7^Mw~@oj=p_4hKgYKCd{CB{;tSE+XE3ScJ~ZGP>*v^Z5SPjNDe<5H3)F zrEgJ4v^w&>g=VDHkiTC8Hcl~8tz--i;gK6uV9vwWf_aliq^Y{rvpcr^V>{&d7;1Mn zHyi;PPS7_em4d=Jr%!x-g(AN8cURi56Sd;e|fc_YQKr* zANhhSB`X^~q^!*oNhj|S2@u6wh??%^y-mDEQA^f`8|e=>zMT+!*S;h8E=C;ytrsZX zGfK3@P2n#G6E{aQEexG0L1-+VMIPoC8z^eJ(-p?d9=5sUC_-_uK>7oqOjV+}bUt_w zIYenM+qfeI8F>ywcv?=8V#Vae8$R5U?v-Z4DQ&uje>OoO+%d=Lc{)cgvVa9GTpzUV zhI87pu{1Ou$26RB3M&{Wi$)WZ9LbNdi)ju(xNY+Tklq6}wq=N9PD_Yp5_5F?#aB&f z_8nA{gu|Rx|%`Xq|YCa%B8k?E$iMvA|%BT9duZBC<(l^JLY*+*bFrP)j!73eM)QtC1H&ZULD(oDO zMQoBUxJvB^AlOSNxhT#l;Rl1y)vdMz0BqK(s+CWVuLZ&xCZtM*H%31&IZc^l3T#Nd z(MZ11X8`Y{%nrKI-&_cZpU!y(yyT0ex4E__S}4t&{*eg&`_%e-hvESdQ>u^%g+?OV zA;Hj6Mq|-ZO3t^)QFD?BrTCdF#ldTO=+Di~2?dmqkX&ojn!FK`N|3?htaoIZ-C4Da zwHH6fhVwa{l5})%i;pZ&6+`Vf))2%yo{Y9a!9OXQfeCuqz1u>xJw~bqW|ib-vnK{Y zW_PJeq@~t7WO1rfhd`~Iyd2L?&QC=q;;y><#N~{QMH$6X-;vxF)GRQLH00QjfZ}li zpw~1II?)Ir#R;zB0RV(2qG1ShmQR*kq3mV7@K`f3$Znn2uhpL-d9}GwzKSB{R6w|- zC*~W7JY*#q7P=(bUCgg_5Y2co+{(IsA6y>Y|<9qOm_UA=(5wZ zKU_o*Z}qcwTkAoXcvzv`(s)7hd4l&)5x(sSKkdiDZyr|{*i|%syWY5#C3ZX9F@w9h z-`Q~wa@yYvCzZ>s|MA85=1p~b!%Ot97qC(!?pn_X+?m@&+`|Z!9*$8kufoqq@#qQO z^9zWg)xqR~pN=dlBbRuhPjKFujN)N!-Amg>6a%FYpHw04&IG$`2dJ{AI#u=V*Wu+HvH1FT>( zQ*R<0O-f$-nE}^wm%YYl@EoPqaI9-_ndcN&|}-y9zEOBlJm0tN#^~a z(MRv{-Rc;3&q*U*jiu}&M!XS^M<0m$q6mFQY{E!Gb;)u?EsUl zip%@s?2CwoCi3GMg^8)|g$^;prznP0P-#pIqbFv6&HViY!N%Y;F@wRUm+1YqxjIi% z5P?+MM5p;*`RMP092{Nt$dsg{aVKNTbS_0$^8BRO1RDd5fRx6E&Grol>^y z$J-JnH;c%)|0Zf4sP!xH zdcH>e#Wt3;wB^NVniZpH5s%pggl5=hg_xM)d!OMU|A5;C>9E(0$s6oU`2#I}k(aVFl4}02jrGro*U3fwiVY!y4i^wk{LCcguZDDetRpK-opY4T|#ntXKPvsY%EU&+Bf|%^u@k)>mFy z!H3@ja|=7Wo~ftmI)`m2(M$Bf5kYqyE-6X;V=XU^g(hs|h14w_q_R^Zcawm%8`e5S z5V?6d-Zu<@ec1lm7jJfmz7V8gZ=VPS6_u!g0R}7{6DAm>SHRb#H$u1jjWYM`A25;w zXZ^b(T1*ym@a)%>J(4oO&D2|U@6s?%r~5h^NKoEi2G z>aJ6ia>RAj0>|fL4WsjRb~KS7b8A8L{_a_8`)Ms4(q4KKfpp;?`->DSnGoh=9m+whRccEuh%6l$~Yc2HOB;9%# zJHDoTN@P69n=CiNo43-XDZA)M5P*SB!JNSVmczeeBDNTTXPPmJ*aTNaw|vyz0Nnd( zat`?e4!s?<^eim$L(8yYqC<9&7Dm|Y*YyUR!U|9|u?qW%C^^szX1O>ywm(gZh`5Mj zoFmQ|?cWKMR2LY!OH@D%$q~d-vKdRtDg+2FYQr3}`&Mt9gDdV2C0 zW3Wl#i7HcaHPSz(k%)i9d;&WW!R%a0IMJ>qCbW?V%k^DG50g`ra&y4L-VA2NY?Z8% z4C70AJSn2=>>kqe*$wD{uCHsE5|?61lWYrG!*N^LSkG4G$NpsaK`L?(8VW5c?nNXWE`v8UW0T{e9(B3@j=G;Z?FfBTvJNqqh^pbOdVH3Y8_SsR0qe&msqJruwYj z9B`*4Hu8x5>33v=(~R4K0bgy zZhO;`-2+EBtPH$Aq-kaK&9^KV8Z0oQla;qurjM@u9tPudos?%Cnma#SiX6b6CnD}I z$+u_*wl9fi_&DL~U9Ni53mPL40z13OiP-VOu&uO5>{9n;Tl>s;%7Kn)+fpb_Nk$+Ubvu1!E z4CxMu0JsEfp9H##e!~h0kjp$7lq`LZB-l>{55owHELmnCF56Jq-JrN2l!1@bD@zzZ zVLgJj*MT-@AVowdzWwPRf`M@eD_Ai)4J8O0+{obrZ0VI)^OKMD)wDr*7Sn0GE7ltL z)QsxCuvtD<@Ia$_(i?l}BYsQ1Rd5eL0~OJ@>tE8`?1ifo#s`FDDT(QZ=~JGYq+yY0 zd5^S5IHuIJ3@tdqNX+>SN-OAhj*fzn-8l+illcuAo=VK->3y++%2Viof?#(y0}SZT z=MgAj*OpQT33aUd(Crv+eO@U^NQjF3*)F!e<3NGa?_@Ld58!RF?}qQKnGExkqia)Y z4X%_1lpl@zlFk591`-o%XmiD~3OXiyA4a^M>+bo< zQ}~=Pg3;l35VN*wEvAf@-B;G>=p{;CG~}E0M>IWKTd!b5{lgS*)@G$?*G^YayJHY# z39KbCOsrP$4ErrVF5E?h1A)YE6i#!kmTEeIZGM4HrMZci)t{q(oX=X)P$e-FneAm( zn*9q>F?UjUf1|WH`2RYwp^W`3v5XikVy#3w>?{jdrpE2WPNEz!kZp8|;$)kKUK|<) zW+h^o@d{HM4qql?qV9{3rF>}TvT3K@JAkpk`!XVfw7`UA3CEvJjSMS>lX7g{Qw^zU z^pN;p@g`&nr?AM7~|ankk2JMsiK?dyW5s_y$njiMau2t0LIMrm<|!rZ$T0j4RgJ{?cJIHyl3 ze4RnL{62ty!5!XsW#xqh*AtiNQtyMqLxZXHZw zDg}&UT_bpYLWBX@!57HBseGSns>`xsFLj^_1E63XNZOPgjP(i;-@x3TMEHDJ(2;Ii z4@^Ai@^^cC+1{%$E!t>=>THO{51>pJ;z8ahVB=s#VEBBX9!{!9L*i$OhH<#uUu-~5 z^F5(1R&V)*j{!(2Eyap42iGzD<#1;a-Ghn~EhB@vy|>ZW&M zIBm47w)9OvX%BUqCH`fjdR>RpGx0t~Gcjqzx!iz=He*QeRm8hE{~?_|IF zTyY}PS(OK`CTM-x&e-GPA_M{TVGaT2oK*Z0$ngLaB&@@!`K(pTj<_CTyA)mRfW8h# z)LF^WsBWCRtaGkJ|AdrMS3}=o!!~dOrQas zwYwKiYHgNi_-`vDWPd!>On4>)`Qm;kYGNZ0)tPd3(9f!!6v40 zmQs?FJ!@AVSfit*sXS-8u2-Gixw2o@*N=F4B-=)L#sA>c{K~QXfSr>bi_v~Z|56*6 zAt+9{wsR3(qVQRE&~g9Wn+lnJ^b?6IGg4Fy}inQpP-=*S)V^ZhjBr?o10M0GjN z`H7k1MfH}P@cPg1=yK^%Dg&<3SQ9)>akNJ*)kY3{9H!jvoi@0M4oDNwBZAHjowd1Iz_#p0?c%a!x;VLL9FnYhU|8#wfsT?#}t=TPg&dpRmVJ0VtPnYW&TyOh{OHTLbZoMNQ@9mYGu1?fh zmOPrfq`xaA-NqosBcGaQl;WR-@O9iG<9i?L#5+%xAy879Ia0+9poU10RTY?@G2?P2 zmd%^+aC4_^VMj+7@rvsXfYHSIDqCRe+4!7Ar|5p7CDZ9d-6Ry{SqR#MHe^f5IsOAl zuw^0o)AzFbK1sfPbs6de=^)Qf?z_mGt02u}EjW$1?qS&d{Zd6!1@DWb28f!A~tl2_R<8tQ*!LAv-b|!gx3gLmqqW(PT(V&dS zFLS!1zD8RY7x@>sIfWC-m4=1vn9l(B9>2RQha`&uET^=#Wj|Kz6@iz~ZjUvADW8i! z`Lg~qxQ&xi^qP>gwm)`?Oz~%%<+{tF3A& zXhjEjL{rYG0ok5Y;+LTXF0-#L(7j^q;#Ko(RcwoUEOMIwRq3?_xoetR33B5|> zX~5KSCDH$+nLCs`yCVV~2h`4Ac=decd#%w4_Osjl;Gz}RN=yR4ig{owEt;@`!Q)cP z$mHnyGqkA994)U8Vs}AxONg|y$=zeN7WPeBU48J`wxH0sXKhU~&U=?ud4!v=LqS0i z>qiK7p@BPQ2)yVYBtaD56z{!TX%NFGuHlK#oZ6%L?7};r!PD7}rOogVor6dyTa^ zQ=g%hndz1S)47z{Z8|dAd}M{^WmptF<1xL0vcX&hiZXvdtPVf&=nDD`{*<^3eK5uX z=>}zXPPRJyGpD|%E8?g99c)LlHQJ``3+0`N->!zZURx1sl88syFZ|Ksi&{>?0?cDi z!kIY{iOMjZRw?D~2E~Hf0=&E-God38keVGF8G}F?sUo2O#evCt{{wYhzJa;%yOoYy zrr+)Y;q?JvAqaQkBV>v-0&D}r9y6PoD7ftUWrh8L72JefQoYGHc9Awk4qhi^u;p(fHWB-lVkBOYb)yB28mpZ`TSwoYkr0%*vrs}(_mkI zdQN}a-zf`_f7(^)Bk??_!%c~&)`q{mA^aHl;r#?U6p83CAY;?q#H`{NF76U91N<>b zYWb6iAdkiQoBjdMmhkX;7-?k@!JH4MR6(1fOn1*)1pc$6LFt(HFF( zS{DuiuSb2E;%%cv&W|-Q36@qeBFbOGEPfuEKIRnis+x+jbEMg2TMD}RIuaR1xm>@# z&MaDH{dQ@eqAgtTQl@lc_ClB#%!b6{{pi?75srx{2xbHGh-fgy)0m2rV$KR3w-0+7 zgK_4PXMWXB^y0nPwKH@J7eYhbTAB3A+@_!inIM-Fosj=X#KFNn@ubC~KC~H3r3Cw1 zfx3I(sc86f&aH$cu2eDd-t?rRYOZ|sEMoGxeWZB_?J%j zGMU}wA;z)vZ;<}hj5tA?YE*P!`FcoU0REQ-+BIsEUfN`mICK zBSTqN;St%rI;Q$N+s=FBP*R2Dz#PX+DBx%v%$+!xJ_iDsH>x4%S0bhJF0#aky5>!x zh@kW>^L6IH8qhBumd_^*5c{{YRY%_?R|!u7Db6P_inGKD;)E9nkD}aV#8NM6Fw0C? z<%8yB+K1PbWP?{?(+$zWGVz{8A^#XIg^^GhpD>=u>;s@ZfMi&06i5N?s&8?B-r zqTpB#rEt95QXGkNs$!ESfX7**C@Xk`2q#z8mGQ+33(kHLx11C)x}KWEP)tuoq|k`W z`mrQV;1s>WqxLTh2A!6ZFiTW5k(-yooDuzI{9&j0B*_tLKKD^@J70?bP92szDND&WsiL-W)(l?R{k{e!fx0tFX-wHluB zEI3rPrE>>-Xq^ubVisGFYy|Gt#>aGLJrlMN;+2dZtf%}K&GKOM^USW274 zjmZO8qUH1q8wv9?D#QAR^sp8Qig6XqU2B;}x+bNVuq6Rdbfj_-6$w2!0u2`DNs+}q zLT=*?bCfy5{Pyc@vCfNns)4@Dfq`s;6)-8r=WRh~&=zQLd$CmBdRRpZc{91xe)DW& zt%z(~o^07S^$?F^vGzy%FFAwf8?8*)S`$cMM(ct~~f2Cn`gbd37BC zq?nIjQiF*=!e{$OY*MG=9yd>YR=(7`fZFg3ipK~p{j2DHwN}&bGPRNh#T-Pup%-`o z1$ZGf2AeA2VlR6Ab=qpI9zXFty{R5AIl~R#X0Io%u1N7|pVRlZYrU{eUzz9G{+5L> zn7`{eY4drxFjj|gl~JF{sjKAk&cQwciVR4gRcmCK)@60#R>a=~b~4W}<+ z4+-`l!+O035d8V9dJ{;`rT$wE>P-a&RZS$kwjv0otAZRzU$zH62*u)PpmUS{gMWmuu5^3vZARO3ms^;$xa@qPRtWJHq9ii^T1f5f(*wSDd`EGtc>TlDAr8@jQwSxBvA(ZOh z-~q9TUUy8VG_#T&|I`FkL4X_KlR8v>l!`DL+T-e=E?VqnK9L+X70WbHI0<FP(mMnc%|MEseyaMki_|*zTHgb`G1!+mCC< z@ojEqFV}w{MxVWk zhlji{f7%_N6tT&jR;M}e#epYuh#oI;;ol|@+#m-+p-{F1FU;j{h5o$Ac-o-~6oLE= zywH>sWstC14*eqyC88*l){6Yd7{g$%uJhPO8^|&&$Vxy|eYsIdg zP&f5v3#W@`Nnm55Q0pU4 z=M}H5j+dgs3I{{ zcAU2K@{)9;C_|d?1K4OeM>ibL1HCWf@vd#)+uiryX1B!8tZX?X&`15yi?))N(gNi1 zHo=K&vRINEF8@%K9YSFW5BE+eJTGg`EaDujn>w^aD}1tK>V_GqvGB#JG&JP~D*OV= z^V;5-4Nr(-O^kFH7!5`R^g@G}h<2r^61-)WW1%q1cTeQvwFYo0qQ;@&qxln+=|PCi zX48>Q4S)z3RI6EPx`~%6!`Lm3#Po;p7@(@p2eB^u6D5>1sh6E6gc&J23St5UeoB=a zuS5F%OCE_uK@-iS-Qp`r=t=q6Kcu}txoZsXbdWu0Pv38Z(l8mV37(|y`_gngJ(}nW zQuKvn4vXt_dt=U}qbe^}F>td2-_MDdpR8Fq$P+##?be|-$u*_nQOe5936R~jJq9V2 z72;sm>mNdiT9iyCz8I=amq>n0$i>?N3}TL6;m)hJS;)UnZmXz@K>c)~Hz9Q*GtvU` zDa(zIP>ovHXr&tJ3K7;`yNTu{B@JEAE_{W%)JuYys`JWheJQ7Hd9TzDP)HOqOW;B$ zCVGJw$ZdlZ@r@46rj}ai1xo(Ft1lK9ODtMQ<+E8O&xp9IS$Ub7&vM2pBePNE&eRKP zt-(k$MQ5g)PMto+1i8>H)O(!ADu1UgM}B{8#atJXOQ(T*zBzg0e|sND7#Y{GbaxE< zuB`hGdpqeXLWV6^7q(Od9{|xQq;@ay4`)|q=BUiGLTL`Zpe8oYiF1O6J{C9NEXd2= zbi~R!C;FeEtiWazeZ1F5tjo;e+dF(4CB;`$Z-!JL>xOlHe?C99EXKtev77eRp0~O5 zNzMyw@(e-kNU!po@)dg1!HTZGt?GK-J*Vp#Mzm%YVy}(;m&y#-qe5DvZ zq^eVh5kJFv2+v|SNBbG7QLd%CxE9=+NXfb#*@R`qHpaS2=JiWuQJN{vEvk<6>*S1> z<$BZJp2KiSnuIV&+_IoR-&Khr`}HGhx%-Wxb~2Y)5BU}T${&Xe!6u|rzIgMq1}f7H z;Jxg8y!tPNbB`M#K|)58>VsS1QrIdn0SXA=rcu1}BEerS_goebc)$P2r0^qzkSNJ0 z+*TslDb0EALYPQhv2uNSIVY;g(1s73|5fwDBH5mWWHg zg|-(%CT(X@a7auD^5Tlwe(se5z!fy+sb^k+rhb6Y-~n~6fR|m>GOI5QmxUo9zb1Im)Dn(qAWf~Zy?*M zyt0@eZdR-tivhzl9-Ee4K0EGIQf{s!Lmnu_Jgh>hhcX}$78{)xo|%>%p`ZV@S0!eX zSIMD^D*;e`3N5g*s2VH!dcTG;g>L!riG7R?3@YlNN^BIZew5sg?~HZA?Neuh?@?zT z+&r1JN|`4L@5w$xAi~aLY+ixw$1qgCELpVjM7~`qI6W9#8k!||+Nu1!kz7DbCYDWY z5KHoc9$ygg@&VsZAMbSO5=w+kIn}VgDen&=&K>UmJ}h&c)ZW=VVpc`bDkba&IA!QJT;R5VR+I3 z_dLCY-WNTf;pK#~>k+IETR2Jryw4H`F2{N}r3HfFB9@4*Wbhogd5v%{??Ah<)nV`> z`chKN$*q#ee84-cBT!Ttx4^P}($kA~y;D08CD=Xga8Hixu3>iq5N`?>PJ_+(o3AUq z5$UR%H{-Mfu7sv?&?;s;x|C9mQQD!W{ zOvJA8791NLEAaQ8hj+Qx#@hh3SyPu#+iv+Z+jcc## zMSL_vaAq<1v&T~aDhcSK0O^;jVIMW#qjU%20`rbw$68fie=e!q_-p9f?!yLx3q5Kq z7ge~g`;44)s^VfpcNuo%s!`P5SKKYtY9+PX1q|B>W}wekx#BHIQ%%*RlTjloS(~U0%^FAI&de z42A2We$hEDK}b2v+$PWsCmrc3De=sCyU@HKdAx1Z8nY(6Ji<9Qy;dKYT|`Ik=|~|G zXB^95`~f;eSH+GjvuYw4-;(z6tD2sD#LK$8fYh}*;{JlPYkGmbr)l)ru{7rgrEFDe z$J*3UdihaynX&ynCdI>L$*!My{jv)=^3*s4k*!1LYzWS+#aXl zPM+)wcX~k)oe5v0TYYtPb^2STjrPzhEom{TPi8Y5*X`N$46Q!qENKL|RxA6&{&+>) zT`{W}+e*{oO={rOsJj|ux37#0k`#$y?}{!15Hh3qEjIu9Dhi0=Afg!1m9WNoScSOc@P3 z@V$(!aC4TD@o4Yp8-grb69NFalA=3sARP}hz;j0wn&D2bL9Cz?<~AHn{^VX|K}Sgu zL=BHY%4GOgLCoRrl3egcOGQ)H*!aMoyOEDD-u^)>h2OyZKN8862H|x1ubZc2XRG@%K#_U1(sId< zargKaE7(GvZ_$SKcS25}Cq+_)3Mx~C)}$qmOI=xH2TSLvEwvd;)QRh@5RIn5RHy$P zL0F_+_Ycw8*IiZeU;zt8f`~d?iK(@)V+)S%A-}mhE%))CUh-63OnQHI7Fq=^Las{W zU81hiR;+B^CJb)*mU+xELDkhquYj5E_j7Y47BrM*Te`e8*&<^mGAhVn8B~IiaY#2~ zw0rThO3NsLqE?~D&CHMwI!#7>Zkc6o%()}QyHj9da>L?A!q~Hu80Bd_6!a}L zQSBKYO{3C*KgF+cO_bGjaJyV^P3ym@tA&@>$2SKdKbl520&&SS7v<;l!G90KM!n$o z`+g?FgNRJ|7&a9X*#0^!WDy+_QQnbJiZ&gRC=*2|0jQx8GXJ%F0 zrdY6H1-yT3F{fx#m?`2%US-h4?l8d{ff`3}I>yXSm%zT7DE3iQrSZE9-niI8%$B+@ zXnY8YiPrE^9GZ$(Yf@RxW6Mz(W$}VYVP^fp%*;#lR90o=cL|G?oce=CsVD7W429^( zi^Hpc`U93JoVEJK9m^XNE*qVxmjXuF>L(vHaJn>@GCPz-l_mYFDq_dsj9he;A-K5o z%rNYsQ8#G&PbmUEE7mZUn4h|#sW~Yf$R>&Ou-BhFVoA(Fi15fu!a`9*0PGx0WBDA) ztF+g(=HU(*31X)aS+)KB{?aj=(Vm@7!nO?#qmjXlS|rXfkN*SDKrp{Pags*zibtER z>-V7lkRB8vbv@l~%W{n}^;RQrH6b96xk$bpDyhaF$Bn>{*aWqhYvv;OPfM5JXi1s! zaB3_*jZs4K8T&?mMPfwGS&j=5Z#*yRxmD@TUwz0ZUnCNwoK|rkZ&^7L$#}s3YH?)b zk*!g;v{)n#Wjr!S0~V*sl8MdJPu@w7q=i_uY!7W@xT>*B>XG~^ofO7n>4O|Irfpvx zsC_wW1j*MC7Dl|~R?;h}3zpxJ`lCptx${fqp8c!w-+#|WWJDBhnf4?K%a7r!MGH_@ zSBvSl--Pao*YQgo4dJRro*&NQjrGLwGEBR95dQM#m$7U29^8EE1dFny#TSR6(O097 z=GVZ8ldTaixH-~$l!SV!CI}vKjnrjty9N?x*+)sE4CFGsag8ONNC=jf)M4b<9*B$# z!;0k_`9)G}h=}oGRVrMG?Y={6@%BGv;^wJSFlXL8JpJsW=#e;rUqjERH<<3j3%k#x z4MsR~AB&M?Q{6_~`D|5w_EV%a&GQQu#<4jr=I5n+IX>5YX4wXjlsbB%6f>p|#fslN z4{JVTR{U+;v>Eq5bUS)edl$?~Z z_wPT9Z`SOGU!V)~$n`gQAT%#Sn$Ob;pR>JF%=;?O;^i6-<(*+F-{jfPsP{@54~;hI ztw!K-BM{>63HjkvC0dJWIbgM@_Y@klajGGY+?yv(H5ZeQdk|JOLcX70kg>*c{E;_+ zX)J3$jv6HzamMkt^D`fx-^q83#`@*kv6{r2yi@&xz3A2S8b!XTJZ&!5TKTHR2?lk>5Bc@e+*lvTqq@#H%!HpXseBXU_!l{BqVP!}7eu$vGolj?II4 zob2a51X0o%d5o=jUd#B7;tUba{G4JOJCLrDloglbz|Q0C z%I+xd`P3bkGP~O$f*%F47Y%w0+T!Mrp@%?S+z>D(p#1 z#^LOA)HF7#MW-D}3VSXR?Am_LT)@e(X%R|tgOda&F4CJwjBz=m@|c!TjN@}83s)J~ zL{7trdBqT}D7zZ@&xM(cL$dgCrG!gEJ#9qLow&1$z4`)ZlI? zPvY&VcGXPDGznp$!H9{8G^t>r3K0=u2n{v4Hy1;;@`conZ8gZHbG1Xtw;={DPQ1o! zw*yrOYpk9Y)Od8bu@y3frFzBit?-3?pEwOxK{l#QY(q2 z4Y9XY7|3;yV>cT5mGp8ACBKv>`}x^b>Y6$e1L>OtA=ip3_F(elarotn&%xKvoeO9# ztl1{%qokAjfIU|Cf*3P4dD$ZVsss}jvY?l?Rng{%+><6l#ov9ONfC07Ngi3y7Z+43 zEX*-ztLCg5X{Xe0o?krZO5fRRb-zg+lFotmqx3>aEX0V(%_aSb}U&(2n{kQ0F< zX9^06uw&;AY}~ww?QlURTIWqdY&2IDjXgd>F6(`Ior&-We#a+@qc!85@nUOvWGee6c+e zRZ=vvC@Jty4*E_)aU8ziqR7WDq4QSb+L-_aV|1#DI;bA?HL$$NkOsd~-K?7Hg z3F3~Os(D;O!8?fFl(?WNBuQPGSB6+V!^bN5Rgnf*<0E|(>6XpKVQn540N&29A!*W* zUI=FzJ*{nRMv#y`eE!ZRxgql+QFRbWm*kX9Y~!`GN#TYq+n2C@P>pbq8rQ@gnvgX> zH(b*<4BK}vg#)@HGLGs`l%B{+sYM+!7+;3L114h2j^o^~Kw{^3mR*m$;+-n5NcJ?+ zK81wsJCE|OEhTD#ap+hf_mA-xz#k3r;t+ol+z=6xh>Uc4%t8tKAE9hW2sw1*cqz|S zvW;PEqiK#OIV^)(EHeF}W9f{_#IV6P(O7R0lCswDI0kW10cv4*h+ea3Y8Jx>4^~Cg zQR+nq3S)jKBt}!SX|X9}-PRo|m@WjJW1`U9LKpEetLPv|{X!xgJR*He#;2d}=kHza zyE5-kj_ow=OTy&hF|X(?Fk<)w zY}}BERm;EO!Z`#VefTl{@y;Ka-itp8zWm7@EZ0#&7j%jDQ4&<7CNW}IKdjrB#PjJ$ zh#iI&5-3S~i&RQ^F9`v>VRHtL4^St?4WR)Ed>7hb4-Fube!=5EdqDkwC?v!UqojC) zk|L3L*Isp>^+KN>{***q0Vk@Yg^S8E>*yGxO12?ZNpiK2jM;l&Ej;b}qeuS;e6wkh zYEwkWHR?Si*WzqJCT~Jook-sdZ>It1(lZ>JwtmUv@$7p5KXNtWFuiSs(te2$zXui8 z9_SqFLEPouaY5GvZ|$P44(}^KYUWyA{~_xASzXyg)xN`ww?^maZb&*H_jnh?NBPrR zn5edrP9ec8HevvJiL;MmKT5d24_)Gh^L`g;g_G)8Plz2!awi*0mmO3DjLbhIl#>ie z&)$Z($m`SOVUjwiW*;aa6-}>a2UCjSMTse2 z&bcI1v+U&b0)$2cB8$&$O9tl?;XWkkXrqi}o}hXq!R7E`2MJ}0-Kevj{*c1||5h$Ud>8^=g z;N#Yh_jx_-{xqYYEEBOLSC5{MalRCO9)Tpm?0N5GBTU)Ov2T0ULNV&v0a)|R9;Qo& zr&BMud6M+zzt%Q#Q7W~(tA*qfX-CUvwR6lcHLuJ|uR~R0va_2l z@2h;qAH%?YH==|eJ>&Ff=d;Mh>Yx$0S3=r}EG+tT4Wbf4=_0rqD=F%F=c5yqp~&6a4r1Ms9q8O60y{Szgom#iZocaV zH4*-L?l(#eMh2>=&LIflgwpEtfMpWv7gDUF@Xe|n*uC*E;=6}q^Qt7oB!*)A)a%qh z^UccbO6shmxGn4UVAIMy2#*cK!9B+**;k8DE>b1PA}=qa2n#=3rAV`!v_h3mz8*+B zmd;;?!+X;a-z^-ODfyOo&l&3BJeQVTM{{G8U=Y`iC-LCt zpW)@<{V^h;JDN!1WS5s>duj@%^zKUuDI3h&y&dnb*p3_f#p2=HXTZ~0>}H(8zKm2n zy<#m|N^0=hEn^WM7y>s(Cp3~EO3u%v2da3Kaq;xqC10YLMomS!!&uClV<~DfvY1Ki z7KS-5{gaEU7&T_q)czIUe6taM{KHJDP1)iw-JXB`$$ShNbPb5>6~*AP((2PWS1~ z*t&HaZohjPKI0;6FwYAyu>Zgz`K~%QcY{=4}vZB3TT7@Xp5=GiDU(sd6QgyXDJP;`v{`fB}7nVaM(j7meYj z&0BESy|=N-&g|oTxcjads*eo~^;o`Q6`uO}^CYtdkjzTK(@)%n`|rP-m~e8;`$!Bs zZ{amaKAwu-z4SV6pD~?8R|`r?O0Z!5V%%}Zba;AtVb!YDc=XBp@UIX5hiiuqQ`fGx zwhqgdt-#NI{s!x|$KnNlLt3i9!n*WSX`O@~NY?CubwS+nQjcYpYh zPe#E6s3j!N{O;vc;$B_daO*7Y z9#q#@>|2V2;kNBNaLaAKW6Ekg_w?KAxeR1UVe)qkP@V9^LQBtw? zyzWaDu0-$Ny%fp3Z21a2@ze`chwhHddI9pr6g8&8nOQ9_B;5!!v?jD4Op}{ z3D-`ILyTV_Hk~+%8a|(+h=a7xff9NzTt5!aj2ffVg1_9m3;)=(6J31V6p?4qMRh0= zlOhRv!?=4Xb?AV3Uo66{)2CA1{93&K(Hr>vOK)KG=<6_O*d6%eD-UAAjpOmpw?D+* zy$7*v(-(OA?T;{P-iP?;y-zS|)JT4Wq?8$-<>Mz#;DZl7#=4b<5gBu4p=jO)xliPy zrl>Q^_%!0WYb~DDe=_+Y%>3X}bno6B9vlhaxZU_xST)-o(;HNuYrO+&XO#e({UB2n;02ne|)L)YdBEU8H++`F?od-br}u z(J$cdAE3s&gZ%LH;){PqWkt1;o^z(5ZV9Fj*IfKMJCb1ZCfVnzh~szu@h|l4+nZkS zsyVJCs(VrH)5m{y|2f|&?Z?A=`K;W2*~Y`az5Xu7kGp}Aro11T8nJ%;2HgALZ`doR zA9y@`pC7g&_&)8}5sm_0|Ir9sHUvy>u1+r9$iqe9R3ksmQ597@om$!ZkbIMQtOVl? zXFB?!{u&>RWL_pgj*W9aRGW0Y8i5}p0+)|&|MtATZF0fy%R7!DG&%s2XN<<(k59q% zlLsrpN<4n7`)UVneP|pe-Z~18JbxR%LRR4Tku*w8*s4WI6eUC+qG;@mH;-s5&#WR2 z7+cow#>O=}v0?QNtp0j4)sM>g#jyD-d(osp+xpSvlL>01M+jnfko}}GsQ7P?8O--e}t4&<^wP4KX z5x8m61QZvQ;>3wmq^0JevZ@lph7QKfQ^q1MN2FDnF>&H}s;W9tGGhrnF1aYe#j=k= z8dOy_pexC-r=NO^LN`sA#rCaOwGuugFeXpBk>uMB3>px_#o^D@Vs+u7Mas645Q?IX zDk^p=$Xu~)zBuQzg}C#M86*o2;y)iQr6gN07htB3EtYK%kFO$Wmy(u-ox66?#?gKy z855z@3+t3Rs^qy?3RiDb2K#8m7D=w^E@W9-ASuz-n zBr2jvP$wkBW7@QF7?Kc!*w{fTZ&<<*YHP{wvK3A0Zd2n-=7BNJF5p_AY7-5(&`^_>{g+>Ti7LvU8?L{WKE-aMM$a0&^446O zd+yolzAan6jAcXBybz5mNmpNenIi7KU-LZ{FZmWBA;I`7{e+43C@20g7cTOG(w1Yd zi5h7cMfpg~-bcA)!IuXC$|snTQB6$<^YTH6w>MuzWFVF=7NY$Fu{kRZgM&gbDKrR8 zB=KT-Y+__A(u)hQCT$Ob8PMZi5@pql(pp4!91op43!&bASed#Dn=(@|W?&TlPNJ)l znss8bD(3%Ll*i%TzPNV6BzQTyBCD(f<&-n|B=%DBbC6t+OOmaF$BU3skb_jp>ynxp zxNxlW^)f?&!$0y;L(-^`!+8%H@WS)&sr_lwCaLchl74Y1(DSa*Q_~Q>Mll(=C7b`g)8xy67Hq*j27q@Vny1BVCg5y_w(Xtt* zPd*I~{`F7DE!;|?nU*2lvQ!#mwy6k2ITjG$hp}UZs}~`keDW!(IZm&>Y7Q=%^#|l0Foc_kuC_<($85WsB!06+jqL_t(k;vq33l@vQP0^fY}J?6i^l%|zIh#MNk zhY$xypa#(@+t2S@l34PC*-8?uD8CGY21lZkj*6oPhf`yLW(RyYH#Z@bdgao!RSoo` z#y4HuY2w4XTvJFdzHFe0N~T&w$u(;EgDl6zABWUqo>xb+lB&uYMYh@V$3HSAOsZ!a z9Wi)hB*{5h5OA5thu6SxABKPSRr?Z7I5^Tz5p0n$p%^t`C{p)iDowT~nibjcVO6x- z>gwv@MiV&+8!So8YVUaDYA#4@`9@S!lR;8&7iL{G6~o8Gn?1;>;`)z9;CF{W8|UF5 zHz&NZeJ|~{7Qxmp0z0DPv5^{XuPl9={h`)Hm=6}D?nBke5AocUe?|l~IzHdJ5wCu? zi1{*C+VQ~b8Pt4p!c8B%i!G^HJazzY-TWBFa{N$Myp_r%9P}3#>56u-#gR^keRhMGH zSMO50;%=I)h2YiK-%@2n`}R=F(b{JsmMcnHFeolqX+dn)%JxK zo=wdyXWV+*-3$!yraHEg=9!U^Q4A~~=C2~+#YC}kK^lI52Y5U^sIe{p*ES@XD*tsZVuzJ!a278*jh&B37;3ivPa;Pdxh2a~M8s7?v+z zN$ojVOiBu(7TqA0y$+kVe`7j?1XPx7pr+JFeE7+$#PxL^Ps6ksQeY8Raebz}JhAERLVdbjTxca(F)wyd{UyXV5-oW*L zxES|8u;!TKZ2W|g*sx_0{7D3h+3zbmi1geDtsd6n!7Sn?Kx<+(Zt_eY2%k) zF2)l;&U_gAuuK%v^QF*@~#$uyH%a zkD1AF<_gimnQJ!Ayq!kTe0m~H5L^3vR4{8wpPMqaMEla&(;D~BeH33Wp4U@ue@342 zy=5E_v%xE`xd>l;_Kniax$)MkvF`h=u(xwiMQo{2Ra{)!Ggrk-v8-q}$(<>jtA8gM zG>+tW63(A}rYb*v%(+7{fp;l$^J z!(-YwQKp9-Uj$T89^E-l#!xyw_~R1@^y0GwpL0wW1bklNoZVMkga(?Y4>9YJaAj1KdzfqU)y9r{m0EKRDUaOq7J&v)_J$kJf$9 z{4%t3+>MJyj>Tz%gOO2Hi+eu$gs1r+?V)%SS6ASQmtJH!X9nbSfd$RQ-&^xJCJvdQ zUS@nu(tLH&D&_~kmfCaSbRp6%&tg2%I|;ch{>J>h#v&#*)&M@La9pTpdF~>)j8ibw*j1wLeFhJ0~TkqKxFD zm_DC5vx2_#nmLI z6V(1A54?pIn&AH=dB~S$KSv%;o-`USzWhGoJtNffe@_GThDP8QML?uv_Y9Y>9--N@ z@r$-bUrZyQ5%_fxus+e37pJrGKp{SYB$?g-@_le^6P+15s$+3OBjNvm4>FRok+y3; z)-2hM>+hV+2YDOi)5xCYSz_`c#MoJvOoF$cha$TS=hv!|KK{tH&YC@0MGrO4E~O7O zdB71<6fuvL?JI6Qi>3=f$j>Y0KAjMo3E+Tw<&`PqVh32IRQ6bn<>5lxWDolu?DDxPg>NNdv zQ}a}uhyxL(=bj&V&M|3c`BU?48UF82e09B)e!`O;3}Lwv+VhPj}c+EGFyHotVbN~*ZgrZ{usi##Gf|RXK@-_J6mTK`@+)s6r(hGp!h)2%En>vO zF(c2!_MI!Z7&O;tbLTah6lpYO)JSD+wS2`|UM*f}HOYe5kZt0pOWLgbX^EVqOcxnC zBrcqogfQ}-my&%(`EJpwOx*g5;pB(xpU7p zy!7JpBw+rb>Xd$onWUj*F=bK|{UD{m!QOO#r%s;DpaNA8Q?uH-W@6C6dpe5l7!D#R zc!0voG(4%LSktOZ8zu5*K|vAg5618zF{rGr=CwPhnPXbGA8VXBIhuZF7cE{+&AMo; z_-+BmRt^19)nnD_HMsZwf6zQKw8uPB+AQ};v=*grLY&w;TGItYA?D5h8#R<(Q)Hd1 ztFs!%Vya83l;gSzKHfg^Bd@giLPO{SFeX-wm8Pb8j^SNcw|*mfkF)3h^(xk`Os9WW zw_}okyntDfIc%OJNC~6p9>~Y+3#TDzdoq8&?Uf%eKR;iRDf>-@6`=AbrswxvGNix8 zc$2Z&#IX#7V&b@X`g_czwrK_Dr3phZOH55ok<&18*bHjBIw_*mcm`-2m92fUZ$DGnmV=5Kk^tLT5sb91z>A>JM1`qRFm1=!#)%(l&?0@w(2>$f8N41Y`*D z^u!KY2*iYkBb-4Nm<3TL`3EMzpD#=s`7%*7 zn^l|p=%HxxXXfPL-aD^XCcrT<(OCH9Quz9Mb6)x2?3r_@)mx}uf=)VZjMC^_yLN-p zLK{AuM077$ z@B(XUGA41Z{sV8kVa!!aWy&fp5G2VwGm`X0=CMk0gH*Cr^TPB@>qPVJQP{mZRn3Ly z=z)~wj%s`Nt`zkGMNI75c|YXkuX?H4T1cOU%0vHS z%ER5ssniC&0M9-5D90-UweX)KHHtgCe>Wza9)a)I?fr3iNZ*V{$;0ZS<>9a)(Z?+h z<#$vxQbk7Vq!IXa5$GO+dMN(7w?SWBBk&tQ;P8{j&uonGK|2L2{2Rmb9wNTBoCd2HiefrABySRePDDj#!eoF;bZATgNuE6zB1)?9GOSW z4$1WN;X;$njt}fFP<1voG$UhA4i_hOYF~)Cvcf8*p(h6pmR8a+b}4-PyiiELIL%y$ zUN~naqDi93lT-^MrAfQo8D*xHT6QH2&LF9#stzwb@gcG@a+QgJU~}$eQ@C)n!o2@3 zq^3ZV>bsn)lSbh8jDXVZ;5asEc*s0uZ@2(aT2n^HxUi53D0x9#=*d(Ur}MHbZJ~US z1y(&5hZ3=m8_GYCni<_%U#7(?%~hF9Ge*d;o*mP6AAg&h+UW#83Qs=$5XqJ^@$o00 z&}Y_m<$q2HxvS^gK$EB{wctxnPsf5UzMzKEN-X?(5gvT_32F?9rXIV)wwioXwjwXL zUX>TwWzqmPMYL?DmXS)P1`+}yBa2y7L1@zUh{l2iUvr`5fTy4Q zH_hw@W9JU~rlRwBS69a#xu;Gt`y5Lo(+q4cl&60!iVs;Z{x<(F8oVg>!bEvL5I%lPN>|G}^!ek2u_ z6T^kdC)nF>zl^iaoJrqqtMD|n4<#6c2?LY7mUes7A-zOq74l|x@)r85dJNZJcMS@Q zim2hW5$o5lSBr4NFP`xN%8=R8SJ9Z3`)L}Ka-X|Mg7F0o^CZb{T%eyLU%1$C0nZmb zTy&eTEKo0rY8Y%pk|}5at5LYgPxz7J%=8-=jF(<{hJlJA@b)|JDKk>>w|DbRf5799 z-j1|=TnzJNnc!4W-oRi6>5S;xr1~cj7qfFWLuNDO)c1Z==T z&Mr~zF67=w5-g44axX+{-n`vUJ@p`c>J`_+Auv0{uxRnZUrkt>+4 zr;0JSfAzWfjZjxI}*GckI60-k;L zc@nzolo|hd^fmU>Q}?2{JW)m8R0X^LSTfj-n7&GM+SH7loU4!Ynyc&7Ts=&@9Z4dZ z#se$s5mzR;EabO1z-;DooI%nxHE|?U(^ird`(%e zS^8!Y;@>H=e$zavS1?KxRY^h;$^8=FdENsY)U&V3=>8+W0fh|WU}~dDhDeqKuaTDz zDs>MECGWfY&>wmDPCw+K%)Q;odARN7tEmxqtI}HBuxSI3HR#yqGZj zQX2A5f>_9Jjk!FOU`anD4|9+D-R(V}RI~ISjetf#BcKt`2>dDtoKOuoc_@${`m<)A zhWT$VM*%gyy!_mdlUBr_2PRWf>17o)%a(k)9wR3WLL`%+*sTPQi3!}dzZ;U=Y{>VH&R74L7;{%*CCd^2{f_GLTV@wVMFf^e- z9(1}F&+_)Wt+@lszFg0TC3ob|x%r^s;WRBBprV&Lxj5jX*S~?Ar?WC!?c~FgJS2(c z-Ka@%_~_Neh#NT&S*iK(4f0S?R+~ujRniH%i>nhPD8u~szQvpWoKFlcQb8&NV`CxG z-A(iuB*HlC2hfK;a5)|K&ak@U7f=aNA040iuB1qGl_R0D-zSo zcqYj-YTDTOx?_884yMy7_$>PDd13Ke%=5sA&~O!G0nK|kH?A;|99&4s!qQl%sO=v> zN#>LV9n)8oQR|M5=aWe~+WpzC&%<{s7hojKX+HY&H7@e2;K9Yz<9|01R&y@< zBYpf_Lnr$GR^_GLB9A1AW`i;%>fRTjB?~hl6y=&N41geM)0S`f*Po8xV;M=YP#qKV zcp>xJu#15fTpAJ=i1$Byg$tgWc-`yOB5whM1c(M&b8|P@sA@R!k11MeF>bqM z7B0N-eELXx1|O;jq@c6@W%Nrl8P1l&>7Oo%e&^1^O*dUZ3~o`C3>Yv#y$mr0VQ3}E zVM~ls=}7$_ikN!#na8no@yiShF`a#wiWZuh*3#eHZ8y)R8J8cO^e^Rtx?T}VcGO-< zPRnJz2e<$?IVEpqbVW&9*X5~ixo`c&aHGO7UY&p7KrVes4Z?B;1W4>Qzg)U_HBwSi ziQUUMebNOCS}_CPe!GHx@V=qe6a9oH3WnmhY6>z_gg~lLq>{8_(Gt;&+rucHvHWgQ z!4tTFv(B9+Uo<1Vfqw9=qBfw3v@|r~WZX+%)@|Itt!gPsv$?U<2(o2_(hTkuQPbyi zwdgD?C`VD*4jzj_eo2$kS~Ij9ckKEO|9tKhMOQK;rg0 zZj=K|fvBs>B4HcH?P{g1SX@|xDbq%fh`f;`7K0JdKdYmYyDA+S89{=v7?)o;TkXI9 z&SxYZtdW|Mul5g611&yoFi8X8owvTh`0=ALl|JJ(ZQ6=GsjG0u?SE0e63xfiB9603 zlO|!*uz}R%spQKj2j#?GRoMN9aH%m>Thokv*@Bz6d+1W*T(&oC7IV)|3>k91(kgxG z>3`8&_*uzf;EXGJ=9KK4@DZZo@OV-rXgA;0N`gv!#Z6#z%8gr=(1iAnN)sz-*Dg67 z#q7Tj+;UGOIEVz5ux2m^{oDDwN!HT4GBu!BJih?TrmMEt(<_0rpKr#ax zOqeu^`(ga#A}6yz`Pt+SO|HwS%{y9YwQX3p6Sv-SBYo+GkgVDw*?95!2dFU?$iNM= z)V};l-o*e`;o;r;@}lC9BKG9Kw!~uomHF$%Ps1_issuifB;(DPM=~}9TS;=vv~7AJ z5ylA9lCtx*;Q8ktR`)q+XEL?y?A5%SGv~sdHUTOl#+pOzx_V$xJT{= zaNc?Q)tDCY+?Hm(TWR_#N&FxSA-{rtj3qK}bHf;QT(w2+e|OvD`*8bsS2-pmpo#f! zN`K_xlwR_%obqt%QSz{|4|y2D_GM$(a0cq2Z1~e{k79573I;uxjz3&?Z4WtVyp$1S zrR_f~52qX@4-1Zxhbw{p8AhQKqH_L&L!l8t zxOML3O2ey#gwwdwhao6r02el<%S}6bJYt6oL|I9NdT^P3-b8qKikdhuVaiBFM2XpG zIQ>e5ga`5g$7DKs?On6D4);*y40Uqjnm&G>xbE&*G~04E<(pO^YFqxC!D~dvhw*KH zH6mg{SZ{!O(=B;3&OZ$?^exv{-sv;P(o`mhzD#NqStr_Wt=)^<@Tg$?>9IL{fU-s* z{nW)JL?VoRmp64DUT(PdPZuDUffb~UlV^^hX;D3+6PnsDrm}IvB5CGYLmzk%2qXb1 zrmNz5<$Cr*2sr7&#aEw6e|QC^2YG3%P8xyVAp-VX2&R_R;DPBAF>^?QdI)!+dET5c z6L8V+QHzu902g})xH~#y<%55M9T&Vi4rJqAF5W-fyALztvvK33 z={O@c9!@Oh;pBq1*R52jNTfbHl0#gMsHlBy+!x<*_BW$P9Ht_a7xL_@}k0 z6TW^vxO@5?xcK7P)HZ6SbL|l2lz-{6)vENHZ@oun^!MQa&8I4>DiIYKMf1Ya9`ehc z{gRKgfrdz2s97pMK{o384a$s72$hVCOq@YKK|8l4EB{my!SUKZT!wk?&c|q)mx}qD z_+s0$Go3Qf0c+Q;!!5U6M>C{zShue-i+%XvxpYdt9Up)8hBAL@q{gmjHVN5gEY`Za z2-EdxD#>=l$Hg&f=cg#52A7x=%7SrDVQE4m7g0hj3 z{UnO2Bzu}`ws$zHZSl(#8ykh&|9B%lc=t10cf$=_fQ_avCnsu9O;wRpGwADX!RPBR zG$DXw;!3>w@;mhHG>wbqHbtTc4rzO{kei!Ne_YcQekSwH{$VIlOs~K33Ox4k%SaeH z1mCUroB8$JleV^3l)o}L|EVWlpyT%W z%5=_!W_&4o7AQ?f@!5C5#b?qd+-i&;Hx79WiXmgbfk8nkDk^EZbs2p~mE#}(`k2=l zOiZ`1pHq>ZoTy$NiD}wnk3OUP0514+F-fF2jt^_N(FE|t7aqsIEuSQTwFx&+qh#KP zALFh&Z>JOZ16=slDRa^-TekB4e4%ic=$%K8Gshn79EnCK=AYB1PT{?4APL}4ZN)}> zvuGL5kLQBD6P5L)%IW+#_C?Hezg_+{e}7L?^>5#vh-DmYS)~5zcAG^y$dmPqMnQf@YkqG-LI}TW`Oo@+G3Q+|Sc^-_!Q)S94kR z#kbrQb8exWT+!!TopZ&doNI~TW0o=_mC785f!trU&G902)AObx+u{Zd!mb^uyeC%l zX%|CHww3g?C`6eJ$-=FeJ?nfDgBeO|(w{FZqz!?A-dMU~yYlsU%{6lv^?D5FtRo3h zE2Z@}pHYr4zw!bsUicjb4h&Pj17f*vVBYpG@YJ>})Od{Ol=ii(SsJS;9Lr7y)9Bv4<&J%4_P z5qXF9DGwi|JX}n_s3%q)+V=Y0HCd6U8>|0l1T+E~0gZr0;8#Y#>TgUZx()IGD%xz` zbkaK@(1&liT_I6C`6b!+T#z9$e&nsn^rnU6qr1<@oXB`7_Xhv`Zd(B)X}bD{nsKm;`6=XFsLA z>P;W}$^Qxi(Xf+`ELh#>)L2Nip8l}CQm+StFvxjwT)w59(jVCuHGD6Ujwg~Y}n zH%Gj=b1yutJJlkzob}Axv<~lZ0c`CS1aBJ)6fkn%#yo1a(3EdK9cpi@Y(jve6;cWd zkj6!s8yAPYo5`jrY%Hw~;oq-34o7?XkfY2Jlb__|WST$yhrZKN=)WxiUw-{1%1X<* z5Ok)gQJ0FWc->VG&?gQ3Y&AI|V1P4nbMuh6F@tkg7W3uRD6RT}+H z#WDir=_EwHm5e84{_nU4ke{IC@DMgQ&h5_&az3otyqmUtGAHkr`+X@k)SZk zm#@I}H$6okas%MN7YbiLY<%E7I^GixfuxaBi)YiMv?9fTIXWjZd42?^m zR@qvbBibsGZu`ap*gIKMyO~6cMLUX1im`3$PRc$@%3TYTS6GmE8c5l0#X5^gitVCV z8SiynEpl>lxv*W2K!1Nm8_n%Eh7zT8?fL?0DB9!wx4(g3pbHnww#Y9iz>EL+FJ9nB z{4U*f$JHcGBbBLCZeFg6TqwRvWx?3g*oDHvB6#yCvCi=pn3EC&0%x8qdZ%LTak6cO`&&i{&C?679Gz)eSjmQoLEhtyy+?Fjn zk(=L1jmk)l!%h+*x%5f5TamnSowT$JtlwD5eynFuo`Z^r6|>XjE50K^`w-2f{YgYv zGE$^#ALFcxQ5F-Cn|TQDef%6vf31kSHNU%*Z?ymX=QWbG%c)5jpnSk}G~2+DFMWhW z+`2Upjdda)4#CSa1Rs2~j)Xv`TKt!mmeIe{ON`i>%^`D$_cMu@mMU}Eb;M%*#y!d( zRefze{R?g;0acHUG$&lMdSf5s?C*$)2xX+!T#nPEqsD1*Nj5dR><~iVcmw#`SxIt! zFC*;cWan_M)bgAXYH9AmUTU%z73R?2pM#P+>o;t~U*|s0-(q)#OHxt_+S*&Nb`|HL zw~aCvUcO=nar46d{n=Q{xfU7{Ndh}j)$iryspi}B|9XXUJ(+WTD85*@h*3%F_*+k( zl$iMy#A6Lf($BYV#!KsWB09+A zhclS|IIGx4iF8^{StK%7(Q(`733s=!Y%6w3r&pwQ%RN zN^f~8zc1BQo%A0V$jGvl3{tZYoo%j)gg#j5LV~7E-OEz;M@Y3MYNKu3xEWiwZzNIf z$NO4Llm2BS9KG=Ag4gK_u}ZyI5SLYgVpj>^+ z7%60g;*^whEL`*z=W54Mb5){`rl##90a&hlV6I%9NV(>xA|h|tn8)!)A9*`>kz_A{ z?*J#d91smzYN1hka>dG3_|whLA~47sZX^UhdT%)cYgtk=*iJ=jUGT-%obP3nmpeGV zTc|aFjK$PrNMpm)oO!kE(RNbyytD zwmlpi0>Km9-QC?8++Biu(81kZ27*g)cXxMpcZc8*oP6`1`?K@ibN{U8neMKhU0tN*ns{*G6^yDNFy8n>O)e>+o^b2}s6 zHl67)6gSqNB=EeFodnR9*oz@I;@cFH7T@{X^#XAi&c@2K%xSkZT+#%gRcE`*M26D& z+&;d&(cj%3y>nsf`A3i+;bG|t2BNm2tkin2huU7xcQ9mF?>KAZ1ABT>!8^h^FFQri z^wmWltohM%g$IH78OH;ef49`Fu@hzm<&cPO+GWGEZ&5RdqWcjzF`l-(-o9~jg!3@^ zd~|$|pYm9`iLdQrj#sy>Q{SEeihvcK*IN;SxeJNKC8P?#rHg~we>TEk4r+fW#?j|3y3 z-VyoYcd}Uem$R;dJm;KCHbo3gX=jyv`F(PLP9GLCa#`h)18`o%jq#Lz3($B67k#&I z5JXf1bM$Xo%CF++pGC-nC1i$lR5v&MIyWVIhL_V2&t0u0R-JDQCo+8m%wR*KH4j=z zr&tf&aR8z7(n#UcRj!yxwn6nkNDlo~IFP5Yt4mD-+RrZl0bornHm5tOYq9MiOQJ`T zHYL|P>Q};u>+nw$#)MwBj9AeD_jeo-1L@tQ4Jvbp*Go2j{WH1u&VW0OeZleO)JcJt zm3nHLDis~^))1$xek-K~(?w1a!a+X^*R7-eGm|1=dcLG&E zx#5%B?Dxx)_!P=$MtA>~`Cx8(YVl4vG*!{rJlS=sqZG3@{H#!<^uCdd(}^bW8GVnB0)Gwd6Op$Tqeh4?lrZ6WOy!3EQMS@7PV=$z%T^v{2AMfJb&yhX@7%CgKgwdA0*}JRDh&=t&a# zcqmOfj*b`do>2j?aj0Eyxd3X8&4XgeTh>4JCp^pZR@@OO=$9#^{FWW0CG~gEhA5yI z1o8#bt)d$Y5g|_q+U{%!s?RdwvL_C>oTj|*l7)K_!?;ua&{M zDhM}!zlKVpNg_6!p7nXfxlT@4x&Y6osi{BBcK|d$pzRAG1nPSlJ)}y041Y`=h<)Zq z_<|kPv1c~{m;X6VlWFF~6FJ`dnFC8ZX&eiMl84$ZKA#lDN&^=+-1hKs8q(3XN_xEN zmwF*o9`$)0vcvj10tU{nvql^Hfx1pUmXw4XiF`Rz8<&<8Pr=+L5-Um8oLPxkxmDT- zWyyU&bb}LPldACH;kdw0P}5s@4qI(nV-Z4`Pz4Vv`LF|#u&&)D0MBD#7=lHJ;S&6E*4zdfAFqeOytypOrtnWs&T zw3D)-Q=x7)=!0fzH$Q@+9E@=+{X6a@J4H{F=wovPY?F=_!Beb7tba@u6mXywa3S2r zh)ej&(4Jz*zVl1Jr9)>5yMz;IkE|-6=evQ3ktWG~2AM|R z9NYD2SoLi2GBdhg7y`G4Kc?vA)+=EitR_i^H07Ez2|Z922Q<(@4L1xGs_eiGYkKS-DF#sdlp?e3g>6`>whXr~m z+_S$^cfFIR`hSVgDwSo9ryJ$A+~u}Z{(+1glN9AfvJOr493D|i-nw-2om_d;&I4tj zIduc>hK@Rb=%7mmWV1eF)JgwqeTB;^#RL6qU^6Hwg_vS*!(dHSb6gmo|7cG}G~*c1 z9&DS$LiW@Qa``qPf3#f0QdKqVD!Z2WBJgon&E;^E#>UMl_b6+29hdp|@tU*q?B~}* z-N7=(zJ#3unY2UfEIU+?szYb-w?boN^V=5OtZ35tc%beYncY|XL6@4?;9vKEGpk>r zMQpZ~(07=RT7NGQ1EUG4v5yk|gDgNTXN7i@|>ksEcpcdduxm1^a%&Z8xCXLjg ziRhYI`G{Vrj1J8)UfsRca*E@u9GhA`^7FSzI_K35nV4CV&WZT)&#rq|a@RHosa)au zJdBU>a)&Tv5u!|w;zQmTH;HzmDX(PvdTXR6vX}K6&aH;5N5RA#{)w;Dx3$H+b)y(D zj(L|PSKUcmM`aU2X;Du0W|>Rl?!PjVZP-5rM@cb~s+Qpuv+MJ+T+M!bAK7lDq(_TZOX(mU7eJQr=RPM)gUG7o6m6%(US- z$)AIWJc(~fj*Q^2zRY2^DqL+R8Oji@$zG#wQ30I%3hZO=(WqI6o6f&@mE76eDu{E^sBm79<-tvt@gs-ibf`TX1G%zNEOVE%{`* z<&RcJrp6gauWv>wlx$M$I(5%zIhwG!q}zYsQ3xy8GuoD8_+70jwBJ6rrX{CE^|Bsas$etem@K53L(M_8$mVoM$ zmXQ@(&<{3C+^-`|vAv8kpDxWdouyf0&+~99z_}zw!Z|3OXhpKiQY9!)T=c_9&-0*4 zmvR#F94bZ9h}A|gpE3K~?NOJ0Eu?A>w8@wYp9h;uPB6Sn@Z}xuGJS6DT2U1KM<^MB z-6!%NgP{z`o&u(ij30SFGXED~4-c95^YF}EagRYRjVI!Y$oW=&jM|W^Qx4&d(`32jRUE{pTcO7B)fEephr2z-5@iaF{<=kXA%p5h-ij z6{fxn*-Vgsa+rY9$(R4j8I!_WLSAA8Xd8vwweV!sLtfYs=m!3`R`|2Ke~HNcLq9us!>97U5gKZPAM$U$T*Cjo2~L7_ zpsI5GPxt=O)B9g<{D07*e=c}pflkV1RqvX7`1$kL;Kf8~TSy~dY8ku+eH5dD(t$r^CxV|6VA#o~O>w)nudnmPcex4a zZDgVm;w)H*h>0n%dL;s-4r+nMm^KDOBUt@f{ogfi6PpT2=@_sqrm~^kP&B1yzRAia zvqTlRmTLI0dHQj^>%fHsPca1BpX^%-wkg%(in5!A@}A~)fP>Mov2 zV9%?uIqcQNSp4t$zW+ONRNo-9mvOo_&(d`g^i>eybY)kx2?N8jD7*==R=lR;rq`bAbF4J|aLci=0qWn-Ex#v3#yB6Yb61Tp8%z-o9`FMs zyV$!dGKSZ6)@Md++!ExH$PY5e^P|0qJhJ*dBzb^=AOAQvQbQ}Wz-F>Mdy!Amd~Sfx z?*ch)1SggTV{*hk0u`=I-f7lf^*XEn$DZ%jnd&bOh8XC2QAN;v*K0sQPFgbV`}GN* zx=K{Vm1bnP7X-7uuImv>KU~=+R0jLwF+r=kzMbs%Z@bqKcKznADm1X(b4_D?Kyx*f zt!>3u9!i_xmo->5^`*Y~b%G{#pUO%rrS+vHjWRh8D~h#s-W|RkM0t5~*j0BoMK1Da z{NNH1qw9M|O;bI2VCP)0jkT>L1K7Wlf9K%$igVUdGN-gYa_k=mXE#ZCAc3A<*7vLL z+ZOE)A~8Lsp*;u`J4mjbxm^fWUUf>7fFH6XXlMk{@z*_MH5{oX;2tHrMkN-YmK%_u4d^b z?w()8>?r*u{A$okBS3*iHvA8xJ`}CCYzRa;3(oMb1Y(JWQNYydy9wQH3n|_%-4^Xio)Bq7 z_=lnA6h&3?^$#D9rbAe4J z)LYMgbi+qvJQ`2#iEsS9|3b}3+b>n^9TngRK}}a7iuk_X>cz9)XJbJOW zK0BJMmu$B*<$~5l@ZK+MRFn*tzqg4#HWqAz9s;Px=+uWp)Dp?PTk zdhnAnTFZMc9cl(@EbmJh#s$yMmZ^rO!eo3mQ#&hwXl;ExqUN@%Ah=FSV)18-V>N9X z9}B^=b|LrUEudvLJF2A8BER7*8dy;(`mRalU`^%#$+5H0ApQ|xob*+Fw@Ruyx2!Zv z)J=Eb2l>@XST30{X2QZ0HFN8#L<5z*N=17~n+yoRU|rt28iLxm)UyMz@Qv*dp;l8_ zL*hXb<=_}IH_`qR*aCLvx0BXkV{BQ2Q&q`as03{P>}gGzjWz%#5^-$zXg7K$K!hBQ z;VTaHGW(WRxIgU(LvL@L%tI3~J84aECxryuuEbA$G!1=*R>X0s~T!NmS&DvjTx#d|!iaMD6ap#soyL<5asN_}x{^4ia(~$5& z7)8VkCJx&GfUe{TcJ-0Xxy)T^M$zJ(vkl(Kz7K9iO)L5Q={ABRG*$t7r3qvSBnWZNpAVZo}d1gQXVp#<(Z8{|pb0hp!U%u`GqlZT4 z63!*W^5sUj08ToZ$0UuH$v!;RX7cDY>!#}A^_=O2xTAf69z)38X7X#RG~&Og2S&pD z3REcXoUC((2hBhUROv2~%pyGUOKrxGbkLa#CYL%gSp{HXP{9#eAr&?=y#!jdp<$}c z1u~*>a;3wX%NV^66@zGMAL8>F(hDy}#+{IW3q|8{=E=0JP}j3NgQOyM;6Z_prH$3F z{G(o3!@!^4(*4bMT=64O8n5zSDzTH8QTG+W+G6wD&yQFuY4og&MDx!JTmc@!VtKsEsrUPf!IfGboO;GbvD+ymcCMzqrdDUn(&nJ1+wpI< zXK1lQK=BrYh?EwRkloBX9Qn`!JdPV&JRLb5N0}MzcbG|jiMhc6sqf=uoh`Rb&T0nztMVh`G-|;)BqcGt56%C>RF4f!53uD~)pE7z zYTWN*A;HE{6~~yzuhY?UoyW?2acNS%tBk>QrW8faauG9?A7{z_D+U;0yx}m=@m5OE z6?KgmOo__C$lUmykOqnp2_jS0aZ;lBIWUu{M&Fd#@-d;nr1Y827$&)cEK!Ey&sg5X z>T1LogNF2aqoHh%I$j@!8GNwN%7LXrN zZy%wtkgPNceEFlWx4rR()LDtf-H68R1e--nKcuwJVD11-<-syqDrfuhgNrgp08(`t zS1~|2K%~F_>oa9a6ajj~P8ig8d;7SKcL{9XA@L@_R!<44L}&z0q1+EC3%-Fm1Ay@s zudN=^G)-=+b<`YhIloqvyiKXXI2Y6xp!^umL2i_P0>*wxZIil$AA*H&xJXBlhZ?qr zF3GH}Br|+p)qom)!8WgQA<(sulPDx#PdE5ygA^z=`ZHP!7mI2q3-uJ;@byit0A+Kn z7-`LJJGq2+DMqwVl473KG2TvT-e|)trskTmhF-+|=BgykXBwH(t-vx}r-;+a;%dZc z6wO2Z&CJqLtbo1^6(mB!AR~;tTGJ2SgIIcTQ(Njij68K79{nvDFjeqxHm3h4F-L~z zFSB+ip-R4*)GR8_jwN5>EyF=uj8sbmamu|i{baL6PU%a$d-nAu(CE=2ywhYNv^>a9rQ@oWa-Sv{& zyZt-CmbWW}UT5ac?tUKq(pt;Zm%Q7F3E5$z^E1=mYYiwLMq3W9&L^|s80A%weL65| zRFf)E^W`PcPFfjN0lt@Q?s`d%Lz$eI63>TP_p`W#5XX22Q?Br%D_%zBW%GXQkj3PX zRGI#X;n}PZn*#c~ob<3k&uEiPgEYDolC3L5pE5}E@y$O932Dm4 z2q40GE{KEfnmJTK%w&4ck?*%#*Lm#Yb!eUWb zHzwHD^Dih=a)UII85_Pl6hguQxCa4_G*kN;Rr5G7z>-pi&4*N1IUBLnZ{5c!+fGd? zAIw!0HsZBO=pnK57SZa0TeNg#KM&P}f92@Jji;+kh)_-A!!QZG&^$WyUkHRvJ1_yn9v^Q67sj0Ubs}ALKgFn+D~J5+Ec%XA2mc=^VhQwG@3k%Zj)!U{wfIl_ zE;mqANS&zq=xQWvJc?=Yk=Lky&6#e(MECx;7J%R%!F0<|9M&14Qo!raiR6Q1 z>e%uT8>OVL9M;!?t{x{cBI|CB^^1j#umzR#i_5-O7NA^=fV^Wx)v5oqqjC!~@} zOJRi~1UQ6`_^#Jafqih)48jqDWa*xJj~9FA=4D*ui|Wx;{iYjajrsrgG|ayNB0UIV zJ)t&3^HSnFA3PY$+^pe6MGs@-U$gE}rlv_GMPR=|jS#J3$zvCZlbT5TE`+7!mriw^j3W$(ts4Gbs5s5-WQoP%-lW!_L)fp;B1=7h zjQJgoo-7e8ex=?|$V6QY*rV(Mc17x|*#xK5BeW(xB5iTTS$j4DtekS%K@o#mavQ=e zZS4;FqqbGrU}J!zI_+v!kwO~^u!ia)=C@e@nZp>FLm$VE=^WTA zc7M{(J2t$9SmHAP`=GR5lJ4~$Uea*&vK5Qy&5Z<7%%|2%mU2igqPVq~ERH47>M{*UBkF&sJtTkWFAs{H)|Lpg!@I_SXlTLjxwj{h`v$FI5$ z$pj6rCez(p-D$Nz5~})7bXY%nuOn)?wNzkG>@`1^2m`Z8;7LtH6IwV!0^U z$+86>M`fBS!IfX(JgrLwVD%f8mTcMqv&a(q5gLd1`J9k88wEq{{F0E&IW<_v)nZ*C~Km9lSD*z+LpITs~?HtwC zp(H=TR2Pp)B(M_fMNmhn^`aL%b^E-j<1nFOyA)TiI;>K}yyWh47`3?cn{K-2tWdY+ zE$WMP%o*NE!0B6|ygWx@S(%BD*|Tm07Yge7wCeOYfbl7uB1g^nvA$C7qy;9qccQa}j@~ z`uha&lP~lAemuPM8ZND(w}>p|iGnrgln>nnmYXTsla#`p3S*QI%HTYJ=wBW@b#K~@BT9-z( z-{PH7hkQ(w=JwR`{G12)Ccs`W9Fd>u{+aBr7+4HjWx96F#5ZQkjC{HzzZqNzFVp26 z?Q{1M?K~NWa~L~fl2Y2S?#w`ApTs8gsI{EHD(N%ax70xhPBQ<0ef_T{6&?iReTBZ! z=yU>LsiQmkXkZtZXO+e9I>cg?SZk-_mmWww#`{`KuAZ{Gwp8+3yihnj3;)JM>d=S4 z4OKvtZd-(~`B)*iqw67vOK0(plnm`QaT&NBrGms z;C6tZ56#DfZ05{-h$)6&a_Q^X$`PexWSzK=9o^g?^^)*9p|Ie@9Xy=Za)+7{sGo3n zUn5*QVz?6QlclG5!^irNO)slS5?oV*!Qf}Yn;1|aue&?%e#88} zOVY*`@u|;$$5(ceM8Gsn@kHek!6N*dD=O-|^lUUbX>m3AK%%Ao!%zFC>Ue${lk8yf zvhp9j1y(mL`+s+dnmlo^OcOzA^AyDH=YEdT=&r zSeDp}eUGO?Z>I0jf7Dm#vxS<<5x`mJ^a;!r%U88oz9cQvQ-~L5qsdpBZ=Xv#M zul~5kCDHOawYo7K)EN}hMm0Hk z5l)C%!R+c(r%Im3Go%uB-`Q4&c7q`Dbm!ytec*bRTZvda`==?mLi;~_Ckiysv3i}^ zD*DS=|1zYtf*v5Bot;eiWT%3St=`I@T2CQdi#`*xA|mva+U~ zXzS#kpD2&QLT*=ITYJXRidiQE&p@(J;3Je=(1EIz7oefPT5#s-)O5}xe_QxYK#*l= zbp{r6MKm_aM@2oU9(#ImC!?f{1ajxr)=TV?kT2h~E7gDB9(ZdaU}RJnm_}RDV28T+ zt@1<47fH-2cmoPBHKpKS3~kLL#e-`8mtZwH5TqiP&JG(Vc>4)f@+rTyRDV#xb77J= zvpY8In_1tLtPWff2$Qc6NvUcR`+HLITMYPpZ86$!3Mpb`(Wv4yr{@cTr~~#`zH-mP zH7*4)_Yz@Xv%07Ui|Ini`-gEA2Wo+G&?(NnR_-%i4B!Pr}>Q%n!cWhmc8< za`)Z9$*UIX6I^6T%juM!@!oBeo~>^hag&m6s2f;FZDWVR#;OZ$9<;5y{m?wt_dN_b z!wVOa6Hg_bR!J=PppPraj_IRhD1;w`!+3_+xCrZKn$bopvwEGoN%6WOPqT>X7PvJG zhLiH2!N-bN^-%`bbpD6I`eE@eZg8SyCQ7#S zjrI7o7K*Hdo+sKM;HuWsV0kzmCX}Y8#med$vE3DEpmFY5>+x1tQt836VR0g69hku* z>w2?BP{`p&o}E=*sRQx}zTV?a(sP`*ifsF3dn35w|6eSRVSDxWYVm-5}bv^haDJf~UO!jZ2KQkDvjNr`ms59*ekxXw0 z4fZhk2o!JtI#Oyc2h7bmO=P`7mzCir4e7tl>5p`xP~g!i_! z@$x^-BvLb!YEahQZDqwd?n}F?uqli*+JEa7GrmAwcYz028&Gb!d$Ay>`bmNd9?cEu z=h)_yH#1{|k9RGtez4isZ7uz$HJ}&?at-<+sdcd}A2+}d1>)vaJykcV-aHyynyMGK zwuTEbG&BOM=7mSZ_EMxwh#Jgl$YrC39B2DvQl=|R7=|}AuGd;=yuYm4&PCJ)eZU!Nz!6t1iHdK0-j(C{N!o z;C>-FnG-C#7BD~%AtPqDQj=R#aFk=&)!4+GN7MY;cOB5Z6$F{gm; z^yOZHOKaCabG@%zoP>)B#p}C=Huprf@8t-O5s4nUKlaPjN$s6e@_ntx%2PZ9~YDpJ||Pz zlH>!5n(NIQPG8?+dFJtfoV>O21nV{Cc;-{ghs}+Rbd?n$hD<}7kDFz;7|p*$T;!70 zx?a1mp0gr6u6#plW|;MyT2ZZvF!zKsU<6yv*2dj?pg6w5P*ace7nJU|$%^0c!O>|} zQX09!7Rj}t+Hlbiz+h!Y<$=)oU!LBvF$L0~Q%2PqUJJ6B$XbMzls>IlioUFf{T0#p zc)5K0WIZq8#D}y`72Q9j-|n#FF|W2&a8qAnIZH)8B-e`oU5@+$h>FAy*EI0`CNDpk z3fz((8Iu?Bw&e#5xJpz!=(Tu>HOvgS>B_5yU5|EHew|3Q+tB~WK@9g0U{mNpmQ z-_qfwdjd`ZplYt~zN}$q>HQZ35kM{P89Li_$<2jN~N`A=! zppS$?XL7uE$PYXpXBSQgHd9fSI$;cDi_Omwb8A!X>??MWFocwzbtI;9LO|LnaWrQPa$p|(ho||Wr?yBs4V#&w;{i`y}JMngoO5zPjHvm`{ zN4#vfIWB!6D2<^6OsKX$b0s$ySlMC$`Z!zo@P}q3jZWm8Hx;7sd^o3XE&SoR78%XZ z$353|_*Tq&xidYAyf|Oq62g&k!e`0MNtq|q8x6y`z;^aFI6jF@_jCzt1u!=^J}>Gw zj!Ra0?cG3GkNu7P=S%zdVbx;gqHf^d?DZe_&+gr?QIj`IbcZh)FRG8DRff&)D|e5k z#?GwgOD0E;j*4bT_fp?7Cs^jU+Z2u0V|H!${nEM)dylnpa^~E9V*iz`Kbid#+HRz& z7h2o^Ra^)bza;4bb@`A~ZV&d$&R4W(+%#dt}7-oH2+cypldF&k~9d$~K$+acxdCqATf#}9ZXjas18_hS_5Jxd=k+-NnqR{e<0t2&vpz zo^UlKDlvgaL|lYraRfU2`rDR{8&X}LkBBfY%1HZLyL;9dxJvYQetJ*HAXhsgQM+01 z$aKk%_54GiS%2S{v&YLWTh3O&e6#!breuA~1~vWSjKu_2vU)NxVsf-Xx6KiBmO{nt zAz9nNuKoG#AjPxu*HZhx_H{eU|D5sahCO>p2geQxf)AaQ2IrOKak|-ro}-nqO^&@m zPSM&%(_Ylwy+xFqgMnawI7W;$Kgaj})aGo3ipV$Q?2NYK?TigOommP^i!yLhTzj-B zg1K(*(dhf(O4}D%j~-K2TwG@4CGyRIl#PHuUUfx%eW*Lc8apY7e-z2O=0jf%*b($2 zU$J}Hu8sX*JyxP(bg_({W=>10F@!9osAd`Kn`-ltbrA%MRxKnXU@qG<-{t^LQu^vF z2*XAjQzpzID&YEH$8{84jFkD|jeMDXg$V_U)fqzr6IBcYuL~&e_B|6MJV8vZEq8)0 z-ByV0$`3-Z{jgtUbr89^P!9X@nmauKde&%Q069L2v`0M14lHS*u5U*WUA4CQ8IH=P z1-P2q*_a4{(KfS1qO1Xfm5APubh;zuy%9lk-b8TTx*0qaN~wMfGV^N98B%0-gx_uE z7@gv505&L<&!G2`A7|>>&I}Nvs&psTGu)Q$uFPn~J&`DDO?mx3mnEHAkjVDK2W-mL z@}u zL0f6C;+skp{6f>N3SbA8eTVRS9^aOh1Tv4E60WGWPc06@EE_n(K#^wVj}*LqyusJ~ z`Dwhe1I>RI7w0&5h*f@4V(8PD3Jjfjt4p*uWWXU7ozRbybJ}pRvw3p&GFf^)HX6bq z|BZXLdqvb!QY!!CdMX2)3uOAXSBTq+al@-^5%9ImMU zivsY%+S_z9=rc>%48Og##!OD$9iy`_dTBVNed>iHsur(l#B1D7N5ecD6}%*EUW&MK z^^V>&WE5FA&02tND6p#d`l=MI+3k%P^5DV!H!j<|1lSK6;4%U;fDy+Mc@B8fx^2+` zMBX^^OJ5nIi`uwO=@uUg7v$c?4T;2EuElLP>hUKHFN1XTV1}gl;=|D9caW`zfV7j% ze_|yoraiEh2F~BsH%5av$+%{5V}34lC9W@HH4h#8WFzB+iNO;sBYRaKB zxY|0eq`I!~5csW+J69-mtiQCZ5whn&Z5a)3|5<`Xd=v88hQO8r0)5n6)ipZZMw2(l zA0@9kmocBv``}0r5QIobazlg3>+_tmQ9xwT>k_m`f}Jzu>BrO}W+h zK^A64%(TmJB&o3FWTW%RUf&MUQ&x|+1qwI#(nnueu`0P}+>8eMuNl|+KxF8z@dDj& zBAzj!rCdq&cUjBow#bqXl(!0s7ic+bOXvG+i9Sjw#&bixUM8QKn0}7)B19`8T@7@S z&5!b3*?eclc?@%#qua)gUaS1L5!|gI6sLF|<;zKEdJ)F#?oU}@<-|$$dd(g(eI&7o zUGDhXuYrH`eU%sMtl2SuKY4>DV}r~SHBIrTMy3hQdGw3QZ>?`h(x->dJy zpg^(tsK*C;^VL7wNMo~gETqWkR$(>zzUoXR<`4trLc~2f#{}EMeuE%frK>z3XQoJBGobSl-I?V%*UZrzKz|b4lMLts;dG+-9Bi|^0$2fyFX7y zomHGRTj$ohPkdt=xfTNC=^f7AnnaTLvUa`Ks&%DXml^+D+_wJ8e2mG(@6qlsEVex3 znKKc6{Rz>19@fNKlyXYw@HPB?pr)*YU}fjHKnrgO)O#FOJRM<)&xw!ln+x6HQ_K62 z1|I>C{CYc4m~TISGL`cS*T;)>g?2rH;qzE2bQ!wx_KdVmJ(lC<^xsIUMC80dbuMJy zdq2l3qH1A-AB^?ZoI72wgaa3DAL%Ry$P$B>I{Y64i4!xeun4oGC3c@p=7PBp&?V}e z*u=9sbhhsmXvqVocPR&&y&85wZ zA+h!|7Z=B9e<1eOYnZEVMhI=Y;oTPFi=b9xJv7=;)BCzXi%{01s5-ojO6|Sa{4hRR zXr1_h8*zL4Rjc7d;_WU0D;n{1vU#Joi5DJ~&A;c{0AeIGk8uz^JX*OH3Tv}mtCPJ@(uz^)E7Qpdo%JJSnFVIV{Cfz^8$SMTG1^=pSj=uLq zBOr>c`tuP06RsZiRf<{$8ci}pFw^MBQi-dKC3eYSK&bWFyj>?QRxzJr9&Jl;mjiO-IRVye!gRdzUA#_dl+YO(yLZO%tq_b9NYOct^}eW zg#GTpCM=d@V$7hIP=I94#$>?m-x8kyEE2SXEW&HZK*@Z&JH~7^#csIn-;1zx*jos+ z!FL|by& z$d5Ht>&8FrCB-&OemmumpMN*S3)K+^sZf5!dDT{Yw269Ug887nld;|59Bo_Pd?2{z zRmQoekkDZHRzD0Hg>NGSV_pmqT*6uz+zENat$}E^%$%cJ=o|bU*Pwshb2S%8yl19)k?RlnEuby@PiWU{>&CdSWSe~?4K`LE|(HqC2F zLH?ycumEyykr$lDTGEN-TADuWJ2Wq zgvRjXYYal$@Q!jvkGDwi9tz6{4{hT#N6!l3yL{vOyLrHuHagAvks^)5mO<%?qsP7Hdy8bp zT{dp(%5vNvnk=mj*~^bxMvo^Nx6_SpS8w-Hmy)r@W8I{!=N`Gc$1C>$mFvQ9d9ca^ z`3N_RJTjb;+4;2+g33Y_K!9d*VmV2al*AboTtEa$ayESs@kmP_LNt$i<5!ycFrtlCWu`lhj zalZEVB<&`Q^ZaD>;^IM_Fv#uv`H+oGr!%)BvBJY(=((djizO=VQ832HMBN-lK+~KM zyZ)BAR&Y$>M&aEt(u~B7?;Y;0t#|adR1Gt2ODnHH@$6bN}v<5^Wm20sb~) zS)OV=midXdq-daupUw1~!xS$+MkJ>F59YSAHBDWjpk`)tv_!}2tB!Kf@dMv_5DK_)}vf12_@$4B5sf085r zHL4kb>_j<;s>Qoxx|c*cD?3x1wUgkSf;aqPQ{oGvu_1yNdbQpo4p9xodn`n;r!+6uMTi z&%LAc&T_>0ZKot!+yYhp$sW!b0-SPar*%sCwLS-nl0h(k!YLk8(t+T!t$jdh%_FTH7maS$vsPdHw^@e?;t*{p| zX@c2US&l$482LL)zb7@#7XZ9NiW}-W13e0l%^0rjnfU)nohS)(KQ^?n#J>65Uld1l z_fdM3+M)Y~x25jJ{#@fDVB(n~NmUW5O^zP;$($Z9rb>PNjbl1M$jQQPlgzA~@TWxv zrw7V)jM2ySkIVK0#@mnUDc)~aZJ}5GB zHwa#P$0vL#zx{|+uW0R8Y?Z$3vKYE*6(gK7x#156u(?HBY~8uxGfzizNWP4>yVo8H zs$jWnY@m#0O}F9nuPkW|rt`UzNwud4lH$@eh+w1smhjkLUm##eKwgH;Px=*6W}xT7 zp92)a#)%!F@`+~3x)(py{EEkEeCp=sA0O?4?|E*Invp0k=yR1ubV0iSm_0&2OI|{b zL$~%I?T-f~OB1jR%%J1kZM~dmUv(^oR?e@!jYS_%E8j`pYv!9(Ciz9YSp znCPFx6CfcF4acc68@zo6H4b}*qzs#$QE3xnJR$@cqGl`6*CqLD%VDs~_saPj_fmw= z$Fna~y1;caS3+hU$y^L$plKr2(B33h^8T(A%Idia3zY-YxYjO>a*%ue;}PND^*GrQ zkM$w+`ft(~T1a%5wZ^BH5|gu(sdb<&FC-nzls0f8?3v65uxtad*uwWIi$P=va)_$0 zH?qsV$&;dufdhKN_1Ft;}FyBXW+OrKHk3n#&>ePz8nk)$Dhi_Y;vH|NlPDP5w|>G_;+j6nBE!){jd za;%tnbE}2CtX|pry4V&D%IIN~%|6Q2MRY4gm#y!gqRMT~tI7)9X6Kqq%lkn^E)#t~ zHrZ$8hG#`YS$oY-xUOtfsZ5d!mJNf6C+9rZ8E!*=*>n}|Ha~i>Ui}}e+>cT7 zz0|tLBhk!aFSPCcKbqbtJhZK88jWq+T(NE2wv!dxwz*>4wr$(CZJg})`_J{f8?(oF zs;j!HcT;3UtzB8QW+wHCftSF#F*Lo@GBCL+atK0<%NWsat|FXAd80(M4*U#ZmQ&`Q zGKGhB%p0#9+f6Igy;*N${`q^+(pZu;F(@i*BzR)yjQBBZlQNWlY>%y~M*I}*!~eEj z8TNIHH*>}XjzE7i{sg{iYdYYEJ2zDjZELZIfW|eiW7gef?q%H}4t3}_GruQfR3@TK zDCUlbJ%%DAZceQl^!N_Y8>_K(K78H2=*)YnwJi8*zZ2_uH9pW;6Ci9y2m<-c@`|q%w3n6hrKMn+uv5V8D&0X zA2T&EA>D9RcRw-8ngt&7V0B&Ky$y8qJm|_(>=d2z3X6yxWRPzS$PDW@Gk6gnCUYjG z+yx#W>>ra?OX0?Pf%z?1{CfSPT5%kd6K>$&7rb(y6Tqz6-+l%)nmg z+B}36Wpn1YjxaqYJBWIS6%j-_Ah}d=`mrK}SxUURVYTjv`MWW4$;oMo{;|2;!?n(N zb~I<)-*mb;YuN$W+x7YCnd&`@0`AuUdg67xf&{S}$vofMt_MAQ)=BJ77YWk%psJ)4 z`1t5F{@@b2FQAn$m#oDG!Vc5#C(#&Doew)N70Qcpb;KgXu zx*+NhBlh`&;FUw~?Q4FKMi`gR|MiV>ce(UH;Wvr@Udc+kJ=QV|*khjP3Megbu(!2i z??+uq@fHC1TA5Sut>SQOe>cs*ZbH$#TP2t_8`Fej~cCx(UN2>}CLEF>Rq02Mb*8H}SL zUEj$3nDuN$Ssf_+mpvj6>AwADS!n7QZj>n{zhm{i%D{s1tR-%Nb zR_Kj7%&#*OVzW)=b9Z@}Ralt5yJjPpc37a=B!JHPlB{TO!7~7uQp!lEVJ!}h=u|^* zBP_L5oQ&vUHnAYF2m66+1Z@L`qZzJO41 zjUe{_(gaeT%Gww2jraQxeKms=%g8c8l~6w&_U|qjOj=M1NDk9)MvSW#T5;mPC|Ubz zrvnuMl^woo71F(PV-I%==b{8|f9Qy7RTGo>)Z?Rv+n!tdpwkqG9%V77TYAneS5h~l zanK0LuqyGDNzs03ihpPbZ|M06kbGRc$?Znsn{0L_R%@WV323Q+;J|txkF;0Dc77ZT zTbMtjA*P<$#!G)5XT7ZXr5?DMzMqeV_c;7?-c1)07gR@tLTE7lC?8FmnQ|A|a(BkQ z=wRJ2G2v~qgm^=Bj*zs<01;@|!g7Vcl56vx9ANoM2t9t``Hpb7o@zX1xW@Dx?CUt3 z^vFfNAfCkR9ZtKRDII+!roZq~Zhzt67cqk(?czdP;f*KvIH-ZS9i7m-C6L1csxhd0f~a+`_xJ>uGIS6R@qhhkH9?Nuk%ROTpmrZVx;z5I5-#p>eiHEFGk)=;HRjmo zUo2!hmZjzVYdtSK6ye@oYpSvoc7kf%7S+{Gf%kP*6k#ufRU;LzzhfuneqBKx;E>dg z*tJ0@Q4+&tbJsH`k)k5~S3fiY9(w4NZFexLS(bkT)t^cGjlVV|aF3-R9Rc!6Ykniw zzH92O!66;Bx2Hgpx~VhKqVT5p?4T7pI}yY&TmZotF1^UOA(WuVuq40*D7FmZM!>5O--_6et9>5u!z1-g7L)wVf@;S95jF8Ct^e39`VmOnCsN&R>TtzBi=8>EoQAayEtTT_zIEk z8%EY^`#1`*z0!SVupMXbv&6^kw6WUrJqJZcjHiD>hU`h?AwL_OsRX`=ZoRTXm^$Ku z9_gD|8L!-Es&2e>%JRiy8f@kwQ^o9t7UmR9wSSsN78`F7>?g6>=oFq9yh3-km#ZE; zUcqOTUsc2!Q`hTc$Bt46V&mLEeoP6D556ost$6DWz`cOEWrosOq$Rhi7_CB<3)S9o zC5=KKkA0?jGV zd0ZBdx~L)3lrxYn)y@V;sgz3Lxnjjh9^-PrV-F7x>6`%zNVAmb7+UU+(+dikO8&l2 z?L+Bt{A$&N-(mDx(%*Ve=YVk|i z-`-@L%@%WS2jaUAG{4N*hu02%DA)h)1SzDr1OypEvym26`)p8nltEsWD(=r>gcDZt zTHD4%rH%Kkaoeo&YV_@*KA2TYz%rP8UY(2i(CD`2BZ1lSzV&TO_mk&YzcJM~$Tra9 zjLelQ3FBg@hh~wE5*p$Fg_u#+PQ#nrO9~2?Vd33EE0@;VRHfy*0p9$f?#YLnZX~kO zb2a-R<4MK;yQG$ot3nBHk6-lqzhOVh{#ZOTI1ODmx9r`ZVivm}m2LP%T{8=r3_uy_ z2OSrwB8-27qB9YzKL+6*k}V#pTEc(hVF8C^7eqH(Z-`B*+@}){P4^MoNw3ch86g9t zGZ(tjS2P~YG3{s*FeTq=QZR!((?M5Zd6|LoP+AsIagBT1`0p2&RwJ+f1kieI3o52! zas_Bub}h4T?rilx{6nihmW5(mSwAVVh3LE}f57q{#FgPtYGDi}Sv2zx$=_L7i``WZ z5D!<~0Dgz2k|NtWEU3upZS1r6Vy2cf`b4b(G`F!B+|ld63eTey#Zb9IWp}y`2lHzH z;l)cgV&*t(lwq;i2g#I0UkFPwX8xD505uIX&J77kq1OhbU{NNX&W$N`^UCuF&l_rl z_YK0Zz5(`@g_>QwKcR}85yv8JOi0t%_ErBPy)lYJIz2wv86Opi0NM|LLy00mzdic= zyR=%;*#vjFTQ4ZF+b7IkV5_bw>i(MHx`>m`PfmqK_q8%18w}5KRMABZ$Z}CbMh6dt zfP9yRlNE_38kb_N8+yzFa<#n<1J_zd^`p4?VI;oy`@gE%=(*`x@ciwOi$Dscg@r@( zr`}0hzm`4iP6@#e>L;p)ukS_iTpdGWJABrw3aaz6xO1uvjZG+tk{!rovqDr1}yZif#|-y>no5qXnevrk-noh^6u%vq0`K zN>e4RwOue6%?b^t8k$baUx?x&-sF!|p^}pBg39oON~%kzC~jQzMmT%eJj-qMxGp(x z8=bnl_~1+ z;{5nw{IS+TM+~;p66HG`*m&EUP!t^5%@AiXHAS&wS!&A6X_+)AI8LHoJmTqT;4ED9 zr&EVHg881am81)Nz8O9%t`Xinwa+gG!cH{SW-&avjwzm5*qIT=Ko!ha=R&Sop^dSk zr}3_QHu3ibmj52^tx`dc%JC&{Hq70cRCa~jawWq!b(d7bi)pL*wcnd|`YfRhPQi=x zH$nuB%VpDTwnj z4TBu*bmaj?2jfCW5I~Hy(_nYRJE?=r%f&aT0{nr-R%j@m0-7ViN4lzfB>I{)2k8ie z*}7J(nPUQZbYAj66wxu8pOb*dv$QZ0!FKUpHRtCC4EsAUd8XA7?;(t0INx9QwDqUw ziMmc79Z--G5i$%85rVY0G*Hwp$6q%$V*qLNGB4VRj>h8%b@FQmI_=P${zB^fQe*XQ zx&tCMHk6zN6%qOvNxTS-T{F+>ydquZS>dd>8Lsq2=BF^Se5T=8t}l6sG}XPA1b7rP zfqO@O1Bk65x4b%nFArr$S zZS3mWpa`MWy)cAXnfA^QSlJ91=dAnl`x%HXy0R>@+3ynH&zI zN>2ihb1~Z#M&bFRsYy(sW0YqW{)bfR%r_luDVL9Y8cd6A#M+{R^FRQ)F@A64S(JE` z0HJOM*qa|qrg1f9B9agr=gJEAiJ(w=rgV{k(Zs7%cbVZsO_sVdo=p~(ky;+lZS1Pp zN()Ar3fVC7)p3|H4z;zCD?{U6AM@>`&L#W>u?`?Um6C=K{mZ(#urT<62$7B5G!z(H zM?N&|Y_Zw#KpPuD$Y3W#5ULIJ!04Ikk;@uWqMuS6O%CUaq&bU2!%|R&} z=tO#ZAFLsK3yS@C@@tPodD0?{O=XxRw1{OxNeIpC-Gk=r$0&JrIjM+CHa%n5+ja_RTE8A zGGj>LJd_ebhIxQ;5s!h|M}V(`#Pa(tO{0C<*qC*76eIsCozBP$*+A82_&i-wMd zby#>J+qH}$B|r@RaQXg<`zQZHt)GB)?Kk53zVUu22(AzfOsK50M^3oMGrVI?T}@5V zT&_Bz5_ZT4meyB;#r-X9M(uHT^oF$_Tb9MTy3>TpqQJFnwJ|+x=|+yGnSM(bJ4Y|n zhjOy4Tz)p!Zg6Tz&s*jl%Bt_F=UWpxg1Cy@@K+R?ejW3Atcs{$0R<=}7Ds@}S|ii`nsT5n272Th-6Dw?ebQ0{pfBA#%ND} zE&`sby27&0jt%qiVJ$f=j?iITsnd*iRK%d6ZE;aK|7`j19p>a5XVz?-C%$L;D3atS z@~D3+6K+ayvjf~md+A0dJ@4aL0-nYCfs0&uIsO9vU-W$<1cXBcO6@#vQq$3hj~!7_ z_x6p|+5m*WkrIv#5i*9`6q&$s^^V9v4q~0rzBj%bg6Qf3f&t0>S7Rl5mfB~} z4TFyqh+LZsF^h&r{k=sH?*ON+1H7w4pxuUpZs6N;`?UHfQ+WzAPUrD3K@5n4FcD}k28QtwYs}ZmrL`8riR~rd z-V(ka_+xjv=pvIG!MXyIJhC3D(6WZ=pTJ{_$CNU%B%5@bp$iHVm<7DO6se$Kz)_?J?S4TN=5`PNxbYwXJAu>)EFuefu;ZHiA1?lq5LURLix)$My ziZ#EQ&dzn6E+2_rdQln|n+qPtM1`jv^LjFR@dEE{f6UobxqlI&W_p>-84e;0Ua1Tt zoqw8|PfL2IV)ErrJe#!Wcp*D;a`S+U+U)D3c~Vu)@W+caG5=w|!cPsro0yr=#|23J z`g>dwa`bvuwA;yyRy0m*CpZ3^m~q}|v}AkF^TA+832}j+P3X-vV}@ycFOwtZ$L0zQ z3Ql6MO@OD=cPk*xkxr_E1LN^RzT@~ErTW(kBZvYS=#E6+W#WT;qZNAcb|Wm{Bf%2W zhX^Hhwg(oe9ABhGigwUuK`f(9F*cre=Dh`J?OJe@yJOwaPzr2VGN%!kQU8*`N(8ES znyx-SX93PR;Z_9*)4=Z&n%NZt_l+XIBD8hi#imL~Ob5BvcGjJ^So2zWEIW-?N_{^c z$%D8@k;>w}>*lqu4^(>@{`|Cj#^dwwo*9k_yh2JgVn4t+{fV{(K^8=j%EP_oADKxP z1M;i{`6~ML)%YUYg8PfoR&7ZT`f=N2f}7Yc8sA!v(?jF>vPN-9xn{Sw1xSOSS~r5r z-(_)JZb3GEe~_fJIREA1(14_8+zuzS*v;s`7Zetv#C|@+hQ&k(QU@L#A0Fnmw_~~P ze4%sS#-_yck-}!Us47n2vc&1L`MX<|9=)h*KL2ecs9n&jW>mcPB`kzmGEOD0?yX} zQ0stpSQxa4%Pg$DYYkB9#%hYKpDZ;6vkb+ng)p#-<_2)83LxJ9>CT{BM;bVgKK=WUnXA+$p55gAaQR3>8bQsE^!p>dpw}VscFAwpw$x^$aeBmI zw?`6b9%^74O@CKsC!>K2E`|C+JOj$U)6!eR=b^Jvom5k5bLQfeBo@OjM-x+S-nV7% z6BNs7^O5-v$XiH~18!EQz#+6AR;l*3w8UKXBS5e zJ9C7X4xNn;+gsZ{xN z0t#%XdYj>03r^p#+!%Gt=^pmu@MRcZjLxbyAYqUYa19yQXZfCW>edqOi5YIrwT+g@ zmh@N1z|MU2$psf$aghDQXBjL+L5{V#`i$d~;OdQ3NSC?QW9WfO$fmJsE=*vWUO^4S zCu4?_U&bp3ag@1GCRpOUEz1ixBhup)Py!Has729Q_hjMrKexiqucA+_2x>=oLmV4u zOcc4t*;aC|3uFf;9S{ELRpmij&;^uMQ*UfWt(`Ozu*4>7*1Hvo>|wXq8pH6g9-ogi z-@8mwSPB9OaFyZBtvUHm#q@*6+KRI1=sLoSv%HAD=(I}^7;S~zZnMs++y#<0r6%Eo z!2VSCW-2{I@h+%rL42~?@Qu%ZqN+>u_^qPtV!g4 zSvCXlI8*o30?#+(PIct(p0m6<$S=A1^W5~_7@LMH^bNyfw$gF|_p*_RYP*9E=(rvHY>Q1j zg9#(eCa|PdtzO!PM)gl+Jy>4`iZ$CP_m**I%sl%v+T8V{%AxxcqCa_fmd=I{{+SNU zho6W`K)2lFICp8bpIi3h3^190T?jymLe*Z1@c^LmMBEX}<}TPPDVVxx)QY#)!2gEI~q z%iOg$LtYqyIQl?zc$!{t=`U;le_#Y%0;s;+VeY)8tr&NS^huM4*wuzp z2fiYD!a$wqq@~L50zOuA{txM+B7yM7tV95Hs4Fr&||7cE)_1)U^n%P`1sW<^6BBYX; zn1b)q_;U+G9d7u!`X+~qvLHJ8gDFFcjUK#{ybba9O@k6gP^`QvK)f5daZXRRy$>m^ z$-;HFszo)sUkv&)m4VC^PS>|0Z>2+$a-B6mwwU32N_%gc{yh{Q52uZsV9`5V?Tkks z<%qM*LD}^!l@ff~c9YEW-e3chZ2AbeBhorc@Yr|H}|7XANFr7#G&%5U>6EYRCRCCai=`GhO)Afsa zF{KHqP%2M%&VL`iye#jD_-9esQ4Y(s<)FL=*ZeVGh3=aE?o1Tzb{pvD<_pd+v*iq3 zCoEwSMw;UV=eZ61X6v3Spct3^Fug+IabJq!>mrc-tBY+nCX7BRgq$2XM^^Z;Q2Si4 zfa*`ef!)wDZh;Ze-BYA2ZmA*uihthD71RJO_SxpPbLcngPG~LbW2Vf^o6~=Fo6w7n zk$%M_3L)j7i1hai&aO{HkFBSQuYtkxJy+xV{R!KCc#S+= z$+~4LGLo(xpd_0c7oU1NqTDM$;SsnAfc-4z%MLNF!nRC|gbx^!eaY^wp(9=uRJoar zr)z;4r_pjMGNjSMo25>-+%wKon}`fIA)@7{bB!V&sou5?JI^ zqHu}z=Ro$f8IbR7LeOaHc6Nr% z07x)Qfk6ON$78!A42iHgQ;r3H;11uLO0uJx#FtL1fm9#2m z_%K$@X;wK8HH;`HouR|ObT9YvvC}2x#l9$my5aeo2UgeAnE(33|6n00{cbQ8c;@ij5gmzSlX%;81Uo|9hKLM~nQtd#p@BJ_r+eN>9-0-9&YI2Dm?X-% z)4x~487rvyFd&KMfNVEW5~CbESQ|N(gGmGP7Jyq3V%;5Jc>REu^8U8GzVyX7X#uEm zY6f6c|3HYW-5YSUva7{74$@@%T@I?xO>vrBeVe^kIfNV~53Q{2VD%P#txJRKbs-|5 z1jf?;bUJ%Nn&t2cJ4}mb;lrs(0?_>Kfz&|_Ec)4uI{Mj!4GA2kA{O zJv3EaZ1JhfVz>)fy%9FTeZ6E`kx%w+lt0KEx`ol&p(=4!#bca_I{qph=zM^jN2J%5 z1DI!uOkNvM?wceEL2T;8SoF~&`Y z?vNjtML^#<5xfpyuI#Ak-*ntEvu-h&k`|nrCR?mJ<^KfCJ6$eDiKV*h8w{p2U)}mk zor{*qg1N^)_!{Tf9eUj`;2k|s=7zwN%+`n>Pc))-k`nkhK| zcS>h<5W@=UE4P^|0#obK3G9ZC8M$v!3#8mSml{~G$W{I)m&(x`&zWGNRceb(Bw5Sh z02P4UKo$z>ba{PkxE56*Prb(t{7+d)&`2xB-vHO3T}uxiZp{m>IA%hykuQC;<}P&$ zo(I;xnL9I9WY4o4Npv;`&)1rY`iS~-(d%$>0+VZP;O;fcfdI#8K`1sCqlWrQ(CP;E z51bvHP!=&Dd_ABXNC2~aZ2MU}DE_s;n0ETd4|Sb)xeLvO`R>KgdF-<3ZnY~fQ zO&8cF9cYt|n`hgP&T8zcOBu(TopzT_=8$H#Pb}K6ZC80MiJ|6dyy$3Hx8pT*`xR@s)NAO~^Xuan zUMbOWuSMk*hG#7{?qAq-aW!a(om>~q!y;Fp-{2!nLDO=YeV$*G!ZokBOzbE`?W(MT zl}FL)%tbSUl5rGNVQTm_VWOPtiHLP}e537VI54NH2jm){YQ%~NXb;mVl@i;?0aHD! zzr}+)9wO-%sbW|hs{hW#3{~(U1Mnk5`ZHc!5*$Z;X9y2D^k@Pz-MR9{JAan{5#h4N zg6A&5ROR=$rg~7#x?pOoNZ~?j%~;K;1UJ?TpUu+`;%!rHIkIl%n%`!HV2hx#=Wt_U`lG3@0hO*voK>P#oe^1jJ1TF)f+Q`)Wx1k0 zID+96%6#MXpX~X|f|O7KM!T+$Vw8`LwX2&D-17QD1wqe1h*E4p5G#Tt-R9a-Ja}Uu z)knp^IuJGzpk&Exf#Jjlt5J*$cxdvK$jJ^~-V_m8SR>b)l47-dA7^F3AmInd$71Ix z*l54*3Icah*rZ00d7lOIcd5xiCJbR<4s#OA4SPW3yb^^l`SgvQ}LSewH<& z?KdsN&h$qeG)#RGQ*n&ZGcuqw$>568rl%-!07HPB8$Qce2T+n}oByRhxg>B)fB;K~ zA@7TB{Im<2y_c217bf@T*QKZFJ4)8nnimd>r_Bpx3<8?zKt6M5YYp+!gL8nFB?C~4 zjk16&r7jnnNVXYdV2G=mG!=991zIZx;IIx$6MToNL6GBUTLDXpg9oaSCgkfnTo{Oh zzmjPbJi*CyQfCj?zM@|?xN~ZY9xZvoL}q$)IG}mBG#8$qa@m?7oDl`z&Dr$msYpmL&5ntICI-;U*eXNZ|se(s!_{7t@>lM=QApjXuk;W_MK9(>dS?R z>^a1{<_+x6A(T_6FW2Ut+`T`vQ!VT%!$yV|@7Gpxg1LJ=kdd~OQaup;ugdLi#Bz4H zvgZ!efc>e(F|Nxmm+9o0PIzu$5L{=*P~4aVu4B*43(X@njxfgl2?>GCAb=EWhlo10 z-N3=8dx>S|*KqB_Db4wxu7oeKs|2{)$(!S1Ul?2iK!J+QUC-Basxs%!B;e4PoRK<= z_b>vpjb>LOk{jVi4Vvo2fN&%(;#3ty^L)z34sU*ExlsQmpCKf`m{I+1K(l#8teh0W zQQYA9P)J+qJg1UTUkwRsvW%5O?G(L^&hsQ;RLgSAc#&9Bqp1(B;3E`yuKDR8H>Yhh z7Z;foVGeR1lmtGPLY?$Bd|kmi6uU+Dp}Te>GC-czSus%malM zHf%3kq*eite0_~)T#VzF^K<{_^CMo(ZYZ{U2&Tk7mDL){$KeQGK}97H98c41+j0X` zA6MYgQCOe$CMDB{6?(Kpzsb@K;6B;9^t!JQn@!fdkAAr9UQ2_$h zREpVRwOjMZ9}@)@!+V`7YR7?We9drY&uGEPcA&OG;|E_FAe}XTb*}@}q)hF=%iuew z&?Cdp>&j5yjldM2uHo~Z|I!+VcK5#y8MssWE}f!8gyPfybJ`%{C+0Y>t)hcHf%1z1Ph$U1%KnZ-n(ZufGlq0WTzr->mm#>B7?#Sw%tAI} zU%7Zo<*gy|o;xfIde{Y(Xt;TD&uHy_4AL3-G>`3lLs_wL`#ESt*drw zkc@cVSdxlO0t)j(x;HY#{+M&;dhZwx8F$ja^tNA?+ow-*@>}-Lz9Z3YIGo6L{2ExL z*879uAdWPEq$5s zPkvpY&$)E~SEgEHnR0t`!~^<>3y`G{m?jC%jN|33a!&;); z$Wa6Wf3;CrC`M)wXxq((y4dW;!6FJ~LP!D4j`}3$*bcyF%@4_|jC)tjp`m&pbJ5BE z>Pa~)SaWy;7G%<3osGU*Qix%@qY%)_%%&IvC-#(aRZ3+oDru8BN4%cOUd9(SBkaw0 z4<{)Eee?2sf}y5zceL8PzvztmOlT}g(2sOl|89t@cuz%tQ5YVUh7|E0jeA;^E6d1$ z@Ec)KswwHm+?Hh1un@0}5IpaCjwov>0GKTljE~XZjldn1g(JGMY**=44AG%$D|o+$ z*XjErdpId0dVa{x8$!BR1{B5R=%~Y1FBc~GRDoMcXDgt{4g3k;l_zSLv%u#8p)tud zIul3Hwb`9-7Nd9N2psx$t$uTfUX;jsGF|dtDINUl9i>=ir(6S&HP~a_wEx(ODjAG& zlc5@84~JB*^CGqR9HJRb>jkK_ zG5y>lSQ_X5C$LECb2o7jm!2K~&!--<^Yb0cev-Lxw^WnW0H2aRd;M_%T&NeAqx)n8 z>`|7m-gR>A*#>a4e@6v|HpS(dyvN426VoYyd>e@Gg>GPwnWkP|UT(kD#J0a#lNp{U z%ejrS(P#nfH7;cI@Nwho=lS#LIyfkt7gz^Kl0r6qIo)AHN`EqRl%f-zvt>tm zF~gLb;nz5o(XyZZ8zwH(^M+|UNzuC?#}kRJ=N7z%yLF7^@3>yo`B1%+XDmip{doub z`jy3oD4hEDz4mo!PvK}_}=R>1Xw+n6O z>$^od_C%Tw(YB`nqQO*_t%rrStXd_>x^d<+alf&m3U|i0(G5OWm+#T0#i`K%D3Q(W zEheVLTx~t^K=4gV#*NF47_Ngphihe7_H6^+YOvZheb)d@ku-5tOQ4BE1;0o?5?`xp zA)VhS9*v2sgDd{K+nM%PPYr@~)r~}OmCaRnHPMJqLJu~9|F^JBfFL#<#x#O`CW$4* zRyKfv;Q0k@^7;{-vFgFrZ9nAHuz;JrFKDTeGR9dlw7MCI8A?Wtae?-4&5#8RNwaY3 z(>+AP&Dt|ipa!#G7>pX&Twreep&=v_z63j7gW@hzd6R5=#;U#DX_j$@y4_3i&h6-C z@jsKqf3S)S5Oy9Xl!X@BIL*}}nFWt`>Mo8TDq_q-Ln7A#9eJ}hX4pZ)^=f-NTpEbA zoa`%QAe*H-G4=Ql@F~Kq`P$|H3EUclQGMpiPa9|z%&=aM|E{z z_m-k>Qd4267E?TEugjs2pmU?&Hbl)`dKM;s)RvX+$)GvL5&(%OJE`RD!MFSam+f_r zI#txx112pb#5E8ks2Z_^=LlIDsD?K)l3BLGGUd>xyaFsi7F{aKj2S_OV<(OjWBhbo zrSKEZiakG7m}<}0a4Ec+r$;F$*@g$RFG}wnreXQbqR}-PbCtX}G$!07h{GJsJVoFg zVxk6;Di-eM3O3~5HJOUg{em(njNX=YmjVaV@FssuXqUT{1FGcyxO(u-V=fE6barLm zJ(>?ySJqa+;3B5TU?gQdBf;31vaUdA61a>o0#o<(7izZ)1xg5STL`Ut!RIIRD+omn zVBuL8Vmm3yQWKpKbzLoyNwZTxL3$0ZkN=~Wf^WOQYnbY*ABpW7_(a3O7^x*dOU136 zMEZ#~ zNXynUwrr+qB0lv8Ld)j6CGin3Tx#rsEZ>+07zli#s; zrrQGiA3h+jW&W3Os+zr;mo4ja9FNmJ_S@dzV^1ZchCD(}5s{7f5ouPSCp4Z9y3fb+ z2^n0Paw-?K{m+MR|p6_L5FygOMw%UWBKV?=wqMLRD&cAkWj!gGs zi`A|UoF9+Fo7T$@z5spzTRPW?ejYHdO5;jDvz#Bc_4VIHMrmS*h?oY{PS>qpwA?TK z1+DudJ51KqT0Ma9ypL+yPYV~2si4?vpbXQ>cD2wfO-*hlcS>QO?i6^RJs-PwK?QCj zaO2PLFv7kCfS`h7j_&TD*}9LmIKG=@qvO-}GIq-(W?1(BO-cty@h=yGI-$BBzm?q0 z-ACGAbC?;OCq03&PfSiSV*~E(J?7;RWe>RS4kE{ltn|3h`ro-2o1Nr#cjHB((=jMQ zTk9w&stKehXW=W?HA2`ubU95hPP-np@`{(sL8Jc}D~iOz zfVZv)ziK#tyQ1(e2ArGJK2`xZCA5y{c1f689aT~+Jd!1egw_BrtrqPIiBLVH5g&QM z=k6WUv8cKltOt*9>bpI;;JmxWZ%MxsiVSU}gmlu-?B$>Ci_4e{VRKDYXPwiSoE;7x zkl>RU^ha;R0Oet2f%>;`F{eE#B1`?2YlxS9**}R)o^J1WGS0bZV-XyQ=F2DzV;Z6i z>Q?>7hJOL9eV11G9<(pOI99TgvAbwNu%A;7ozyWKfD&+mf;Mb&~GCbAUK$b28 zs{u|0ecqlTIj6HTcne^{eteJN^$;v1ojjhJByMvJR^X&UQ*-<&ps55mEjWxU(fOPI z-4G>ttN$dmA^i$$08=nUSs(FNXGkW|k%{5rRXfSLRA6qQFiZTtQ#DOup_pX9QVYr6 zNhUH4nc3|3BO|6FC=P0u-n6kGvON!z?M3=vr8@G145s{&+?0LaW855T3ia)w$bPYa zpD~TR%yo(kh=T`b7yILWnfk3W*_Q!O9?i|A;FzZ~`-N?TjLYq;I6B#{3=oS~j|55W z**ZID>o@{pv;s|2%9Dr5(V%qN-G-|V0;V(?%NoMj@?<#v?~IHx{`lK)dMzA0IIm$l zaW|xLa(UE2`uoxHhKwcu)`3wsA9917rJ;0}e0zC_!O_FU>{#V) zyt|DP1L4Tzg=5set>hGOqhiKshl02aOCaZh1a9`d5l8u#CQ~v;J7P{spp0!=5laO& z9g4H<$yszUZ!`mkSsUfC1WynN&b#~wB&@wla5N^zyT6aJ*!L4KU&n=@VQ(>V@B)8Fj!}BF zf_H5-ECoELP7*)E@W;P(H&o?7|F&2ZGzaG9;|0yM-@ZBi&xRZWVg>1C2#_fwpKSSO z=WBb2{qt66>gC|u1%}{ysQxSxaN%{x#Q+VQ=4xu6Kq8oE|>FE=cu|+x_e+S!6fg z?sm_nPzCS0e8cK>#(THd8VC= z6?9MdhHb}!pG!Mg614k2y-hbBB&0HF7|Nj`(&Lp2+wL$mizb)pHnaUM*OdJm_)W{0 z2`pLCB<>^QlY`}*En^?}FQXe2p1Z>yiW20zDqC-0!tM{^qTNf!Y5Je#sx5thR?C_X z$QbVXuso8?o8Jx_1!=ZFH}aYpb8NwG4^(Y$SkD{Zy-gb+>89TZC$gAjvw9myza#4|anY9=SQ#ECb^dU7mE4Px3b~H+yR#BjRU}OCmaR`RQdf-W0 z7{iHszxuj;-Uw_gjqR1NvSw=C=*IMg1h+-Q;JZWCPKEy8;6KH+X@I$NNqkOAPli3|c0!R^*bqoE?zYBu;<$36 zq3*~NN7+c0D_Y-ri0ttC7^V`D^s9ImC3xKqM;=*TOU`_Ex+A=!ntdAuhwuLgmtRAP zQW8L@V084lynH}*-(8%lr3!8%Mg27B!iQ`c5%!;qDK{MzZCd~;e?uDSVq__;k}Ill z*sNNd;cJrAdG+lO863wWL9B5SI0l?hOUy<+Y_w{58<&NCDoasDw9LfNbLWa##X0{W z*Ghr!F^e#LtJ*ECzqL&lssFWVPRrOSSMj~5HbK#cy{2y4pGrR1)-R#KiOs8 z3{5+4)V;k)ww_*7pijhpD;n+x7A^c!^>~jsX)!!7>X1RR160u3*|A_u7M-PGqM!!& z7Yw2o@IH!tkj&Uo0+RXGib zTWocNbdle2b&WdZR_29zFSp0ki{S`cRW-S;8(~dHuQ8;|cF^LoKa^859Obw$*||N& zYxCjv@Xa(?DT%)8a}F||yFE9Jf^|7lJ#~p}QaXqLi~6gc&V&0>9y_k~Q=fbNg^Wu^ z(x=f>3~r~n3LAAU@bISEZZ(4~#!38J-pPJW)&maAWgxbn~O-yOA+f&ViV=H!9!+5^b;#z^MS zRVQ@Mr1I+Eo9oj%{@dR-JyuQMLo7;d^>HHsa6TG0vK2wil zF(n`c<(6^fImj?2yBEwG_x|WWrAD}O49~l=w)pMM?EpMeJ$(wS_KfGzht0&0OI6b; zm+!AW!a+h{S!JgQd)n1;=!p(%MHxi_6K;5r>1m6u}5Fj;f5G7j;g} zcl+e+FcAZt!av!{-^Lgh-3Flh>f&M!dp>A>N?Y8HfkY}GGchO^k>Bz$*Hi|G_f@9s zC|fuNMCuQA_P%nuK`L~1_cefN!A4L}T1R|+TqNyNuruhjyCJqhqX(N{0yg~~iSEHg zgR104PUK*r5cI6(ihovQIzfvDjo}s1J5=%3+Ooh4HrUCtU5XBEYvGj~i6&#o++9$;ZrTHlc$OxL4d9nYg~jVWeD#mj0heZ+oI|@V3ftCj1)tA^>XDT|G=@G zuqk7o5Y~w9wA6Xn`|go;$K?uXp^e6YNsek@)IgI#L6C8}QfDU9GLoBvLI0T5f=8Nr z46-0Ud~?mZzs^hv1pGmWD}gjMHxD*QOMhyZ;l%=r`iGk7pmFr-8gAwcmQ2sn~e{fXFe7WbK}4?S=OA z#xv@0rzuYf>#!U=ld;Sb#bZPmljrFws*ZSjX;Fkdu;CAvlf^J6^yK~f@z%;o{~uLv85CF0Z4D0|+=6>> z5AGI1a0%`bTn4wnodkDx9o#K=2=49!L4ytq9_;10&%IyO_wQ79ogb%8ckjLS+P#)z z|2f6CxQ4GC{i)+P@5LrsNpn-9S5la&b((%f7tz-J@A zmmWyC^O$@Hg(`Rm)vPd=qn3Yt5ms?-=w^Vwfgnz$8+W-4cuH$DzEiaH)YorC-A*~5 zT_*{`u&)LneK@u%`44FI<1joxf1NJs_?8~-ix0-xQ z3z}+-GoIN5#UFVS$wHg2u@y0>Guja7v$d1O?JvYe1rvU-eyY593^bJWQWt-W5E;t> zHhZ;fUvx0;u7plqQ!KiTpv2OPF_TIBJ77l`zM=nZNg}c0aVvQA^q;W)R%x=P{twn~ z0^LrQACzPAt|p%vICY!HO=k~#+x83|cQ&6l!U=9MIUfHd#oT#Qd~d(4G`JWyc|j&2 zvArkV98eK{KzusZkq}tcyW!nN#(6sKBRM1wAHaGgnJTEVrf$6GGqGw4L`k1Nf76Vn(X3doBaj9CfJ#cBy=}sxcB{AN((`mj zh5ByHc>$M^1Tf{<@w_;>yxnn_H*AKIANNF(*}mU;;_^r4l~!!{{aI0kq0cB^v*D3c zlNVW!%S#(3z3u`7I!dJy_2KoLb)#TQ&}vQhXt+cI4 z`ah!Qf=VNb?NueB=L35`+n!f&+#WLM z#S-^TZ5{6hSXo^DVH7E;i8Q2oNprd6h_MiL#bw;x_V0owc`sK%bpl`UArhr7eWEOg zoWEcD7{GgDai6E?z3Cdbj5DJC9ip9lvOw#lV^(SK*vPREgJXJr24Y-KVI6BqiX3vl z(ZX3hEebN-O;S{`Bq+Cyo=^#GOaS}cm)+-OoX35$z1cTS2ZRI?v;{XY__D}w;;ihS zVbE)Wqg~vI4{P%~AN=)n+#FJG(iv8Qg_qjvq#H}(_U|c4H%ItekfeW#;^NjlDErxS zzzD`Zd~AJZX z{Y`2*WX_mC(se&X4hvIr4n(3=VZWeg=B8dUz`?_CbxLD+P!z~|TnqqYx2z@_am&(( zok5Mc#k2XwCODN(Bac`^e5JG{GmK*?wwe4J;n&2FhNcR3vYw4JU;=1V-!JX}Rjt73vsk)NoK&arx zgqHo@v#Aa7(H&b1-|y<@8ufEP4T`dF&XqZFdOY{v6P}~u5j2nZ7Y@JXefgwCMO(OK zsbJid&0iRILQTpVzORW|hPvPP30m%i4%_~h5j4QNUjPWM%cxT{ZL|N*r1Uqr?a5pgUn+`<8f`M$mYa4U#$Gh*OMkzJZ zdU_`S&itlUM!%WU&{ue-g<}bUqdAUVb0KG}?T2~39X975NiSa{r%T#wCo#{-h{v=_iwT>wGI%c6AFPJ?xJ=hkHUvtmp(;1!Ra6p{p)C7*l{`8ZE>cbC6EY?Ccp}hV1NAP-{@nS zkG^iNU7W<*%(NMrS?Dq8#s1l*TL&t&%RiRSp;%0CiTmZ```=UHTaYT`t~>5cKJ4FG zyI7(gti6vsR{XIN$>`MLc6NSHCV}dD)K?aWm=(4ArCj;ox39MXYyY%QF9>>uT4IPd z`AL}&pO%ol#K@Ro2V6?`*70@TczYqg7^IOb680kzV?Kty*7-OWD>qA+$W1y!0)jZ}}eeK|djMQ*-qTobO;2 zYc&d2vK=w40^H1Vf(XcoIsVTt!7)xqaU&T?d5lZSlMm&nZznotc#OfpezYhdlv4jf z<6H{S<7vOUgAMB}wV9ms%m^k1oy9-NTy0oXg^>3buWQ=_Ea1iryyFE){rXJ%0c+3U;&t+kvRRAR0WIZ%?(|W#>)g|? z2Wj^j)Pz_}>18F!(Cfd+b{Y7!V9@l>Pp&&&mq60iwSr+wL+WT;Ca4&1DEm&f>v4&2XZAoQ|5l7Y|H=HoLB9?=jV71(`PPMT%@69k zsGhjC$7nIy{Uf~Y!RyWz+f7PrQ6P;lphAj?LsKvpVnM5S)iS3b! zK<>G$#qe7u`s(_>b-b5sy!+p9g1)927q0BT#>TyNXJy~?h$f~+hsu<*>phQ**`!om<+?+6hpytv8ie>N0F$2F)+)fsh8X>u@Sgv5&*+BSaA zbDh(RX}BfYxF65Q{Oy~}XY}TJo2Pf(1$XV97|l`AnDQ|EDi-qKhArbyVN|cM#Zy}* z{7MMQ74hQl@#v>-f6QA)g*Ofh39$uN)eWF?id*6_fb%dLZC(G)$5Fh#DQ6jKT9y{i zO>PZSdhr?uJZO=F-fmoLYdXZ)!)xHq2r+ZYyvM*)=W_&eq}!W*03LQ{2smLmc3oP% zbW#pe_%?Pdz3>P&U}Z|4CI6SJ&#yq_J@A+-ElOW&VqI}fB~FFIM0%1P;Hi}&R?BLb z1|MS`Pdyrnf@3`I_}vUG_|@TU)}FWC;1`D1NpK3lO3+-1+`RBx9QNGmm9Q|f3rbJ^ zje)@l$?|t=Esu<2Qb_liA^9!$QetN8Z7uJFQ|qQ`cvn+4`tY8b_vYBkkk5{-jRzIf zRRnlc!AFQ=RmhL_j{1XPKv54LM))`x?tA$U$cERrWPh1xRA7+#_d(4FYq%Lw)FZ|K ztcBIP=plVhqL@JugIV2E20{7`sB-plqAUe=QTWaR+t4{``Ar^`WP*1c5NntpMp?b0 zaFBPdyfy6W2H?gj^K}&tF5v2yZv4zGX80M%X)86(ae#_JP1eeF8Ww8i8QTK})1QDSm>l zxQ2AT`(WB1)t%my2RW)Z)SJFKKQ&VQTwnMdZ4T*(0v-`hUyi!u?oC|r5n`2W@(I3h z^+n`j{Cr9UbYujw^s8?BC zN#M`FO*u7`U;B%E$jEr;OFyLaT_^AUvA^nq8BP!ZkC_8Vf9Z=}QbZhtBh~n2D8_MS zTwgM`!SIt*XLpG1O~%GZc>i573CPu=_=MR8WhRjm?>L*a2aG(2%g{OGM#T)-{3yzZ=%GRxbD5Wu$2rX3{=G^Z*d`U~88VAwH8LbzYlv3rU7o+@vXOuZB?VS)`qrY|55;Hhhen%UTFYSTeO9-i=>; zgg4qdbObgAKLJe`6JG5^XwHVxm*%>0uD=1ewM0NrRF4StJ8&V5365=#2sz88vEB9N z*W|WaHH~*z`@|UG^+r|`y)CH6Dt0!S)bITqa&99&=f3z(SB%~nQ!o#a9Dm^K??q!y zAv9twd3SqDnwu>rlAOHEJ}Yq#aUSCe#n^BoclwIfvz-e>)8lve@T0$2E&TG_5XrY@ za<3B$h%@fxNfSn`zq1*9^zs|9_Hfz^@4W)w-1KCZeQAuz%R%pDIT_J_R4_*>-*~yp3D!A1%=f2%c?p0mBv0EstwXz5 z0s?w`RBUFIVvvgB z;J012uJl6d*^GJ!$a2w$b+DKB5GSxGl+x%G+gPaYt~EG6Kx834k1hHa9O41_6R$3{ zYz99Kzr>MNJdD||@tEx(xxV@brs)_z6Y&q;;-LeaZq`a0aps(e3_mW>$)632U0*yq zdw(>d;GVeO^ZyYSSKTcUu%X!jed)aU2_Eq_o3Y9P7HA-%0BkS@<-8C)S4N@ z^{1?iPje>tKYA&gEP1>^j{M`+1Dyf1l}hvW-8h5yK?aTP!N%EvEUYopHKp~P)=1F^ zgeU?2SU6!-eM3cEMI=cceD;bV7D5#XYfQV#=FNXJ?NyZ0AB4iyHMQy7vDWs!QOaD} zdpo*~f9XikXPv10yegC+S@ox!OKjP^*0G4%;co)Mx|nQ2MP_g_;Q_(7CN)IrzkAJY zJW2V;p>GlZv26`fxg`}$_&{flg~>0pzK*mg-b?VFxr%Tv`=yeDrHQwEO!|*uaUWO& zmxVu7VtV9O`@zSC+g>;uC_RcXrg(lrwB?+FH=6>KseJWBcW6|&l6ssym{+lligKMf z2dvE+@zrhM|J`0G2FRLK7HbB@P8Lys6oQDpEArS*+l!x}QHGpWDu}Ay3fhKvCQvWx z5`3*JrCvnEQc?-^%xVWRY(*#XQ~5b11@eDGb7+)*AM`qq(CySmv(Y(d3(meE}=;SjO*{x*YW53|i9%mIO}@eP4* z-`<#z|KO}r2z5x_I+(Rm%kZ0?j;Lw1>S+>M667TK)~k+KKoPRZSlUfb$K@vJD_{?y7b!{Hr6PWfgjVwPRgRYaa-F2+X%EbEXO ziv{RwYqu&)g-3cJ*&ON^aF~2rZ*xkYnVG`F!BOL(87R0r-vn&2l=|NNM9nmj1e59q zw@GShmN=}pViu&fg@uPNwWeM>ZvMm!%87PAosshVJrr_oDkx`DW!uPYrb&S3=l)$y zUA@SzT+H`IeNnZk1`!`04^K@t#oM=y@G7hM-{Ygbe_kG?zOjNr6deO)ghI6$dMGD} zLZ8g%&y}RirPsd(1_;0psE__39xVGacAja+IoAw2)FV- z-R^JI^OL||gS%*UwP840Dd{gXx(bmOxrc11{opFL)191{i)xnsR3YS7&LU8nl|>*Y z!oR-f+XO$ydiGSiG{NSMBNzXBvMkrnNoBPFN!(z8Y`?>h(k zq%qXfMjTCCD^pBfAIvH(U#!JA9k1y6v`%=k zujyu$jWz8AQjvco!XpHDeG6;}L$RF4o%rDu7|6A8y5L)&x`_C_nWOTa&~u|| zw@_6L8n4Ym3+@nVY2hR&-Hl+lkr{Iq{97*c>42W-wH)7lOrY#p!`eRNHrbNy>`SLg z_fbo!k=R&;g2R02D_*mJk?*reYx8pN{QcrXNp3ci_z7R#)evg^4>9~TE`2S#e7rlW z0%dJ+6Th}4WVeZJx%dDp)2y<*!L3Jcfpzc7-OP*49DEfm{==c6gUsaprhAB>mr69} z_Ty1^y2|cmf6)nL;m{8t&SQ4rCTTpTPuclgtLhP|z>#E63^^5+?@E3jFM#eBmrj;_ z=ugAL^9e%%1HeYdZiQCTAY3$p2l>a(1;@41$1%w?jDtSt$|)n>Zbb{2?{`Swx?zZ& ze1U1U25~^6)=P&Vps{gwKY!jK<`q{iu!T&y}g;8e~5X)f5Lad`!Jm~A;_aV&{%CBjS$F-$`-&*zLy;>c&`n47&~X z+8UWlkbW#XK3;dnCOlVLwExorXmHd%ze<;rhZ7QA6PbA@a3)s-RMxC$1-|{qzm*|V z+oRs5X`7$FS`!&byA6D@$*(2$jQHM(TW)iPPQclsVbMH0)kCiY-yE{{v1@wPQ3)SY zEEh9f9^qlwkFB%9l@EyDoW0NM;r?6aSs|u33RZSxWt@DgZ6iRRJ3dCe7ACApAXtm~ z@x=5aeld-MD*N9Jj5SR08S$ghBi^cdv8?9xq1>h`(lsH^vuhH^98N!Rii>KPzsmGb z`A(bs*3q1b@O?}P-F~!5P?bW1hO5|_O(CMY^DuEpEIqy`{TcW>1eJ%!R&|nitM(kr zE~Z!L*?w+y<*dvvx4j_Iqt1H=))tt-e**&1+wMWymb;k8=v&+oB(i93PPFp@hH)zP9JQs@wB%$?B$ipJp5~_UeFi%d&ib_d%L%+3r0JPLn;< z>@!GVSq+;)HMUD7hV8F#NZjgCY0}pORvLYi@|;(7U>SchGIq*$_Ql zJPk$tb(!hz>6ug;DzX>{^;_XnQVz#;Px)^;`JeO~fTCj9lQaLYzSHoZz4?}7+G6Fn z0nXDMgS7JhJE9Va;OMB*XnyDV0PTf@2pm+v26f!_rUN^4e#*oyOm;PJ9Y)3TJ5slV z#BvM3FuHW~^ynet=iC9ma8_bA*lkxnlHu{+=={(mDrx(s09mkD=AMxFIXdKD=HlX^ zrWTRySyqF9a;*8D#CoouJHtdQeRXEoJH%-ilQ!EX^O-Qn?ok&DVev3y7!fl@H&nd18Xsg)#&vbI@*dk^ zKI@R-b=-{c1 zO>39kan8+U-WohSwN-246EjC;!bu$kdVQU48v7c9IFJ;Dar9ODUW-NoPMW74^IHarh+ z=EQv71Gq^&xkJPishj@@(w`Mb+S*sfGIWzLm%`=(DJ@(j#F<4mP?XHn7k z_{2xbmo|6QOYSvTLPC+lK3jd2``kAH)vdRw;MXm3K#$Z9Vq_v6qDvS|laZ;5pMS0$dz8g-BRA)a z;Ju4$tA>Y`<1vXWYIS|R3hb`@g#`imI^{PlXvJaRgnD6H$@JIaQD0uhpi4JDbz9#&wlJ1(nG9-bJs7Mo@l}!d$T)} z52mMCrSyGEqq99)``3q+xnZp%XI>lBcbi_3C00&&s+QM}!La6xr=JcMb)4)FiV!CQh%=N7tz=o^O)^Eg!mp;omaF^9 z=$0>>0f;ItE_Q%)$x!-VgS@L>07){VJHf5>wHtFl*mkJbC~KW4Ya7I;ro_Tw&SwMx z78UHC(R`WJ^=(~Oyr0_m@Gyf({eE2B zl7BXqhOiRXbeg#t$bZlqqkv z$)70wwjB+(Xp6sKCN}4=GYx-TpDtD)2+=Oa1fav=G<5APAWpg+<_dh8bFT7!{K>ka zlqJuYPhZB$%rW2EQOL&QED94JXKa@gh$jafZ;MUq4GT$e zAg?z}a6e2mVUm}Z476hFO3c4EBX`@t#c4qr(jD%RM%lmY-HLhmjouZ2aD?IUXRHzp zbYubr)0PH`f}-ijMGJUwe_z8q)1Dvk_s_f_DDnBJKxd|XL=-Ky^;SRnm4D{{x4e4| zu(nf6ul~7AKo6#~4g=dZZE+o4wyT9q<@<8^&}-oTv-bLBI3m zGCqf4CWkz!BjN7gfm?~nZNL2*9+_&-=T&Y41Ac7gMqP;kWPHBiW6L*H`*lMa{juYW z3Lyt|9;bjA$(CNZ6h%{Ix=$ZE@2h@e30$Z2;iD!dUI|c$UYW5Ok^O91l zmUoSX12Bv(6^Evs?^c$|>zZ#pE18>euVdnpfSrW90VqFCN#T8M_ZuB)ubOI_U1Tr5 zSnQ_J-y5*!ieRdvmc<%m$XcA<|M9tYJz_Rf(<&vUkdg>dzkJmBk?$J_79*sdBn97N zR<5$IWreeFjC)7q-b-9GdjtfLVVHRqQ!~iGd3IH zABi`!^iht4K+)%%Lz95PEI~YKvs=cn?{3>UXBa5smv?;}04GUvYm(%>a+iRWd&H%m zKF;U9{gyG9nqQl-9w8mI)HK*96yfcH^A*0Ht)@qw=spQ=AI5IkJ^kGEGTflhk75ie zYvf*OW36@B)dQmVtT5s-4X6_R&9n_i^N|UQ{oNx+i&HJIf;0yvADOMdXV~^guQteH=B#KEUbL>*wxub;J-UpbV(|59{v&Bx!wEjM<-H;ow)A0(D7Zm4`%Z+?F&&7j)!hR1X zPiNv$aDBQGf!7r2l8}vxA69@;?pmS)%Jg^+6wF}Y6=bEf?zR<*~DoY$tQyhk{{CG#f+M6I2&$G_d)cNcrKqooaMov0E3M>Nr_H5!%tBYk8hXVzOC_gm|nk2 z-M+r{m=9n>G11Uy+SAo$n^XOTj5!w$?nnC%aQmNX;_#m!4%-VCwfIA@9@_S0c)#nk zWxw)_^^)x9YZE4Bzifb@7*+6%^V#&yv<}5#sAJWHgg6Qt;5>e7SR4J#WUKcOVA2x@ zVE2TIA-0US6?l@+mX=zo>uS=y{#&+(%_r%uwA*0@Fm8zewnQD*k(Y5MzLR14;D*!U{cRMhQP?DyZyEsagm|LMS|v(kyhY3Tn|MG_SSR!Qhz%| zLnl4gWxdi*n=XzIFV9ecz4>YDaTMrO*xvL<7f<)3(^H4co7HrfYKoBS3g7|HG%q_l z8xgU&zpO{e(_s~%g3?!BD2+kD__h9x_eq)-UuQT!cT7;D1tf3;`kxAojxpirfSoDD zQaHJ~*GFSiwST?nSwGu#5;Tj!4vGF$7r`GV4_m%;-8maG1fRi|NnZ9@Hg1>O!iMv$|K@e{=>Z+C&yQ_9{fQ}>kR72eFU2}PK(9=xLw93yLu>I`?ORdT z!%S8*Ea~j<@g+)g08fSI=TNB}STbka%Cis2c9kTa> z5i%n#r>rcXj;9Wb}+UlFTK|z(an%6E$l|zf3PJEdU<#qtEG_N***NQpHOQd zXpC^2l9nQ`uF!D(-7}PKjT^MT?*)js2|~0Ac85YRMVa6}@|#cwTsvm+{?UK1I)4O! zb4ra&gWAnv9M_u-9=hFhatu8Oi{VLBGI?9-M4x7c=gO1~D6mg=JI}kR3akPFezN;X zqt9H9;)Fh?wP0|>7ag3ais(s|cizRe=;!~FnuY2a&*0-4k=s)N8103qVmOgz=7 z0knsXs$0S!0)w&yxO??-R6V_a)7FD5NeIRRb>5yPv>CsueTgUiak;O#juL&~q&_-) z2g#$6lImyqN(3p5-aFVIW8{$-zJJgy`X#~==oYnW`8Q#mPE5?G=fM$fXF#hlHToF_ zQvhTI!v>ep)rOfwn?fyT8$ml%GpcZcWiDaD?cd|!|9Mk4E1ksuUxxYQBB&N~=W^PQ zVI=LM90qOML9)I5ZW`#)7n#F@ipKODQWxW zQWn)_UHb+07eQezu~>G|aXGJDtTGQIc=RzS-uw5N26fCF|Etd>ZpT9zS#ut==hZm4 z_AuX9{R?J1+mtKyVvbL49Lwy&_-Y?~ZI z#-jiUcq9R@*AnSqqsX;*B+eGgD!95fvKh5v0MvCrPYsdO2-*xNSasoRyWMlWCK7tx zRxND$UBn(~W0vX09}+jIj}T1&(}tkzF6ZZN*wc0A-owdx;-T}?GCTIzBElC%b*Y|} zim;rs%8IG=>OyU%xi(HZNL1ARqK?E6d{t=-2@mQ{H#9QvG&%*Z^Mx>MVx507Ln9zZ~1B(27Po`K;@Z5K>kUQ~gZQ{YJjqgsSg-DIAF z;={6`f9c-A!PpbhRVlpW0k92%c;SS|tp(4Eo)+NmJ6^llNhc^M*WVVqZLX<__|L7e zWPgxWwKUA@j0LH_?h7R{VsmPs=rb{ZTta>v!Zt1XNW8XUuvBBf`gnVm4(a~MI%DrA zBu?kG>C*HWVeb*NINj(n|Al0xmul$9zcN6{!(2g=+w`HL9;>v)Z{t+!SK=jwNNc*; zz(0fwJ50(69l%*yc3t`?eqC}(io1~a-=I_E=Z6QRdN`eeT^orZp?oR@n9SX~g!I>& zn2_%iy{~<60Gs8plh^0?%1j@Tj*+WrvBI+*!L1fw0e~3e1L#IS$edHrR`17Y+;5u+ z@A4;JjpinS$mG8B`Y%QGgNVm*P!CyUALY8-_Vdf*c}VvNPHIuHz^Zn_($&>Xdb7I% z4k1$=pW7rAf~3lzTQ0*(z{~eDaOLVjS>In(z*J62_5X(<1K(j~@CbM326mnYrR;=G zU>jhKKS~UaM~>f(Nc0$THW7Zsd!6`|_}d(>)3WaU0g)}-Q0H%^anZwB(YBhw7^f#n z6Is3oJJSB;`E!a#i^np-R4i+~*h4-TpXYSz%R(`Uf-jpmPI>7JNd~Un$zUl6qN}I8 z$upldd|EB4*Xhc7`hmQE4mXVF&-Q(}`4ff5vVl#dTA5zZr zPWHQ=W#xAL90)qAiQkW^Dz|$Y+dt8=ysot8T(o~dMW@6_o&3PHYvs=^TN-E+JvCcF z5c6C<0u(U8oMF<<^L;Ua!2-T*&wx!sr$TeO?Anoy=?k znqx?D>Bn{Gs34e0t_wx zX{p5`ZnuK2Jby%CX&iAV42Zofgie&v2>T%}@I;P4o*yT{KC)}gCo2$&)=sQ(Wr0oB ztyjUOg8;;?6vu>MgnyEAxXSQ98=bb`&d?R&aC0&}7vFw%5`TLzGjtUsiA65Tv~1|rk!B5Euo~#u-lAbXrh&W^dUS*RHZjq(?I)0UX7k!`3oR=?cKn=< z1KRHI9XT}VHo<31a$zGXuu$y|ICi2Mi28%|ux?_aX6iPV;)|<#BojQnL=2dt-FH$g z`~Zf+R+Uus%BLwx$xuHv#i4VOm-{>ap=*VkmM#C&XnWm$JnzE#uSV30~>ZjQM2LilB>$?fK+|>t^lWbAJrymkotcf$?ecb5wG%NIj!(Hl~ zcB}0IGG!R-X-kwGKe2XD7$+A#?{--2_%d^rOCC(f^;Y zNId+xQ7Qk8Y}(iABEnsMXh83wqlMty)3vQKBYFR2P-|Uz$Rfq z4Q{FVnaggAm6d>-zb%v2X+TOKba7F8+4w5pUxU)aUOxI>PkL<#rojMe642*lW2dif z5DxwSe_He;RNyUDJ>m%YeZ;R!g8TU0i9@fQg-e^^np_`iQ90rk&Yw<{u02jPIeaxcQmuoU@I}oX;EN1XY;M_-d#J-kWG7 zP%PxXLyPH@KsC_4wmAluXkeyohrlKImy`L41nJ4qgrfAF(8i3+^OK!zW0H8|9^b>^ z$#VSMrm2@9P-Wt-^x@EwYy-xJQ`F)nCFQV+c%5r$^?m^=Ppe(F!WXN%zkatT&*tO$Lgu@Ium(MK$g6LNMVZW`otfugnO5u z>u93`KgUl^p%RaO{WiKzR&{iOGrjBS(^+6~K8$8Rl{5OF7a6rlQp>(@j0-px{_Dj+ zORF@^0E#_?ogbXVz#N-GPBzolO)hfGf>qxzEW@vrOcH_hQ*NnNta2_>g}4`k+<;)D z$@AIo^5#-|@qog>iaIv8GUJWnW}!m9&8C*%h>Kj%CoIA89VrOFhdag8B3RhlE7ng7 zB;&lc6uETTMJG5_&*a)wwB0JB>ND`(3IE-9o9n_2g4wJ#JBkc(pG0aPgMVwY7SMA$ z%Q40b`knc@dW@C4H2S9ZdbfCnE*LlX2%S-GQurHl%yRXw8H-Dw8VFAj^A==#w>h$} zn`OrZPk(-Lgx>)bjH>Q3W$IVDN%1< z^^s~^zyGTp;(^t|upzcdFG4H3tnmUgJpiawO!T#=X@9A;)4y-E1y<|X^@*h^{@{|e zmhDpA^uX-%im&QyY7XO}3-~^v5c!$J#=2uo_x*%t*8b0S;r{nu>|<$dhWZ|b666e; z+&kSd>{*G7;eBh{+x%X9^gjAxp3=0X$I+b8@raR4wQe+E)g>6(cz8ehe3~C{R{PD( z1XB4I6|ML+l4!|-LqC9ILg_t0n(3KR(}z;s{5~3d$n=X;-oH4j4|Bu$osneX!pmN@ zrQy1PZ=CigazRc&j=25P0124kqELvc|MLJD>-ue>)9K4Y6wk>bY!rE_zSmTcM0E;@ zgw5o!z3d~9;)S;@epOg&$x&5NB!mOeCYbkau)9~i3!rLx}vDLwgu`wBH zAP|=rT>a6}YW|T{5&;%mSz-kab&aEmYLaY$mkJJerUqTtPdwN)Y`8()k?d@CPZJ}l z5{hNtBx+WE_-;p#4Py1B%A>?%d1B!OTJ(1P^verFAg-Xs#e^?C1Rsd_-BVv67;_nI z6dbQ&?~|j%dIC^60RRC5xZYOa8q;^7yLITcSTp*9MW^JMApZ8MRm!YBGR8T5p#L7p z(IP8ykb=F3=JwGaW+El>;76m2Ds%@4u^zmqBA(!0iOZ4=&~VLh2khd{KtZ#0zg);Wa+Z~i_~ksznR?@p*{QRoj@9I3^yHT!4} zzZ&CCLcBCRZX46Upf2MtI@FPH3%D4F&fo1BXU?g%)vL0inAqzYVeRB9qsdcda4{7~ z?NLz*W|JRPA4ll&Z}(RCC!<|EMoKpY4oRU!dU`@hskx!+N=?#MQ#qLO9i98poZ?}7 zWw{QkjhHNXPKq`-XN|ajKXWGQ*klA6Z~_bs7X}QDr)XWTFy~E8&c(fZ#ONC8v*qd= zr5`={vf&)`0c9GN*#$HR3Phn2YED0CvO|TEun`&Y| z&nUU2d%~#}3S4n`YZeoPk_#RJ$ce%?=!gTSM4lP_odaqjD~-GNkbZGKBrI2LfnRc7 zEFac}t#ywd%Agpdjg8O!LVX=SAgpaejImU~`m`NcmvyMv?8w6&S2oEx%<3wXQ+Y=xrT?X;Hg8I0( zk-sf+A}hdkCIN^yyMwtAOWOvQ(XMPPX{EZB{c?hr8M5k#8s@c%0;LNqa+94cMm(QS zr`2(jrcLrJtBU z#}9;rJqf{M zHE!GAXG5LYUHiedu15=srmUFiU*9>zb6H_9zPmmjlcXLIEx*p>1n49Cl=|;)K|f`U zQR3-!TAocm^1T-HKfByeqvYWnO=kO8j9_T-&>z^`0B1+ET{&LbYT>=H{2#V}3LdYPOg~b&>8l@%i?A z6J-Ybrh1dj?I57Ug-84!e9{j`*w%7hxWGapx5x2dquBrh=x|f-p4*5?f+Mr^=-UU` zk*PDyRi(&g{lYme?7nIrDdp23b8d%s;8v$ zO)0JqweJGNVgsrpY6NbX50PV(_emtpy+f2oV{}jzBqStCn5q%X^Z@Xbs9|=OQYMG{ zhYH54;^p^Kv?N~2)B)UzTM}o!!?|e-~Jy1n+bEGt9fKK(q zkWOi_`sSRhzBh(Linkk8CKis})|5r2_oCX-604y$#|E3r`rW{gV@6Ni17u`Cr`&1CDq1nvtK%1IOI+SjC0D{vJGA45&bcz{T>Y-Kz|sJ zw)M>>6*YK}Kr-BBYo$#) zVw9WBvrL10G`qi*{<`^G;d>#!?e82p{?FYdikjBoA3}e>L|QJTYV=~QdpC(1kRIQg zZ|sY;f~FYX1gCU}lzIwTYC91so%~U}G!l&z5dFm53IphWd`DfpPN}ZPtX{4jPDAFI z;%A>0YAB-^pAl73RgKU61V6aE)oDC8H1=)dUw)gSDN5j;t?i9H+&6xG=lXA zocLG-(ZT@tWAYtf`?Dzmw4l=B_2o{(8z(=c;qk_GJ$G5U5{;5hi#{k-izZjBOX8F3 zyJH(9T~Va|I9Wr(5QT2h*Nt7+Us^BoKihN?PZ!0aw|fY%*;lJEo>y;pH_0er=D%pt zj~ngN_rL2`%XXj_*Pxrl^zoEYqC!75yKVaGle)uE9!^mPs-8RM1xDW=`T2F;ebR?z z9wG~mdzFj!dvTpkVH#mI32VnlPU)8!2+@UK(7ryyTtTM|D0ICAfZM}&!r#fobLe)5 z;`-t3I|FQ$RHqX}9DSA6nr~9{ngq;d51D}LtzRi;R7eh!GA}Of$H=BfJ(iV|S!>%3 zzx|Y{AeImV2Eazy{zG9Kmb6vEXW9KgqyXnB_9V(4hf&k%G8hUP*Zw?qWe(Q2P*Y0~ zZh5PNx`H)tL&Q=Bwq0^laE|t$4&EKn$_A-Lps~vaX9E=E8_W{wKF_?%m;i>@7z@nb<-W7_CMxQ^_gEp4t%)#>Jg;-dOgq@n0mz`ArJ&Ka?&O~O=o zCJ6~3x2qYu+$f-;`rbCTY(K-y+0&JOAq<2?puoXRqH9I8(qR7jt|!7P6#qMgi04=~ z6bEAyH9mhFj@&rr-!3(-4w^Of|0C)gqa%yDZXMg{*tYGYW83K%9UGNY%#Ll_wr$%+ z$5ux-@B7_*zyCE()fi`wRco&`=QBZfYY2q-m>Qq?KwRr;TipCB4Z6ffs77+JdJDwi zHO3*)?UHMHJQNASJq7|x>DD`37i1v4FyC9H2z{Lz=JyeBqX3_+GMjPcp}4N9>b4<; z1eZOJ*DD6gRqJ5HqXZ_tOnwt1NB*G(aeaZ%u{b98NV+cK-g_>i!v+DCH)rL^n!T{SlBls-zzAo z))8XF1+q}ItXrONO|%JeoSxSlR_ZEj3l`-a>~zB!f)gffmus=~_Ub5vn5_YYwsnA< z8Kiv0Vf<%o#xpiIlXAQIQjABRE3*9}#FIP?`6I6(`a*-GB6lx0>4qC&VAjua96YmB z%c_F^zy4~+-_4wgv3XN*8p1Lsa47QAb+g1Me9yYMDqTh{I088w*IAu-`P;mI8cU&G zlsQwUNH04WN3?x*y?~;O_tKpYp>6oa`ENS%3WF9;<09zHJo-f>JkpCMU4`UkiLzI7 zB{f6yGC7f)oA4ZmQMDSEE;P5l{kTN_XGf)-{+KS& zi{d;vnTrmuHmM$xt)aCc*tcoswOUiI<^H2`P8|)sYU|#tji-KzUwPc^-|@OvVy6Pk zIx9FbSWh`v3IrsmELjvrGe$fpDdZa~lwk(BDSGbDrdxDay<&r<5e0?LDGKYyv!fqy zxK5XHy>lBI=m2D6qMV8&6+S1$^c>thJZP5N??+bkFU z3y?XA+xgWJAFr4!RPM1BtyHHRupEYl+dD8DPW1Zmm8xxq4YHv;-2xH^*x3*&}-hO2)TK?8) z&Go>wpLJm=$z;~W__dklY#bWn(SCQm#@0GZ%Oh~V%Ni3em%JuT=UVh4^*by&ou6}k zE%zOl@b_`L&<58<+~7+AiY`*X4_OMzZN1mqiY2F4`GZELNzU}6^<%S54XJnTs5(uM z=oKni`-~Od7H)@P{M}W~!gW0g4hD6d14uov!1s-2dsTEAWZKJ?CwOVvZ$Ik`*#<|>yAs#^l?wn zMF}!+LXTJOpK0;C=iu)g865en39UMzC46)PWS8XnfZs==>~$#DidSOw*+DQIlHgmv zuOYf!YatO`^0n`ah|1oOI=R-xE{n^;@l>Z%4HB4g3zo3zHND3Lx{>`?`cTSI*2FTcv(6?c;Bt{U{u_)33z*i|BA0b z`#XV&FGEEh6@&{@iqWP`+!a1?NY*EWYF^>yL1v62?ntPrw~Jr9^*7GHM&v?tB5*$p z=$T5aGE=lS!`pqcyOW-7vOObFa=xk`+wxdazo~6P9ixBZWb!3xf@tb{-9sil;IaTq z8M%AX_*7MHmG|!~6K?kgM3R{dNE)S~rIaxl_30sRE@WUw>`%O@I^2f#_@yxE^{7J= z;&;;;3WD6OzME_yIG&5WtggM}?Qa1wyRJ{7_)jO^$ahK6DmHkKzgY7nid?0ZD)TI8 z`l30B&_tc;U|`^&N<(DVd``~-D~p}ynN7aGLyvYrfni{|7iVYXjViyAjHcFI&tOxD zz7rKacCFp>fNbv7yk)zqGZS=}LNoezcRf4ty7t|0mri{zqXCD%%UfIOv2s8(aRd&{ zU$1qaWi9+tB$>J=IyR#UMEh2htS5mZJtU7#HS9k=v^ zs@Fv>#eEk3oVqG`8e7YJV%@0?_=dL;tVZwLknkrye8}@|8;8?;C4o5*Dg?JnTNnyT z%hJz;*A*#Rf)N+=fjdg?lanC7lgKGzDYqIdkcTq^qg|IpEHJ(RW|ZB@SfhtDSTw$W zPakTKd*Bp%v~Z8yVln7^Lf~98JsR)OkPY}g{s}&B*kc5_K*h*_L?$ZEEbtRn+kip=ejsdC=cx>|i$y#$ASy*{`{Eb76oXS_qXugPg^98~Pz zRT(%j(4f)#e>(K2l-kKbv*JepL;iO=+QWe4u+0?m!I~~q8no!8t`6S@5aT;N)QyBC zeA+H2sJq^SPS=C<*WiAxzu`mQzI=2oM=?j;c8 zQFKhrHfQxzKR7j(Q z4Mt+0(0;&KK1-A8E?+0w3+g~AF(?O+)QaL}))6uX3jF2KH%k>dpcZZrQzkn-7LKkeTdUCaQ zN=Xm^o=9~OtXA4kH))I=R~W`ZasR%)ES)sRe7qNkqAal=jZ)?6$VOTEV4}_3ES&** zvkjB7n4xhUZ*=fan6#=1qVZYNQpkOANVp*5kbp`K3ir&^r#U6!-|%lXmF15tKCilY zLC^d=pCLZ@o?kT3PvjGqzTI$!VsuB>a|0v9j`7GFf`T&86gJcZt-r6VV52T_Nk)7JC>1%+;>5sF|jO`zH zZF~L3Gu=5EzuO}o!U%~s+!;nbG;aF2wQSY#Wf@}w!U?R1vvl z=j{Ic1C5XUFleL2;Du(hff8VvIgAX-d>RFq(8e;!q(hIXtkHx}SCaPKk8^$8KWEIJ zg(?*`^jJJe=ol1xfYKUe%49I&_vNU63CN~S(umkm6gKIBXu=B{ipjbo{tf|h(4Q^m z!~B(P)p2fm5c9mMX+|+}lxFc&nJdSsCR0}aeCaMU8h=#y!F+N0s2&RA`XNGWQX?bI z@)g$@)oK?Z81*x!e;97b8I;it3K1#V4XuR=eWw^Ud^z~0HZL`zmDx^tVYuDv7)L~i zNQmo!LY**=GrtdOu}Pfi0*n|396%GGN3)Bg#_(L(+s1YAHYBC@E|UozXiq@F=zk*k z!cv7Az=yENGX9Ki8%lvsoHK zkwAPJ5~C5~X&xTXbfLN~&R=+t&nBGj=E0?Qruh`msZwg8>e|BiO|F3O9t1!bq@K^g zY^mwyOdBW6t>&y6E7%fR<1M_rI@Q>DCi>wg@g%JIes?PC{2y_!&RBV;m`}ulX zwglzP3Oy(oVYzPjSxXOWL^8RyD^;S-Z^Vn%HITdIZ?Q?5Neo_A=ccig85EdUk313~ zFEx|E7fZIgyA;;pL_y3B*qa~0;gaSKRBQI1N5m*;_+`4Gc|;_SMuCZu*n;Co^tOSIEFkUt^d#dE_niSvO4(j%If)( zTM*4V-#Xxa%iMWOZUHO`mNB!^hnjyB`bLQ`C6OX{bwMG-q)OWRwy*vHq`s*inF-y` z*$Mw?c6{PS5JU+|SfLz_1OkiH4Rj$6ib*r0_chzPAn+~z=>8c~%E2So^RbWyKIFqI zVbQ4H<)UGwYO}a`mQs&L4JwAc@WrC%wm{E$Ciq2ZT}9CIRJZMZ%yOQB6kErX?{EW0 zXw3ClF#tU%`fgm6NOokl+3ED*)6}qAYtcC4WBYmk@Qhk>+a<2^>zZj08Y#27%RAf{ zCa04_bLXH%$fam-h;r1zo*^-VFrBu~h#--v@U{XObF6gik98&5nfAcu=^ z2?*E$wrdSVy>b{{QB54C^HH6dK8|JFALi4Ag2p<>sYkSgvk3>d3fW>2`AXsG@jxZ4 z0CCs=evQyCFMAUP6IC&K#l$JnGwo)4hl+}FDOsuXSim-!pZ$pI>;BCVB~f$oscRC) zd2qEdxVxE5Gz#Sx=c|ZsAh{Scxtwnw*Azse;pb%(d1>PO; z-@n0-pAh)=5@r8T5snub!1!X7B-iGas1&pcJgwEI)57P*L%Mk_+W4XENR$26$sg7#8P!i*Gi<(E>x;2E20qVXve*aK16DpFnutz77>?*9c8Sf<_pTbk zN=v5;Vt5-|x54s{A_kt&2XMe9rrum6`#oTyNyvS2)3U8q?vEmU-1)j8>us63ndgi{~5=CD2hvZ$cue6skb_8@h(G zyN@uNbNRP3+>o^UGAK&e*WcIpZE|ho9YJa@MJ4c)n4l*@s;0?G2-3k_K3*K4+o)A!~=^S?-8w4#%-D?p74PNdlj}CCx(vBhiX;ZKF`Vjw`bCB8F zMJanH^>)L?!uP^gG<%6-#Fc&OO?mQjGl|7WyUjT$D2<(gV!SP(8U_nRtyv?2Nd7Hp zzt>-M2I@K#UX#n44(`(kHhReL_DmF;qVK8L4)XWz!D;DMY@T~sn{a~47ZyY!6#9V9 zi`w3L4FZj?FbV+6p3wCmHB)h*SMzEvSP_$xVv5G+YGVD_nl!*?qwdM6B zLtn_VrXeVMf%ScW|7YjeYaaog+0vFBdEwWkXcPYG%pJMq5f3VCs?<(-Q`AAnAES+bTk$!+=nE(j7QL&}42SX`?_SSk z&0b!7+U>r3^<;($BSlO?$%tD8c!VcqrE&=U?G3lPxL1Sf#H6bXwZD0l*w>;kK1y^( zqmW&ubDGviQHP4Iic=rIzKrzF8~d}XQLLf6ccOZqXX{?@y?0cqoL2|+>#h1Y)vc!# zW&*ofN!#}P$I@2|g&+vGNA$N9ml?KT$2vZ0=~iT9;3g>Yxh@urh@|r{cz@Ck@?KqH z38~^ah-=m8c`jfB9bA*Ew*t%r*l7fTN3uh(cX>zVG43?rJ1I1`Yp#@XC?k(2eN|;n zN0;5T04#r?^I_IWcj5+72mW#0`buRE!nPI3GEoG04+``&4v2-I-Xb0mTT>5E$QqLH z-4<)|uhl~lIc*nb2ZX0OVj9Y*ZQOd&jr};Lb_j}eee#E7pi%#;b z#(wRm#}4I(aR`4}D<9gJ5oK(1%bag{A8D$`K85Y2=r7j8T?7yTJ~59bKD&nVvmVje z$!l>431~IJf$wL&5r8=_pnLSQfH zZmI;f_FXXRxfY58*~66AgVN&{?$C`fc;GT{^N22Qxy`KaPoM38wN6eApY$HoTvLcb z;u2%9cbUIDB^Eo>@yMrxCi7MHntrt*i@WuZ)}~YSwn`S4mHbO$|9M#_e&F~undmRp z^bVpkQyhUj&26Kj(99Ni9x-?>pEiMMp&+on&HlYVQ(~3cUY~k|30#8_2slAFn>H7f zdle^EM)g*S;1RFF0r^4JbrOMPKKAp!Gs1HJ*zN-R>v5ryx3oIbkmMJHg-1A3Z!>|g zhb*ZN>^4j%5h1S}AAeNCk{51}Ey;=5O_tF%^MkN^?waEjE`R>`oi~UoqEdeO|5yNl z(&(>tvf%d_ma8Sr-e$)nsjA98q`s3*cn5VF<&U@rqn(^F<~f=oo-zKy5o6HV89=HX zn1C$$TEt*2?hPm~Nrdk&eF!m2U9mYB`&$x}!=R`|dCoS{#uKfLbk1^+7TtG9@|L!n zXluxWYV>(`1uZnnJNcoh&!fEF6l$T=Y2x0;x#Me)fhaA{1ndfxv2M;wx60Vzw;({Y zJnY(B@8*I+U*LF>OW1+neYK`fwI!b&F&OB5S7R|NwPnhtNx(A4kI{Q^N3dgny_K#v zeuVO%y)2x!zUcYtd;%@B0JrLGk-6l%i^?EakMKGbs>y>g0k-(5SyGShc|(DvXYqQC zM=GWmKeWU$gLqQjl)(OH6#9SNRvUZ5QxSPY_{5u#r&W($3xgQjys(W;mBa6fV=b7~ zvpWysKem}N&ns?|F1ZD%+xiNFC7;uqv9Gx{LTIS+DZEa~}u2 zi8$I}QsrBL+{@xGH-B8g`zYPHrS`9np_!CzX|Jk2jK~=I623PhQB1TfE2x}ZY$^?p z1QPP}R=IWA@Jx6i?r7u(%ADXFC4_)`ou%@9j^{liRFQa4yz@oB^H~}tb)_}2dv96L zctS`+bqJVc2R#KcGwZ19*0l3%xZ z7&^agH(o8JBS;bgFd@3EB=V{iU8Z`C|EooPG-5c|yCzgAFFQmGp zoqmtr{SCswPZ0drV2=%p2k}6Q1_LEcPmUq9d3+-xQx`Qu`Y7ej<`7z;IBl9)6kTGf z=ete()+GOp$av}``#ct>YdIO0Crgj@`G}hQ z0Ggy_b+`p|HFm*OJEA%E27Iu!`d;CpL(Cc7pwKoICn7AYz#|^pB`jxy=Ns18CPm^4 zNvZ6~Q{q8!tr0Gi{S;X5O*j-CvEn~pr0aU>Pt|h#Be)k5oSSW->(0^M2KZHZXnHK| z2}fyyTQn?S7lIg#Cyqj%Yf6adS^cX{Ti_W#P(g^o{;z*Dapm_V>Rp+;_m*&tL##Wq zK|wI*-p96~bRLs{u*xrxr)z2Z-Pg0fE%<3)r`g6t?lp`!%rXG|OL6Tk!=Ce*2!fQX zy)pQ~D36!2jI5ntpRZyOZ^!%CtKsVN`abf~&}(xui=y7Ov^nP>@p@3IF-2Hs;OS0q z=QQpYX{+C?D~#=p1A{TtT|8i5pmg6xN`!U#f1QXM2Yx&Pe1_Mo#Rga(>Y7I~>dQLd zK(fEf^RU*q^bW+QlLmA>()0b(=ZR5!Uc)YOhLq;`I~43&KNcD)BvM2sN>QQ_V1{2` zmXao1bmd-HQO3A36D;x{E)rShg3dLg z-bB8L;1dj!G#arn(f?l9z^@&1b}$H4@!+fSr2BJhb1`v)rLarYXSHxQ9+unw=Y-<> zO@QaiC(#MMyep6YK{HXaEj+{lP10zcF%(=Zp5oL;S300fg4cvHsryq>O?i`!90$6O zjUH2mG)4|JtCrHeEdat>8Hmghm=-RnfZxRBP}PgMpPKxr+&+OIc5~_Hrk~t0N2TMBR0WI#G{!+(e?iisl9p|AQPM;xyL)@^?Zs zzr9q3W#IIry)NaS%Tz&$h=EW31=3Q z4s0vVyvRufRK@0fAL#T}BC|`-1BZI|;{d#VVxme3F2xS0@8E0Jd5F_0N+V*iTA^(w zKtV9`LU7@hz&gO`_-%R8p5Xt>*IULw?*&%Cs;kN?h%e=rR5N7(w3JVzmZx0ma+;znll`+88b?6ZV2Sb8~bcT_3O?(k#bV zkE?QqOBLZ8Kfhh+7~D#sv{`0H$KZ9&x&gq4@s)B-J51@i8MtzfT~Oj&QHS7pJK$=m z&g=LBTkZtnh8RdQ_GD<}N%r;?vyPA4lA(t;I}f7Yk2|#70pBxsqJS1vwu>zQ%vn;m zr*t7d3yF9ZA9DcUo^`JXx&3VOA>FvKvjh(!BYa9aP}v7`8?EJ$c+nfdH7yWUIv#wi zj#p_q6{U>uVb8Z4vs^FT->PYvnNS<9%gdgK38Mw^bY3LnCvGflO6N69o$m4oXWFBc z&!W6vcrLlP`RQ!#PAnnoM>Ng6iJ|5i!lQC?4(|iy!m9at9G#yBBlxKW4&|=6G+ViE zwO%9Y{GT^hJddrNGIr7fl_#Y+PDh zL}o;*Z@-r)3LH42B9M5Hd6ug7*yx?|KDTb&H1fZAj9Bodw?d8T`FS%GP8E+Yb^JiG zMKyfYLSA1sHHA=FcrR5MM7(BIh%LJH3-zhPNKFwmF(u}Ma$U;4i&#+OrHzKYZf%Ln zy1wlO&g?gpjP}Wwf3BR_#YQ@8F#z`K4MM=o#tOXG=2(-89ipWL?gqan(!VK>D_2{o z{ zv%l}lx8l>%3(C{q+^HrWyeKVE**UdAST^m=8Iw6Lfu>j>C3fKbYTx_|GD$=++<6yL zo>RzjQp@EjL`Qv%JUdKMLtTbu=T5K)e}a$2gi>^Tf>Zzt0Wm@6d!O*(i!5|S<4*Q! z;C%W6CBC})s-1WLlIm$M%hu5XS5Jz+Nyk`Rpk+LeSpM-=o9VowbQcSa3`K83CRmKb z9NjZJ?eQ3RDnttxl1s36W7rd!#Vaf#th=uJ=Fz)aoHOZZA$V~OIhHCNScIKHv~JD@ zuI`p149Un%s^of%qqvP^CA<+AczT1$wlt~XMSjgy1u?VWRETf*Tf(aPX(-X!lDRWD zNHqL114kB=v05qD_4;X`R#bAPRQ=`2glewq=TV2E=6Ls(w9{VE%{*Is36RS=cs;rx zZsvs`bf_aLv`M+*sMXc@+XgcPI<1ZC(YyKEpRuRrv!S%<|B77yi~5;Hgx2vyip6A{ z)uNRRJ%o8OVK5Bb%xh|NuyMAdt(B?!{_w8*kU!=sHqO58iJuMTP!tvc7&(zb9Db<@ zT9+L-Sxj^LHv7CUF^RH3suF3ns+3of@B{>Pa*l4UiW2zf8Lk=XQjB&8_A*J#lIdU@MoW#4Q!&2d9~HrVob0wqF3 z<#`eCD0wt;Q$qswPi!czDH}x%3C7N1jEXw5;;F0DZ{wbRH?DRkF zY)ci9(A~mHp<5V)GE)w}ee2izodes=nL(rp*ED37Q5y>i@kN!5>SQj1gWQy8T3u!b zp603DKq3{>C1_3sk_`|`@2rnyLrlPv*LW%u@TGZ+Reb4J4rweMf=x*g9nu{qH-6YQ z;aL?*^MFbJyct2Lnnku<|3~XP#l5U}0_XC+3+)B|`Wmb>5p44PEEQT(9u{%HX1A*D z?X7KKr`KcV(92X^K$TkxaBSCX=Qu7oy@A3I>Kc)2G-Qi?V<+Lm=lXvAq znlP(!QV0!M@$ifZ&zaFR|x*HO`p?>k%6HPzI8>M>cGQXDg@{sH4{VOtj_><9neib<+E<9F@u% z>HdH(ZWi_=k9?pwRreed?J%@1qSbjwI$2eEqm+9cG?NKhMv4vUq#U@x>130*NCFfr7qB-=?l*xp1F<45cmZ zZ1VdefJA@0V)GItrY8GRMgf2g&Xn){>VHvT3`p#s$^7tElaP#k*c*n!_p7S{8y;*7 z_Z!1p8u|nEll=Ugt~2yGw1vfo>E#K=jFnx`|I%_I?8^I!d!_qEz9;+T^@(8}Amzm_ zk%qcCfNiy|bZlST?Ut$qdeH@^YAD1I+t%Zgg}brO^rzIvw8z?u;eDF}z_ek;NEpjq zz1QnmDI#a5Nv5{XrFZ6P^3a=(1UPPn%(tlhn;yrlii84@-w?Pv4eGQv*jMj1#i^H4 zLEBQMvh9#r&&W3Irl*>o5QC#Wgas8mgAg1sf!u6vACDyB$VGcoz0C&gz1)d)TR z618jZ{#;MSOrEH3wdBj{Z9g;5ZEp*5r2Hjklsv<0dmt^Tpz%kptFcEWxLT`Ooxd|P zk#oa^Ui7UEmhjGJKzJK9MtY_qWKjpc&63t8S3_;0Sm0lTcy_seJ4O?vL_PJWQlh;PfJQm<#s3LjA>fHFXHpc zz+V#@H!sH&fLBOfLhYSXC|@b$l%xT36J^-H{i#DWC~npT?LmKXVtQ;gyR{=s$4&x{ z7mBWdg%&#~4)`1%VXfS4!sFN69;sBiZkI~TSHML8rCIz5eod8tfa~OOe$LeEncTQF zeGHG!+n|{2n;%lW?Fy&#)FcE7^uZa>(3h$YKc^6&^#vNAlt5GGbudJ*j?#R8m&P7y z*3Qj$&P2t9JR{=W{jTicLD|W(0vMgp`~BzP95WEG_-omIqml?aT^ISJ*D19F_U1l? zF>An7_JWg!hGD6#t<6m9bUFy!1MC$gd!gk#ZPw`Mzkhx!$GvT_6}F9tnY*^W&40d6 zo*fk1_J0OGotL*Z*DO7--DxL?mV2_%{R_`uCreg1@N|>6ZhTZ7n{T6zz9%i)3sJUH5`!Qx=l|y9 zOp=WVzy0nx>#SD)cH~UF8s-0cqIHoRat^^lsikRfSe*`q0at5Ozxz-X zR6K0$79YCdGaGW>jaSP|d8sVy4kIz|{=)H=4QqqEMMW!A&a|y%$Sfb|sR~BzpxfNt zxK!I3blu%Y-ARKVycSq7Zb(W}Gl0(4+1V9qMT1J<@Ea4}1y5V7V)D-Id4r|DAz!3i z)@|f%UlR*>4*HFROeqNNm=halQ{FcS4m30Zp2;O=N87bZmLon5d+HIMvZgaiLylT{ ze<)C46()I0Z^uH}8*oX_Y|*=K0TTEfzJ58;TcfM(WX&l)wJHj#6-1}|NO-NDRAZBs zz!4*UFw}ebHklqa#nybSNo03$DSf)>;=$fn(m+x`a46`*K}JR&sZF%%yRkkW3BN8Z zeL7u=*#n;cJl*YoWY<6UI{Fi3G$5%-GWEZlV=Srmi*|&CW^^E2u))mhMXyGJ`&FEm zQ=aeh#m6fn@V8tVM7;?;Rf98EoZ0mF$98dx#;?lx;J}UQHr<~oieeP!n$-E|`lif=T0QhM+ z#Z6{MW=^%OAn-s7SR^>h1o{<#UpI>*zt)p!0)u9RO=;-C->?Ml>Z*S{gcKMY^F5kG zII9*QVW!c_BPQbwh+f&Nm*3d%NsEJ{{rzyjSsu4j=cVa^-NXfTP1eaqH$&RRZQaNN zb;vhQx69_lBQiSLNY}(Lr3gQ>M+DRXZ~u~x!^3hv$XnMH3j)x zK|h)4VD4VHP{evF+s+?mQ^JnVWi!APHB_=(^vB+7g0#kmhC&C!h*RZ4{DSA})vDwO z@X{8YO_p&yLXgjJko6)k>d#irvg;Zv?{U-psu?vI2R1+m5e`O;L9cnlwCOvMsd>3b zvI@CF;rQs?bwq#*f(gZ=>qh4UkbnRN1sdolvim^hFwU{7&@(Ee2mf#~EJW$O$|?Nj|gpq4TYtx4l=Pe@kV7OH5Q>B&~)g2nvV_^Dd7q zt^6uK!34epBj9o3qZZ-~F5uw?>NW27(1q2%Y#ER#mJYg{lJL2CGl&R^qEKwe!hQ!( zfYD!FT#$Pugw-r{kAm0`Me!4$v*_GwJ-UYuYnieQd;2*u=R0zahR9p12{LYH2hbVjOL;NSyZO9p5mXhBzuntw-Z0%?sI)O3|S>&6ej={utz;jMJm5wuvt*$U6F? zJCHkeOrGJUKIWIb$n4*I$kGTcx+ z>~7alxlbQl0Z$L4D!+N5)QMJ8Qx^>^Av><niJ@jW#ZYgwzA8|hV%?xw@h;W*1f`K* z7R7ZF+?$GK1R#R8FzlC3i4g{JesTa?m4rJ9YcX`bvECfK>$&+Yu=_X)ik%cxIQ^sy5*e z?WkYNeeT=Wad+2*H+O~E7=uMVb)R{{bG7(%w6yPE zS96>>$RXyuiryshdI6AE31+g!hKO{IUcsORkzPiU@F?4j*fp5cjqp&j5nVa-Uc&|_gTNk~p8p0p% z^EOd3h-jqi^I+L$sX>hhDQj7~j^=?+#h&#|hGMLZq9nUVI zeP{vJB8$iF5Paml7tOvL0c%IX4um5;ax@TR8RTV%b|;*vWGZ{$?vp7`2gAgF=U+wL z@w?aG*TP&n;cJCFD{gb8YGpe|9{h|N3J)ipOptITF`Tp2Ak?SpY^gI)Us5MN<<~tt zaaDrb3^U*an-O=j69z~W3o2hv0=`RIFR>vCcM=RX*cD&y7?Btq!I$|BpPETME(8LY z1vaRaXxv}VgQaJ)!?3;mqoY5eiwgC>Z_nFbc8flqdwS^4mu(Z|nPrbMj2MAfjC!P7 z9V4T&B%2=d4`{v6R1e+VzjThL zy0iiU0&<5mXzq6ail286bgV8)nKltIDMH)6HIvx_vOsTOQDdXnw)eH@>xQ%a_%3Ld zumr_ugW{KJu{NBrB{+rB_xFz|DT^z{S0#!&5PLMZ2}&;!v{k9U!zJ!JwLrSB5A3z)L_gkL zPzy4jMQk`ao5Y%n{s%G&s9u;$5G4UR7V6?(+0_*KZ$ubF8nX{SrcxF;AD1qn*M;`0 z6Chyl5n(nLMyGc#@UhjnFD*8a;oAtsbh=U#!zip#`2rOYCXwbj{e#1~>tq|+Y=BGq zZd#XU?5{Ez^E6|8P7agr*GP})rfO=!g?7QwRfm2GGm0wWXajHvuI;FKBiD>gWj=ho5X>J?JI+H(La7Wb6k99) z>2%J|L@$_ixbNk3Sj@A{TG|3_+UP43jcM66^yp{@J2?=-EBh?v{%R^-R=KVgVMA~< zQqs7FlyT@P?2X7gx0%t2Rk$MZ>u?#YL25Flm9UFtn31>!F0rtfpIpJ? zBTEPn?z7QTRYa_^|9qtpAL69??zm!j#35C$t-XDs_~r7Z4th#uRLJu$ z3<{}WJBolysR)v3;ZIrSZ~DqP)k(DEE)hiz@AzonfZ3`a2`_YlN&-0p-5a)3->@`R z`(IrLLq9ou0R=NRcjwSkqo8-=ZT{UO(l*GpyVrV-(uw(}bav0gcvW)tr;?K1YlC() zmOOab}#$-+Sf$>uQsUe%SkrUvhw)xg&&@ev8iF$6dqbD(}P>Y z6jgUmtIbP7@!Vukh$;;D+p=uV4YMVp9(kx0cXsP_+JEvILJ;F>cc;U-jyBrdQ+^~R z?&G?p)D1|UHk}`x7K!aMF=dsQXeeuw=(=4g#s9fC{dZ_YJk*(_I?b0#x8ZheNy4i$ zaojrNb=itaCKB|L|4E4=@>uWsjMTLfJG<}7Y&EL%g9q&AC^{=Zs5!0 zA0P_&94aSm=>LAHslY4@Wf2GCn!WV)Ic-C9GlQ^%pZ^PJnCa^ZVuDF$hT0I0*Z9s0 z7~SEMM363z<3GgT)5~T?dxVBM_bzShRC6Q$4uTLz3@hFH@JGFxtDgN?c&u-mC7>wl zn%&Gbb5VB)Uq3drLK73089u^aUS91#*_sj{b|^qrFI%|n%S{BBk=e}2zgv53{9Jy6 z4674v)x+i}Owrd}q&*N|;S%aF%Z}4B?`>&5Ci!FWAwTlSenkKKy#Gf|S!pW_6;{ax|DyWL)#pThPV7Nu1=K(_b1rtkQsUn~U7Fz<>a!j}kf)F>EkUufKac#ztL)bMbUX?G;S%Z$9oR>Gq7@U_s>8(4%Hu`#2hO z$v~hko%^O|;HK+|Z5VuMDh>#-DB3LXmW z;TQt=pSB^U$F}{Vz>TNSMb6QQ>R9L6+4rfa6%$kqCfQ`hq+i6dP>6)&-`Wi5!wsmm z{rOv`r6f%$GxZ|i>rx8sPL2Ibk)G=-#6u0Cd0QQ;)gjDUi+zquL==lFRL{Ug_tYc}X@;mRCF^1o%$0Z785dpYSU2eXvL;4aN~)Ir<4!h0#Zko*8FcWMzN>SMiQcgwq;`}}QL^|2L0QZ- z`eIb=G)3<|#>5jTzHjsgVb6;#{`W|V&>ZTrqAHoy@Wa_Myl)o?9y^0Dt%IX%ewjgy z4>S6sWh4l0zYwUr`h_&!+o$s%EaUlMGE%W@mwBNr2aqYR+j>w!n%<6 zHK^Xyp*G}TrGTINMV0w#=au4HF7hG)ec*-guy2tU>l&=+coyDt^r`;A@o z3W7hjk+V^Ov&JKk{h7rfH{vf?ivy(@z|)MeTvgL)u@i7$ckmID_#gS#_lmkKaf zH4kO2;wtkNk1r|g)H2|FfQXa2i%Rz)*OIz=jEwRJZm}Ry(B^Q-6hyL+59+m$u&JTrFC3nYsMN~{VY!^(lM%nbY4Bdj#Dyu zLwG>J#V>~7ycWk7@PQ6sCIKA-t`VaK=FxDs?g%ekyd{$?I~F`;BFm+947q5M#;uoj z8X*kx!@|NTy-FuHhN3pjw2MoUei>#NoTi2*rkP-asDyR*hZz}6M(D(*@Br3if&iX= zwGcj0FSduSiu*Imlm(br@@fF0TuR)rGUdQfzs{)S_kQ3z=MhaB7fPW(6CY1VQ7dP; z6|JNEZadUx=Myb6r%j+318mJQ_8spDkCjq1F27nnX?_vN+=!&H0#`X@ z8q;x&02gchLLTHX!vHiQg__jAJ!UIOE}rhAS*eSKf|PMNXDhVYi=EleUW7p{0;!R! z7sRuzF0Oa{^yfKhUjc?Efq%YzH&d2(rp%(0@qcf4SLW(1w1>B2~_k4A7EI!n14r zCHT4@b?n?#bhvAd!{*7&K1k2dl=uOC7%yv4ZmtE|NWqxKrD}G8Mi|0s*8X>`)2w2$ z-6MV3@!-*YLe=-RLC<-M9`H9Vl)UmjDB0~2G5sSkMO`#xj+NkWD?F*fZ298;;UV(A zI^KQ9TifS(H_2(|qec2lFd=cYVPbuUT_pS*mAGX`oV7|Xnc-Ce3Yicl|AAAx{=$3e zc+D{u*kn^guk+9Ze0}VBT+R7<;A*>U;Tn%T{V?6z_egU-r5EV_cOG>ka6<3Q)S>iz z8Pj6$B@7hFhX|7E%bW7_xGbM?+6JhKUqOIr>0!2ERX}A|-^B$^U@;1w=b@tQ!Y@ZGaC2)RX%wHRwlrHt4Y3lt&xCSqcvUG$!M83E_Ux{7Xs32O0^D@Exo=_ zC`xQ@OeUXEIK)5b(WfpNR#zLMrLcdVTeM>WVM9D&QwGM-30ejC@>+*AT0OAv!c-_? z+N>7C{E3JvKMMk%;!t&PaF*^QPa=Wjofp4T76tFY{s_lkL>%o1heW^Vmeel{(sHoL zYS?c=HvE;Mz;e6XpzC-x^Sf{u=wB-MRfRJy;ZzN_E*qg)4JtA#Qr&iFoZ5mpiZzk! z_Z>RX_7|#(ICVULpO~e^>4P`5E=5|;rdTe+g|V^er{Q{5_|P?T(rZ&pcdPvWbu-`i3hWr51xxPsf)s(Q$MTC+boeo+{ph??>EWZaPXmpl{5F4Xul#<=+LDyA{ zOgb%Tj9>rklbz1&K`j=FLN9weu&4@bwOS$YPSkR|O5nhQOZ15BCL+|x1UIo%0x$tQ z_eSPMCRGrR$@{d@5bTH{Z}hWbTYTEq`jbF7?*Tsb6n>>Tvh%;!GnB?VX0O0H$q^8QMKrGkvjnKG6>zuud1V-sWjs$Jc_Ntj)CY}kpNsa zf}HD;(F{EtNHtc4bZF?>qwxj zaaztm%OQNqk$KBRm^`Q^PNYz2F+Lwihox%IJj=yKsJjKjRcwBodtde%&Py2iT!%l; z%CRm4a9vRec5|mo&5<1pP?u@`C)Bm}fB_;9!+PvJZJQ5@K{y|IR9LHZO0Kxe=j{%o zt?PzQ)$l?1_n;){OVbG3>Onj*ss9B3nQ$M%O_?9vg>HYd*ukPcVa0Bb9at=EGL7el z;Alv?(0c$39eN4W`+%ORlp>}0I0ApNPvHs)U{O~3=l!{KKMHmGz^L4Y$%?ayWLB(% zdW&VnqrX|UldywQKt9eUC>x~r5q%C!tQ7ToidtoLwbnVr)wDmPZ1tOp`gZOl@6meujVRT%?-d=}Z?c#Jv6)R3d+D$xU`Y5+#f)JrQN%rvt zq6_ruk4G9U@6VogFK10d%BtG5dy`*sNf+~?UIkZ?oAoqbOX7@`VU?z*-udP*7JRSowvRg(XNCG$}HhGD;RedZ=m&j{YsJsY1jC27d{u zHhOoZc4EMFc>lUl1*d)@6#-}SnLx5S!Kms-Y*5&~oCGBCIsnb>3~^$w0X8LS}; znMH6Mn_2v2e21U@F4Os&0bl>)%ISOD#pc_h03=?I0@F- z1(ba0A4-D`pvX8$tJ=Plk)Qj3&i9M9@|ZrZA+Ic%dJC2Y^V8j>u2GD&+61xsGHW_y z|L=DMaT(O_^K&}eiz+H}Lwd=iGVB)VslOEZ!j@&UjPB3p6@h8EFt;xYUIyHNtLKOF z0@7@)T?Md!P(vkEcQNM8;sl|w$l`HdwcW%MgEa8$aot@wgj;2SNIhE+=_%a31CP3c z^!c^+K@WK3*vyPdxLM804vmJw;?TJ0cBE96J#!t*@3`TASfK$*5=0a%lwvR92(68k zgpK-SsDUW@Ac^4QvWiFa(Fq`4JQ8Y?7;)0^Q&mdNvt#VzCq5=F*&I{o=ojS9V}Uaj zu8}=?jVLe_&kT7gQktQ)Qw}j+&tfunL8Q`3N#xP&!AgA=tV2SL(w6?9T6?W6b=B4> z*Hc0h5_~1bv_fWHv7wndzK3mn6h^=No;>7yc%kL+nRD{Am`(~@3wB%oxI+!$n7_twS$^RkY(FEppMl#IAh$8boy{E{rb;v$#Tcg;mRHaLsp#>d zXU45CN~B^U5yz~tF6W$_`0lE29?mWfFW}$DAkv(a8x>eE2^xToad7gPQJRHM!3HvI z?ReY;gmOtEyLLS{KJj_mw%?b`72U*W+nu7nK&yj+z0z+WXG1NIaS6@vqe?aFmvUKc zWiN}eO}r?60bK`wbjz7gHiwkK0QUj0YsC$gSHgfJ#uyc39W8-v|9UB0ol&jl-7#Mr zG0*~8<#5Rf-Q_TM2^ak0jp?;whFJ2@XVUT+m~E%aA`dP<=y$JuS*Wfke1Qg*N+CLe zuJp{N=sIMT$se<;(-xReeSWXE9Gfo1PsGEGp@i6*u8=-cH6m|oxq?cGcFD;0<(P*7 zU2E}C_C#!x-v@mdq>XJWYCH$sZ8R|z$0fpVHap++Rd`f@B1ogM_n~*w-Ub>fL9spn z6talQ9xaOiQZ3T@WJQK^(YMV8WnKt9?soqh{0j(WObqk<>xYDX*DoO}jR*Q;Cr8_j|2Xb?zaD%?jF^*()b%Dz4*W%qnEz;1@U7(5)AhTYgzc} zot-dv68vG`mG2TwMMAp#)_{t>38rfrb#yhR+1UN$%>D|TB7C0Gq&R6Dso{atK?WxL zuBE4_fC2`auKD=~(tl_{=F&kU%{pE~cvKr39|-)|r&e#eg2Q6Fg?k#wn-H&BU*m^_ z7%{%t-y~d>u534ngg@pL#$2m+%uS)m%PNdNPl_>w6dbv*H4DC*fjGSVITKIM<@_w< z`WPh(9AjN0=X5@cg-_nLyW&Hw*(21#AVF+s`h${<#1b^B4#g|bA1m}Nj%xk=hq@z2 zsJG9zoci2y9Sk@v%>2RvNsm{VIi|9nZL^-itR5~lX@6mQyQ3yDSP1w@(iLN(n8B|6 zH;cWFC%9QAm$m0RJ7llu-d>Krco%5&NZcATe?|LbI!21A;yoHP!lM0FGru9>+v7P4 zGxbF)R=1Y&OWc~nwmbdRS2 zKco}n)OMi;JCmShyB!4jw!V3!_-jevKusQdUdQEpsgjJbm17fLesYE-IXTn;THUfn z6o55^U7S<3^x`M?yyL)*XrxVN9c?mlZ#gTj5d`s4tc^ra3h#kJbXHO7(9&7MlQi31 ztKkduAwQaXV_+9-@_GawXkBaZFA1UP@_3CXyk8+grMsYeB41#%RCH!{!^})^S!zlrSM)SV2&@Y>L)qh*nI~=q%(0keF9HnpA*;lY4JCZv-*cH$~g z9gF@jF#S2hgzDW*?r?q_zHGN{ExZj5$gu=Ug;$&Div7G-j@By7ZLhJ`ipFxw@~j8U z?VkJx=!8CO-E&2+`@YzT;e~aw!KU_F^!#Pa=qUYUQFU`#+yHmsFFLt3!2rD*xG>|M z=|3(dlY&4-^J|2FAY5-nr!z?fq79Vbos}8HGOc^hV8-Q8%m!v8b|~?D`|w5Qb=f6E zhHNLAiG;q5JZ1NrRlbh?9z3{4ed`%(T+gO!tbndTk52MGl59F@=q6*X^1E@0v(uqPum0;UcMDZoUffSVW?xI_S}iW?W{6 zK|p&p(KBTGh&i{|>|=(8hx76IFZ>;RH*4SKq_(U(>t&ehT?33G1y=LVD2fo#S(PFUGYO0&M>Nto%kOnzotg2C1&(&r3#1Vf{q8^OYgfkVD#U$}i z6yBvqo6ZcEk4LPbAqjBL;fFtk*ko8ylZwVPT5dm+1dni$Z}4*J*PK#Js?sVyINt0F z4U6fIpKHAc3MqiE?{2!h{b|3@!FqC45_bTsXnKRq-(}s#ofOA#aLb*8dRc`bRZ45J zUBxs;oO-QB*4Jo?vAUnJO2trwyLwGIID8+WYcKFRo3B`p8Y%=d6=U(ylp-bu!8Wp5 zYUB<+#>BVdleXk-@&4-Yc>bg5mJY(j#pj2fZxxpTq77iD>u}vNOG(lf`&w3e4C}Lq zG9}xB%nQGvG2d&xXEF>l#LeF77OvjAIJ?sHMB%RY=em<=Y0isHCLmL<-H-m7#5x=w zqeHMcEWaPJ>Q%y8AHXqGD@|alU1I~Wm*|i!=4E@w&S-R*QTyFQims~>nzXg2JMauA zs~I|ryM3JZ+XEiibf$_l5$r7|=YWOOJs`YBLR=U##p*{y*fEW6J;qYo2gxR^=7RAkHQ7#mGU% zoW7t!J<9)_z^Md92&d+D0CPNb zi^%i3Eam1wJnG>-&t9Uhi0FG%J-uS3fOt&TgwB2*tw&T?j=oXXNS!Vwl>LrS!;xBm zhUMTBb|~tyAYO=yrkn%v@*p>#+kAJsBh9f*%u!sSkK9#%@~$7Bxh~pNVmu1h4eal& z0~&=Is*2)xt;d&eXo#gHsrV%}3#{#RE~rzE|%y5%TIK^26`K!J-Cu3RLMJN+Kms?}-_l{6Y8~ zy7U`8+jhvj!IL7QX5?m03~GAE`4pJwWP4|SC9>%k4LjoLg^>63_I*CWuhcjxRG~lEQCPkCnG4$?m~8$b zF~%ZEH7N>C{F7I`3#3@=r1qv^=x`TN3O3N|Ju)j;r-cN~7a@Y`RSE9&zl6h<|gFO9`I z$)c)5!O7|a8X(|LyRGAKlnd4`#%Tjo-Hth|b*P-~+?M*~%YAUU2 zU%mZfbR-q-Pjg+gFfuf^zI*ls@AfjtC*mv~T^@UTzQx-0MCXX3Vh z;8*;4aiL58)UZhz7wBL@;!#ac<7L+aiRX75AQ0%=g@sPrTG)0fPHo;CVhilmbD-{%G7Oo=H3NqODXv3&_O}ZICyM& zIj0`k>5sP^X)JDoXs)Lu-jYT{fBeUuRp*mJZOWY&d=G%P=e>Rk?+16w&i#gjfjG(bzx3>{-Qko0b`-(6xB6-GI>{0>w@iQrigC;Rz*~Pd2PQw$2&JU zgqDE3nx2|cA_fY3lU@0{9Wa9E$3fp{2ue@mVs#*5bFH9io{f>tx4G>gNGcWR3>V?~$MxpMr0 zk8QfBG0A+1kSb$sCTZcbI%I>lZyvHOPIep~{qrS&NM3M5%E4#cECSa@(@q06B)=Rj zH8BP!=N|se{*TZ=@94DxGnMgI;6##VUVfl)?`YZNF(?d!`9lEslMlT3EX3>SjfsyD zxjbmBJfrjJQsn5o!ODQ&pD5|sS9=lUKxpQRJb&+0r{|og@Lq}O&@i{yNsM$)+M(E~ z!#cQqU0nJTN@A#th+{DxIjSmgjD2b8$=@I)e}r4jzkxc%s;p=7*o~!Q{icGc5|~X3 z4C&UPFT&yRNzIG9<2e9T9MB!jC^0yfUMk{8#k7j^CH>XBjEZ}_;??3~UT6M#t+Po&NI0GkjY&xdrrUi5yn-TDxttL+vQdj^=&~$IWvv+1o$S!ew^>NZqzk6~YhM5E%YstZ)C% zEP$@z5=K0_%wd765-Vn>N1J4d=i)>%e<>+kUh$XykVef1fQ37tx)^1kGIp^DK7D1r zfAV-+mzht*229irt;P2|S|dj6gq7#LU?|Qy_?=@cLlpIR&BkDo7cb2K=`(*J zly*reFDr0Qz$8@R4&-**(07eJG>yWA0(HkdhxjEi%Lq$(ArE*FpElh$>Ji2DvYtx1 zNAnj~yIy=C?K~wIh+kS6f$;qXyPOeB`zTEpRKonS(qziZ9Jt4oD=P&Vp517PSSc#P zgUg{u{)`fMf^M?y!jervd*R63aEEySFuO#EKB0SQh_&sH=3#X8t|%@|xGi@84>~02 zYPD=cJwBfWKtR3<+LL1aS64#zj-Z%nG0jZ)C$zoW&T zg!)hJ5GrfxFIokt`(z*Q6QXt-_?d|yp22=T8nmuYC6lCV_jH`jy!BZ@z+gC?nDAR7 znh9a>u{CrW4I+Ajsi?11Np2X zB>Z7S;4Yz1yfhR{3jE9l2laTFo?WXZBMO$oRV^KgRXvU|*c`kanUuVB=Ml(K8>cKN z=vof2>A3lQ&pb<#FFR;RedoD*bzV7^&&I^aB>UYB!J`JFP~e2s$j@a3&XTjc2_N_e z*7be~!`D8@9H&C317ym)thzZg9+&f8j1L*(J=hWPt6#WAn@JcOvtzvTx(<2Flox%> z-3v1=*-WwOCZ<{^`o_o1*B?MY$JM9-}KV85{y&d1`}V z(kGn-pyODyQa7++lPVdp_3cQf(&GKedlV(gA)6#j9RObuP+vIX%n>kKp*U4Y8v@{f zUArL;bwwi2r@K@V)KCo=fq42SNJEx}$fl1x+)f6E!|hPzSBxT6)$|{*hL#d{9av52T~%JCp6LI@U19a4ru_U6R1T$ zKl>@>1iFi0LBpj=G7_1iJX^$s66i)}*^$>oT}h1%PeL%|wKH0K^vXo@hOoGSj!|tZ z{uXvs`PFDn5#vMfN$s3Y*TA;>zwIc8iDeoW<97llH>A>6;^LuOvy7<{^2Eo%*nt)lY^A#tG@yfs(lOhoulsIKNUioB!f$|S`zC6r! zVP8Zt*m-w7-s71B4M~8BtY{PdUfhw`l<^CE1z!G3B zSP#shcO~}|4#|CRIAE?6<*1=K;O*C}8(UQIln`h&_~IlK;Y%<3|gU zDx@>0r@MpyXhbpwluvL~hN2S6mwKK|K}W~>|8hkO&gBbjA)SDXdlJ|RQD zdi2auA=uk_^NCR|ITJMqdw}SC)qexzr4&{4x2mxqY3Rw&hmt_z6pe8<8HQ7q+2vWzim-fT zH72+%IXZpSTV7LxzEBk$I~s1*#_koIX#Aa>zUe>`2P0e_WnW)~){jB&{hL785-zxz z6W*w-1=UxCjuElV>qXgB+Vzej&U_9$5+e`Zfuz&EcUow5GvFnqIUK(%(| zW+>?CtBreHOYz9Dv$J?Q41*El{C!&^@F+8ORQb)Yqy%FWr6Xe09yDhS&3HR^JuSKAD#W?VuB#c4Vhech zE@}gPbWDi9VN3I?(>3Uwj$sUn;LyL^O_utHZmz?pi#5n@uYB*^2$Fm~r+#{|e~{?v zw3VQ~?1^`_@tVoG&WqxOvxBjo-oiMIrjK2onr(Yw`)TRZ2>sfBwj_!+Ub`Rn{&?=! z1&;ZtEkn)4TxlUVArFWsg`+;6FD*iP4JBBS%;$~$9^*JP;}1gM*bJA^{V^S-{bm=Sa@abQ5W-0!hI zIG;&Gube-BhXt(s(eM-{IyR=RX3O7izZW;XJ&A4%B(KpH357!+1$+w;wNN+A8{kVr zeqWq4u{+jigY|gP3lBQ{EF#P@6)}KQO zqqp25NL4|#c8+zdY{~9-JP8qIzMm9B$o(B83JC=Be#|J>=#a>CeOC@wbVd-;Kd`;Ad! zImq&j51uDAy7CXAVRl`_Gp-6k^LX|(d~(zJ(GU1)C>0ycsBlw*Nr%@wW)~g~yyBhO zA-PfQZm$C;9m8uTP3g*cVg-O33SFZU_&JmW!Y5{R>){jynTWg6h*>_j<@KvjRun_l z@Oj5K8xn2$;OBZWE}dQC?A`QoM;9)V#ZHvYr5f%vuZ!)n`Qw<_z=%{K2=~iJl3W3N zdryKRSjibelgQ0B__^9z6RpkFOb(I+3{Nd@=d^V^y+L%AqiuS*2Dk{P`W+0y*+gv* z2GnXU01;p)A$|cEFGJ5R2=V@>J6!r}=@{+zVx!20I(;P2Lj4;y=6@JsgosK8IYKnQ zX~8Oef%@f6fK(+o=sN1;Lbv5&r$jDF&crVs^utWjRar0%^O~pob*?yz?T2l+*!j|R zolbcE`gfP`>+5AxA=O5A#?Yq|Ht(qoy<|C6L5p&9`?Qtxm4?Zo-M8P@vC+AObjF76 zWD@Q3!*aZX>5p=S63Dx&jR)9Kw$v+W!M_>KOZHq4^>(#bwb0s~&hDS2>#Xm6A3#zw zuh);^?5%ze@yMY?(t_TSKtlg~!Onh-JiBSn!tjeG;3cNaq7EYK-Ev4LtI6!_5-60q zpn>CY{r>Pv679pG-gp6cwQFy0V^ggodT)DU^%>hR!DS#ogZ|T*#cKe53I!wBjf)H5 zDR=9xf`8js4E05LBwd3-TC2bpdD^tdDk>p++g?Qa(?CGL)uB~GZixzsq_-65qIcU* zlzw-mpNVvjK!8%OQ-2m7h_g}@MP;rstB=B0LHTtK>L)9gR@|t0FHz_LQqHf&CQjQZ zkK2o;*}?C)p(}9IUJHVn$MY-a3EG^sfO5F{13eS58^%Ug%rNg*cPXchCppR9Fr#nc zC`dyid}x5IW|zu-(1n#Go+df;Fd}bima?*we6}V;>pk8CZW#AnKe&m&5>ldmmARj9 z@Zccwd_>b8M~}iN#so)ygoviU!ND8kUxWGktx8~VwNrs=bNSZz&V%6j!N49=b4m%Z zS}jr9)1`%x7o#cB#u^<8ND}n`LtM+F40{7fn%G79(|5+qn)-c08QuKqtBnh&oqXV4 zaBL5nZS;rTWJnphFhFV9h6n7vHgsM=qsuMRR1Bj%C3mID%cbpY!~B}Y?|@_a+(?!4 zETR&7$#$!LexAm!kMgzKCytZ1WdqIX*p<}YxkBn}O_r}qM1#+50D}>?NBty{U*(EO zf-N~*BNL(HXe@L6mHXmrQ35no=0Vi!HyU~fjK1-b{>_(+}c{J_IEgIyt=`~#2Cc&B54lIhIy6pjW71^Qyeyo5RtDx5IX((`aUP-J+1)Shrm zH4RUuhdwU8u&CTOqo5)-mR zof_@Zy}cb#>JA=F*qVDHZvZ&OA8@vQLb!U0Om0LABsEe7l?s;ywBH$k453eHz8?AmO~&$;q^!G-q<|o_l2?M z!$W^;`ZA8wOGOQ5Lq+nk*En=?(OTBcVQS}J&dHM$v!q{Pc>n1^rOC z47|n7{4U#Se6m%e?Bw}ao7Jt6@q)ibB6H_J`hX^VOg6^vl(B;NVsdj!%-7|nMVLZ$ za%;Gz12=9nKVh`*?GBx?^9d#KK-)7DihBfOJ9z`L21>yw6jEXVv>?9QD@|Pv0+Zi3 zry6`SHhAXeo21|Cc}$y3z5NTPKb$)A2G5A+Sx?G*yLxM5Vbz!d4kafI?bY1R60E7{ zqOP6-9J79#3c)4aYjD&JT5J`?s6hlnb~nIyCe>z{szA;x%i@CwcE8;YPTu|%-aX^1ANLaUXiOqYoBxd6*{SO zBvk3p9z9VvY~u>tE`CwGUP@nOF-gBdB7AEKA&)Tf{H%HqevvkpNNj!Eyun~L>p&JF z&bLSQYgF^KUZfSzJq_m)au(e+KyrqOf}Qb*G>VZfE;yA;irUa3&AeQ5-{HOia1-ku zBd7OWbBFp+K?kA!em+udc61%Kc$krQ>dY>%6o!%n80!YzexFrrC{Lo(AY)h~HtL>S zPhGouD5`Kf<+!nj-O~dB4dD0r9A14Ec62Z+EQ!3OZD-cyYJ zIYIv|&;I9CE)jgOY8rk6Dl{5~&6*YhQG`Tz;CYKGwTb%MoOzEXfx^QJRnfCaneig5 zvM}GhGr^-W$ay-p`Z&f6$9dcU8z!DUYZqPoDy2`90%=>!a5yl0s3_6h_1FPG#-e zEy@ydej`)x3WG`NSg)8hLF4^`I1+LI-*Su7A#A*gj1_0sjnJQrP;vi?<< zHnzUm`kZP$M6M??@sQt%G8hp_5*KH{)(q*UnE(f;ftj5ouf(|OL}M)`Zg zy+|q}*MZ-6OTW|2np(#?0pjf#ZwhMbMFui|NJ&$EN5NY8manbmkUiRL6l?B5LRJV| z$odr@QMO||kPa-xT7Xule9ZpFL_y!Ldr~i6;TGUZ*W1#q2dQqCIL-~m*GS07#dKHs zcn7h4zE!wp@WSLtLsN-ttt(4{B;Kihu}>3GdkdysYuO`m#G0EX#pN8}5RkRlplcnI zkYyEfxJWx)W?deiMC5|tx9IZX^0VXa4naXtIm}a*8O4}$7MhxZQgo$qQtf7@Q*r%w zE#>YJd8Q7YMkC^r`N=V1*f-2zC@MY$6{6wxsxH=NAC8=#ixsN%pVP>MI-gxS;(KxC zc)N?N1mrE4@gaS8Q0T!|uac9A{|dE!^7-&Oy)xi2H#VKFr@$It5^tZKIUN(3WkRM% zCw$)VFLm#~*U>kQKl?~74^Xa7kvWyOC${VbblI}r4iDLozPsCI)h`YBct$J<*&xM5 zZ%3$`_!8;>6D^3FPEyw^nU0uM3_&(0c5~?vw^{vVY}KJyeBSdLU4rqPg1Syb(kclm z0&j<)$o(}&b@9BE1D(xtXaC26`7l`%=eHrgSDFF`@FmiL!!?%U^cufoObRTAAW(a+f`% zUF3Nk9CU}!%FmFn=4749CDBt0?oVfw-`}1MXzc$W{7A5oTu-CC=&Dw#?7A>GTIN%4j$oNiDJ7)^I>qy)3nX_B1xXwm-F>|VLuX7Yrt z-o>TU0D=T^5IPe)a#;sSE(5?+*HyP|LA9YwfBFnwfWL5G{L>WVZ;`S~^h?*#Gbs&O zoxrcxJ7zneC7tW-)WK%|M|7ujEivKy15I-5|5`(QL=aO9)gyMR!c)&3R|;-Wd~;We zKS&eZ>pJV(sF>8adXXAP29+@RpL6ph%`FNLOLcYT_CDt~Z#Xq<)Qb|d7uN_|(V|KQ z^Cyy!$`7A&y5aDqYh6$;B;3 zS9d2e#`mp_d;?Fj7-2AlkKkP6)jAZtRG zB!gHGfLhoNPb3^6WWM^dwzRr&tcZUT99m6enQX{N=KJ69=X>G*#Tz*VRB&~#(>*ho zREw|R&g+@zF8O3n21{=bLMe}&4=g)Iv0&KVH7dqc;a7A9I<>j%!L+O4&dyiKBr zKW!>6xz13FZ?x)6BXWxWQch_0C;u&+?Z4@x2V81K_gYAW$zW-n5dE3ThmH{sEV8bO zhOqXe5$BvS9zKm>bP>`;wvm=-rWkRQa;?^}0*oP{0vV>#2Mgbn;5RjTVp^OA5OtWQO_iwtxukD7{!7Ci6%j#)2DB0Um~u z+56&|*hY039}Y&Il~?i$3suHDY|^7W>ZH|aQp*2;>25cr*l3+N9r~jsBh2%s!(NBw zz{It!2PvVNX6?^NKA{`--vRx*<{-ZvG_dx>e*@lPl)+_LnFNuCD|nk;^AwKq5#z=rH(1d(()xx0h+7trrVq zoF3TQwdk=srxckWQsf&)kq#-0I!}$NY@#6P0mjSlOB@!(|g0fCpqj4LyZJ zTR?T%KoS&;48U&K6Kh4usyRRm0#;NF3$QbJ|L`@nu6q-llrhp3b5e;{`RV?n5|4_% zC-I1G#aKZ>zG*a=e{&aw9@~a2DgpTO^V9W^1;@VXTkLR-F4wA4va_o-?!VM8W{~ZR z^PVV`w*Bv?$mg+x6y$@(w46&sM6x)iOsSWf0!!0G#CHGSH?R6tiXu;&QydV&YAOUf z=DV*dqTG;bI?&CMK$AmFNBpWRYLJ$KPbx6k0!7)<$M|0L=W?@1T)Xx(@ zOd?y{AdEKm_QJT^-AN4-0WC)~R`W~N8rkR4P$W){GltKo+An+Z%MovW(zBFin?vwq zmnJe8Eni(YV6|LwA_nei&~TlewLof}2QM~BJ%9k7q*On#nd%$Qe)$)u@~l0xb#+a} zs%v3qxFp?Gw@|69A2QPq`{Dz>IN$P8R$}#Lr5WkGB#Ff8DZ#CZ`|fp0n@gfNL^KO{ z+ZiA8Mn-s`b1V5{or*%OtBYcNy`Urc;uKO3rawD<>!&W;4iGJHyb&O`;8B@)i^L>0 z2P05SW)y0->c*AD<@PCtX@iffWLq9fZ+sl_t-^XRlg-?IV`3ggg`HF7nOddD`gg

    ^MR7Q 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 Programming +Web development +AWS Lambda +Sentry +Sentry homepage {% include "blog/external-link.html" %} +Sentry Python Quickstart docs {% include "blog/external-link.html" %} From e3d672e0daeb60d607e8c5f064617a854067610c Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 25 Aug 2021 06:52:57 -0400 Subject: [PATCH 287/302] fixing typo and some additional broken links --- .../pages/01-introduction/03-why-use-python.markdown | 5 +---- .../01-introduction/08-best-python-resources.markdown | 10 ---------- content/pages/04-web-development/28-celery.markdown | 4 ---- content/pages/05-deployment/04-cdns.markdown | 4 ---- content/pages/06-devops/11-caching.markdown | 4 ---- ...3-performance-monitoring-aws-lambda-sentry.markdown | 7 +++---- 6 files changed, 4 insertions(+), 30 deletions(-) diff --git a/content/pages/01-introduction/03-why-use-python.markdown b/content/pages/01-introduction/03-why-use-python.markdown index 8c036951b..86a0e3ecd 100644 --- a/content/pages/01-introduction/03-why-use-python.markdown +++ b/content/pages/01-introduction/03-why-use-python.markdown @@ -33,10 +33,7 @@ The IEEE ranked Python as the [#1 programming language in 2019](https://spectrum.ieee.org/computing/software/the-top-programming-languages-2019), which continued its hot streak after ranking it -[#1 in 2018](https://spectrum.ieee.org/at-work/innovation/the-2018-top-programming-languages), -[#1 in 2017](https://spectrum.ieee.org/at-work/innovation/the-2017-top-programming-languages) -and -[#3 top programming language in 2016](http://spectrum.ieee.org/computing/software/the-2016-top-programming-languages). +[#1 in 2018](https://spectrum.ieee.org/at-work/innovation/the-2018-top-programming-languages) and 2017. [RedMonk's June 2019 ranking](https://redmonk.com/sogrady/2019/07/18/language-rankings-6-19/) had Python at #3, which held consistent from previous years' rankings in [2018](https://redmonk.com/sogrady/2018/08/10/language-rankings-6-18/) diff --git a/content/pages/01-introduction/08-best-python-resources.markdown b/content/pages/01-introduction/08-best-python-resources.markdown index 81113487a..6677ba3d2 100644 --- a/content/pages/01-introduction/08-best-python-resources.markdown +++ b/content/pages/01-introduction/08-best-python-resources.markdown @@ -47,13 +47,6 @@ should skip down to the next section for "experienced developers". and problems rather than jumping into a specific language that's recommended to you by a friend. -* [A Python Crash Course](https://www.grahamwheeler.com/posts/python-crash-course.html) - gives an awesome overview of the history of Python, what drives the - programming community and dives into example code. You will likely need - to read this in combination with other resources to really let the syntax - sink in, but it's a great article to read several times over as you - continue to learn. - * The [Python projects tag](https://www.twilio.com/blog/tag/python) on the Twilio blog is constantly updated with fun tutorials you can build to learn Python, such as the @@ -61,9 +54,6 @@ should skip down to the next section for "experienced developers". [Choose Your Own Adventures Presentations using Flask and WebSockets](https://www.twilio.com/blog/2014/11/choose-your-own-adventure-presentations-with-reveal-js-python-and-websockets.html) and [Martianify Photos with OpenCV](https://www.twilio.com/blog/2015/11/getting-started-with-opencv-and-python-featuring-the-martian-2.html). -* [A Byte of Python](http://www.swaroopch.com/notes/python/) is a beginner's - tutorial for the Python language. - * Google put together a great compilation of materials and subjects you should read and learn from if you want to be a [professional programmer](https://www.google.com/about/careers/students/guide-to-technical-development.html). diff --git a/content/pages/04-web-development/28-celery.markdown b/content/pages/04-web-development/28-celery.markdown index aa05b783a..1eca55be1 100644 --- a/content/pages/04-web-development/28-celery.markdown +++ b/content/pages/04-web-development/28-celery.markdown @@ -186,7 +186,3 @@ right configuration settings in place. is a short post with the minimal code for running the Celery daemon and Celerybeat as system services on Linux. - -* [Three quick tips from two years with Celery](https://library.launchkit.io/three-quick-tips-from-two-years-with-celery-c05ff9d7f9eb) - provides some solid advice on retry delays, the `-Ofair` flag and global - task timeouts for Celery. diff --git a/content/pages/05-deployment/04-cdns.markdown b/content/pages/05-deployment/04-cdns.markdown index 6f59ac4e8..bd4e516fe 100644 --- a/content/pages/05-deployment/04-cdns.markdown +++ b/content/pages/05-deployment/04-cdns.markdown @@ -12,10 +12,6 @@ servers to improve web app loading speed. ### CDN resources -* [Mastering HTTP Caching](https://blog.fortrabbit.com/mastering-http-caching) - is a fantastic post that goes into great technical detail on how CDNs and - caching work. - * [The 5 hour CDN](https://fly.io/blog/the-5-hour-content-delivery-network/) explains the basics of what CDNs are and how they are a combination of many standard web server components, but used globally and at scale. diff --git a/content/pages/06-devops/11-caching.markdown b/content/pages/06-devops/11-caching.markdown index 5a8e94abf..73d9261aa 100644 --- a/content/pages/06-devops/11-caching.markdown +++ b/content/pages/06-devops/11-caching.markdown @@ -54,10 +54,6 @@ A cache can be created for multiple layers of the stack. covers monitoring, tuning and scaling for the very high scale [Reddit.com](https://www.reddit.com/) website. -* [Mastering HTTP caching](https://blog.fortrabbit.com/mastering-http-caching) - provides more advanced advice on caching dynamic as well as static - content via CDNs and other configurations. - ## Caching learning checklist diff --git a/content/posts/210823-performance-monitoring-aws-lambda-sentry.markdown b/content/posts/210823-performance-monitoring-aws-lambda-sentry.markdown index 40cf73c7a..9ede782ef 100644 --- a/content/posts/210823-performance-monitoring-aws-lambda-sentry.markdown +++ b/content/posts/210823-performance-monitoring-aws-lambda-sentry.markdown @@ -3,7 +3,7 @@ slug: application-performance-monitoring-aws-lambda-functions-sentry meta: Learn how to use Sentry Application Performance Monitoring on AWS Lambda. category: post date: 2021-08-23 -modified: 2021-08-25 +modified: 2021-08-26 newsletter: False headerimage: /img/headers/python-lambda-sentry.jpg headeralt: The Python, AWS Lambda and Sentry logos are copyright their respective owners. @@ -194,10 +194,9 @@ and the value of the DSN string that you copied from the Sentry screen. Add the environment variable in AWS Lambda. -Click the "Save" button and go back to your Lambda function code. +Click the "Save" button and go back to your Lambda function's code editor. -Update your Lambda function with the following highlighted new lines of code -to send errors to Sentry. +Replace the code in your Lambda function with the following code: ```python import json From 49f5aa938ae4da789ec1dc390da8aa5eb6f5c7f9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Wed, 25 Aug 2021 10:18:43 -0400 Subject: [PATCH 288/302] cleaning up broken or redirected links --- .../05-enterprise-python.markdown | 2 +- .../00-web-development.markdown | 8 -------- .../pages/04-web-development/02-django.markdown | 2 +- content/pages/04-web-development/17-css.markdown | 6 ------ .../pages/04-web-development/28-celery.markdown | 1 + .../04-web-development/42-websockets.markdown | 16 +++++----------- .../04-web-development/46-webhooks.markdown | 5 ----- content/pages/06-devops/11-caching.markdown | 5 ----- ...be-recordings-speech-text-assemblyai.markdown | 2 +- ...-recording-transcriptions-assemblyai.markdown | 4 ++-- 10 files changed, 11 insertions(+), 40 deletions(-) diff --git a/content/pages/01-introduction/05-enterprise-python.markdown b/content/pages/01-introduction/05-enterprise-python.markdown index d96558641..c50052847 100644 --- a/content/pages/01-introduction/05-enterprise-python.markdown +++ b/content/pages/01-introduction/05-enterprise-python.markdown @@ -70,7 +70,7 @@ best maintained and fully featured pieces of code for any language. Meanwhile, some of the traditional enterprise software development languages such as Java have languished due to underinvestment by their major corporate -backers. When [Oracle purchased Sun Microsystems in 2009](https://www.oracle.com/corporate/pressrelease/oracle-buys-sun-042009.html) +backers. When Oracle purchased Sun Microsystems in 2009, there was a long lag time before Java was enhanced with new language features in Java 7. Oracle also [bundles unwanted adware with the Java installation](http://www.engadget.com/2015/03/06/java-adware-mac/), diff --git a/content/pages/04-web-development/00-web-development.markdown b/content/pages/04-web-development/00-web-development.markdown index c23e05a2b..5839e8907 100644 --- a/content/pages/04-web-development/00-web-development.markdown +++ b/content/pages/04-web-development/00-web-development.markdown @@ -92,14 +92,6 @@ world. the creation of the URL. This is a great read that provides historical context for why things are the way they are with the web. -* [Web app checklist](http://dhilipsiva.com/webapp-checklist/) presents - good practices that developers building and [deploying](/deployment.html) - web applications should follow. Don't worry about having every single - one of these recommendations implemented before getting your site - live, but it is worthwhile to review the list to make sure there is not - something obvious you can handle in a few minutes that will improve - your site's security, performance or usability. - * [The Browser Hacker's Guide to Instantly Loading Everything](https://www.youtube.com/watch?v=7vUs5yOuv-o) is a spectacular technical talk given by Addy Osmani at JSConf EU 2017 that has great bits of developer knowledge for both beginner and diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index 47b59b9e1..3061d2eee 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -121,7 +121,7 @@ These books and tutorials assume that you know the basics of building Django and want to go further to become much more knowledgeable about the framework. -* [2 Scoops of Django](https://www.twoscoopspress.com/collections/django/products/two-scoops-of-django-1-11) +* [2 Scoops of Django](https://www.feldroy.com/books/two-scoops-of-django-3-x) by Daniel Greenfeld and Audrey Roy is well worth the price of admission if you're serious about learning how to correctly develop Django websites. diff --git a/content/pages/04-web-development/17-css.markdown b/content/pages/04-web-development/17-css.markdown index b248828f8..d50968d09 100644 --- a/content/pages/04-web-development/17-css.markdown +++ b/content/pages/04-web-development/17-css.markdown @@ -190,12 +190,6 @@ web application's design. talk about tables, because that was the only way to position anything back in the day. -* [CSS: The bad bits](https://www.joeforshaw.com/blog/css-the-bad-bits-and-how-to-avoid-them) - examines global scope, implicit percentage styling rules and the z-index - which can be difficult to use and require some restraint to ensure they - do not cause issues for the rest of your stylesheet rules as you create - and maintain your frontend. - * [Improving Your CSS with Parker](https://csswizardry.com/2016/06/improving-your-css-with-parker/) shows how to use the static CSS analysis tool [Parker](https://github.com/katiefenn/parker/) to improve your stylesheets. diff --git a/content/pages/04-web-development/28-celery.markdown b/content/pages/04-web-development/28-celery.markdown index 1eca55be1..6746997d1 100644 --- a/content/pages/04-web-development/28-celery.markdown +++ b/content/pages/04-web-development/28-celery.markdown @@ -176,6 +176,7 @@ web framework of your choice. looks at how to configure Celery to handle long-running tasks in a Django app. + ### Celery deployment resources Celery and its broker run separately from your web and WSGI servers so it adds some additional complexity to your [deployments](/deployment.html). The diff --git a/content/pages/04-web-development/42-websockets.markdown b/content/pages/04-web-development/42-websockets.markdown index 8c11ce936..2a902f79c 100644 --- a/content/pages/04-web-development/42-websockets.markdown +++ b/content/pages/04-web-development/42-websockets.markdown @@ -7,10 +7,10 @@ sidebartitle: WebSockets meta: WebSockets are a protocol for full-duplex web communications. Learn about WebSockets on Full Stack Python. -A WebSocket is a [standard protocol](http://tools.ietf.org/html/rfc6455) for -two-way data transfer between a client and server. The WebSockets protocol -does not run over HTTP, instead it is a separate implementation on top of -[TCP](http://en.wikipedia.org/wiki/Transmission_Control_Protocol). +A WebSocket is a [standard protocol](https://datatracker.ietf.org/doc/html/rfc6455) +for two-way data transfer between a client and server. The WebSockets +protocol does not run over HTTP, instead it is a separate implementation +on top of [TCP](http://en.wikipedia.org/wiki/Transmission_Control_Protocol). ## Why use WebSockets? @@ -193,9 +193,7 @@ own project. * [websockets](https://github.com/aaugustin/websockets) is a WebSockets implementation for Python 3.3+ written with the - [asyncio](https://docs.python.org/3.4/library/asyncio.html) module (or with - [Tulip](https://code.google.com/p/tulip/) if you're working with - Python 3.3). + [asyncio](https://docs.python.org/3.9/library/asyncio.html) module. * [Speeding up Websockets 60X](https://www.willmcgugan.com/blog/tech/post/speeding-up-websockets-60x/) is a cool experiment in coding loops different ways to eek out more @@ -204,10 +202,6 @@ own project. of how tweaking and tuning can produce outsized returns in some applications. -* The [Choose Your Own Adventure Presentations](https://www.twilio.com/blog/2014/11/choose-your-own-adventure-presentations-with-reveal-js-python-and-websockets.html) - tutorial uses WebSockets via gevent on the server and socketio.js for - pushing vote count updates from the server to the client. - * [Adding Real Time to Django Applications](http://crossbar.io/docs/Adding-Real-Time-to-Django-Applications/) shows how to use Django and Crossbar.io to implement a publish/subscribe feature in the application. diff --git a/content/pages/04-web-development/46-webhooks.markdown b/content/pages/04-web-development/46-webhooks.markdown index 6307fe02e..6583c526d 100644 --- a/content/pages/04-web-development/46-webhooks.markdown +++ b/content/pages/04-web-development/46-webhooks.markdown @@ -33,11 +33,6 @@ otherwise independent web applications. explanation of this concept that also contains some basic security considerations when using them. -* [How to Listen for Webhooks with Python](https://blog.bearer.sh/consume-webhooks-with-python/) - has code examples in both [Flask](/flask.html) and [Django](/django.html) - for how to receive an HTTP POST webhook request, as well as how to test - it locally with Ngrok. - * [Webhooks for Beginners - Full Course](https://www.youtube.com/watch?v=41NOoEz3Tzc) is an entire free video course that shows both how to use and implement webhooks into applications. diff --git a/content/pages/06-devops/11-caching.markdown b/content/pages/06-devops/11-caching.markdown index 73d9261aa..c8aebbbf1 100644 --- a/content/pages/06-devops/11-caching.markdown +++ b/content/pages/06-devops/11-caching.markdown @@ -45,11 +45,6 @@ A cache can be created for multiple layers of the stack. reading even though the author is describing his Microsoft code as the impetus for writing the content. -* While caching is a useful technique in many situations, it's important - to also note that there are - [downsides to caching](https://msol.io/blog/tech/2015/09/05/youre-probably-wrong-about-caching/) - that many developers fail to take into consideration. - * [Caching at Reddit](https://redditblog.com/2017/1/17/caching-at-reddit/) covers monitoring, tuning and scaling for the very high scale [Reddit.com](https://www.reddit.com/) website. diff --git a/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown b/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown index 96926ddc2..80f4a7344 100644 --- a/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown +++ b/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown @@ -470,7 +470,7 @@ transcribe recordings with speech into text output. Next, take a look at some of their more advanced documentation that goes beyond the basics in this tutorial: -* [Supported file formats](https://docs.assemblyai.com/overview/supported-file-formats) +* [Supported file formats](https://docs.assemblyai.com/faqs/supported-file-formats) * [Transcribing dual channel/stereo recordings](https://docs.assemblyai.com/guides/transcribing-dual-channel-stereo-recordings) * [Getting speaker labels (speaker diarization)](https://docs.assemblyai.com/guides/getting-speaker-labels-speaker-diarization) diff --git a/content/posts/201009-accurate-twilio-voice-call-recording-transcriptions-assemblyai.markdown b/content/posts/201009-accurate-twilio-voice-call-recording-transcriptions-assemblyai.markdown index e178de998..a041498f9 100644 --- a/content/posts/201009-accurate-twilio-voice-call-recording-transcriptions-assemblyai.markdown +++ b/content/posts/201009-accurate-twilio-voice-call-recording-transcriptions-assemblyai.markdown @@ -14,7 +14,7 @@ is commonly used to initiate and receive phone calls, but the transcription accuracy for [recordings](https://www.twilio.com/docs/voice/api/recording) often leaves a lot to be desired. In this tutorial, we'll see how to connect an outbound phone call powered by the Twilio Voice API with -[AssemblyAI's deep learning transcription API](https://docs.assemblyai.com/guides/transcribing-an-audio-file-recording) +[AssemblyAI's deep learning transcription API](https://docs.assemblyai.com/overview/getting-started) to get significantly more accurate speech-to-text output. @@ -546,7 +546,7 @@ that needs high quality text-to-speech transcription. If the results aren't quite good enough for you, check out this tutorial on [boosting accuracy for keywords or phrases](https://docs.assemblyai.com/guides/boosting-accuracy-for-keywords-or-phrases) as well as -[selecting a model that better matches your data](https://docs.assemblyai.com/guides/transcribing-with-a-different-acoustic-or-custom-language-model). +[better matching your data with topic detection](https://docs.assemblyai.com/guides/iab-categorization). ## What now? From bd441b876a9c9d362990c0450239c044c05a94ee Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 26 Aug 2021 11:37:24 -0400 Subject: [PATCH 289/302] fixing more linkrot --- content/pages/03-data/01-databases.markdown | 2 -- content/pages/03-data/02-postgresql.markdown | 5 ----- content/pages/05-deployment/03-static-content.markdown | 4 ++-- content/pages/05-deployment/28-jenkins.markdown | 5 ----- 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/content/pages/03-data/01-databases.markdown b/content/pages/03-data/01-databases.markdown index 5eed45185..cfc1a349b 100644 --- a/content/pages/03-data/01-databases.markdown +++ b/content/pages/03-data/01-databases.markdown @@ -112,8 +112,6 @@ library. The most common libraries for relational databases are: * [cx\_Oracle](https://oracle.github.io/python-cx_Oracle/index.html) for Oracle Database ([source code](https://github.com/oracle/python-cx_Oracle)). - Oracle moved their - [open source driver code from SourceForge to GitHub in 2017](https://blogs.oracle.com/developers/oracle-database-python-driver-now-on-github). SQLite support is built into Python 2.7+ and therefore a separate library diff --git a/content/pages/03-data/02-postgresql.markdown b/content/pages/03-data/02-postgresql.markdown index 26954a7f8..8237709b3 100644 --- a/content/pages/03-data/02-postgresql.markdown +++ b/content/pages/03-data/02-postgresql.markdown @@ -129,11 +129,6 @@ walkthroughs I've read. for many use cases. If you're going down this route, read [this blog post that explains how one developer implemented PostgreSQL full text search with SQLAlchemy](http://blog.garage-coding.com/2015/12/18/postgres-fulltext-search.html). -* [django-postgres-copy](http://django-postgres-copy.californiacivicdata.org/en/latest/) - is a tool for bulk loading data into a PostgreSQL database based on Django models. - [Say hello to our new open-source software for loading bulk data into PostgreSQL](http://www.californiacivicdata.org/2015/07/17/hello-django-postgres-copy/) - is an introduction to using the tool in your own projects. - * [How to speed up tests in Django and PostgreSQL](http://nemesisdesign.net/blog/coding/how-to-speed-up-tests-django-postgresql/) explains some hacks for making your schema migration-backed run quicker. diff --git a/content/pages/05-deployment/03-static-content.markdown b/content/pages/05-deployment/03-static-content.markdown index 7d458e27c..f5a118f54 100644 --- a/content/pages/05-deployment/03-static-content.markdown +++ b/content/pages/05-deployment/03-static-content.markdown @@ -21,8 +21,8 @@ Django framework calls these two categories *assets* and *media*. ## Content delivery networks A content delivery network (CDN) is a third party that stores and serves static files. [Amazon CloudFront](http://aws.amazon.com/cloudfront/), -[CloudFlare](https://www.cloudflare.com/), [Fastly](https://www.fastly.com/), -and [Akamai](https://www.akamai.com/) are examples of CDNs. The purpose of +[CloudFlare](https://www.cloudflare.com/) and [Fastly](https://www.fastly.com/), +are examples of CDN services. The purpose of a CDN is to remove the load of static file requests from web servers that are handling dynamic web content. For example, if you have an nginx server that handles both static files and diff --git a/content/pages/05-deployment/28-jenkins.markdown b/content/pages/05-deployment/28-jenkins.markdown index 463e1f04c..e217e9aa7 100644 --- a/content/pages/05-deployment/28-jenkins.markdown +++ b/content/pages/05-deployment/28-jenkins.markdown @@ -35,11 +35,6 @@ used to automate building, [testing](/testing.html) and is another solid tutorial that also shows how to send email notifications as part of the build process. -* If you're running into difficulty adding an SSH key to your Jenkins system - account so you can connect to another server or Git repository - [this blog post on connecting Jenkins with Git](http://dcycleproject.org/blog/51/connecting-jenkins-and-git) - to get the steps to solve that problem. - * [Running Jenkins in Docker Containers](http://www.catosplace.net/blog/2015/02/11/running-jenkins-in-docker-containers/) is a short tutorial showing how to use the official [Jenkins container](https://registry.hub.docker.com/_/jenkins/) on the From 9812ac71a23660baef7fe0d1899ba3f95febd16b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 31 Aug 2021 14:16:34 -0400 Subject: [PATCH 290/302] fix broken postgres link --- content/pages/03-data/02-postgresql.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/pages/03-data/02-postgresql.markdown b/content/pages/03-data/02-postgresql.markdown index 8237709b3..34284a7e9 100644 --- a/content/pages/03-data/02-postgresql.markdown +++ b/content/pages/03-data/02-postgresql.markdown @@ -126,8 +126,7 @@ walkthroughs I've read. * This article explains how and why PostgreSQL can handle [full text searching](http://blog.lostpropertyhq.com/postgres-full-text-search-is-good-enough/) - for many use cases. If you're going down this route, read - [this blog post that explains how one developer implemented PostgreSQL full text search with SQLAlchemy](http://blog.garage-coding.com/2015/12/18/postgres-fulltext-search.html). + for many use cases. * [How to speed up tests in Django and PostgreSQL](http://nemesisdesign.net/blog/coding/how-to-speed-up-tests-django-postgresql/) explains some hacks for making your schema migration-backed run quicker. From 9f3631c2a33d5a08953416f1c517abc8c13b2043 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 5 Sep 2021 09:36:14 -0400 Subject: [PATCH 291/302] trying plausible analytics --- theme/templates/base.html | 1 + theme/templates/index-sidebar.html | 2 +- theme/templates/sponsor.html | 2 +- theme/templates/sponsor/assemblyai.html | 7 +++++++ 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 theme/templates/sponsor/assemblyai.html diff --git a/theme/templates/base.html b/theme/templates/base.html index 6c14fbb83..e88241418 100644 --- a/theme/templates/base.html +++ b/theme/templates/base.html @@ -7,6 +7,7 @@ {% block meta_header %}{% endblock %} {% block title %}{% endblock %}Full Stack Python {% block css %}{% endblock %} + {% block banner %}{% endblock %} diff --git a/theme/templates/index-sidebar.html b/theme/templates/index-sidebar.html index 5fcd2647d..ef55aa559 100644 --- a/theme/templates/index-sidebar.html +++ b/theme/templates/index-sidebar.html @@ -1,3 +1,3 @@

    - {% include "sponsor/sentry-assemblyai.html" %} + {% include "sponsor/assemblyai.html" %}
    diff --git a/theme/templates/sponsor.html b/theme/templates/sponsor.html index 6485b9e0a..9583a8c90 100644 --- a/theme/templates/sponsor.html +++ b/theme/templates/sponsor.html @@ -1,5 +1,5 @@ {% if page.sortorder[0:2] == "01" or page.sortorder[0:2] == "02" or page.sortorder[0:2] == "03" or page.sortorder[0:2] == "04" or page.sortorder[0:2] == "05" or page.sortorder[0:2] == "06" or page.sortorder[0:2] == "50" %} -{% include "sponsor/sentry-assemblyai.html" %} +{% include "sponsor/assemblyai.html" %} {% include "sponsor/carbon.html" %} {% endif %} {% if false %} diff --git a/theme/templates/sponsor/assemblyai.html b/theme/templates/sponsor/assemblyai.html new file mode 100644 index 000000000..9ce17932c --- /dev/null +++ b/theme/templates/sponsor/assemblyai.html @@ -0,0 +1,7 @@ +
    +

    Sponsored By

    +
    + AssemblyAI logo +

    The most accurate speech-to-text API. Built for Python developers.

    +
    +
    From 5215c1cdc71530db93bd30aa48cbf4df246c2930 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 13 Sep 2021 11:29:46 -0400 Subject: [PATCH 292/302] removing link rot --- .../01-introduction/07-companies.markdown | 2 +- content/pages/03-data/00-data.markdown | 8 +++++- content/pages/03-data/01-databases.markdown | 2 +- content/pages/03-data/11-redis.markdown | 4 --- content/pages/03-data/12-mongodb.markdown | 10 ------- content/pages/03-data/19-bokeh.markdown | 7 ----- .../00-web-development.markdown | 6 ---- .../27-task-queues.markdown | 4 --- .../pages/10-working/18-developer-demos.md | 28 +++++++++++++++++++ ...recordings-speech-text-assemblyai.markdown | 6 ++-- ...urate-twilio-voice-transcriptions.markdown | 6 ++-- ...pplication-performance-monitor-django.html | 6 ++++ .../choices/demo-software-developers.html | 0 13 files changed, 47 insertions(+), 42 deletions(-) create mode 100644 content/pages/10-working/18-developer-demos.md create mode 100644 theme/templates/blog/sentry-application-performance-monitor-django.html create mode 100644 theme/templates/choices/demo-software-developers.html diff --git a/content/pages/01-introduction/07-companies.markdown b/content/pages/01-introduction/07-companies.markdown index 7eb7a78f2..c4e02cfc8 100644 --- a/content/pages/01-introduction/07-companies.markdown +++ b/content/pages/01-introduction/07-companies.markdown @@ -37,7 +37,7 @@ below). at job descriptions on sites like [Glassdoor with "Python Goldman Sachs" keywords](https://www.glassdoor.com/Jobs/Goldman-Sachs-python-Jobs-EI_IE2800.0,13_KO14,20.htm) and - [Indeed for JP Morgan Chase](https://www.indeed.com/salaries/Python-Developer-Salaries-at-JPMorgan-Chase). + [Indeed for JP Morgan Chase](https://www.indeed.com/cmp/JPMorgan-Chase/salaries/Python-Developer). Salaries and responsibilities vary widely based on the role and whether Python is used for data analysis, [web application development](/web-development.html) or DevOps. diff --git a/content/pages/03-data/00-data.markdown b/content/pages/03-data/00-data.markdown index 493ebd45f..39a767500 100644 --- a/content/pages/03-data/00-data.markdown +++ b/content/pages/03-data/00-data.markdown @@ -12,7 +12,7 @@ subsections, including (in no particular order): * data processing / wrangling * machine learning -* data analysis +* [data analysis](/data-analysis.html) * [visualization](/data-visualization.html) * geospatial mapping * persistence via [relational databases](/databases.html) and @@ -154,6 +154,12 @@ sets. have evolved over the past 20ish years based on his first-hand experience as a leader and member in that community. +* The State of [Python Speech Recognition](https://www.assemblyai.com/blog/the-state-of-python-speech-recognition-in-2021) + in 2021 is a practical overview of a specific area in data: extracting text + from voice recording data. Looking at verticals like this one can make it + easier to understand changes that are occurring in some parts of data and + programming that could be applied to other areas. + * [Automated Data Wrangling](https://catalyst.coop/2021/05/23/automated-data-wrangling/) covers cleaning, labeling, and automating the bunch of activities that are typically necessary before analysis and data usage can diff --git a/content/pages/03-data/01-databases.markdown b/content/pages/03-data/01-databases.markdown index cfc1a349b..ff780eff7 100644 --- a/content/pages/03-data/01-databases.markdown +++ b/content/pages/03-data/01-databases.markdown @@ -181,7 +181,7 @@ speed on SQL if you have never previously used it. elaborates on one of the trickiest parts of writing SQL statements that bridge one or more tables: the `JOIN`. -* [Writing better SQL](http://www.craigkerstiens.com/2016/01/08/writing-better-sql/) +* [Writing more legible SQL](https://www.craigkerstiens.com/2016/01/08/writing-more-legible-sql/) is a short code styling guide to make your queries easier to read. * [SQL Intermediate](https://www.dataquest.io/blog/sql-intermediate/) is a diff --git a/content/pages/03-data/11-redis.markdown b/content/pages/03-data/11-redis.markdown index c05d04741..3600ddae2 100644 --- a/content/pages/03-data/11-redis.markdown +++ b/content/pages/03-data/11-redis.markdown @@ -84,10 +84,6 @@ Redis should be customized out of its default configuration to secure it against unauthorized and unauthenticated users. These resources provide some advice on Reids security and guarding against data breaches. -* [Pentesting Redis servers](http://averagesecurityguy.info/2015/09/17/pentesting-redis-servers/) - shows that security is important not only on your application but also - the databases you're using as well. - * Redis, just as with any relational or NoSQL database, needs to be secured based on [security guidelines](http://www.antirez.com/news/96). There is also a post where the main author of Redis diff --git a/content/pages/03-data/12-mongodb.markdown b/content/pages/03-data/12-mongodb.markdown index 1e9f15161..665144fec 100644 --- a/content/pages/03-data/12-mongodb.markdown +++ b/content/pages/03-data/12-mongodb.markdown @@ -99,11 +99,6 @@ security controls so make sure to lock down your instances. installing and using MongoDB on your own instance. The post covers authentication, SSL and firewalls. -* [Securing MongoDB using Let's Encrypt certificate](https://zohaib.me/securing-mongodb-using-lets-encrypt/) - gives a configuration that encrypts that traffic coming from and - going to your MongoDB instances using free - [Let's Encrypt certificates](https://letsencrypt.org/). - * This 4 post securing MongoDB series covers [Data Security Requirements for Regulatory Compliance](https://www.mongodb.com/blog/post/securing-mongodb-part-1-data-security-requirements-for-regulatory-compliance), [Database Access Control](https://www.mongodb.com/blog/post/securing-mongodb-part-2-database-access-control), @@ -111,11 +106,6 @@ security controls so make sure to lock down your instances. and [Environmental Control & Database Management](https://www.mongodb.com/blog/post/securing-mongodb-part-4-environmental-control-and-database-management). -* Lightweight Directory Access Protocol (LDAP) is common in many - established company environments for security. This post on - [How to Configure LDAP Authentication for MongoDB](https://www.mongodb.com/blog/post/how-to-configure-LDAP-authentication-for-mongodb) - goes over how to authenticate users via LDAP who are using MongoDB. - ### Python with MongoDB resources MongoDB is straightforward to use in a Python application when a driver diff --git a/content/pages/03-data/19-bokeh.markdown b/content/pages/03-data/19-bokeh.markdown index b215de42d..22f8d55cc 100644 --- a/content/pages/03-data/19-bokeh.markdown +++ b/content/pages/03-data/19-bokeh.markdown @@ -99,13 +99,6 @@ basic syntax will change as the library's API is not yet stable. project has the code to create a simple chart with Bokeh and [Flask](/flask.html). -* [Bokeh vs Dash — Which is the Best Dashboard Framework for Python?](https://blog.sicara.com/bokeh-dash-best-dashboard-framework-python-shiny-alternative-c5b576375f7f) - contains a single project that was written in both Dash and Bokeh. The - author gives his subjective view on the implementation difficulty - although the web application only contained a single type of data - visualization so it is hard to drawn any real conclusions from his - opinion. - * [Realtime Flight Tracking with Pandas and Bokeh](https://www.geodose.com/2019/01/realtime-flight-tracking-pandas-bokeh-python.html) provides a great example of combining [pandas](/pandas.html) for structuring data with Bokeh for visualization. diff --git a/content/pages/04-web-development/00-web-development.markdown b/content/pages/04-web-development/00-web-development.markdown index 5839e8907..919cc6c94 100644 --- a/content/pages/04-web-development/00-web-development.markdown +++ b/content/pages/04-web-development/00-web-development.markdown @@ -71,12 +71,6 @@ world. [data bases](/databases.html), [task queues](/task-queues.html), [caching](/caching.html) and several other critical concepts. -* The [Evolution of the Web](http://www.evolutionoftheweb.com/) visualizes - how web browsers and related technologies have changed over time as well as - the overall growth of the Internet in the amount of data transferred. Note - that the visualization unfortunately stops around the beginning of 2013 but - it's a good way to explore what happened in the first 24 years. - * [What happens when?](https://github.com/alex/what-happens-when) is an incredibly detailed answer to the questions "What happens when you type google.com into your browser's address box and press enter?" that diff --git a/content/pages/04-web-development/27-task-queues.markdown b/content/pages/04-web-development/27-task-queues.markdown index 9533a586d..70ec128c2 100644 --- a/content/pages/04-web-development/27-task-queues.markdown +++ b/content/pages/04-web-development/27-task-queues.markdown @@ -176,10 +176,6 @@ when scaling out a large deployment of distributed task queues. is a straightforward tutorial for setting up the Celery task queue for Django web applications using the Redis broker on the back end. -* [Three quick tips from two years with Celery](https://library.launchkit.io/three-quick-tips-from-two-years-with-celery-c05ff9d7f9eb) - provides some solid advice on retry delays, the -Ofair flag and global - task timeouts for Celery. - * [Asynchronous Tasks with Flask and Redis Queue](https://testdriven.io/asynchronous-tasks-with-flask-and-redis-queue) looks at how to configure Redis Queue to handle long-running tasks in a Flask app. diff --git a/content/pages/10-working/18-developer-demos.md b/content/pages/10-working/18-developer-demos.md new file mode 100644 index 000000000..aa82c988c --- /dev/null +++ b/content/pages/10-working/18-developer-demos.md @@ -0,0 +1,28 @@ +title: Demoing to Software Developers +category: page +slug: demo-software-developers +sortorder: 1018 +toc: False +sidebartitle: Developer Demos +meta: How to give technical demos to software developers. + + +Creating and executing an appealing technical demo to an audience of software +developers is a ton of work, but there is no better way to get people +legitimately interested in your product if you land a great demo. The +inherent difficulty involved in exceptional technical demos also creates +a large moat that prevent others from easily copying the work you put into +the demo. + +The most important parts to a standout technical demo are: + +1. show how to solve a difficult technical problem, as easily as possible +1. take the audience on a story arc +1. do it live (especially if you include code) +1. rehearse constantly, both happy path and recovering from errors +1. speak plainly but accurately + +Examples: +* [Twilio Phone Calls Demo at NY Tech Meetup (2010)](https://www.youtube.com/watch?v=-VuXIgp9S7o) +* [Concurrency from the Ground Up (2015)](https://www.youtube.com/watch?v=MCs5OvhV9S4) +* [The Mother of All Demos (1968)](https://www.youtube.com/watch?v=yJDv-zdhzMY) diff --git a/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown b/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown index 80f4a7344..4a5027fbe 100644 --- a/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown +++ b/content/posts/200809-transcribe-recordings-speech-text-assemblyai.markdown @@ -3,7 +3,7 @@ slug: transcribe-recordings-speech-text-assemblyai meta: Learn to transcribe speech in recordings like MP3s into text with Python and AssemblyAI's API. category: post date: 2020-08-09 -modified: 2021-01-18 +modified: 2021-09-13 newsletter: False headerimage: /img/headers/python-assemblyai.jpg headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. @@ -457,9 +457,7 @@ That's it, we've got our transcription! You may be wondering what to do if the accuracy isn't where you need it to be for your situation. That is where [boosting accuracy for keywords or phrases](https://docs.assemblyai.com/guides/boosting-accuracy-for-keywords-or-phrases) -and -[selecting a model that better matches your data](https://docs.assemblyai.com/guides/transcribing-with-a-different-acoustic-or-custom-language-model) -come in. You can use either of those two methods to boost the accuracy +comes in. You can use either of those two methods to boost the accuracy of your recordings to an acceptable level for your situation. diff --git a/content/posts/210105-django-accurate-twilio-voice-transcriptions.markdown b/content/posts/210105-django-accurate-twilio-voice-transcriptions.markdown index 94df3bed8..c4b7d0018 100644 --- a/content/posts/210105-django-accurate-twilio-voice-transcriptions.markdown +++ b/content/posts/210105-django-accurate-twilio-voice-transcriptions.markdown @@ -3,7 +3,7 @@ slug: django-accurate-twilio-voice-transcriptions meta: Use Python, Django and AssemblyAI's transcription API to improve recording accuracy for Twilio Programmable Voice phone calls. category: post date: 2021-01-05 -modified: 2021-01-05 +modified: 2021-09-13 newsletter: False headerimage: /img/headers/django-assemblyai.jpg headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. @@ -692,9 +692,7 @@ The second part is just the plain text output from the transcription. You can take this now take this base code and add it to any application that needs high quality text-to-speech transcription. If the results -aren't quite good enough for you, check out this tutorial on -[selecting a model that better matches your data](https://docs.assemblyai.com/guides/transcribing-with-a-different-acoustic-or-custom-language-model) -as well as +aren't quite good enough for you yet, check out this tutorial on [boosting accuracy for keywords or phrases](https://docs.assemblyai.com/guides/boosting-accuracy-for-keywords-or-phrases). diff --git a/theme/templates/blog/sentry-application-performance-monitor-django.html b/theme/templates/blog/sentry-application-performance-monitor-django.html new file mode 100644 index 000000000..6d581b5ea --- /dev/null +++ b/theme/templates/blog/sentry-application-performance-monitor-django.html @@ -0,0 +1,6 @@ +Learning Programming +Web development +Django +Sentry +Sentry homepage {% include "blog/external-link.html" %} +Sentry Performance Monitoring docs {% include "blog/external-link.html" %} diff --git a/theme/templates/choices/demo-software-developers.html b/theme/templates/choices/demo-software-developers.html new file mode 100644 index 000000000..e69de29bb From 91610ce7d519efa7c7bf15a5f84770963283f145 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 13 Sep 2021 20:34:08 -0400 Subject: [PATCH 293/302] removing link rot --- content/pages/03-data/16-pandas.markdown | 4 ---- content/pages/03-data/17-scipy-numpy.markdown | 5 ----- content/pages/03-data/21-matplotlib.markdown | 4 ---- .../05-deployment/32-configuration-management.markdown | 4 ---- content/pages/05-deployment/33-ansible.markdown | 7 ------- 5 files changed, 24 deletions(-) diff --git a/content/pages/03-data/16-pandas.markdown b/content/pages/03-data/16-pandas.markdown index 9ac2c3bbe..a0750eaae 100644 --- a/content/pages/03-data/16-pandas.markdown +++ b/content/pages/03-data/16-pandas.markdown @@ -82,10 +82,6 @@ is a data structures and analysis library. [Tabula](https://tabula.technology/) library that makes it easier to extract table data from PDF files. -* [Analyzing Browser History Using Python and Pandas](https://applecrazy.github.io/blog/2017-11-12/analyzing-browser-hist-using-python) - shows how to take data from Google Chrome and start to visualize it - with pandas and [matplotlib](/matplotlib.html). - * [Time Series Forecast Case Study with Python: Monthly Armed Robberies in Boston](https://machinelearningmastery.com/time-series-forecast-case-study-python-monthly-armed-robberies-boston/) walks through the data wrangling, analysis and visualization steps with a public data set of murders in Boston from 1966 to 1975. This diff --git a/content/pages/03-data/17-scipy-numpy.markdown b/content/pages/03-data/17-scipy-numpy.markdown index 62ec16355..00763c2d0 100644 --- a/content/pages/03-data/17-scipy-numpy.markdown +++ b/content/pages/03-data/17-scipy-numpy.markdown @@ -44,11 +44,6 @@ following resources are broader walkthroughs for the SciPy ecosystem: plotter. This is a very cool example project that ties together the scientific world and the art world. -* [Lectures in Quantitative Economics: SciPy](https://lectures.quantecon.org/py/scipy.html) - provides a good overview of SciPy compared to the specific NumPy - project, as well as explanations for the wrappers SciPy provides - over lower-level FORTRAN libraries. - * [A plea for stability in the SciPy ecosystem](http://blog.khinsen.net/posts/2017/11/16/a-plea-for-stability-in-the-scipy-ecosystem/) presents concerns from one scientist's perspective about how fast the Python programming ecosystem changes and that code can become backwards diff --git a/content/pages/03-data/21-matplotlib.markdown b/content/pages/03-data/21-matplotlib.markdown index 14f4d2f64..9c60d3740 100644 --- a/content/pages/03-data/21-matplotlib.markdown +++ b/content/pages/03-data/21-matplotlib.markdown @@ -21,10 +21,6 @@ toolkits. is an awesome getting started tutorial that breaks through the confusing beginner steps so you can quick start using the plotting library. -* [Web Scraping With Python: Scrapy, SQL, Matplotlib To Gain Web Data Insights](http://www.scrapingauthority.com/python-scrapy-mysql-and-matplotlib-to-gain-web-data-insights/) - is a long and comprehensive tutorial that walks through obtaining, - cleaning and visualizing data. - * [Matplotlib Cheat Sheet: Plotting in Python](https://www.datacamp.com/community/blog/python-matplotlib-cheat-sheet) contains some handy snippets of code to perform common plotting operations in Matplotlib. diff --git a/content/pages/05-deployment/32-configuration-management.markdown b/content/pages/05-deployment/32-configuration-management.markdown index d4b43ec30..23f4b07ba 100644 --- a/content/pages/05-deployment/32-configuration-management.markdown +++ b/content/pages/05-deployment/32-configuration-management.markdown @@ -32,10 +32,6 @@ operations, such as querying the database from the Django manage.py shell. is an openly biased but detailed post on why to choose SaltStack over Ansible in certain situations. -* [Ansible vs. Shell Scripts](https://valdhaus.co/writings/ansible-vs-shell-scripts/) - provides some perspective on why using a configuration management tool is a - better choice than venerable but brittle shell scripts. - * [Ansible vs. Chef](http://tjheeta.github.io/2015/04/15/ansible-vs-chef/) is a comparsion of Ansible with the Chef configuration management tool. diff --git a/content/pages/05-deployment/33-ansible.markdown b/content/pages/05-deployment/33-ansible.markdown index a64409f26..bbdff142a 100644 --- a/content/pages/05-deployment/33-ansible.markdown +++ b/content/pages/05-deployment/33-ansible.markdown @@ -38,9 +38,6 @@ be able to structure your playbooks: configures macOS with various applications and developer tools such as [Docker](/docker.html), Homebrew and [Sublime Text](/sublime-text.html). -* [ansible-nginx-haproxy-elasticsearch](https://github.com/gp187/ansible-nginx-haproxy-elasticsearch) - sets up a server with [Nginx](/nginx.html), HAProxy and ElasticSearch. - ### Specific Ansible topics * [An Ansible2 Tutorial](https://serversforhackers.com/c/an-ansible2-tutorial) @@ -63,10 +60,6 @@ be able to structure your playbooks: * [DevOps from Scratch, Part 1: Vagrant & Ansible](https://www.kevinlondon.com/2016/09/19/devops-from-scratch-pt-1.html) -* [Ansible: Post-Install Setup](https://valdhaus.co/writings/ansible-post-install/) - -* [How To Use Vault to Protect Sensitive Ansible Data on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-use-vault-to-protect-sensitive-ansible-data-on-ubuntu-16-04) - * [How to use Ansible Variables and Vaults](https://www.expressvpn.com/blog/ansible-variables-vaults/) * [CI for Ansible playbooks which require Ansible Vault protected variables](https://www.jeffgeerling.com/blog/2017/ci-ansible-playbooks-which-require-ansible-vault-protected-variables) From 3fdd4290a6bb57fead8223afaec2b8f695cf96e4 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 13 Sep 2021 20:42:19 -0400 Subject: [PATCH 294/302] fixing link rot --- .../pages/05-deployment/28-jenkins.markdown | 4 - .../flask/flask-app-badrequest.markdown | 8 +- .../examples/flask/flask-app-flask.markdown | 351 +++++++++++---- .../examples/flask/flask-app-headers.markdown | 75 ++-- .../flask/flask-app-immutabledict.markdown | 4 +- .../flask/flask-blueprints-blueprint.markdown | 2 +- .../flask/flask-cli-dispatchingapp.markdown | 2 +- .../flask/flask-cli-flaskgroup.markdown | 32 +- .../flask/flask-cli-scriptinfo.markdown | 82 ++-- .../flask/flask-cli-with-appcontext.markdown | 149 ++++--- .../flask-ctx-after-this-request.markdown | 57 +-- .../flask/flask-ctx-has-app-context.markdown | 3 +- .../flask-ctx-has-request-context.markdown | 84 +--- .../flask/flask-globals-current-app.markdown | 422 +++++++----------- .../examples/flask/flask-globals-g.markdown | 14 +- .../flask/flask-globals-request.markdown | 96 ++-- .../flask/flask-globals-session.markdown | 245 +++++----- .../flask/flask-helpers-flash.markdown | 8 +- .../flask-helpers-get-root-path.markdown | 23 +- .../flask-helpers-make-response.markdown | 30 +- .../flask/flask-helpers-safe-join.markdown | 2 +- .../flask/flask-helpers-send-file.markdown | 2 +- .../flask/flask-helpers-url-for.markdown | 10 +- .../flask/flask-json-jsonencoder.markdown | 137 ++---- .../flask/flask-json-jsonify.markdown | 28 +- .../flask-sessions-badsignature.markdown | 108 ++--- ...ask-signals-got-request-exception.markdown | 79 ++-- ...templating-render-template-string.markdown | 24 +- .../flask-templating-render-template.markdown | 200 +++------ .../flask/flask-views-methodview.markdown | 9 +- 30 files changed, 1062 insertions(+), 1228 deletions(-) diff --git a/content/pages/05-deployment/28-jenkins.markdown b/content/pages/05-deployment/28-jenkins.markdown index e217e9aa7..63c64d57c 100644 --- a/content/pages/05-deployment/28-jenkins.markdown +++ b/content/pages/05-deployment/28-jenkins.markdown @@ -40,10 +40,6 @@ used to automate building, [testing](/testing.html) and [Jenkins container](https://registry.hub.docker.com/_/jenkins/) on the Docker hub. -* [Securing Jenkins](https://wiki.jenkins.io/display/JENKINS/Securing+Jenkins) - is the landing page for Jenkins security. If you're deploying your own - instance, you'll need to lock it down against unauthorized users. - * [Updating the GOV.UK Continuous Integration environment](https://gdstechnology.blog.gov.uk/2017/02/10/updating-the-gov-uk-continuous-integration-environment/) describes the configuration improvements one infrastructure team made to Jenkins, where they enabled diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 3063a6da3..a2c3c3abd 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -20,7 +20,7 @@ that accepts POSTs. and ImmutableDict are several other callables with code examples from the same `flask.app` package. -You should read up on these subjects along with these `BadRequest` examples: +These subjects go along with the `BadRequest` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -90,7 +90,6 @@ from ..const import ( ## ... source file abbreviated to get to BadRequest examples ... - API_SELECT_COLUMNS_RIS_KEY, API_SHOW_COLUMNS_RES_KEY, API_SHOW_COLUMNS_RIS_KEY, API_SHOW_TITLE_RES_KEY, @@ -99,6 +98,7 @@ from ..const import ( PERMISSION_PREFIX, ) from ..exceptions import FABException, InvalidOrderByColumnFABException +from ..hooks import get_before_request_hooks, wrap_route_handler_with_hooks from ..security.decorators import permission_name, protect log = logging.getLogger(__name__) @@ -274,11 +274,11 @@ def get_error_description(exception): except AttributeError: return str(exception) if isinstance(exception, Forbidden) and description == Forbidden.description: - return _("You are not allowed to access this page.") + return _('You are not allowed to access this page.') elif isinstance(exception, NotFound) and description == NotFound.description: return _("The page you are looking for doesn't exist.") ~~ elif isinstance(exception, BadRequest) and description == BadRequest.description: - return _("The request was invalid or contained invalid arguments.") + return _('The request was invalid or contained invalid arguments.') else: return str(description) diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index b8ab9467b..0702a72ad 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -19,7 +19,7 @@ application's functionality, including URL rounting, and ImmutableDict are several other callables with code examples from the same `flask.app` package. -These topics are also useful while reading the `Flask` examples: +You should read up on these subjects along with these `Flask` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -167,23 +167,23 @@ def test_that_request_path_hijacking_works_properly(): def test_theme_fallback_config(): - app = create_ctfd() + + class ThemeFallbackConfig(TestingConfig): + THEME_FALLBACK = False + + app = create_ctfd(config=ThemeFallbackConfig) try: - os.mkdir(os.path.join(app.root_path, "themes", "foo")) + os.mkdir(os.path.join(app.root_path, "themes", "foo_fallback")) except OSError: pass with app.app_context(): - set_config("ctf_theme", "foo") + app.config["THEME_FALLBACK"] = False + set_config("ctf_theme", "foo_fallback") assert app.config["THEME_FALLBACK"] == False with app.test_client() as client: try: r = client.get("/") - except TemplateNotFound: - pass - try: - r = client.get("/themes/foo/static/js/pages/main.dev.js") - except TemplateNotFound: ## ... source file continues with no further Flask examples... @@ -204,66 +204,159 @@ forms, and internationalization support. Flask App Builder is provided under the [BSD 3-Clause "New" or "Revised" license](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/LICENSE). -[**Flask AppBuilder / flask_appbuilder / tests / test_mongoengine.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/tests/test_mongoengine.py) +[**Flask AppBuilder / flask_appbuilder / tests / test_fab_cli.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/tests/test_fab_cli.py) ```python -# test_mongoengine.py -from flask_appbuilder.views import CompactCRUDMixin, MasterDetailView -from flask_mongoengine import MongoEngine -import jinja2 -from nose.tools import eq_, ok_ +# test_fab_cli.py +import glob +import json +import logging +import os +import tempfile + +from click.testing import CliRunner +~~from flask import Flask +from flask_appbuilder import AppBuilder, SQLA +from flask_appbuilder.cli import ( + create_app, + create_permissions, + create_user, + export_roles, + import_roles, + list_users, + list_views, + reset_password, +) from .base import FABTestCase -from .mongoengine.models import Model1, Model2 logging.basicConfig(format="%(asctime)s:%(levelname)s:%(name)s:%(message)s") logging.getLogger().setLevel(logging.DEBUG) +log = logging.getLogger(__name__) +APP_DIR = "myapp" -DEFAULT_INDEX_STRING = "Welcome" -INVALID_LOGIN_STRING = "Invalid login" -ACCESS_IS_DENIED = "Access is Denied" -UNIQUE_VALIDATION_STRING = "Already exists" -NOTNULL_VALIDATION_STRING = "This field is required" -DEFAULT_ADMIN_USER = "admin" -DEFAULT_ADMIN_PASSWORD = "general" -log = logging.getLogger(__name__) +class FlaskTestCase(FABTestCase): + def setUp(self): + pass -class FlaskTestCase(FABTestCase): +## ... source file abbreviated to get to Flask examples ... + + + self.assertIn("User bob created.", result.output) + + result = runner.invoke(list_users, []) + self.assertIn("bob", result.output) + + runner.invoke(create_permissions, []) + + runner.invoke(reset_password, ["--username=bob", "--password=bar"]) + + def test_list_views(self): + os.environ["FLASK_APP"] = "app:app" + runner = CliRunner() + with runner.isolated_filesystem(): + result = runner.invoke(list_views, []) + self.assertIn("List of registered views", result.output) + self.assertIn(" Route:/api/v1/security", result.output) + + +class SQLAlchemyImportExportTestCase(FABTestCase): def setUp(self): -~~ from flask import Flask - from flask_appbuilder import AppBuilder - from flask_appbuilder.models.mongoengine.interface import MongoEngineInterface - from flask_appbuilder import ModelView - from flask_appbuilder.security.mongoengine.manager import SecurityManager - -~~ self.app = Flask(__name__) - self.app.jinja_env.undefined = jinja2.StrictUndefined - self.basedir = os.path.abspath(os.path.dirname(__file__)) - self.app.config["MONGODB_SETTINGS"] = {"DB": "test"} - self.app.config["CSRF_ENABLED"] = False - self.app.config["SECRET_KEY"] = "thisismyscretkey" - self.app.config["WTF_CSRF_ENABLED"] = False - - self.db = MongoEngine(self.app) - self.appbuilder = AppBuilder(self.app, security_manager_class=SecurityManager) - - class Model2View(ModelView): - datamodel = MongoEngineInterface(Model2) - list_columns = [ - "field_integer", - "field_float", - "field_string", - "field_method", - "group.field_string", - ] - edit_form_query_rel_fields = { - "group": [["field_string", FilterEqual, "G2"]] - } - add_form_query_rel_fields = {"group": [["field_string", FilterEqual, "G1"]]} - add_exclude_columns = ["excluded_string"] + with open("flask_appbuilder/tests/data/roles.json", "r") as fd: + self.expected_roles = json.loads(fd.read()) + + def test_export_roles(self): + with tempfile.TemporaryDirectory() as tmp_dir: +~~ app = Flask("src_app") + app.config.from_object("flask_appbuilder.tests.config_security") + app.config[ + "SQLALCHEMY_DATABASE_URI" + ] = f"sqlite:///{os.path.join(tmp_dir, 'src.db')}" + db = SQLA(app) + app_builder = AppBuilder(app, db.session) # noqa: F841 + cli_runner = app.test_cli_runner() + + path = os.path.join(tmp_dir, "roles.json") + + export_result = cli_runner.invoke(export_roles, [f"--path={path}"]) + + self.assertEqual(export_result.exit_code, 0) + self.assertTrue(os.path.exists(path)) + + with open(path, "r") as fd: + resulting_roles = json.loads(fd.read()) + + for expected_role in self.expected_roles: + match = [ + r for r in resulting_roles if r["name"] == expected_role["name"] + ] + self.assertTrue(match) + resulting_role = match[0] + resulting_role_permission_view_menus = { + (pvm["permission"]["name"], pvm["view_menu"]["name"]) + for pvm in resulting_role["permissions"] + } + expected_role_permission_view_menus = { + (pvm["permission"]["name"], pvm["view_menu"]["name"]) + for pvm in expected_role["permissions"] + } + self.assertEqual( + resulting_role_permission_view_menus, + expected_role_permission_view_menus, + ) + + def test_export_roles_filename(self): + with tempfile.TemporaryDirectory() as tmp_dir: +~~ app = Flask("src_app") + app.config.from_object("flask_appbuilder.tests.config_security") + + app.config[ + "SQLALCHEMY_DATABASE_URI" + ] = f"sqlite:///{os.path.join(tmp_dir, 'src.db')}" + db = SQLA(app) + app_builder = AppBuilder(app, db.session) # noqa: F841 + + owd = os.getcwd() + os.chdir(tmp_dir) + cli_runner = app.test_cli_runner() + export_result = cli_runner.invoke(export_roles) + os.chdir(owd) + + self.assertEqual(export_result.exit_code, 0) + self.assertGreater( + len(glob.glob(os.path.join(tmp_dir, "roles_export_*"))), 0 + ) + + def test_import_roles(self): + with tempfile.TemporaryDirectory() as tmp_dir: +~~ app = Flask("dst_app") + app.config[ + "SQLALCHEMY_DATABASE_URI" + ] = f"sqlite:///{os.path.join(tmp_dir, 'dst.db')}" + db = SQLA(app) + app_builder = AppBuilder(app, db.session) + cli_runner = app.test_cli_runner() + + path = os.path.join(tmp_dir, "roles.json") + + with open(path, "w") as fd: + fd.write(json.dumps(self.expected_roles)) + + self.assertEqual(len(app_builder.sm.get_all_roles()), 2) + + import_result = cli_runner.invoke(import_roles, [f"--path={path}"]) + self.assertEqual(import_result.exit_code, 0) + + resulting_roles = app_builder.sm.get_all_roles() + + for expected_role in self.expected_roles: + match = [r for r in resulting_roles if r.name == expected_role["name"]] + self.assertTrue(match) + resulting_role = match[0] + ## ... source file continues with no further Flask examples... @@ -308,7 +401,7 @@ from flaskbb.plugins.models import PluginRegistry from flaskbb.plugins.utils import remove_zombie_plugins_from_db, template_hook from flaskbb.user.models import Guest, User from flaskbb.utils.helpers import (app_config_from_env, crop_title, - format_date, format_datetime, + format_date, format_time, format_datetime, forum_is_unread, get_alembic_locations, get_flaskbb_config, is_online, mark_online, render_template, time_since, time_utcnow, @@ -773,7 +866,83 @@ from app.models import User ``` -## Example 12 from Flask-SocketIO +## Example 12 from Flask-Security-Too +[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) +([PyPi page](https://pypi.org/project/Flask-Security-Too/) and +[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) +is a maintained fork of the original +[Flask-Security](https://github.com/mattupstate/flask-security) project that +makes it easier to add common security features to [Flask](/flask.html) +web applications. A few of the critical goals of the Flask-Security-Too +project are ensuring JavaScript client-based single-page applications (SPAs) +can work securely with Flask-based backends and that guidance by the +[OWASP](https://owasp.org/) organization is followed by default. + +The Flask-Security-Too project is provided as open source under the +[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). + +[**Flask-Security-Too / flask_security / utils.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./utils.py) + +```python +# utils.py + flash, + g, + request, + render_template, + session, + url_for, +) +from flask.json import JSONEncoder +from flask_login import login_user as _login_user +from flask_login import logout_user as _logout_user +from flask_login import current_user +from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME +from flask_principal import AnonymousIdentity, Identity, identity_changed, Need +from flask_wtf import csrf +from wtforms import ValidationError +from itsdangerous import BadSignature, SignatureExpired +from werkzeug import __version__ as werkzeug_version +from werkzeug.local import LocalProxy +from werkzeug.datastructures import MultiDict + +from .quart_compat import best, get_quart_status +from .proxies import _security, _datastore, _pwd_context, _hashing_context +from .signals import user_authenticated + +if t.TYPE_CHECKING: # pragma: no cover +~~ from flask import Flask, Response + from .datastore import User + +SB = t.Union[str, bytes] + + +localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) + +FsPermNeed = partial(Need, "fsperm") +FsPermNeed.__doc__ = """A need with the method preset to `"fsperm"`.""" + + +def _(translate): + return translate + + +def get_request_attr(name: str) -> t.Any: + return getattr(_request_ctx_stack.top, name, None) + + +def set_request_attr(name, value): + return setattr(_request_ctx_stack.top, name, value) + + +if get_quart_status(): # pragma: no cover + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 13 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -889,7 +1058,7 @@ def connect(): ``` -## Example 13 from Flask-User +## Example 14 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -972,7 +1141,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 14 from Flask-VueJs-Template +## Example 15 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -1013,7 +1182,7 @@ def index_client(): ``` -## Example 15 from Flasky +## Example 16 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1077,7 +1246,7 @@ def create_app(config_name): ``` -## Example 16 from Datadog Flask Example App +## Example 17 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1138,7 +1307,7 @@ def before_request(): ``` -## Example 17 from keras-flask-deploy-webapp +## Example 18 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1202,7 +1371,7 @@ def model_predict(img, model): ``` -## Example 18 from sandman2 +## Example 19 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1283,7 +1452,7 @@ def get_app( ``` -## Example 19 from Science Flask +## Example 20 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -1352,14 +1521,14 @@ def create_celery_app(): ``` -## Example 20 from ShortMe +## Example 21 from ShortMe [ShortMe](https://github.com/AcrobaticPanicc/ShortMe-URL-Shortener) is a [Flask](/flask.html) app that creates a shortened URL that redirects to another, typically much longer, URL. The project is provided as open source under the [MIT license](https://github.com/AcrobaticPanicc/ShortMe-URL-Shortener/blob/main/LICENSE). -[**ShortMe / app / setup.py**](https://github.com/AcrobaticPanicc/ShortMe-URL-Shortener/blob/main/app/./setup.py) +[**ShortMe / app / setup / setup.py**](https://github.com/AcrobaticPanicc/ShortMe-URL-Shortener/blob/main/app/setup/setup.py) ```python # setup.py @@ -1369,23 +1538,23 @@ import os from flask_restful import Api from dotenv import load_dotenv -from app.db.extensions import db -from app.db.models import AuthToken -from app.views.index.index import index_blueprint -from app.views.internal.redirect_to_url import redirect_to_url_blueprint -from app.views.internal.favicon import app_blueprint -from app.views.internal.send_verification_code import send_otp_blueprint -from app.views.internal.shorten_url import shorten_url_blueprint -from app.views.your_short_url.your_short_url import your_short_url_blueprint -from app.views.total_clicks.total_clicks import total_clicks_blueprint -from app.views.error.error import error_blueprint -from app.views.page_not_found.page_not_found import page_not_found_blueprint -from app.views.api_doc.api_doc import api_doc_blueprint -from app.views.get_token.get_token import get_token_blueprint -from app.views.your_api_token.your_api_token import your_api_token_blueprint -from app.views.verify_code.verify_code import verify_code_blueprint - -from app.api.api import Shorten, TotalClicks, GetToken +from app.server.db.extensions import db +from app.server.db.models import AuthToken +from app.server.routes.index import index_blueprint +from app.server.routes.internal.redirect_to_url import redirect_to_url_blueprint +from app.server.routes.internal.favicon import app_blueprint +from app.server.routes.internal.send_verification_code import send_otp_blueprint +from app.server.routes.internal.shorten_url import shorten_url_blueprint +from app.server.routes.your_short_url import your_short_url_blueprint +from app.server.routes.total_clicks import total_clicks_blueprint +from app.server.routes.error import error_blueprint +from app.server.routes.page_not_found import page_not_found_blueprint +from app.server.routes.api_doc import api_doc_blueprint +from app.server.routes.get_token import get_token_blueprint +from app.server.routes.your_api_token import your_api_token_blueprint +from app.server.routes.verify_code import verify_code_blueprint + +from app.server.api.api import Shorten, TotalClicks, GetToken def create_app(config_file): @@ -1393,7 +1562,7 @@ def create_app(config_file): project_folder = os.path.expanduser(app_path) load_dotenv(os.path.join(project_folder, '.env')) -~~ app = Flask(__name__) +~~ app = Flask(__name__, template_folder='../client/templates', static_folder='../client/static') api = Api(app) app.config.from_pyfile(config_file) @@ -1425,7 +1594,7 @@ def create_app(config_file): ``` -## Example 21 from tedivms-flask +## Example 22 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1555,7 +1724,7 @@ def create_app(extra_config_settings={}): ``` -## Example 22 from trape +## Example 23 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data @@ -1577,6 +1746,8 @@ from core.db import Database import os import sys import platform +import urllib +import requests from multiprocessing import Process trape = core.stats.trape @@ -1587,13 +1758,11 @@ db = Database() class victim_server(object): @app.route("/" + trape.victim_path) def homeVictim(): - opener = urllib2.build_opener() - headers = victim_headers(request.user_agent) - opener.addheaders = headers + r = requests.get(trape.url_to_clone, headers=victim_headers2(request.user_agent)) if (trape.type_lure == 'local'): html = assignScripts(victim_inject_code(render_template("/" + trape.url_to_clone), 'payload', '/', trape.gmaps, trape.ipinfo)) else: - html = assignScripts(victim_inject_code(opener.open(trape.url_to_clone).read(), 'payload', trape.url_to_clone, trape.gmaps, trape.ipinfo)) + html = assignScripts(victim_inject_code(r.content, 'payload', trape.url_to_clone, trape.gmaps, trape.ipinfo)) ## ... source file continues with no further Flask examples... diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index f16fe863b..e279fec3c 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -22,7 +22,7 @@ Flask web applications. and ImmutableDict are several other callables with code examples from the same `flask.app` package. -These subjects go along with the `Headers` code examples: +These topics are also useful while reading the `Headers` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -47,10 +47,12 @@ import random import string import uuid from collections import namedtuple +from contextlib import contextmanager from unittest.mock import Mock, patch import requests from flask.testing import FlaskClient +from freezegun import freeze_time from sqlalchemy.engine.url import make_url from sqlalchemy_utils import drop_database ~~from werkzeug.datastructures import Headers @@ -63,6 +65,7 @@ from CTFd.models import ( ChallengeComments, ChallengeFiles, Challenges, + ChallengeTopics, Comments, Fails, Fields, @@ -78,11 +81,14 @@ from CTFd.models import ( TeamComments, Teams, Tokens, + Topics, Tracking, Unlocks, UserComments, Users, ) +from CTFd.utils import set_config +from tests.constants.time import FreezeTimes text_type = str binary_type = bytes @@ -104,25 +110,25 @@ class CTFdTestClient(FlaskClient): return super(CTFdTestClient, self).open(*args, **kwargs) -def create_ctfd( - ctf_name="CTFd", - ctf_description="CTF description", - name="admin", - email="admin@examplectf.com", - password="password", - user_mode="users", - setup=True, - enable_plugins=False, - application_root="/", - config=TestingConfig, -): - if enable_plugins: - config.SAFE_MODE = False - else: - config.SAFE_MODE = True +class ctftime: + @contextmanager + def init(): + try: + set_config("start", FreezeTimes.START) + set_config("end", FreezeTimes.END) + yield + finally: + set_config("start", None) + set_config("end", None) - config.APPLICATION_ROOT = application_root - url = make_url(config.SQLALCHEMY_DATABASE_URI) + @contextmanager + def not_started(): + try: + freezer = freeze_time(FreezeTimes.NOT_STARTED) + frozen_time = freezer.start() + yield frozen_time + finally: + freezer.stop() ## ... source file continues with no further Headers examples... @@ -145,8 +151,6 @@ Flask RESTX is provided as open source under the ```python # api.py -from __future__ import unicode_literals - import difflib import inspect from itertools import chain @@ -163,7 +167,10 @@ from types import MethodType from flask import url_for, request, current_app from flask import make_response as original_flask_make_response -from flask.helpers import _endpoint_from_view_func +try: + from flask.helpers import _endpoint_from_view_func +except ImportError: + from flask.scaffold import _endpoint_from_view_func from flask.signals import got_request_exception from jsonschema import RefResolver @@ -177,7 +184,13 @@ from werkzeug.exceptions import ( NotAcceptable, InternalServerError, ) -from werkzeug.wrappers import BaseResponse + +from werkzeug import __version__ as werkzeug_version + +if werkzeug_version.split('.')[0] >= '2': + from werkzeug.wrappers import Response as BaseResponse +else: + from werkzeug.wrappers import BaseResponse from . import apidoc from .mask import ParseError, MaskError @@ -189,28 +202,22 @@ from .utils import default_id, camel_to_dash, unpack from .representations import output_json from ._http import HTTPStatus -RE_RULES = re.compile("(<.*>)") - -HEADERS_BLACKLIST = ("Content-Length",) - -DEFAULT_REPRESENTATIONS = [("application/json", output_json)] - ## ... source file abbreviated to get to Headers examples ... + if self._has_fr_route(): + try: return self.handle_error(e) except Exception as f: return original_handler(f) return original_handler(e) def handle_error(self, e): - got_request_exception.send(current_app._get_current_object(), exception=e) - if ( not isinstance(e, HTTPException) and current_app.propagate_exceptions - and not isinstance(e, tuple(self.error_handlers.keys())) + and not isinstance(e, tuple(self._own_and_child_error_handlers.keys())) ): exc_type, exc_value, tb = sys.exc_info() @@ -234,6 +241,8 @@ DEFAULT_REPRESENTATIONS = [("application/json", output_json)] ) break else: + got_request_exception.send(current_app._get_current_object(), exception=e) + if isinstance(e, HTTPException): code = HTTPStatus(e.code) if include_message_in_response: @@ -247,8 +256,6 @@ DEFAULT_REPRESENTATIONS = [("application/json", output_json)] else: code = HTTPStatus.INTERNAL_SERVER_ERROR if include_message_in_response: - default_data = { - "message": code.phrase, ## ... source file continues with no further Headers examples... diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 899031de3..d2a334fa8 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -20,7 +20,7 @@ so that values cannot be modified after initially being set. and Headers are several other callables with code examples from the same `flask.app` package. -You should read up on these subjects along with these `ImmutableDict` examples: +These topics are also useful while reading the `ImmutableDict` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -89,7 +89,7 @@ DEFAULTS = { def load_config(only_defaults=False, override=None): - data = dict(DEFAULTS, **INTERNAL_DEFAULTS) + data = DEFAULTS | INTERNAL_DEFAULTS if not only_defaults: path = get_config_path() config = _sanitize_data(_parse_config(path)) diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 07e39cf51..16a0bb9c3 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -32,7 +32,7 @@ scenarios. CTFd is open sourced under the import base64 import requests -~~from flask import Blueprint +~~from flask import Blueprint, abort from flask import current_app as app from flask import redirect, render_template, request, session, url_for from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired diff --git a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown index facbdfdef..aa8140dd9 100644 --- a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown +++ b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown @@ -90,7 +90,7 @@ def _make_wsgi_app(info, url, evalex_whitelist, proxy): return info.load_app() url_data = url_parse(url) -~~ app = DispatchingApp(_load_app) +~~ app = DispatchingApp(_load_app, use_eager_loading=False) app = DebuggedIndico(app, evalex_whitelist) app = _make_indico_dispatcher(app, url_data.path) if proxy: diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 5e87669b6..1b39ccb93 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -43,7 +43,6 @@ import traceback from datetime import datetime import click -import click_log from flask import current_app ~~from flask.cli import FlaskGroup, ScriptInfo, with_appcontext from flask_alembic import alembic_click @@ -52,20 +51,29 @@ from sqlalchemy_utils.functions import database_exists from werkzeug.utils import import_string from flaskbb import create_app -from flaskbb.cli.utils import (EmailType, FlaskBBCLIError, get_version, - prompt_config_path, prompt_save_user, - write_config) +from flaskbb.cli.utils import ( + EmailType, + FlaskBBCLIError, + get_version, + prompt_config_path, + prompt_save_user, + write_config, +) from flaskbb.extensions import alembic, celery, db, whooshee -from flaskbb.utils.populate import (create_default_groups, - create_default_settings, create_latest_db, - create_test_data, create_welcome_forum, - insert_bulk_data, run_plugin_migrations, - update_settings_from_fixture) +from flaskbb.utils.populate import ( + create_default_groups, + create_default_settings, + create_latest_db, + create_test_data, + create_welcome_forum, + insert_bulk_data, + run_plugin_migrations, + update_settings_from_fixture, +) from flaskbb.utils.translations import compile_translations logger = logging.getLogger(__name__) -click_log.basic_config(logger) ~~class FlaskBBGroup(FlaskGroup): @@ -83,8 +91,7 @@ click_log.basic_config(logger) self._loaded_flaskbb_plugins = True except Exception: logger.error( - "Error while loading CLI Plugins", - exc_info=traceback.format_exc() + "Error while loading CLI Plugins", exc_info=traceback.format_exc() ) else: shell_context_processors = app.pluggy.hook.flaskbb_shell_context() @@ -93,6 +100,7 @@ click_log.basic_config(logger) def get_command(self, ctx, name): self._load_flaskbb_plugins(ctx) + return super(FlaskBBGroup, self).get_command(ctx, name) ## ... source file continues with no further FlaskGroup examples... diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index 3a17c827b..469bcd7b5 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -43,7 +43,6 @@ import traceback from datetime import datetime import click -import click_log from flask import current_app ~~from flask.cli import FlaskGroup, ScriptInfo, with_appcontext from flask_alembic import alembic_click @@ -52,20 +51,29 @@ from sqlalchemy_utils.functions import database_exists from werkzeug.utils import import_string from flaskbb import create_app -from flaskbb.cli.utils import (EmailType, FlaskBBCLIError, get_version, - prompt_config_path, prompt_save_user, - write_config) +from flaskbb.cli.utils import ( + EmailType, + FlaskBBCLIError, + get_version, + prompt_config_path, + prompt_save_user, + write_config, +) from flaskbb.extensions import alembic, celery, db, whooshee -from flaskbb.utils.populate import (create_default_groups, - create_default_settings, create_latest_db, - create_test_data, create_welcome_forum, - insert_bulk_data, run_plugin_migrations, - update_settings_from_fixture) +from flaskbb.utils.populate import ( + create_default_groups, + create_default_settings, + create_latest_db, + create_test_data, + create_welcome_forum, + insert_bulk_data, + run_plugin_migrations, + update_settings_from_fixture, +) from flaskbb.utils.translations import compile_translations logger = logging.getLogger(__name__) -click_log.basic_config(logger) class FlaskBBGroup(FlaskGroup): @@ -83,8 +91,7 @@ class FlaskBBGroup(FlaskGroup): self._loaded_flaskbb_plugins = True except Exception: logger.error( - "Error while loading CLI Plugins", - exc_info=traceback.format_exc() + "Error while loading CLI Plugins", exc_info=traceback.format_exc() ) else: shell_context_processors = app.pluggy.hook.flaskbb_shell_context() @@ -100,7 +107,12 @@ class FlaskBBGroup(FlaskGroup): return super(FlaskBBGroup, self).list_commands(ctx) -def make_app(script_info): +def make_app(): + ctx = click.get_current_context(silent=True) + script_info = None + if ctx is not None: + script_info = ctx.obj + config_file = getattr(script_info, "config_file", None) instance_path = getattr(script_info, "instance_path", None) return create_app(config_file, instance_path) @@ -114,28 +126,28 @@ def set_instance(ctx, param, value): ~~ ctx.ensure_object(ScriptInfo).instance_path = value -@click.group(cls=FlaskBBGroup, create_app=make_app, add_version_option=False, - invoke_without_command=True) -@click.option("--config", expose_value=False, callback=set_config, - required=False, is_flag=False, is_eager=True, metavar="CONFIG", - help="Specify the config to use either in dotted module " - "notation e.g. 'flaskbb.configs.default.DefaultConfig' " - "or by using a path like '/path/to/flaskbb.cfg'") -@click.option("--instance", expose_value=False, callback=set_instance, - required=False, is_flag=False, is_eager=True, metavar="PATH", - help="Specify the instance path to use. By default the folder " - "'instance' next to the package or module is assumed to " - "be the instance path.") -@click.option("--version", expose_value=False, callback=get_version, - is_flag=True, is_eager=True, help="Show the FlaskBB version.") -@click.pass_context -@click_log.simple_verbosity_option(logger) -def flaskbb(ctx): - if ctx.invoked_subcommand is None: - click.echo(ctx.get_help()) - - -flaskbb.add_command(alembic_click, "db") +@click.group( + cls=FlaskBBGroup, + create_app=make_app, + add_version_option=False, + invoke_without_command=True, +) +@click.option( + "--config", + expose_value=False, + callback=set_config, + required=False, + is_flag=False, + is_eager=True, + metavar="CONFIG", + help="Specify the config to use either in dotted module " + "notation e.g. 'flaskbb.configs.default.DefaultConfig' " + "or by using a path like '/path/to/flaskbb.cfg'", +) +@click.option( + "--instance", + expose_value=False, + callback=set_instance, ## ... source file continues with no further ScriptInfo examples... diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index bb89e469a..e2d1ab675 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -43,7 +43,6 @@ import traceback from datetime import datetime import click -import click_log from flask import current_app ~~from flask.cli import FlaskGroup, ScriptInfo, with_appcontext from flask_alembic import alembic_click @@ -52,35 +51,29 @@ from sqlalchemy_utils.functions import database_exists from werkzeug.utils import import_string from flaskbb import create_app -from flaskbb.cli.utils import (EmailType, FlaskBBCLIError, get_version, - prompt_config_path, prompt_save_user, - write_config) +from flaskbb.cli.utils import ( + EmailType, + FlaskBBCLIError, + get_version, + prompt_config_path, + prompt_save_user, + write_config, +) from flaskbb.extensions import alembic, celery, db, whooshee -from flaskbb.utils.populate import (create_default_groups, - create_default_settings, create_latest_db, - create_test_data, create_welcome_forum, - insert_bulk_data, run_plugin_migrations, - update_settings_from_fixture) -from flaskbb.utils.translations import compile_translations - - -logger = logging.getLogger(__name__) -click_log.basic_config(logger) - - -class FlaskBBGroup(FlaskGroup): - def __init__(self, *args, **kwargs): +from flaskbb.utils.populate import ( + create_default_groups, + create_default_settings, + create_latest_db, + create_test_data, + create_welcome_forum, + insert_bulk_data, + run_plugin_migrations, + update_settings_from_fixture, ## ... source file abbreviated to get to with_appcontext examples ... - "'instance' next to the package or module is assumed to " - "be the instance path.") -@click.option("--version", expose_value=False, callback=get_version, - is_flag=True, is_eager=True, help="Show the FlaskBB version.") -@click.pass_context -@click_log.simple_verbosity_option(logger) def flaskbb(ctx): if ctx.invoked_subcommand is None: click.echo(ctx.get_help()) @@ -90,23 +83,40 @@ flaskbb.add_command(alembic_click, "db") @flaskbb.command() -@click.option("--welcome", "-w", default=True, is_flag=True, - help="Disable the welcome forum.") -@click.option("--force", "-f", default=False, is_flag=True, - help="Doesn't ask for confirmation.") +@click.option( + "--welcome", "-w", default=True, is_flag=True, help="Disable the welcome forum." +) +@click.option( + "--force", "-f", default=False, is_flag=True, help="Doesn't ask for confirmation." +) @click.option("--username", "-u", help="The username of the user.") -@click.option("--email", "-e", type=EmailType(), - help="The email address of the user.") +@click.option("--email", "-e", type=EmailType(), help="The email address of the user.") @click.option("--password", "-p", help="The password of the user.") -@click.option("--no-plugins", "-n", default=False, is_flag=True, - help="Don't run the migrations for the default plugins.") +@click.option( + "--no-plugins", + "-n", + default=False, + is_flag=True, + help="Don't run the migrations for the default plugins.", +) ~~@with_appcontext def install(welcome, force, username, email, password, no_plugins): + if not current_app.config["CONFIG_PATH"]: + click.secho( + "[!] No 'flaskbb.cfg' config found. " + "You can generate a configuration file with 'flaskbb makeconfig'.", + fg="red", + ) + sys.exit(1) + click.secho("[+] Installing FlaskBB...", fg="cyan") if database_exists(db.engine.url): - if force or click.confirm(click.style( - "Existing database found. Do you want to delete the old one and " - "create a new one?", fg="magenta") + if force or click.confirm( + click.style( + "Existing database found. Do you want to delete the old one and " + "create a new one?", + fg="magenta", + ) ): db.drop_all() else: @@ -114,46 +124,35 @@ def install(welcome, force, username, email, password, no_plugins): create_latest_db() - click.secho("[+] Creating default settings...", fg="cyan") - create_default_groups() - create_default_settings() - - click.secho("[+] Creating admin user...", fg="cyan") - prompt_save_user(username, email, password, "admin") - - if welcome: - click.secho("[+] Creating welcome forum...", fg="cyan") - create_welcome_forum() - ## ... source file abbreviated to get to with_appcontext examples ... - - if fixture or all_latest: - try: - settings = import_string( - "flaskbb.fixtures.{}".format(fixture) - ) - settings = settings.fixture except ImportError: - raise FlaskBBCLIError("{} fixture is not available" - .format(fixture), fg="red") + raise FlaskBBCLIError( + "{} fixture is not available".format(fixture), fg="red" + ) click.secho("[+] Updating fixtures...", fg="cyan") count = update_settings_from_fixture( fixture=settings, overwrite_group=force, overwrite_setting=force ) - click.secho("[+] {settings} settings in {groups} setting groups " - "updated.".format(groups=len(count), settings=sum( - len(settings) for settings in count.values()) - ), fg="green") + click.secho( + "[+] {settings} settings in {groups} setting groups " + "updated.".format( + groups=len(count), + settings=sum(len(settings) for settings in count.values()), + ), + fg="green", + ) -@flaskbb.command("celery", add_help_option=False, - context_settings={"ignore_unknown_options": True, - "allow_extra_args": True}) +@flaskbb.command( + "celery", + add_help_option=False, + context_settings={"ignore_unknown_options": True, "allow_extra_args": True}, +) @click.pass_context ~~@with_appcontext def start_celery(ctx): @@ -164,6 +163,7 @@ def start_celery(ctx): ~~@with_appcontext def shell_command(): import code + banner = "Python %s on %s\nInstance Path: %s" % ( sys.version, sys.platform, @@ -190,19 +190,21 @@ def shell_command(): @flaskbb.command("urls", short_help="Show routes for the app.") -@click.option("--route", "-r", "order_by", flag_value="rule", default=True, - help="Order by route") -@click.option("--endpoint", "-e", "order_by", flag_value="endpoint", - help="Order by endpoint") -@click.option("--methods", "-m", "order_by", flag_value="methods", - help="Order by methods") +@click.option( + "--route", "-r", "order_by", flag_value="rule", default=True, help="Order by route" +) +@click.option( + "--endpoint", "-e", "order_by", flag_value="endpoint", help="Order by endpoint" +) +@click.option( + "--methods", "-m", "order_by", flag_value="methods", help="Order by methods" +) ~~@with_appcontext def list_urls(order_by): from flask import current_app rules = sorted( - current_app.url_map.iter_rules(), - key=lambda rule: getattr(rule, order_by) + current_app.url_map.iter_rules(), key=lambda rule: getattr(rule, order_by) ) max_rule_len = max(len(rule.rule) for rule in rules) @@ -216,11 +218,12 @@ def list_urls(order_by): column_header_len = max_rule_len + max_endpoint_len + max_method_len + 4 column_template = "{:<%s} {:<%s} {:<%s}" % ( - max_rule_len, max_endpoint_len, max_method_len + max_rule_len, + max_endpoint_len, + max_method_len, ) - click.secho(column_template.format("Route", "Endpoint", "Methods"), - fg="blue", bold=True) + click.secho( ## ... source file continues with no further with_appcontext examples... diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index ad395c4b1..f18d7b9b7 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -40,17 +40,18 @@ The Flask-Security-Too project is provided as open source under the # unified_signin.py import time +import typing as t from flask import current_app as app ~~from flask import after_this_request, request, session from flask_login import current_user from werkzeug.datastructures import MultiDict -from werkzeug.local import LocalProxy from wtforms import BooleanField, RadioField, StringField, SubmitField, validators from .confirmable import requires_confirmation from .decorators import anonymous_user_required, auth_required, unauth_csrf from .forms import Form, Required, get_form_field_label +from .proxies import _security, _datastore from .quart_compat import get_quart_status from .signals import us_profile_changed, us_security_token_sent from .twofactor import ( @@ -63,7 +64,7 @@ from .utils import ( SmsSenderFactory, base_render_json, check_and_get_token_status, - config_value, + config_value as cv, do_flash, find_user, get_identity_attributes, @@ -84,7 +85,7 @@ from .utils import ( token=self.passcode.data, totp_secret=self.totp_secret, user=self.user, - window=config_value("US_TOKEN_VALIDITY"), + window=cv("US_TOKEN_VALIDITY"), ): self.passcode.errors.append(get_message("INVALID_PASSWORD_CODE")[0]) return False @@ -127,24 +128,24 @@ def us_signin_send_code(): ## ... source file abbreviated to get to after_this_request examples ... + form.submit.data = True + if form.validate_on_submit(): remember_me = form.remember.data if "remember" in form else None - if config_value("TWO_FACTOR") and form.authn_via in config_value( - "US_MFA_REQUIRED" - ): + if cv("TWO_FACTOR") and form.authn_via in cv("US_MFA_REQUIRED"): if request.is_json and request.content_length: - tf_validity_token = request.get_json().get("tf_validity_token", None) + tf_validity_token = request.get_json().get( # type: ignore + "tf_validity_token", None + ) else: tf_validity_token = request.cookies.get("tf_validity", default=None) tf_validity_token_is_valid = tf_verify_validility_token( tf_validity_token, form.user.fs_uniquifier ) - if config_value("TWO_FACTOR_REQUIRED") or is_tf_setup(form.user): - if config_value("TWO_FACTOR_ALWAYS_VALIDATE") or ( - not tf_validity_token_is_valid - ): + if cv("TWO_FACTOR_REQUIRED") or is_tf_setup(form.user): + if cv("TWO_FACTOR_ALWAYS_VALIDATE") or (not tf_validity_token_is_valid): return tf_login( form.user, @@ -163,7 +164,7 @@ def us_signin_send_code(): code_methods = _compute_code_methods() if _security._want_json(request): payload = { - "available_methods": config_value("US_ENABLED_METHODS"), + "available_methods": cv("US_ENABLED_METHODS"), "code_methods": code_methods, "identity_attributes": get_identity_attributes(), } @@ -174,9 +175,9 @@ def us_signin_send_code(): form.passcode.data = None - if form.requires_confirmation and _security.requires_confirmation_error_view: + if form.requires_confirmation and cv("REQUIRES_CONFIRMATION_ERROR_VIEW"): do_flash(*get_message("CONFIRMATION_REQUIRED")) - return redirect(get_url(_security.requires_confirmation_error_view)) + return redirect(get_url(cv("REQUIRES_CONFIRMATION_ERROR_VIEW"))) ## ... source file abbreviated to get to after_this_request examples ... @@ -185,7 +186,7 @@ def us_signin_send_code(): if _security.redirect_behavior == "spa": return redirect( get_url( - _security.login_error_view, + cv("LOGIN_ERROR_VIEW"), qparams=user.get_redirect_qparams({c: m}), ) ) @@ -193,14 +194,14 @@ def us_signin_send_code(): return redirect(url_for_security("us_signin")) if ( - config_value("TWO_FACTOR") - and "email" in config_value("US_MFA_REQUIRED") - and (config_value("TWO_FACTOR_REQUIRED") or is_tf_setup(user)) + cv("TWO_FACTOR") + and "email" in cv("US_MFA_REQUIRED") + and (cv("TWO_FACTOR_REQUIRED") or is_tf_setup(user)) ): if _security.redirect_behavior == "spa": return redirect( get_url( - _security.login_error_view, + cv("LOGIN_ERROR_VIEW"), qparams=user.get_redirect_qparams({"tf_required": 1}), ) ) @@ -210,7 +211,7 @@ def us_signin_send_code(): ~~ after_this_request(view_commit) if _security.redirect_behavior == "spa": return redirect( - get_url(_security.post_login_view, qparams=user.get_redirect_qparams()) + get_url(cv("POST_LOGIN_VIEW"), qparams=user.get_redirect_qparams()) ) do_flash(*get_message("PASSWORDLESS_LOGIN_SUCCESSFUL")) @@ -218,11 +219,11 @@ def us_signin_send_code(): @auth_required( - lambda: config_value("API_ENABLED_METHODS"), - within=lambda: config_value("FRESHNESS"), - grace=lambda: config_value("FRESHNESS_GRACE_PERIOD"), + lambda: cv("API_ENABLED_METHODS"), + within=lambda: cv("FRESHNESS"), + grace=lambda: cv("FRESHNESS_GRACE_PERIOD"), ) -def us_setup(): +def us_setup() -> "ResponseValue": form_class = _security.us_setup_form if request.is_json: @@ -250,7 +251,7 @@ def us_setup(): if invalid: m, c = get_message("API_ERROR") if expired: - m, c = get_message("US_SETUP_EXPIRED", within=config_value("US_SETUP_WITHIN")) + m, c = get_message("US_SETUP_EXPIRED", within=cv("US_SETUP_WITHIN")) if invalid or expired: if _security._want_json(request): payload = json_error_response(errors=m) @@ -268,7 +269,7 @@ def us_setup(): _datastore.us_set(current_user, method, state["totp_secret"], phone) us_profile_changed.send( - app._get_current_object(), user=current_user, method=method + app._get_current_object(), user=current_user, method=method # type: ignore ) if _security._want_json(request): return base_render_json( @@ -281,12 +282,12 @@ def us_setup(): else: do_flash(*get_message("US_SETUP_SUCCESSFUL")) return redirect( - get_url(_security.us_post_setup_view) - or get_url(_security.post_login_view) + get_url(cv("US_POST_SETUP_VIEW")) or get_url(cv("POST_LOGIN_VIEW")) ) if _security._want_json(request): return base_render_json(form, include_user=False) + m, c = get_message("INVALID_PASSWORD_CODE") ## ... source file continues with no further after_this_request examples... diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index a29697b0f..d4a03d102 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -143,6 +143,7 @@ The code is open sourced under the import ast import re +from collections import Counter from contextlib import contextmanager from babel import negotiate_locale @@ -150,7 +151,7 @@ from babel.core import LOCALE_ALIASES, Locale from babel.messages.pofile import read_po from babel.support import NullTranslations ~~from flask import current_app, g, has_app_context, has_request_context, request, session -from flask_babelex import Babel, Domain, get_domain +from flask_babel import Babel, Domain, get_domain from flask_pluginengine import current_plugin from speaklater import is_lazy_string, make_lazy_string from werkzeug.utils import cached_property diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index 235184bfc..9fe1163e0 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -322,23 +322,10 @@ import warnings from pprint import pformat import yaml -~~from flask import current_app, has_request_context, request, session +~~from flask import has_request_context, request, session from indico.core.config import config -from indico.util.i18n import set_best_lang -from indico.web.util import get_request_info - - -try: - from raven import setup_logging - from raven.contrib.celery import register_logger_signal, register_signal - from raven.contrib.flask import Sentry - from raven.handlers.logging import SentryHandler -except ImportError: - Sentry = object # so we can subclass - has_sentry = False -else: - has_sentry = True +from indico.web.util import get_request_info, get_request_user class AddRequestIDFilter: @@ -349,7 +336,8 @@ class AddRequestIDFilter: class AddUserIDFilter: def filter(self, record): -~~ record.user_id = str(session.user.id) if has_request_context() and session and session.user else '-' +~~ user = get_request_user()[0] if has_request_context() else None + record.user_id = str(session.user.id) if user else '-' return True @@ -375,70 +363,6 @@ class BlacklistFilter(logging.Filter): return not any(x.filter(record) for x in self.filters) - -## ... source file abbreviated to get to has_request_context examples ... - - - if formatter.pop('append_request_info', False): - assert '()' not in formatter - formatter['()'] = RequestInfoFormatter - if config.DB_LOG: - data['loggers']['indico._db'] = {'level': 'DEBUG', 'propagate': False, 'handlers': ['_db']} - data['handlers']['_db'] = {'class': 'logging.handlers.SocketHandler', 'host': '127.0.0.1', 'port': 9020} - if config.CUSTOMIZATION_DEBUG and config.CUSTOMIZATION_DIR: - data['loggers'].setdefault('indico.customization', {})['level'] = 'DEBUG' - logging.config.dictConfig(data) - if config.SENTRY_DSN: - if not has_sentry: - raise Exception('`raven` must be installed to use sentry logging') - init_sentry(app) - - @classmethod - def get(cls, name=None): - if name is None: - name = 'indico' - elif name != 'indico' and not name.startswith('indico.'): - name = 'indico.' + name - return logging.getLogger(name) - - -class IndicoSentry(Sentry): - def get_user_info(self, request): -~~ if not has_request_context() or not session.user: - return None - return {'id': session.user.id, - 'email': session.user.email, - 'name': session.user.full_name} - - def before_request(self, *args, **kwargs): - super().before_request() -~~ if not has_request_context(): - return - self.client.extra_context({'Endpoint': str(request.url_rule.endpoint) if request.url_rule else None, - 'Request ID': request.id}) - self.client.tags_context({'locale': set_best_lang()}) - - -def init_sentry(app): - sentry = IndicoSentry(wrap_wsgi=False, register_signal=True, logging=False) - sentry.init_app(app) - handler = SentryHandler(sentry.client, level=getattr(logging, config.SENTRY_LOGGING_LEVEL)) - handler.addFilter(BlacklistFilter({'indico.flask', 'celery.redirected'})) - setup_logging(handler) - register_logger_signal(sentry.client) - register_signal(sentry.client) - - -def sentry_log_exception(): - try: - sentry = current_app.extensions['sentry'] - except KeyError: - return - sentry.captureException() - - - - ## ... source file continues with no further has_request_context examples... ``` diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index fefae63cc..450633b87 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -103,130 +103,84 @@ forms, and internationalization support. Flask App Builder is provided under the [BSD 3-Clause "New" or "Revised" license](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/LICENSE). -[**Flask AppBuilder / flask_appbuilder / menu.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/./menu.py) +[**Flask AppBuilder / flask_appbuilder / validators.py**](https://github.com/dpgaspar/Flask-AppBuilder/blob/master/flask_appbuilder/./validators.py) ```python -# menu.py -from typing import List - -~~from flask import current_app, url_for -from flask_babel import gettext as __ - -from .api import BaseApi, expose -from .basemanager import BaseManager -from .security.decorators import permission_name, protect - - -class MenuItem(object): - def __init__(self, name, href="", icon="", label="", childs=None, baseview=None): - self.name = name - self.href = href - self.icon = icon - self.label = label - self.childs = childs or [] - self.baseview = baseview - - def get_url(self): - if not self.href: - if not self.baseview: - return "" - else: - return url_for(f"{self.baseview.endpoint}.{self.baseview.default_view}") - else: - try: +# validators.py +import re +from typing import Optional +~~from flask import current_app +from flask_appbuilder.exceptions import PasswordComplexityValidationError +from flask_appbuilder.models.base import BaseInterface +from flask_babel import gettext +from wtforms import Field, Form, ValidationError + +password_complexity_regex = re.compile( + r"""( + ^(?=.*[A-Z].*[A-Z]) # at least two capital letters + (?=.*[^0-9a-zA-Z]) # at least one of these special characters + (?=.*[0-9].*[0-9]) # at least two numeric digits + (?=.*[a-z].*[a-z].*[a-z]) # at least three lower case letters + .{10,} # at least 10 total characters + $ + )""", + re.VERBOSE, +) -## ... source file abbreviated to get to current_app examples ... +class Unique: - self.menu = [] - if reverse: - extra_classes = extra_classes + "navbar-inverse" - self.extra_classes = extra_classes + field_flags = ("unique",) - @property - def reverse(self): - return "navbar-inverse" in self.extra_classes - - def get_list(self): - return self.menu - - def get_flat_name_list(self, menu: "Menu" = None, result: List = None) -> List: - menu = menu or self.menu - result = result or [] - for item in menu: - result.append(item.name) - if item.childs: - result.extend(self.get_flat_name_list(menu=item.childs, result=result)) - return result + def __init__( + self, datamodel: BaseInterface, col_name: str, message: Optional[str] = None + ) -> None: + self.datamodel = datamodel + self.col_name = col_name + self.message = message - def get_data(self, menu=None): - menu = menu or self.menu - ret_list = [] - -~~ allowed_menus = current_app.appbuilder.sm.get_user_menu_access( - self.get_flat_name_list() + def __call__(self, form: Form, field: Field) -> None: + filters = self.datamodel.get_filters().add_filter( + self.col_name, self.datamodel.FilterEqual, field.data ) - - for i, item in enumerate(menu): - if item.name == "-" and not i == len(menu) - 1: - ret_list.append("-") - elif item.name not in allowed_menus: - continue - elif item.childs: - ret_list.append( - { - "name": item.name, - "icon": item.icon, - "label": __(str(item.label)), - "childs": self.get_data(menu=item.childs), - } - ) - else: - ret_list.append( - { - "name": item.name, - "icon": item.icon, - "label": __(str(item.label)), - "url": item.get_url(), - - -## ... source file abbreviated to get to current_app examples ... + count, obj = self.datamodel.query(filters) + if count > 0: + if not hasattr(form, "_id") or form._id != self.datamodel.get_keys(obj)[0]: + if self.message is None: + self.message = field.gettext(u"Already exists.") + raise ValidationError(self.message) - category=category, icon=category_icon, label=category_label - ) - new_menu_item = MenuItem( - name=name, href=href, icon=icon, label=label, baseview=baseview - ) - self.find(category).childs.append(new_menu_item) +class PasswordComplexityValidator: - def add_separator(self, category=""): - menu_item = self.find(category) - if menu_item: - menu_item.childs.append(MenuItem("-")) - else: - raise Exception( - "Menu separator does not have correct category {}".format(category) + def __call__(self, form: Form, field: Field) -> None: +~~ if current_app.config.get("FAB_PASSWORD_COMPLEXITY_ENABLED", False): +~~ password_complexity_validator = current_app.config.get( + "FAB_PASSWORD_COMPLEXITY_VALIDATOR", None ) - - -class MenuApi(BaseApi): - resource_name = "menu" - openapi_spec_tag = "Menu" - - @expose("/", methods=["GET"]) - @protect(allow_browser_login=True) - @permission_name("get") - def get_menu_data(self): -~~ return self.response(200, result=current_app.appbuilder.menu.get_data()) - - -class MenuApiManager(BaseManager): - def register_views(self): - if self.appbuilder.app.config.get("FAB_ADD_MENU_API", True): - self.appbuilder.add_api(MenuApi) - + if password_complexity_validator is not None: + try: + password_complexity_validator(field.data) + except PasswordComplexityValidationError as exc: + raise ValidationError(str(exc)) + else: + try: + default_password_complexity(field.data) + except PasswordComplexityValidationError as exc: + raise ValidationError(str(exc)) + + +def default_password_complexity(password: str) -> None: + match = re.search(password_complexity_regex, password) + if not match: + raise PasswordComplexityValidationError( + gettext( + "Must have at least two capital letters," + " one special character, two digits, three lower case letters and" + " a minimal length of 10." + ) + ) ## ... source file continues with no further current_app examples... @@ -1452,65 +1406,72 @@ Python code. It does this by adding a `{% meld_scripts %}` tag to the Flask template engine and then inserting components written in Python scripts created by a developer. -[**Flask-Meld / flask_meld / component.py**](https://github.com/mikeabrahamsen/Flask-Meld/blob/main/flask_meld/./component.py) +[**Flask-Meld / flask_meld / message.py**](https://github.com/mikeabrahamsen/Flask-Meld/blob/main/flask_meld/./message.py) ```python -# component.py -import os -import uuid -from importlib.util import module_from_spec, spec_from_file_location +# message.py +import ast +from werkzeug.wrappers.response import Response +import functools +from .component import get_component_class +~~from flask import jsonify, current_app import orjson -from bs4 import BeautifulSoup -from bs4.formatter import HTMLFormatter -~~from flask import render_template, current_app, jsonify -def convert_to_snake_case(s): - s.replace("-", "_") - return s +def process_message(message): + meld_id = message["id"] + component_name = message["componentName"] + action_queue = message["actionQueue"] + data = message["data"] + Component = get_component_class(component_name) + component = Component(meld_id, **data) + return_data = None -def convert_to_camel_case(s): - s = convert_to_snake_case(s) - return "".join(word.title() for word in s.split("_")) + for action in action_queue: + payload = action.get("payload", None) + if "syncInput" in action["type"]: + if hasattr(component, payload["name"]): + setattr(component, payload["name"], payload["value"]) + if component._form: + field_name = payload.get("name") + if field_name in component._form._fields: + field = getattr(component._form, field_name) + component._set_field_data(field_name, payload["value"]) + component.updated(field) -def get_component_class(component_name): - module_name = convert_to_snake_case(component_name) - class_name = convert_to_camel_case(module_name) - module = get_component_module(module_name) - component_class = getattr(module, class_name) +## ... source file abbreviated to get to current_app examples ... - return component_class -def get_component_module(module_name): -~~ user_specified_dir = current_app.config.get("MELD_COMPONENT_DIR", None) + if "(" in call_method_name and call_method_name.endswith(")"): + param_idx = call_method_name.index("(") + params_str = call_method_name[param_idx:] + + method_name = call_method_name.replace(params_str, "") + + params_str = params_str[1:-1] + if params_str != "": + try: + params = ast.literal_eval("[" + params_str + "]") + except (ValueError, SyntaxError): + params = list(map(str.strip, params_str.split(","))) + + return method_name, params + + +def listen(*event_names: str): + def dec(func): + func._meld_event_names = event_names + return func + return dec - if not user_specified_dir: - try: - name = getattr(current_app, "name", None) - full_path = os.path.join(name, "meld", "components", module_name + ".py") - module = load_module_from_path(full_path, module_name) - except FileNotFoundError: - full_path = os.path.join("meld", "components", module_name + ".py") - module = load_module_from_path(full_path, module_name) - return module - else: - try: - full_path = os.path.join(user_specified_dir, module_name + ".py") - module = load_module_from_path(full_path, module_name) - except FileNotFoundError: - full_path = os.path.join( - user_specified_dir, "components", module_name + ".py" - ) - module = load_module_from_path(full_path, module_name) - return module +def emit(event_name: str, **kwargs): +~~ current_app.socketio.emit("meld-event", {"event": event_name, "message": kwargs}) -def load_module_from_path(full_path, module_name): - spec = spec_from_file_location(module_name, full_path) ## ... source file continues with no further current_app examples... @@ -2171,20 +2132,24 @@ The Flask-Security-Too project is provided as open source under the # core.py from datetime import datetime, timedelta +import re +import typing as t import warnings import pkg_resources -~~from flask import _request_ctx_stack, current_app, render_template +~~from flask import _request_ctx_stack, current_app +from flask.json import JSONEncoder from flask_login import AnonymousUserMixin, LoginManager from flask_login import UserMixin as BaseUserMixin from flask_login import current_user from flask_principal import Identity, Principal, RoleNeed, UserNeed, identity_loaded +from flask_wtf import FlaskForm from itsdangerous import URLSafeTimedSerializer from passlib.context import CryptContext from werkzeug.datastructures import ImmutableList from werkzeug.local import LocalProxy -from .babel import get_i18n_domain, have_babel +from .babel import FsDomain from .decorators import ( default_reauthn_handler, default_unauthn_handler, @@ -2197,63 +2162,6 @@ from .forms import ( LoginForm, PasswordlessLoginForm, RegisterForm, - ResetPasswordForm, - SendConfirmationForm, - - -## ... source file abbreviated to get to current_app examples ... - - - UnifiedSigninSetupForm, - UnifiedSigninSetupValidateForm, - UnifiedVerifyForm, - us_send_security_token, -) -from .totp import Totp -from .utils import _ -from .utils import config_value as cv -from .utils import ( - FsJsonEncoder, - FsPermNeed, - csrf_cookie_handler, - default_want_json, - get_config, - get_identity_attribute, - get_identity_attributes, - get_message, - localize_callback, - set_request_attr, - uia_email_mapper, - url_for_security, - verify_and_update_password, -) -from .views import create_blueprint, default_render_json - -~~_security = LocalProxy(lambda: current_app.extensions["security"]) -_datastore = LocalProxy(lambda: _security.datastore) - -AUTHN_MECHANISMS = ("basic", "session", "token") - - -_default_config = { - "BLUEPRINT_NAME": "security", - "CLI_ROLES_NAME": "roles", - "CLI_USERS_NAME": "users", - "URL_PREFIX": None, - "SUBDOMAIN": None, - "FLASH_MESSAGES": True, - "I18N_DOMAIN": "flask_security", - "I18N_DIRNAME": pkg_resources.resource_filename("flask_security", "translations"), - "EMAIL_VALIDATOR_ARGS": None, - "PASSWORD_HASH": "bcrypt", - "PASSWORD_SALT": None, - "PASSWORD_SINGLE_HASH": { - "django_argon2", - "django_bcrypt_sha256", - "django_pbkdf2_sha256", - "django_pbkdf2_sha1", - "django_bcrypt", - "django_salted_md5", ## ... source file abbreviated to get to current_app examples ... @@ -2277,7 +2185,7 @@ _default_config = { "TWO_FACTOR_VALIDITY_COOKIE": { "httponly": True, "secure": False, - "samesite": None, + "samesite": "Strict", }, "CONFIRM_EMAIL_WITHIN": "5 days", "RESET_PASSWORD_WITHIN": "5 days", @@ -2314,33 +2222,33 @@ _default_config = { ## ... source file abbreviated to get to current_app examples ... - - for key, value in _default_config.items(): - app.config.setdefault("SECURITY_" + key, value) - - for key, value in _default_messages.items(): - app.config.setdefault("SECURITY_MSG_" + key, value) + for key, value in get_config(app).items(): + setattr(self, key.lower(), value) identity_loaded.connect_via(app)(_on_identity_loaded) - self._state = state = _get_state(app, datastore, **kwargs) - if hasattr(datastore, "user_model") and not hasattr( - datastore.user_model, "fs_uniquifier" + if hasattr(self.datastore, "user_model") and not hasattr( + self.datastore.user_model, "fs_uniquifier" ): # pragma: no cover raise ValueError("User model must contain fs_uniquifier as of 4.0.0") - if register_blueprint: - bp = create_blueprint( - app, state, __name__, json_encoder=kwargs["json_encoder_cls"] - ) - app.register_blueprint(bp) - app.context_processor(_context_processor) + for uia in cv("USER_IDENTITY_ATTRIBUTES", app=app): # pragma: no cover + if not isinstance(uia, dict): + raise ValueError( + "SECURITY_USER_IDENTITY_ATTRIBUTES changed semantics" + " in 4.0 - please see release notes." + ) + if len(list(uia.keys())) != 1: + raise ValueError( + "Each element in SECURITY_USER_IDENTITY_ATTRIBUTES" + " must have one and only one key." + ) @app.before_first_request def _register_i18n(): if "_" not in app.jinja_env.globals: -~~ current_app.jinja_env.globals["_"] = state.i18n_domain.gettext -~~ current_app.jinja_env.globals["_fsdomain"] = state.i18n_domain.gettext +~~ current_app.jinja_env.globals["_"] = self.i18n_domain.gettext +~~ current_app.jinja_env.globals["_fsdomain"] = self.i18n_domain.gettext @app.before_first_request def _csrf_init(): @@ -2370,40 +2278,42 @@ _default_config = { ) csrf_cookie = cv("CSRF_COOKIE") - if csrf_cookie and csrf_cookie["key"] and not csrf: + if csrf_cookie and csrf_cookie.get("key", None): +~~ current_app.config["SECURITY_CSRF_COOKIE_NAME"] = csrf_cookie.pop("key") + if cv("CSRF_COOKIE_NAME") and not csrf: raise ValueError( "CSRF_COOKIE defined however CsrfProtect not part of application" ) if csrf: csrf.exempt("flask_security.views.logout") - if csrf_cookie and csrf_cookie["key"]: + if cv("CSRF_COOKIE_NAME"): ~~ current_app.after_request(csrf_cookie_handler) ~~ current_app.config["WTF_CSRF_HEADERS"].append(cv("CSRF_HEADER")) - @app.before_first_request - def check_babel(): - if have_babel() and "babel" not in app.extensions: - raise ValueError( - "Flask-Babel or Flask-BabelEx is installed but not initialized" - ) - - state._phone_util = state.phone_util_cls(app) - state._mail_util = state.mail_util_cls(app) - state._password_util = state.password_util_cls(app) - - app.extensions["security"] = state - - if hasattr(app, "cli"): - from .cli import users, roles - - if state.cli_users_name: - app.cli.add_command(users, state.cli_users_name) - if state.cli_roles_name: - app.cli.add_command(roles, state.cli_roles_name) - - for newc, oldc in [ - ("SECURITY_SMS_SERVICE", "SECURITY_TWO_FACTOR_SMS_SERVICE"), + self._phone_util = self.phone_util_cls(app) + self._mail_util = self.mail_util_cls(app) + self._password_util = self.password_util_cls(app) + self._username_util = self.username_util_cls(app) + rvre = cv("REDIRECT_VALIDATE_RE", app=app) + if rvre: + self._redirect_validate_re = re.compile(rvre) + + if not hasattr(app, "login_manager") or not self.login_manager: + self.login_manager = _get_login_manager(app, self.anonymous_user) + + self.remember_token_serializer = _get_serializer(app, "remember") + self.login_serializer = _get_serializer(app, "login") + self.reset_serializer = _get_serializer(app, "reset") + self.confirm_serializer = _get_serializer(app, "confirm") + self.us_setup_serializer = _get_serializer(app, "us_setup") + self.tf_validity_serializer = _get_serializer(app, "two_factor_validity") + self.principal = _get_principal(app) + self.pwd_context = _get_pwd_context(app) + self.hashing_context = _get_hashing_context(app) + self.i18n_domain = FsDomain(app) + + if cv("USERNAME_ENABLE", app): ## ... source file continues with no further current_app examples... diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 8fced1573..6c47941e6 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -42,7 +42,7 @@ import datetime import json import logging import re -from typing import Dict, List, Set +from typing import Dict, List, Optional, Set, Tuple ~~from flask import g, session, url_for from flask_babel import lazy_gettext as _ @@ -186,12 +186,6 @@ from .views import ( raise NotImplementedError - def add_permission_view_menu(self, permission_name, view_menu_name): - raise NotImplementedError - - def del_permission_view_menu(self, permission_name, view_menu_name, cascade=True): - raise NotImplementedError - def exist_permission_on_views(self, lst, item): raise NotImplementedError @@ -204,6 +198,12 @@ from .views import ( def del_permission_role(self, role, perm_view): raise NotImplementedError + def export_roles(self, path: Optional[str] = None) -> None: + raise NotImplementedError + + def import_roles(self, path: str) -> None: + raise NotImplementedError + def load_user(self, pk): return self.get_user_by_id(int(pk)) diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index b67c2a446..be097b278 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -207,14 +207,19 @@ def test_that_request_path_hijacking_works_properly(): def test_theme_fallback_config(): - app = create_ctfd() + + class ThemeFallbackConfig(TestingConfig): + THEME_FALLBACK = False + + app = create_ctfd(config=ThemeFallbackConfig) try: - os.mkdir(os.path.join(app.root_path, "themes", "foo")) + os.mkdir(os.path.join(app.root_path, "themes", "foo_fallback")) except OSError: pass with app.app_context(): - set_config("ctf_theme", "foo") + app.config["THEME_FALLBACK"] = False + set_config("ctf_theme", "foo_fallback") assert app.config["THEME_FALLBACK"] == False with app.test_client() as client: try: @@ -222,11 +227,6 @@ def test_theme_fallback_config(): except TemplateNotFound: pass try: - r = client.get("/themes/foo/static/js/pages/main.dev.js") - except TemplateNotFound: - pass - destroy_ctfd(app) - ## ... source file continues with no further request examples... @@ -658,7 +658,7 @@ class UnbanUser(MethodView): data.append( { "id": user.id, - "type": "unban", + "type": "ban", "reverse": "ban", "reverse_name": _("Ban"), "reverse_url": url_for("management.ban_user", @@ -2226,6 +2226,7 @@ The Flask-Security-Too project is provided as open source under the # forms.py import inspect +import typing as t ~~from flask import Markup, current_app, request from flask_login import current_user @@ -2242,25 +2243,25 @@ from wtforms import ( ValidationError, validators, ) -from wtforms.fields.html5 import EmailField + +try: # pragma: no cover + from wtforms.fields import EmailField +except ImportError: + from wtforms.fields.html5 import EmailField from wtforms.validators import StopValidation from .babel import is_lazy_string, make_lazy_string from .confirmable import requires_confirmation from .utils import ( - _, - _datastore, - config_value, - do_flash, ## ... source file abbreviated to get to request examples ... - -class RegisterFormMixin: submit = SubmitField(get_form_field_label("register")) + username: t.ClassVar[Field] + def to_dict(self, only_user): def is_field_and_user_attr(member): @@ -2313,22 +2314,22 @@ class ForgotPasswordForm(Form, UserEmailFormMixin): ## ... source file abbreviated to get to request examples ... - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - def validate(self): - if not super().validate(): - return False - if not self.user.is_active: self.email.errors.append(get_message("DISABLED_ACCOUNT")[0]) return False return True +login_email_field = EmailField( + get_form_field_label("email"), validators=[email_required] +) + +login_string_field = StringField( + get_form_field_label("email"), validators=[email_required] +) + + class LoginForm(Form, NextFormMixin): - email = EmailField(get_form_field_label("email"), validators=[email_required]) password = PasswordField( get_form_field_label("password"), validators=[password_required] ) @@ -2339,7 +2340,7 @@ class LoginForm(Form, NextFormMixin): super().__init__(*args, **kwargs) if not self.next.data: ~~ self.next.data = request.args.get("next", "") - self.remember.default = config_value("DEFAULT_REMEMBER_ME") + self.remember.default = cv("DEFAULT_REMEMBER_ME") if ( current_app.extensions["security"].recoverable and not self.password.description @@ -2382,7 +2383,7 @@ class RegisterForm(ConfirmRegisterForm, NextFormMixin): def validate(self): if not super().validate(): return False - if not config_value("UNIFIED_SIGNIN"): + if not cv("UNIFIED_SIGNIN"): if not self.password_confirm.data or not self.password_confirm.data.strip(): self.password_confirm.errors.append( get_message("PASSWORD_NOT_PROVIDED")[0] @@ -2949,6 +2950,7 @@ import configparser import json import logging import os +from typing import Union import requests import requests_cache @@ -2974,6 +2976,8 @@ requests_cache.install_cache(cache_name='news_cache', expire_after=300) APP = Flask(__name__) +SESSION = requests.Session() +SESSION.headers.update({'Authorization': API_KEY}) @APP.route('/', methods=['GET', 'POST']) @@ -2998,14 +3002,13 @@ def category(category): country = get_cookie('country') if country is not None: params.update({'country': country}) - response = requests.get(TOP_HEADLINES, - params=params, - headers={'Authorization': API_KEY}) + response = SESSION.get(TOP_HEADLINES, params=params) if response.status_code == 200: pages = count_pages(response.json()) if page > pages: page = pages - return redirect(url_for('category', category=category, page=page)) + return redirect( + url_for('category', category=category, page=page)) articles = parse_articles(response.json()) return render(articles, page, pages, country, category) elif response.status_code == 401: @@ -3014,7 +3017,7 @@ def category(category): @APP.route('/search/', methods=['GET', 'POST']) -def search(query): +def search(query: str): ~~ page = request.args.get('page', default=1, type=int) if page < 1: return redirect(url_for('search', query=query, page=1)) @@ -3026,9 +3029,7 @@ def search(query): } ~~ if request.method == 'POST': return do_post(page, category='search', current_query=query) - response = requests.get(EVERYTHING, - params=params, - headers={'Authorization': API_KEY}) + response = SESSION.get(EVERYTHING, params=params) pages = count_pages(response.json()) if page > pages: page = pages @@ -3062,7 +3063,7 @@ def do_post(page, category='general', current_query=None): return redirect(url_for('category', category=category, page=page)) -def parse_articles(response): +def parse_articles(response: dict) -> list: parsed_articles = [] if response.get('status') == 'ok': for article in response.get('articles'): @@ -3075,16 +3076,16 @@ def parse_articles(response): ## ... source file abbreviated to get to request examples ... + 'source': article['source']['name'] }) return parsed_articles -def count_pages(response): - pages = 0 +def count_pages(response: dict) -> int: if response.get('status') == 'ok': - pages = (-(-response.get('totalResults', 0) // PAGE_SIZE)) - return pages + return (-(-response.get('totalResults', 0) // PAGE_SIZE)) + return 0 def render(articles, page, pages, country, category): @@ -3099,9 +3100,8 @@ def render(articles, page, pages, country, category): pages=pages) -def get_cookie(key): -~~ cookie_value = request.cookies.get(key) - return cookie_value +def get_cookie(key: str) -> Union[str, None]: +~~ return request.cookies.get(key) if __name__ == '__main__': @@ -3502,6 +3502,8 @@ from core.db import Database import os import sys import platform +import urllib +import requests from multiprocessing import Process trape = core.stats.trape @@ -3512,13 +3514,11 @@ db = Database() class victim_server(object): @app.route("/" + trape.victim_path) def homeVictim(): - opener = urllib2.build_opener() - headers = victim_headers(request.user_agent) - opener.addheaders = headers + r = requests.get(trape.url_to_clone, headers=victim_headers2(request.user_agent)) if (trape.type_lure == 'local'): html = assignScripts(victim_inject_code(render_template("/" + trape.url_to_clone), 'payload', '/', trape.gmaps, trape.ipinfo)) else: - html = assignScripts(victim_inject_code(opener.open(trape.url_to_clone).read(), 'payload', trape.url_to_clone, trape.gmaps, trape.ipinfo)) + html = assignScripts(victim_inject_code(r.content, 'payload', trape.url_to_clone, trape.gmaps, trape.ipinfo)) return html @app.route("/register", methods=["POST"]) @@ -3611,7 +3611,7 @@ class victim_server(object): ~~ url = request.args.get('url') if url[0:4] != 'http': url = 'http://' + url - opener = urllib2.build_opener() + opener = urllib.request.build_opener() headers = victim_headers(request.user_agent) opener.addheaders = headers html = assignScripts(victim_inject_code(opener.open(url).read(), 'vscript', url, trape.gmaps, trape.ipinfo)) diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 9ff29a99a..baf253747 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -41,7 +41,7 @@ scenarios. CTFd is open sourced under the import base64 import requests -from flask import Blueprint +from flask import Blueprint, abort from flask import current_app as app ~~from flask import redirect, render_template, request, session, url_for from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired @@ -73,13 +73,6 @@ auth = Blueprint("auth", __name__) ## ... source file abbreviated to get to session examples ... - ) - db.session.close() - - if is_teams_mode(): - return redirect(url_for("teams.private")) - - return redirect(url_for("challenges.listing")) else: return render_template("register.html", errors=errors) @@ -97,6 +90,13 @@ def login(): user = Users.query.filter_by(name=name).first() if user: + if user.password is None: + errors.append( + "Your account was registered with a 3rd party authentication provider. " + "Please try logging in with a configured authentication provider." + ) + return render_template("login.html", errors=errors) + if user and verify_password(request.form["password"], user.password): ~~ session.regenerate() @@ -271,6 +271,7 @@ from babel.core import get_locale_identifier from babel.dates import format_date as babel_format_date from babel.dates import format_datetime as babel_format_datetime from babel.dates import format_timedelta as babel_format_timedelta +from babel.dates import format_time as babel_format_time ~~from flask import current_app, flash, g, redirect, request, session, url_for from flask_allows import Permission from flask_babelplus import lazy_gettext as _ @@ -932,10 +933,12 @@ The Flask-Security-Too project is provided as open source under the ```python # twofactor.py +import typing as t + ~~from flask import current_app as app, redirect, request, session from werkzeug.datastructures import MultiDict -from werkzeug.local import LocalProxy +from .proxies import _security, _datastore from .utils import ( SmsSenderFactory, base_render_json, @@ -955,8 +958,8 @@ from .signals import ( tf_profile_changed, ) -_security = LocalProxy(lambda: app.extensions["security"]) -_datastore = LocalProxy(lambda: _security.datastore) +if t.TYPE_CHECKING: # pragma: no cover + from flask import Response def tf_clean_session(): @@ -1213,130 +1216,150 @@ is a [Flask](/flask.html)-based web app for event management. The code is open sourced under the [MIT license](https://github.com/indico/indico/blob/master/LICENSE). -[**indico / indico / core / logger.py**](https://github.com/indico/indico/blob/master/indico/core/logger.py) +[**indico / indico / util / i18n.py**](https://github.com/indico/indico/blob/master/indico/util/i18n.py) ```python -# logger.py +# i18n.py -import logging -import logging.config -import logging.handlers -import os -import warnings -from pprint import pformat - -import yaml -~~from flask import current_app, has_request_context, request, session +import ast +import re +from collections import Counter +from contextlib import contextmanager + +from babel import negotiate_locale +from babel.core import LOCALE_ALIASES, Locale +from babel.messages.pofile import read_po +from babel.support import NullTranslations +~~from flask import current_app, g, has_app_context, has_request_context, request, session +from flask_babel import Babel, Domain, get_domain +from flask_pluginengine import current_plugin +from speaklater import is_lazy_string, make_lazy_string +from werkzeug.utils import cached_property from indico.core.config import config -from indico.util.i18n import set_best_lang -from indico.web.util import get_request_info +from indico.util.caching import memoize_request + +LOCALE_ALIASES = dict(LOCALE_ALIASES, en='en_GB') +RE_TR_FUNCTION = re.compile(r'''_\("([^"]*)"\)|_\('([^']*)'\)''', re.DOTALL | re.MULTILINE) -try: - from raven import setup_logging - from raven.contrib.celery import register_logger_signal, register_signal - from raven.contrib.flask import Sentry - from raven.handlers.logging import SentryHandler -except ImportError: - Sentry = object # so we can subclass - has_sentry = False -else: - has_sentry = True +babel = Babel() +_use_context = object() -class AddRequestIDFilter: - def filter(self, record): - record.request_id = request.id if has_request_context() else '0' * 16 - return True +def get_translation_domain(plugin_name=_use_context): + if plugin_name is None: + return get_domain() + else: + plugin = None + if has_app_context(): + from indico.core.plugins import plugin_engine + plugin = plugin_engine.get_plugin(plugin_name) if plugin_name is not _use_context else current_plugin -class AddUserIDFilter: - def filter(self, record): -~~ record.user_id = str(session.user.id) if has_request_context() and session and session.user else '-' - return True +## ... source file abbreviated to get to session examples ... -class RequestInfoFormatter(logging.Formatter): - def format(self, record): - rv = super().format(record) - info = get_request_info() - if info: - rv += '\n\n' + pformat(info) - return rv + def weekday(self, daynum, short=True): + return self.days['format']['abbreviated' if short else 'wide'][daynum] -class FormattedSubjectSMTPHandler(logging.handlers.SMTPHandler): - def getSubject(self, record): - return self.subject % record.__dict__ + @cached_property + def time_formats(self): + formats = super().time_formats + for k, v in formats.items(): + v.format = v.format.replace(':%(ss)s', '') + return formats -class BlacklistFilter(logging.Filter): - def __init__(self, names): - self.filters = [logging.Filter(name) for name in names] +def _remove_locale_script(locale): + parts = locale.split('_') # e.g. `en_GB` or `zh_Hans_CN` + return f'{parts[0]}_{parts[-1]}' - def filter(self, record): - return not any(x.filter(record) for x in self.filters) +@babel.localeselector +def set_best_lang(check_session=True): + from indico.core.config import config + if not has_request_context(): + return 'en_GB' if current_app.config['TESTING'] else config.DEFAULT_LOCALE + elif 'lang' in g: + return g.lang +~~ elif check_session and session.lang is not None: +~~ return session.lang -## ... source file abbreviated to get to session examples ... + all_locales = {_remove_locale_script(loc).lower(): loc for loc in get_all_locales()} + preferred = [x.replace('-', '_') for x in request.accept_languages.values()] + resolved_lang = negotiate_locale(preferred, list(all_locales), aliases=LOCALE_ALIASES) + + if not resolved_lang: + if current_app.config['TESTING']: + return 'en_GB' + + resolved_lang = config.DEFAULT_LOCALE - if formatter.pop('append_request_info', False): - assert '()' not in formatter - formatter['()'] = RequestInfoFormatter - if config.DB_LOG: - data['loggers']['indico._db'] = {'level': 'DEBUG', 'propagate': False, 'handlers': ['_db']} - data['handlers']['_db'] = {'class': 'logging.handlers.SocketHandler', 'host': '127.0.0.1', 'port': 9020} - if config.CUSTOMIZATION_DEBUG and config.CUSTOMIZATION_DIR: - data['loggers'].setdefault('indico.customization', {})['level'] = 'DEBUG' - logging.config.dictConfig(data) - if config.SENTRY_DSN: - if not has_sentry: - raise Exception('`raven` must be installed to use sentry logging') - init_sentry(app) - - @classmethod - def get(cls, name=None): - if name is None: - name = 'indico' - elif name != 'indico' and not name.startswith('indico.'): - name = 'indico.' + name - return logging.getLogger(name) - - -class IndicoSentry(Sentry): - def get_user_info(self, request): -~~ if not has_request_context() or not session.user: - return None -~~ return {'id': session.user.id, -~~ 'email': session.user.email, -~~ 'name': session.user.full_name} - - def before_request(self, *args, **kwargs): - super().before_request() - if not has_request_context(): - return - self.client.extra_context({'Endpoint': str(request.url_rule.endpoint) if request.url_rule else None, - 'Request ID': request.id}) - self.client.tags_context({'locale': set_best_lang()}) - - -def init_sentry(app): - sentry = IndicoSentry(wrap_wsgi=False, register_signal=True, logging=False) - sentry.init_app(app) - handler = SentryHandler(sentry.client, level=getattr(logging, config.SENTRY_LOGGING_LEVEL)) - handler.addFilter(BlacklistFilter({'indico.flask', 'celery.redirected'})) - setup_logging(handler) - register_logger_signal(sentry.client) - register_signal(sentry.client) - - -def sentry_log_exception(): try: - sentry = current_app.extensions['sentry'] + resolved_lang = all_locales[resolved_lang.lower()] except KeyError: + return 'en_GB' + + resolved_lang = re.sub(r'^([a-zA-Z]+)_([a-zA-Z]+)$', + lambda m: f'{m.group(1).lower()}_{m.group(2).upper()}', + resolved_lang) + + g.lang = resolved_lang + return resolved_lang + + +@memoize_request +def get_current_locale(): + return IndicoLocale.parse(set_best_lang()) + + +def get_all_locales(): + if babel.app is None: + return {} + else: + missing = object() + languages = {str(t): config.CUSTOM_LANGUAGES.get(str(t), (t.language_name.title(), t.territory_name)) + for t in babel.list_translations() + if config.CUSTOM_LANGUAGES.get(str(t), missing) is not None} + counts = Counter(x[0] for x in languages.values()) + return {code: (name, territory, counts[name] > 1) for code, (name, territory) in languages.items()} + + +def set_session_lang(lang): +~~ session.lang = lang + + +@contextmanager +def session_language(lang): +~~ old_lang = session.lang + + set_session_lang(lang) + yield + set_session_lang(old_lang) + + +def parse_locale(locale): + return IndicoLocale.parse(locale) + + +def extract_node(node, keywords, commentTags, options, parents=[None]): + if isinstance(node, ast.Str) and isinstance(parents[-1], (ast.Assign, ast.Call)): + matches = RE_TR_FUNCTION.findall(node.s) + for m in matches: + line = m[0] or m[1] + yield (node.lineno, '', line.split('\n'), ['old style recursive strings']) + else: + for cnode in ast.iter_child_nodes(node): + yield from extract_node(cnode, keywords, commentTags, options, parents=(parents + [node])) + + +def po_to_json(po_file, locale=None, domain=None): + with open(po_file, 'rb') as f: + po_data = read_po(f, locale=locale, domain=domain) ## ... source file continues with no further session examples... @@ -1473,7 +1496,7 @@ from threading import Lock from flask_socketio import SocketIO, emit, join_room, rooms, disconnect import core.stats import core.user -from user_objects import attacks_hook_message +from core.user_objects import attacks_hook_message from core.utils import utils from core.db import Database import sys diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index e89f89b9f..346bb3f6b 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -1462,12 +1462,12 @@ class ImportRoleMembersMixin: self.role.members |= users for user in new_members: self.logger.info(f'User {user} added to role {self.role} by {session.user}') -~~ flash(ngettext("{} member has been imported.", - "{} members have been imported.", +~~ flash(ngettext('{} member has been imported.', + '{} members have been imported.', len(users)).format(len(users)), 'success') if unknown_emails: -~~ flash(ngettext("There is no user with this email address: {}", - "There are no users with these email addresses: {}", +~~ flash(ngettext('There is no user with this email address: {}', + 'There are no users with these email addresses: {}', len(unknown_emails)).format(', '.join(unknown_emails)), 'warning') tpl = get_template_module('events/roles/_roles.html') return jsonify_data(html=tpl.render_role(self.role, collapsed=False, email_button=False)) diff --git a/content/pages/examples/flask/flask-helpers-get-root-path.markdown b/content/pages/examples/flask/flask-helpers-get-root-path.markdown index 53da00788..3b75f3a3e 100644 --- a/content/pages/examples/flask/flask-helpers-get-root-path.markdown +++ b/content/pages/examples/flask/flask-helpers-get-root-path.markdown @@ -37,6 +37,7 @@ import os import re import shutil import socket +import subprocess import sys from operator import attrgetter from pathlib import Path @@ -45,6 +46,8 @@ from smtplib import SMTP import click from click import wrap_text ~~from flask.helpers import get_root_path +from packaging.specifiers import SpecifierSet +from packaging.version import Version from pkg_resources import iter_entry_points from prompt_toolkit import prompt from prompt_toolkit.completion import PathCompleter, WordCompleter @@ -57,6 +60,7 @@ from sqlalchemy.pool import NullPool from terminaltables import AsciiTable from werkzeug.urls import url_parse +import indico from indico.core.db.sqlalchemy.util.models import import_all_models from indico.util.console import cformat from indico.util.string import validate_email @@ -66,9 +70,6 @@ def _echo(msg=''): click.echo(msg, err=True) -def _warn(msg): - msg = wrap_text(msg) - click.echo(click.style(msg, fg='yellow'), err=True) ## ... source file abbreviated to get to get_root_path examples ... @@ -129,14 +130,14 @@ def _prompt(message, default='', path=False, list_=None, required=True, validate ## ... source file abbreviated to get to get_root_path examples ... + 'SMTP_USE_CELERY = False' + ] - if dev: + if not self.system_notices: config_data += [ '', - '# Development options', - 'DB_LOG = True', - 'DEBUG = True', - 'SMTP_USE_CELERY = False' + '# Disable system notices', + 'SYSTEM_NOTICES_URL = None' ] config = '\n'.join(x for x in config_data if x is not None) @@ -173,11 +174,7 @@ def _prompt(message, default='', path=False, list_=None, required=True, validate _echo(cformat('Run %{green!}export INDICO_CONFIG={}%{reset} to use your config file') .format(self.config_path)) - if self.old_archive_dir: - _echo(cformat('Check %{green!}https://git.io/vHP6o%{reset} for a guide on how to ' - 'import data from Indico v1.2')) - else: - _echo(cformat('You can now run %{green!}indico db prepare%{reset} to initialize your Indico database')) + _echo(cformat('You can now run %{green!}indico db prepare%{reset} to initialize your Indico database')) diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 64df32c79..877d38532 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -326,18 +326,17 @@ The Flask-Security-Too project is provided as open source under the from functools import partial import time +import typing as t from flask import ( Blueprint, after_this_request, - current_app, jsonify, request, session, ) from flask_login import current_user -from werkzeug.datastructures import MultiDict -from werkzeug.local import LocalProxy +from werkzeug.datastructures import ImmutableMultiDict, MultiDict from .changeable import change_user_password from .confirmable import ( @@ -347,6 +346,7 @@ from .confirmable import ( ) from .decorators import anonymous_user_required, auth_required, unauth_csrf from .passwordless import login_token_status, send_login_instructions +from .proxies import _security, _datastore from .quart_compat import get_quart_status from .unified_signin import ( us_signin, @@ -366,7 +366,7 @@ from .recoverable import ( from .utils import ( base_render_json, check_and_update_authn_fresh, - config_value, + config_value as cv, do_flash, get_message, get_post_login_redirect, @@ -390,9 +390,8 @@ if get_quart_status(): # pragma: no cover else: ~~ from flask import make_response, redirect - -_security = LocalProxy(lambda: current_app.extensions["security"]) -_datastore = LocalProxy(lambda: _security.datastore) +if t.TYPE_CHECKING: # pragma: no cover + from flask.typing import ResponseValue def default_render_json(payload, code, headers, user): @@ -408,7 +407,7 @@ def _ctx(endpoint): @unauth_csrf(fall_through=True) -def login(): +def login() -> "ResponseValue": if current_user.is_authenticated and request.method == "POST": @@ -418,7 +417,7 @@ def login(): ) return _security._render_json(payload, 400, None, None) else: - return redirect(get_url(_security.post_login_view)) + return redirect(get_url(cv("POST_LOGIN_VIEW"))) form_class = _security.login_form @@ -448,6 +447,7 @@ import configparser import json import logging import os +from typing import Union import requests import requests_cache @@ -473,20 +473,20 @@ requests_cache.install_cache(cache_name='news_cache', expire_after=300) APP = Flask(__name__) +SESSION = requests.Session() +SESSION.headers.update({'Authorization': API_KEY}) -@APP.route('/', methods=['GET', 'POST']) -def root(): ## ... source file abbreviated to get to make_response examples ... + 'pageSize': PAGE_SIZE + } if request.method == 'POST': return do_post(page, category='search', current_query=query) - response = requests.get(EVERYTHING, - params=params, - headers={'Authorization': API_KEY}) + response = SESSION.get(EVERYTHING, params=params) pages = count_pages(response.json()) if page > pages: page = pages @@ -520,7 +520,7 @@ def do_post(page, category='general', current_query=None): return redirect(url_for('category', category=category, page=page)) -def parse_articles(response): +def parse_articles(response: dict) -> list: parsed_articles = [] if response.get('status') == 'ok': for article in response.get('articles'): diff --git a/content/pages/examples/flask/flask-helpers-safe-join.markdown b/content/pages/examples/flask/flask-helpers-safe-join.markdown index 9df182563..1382094d8 100644 --- a/content/pages/examples/flask/flask-helpers-safe-join.markdown +++ b/content/pages/examples/flask/flask-helpers-safe-join.markdown @@ -60,7 +60,7 @@ from CTFd.utils.migrations import create_database, migrations, stamp_latest_revi from CTFd.utils.sessions import CachingSessionInterface from CTFd.utils.updates import update_check -__version__ = "3.3.0" +__version__ = "3.4.0" __channel__ = "oss" diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown index 1676d0fa2..726a0993c 100644 --- a/content/pages/examples/flask/flask-helpers-send-file.markdown +++ b/content/pages/examples/flask/flask-helpers-send-file.markdown @@ -45,6 +45,7 @@ from flask import Blueprint, abort from flask import current_app as app ~~from flask import redirect, render_template, request, send_file, session, url_for from flask.helpers import safe_join +from jinja2.exceptions import TemplateNotFound from sqlalchemy.exc import IntegrityError from CTFd.cache import cache @@ -67,7 +68,6 @@ from CTFd.models import ( db, ) from CTFd.utils import config, get_config, set_config -from CTFd.utils import user as current_user ## ... source file abbreviated to get to send_file examples ... diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index ad0cc1b93..9dab48b41 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -224,13 +224,19 @@ from .security.decorators import permission_name, protect class MenuItem(object): - def __init__(self, name, href="", icon="", label="", childs=None, baseview=None): + def __init__( + self, name, href="", icon="", label="", childs=None, baseview=None, cond=None + ): self.name = name self.href = href self.icon = icon self.label = label self.childs = childs or [] self.baseview = baseview + self.cond = cond + + def should_render(self) -> bool: + return bool(self.cond()) if self.cond is not None else True def get_url(self): if not self.href: @@ -291,7 +297,7 @@ import re import mistune ~~from flask import url_for -from jinja2 import Markup +from markupsafe import Markup from pluggy import HookimplMarker from pygments import highlight from pygments.formatters import HtmlFormatter diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index c1bb443db..7c217d86c 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -32,122 +32,43 @@ can work securely with Flask-based backends and that guidance by the The Flask-Security-Too project is provided as open source under the [MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). -[**Flask-Security-Too / flask_security / utils.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./utils.py) +[**Flask-Security-Too / flask_security / core.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./core.py) ```python -# utils.py -import abc -import base64 -import datetime -from functools import partial -import hashlib -import hmac -import time -from typing import Dict, List +# core.py + +from datetime import datetime, timedelta +import re +import typing as t import warnings -from datetime import timedelta -from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode -import urllib.request -import urllib.error -from flask import ( - _request_ctx_stack, - after_this_request, - current_app, - flash, - g, - request, - session, - url_for, -) +import pkg_resources +from flask import _request_ctx_stack, current_app ~~from flask.json import JSONEncoder -from flask_login import login_user as _login_user -from flask_login import logout_user as _logout_user +from flask_login import AnonymousUserMixin, LoginManager +from flask_login import UserMixin as BaseUserMixin from flask_login import current_user -from flask_login import COOKIE_NAME as REMEMBER_COOKIE_NAME -from flask_principal import AnonymousIdentity, Identity, identity_changed, Need -from flask_wtf import csrf -from wtforms import ValidationError -from itsdangerous import BadSignature, SignatureExpired +from flask_principal import Identity, Principal, RoleNeed, UserNeed, identity_loaded +from flask_wtf import FlaskForm +from itsdangerous import URLSafeTimedSerializer +from passlib.context import CryptContext +from werkzeug.datastructures import ImmutableList from werkzeug.local import LocalProxy -from werkzeug.datastructures import MultiDict - -from .quart_compat import best, get_quart_status -from .signals import user_authenticated - -_security = LocalProxy(lambda: current_app.extensions["security"]) - -_datastore = LocalProxy(lambda: _security.datastore) - -_pwd_context = LocalProxy(lambda: _security.pwd_context) - -_hashing_context = LocalProxy(lambda: _security.hashing_context) - -localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) - - - -## ... source file abbreviated to get to JSONEncoder examples ... - - - accept_mimetypes.best = best - if accept_mimetypes.best == "application/json": - return True - return False - - -def json_error_response(errors): - if isinstance(errors, str): - response_json = dict(error=errors) - elif isinstance(errors, dict): - response_json = dict(errors=errors) - else: - raise TypeError("The errors argument should be either a str or dict.") - - return response_json - -~~class FsJsonEncoder(JSONEncoder): - - def default(self, obj): - from .babel import is_lazy_string - - if is_lazy_string(obj): - return str(obj) - else: -~~ return JSONEncoder.default(self, obj) - - -class SmsSenderBaseClass(metaclass=abc.ABCMeta): - def __init__(self): - pass - - @abc.abstractmethod - def send_sms(self, from_number, to_number, msg): # pragma: no cover - return - - -class DummySmsSender(SmsSenderBaseClass): - def send_sms(self, from_number, to_number, msg): # pragma: no cover - return - - -class SmsSenderFactory: - senders = {"Dummy": DummySmsSender} - - @classmethod - def createSender(cls, name, *args, **kwargs): - return cls.senders[name](*args, **kwargs) - - - return _security._render_json(payload, code, headers=None, user=user) - - -def default_want_json(req): - if req.is_json: - return True - accept_mimetypes = req.accept_mimetypes - if not hasattr(req.accept_mimetypes, "best"): # pragma: no cover +from .babel import FsDomain +from .decorators import ( + default_reauthn_handler, + default_unauthn_handler, + default_unauthz_handler, +) +from .forms import ( + ChangePasswordForm, + ConfirmRegisterForm, + ForgotPasswordForm, + LoginForm, + PasswordlessLoginForm, + RegisterForm, + RegisterFormMixin, ## ... source file continues with no further JSONEncoder examples... diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index ea045cad1..035721414 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -356,7 +356,7 @@ class UnbanUser(MethodView): data.append( { "id": user.id, - "type": "unban", + "type": "ban", "reverse": "ban", "reverse_name": _("Ban"), "reverse_url": url_for("management.ban_user", @@ -674,11 +674,15 @@ in Python scripts created by a developer. import os import uuid from importlib.util import module_from_spec, spec_from_file_location +from itertools import groupby +from operator import itemgetter import orjson from bs4 import BeautifulSoup +from bs4.element import Tag from bs4.formatter import HTMLFormatter -~~from flask import render_template, current_app, jsonify +~~from flask import current_app, jsonify, render_template +from jinja2.exceptions import TemplateNotFound def convert_to_snake_case(s): @@ -704,16 +708,15 @@ def get_component_module(module_name): user_specified_dir = current_app.config.get("MELD_COMPONENT_DIR", None) - ## ... source file abbreviated to get to jsonify examples ... - def render(self, component_name: str): - return self._view(component_name) - def _render_template(self, template_name: str, context_variables: dict): - return render_template(template_name, **context_variables) + try: + return render_template(template_name, **context_variables) + except TemplateNotFound: + return render_template(f"meld/{template_name}", **context_variables) def _view(self, component_name: str): data = self._attributes() @@ -724,7 +727,7 @@ def get_component_module(module_name): context_variables.update({"form": self._form}) rendered_template = self._render_template( - f"meld/{component_name}.html", context_variables + f"{component_name}.html", context_variables ) soup = BeautifulSoup(rendered_template, features="html.parser") @@ -755,9 +758,9 @@ def get_component_module(module_name): ) for model_attr in model_attrs: - element.attrs["value"] = context_variables[element.attrs[model_attr]] - - @staticmethod + value = context_variables[element.attrs[model_attr]] + element.attrs["value"] = value + if element.name == "select": ## ... source file continues with no further jsonify examples... @@ -1017,6 +1020,7 @@ import hashlib import sys from datetime import datetime +import sentry_sdk from authlib.oauth2 import OAuth2Error ~~from flask import flash, g, has_request_context, jsonify, render_template, request, session from itsdangerous import Signer @@ -1089,7 +1093,7 @@ def _format_request_data(data, hide_passwords=False): rv = {} for key, values in data: if hide_passwords and 'password' in key: - values = [v if not v else '<{} chars hidden>'.format(len(v)) for v in values] + values = [v if not v else f'<{len(v)} chars hidden>' for v in values] rv[key] = values if len(values) != 1 else values[0] return rv diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 5208b7aed..afe01dee0 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -18,67 +18,7 @@ and SessionMixin are a couple of other callables within the `flask.sessions` package that also have code examples. -## Example 1 from FlaskBB -[FlaskBB](https://github.com/flaskbb/flaskbb) -([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based -forum web application. The web app allows users to chat in an open -message board or send private messages in plain text or -[Markdown](/markdown.html). - -FlaskBB is provided as open source -[under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). - -[**FlaskBB / flaskbb / tokens / serializer.py**](https://github.com/flaskbb/flaskbb/blob/master/flaskbb/tokens/serializer.py) - -```python -# serializer.py - -from datetime import timedelta - -~~from itsdangerous import (BadData, BadSignature, SignatureExpired, - TimedJSONWebSignatureSerializer) - -from ..core import tokens - - -_DEFAULT_EXPIRY = timedelta(hours=1) - - -class FlaskBBTokenSerializer(tokens.TokenSerializer): - - def __init__(self, secret_key, expiry=_DEFAULT_EXPIRY): - self._serializer = TimedJSONWebSignatureSerializer( - secret_key, int(expiry.total_seconds()) - ) - - def dumps(self, token): - return self._serializer.dumps( - { - 'id': token.user_id, - 'op': token.operation, - } - ) - - def loads(self, raw_token): - try: - parsed = self._serializer.loads(raw_token) - except SignatureExpired: - raise tokens.TokenError.expired() -~~ except BadSignature: # pragma: no branch - raise tokens.TokenError.invalid() - except BadData: # pragma: no cover - raise tokens.TokenError.bad() - else: - return tokens.Token(user_id=parsed['id'], operation=parsed['op']) - - - -## ... source file continues with no further BadSignature examples... - -``` - - -## Example 2 from flask-base +## Example 1 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -219,7 +159,7 @@ class Role(db.Model): ``` -## Example 3 from flask-bones +## Example 2 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -319,7 +259,7 @@ def verify(token): ``` -## Example 4 from Flask-Security-Too +## Example 3 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -338,9 +278,8 @@ The Flask-Security-Too project is provided as open source under the ```python # utils.py -from typing import Dict, List +import typing as t import warnings -from datetime import timedelta from urllib.parse import parse_qsl, parse_qs, urlsplit, urlunsplit, urlencode import urllib.request import urllib.error @@ -352,6 +291,7 @@ from flask import ( flash, g, request, + render_template, session, url_for, ) @@ -364,19 +304,20 @@ from flask_principal import AnonymousIdentity, Identity, identity_changed, Need from flask_wtf import csrf from wtforms import ValidationError ~~from itsdangerous import BadSignature, SignatureExpired +from werkzeug import __version__ as werkzeug_version from werkzeug.local import LocalProxy from werkzeug.datastructures import MultiDict from .quart_compat import best, get_quart_status +from .proxies import _security, _datastore, _pwd_context, _hashing_context from .signals import user_authenticated -_security = LocalProxy(lambda: current_app.extensions["security"]) +if t.TYPE_CHECKING: # pragma: no cover + from flask import Flask, Response + from .datastore import User -_datastore = LocalProxy(lambda: _security.datastore) +SB = t.Union[str, bytes] -_pwd_context = LocalProxy(lambda: _security.pwd_context) - -_hashing_context = LocalProxy(lambda: _security.hashing_context) localize_callback = LocalProxy(lambda: _security.i18n_domain.gettext) @@ -389,21 +330,20 @@ def _(translate): - ## ... source file abbreviated to get to BadSignature examples ... - if config_value("EMAIL_HTML"): - html = _security.render_template("%s/%s.html" % ctx, **context) - - subject = localize_callback(subject) - sender = _security.email_sender if isinstance(sender, LocalProxy): sender = sender._get_current_object() + if isinstance(sender, tuple) and len(sender) == 2: + sender = (str(sender[0]), str(sender[1])) + else: + sender = str(sender) + _security._mail_util.send_mail( - template, subject, recipient, str(sender), body, html, context.get("user", None) + template, subject, recipient, sender, body, html, context.get("user", None) ) @@ -432,8 +372,10 @@ def get_token_status(token, serializer, max_age=None, return_data=False): return expired, invalid, user -def check_and_get_token_status(token, serializer, within=None): - serializer = getattr(_security, serializer + "_serializer") +def check_and_get_token_status( + token: str, serializer_name: str, within: datetime.timedelta +) -> t.Tuple[bool, bool, t.Any]: + serializer = getattr(_security, serializer_name + "_serializer") max_age = within.total_seconds() data = None expired, invalid = False, False @@ -449,7 +391,7 @@ def check_and_get_token_status(token, serializer, within=None): return expired, invalid, data -def get_identity_attributes(app=None) -> List: +def get_identity_attributes(app: t.Optional["Flask"] = None) -> t.List[str]: app = app or current_app iattrs = app.config["SECURITY_USER_IDENTITY_ATTRIBUTES"] if iattrs: @@ -457,7 +399,9 @@ def get_identity_attributes(app=None) -> List: return [] -def get_identity_attribute(attr, app=None) -> Dict: +def get_identity_attribute( + attr: str, app: t.Optional["Flask"] = None +) -> t.Dict[str, t.Any]: app = app or current_app iattrs = app.config["SECURITY_USER_IDENTITY_ATTRIBUTES"] if iattrs: @@ -466,8 +410,6 @@ def get_identity_attribute(attr, app=None) -> Dict: ] if details: return details[0] - return {} - ## ... source file continues with no further BadSignature examples... diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index dcce6fb02..dc2a466c4 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -49,7 +49,10 @@ from types import MethodType from flask import url_for, request, current_app from flask import make_response as original_flask_make_response -from flask.helpers import _endpoint_from_view_func +try: + from flask.helpers import _endpoint_from_view_func +except ImportError: + from flask.scaffold import _endpoint_from_view_func ~~from flask.signals import got_request_exception from jsonschema import RefResolver @@ -63,54 +66,25 @@ from werkzeug.exceptions import ( NotAcceptable, InternalServerError, ) -from werkzeug.wrappers import BaseResponse + +from werkzeug import __version__ as werkzeug_version + +if werkzeug_version.split('.')[0] >= '2': + from werkzeug.wrappers import Response as BaseResponse +else: + from werkzeug.wrappers import BaseResponse from . import apidoc from .mask import ParseError, MaskError from .namespace import Namespace from .postman import PostmanCollectionV1 -from .resource import Resource -from .swagger import Swagger -from .utils import default_id, camel_to_dash, unpack -from .representations import output_json -from ._http import HTTPStatus - ## ... source file abbreviated to get to got_request_exception examples ... - except MethodNotAllowed as e: - valid_route_method = e.valid_methods[0] - rule, _ = adapter.match(method=valid_route_method, return_rule=True) - return self.owns_endpoint(rule.endpoint) - except NotFound: - return self.catch_all_404s - except Exception: - pass - - def _has_fr_route(self): - if self._should_use_fr_error_handler(): - return True - if not request.url_rule: - return False - return self.owns_endpoint(request.url_rule.endpoint) - - def error_router(self, original_handler, e): - if self._has_fr_route(): - try: - return self.handle_error(e) - except Exception as f: - return original_handler(f) - return original_handler(e) - - def handle_error(self, e): -~~ got_request_exception.send(current_app._get_current_object(), exception=e) - - if ( - not isinstance(e, HTTPException) and current_app.propagate_exceptions - and not isinstance(e, tuple(self.error_handlers.keys())) + and not isinstance(e, tuple(self._own_and_child_error_handlers.keys())) ): exc_type, exc_value, tb = sys.exc_info() @@ -130,6 +104,35 @@ from ._http import HTTPStatus if isinstance(e, typecheck): result = handler(e) default_data, code, headers = unpack( + result, HTTPStatus.INTERNAL_SERVER_ERROR + ) + break + else: +~~ got_request_exception.send(current_app._get_current_object(), exception=e) + + if isinstance(e, HTTPException): + code = HTTPStatus(e.code) + if include_message_in_response: + default_data = {"message": getattr(e, "description", code.phrase)} + headers = e.get_response().headers + elif self._default_error_handler: + result = self._default_error_handler(e) + default_data, code, headers = unpack( + result, HTTPStatus.INTERNAL_SERVER_ERROR + ) + else: + code = HTTPStatus.INTERNAL_SERVER_ERROR + if include_message_in_response: + default_data = { + "message": code.phrase, + } + + if include_message_in_response: + default_data["message"] = default_data.get("message", str(e)) + + data = getattr(e, "data", default_data) + fallback_mediatype = None + ## ... source file continues with no further got_request_exception examples... diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index ddddb67b9..7f74cb079 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -20,7 +20,7 @@ the `.templating` part. render_template is another callable from the `flask.templating` package with code examples. -You should read up on these subjects along with these `render_template_string` examples: +These subjects go along with the `render_template_string` code examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) @@ -75,26 +75,26 @@ def test_themes_cant_access_configpy_attributes(): ## ... source file abbreviated to get to render_template_string examples ... - r = client.get("/themes/foo/static/js/pages/main.dev.js") + except TemplateNotFound: + pass + try: + r = client.get("/themes/foo_fallback/static/js/pages/main.dev.js") except TemplateNotFound: pass destroy_ctfd(app) - class ThemeFallbackConfig(TestingConfig): - THEME_FALLBACK = True - - app = create_ctfd(config=ThemeFallbackConfig) + app = create_ctfd() with app.app_context(): - set_config("ctf_theme", "foo") + set_config("ctf_theme", "foo_fallback") assert app.config["THEME_FALLBACK"] == True with app.test_client() as client: r = client.get("/") assert r.status_code == 200 - r = client.get("/themes/foo/static/js/pages/main.dev.js") + r = client.get("/themes/foo_fallback/static/js/pages/main.dev.js") assert r.status_code == 200 destroy_ctfd(app) - os.rmdir(os.path.join(app.root_path, "themes", "foo")) + os.rmdir(os.path.join(app.root_path, "themes", "foo_fallback")) def test_theme_template_loading_by_prefix(): @@ -110,9 +110,10 @@ def test_theme_template_disallow_loading_admin_templates(): with app.app_context(): try: filename = os.path.join( - app.root_path, "themes", "foo", "admin", "malicious.html" + app.root_path, "themes", "foo_disallow", "admin", "malicious.html" ) os.makedirs(os.path.dirname(filename), exist_ok=True) + set_config("ctf_theme", "foo_disallow") with open(filename, "w") as f: f.write("malicious") @@ -120,7 +121,8 @@ def test_theme_template_disallow_loading_admin_templates(): ~~ render_template_string("{% include 'admin/malicious.html' %}") finally: shutil.rmtree( - os.path.join(app.root_path, "themes", "foo"), ignore_errors=True + os.path.join(app.root_path, "themes", "foo_disallow"), + ignore_errors=True, ) diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index ed4c35fdf..9d320fab4 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -21,7 +21,7 @@ the `.templating` part. render_template_string is another callable from the `flask.templating` package with code examples. -These subjects go along with the `render_template` code examples: +These topics are also useful while reading the `render_template` examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) @@ -167,25 +167,25 @@ def test_themes_cant_access_configpy_attributes(): ## ... source file abbreviated to get to render_template examples ... + pass + try: + r = client.get("/themes/foo_fallback/static/js/pages/main.dev.js") except TemplateNotFound: pass destroy_ctfd(app) - class ThemeFallbackConfig(TestingConfig): - THEME_FALLBACK = True - - app = create_ctfd(config=ThemeFallbackConfig) + app = create_ctfd() with app.app_context(): - set_config("ctf_theme", "foo") + set_config("ctf_theme", "foo_fallback") assert app.config["THEME_FALLBACK"] == True with app.test_client() as client: r = client.get("/") assert r.status_code == 200 - r = client.get("/themes/foo/static/js/pages/main.dev.js") + r = client.get("/themes/foo_fallback/static/js/pages/main.dev.js") assert r.status_code == 200 destroy_ctfd(app) - os.rmdir(os.path.join(app.root_path, "themes", "foo")) + os.rmdir(os.path.join(app.root_path, "themes", "foo_fallback")) def test_theme_template_loading_by_prefix(): @@ -201,9 +201,10 @@ def test_theme_template_disallow_loading_admin_templates(): with app.app_context(): try: filename = os.path.join( - app.root_path, "themes", "foo", "admin", "malicious.html" + app.root_path, "themes", "foo_disallow", "admin", "malicious.html" ) os.makedirs(os.path.dirname(filename), exist_ok=True) + set_config("ctf_theme", "foo_disallow") with open(filename, "w") as f: f.write("malicious") @@ -211,7 +212,8 @@ def test_theme_template_disallow_loading_admin_templates(): render_template_string("{% include 'admin/malicious.html' %}") finally: shutil.rmtree( - os.path.join(app.root_path, "themes", "foo"), ignore_errors=True + os.path.join(app.root_path, "themes", "foo_disallow"), + ignore_errors=True, ) @@ -869,11 +871,15 @@ in Python scripts created by a developer. import os import uuid from importlib.util import module_from_spec, spec_from_file_location +from itertools import groupby +from operator import itemgetter import orjson from bs4 import BeautifulSoup +from bs4.element import Tag from bs4.formatter import HTMLFormatter -~~from flask import render_template, current_app, jsonify +~~from flask import current_app, jsonify, render_template +from jinja2.exceptions import TemplateNotFound def convert_to_snake_case(s): @@ -899,11 +905,9 @@ def get_component_module(module_name): user_specified_dir = current_app.config.get("MELD_COMPONENT_DIR", None) - ## ... source file abbreviated to get to render_template examples ... - func for func in dir(self) if callable(getattr(self, func)) and not func.startswith("_") @@ -928,7 +932,10 @@ def get_component_module(module_name): return self._view(component_name) def _render_template(self, template_name: str, context_variables: dict): -~~ return render_template(template_name, **context_variables) + try: +~~ return render_template(template_name, **context_variables) + except TemplateNotFound: +~~ return render_template(f"meld/{template_name}", **context_variables) def _view(self, component_name: str): data = self._attributes() @@ -939,7 +946,7 @@ def get_component_module(module_name): context_variables.update({"form": self._form}) rendered_template = self._render_template( - f"meld/{component_name}.html", context_variables + f"{component_name}.html", context_variables ) soup = BeautifulSoup(rendered_template, features="html.parser") @@ -1218,114 +1225,7 @@ def paySuccess(): ``` -## Example 13 from Flask-Security-Too -[Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) -([PyPi page](https://pypi.org/project/Flask-Security-Too/) and -[project documentation](https://flask-security-too.readthedocs.io/en/stable/)) -is a maintained fork of the original -[Flask-Security](https://github.com/mattupstate/flask-security) project that -makes it easier to add common security features to [Flask](/flask.html) -web applications. A few of the critical goals of the Flask-Security-Too -project are ensuring JavaScript client-based single-page applications (SPAs) -can work securely with Flask-based backends and that guidance by the -[OWASP](https://owasp.org/) organization is followed by default. - -The Flask-Security-Too project is provided as open source under the -[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE). - -[**Flask-Security-Too / flask_security / core.py**](https://github.com/Flask-Middleware/flask-security/blob/master/flask_security/./core.py) - -```python -# core.py - -from datetime import datetime, timedelta -import warnings - -import pkg_resources -~~from flask import _request_ctx_stack, current_app, render_template -from flask_login import AnonymousUserMixin, LoginManager -from flask_login import UserMixin as BaseUserMixin -from flask_login import current_user -from flask_principal import Identity, Principal, RoleNeed, UserNeed, identity_loaded -from itsdangerous import URLSafeTimedSerializer -from passlib.context import CryptContext -from werkzeug.datastructures import ImmutableList -from werkzeug.local import LocalProxy - -from .babel import get_i18n_domain, have_babel -from .decorators import ( - default_reauthn_handler, - default_unauthn_handler, - default_unauthz_handler, -) -from .forms import ( - ChangePasswordForm, - ConfirmRegisterForm, - ForgotPasswordForm, - LoginForm, - PasswordlessLoginForm, - RegisterForm, - ResetPasswordForm, - SendConfirmationForm, - - -## ... source file abbreviated to get to render_template examples ... - - - sms_service = cv("SMS_SERVICE", app=app) - if sms_service == "Twilio": # pragma: no cover - self._check_modules("twilio", "SMS") - if state.phone_util_cls == PhoneUtil: - self._check_modules("phonenumbers", "SMS") - - secrets = cv("TOTP_SECRETS", app=app) - issuer = cv("TOTP_ISSUER", app=app) - if not secrets or not issuer: - raise ValueError("Both TOTP_SECRETS and TOTP_ISSUER must be set") - state.totp_factory(state.totp_cls(secrets, issuer)) - - if cv("PASSWORD_COMPLEXITY_CHECKER", app=app) == "zxcvbn": - self._check_modules("zxcvbn", "PASSWORD_COMPLEXITY_CHECKER") - return state - - def _check_modules(self, module, config_name): # pragma: no cover - from importlib.util import find_spec - - module_exists = find_spec(module) - if not module_exists: - raise ValueError(f"{module} is required for {config_name}") - - return module_exists - -~~ def render_template(self, *args, **kwargs): -~~ return render_template(*args, **kwargs) - - def render_json(self, cb): - self._state._render_json = cb - - def want_json(self, fn): - self._state._want_json = fn - - def unauthz_handler(self, cb): - self._state._unauthz_handler = cb - - def unauthn_handler(self, cb): - self._state._unauthn_handler = cb - - def reauthn_handler(self, cb): - self._state._reauthn_handler = cb - - def __getattr__(self, name): - return getattr(self._state, name, None) - - - -## ... source file continues with no further render_template examples... - -``` - - -## Example 14 from Flask-SocketIO +## Example 13 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -1401,7 +1301,7 @@ def get_session(): ``` -## Example 15 from Flask-User +## Example 14 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1493,7 +1393,7 @@ class EmailManager(object): ``` -## Example 16 from Flasky +## Example 15 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1533,7 +1433,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 17 from Datadog Flask Example App +## Example 16 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1635,7 +1535,7 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 18 from indico +## Example 17 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1663,7 +1563,7 @@ class MathjaxMixin: ``` -## Example 19 from keras-flask-deploy-webapp +## Example 18 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1755,7 +1655,7 @@ if __name__ == '__main__': ``` -## Example 20 from newspie +## Example 19 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1771,6 +1671,7 @@ import configparser import json import logging import os +from typing import Union import requests import requests_cache @@ -1796,15 +1697,16 @@ requests_cache.install_cache(cache_name='news_cache', expire_after=300) APP = Flask(__name__) +SESSION = requests.Session() +SESSION.headers.update({'Authorization': API_KEY}) -@APP.route('/', methods=['GET', 'POST']) -def root(): ## ... source file abbreviated to get to render_template examples ... + return redirect(url_for('category', category='general', page=1)) @APP.route('/category/', methods=['GET', 'POST']) @@ -1819,14 +1721,13 @@ def category(category): country = get_cookie('country') if country is not None: params.update({'country': country}) - response = requests.get(TOP_HEADLINES, - params=params, - headers={'Authorization': API_KEY}) + response = SESSION.get(TOP_HEADLINES, params=params) if response.status_code == 200: pages = count_pages(response.json()) if page > pages: page = pages - return redirect(url_for('category', category=category, page=page)) + return redirect( + url_for('category', category=category, page=page)) articles = parse_articles(response.json()) return render(articles, page, pages, country, category) elif response.status_code == 401: @@ -1835,7 +1736,7 @@ def category(category): @APP.route('/search/', methods=['GET', 'POST']) -def search(query): +def search(query: str): page = request.args.get('page', default=1, type=int) if page < 1: return redirect(url_for('search', query=query, page=1)) @@ -1847,19 +1748,20 @@ def search(query): } if request.method == 'POST': return do_post(page, category='search', current_query=query) - response = requests.get(EVERYTHING, - params=params, - headers={'Authorization': API_KEY}) + response = SESSION.get(EVERYTHING, params=params) pages = count_pages(response.json()) if page > pages: page = pages return redirect(url_for('search', query=query, page=page)) articles = parse_articles(response.json()) + return render(articles, + page, ## ... source file abbreviated to get to render_template examples ... + parsed_articles = [] if response.get('status') == 'ok': for article in response.get('articles'): parsed_articles.append({ @@ -1876,11 +1778,10 @@ def search(query): return parsed_articles -def count_pages(response): - pages = 0 +def count_pages(response: dict) -> int: if response.get('status') == 'ok': - pages = (-(-response.get('totalResults', 0) // PAGE_SIZE)) - return pages + return (-(-response.get('totalResults', 0) // PAGE_SIZE)) + return 0 def render(articles, page, pages, country, category): @@ -1895,9 +1796,8 @@ def render(articles, page, pages, country, category): pages=pages) -def get_cookie(key): - cookie_value = request.cookies.get(key) - return cookie_value +def get_cookie(key: str) -> Union[str, None]: + return request.cookies.get(key) if __name__ == '__main__': @@ -1910,7 +1810,7 @@ if __name__ == '__main__': ``` -## Example 21 from Science Flask +## Example 20 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -2198,7 +2098,7 @@ def static_from_root(): ``` -## Example 22 from tedivms-flask +## Example 21 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -2301,7 +2201,7 @@ def init_error_handlers(app): ``` -## Example 23 from trape +## Example 22 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data @@ -2319,6 +2219,7 @@ import os ~~from flask import Flask, render_template, session, request, json, redirect, url_for, send_from_directory from flask_cors import CORS from trape import Trape +import urllib from core.db import Database trape = Trape(1) @@ -2342,7 +2243,6 @@ def index(): return trape.injectCSS_Paths(render_template("/login.html").replace('[LOGIN_SRC]', trape.JSFiles[2]['src']).replace('[LIBS_SRC]', trape.JSFiles[1]['src'])) - ## ... source file abbreviated to get to render_template examples ... diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 00e7805b0..c0e34c8e9 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -19,7 +19,7 @@ and http_method_funcs are a couple of other callables within the `flask.views` package that also have code examples. -These topics are also useful while reading the `MethodView` examples: +You should read up on these subjects along with these `MethodView` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) @@ -430,7 +430,12 @@ from __future__ import unicode_literals from flask import request ~~from flask.views import MethodView -from werkzeug.wrappers import BaseResponse +from werkzeug import __version__ as werkzeug_version + +if werkzeug_version.split('.')[0] >= '2': + from werkzeug.wrappers import Response as BaseResponse +else: + from werkzeug.wrappers import BaseResponse from .model import ModelBase From 82c8ed4d879050060ce164a19151b36dd543dc83 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 21 Sep 2021 06:39:30 -0400 Subject: [PATCH 295/302] update heroku resources --- .../pages/05-deployment/10-heroku.markdown | 9 ++++++++- .../pages/10-working/18-developer-demos.md | 19 ++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/content/pages/05-deployment/10-heroku.markdown b/content/pages/05-deployment/10-heroku.markdown index 63aad7441..06c1d7bcb 100644 --- a/content/pages/05-deployment/10-heroku.markdown +++ b/content/pages/05-deployment/10-heroku.markdown @@ -21,7 +21,14 @@ easily [deploy](/deployment.html) Python applications. [MySQL](/mysql.html) to [PostgreSQL](/postgresql.html) if necessary as well as how to properly handle your settings files. -* Heroku's +* [How to deploy Django project to Heroku using Docker](https://www.accordbox.com/blog/deploy-django-project-heroku-using-docker/) + explains that although [Buildpacks](https://devcenter.heroku.com/articles/buildpacks) + are the most common way to deploy to Heroku, packaing your app in a + [Docker](/docker.html) container is also a viable approach. It walks through + the steps needed to deploy a [Django](/django.html) app in the remainder + of the article. + +* Heroku's [official Python documentation](https://devcenter.heroku.com/articles/getting-started-with-python) is fantastic and walks through deploying WSGI applications in short order. diff --git a/content/pages/10-working/18-developer-demos.md b/content/pages/10-working/18-developer-demos.md index aa82c988c..a195edfdc 100644 --- a/content/pages/10-working/18-developer-demos.md +++ b/content/pages/10-working/18-developer-demos.md @@ -9,18 +9,19 @@ meta: How to give technical demos to software developers. Creating and executing an appealing technical demo to an audience of software developers is a ton of work, but there is no better way to get people -legitimately interested in your product if you land a great demo. The -inherent difficulty involved in exceptional technical demos also creates -a large moat that prevent others from easily copying the work you put into -the demo. +legitimately interested in your product if you land a great demo with +an appropriate audience. The inherent difficulty involved in exceptional +technical demos also creates a large barrier that prevent others from simply +copying your work, which can happen with technical blog content. -The most important parts to a standout technical demo are: +To achieve a standout technical demo you must: -1. show how to solve a difficult technical problem, as easily as possible -1. take the audience on a story arc -1. do it live (especially if you include code) -1. rehearse constantly, both happy path and recovering from errors +1. show how to easily solve a difficult technical problem 1. speak plainly but accurately +1. do it live, including writing code if required +1. tell a story with a narrative arc +1. rehearse constantly, both the happy path and recovering from errors + Examples: * [Twilio Phone Calls Demo at NY Tech Meetup (2010)](https://www.youtube.com/watch?v=-VuXIgp9S7o) From 145033d8b5b4b2c38b0d90f626fff846c355a57b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 26 Sep 2021 08:39:14 -0400 Subject: [PATCH 296/302] remove walled garden learning programming resource --- .../pages/01-introduction/01-learning-programming.markdown | 5 ----- content/pages/meta/00-change-log.markdown | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/content/pages/01-introduction/01-learning-programming.markdown b/content/pages/01-introduction/01-learning-programming.markdown index 83a5ac56c..08f676d8e 100644 --- a/content/pages/01-introduction/01-learning-programming.markdown +++ b/content/pages/01-introduction/01-learning-programming.markdown @@ -140,11 +140,6 @@ give example paths you can think about taking as a beginner: including persistence, respecting others and considering ideas that are outside your comfort zone. -* [Mastering programming](https://www.facebook.com/notes/kent-beck/mastering-programming/1184427814923414) - by [Kent Beck](https://en.wikipedia.org/wiki/Kent_Beck) contains - patterns and observations for how experienced programmers he has worked - with in the past became great software developers. - * [This Picture Will Change the Way You Learn to Code](https://dev.to/nextdotxyz/this-picture-will-change-the-way-you-learn-tocode-4kmh) covers a well done graphics of many up-to-date concepts and tools that developers use. The post reminds you that you will not and should not learn diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 4e19b4cb0..edff17e51 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2021 +### September +* Clean up continues across the site to remove link rot and replace + out-of-date links with newer ones where necessary. + ### August * New blog post on [Application Performance Monitoring AWS Lambda Functions with Sentry](/blog/application-performance-monitoring-aws-lambda-functions-sentry.html). From 8bc5b24208bb66ec6213c1156de0109826f703c1 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 5 Oct 2021 11:52:33 -0400 Subject: [PATCH 297/302] remove plausible for now --- theme/templates/base.html | 1 - 1 file changed, 1 deletion(-) diff --git a/theme/templates/base.html b/theme/templates/base.html index e88241418..6c14fbb83 100644 --- a/theme/templates/base.html +++ b/theme/templates/base.html @@ -7,7 +7,6 @@ {% block meta_header %}{% endblock %} {% block title %}{% endblock %}Full Stack Python {% block css %}{% endblock %} - {% block banner %}{% endblock %} From 440d71643623afd875b5e5da5eef9f1c2cf5afcd Mon Sep 17 00:00:00 2001 From: mw-orcl <54512672+mw-orcl@users.noreply.github.com> Date: Sat, 5 Feb 2022 13:43:56 -0800 Subject: [PATCH 298/302] Created Oracle content Contains Oracle database content for Python developers --- content/pages/03-data/25-oracle.markdown | 160 +++++++++++++++++++++ static/img/logos/oracle.jpg | Bin 0 -> 39157 bytes static/img/visuals/cx-oracle.jpg | Bin 0 -> 62352 bytes static/img/visuals/oracle-orm-examples.jpg | Bin 0 -> 73616 bytes 4 files changed, 160 insertions(+) create mode 100644 content/pages/03-data/25-oracle.markdown create mode 100644 static/img/logos/oracle.jpg create mode 100644 static/img/visuals/cx-oracle.jpg create mode 100644 static/img/visuals/oracle-orm-examples.jpg diff --git a/content/pages/03-data/25-oracle.markdown b/content/pages/03-data/25-oracle.markdown new file mode 100644 index 000000000..98de1a59d --- /dev/null +++ b/content/pages/03-data/25-oracle.markdown @@ -0,0 +1,160 @@ +title: Oracle +category: page +slug: Oracle +sortorder: 0325 +toc: False +sidebartitle: Oracle +meta: Oracle Database is the market-leading database for mission-critical enterprise applications. + + +[Oracle](http://www.oracle.com/) Database is the market-leading database for mission-critical enterprise applications. It can run transaction processing, data warehousing, and multi-model database workloads such as machine learning, spatial, and graph. Recently, Oracle Database added support for JSON and blockchain use cases. The Oracle Database fully supports on-premises, cloud, and hybrid cloud deployments. + +Oracle logo. + + +## How does Oracle fit with Python? +The Python community and Oracle have a long history. The excellent Python Database API-compliant "cx_Oracle" interface for Oracle Database was first created by the user community in 1998 and is now being enhanced and maintained by Oracle. The [cx_Oracle](https://oracle.github.io/python-cx_Oracle/) module also underpins the [Oracle Machine Learning for Python](https://www.youtube.com/watch?v=P861m__PEMQ) engine. Oracle's high-performance GraalVM framework supports an implementation of Python called [GraalPython](https://github.com/oracle/graalpython). + + +## Why is Oracle Database a great choice? +Oracle Database is cross-platform, supporting multiple hardware platforms and various operating systems. Developers and companies of all sizes rely on its proven industry-leading performance, scalability, reliability, and security. +As data volumes rise exponentially, new data types and data models are required to support modern applications. Oracle Database supports the following data types at no extra cost: + +* [JSON](https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/index.html) +* [Blockchain](https://docs.oracle.com/en/database/oracle/oracle-database/21/nfcon/details-oracle-blockchain-table-282449857.html) +* [XML](https://www.oracle.com/database/technologies/appdev/xmldb.html) +* [Object](https://docs.oracle.com/database/121/ADOBJ/adobjint.htm#ADOBJ00101) +* [Graph](https://www.oracle.com/database/graph/) +* [Spatial](https://www.oracle.com/database/spatial/) +* [Time Series](https://docs.oracle.com/en/database/oracle/oracle-database/19/dmcon/time-series.html) +* Relational + +With support for scale-out database clusters, sharded distributed systems, and disaster recovery with continuous application availability, there is no shortage of features to guarantee the Database continues to run uninterrupted 24/7. + +Oracle makes its enterprise-class database readily available to developers with its free on-premises edition Oracle Database XE or on the Oracle public cloud with an Always Free Cloud account. In addition, Oracle Autonomous Database is a popular choice for developers as no database management or tuning is required, leaving developers to do what they do best – writing code for their applications. + + +## Connecting to Oracle Database with Python +As with any database, applications require a connector or driver to connect to the Oracle Database. The Python DB API-compliant [cx_Oracle](https://github.com/oracle/python-cx_Oracle) interface provides developers access to standard and advanced Oracle Database features, such as SQL execution and document storage APIs. It also gives users access to network traffic encryption capabilities and Oracle's leading high availability features. + +[Code examples](https://oracle.github.io/python-cx_Oracle/samples/tutorial/Python-and-Oracle-Database-Scripting-for-the-Future.html) and free workshops such as the introductory [Python and Oracle for Developers Workshop](https://apexapps.oracle.com/pls/apex/dbpm/r/livelabs/view-workshop?wid=766) and a full-stack development workshop using [Python with SQLAlchemy to Oracle Database](https://apexapps.oracle.com/pls/apex/dbpm/r/livelabs/view-workshop?wid=911&clear=180&session=16650643444916) are available. + +cx Oracle driver. + +You can use many Python frameworks and [object-relational mappers (ORMs)](/object-relational-mappers-orms.html) with Oracle Database. ORMs abstract the tables and objects in a relational database to objects that Python developers can manipulate and operate on. [SQLAlchemy](/sqlalchemy.html) and Django are popular ORMs. SQLAlchemy is used by Pandas, which is very popular with Oracle users. +The table below shows the relationship between web framework, ORM, driver, and the Oracle Database. + +Examples of how varying Python ORMs can work with Oracle and the cx Oracle connector. + +Learn more about +[Python ORMs on that dedicated topic page](/object-relational-mappers-orms.html). + +ORMs provide a familiar programming model for Python developers, but sometimes you want that extra performance and operate closer to SQL objects. Oracle cx_Oracle offers several [functions](https://oracle.github.io/python-cx_Oracle/samples/tutorial/Python-and-Oracle-Database-Scripting-for-the-Future.html#binding) to deliver that performance. These functions include fetching data, binding data, executing PL/SQL, operating on LOBs, JSON documents, message passing with Oracle Advanced Queuing, and more. + + +## Oracle and Data Safety +According to Gartner, Oracle has one of the [highest data safety ratings](https://www.gartner.com/reviews/market/cloud-database-management-systems/vendor/oracle/product/oracle-database) in the industry, with a wide range of features for data protection and high availability. These features include: + +* [Database encryption](https://www.oracle.com/database/technologies/security/advanced-security.html) + +* [Access control to rows](https://www.oracle.com/database/technologies/security/label-security.html) in a table + +* [Database vault](https://www.oracle.com/database/technologies/security/db-vault.html) to restrict privileges and access + +* [Data redaction, subsetting, and masking](https://www.oracle.com/database/technologies/security/data-masking-subsetting.html) + +* All in one data security service in the Oracle Cloud with [Data Safe](https://www.oracle.com/database/technologies/security/data-safe.html) + +* Oracle also provides free tools such as the [Database Assessment Tool (DBSAT)](https://www.oracle.com/database/technologies/security/dbsat.html) to help you identify and remedy potential vulnerabilities. + +Oracle also provides numerous data recovery features, including: + +* Backup capabilities with [RMAN](https://www.oracle.com/database/technologies/high-availability/rman.html) + +* Restore point features with [Database Flashback](https://www.oracle.com/database/technologies/high-availability/flashback.html) + +* [Application continuity](https://www.oracle.com/database/technologies/high-availability/app-continuity.html) in the event of database failover to a standby + +For an overview of Oracle’s security and high availability architecture, see the following white papers: + +* [Maximum Availability Architecture](https://www.oracle.com/a/tech/docs/maa-onpremises-overview.pdf) (MAA) + +* [Maximum Security Architecture](https://blogs.oracle.com/cloudsecurity/post/oracles-maximum-security-architecture-for-database-security) (MSA) + + +## Python Specific Oracle Database resources +Many quick starts, tutorials, and workshops exist specifically for Python developers using Oracle Database. Below are some of the best ones to start with. + + +###Getting Started +If you are looking for a fast way to get started with Python and Oracle Database, check out these two quick start tutorials. These tutorials walk you through installing and setting up the environment you need to connect Python to Oracle Database. + +* [Quick Start: Developing Python Applications for Oracle Database](https://www.oracle.com/database/technologies/appdev/python/quickstartpythononprem.html) + +* [Quick Start: Developing Python Applications for Oracle Autonomous Database](https://www.oracle.com/database/technologies/appdev/python/quickstartpythononprem.html) + +Once you have done one of these, then continue with the popular [Python and Oracle Database Tutorial: Scripting for the Future](https://oracle.github.io/python-cx_Oracle/samples/tutorial/Python-and-Oracle-Database-Scripting-for-the-Future.html) to dive deeper to master the Python cx_Oracle interface and see how to build great Oracle Database applications. + + +###Using Different Frameworks with Oracle +* [How to Run SQL Queries with Pandas](https://www.oracle.com/news/connect/run-sql-data-queries-with-pandas.html) is a good blog using Pandas for quick and easy data manipulation in Python. + +* [Using Oracle with Pandas in OCI Data Science Notebooks](https://docs.oracle.com/en-us/iaas/tools/ads-sdk/latest/user_guide/loading_data/efficient_use_of_oracle_rdbms_with_ads.html) dives deeper into using Pandas with large datasets in data science applications. + +* [Using SQLAlchemy with Oracle Database](https://docs.sqlalchemy.org/en/14/dialects/oracle.html) provides an excellent toolkit for Python developers using SQLAlchemy as their ORM. + +* [Using Django with Python and Oracle Database](https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/oow10/python_django/python_django.htm) is a tutorial from Oracle and shows the Django Framework with Python to an Oracle Database. + +* [Connecting Pony ORM to the Database](https://docs.ponyorm.org/database.html) is a friendly guide on using Pony with databases. + +* [How to use Python Flask with Oracle Database](https://blogs.oracle.com/opal/post/how-to-use-python-flask-with-oracle-database). + +* [Part 1: Docker for Oracle Database Applications in Node.js and Python](https://blogs.oracle.com/opal/post/part-1-docker-for-oracle-database-applications-in-nodejs-and-python). + +* [Part 2: Docker for Oracle Database Applications in Node.js and Python](https://blogs.oracle.com/opal/post/part-2-docker-for-oracle-database-applications-in-nodejs-and-python). + +* [Faster JSON with Python cx_Oracle and Oracle Database 21’s new OSON storage format](https://blogs.oracle.com/opal/post/faster-json-with-python-cx_oracle-81-and-oracle-database-21s-new-oson-storage-format). + + +###Workshops +The following hands-on, free workshops provide step-by-step instructions and walkthroughs in a live environment. + +* [Use Python with Oracle Database 19c](https://apexapps.oracle.com/pls/apex/dbpm/r/livelabs/view-workshop?wid=635&clear=180&session=3484600041895) is an Oracle LiveLabs workshop that shows how to write Python code to connect to and read data from an Oracle Database, including JSON data. + +* [Python and Oracle for Developers](https://apexapps.oracle.com/pls/apex/dbpm/r/livelabs/workshop-attendee-2?p210_workshop_id=766&p210_type=2&session=3484600041895) is an Oracle LiveLabs workshop that explores the features of the Python cx_Oracle interface for Oracle Database, including efficient techniques for connection management and statement handling. + +* [Full Stack Development using Python and deployment via OKE](https://apexapps.oracle.com/pls/apex/dbpm/r/livelabs/view-workshop?wid=911&clear=180&session=3484600041895) is an Oracle LiveLabs workshop that explores how to build and deploy a simple cloud-native application using the most common frameworks and the Oracle Cloud Infrastructure services. + + +## Cloud Development with Oracle Database +The following resources are good starting points for those looking to build applications in the Oracle Cloud and deploy applications in Docker containers and Kubernetes. + +* [The Complete Guide To Getting Up And Running With Docker And Kubernetes On The Oracle Cloud](https://blogs.oracle.com/developers/post/the-complete-guide-to-getting-up-and-running-with-docker-and-kubernetes-on-the-oracle-cloud). + +* [Oracle Cloud Blog](https://www.oc-blog.com/) has lots of interesting information on different aspects of Oracle Cloud. + +For developers looking to focus on application development in the Oracle Cloud and not have to worry about managing the Oracle Database, the Autonomous Database is a good choice. All management, including patching and upgrades, scalability, and security, are entirely autonomous. The following resources offer you a glimpse of its capabilities. + +* [Julien Dontcheff’s Database Blog](https://juliandontcheff.wordpress.com/category/autonomous/) is a good collection of technical posts with the Autonomous Database. + +* [SQL Maria](https://sqlmaria.com/category/autonomous-database/) also has some excellent posts on all things Oracle Database including Autonomous. + +* [An Introduction to Autonomous Database](https://questoraclecommunity.org/learn/blogs/oracles-autonomous-database-an-introduction/) gives you a good overview. + +* [Autonomous Database for researchers](https://blogs.oracle.com/research/post/a-roadmap-of-oracle-autonomous-database-benefits-for-research) is a good blog with details on some autonomous features. + + +##General Oracle Database Resources +Here are some Oracle tutorials and resources not specific to Python that can help you take advantage of the Oracle Database features. + +* [Oracle Technical Architecture](https://www.oracle.com/webfolder/technetwork/tutorials/architecture-diagrams/18/technical-architecture/database-technical-architecture.html) is from Oracle and has nice visuals and short paragraphs on the architecture of the Oracle Database. + +* [Oracle Database Internals](https://databaseinternalmechanism.com/oracle-database-internals/) is an excellent post explaining the architecture of the Oracle Database. + +* This [Oracle Performance Tuning](https://blog.quest.com/oracle-performance-tuning-a-5-step-approach-to-optimized-performance/) blog has a 5-step approach to tuning Oracle. + +* [Oracle RAC](https://databaseinternalmechanism.com/oracle-rac/) is another good post on the concepts of RAC, Oracle’s Real Application Cluster software for database high availability. + +* The [Oracle Database Security](https://www.oracle.com/database/technologies/security.html) web page has lots of information on Oracle’s solutions for security called “defense in depth.” + +* This is a good post on the [Top 5 Reasons to choose Oracle](https://www.dbta.com/Editorial/News-Flashes/Top-5-Reasons-to-Use-an-Oracle-Database-144191.aspx) for a production database. diff --git a/static/img/logos/oracle.jpg b/static/img/logos/oracle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e8fec3612a95c9ff3c7d631d26d8d0630c06e11 GIT binary patch literal 39157 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 Jfa7QX{{TjsR?+|f literal 0 HcmV?d00001 diff --git a/static/img/visuals/cx-oracle.jpg b/static/img/visuals/cx-oracle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..878e7d285331f1e3781b813ca0a5e3b16cfe7f36 GIT binary patch literal 62352 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 literal 0 HcmV?d00001 diff --git a/static/img/visuals/oracle-orm-examples.jpg b/static/img/visuals/oracle-orm-examples.jpg new file mode 100644 index 0000000000000000000000000000000000000000..adae67764f39c1407bd8efa708c679a5c7f1921a GIT binary patch literal 73616 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℘y}P}&2cR;$*Trhjp<@T2r&QZ!c)7xS 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 Nf&U-h52nA<{|&aY|B?Uz literal 0 HcmV?d00001 From df0c15caa84ab072cb0eaebb6bd3b8f326b27424 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 20 Feb 2022 09:03:55 -0500 Subject: [PATCH 299/302] tweaking site layout to make it faster --- content/pages/meta/00-change-log.markdown | 9 +++++++++ static/img/logos/cloudflare.png | Bin 0 -> 20499 bytes theme/templates/base.html | 2 +- theme/templates/css/base.css | 2 +- theme/templates/index-sidebar.html | 1 - theme/templates/index.html | 7 +++---- theme/templates/nav.html | 2 +- theme/templates/subnav.html | 2 -- 8 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 static/img/logos/cloudflare.png diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index edff17e51..04dcae5a6 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -13,7 +13,16 @@ view commit-level changes via the [source repository's commit log](https://github.com/mattmakai/fullstackpython.com/commits/) on GitHub. +## 2022 +### February +* Still on break, but updated the header and footer. Also made some website + tweaks to make it faster. + ## 2021 +### October +* Taking a break for a few months to recharge and work on a different coding + side project that I'm excited about. Be back in a few months with some updates. + ### September * Clean up continues across the site to remove link rot and replace out-of-date links with newer ones where necessary. diff --git a/static/img/logos/cloudflare.png b/static/img/logos/cloudflare.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a18d47ed9551f225d998cc8583cc748b73756f GIT binary patch literal 20499 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

    {% block lower_banner %}{% endblock %} - + {% block bottom_banner %}{% endblock %} {% block js %}{% endblock %} diff --git a/theme/templates/css/base.css b/theme/templates/css/base.css index 06a5ef2ed..5a7ff8055 100644 --- a/theme/templates/css/base.css +++ b/theme/templates/css/base.css @@ -1 +1 @@ -{% raw %}hr,img{border:0}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:18px;background:#fefefe}body{margin:0;font:18px Georgia,serif;line-height:1.4;color:#222;padding:0}img{vertical-align:middle}hr{height:0;box-sizing:content-box;margin:21px 0;border-top:1px solid #eee}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",sans-serif;font-weight:500;line-height:1.1;color:#000}h1,h2,h3{margin:30px 0 6px}h1{font-size:40px}h2{font-size:28px}h3{font-size:22px}h4,h5,h6{margin:11px 0;font-size:18px}p{margin:0 0 12px}ol,ul{margin:0 0 10px}code,pre{font:"Courier New",monospace;border-radius:4px;background-color:#f4f9ff;font-size:12px}code{padding:2px 4px;white-space:nowrap}pre{overflow:scroll;white-space:pre;display:block;padding:10px;margin:0 0 11px;line-height:1.4;word-break:break-all;word-wrap:break-word;border:1px solid #ccc}.cn{padding:0 15px 0 15px;margin-right:auto;margin-left:auto}.cn:before,.cn:after{display:table;content:" "}.cn:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.c2,.c3,.c4,.c5,.c6,.c7,.c8,.c9,.c10,.c11,.c12{position:relative;min-height:1px;padding:0 15px 0 15px}a{background:transparent;text-decoration:none;border-bottom:1px dotted;color:#444}a:hover{text-decoration:none;color:#000}.ft{padding:0 0 24px;float:right}.sns{font-family:"Helvetica Neue",sans-serif}.sps{font-size:14px}.hd{margin:20px 0 15px 0}.hd>a{border-bottom:none}img.hdr{vertical-align:middle;border:none;height:52px;width:52px;padding:1px}.hdt a,.hdt a:hover{font:72px "Helvetica Neue",sans-serif;font-weight:normal;letter-spacing:.03em;vertical-align:middle;margin-left:5px;color:#000;text-decoration:none;border-bottom:none;line-height:.9em}.bk{margin:0 5px 0 5px}img.nob{border:none}p.banner{font-weight:500;line-height:1.1;color:#fff;font-size:22px;margin:14px 0 18px 0}.bp{line-height:1.3em}{% endraw %} +{% raw %}hr,img{border:0}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:18px;background:#fefefe}body{margin:0;font:18px Georgia,serif;line-height:1.4;color:#222;padding:0}img{vertical-align:middle}hr{height:0;box-sizing:content-box;margin:21px 0;border-top:1px solid #eee}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",sans-serif;font-weight:500;line-height:1.1;color:#000}h1,h2,h3{margin:30px 0 6px}h1{font-size:40px}h2{font-size:28px}h3{font-size:22px}h4,h5,h6{margin:11px 0;font-size:18px}p{margin:0 0 12px}ol,ul{margin:0 0 10px}code,pre{font:"Courier New",monospace;border-radius:4px;background-color:#f4f9ff;font-size:12px}code{padding:2px 4px;white-space:nowrap}pre{overflow:scroll;white-space:pre;display:block;padding:10px;margin:0 0 11px;line-height:1.4;word-break:break-all;word-wrap:break-word;border:1px solid #ccc}.cn{padding:0 15px 0 15px;margin-right:auto;margin-left:auto}.cn:before,.cn:after{display:table;content:" "}.cn:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.c2,.c3,.c4,.c5,.c6,.c7,.c8,.c9,.c10,.c11,.c12{position:relative;min-height:1px;padding:0 15px 0 15px}a{background:transparent;text-decoration:none;border-bottom:1px dotted;color:#444}a:hover{text-decoration:none;color:#000}.ft{padding:0 0 24px;float:right}.sns{font-family:"Helvetica Neue",sans-serif}.sps{font-size:14px}.hd{margin:20px 0 15px 0}.hd>a{border-bottom:none}img.hdr{vertical-align:middle;border:none;height:52px;width:52px;padding:1px}.hdt a,.hdt a:hover{font:72px "Helvetica Neue",sans-serif;font-weight:normal;letter-spacing:.03em;vertical-align:middle;margin-left:-5px;color:#000;text-decoration:none;border-bottom:none;line-height:.9em}.bk{margin:0 5px 0 5px}img.nob{border:none}p.banner{font-weight:500;line-height:1.1;color:#fff;font-size:22px;margin:14px 0 18px 0}.bp{line-height:1.3em}{% endraw %} diff --git a/theme/templates/index-sidebar.html b/theme/templates/index-sidebar.html index ef55aa559..ccfb5ad9e 100644 --- a/theme/templates/index-sidebar.html +++ b/theme/templates/index-sidebar.html @@ -1,3 +1,2 @@
    - {% include "sponsor/assemblyai.html" %}
    diff --git a/theme/templates/index.html b/theme/templates/index.html index e021e8703..3c62f365b 100644 --- a/theme/templates/index.html +++ b/theme/templates/index.html @@ -5,15 +5,15 @@ {% endblock %} -{% block css %}{% endblock %} +{% block css %}{% endblock %} {% block banner %} {% endblock %} {% block content %}
    -
    -

    Build, Deploy and Operate Python Applications

    +
    +

    Learn to Build, Deploy and Operate Python Applications

    You're knee deep in learning Python programming. The syntax is starting to make sense. The first few ahh-ha! moments hit you as you learn to use @@ -44,7 +44,6 @@

    Build, Deploy and Operate Python Applications

    What do you need to learn first?

    - {% include "index-sidebar.html" %}
    diff --git a/theme/templates/nav.html b/theme/templates/nav.html index 529a36676..5b91021c4 100644 --- a/theme/templates/nav.html +++ b/theme/templates/nav.html @@ -1 +1 @@ -
    {% include "subnav.html" %}
    +
    {% include "subnav.html" %}
    diff --git a/theme/templates/subnav.html b/theme/templates/subnav.html index cbf4e08e9..f57d81fd8 100644 --- a/theme/templates/subnav.html +++ b/theme/templates/subnav.html @@ -1,10 +1,8 @@ From 18c5871c5708aa0f544c6e175f32960e8e9fc421 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 27 Oct 2022 09:28:16 -0400 Subject: [PATCH 300/302] removing GA, no more analytics needed. reducing page sizes --- .../15-application-dependencies.markdown | 4 ---- content/pages/03-data/25-oracle.markdown | 9 +++++++-- content/pages/meta/00-change-log.markdown | 4 ++++ static/img/fsp-fav.png | Bin 3294 -> 1622 bytes theme/templates/base.html | 1 - theme/templates/choices/oracle.html | 18 ++++++++++++++++++ theme/templates/sponsor.html | 1 - theme/templates/sponsor/assemblyai.html | 2 +- 8 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 theme/templates/choices/oracle.html diff --git a/content/pages/02-development-environments/15-application-dependencies.markdown b/content/pages/02-development-environments/15-application-dependencies.markdown index 4fe802b6a..927a3720d 100644 --- a/content/pages/02-development-environments/15-application-dependencies.markdown +++ b/content/pages/02-development-environments/15-application-dependencies.markdown @@ -158,10 +158,6 @@ so far to get up to speed on building and releasing your own packages. provides a collection of resources to understand how to package and distribute Python code libraries. -* [Alice in Python projectland](https://veekaybee.github.io/2017/09/26/python-packaging/) - is an amazing post that takes the reader from simple Python script - into a complete Python package. - * [How to Publish Your Package on PyPI](https://blog.jetbrains.com/pycharm/2017/05/how-to-publish-your-package-on-pypi/) is for developers who have created a code library they would like to share and make installable for other developers. diff --git a/content/pages/03-data/25-oracle.markdown b/content/pages/03-data/25-oracle.markdown index 98de1a59d..bf6b3cdc0 100644 --- a/content/pages/03-data/25-oracle.markdown +++ b/content/pages/03-data/25-oracle.markdown @@ -4,10 +4,15 @@ slug: Oracle sortorder: 0325 toc: False sidebartitle: Oracle -meta: Oracle Database is the market-leading database for mission-critical enterprise applications. +meta: Oracle Database is an enterprise relational database management system. -[Oracle](http://www.oracle.com/) Database is the market-leading database for mission-critical enterprise applications. It can run transaction processing, data warehousing, and multi-model database workloads such as machine learning, spatial, and graph. Recently, Oracle Database added support for JSON and blockchain use cases. The Oracle Database fully supports on-premises, cloud, and hybrid cloud deployments. +[Oracle Database](http://www.oracle.com/) is an enterprise +[relational database](/databases.html). It can run transaction processing, +data warehousing, and multi-model database workloads such as machine +learning, spatial, and graph analysis. Recent versions of Oracle Database +also added support for JSON and blockchain use cases, and the software +can be run in on-premise, cloud or hybrid environments. Oracle logo. diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 04dcae5a6..94d366108 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2022 +### March +* I decided to go so minimal that I removed the logo to make the site load + faster, and also got rid of some unncessary CSS on front page. + ### February * Still on break, but updated the header and footer. Also made some website tweaks to make it faster. diff --git a/static/img/fsp-fav.png b/static/img/fsp-fav.png index 28a9f6cdba5c76819b45a43513c1ba3ea0f50e5a..3a2f75910d6aa096361fbc946e014866a52ce4c7 100644 GIT binary patch literal 1622 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJS*a18X}-P;T0k}j0~@0d12d4t z2!srbQVgtMHUmQ#qcofy$EX2S!vs`g$N(f6M1eT1J(Gb2s=fwDgMbGR15JX^0htx4 zIk|}?`9%r=MfnQGdIoxiKslxbOmKY)3z!jXpd7=lE6<+*Db50q$YKTtZeb8+WSBKa zf`NfKCo?3XB*NFnDmgz_FEJ%QDOIl`w*aJz!KT6r$jnVGNmQuF&B-gas<2f8tFQvH zLBje<3ScEA*|tg%z5xo(`9-M;Wh+i#(Mch>H3D2mX`VkM*2oZx=P7{9 zO-#x!EwNQn0$BtH5O=0lWFlhy0lFT$5 zc7bFd+Q5MUaia~$1yLmV#{b(N&=t;0uiIl*E!mm&B4(J0k;NTp1eZ8kvU}SXvocS^>ERCRPRp z5Mxl(BAEjU5UYrw)Z+Y{QcyJ7nHw1ZfxaP#w9&_qM%Rka8Jd?_Vh0Q}uog67bX}1M zd2ALUOQUP`FUm{>CPuJZ4WYIni$T@f=!4QDQu>4>ey}Jo_1kd)g9Vn8?6|IGALs<; z=U1LCjv*1PN2fdbH9Ls3{dbRCbVl&NRLctovp0@|FfBrg&LBT6YH~vVcY5C4K zHiA8$LZ=laTbTOp(Qa=xo6LMwe3jM)&K)YwywR)MeGM(12%UHMI+bNt?xU{}IX(++ z@>{uj>MZ_QaieUHUzi%pDx=x=o?E6H(i*Wp=2_1 zgFxdAyR4nPSLUo?=Q^>4}8MXSgU&WUju|h9qxg?9<$XOaA zl)J0Np1)*Gn^_x&Tf(9bYHyMkRq-@Wj5VF8er_29gJ!{~PxkCja_V#c{88ZP1J~nc+k>1(|Pn1aBv5)b#{0s+vUsaxcV7^zn$JWVf8Ge-RDBf)N(awDFS0%re zsHWxz4p-e|@)v(@KfQqQ=YcZiETO4=4|c3PuD$PJ+XuCp?)gD|v)9Gtu1ovBPX3rS V@0#M!Z;7BX)zj6_Wt~$(6985s9~}Sy literal 3294 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 Xc}gx4>=lf^2?%X$WmIW!?ZLkROwjkG diff --git a/theme/templates/base.html b/theme/templates/base.html index a3bc041de..93e3ad132 100644 --- a/theme/templates/base.html +++ b/theme/templates/base.html @@ -19,7 +19,6 @@ {% block lower_banner %}{% endblock %} {% block bottom_banner %}{% endblock %} - {% block js %}{% endblock %} diff --git a/theme/templates/choices/oracle.html b/theme/templates/choices/oracle.html new file mode 100644 index 000000000..2ff0b969a --- /dev/null +++ b/theme/templates/choices/oracle.html @@ -0,0 +1,18 @@ +

    What's next to get your app running?

    +
    +
    +
    + {% include "choices/buttons/no-sql-datastore.html" %} +
    +
    +
    +
    + {% include "choices/buttons/cascading-style-sheets.html" %} +
    +
    +
    +
    + {% include "choices/buttons/javascript.html" %} +
    +
    +
    diff --git a/theme/templates/sponsor.html b/theme/templates/sponsor.html index 9583a8c90..bc378aee8 100644 --- a/theme/templates/sponsor.html +++ b/theme/templates/sponsor.html @@ -1,5 +1,4 @@ {% if page.sortorder[0:2] == "01" or page.sortorder[0:2] == "02" or page.sortorder[0:2] == "03" or page.sortorder[0:2] == "04" or page.sortorder[0:2] == "05" or page.sortorder[0:2] == "06" or page.sortorder[0:2] == "50" %} -{% include "sponsor/assemblyai.html" %} {% include "sponsor/carbon.html" %} {% endif %} {% if false %} diff --git a/theme/templates/sponsor/assemblyai.html b/theme/templates/sponsor/assemblyai.html index 9ce17932c..431a8c567 100644 --- a/theme/templates/sponsor/assemblyai.html +++ b/theme/templates/sponsor/assemblyai.html @@ -2,6 +2,6 @@

    Sponsored By

    AssemblyAI logo -

    The most accurate speech-to-text API. Built for Python developers.

    +

    The automatic transcription API loved by Python developers.

    From 7e61b2fb188bd550abe15e4c45ba1015fb4bc8d5 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 29 Oct 2022 17:33:06 -0400 Subject: [PATCH 301/302] removing old 404 links --- content/pages/02-development-environments/19-git.markdown | 4 ---- content/pages/03-data/01-databases.markdown | 4 ++-- content/pages/03-data/02-postgresql.markdown | 2 +- content/pages/03-data/05-object-relational-mappers.markdown | 2 +- content/pages/meta/00-change-log.markdown | 6 ++++++ .../160518-install-postgresql-python-3-ubuntu-1604.markdown | 4 ++-- content/posts/170723-monitor-flask-apps.markdown | 2 +- .../posts/200308-financial-resources-developers.markdown | 2 +- 8 files changed, 14 insertions(+), 12 deletions(-) diff --git a/content/pages/02-development-environments/19-git.markdown b/content/pages/02-development-environments/19-git.markdown index 9fdab73f2..5bffca262 100644 --- a/content/pages/02-development-environments/19-git.markdown +++ b/content/pages/02-development-environments/19-git.markdown @@ -240,10 +240,6 @@ minimize merge conflicts. why at GitHub they do not use the git-flow model and provides an alternative that solves some of the issues they found with git-flow. -* [Git Workflows That Work](http://blog.endpoint.com/2014/05/git-workflows-that-work.html) - is a helpful post with diagrams to show how teams can create a Git workflow - that will help their development process. - * [Comparing workflows](https://www.atlassian.com/git/tutorials/comparing-workflows) provides a slew of examples for how developers on a team can handle merge conflicts and other situations that commonly arise when using Git. diff --git a/content/pages/03-data/01-databases.markdown b/content/pages/03-data/01-databases.markdown index ff780eff7..bad071a2c 100644 --- a/content/pages/03-data/01-databases.markdown +++ b/content/pages/03-data/01-databases.markdown @@ -100,7 +100,7 @@ Find out about Python applications with a MySQL backed on the dedicated To work with a relational database using Python, you need to use a code library. The most common libraries for relational databases are: -* [psycopg2](http://initd.org/psycopg/) +* [psycopg](https://www.psycopg.org/) ([source code](https://github.com/psycopg/psycopg2)) for PostgreSQL. @@ -263,7 +263,7 @@ speed on SQL if you have never previously used it. 1. Install PostgreSQL on your server. Assuming you went with Ubuntu run ``sudo apt-get install postgresql``. -1. Make sure the [psycopg2](http://initd.org/psycopg/) library is in your +1. Make sure the [psycopg](https://www.psycopg.org/) library is in your application's dependencies. 1. Configure your web application to connect to the PostgreSQL instance. diff --git a/content/pages/03-data/02-postgresql.markdown b/content/pages/03-data/02-postgresql.markdown index 34284a7e9..5e700895a 100644 --- a/content/pages/03-data/02-postgresql.markdown +++ b/content/pages/03-data/02-postgresql.markdown @@ -57,7 +57,7 @@ architecture. To work with relational databases in Python you need to use a database driver, which is also referred to as a database connector. The most common driver library for working with PostgreSQL is -[psycopg2](http://initd.org/psycopg/). There is +[psycopg](https://www.psycopg.org/). There is [a list of all drivers on the PostgreSQL wiki](https://wiki.postgresql.org/wiki/Python), including several libraries that are no longer maintained. If you're working with the diff --git a/content/pages/03-data/05-object-relational-mappers.markdown b/content/pages/03-data/05-object-relational-mappers.markdown index df5ce8bb0..6451908e8 100644 --- a/content/pages/03-data/05-object-relational-mappers.markdown +++ b/content/pages/03-data/05-object-relational-mappers.markdown @@ -64,7 +64,7 @@ there was a pressing reason. Python ORM libraries are not required for accessing relational databases. In fact, the low-level access is typically provided by another library called a *database connector*, such as -[psycopg](http://initd.org/psycopg/) (for PostgreSQL) +[psycopg](https://www.psycopg.org/) (for PostgreSQL) or [MySQL-python](https://pypi.org/project/MySQL-python/1.2.5) (for MySQL). Take a look at the table below which shows how ORMs can work with different web frameworks and connectors and relational databases. diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 94d366108..bf6137a13 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,12 @@ view commit-level changes via the on GitHub. ## 2022 +### October +* Starting to get back into updating this site again! Note that I'll probably + spend most of my side project time on [Plushcap](https://www.plushcap.com/) + but I'm removing old resources and adding new good ones on here to keep the + site maintained. + ### March * I decided to go so minimal that I removed the logo to make the site load faster, and also got rid of some unncessary CSS on front page. diff --git a/content/posts/160518-install-postgresql-python-3-ubuntu-1604.markdown b/content/posts/160518-install-postgresql-python-3-ubuntu-1604.markdown index e5d4338cc..baf38465d 100644 --- a/content/posts/160518-install-postgresql-python-3-ubuntu-1604.markdown +++ b/content/posts/160518-install-postgresql-python-3-ubuntu-1604.markdown @@ -12,7 +12,7 @@ headeralt: PostgreSQL and Ubuntu logos. Copyright their respective owners. [PostgreSQL](/postgresql.html) is a powerful open source [relational database](/databases.html) frequently used to create, read, update and delete [Python web application](/web-frameworks.html) data. -[Psycopg2](http://initd.org/psycopg/) is a PostgreSQL database +[Psycopg2](https://www.psycopg.org/) is a PostgreSQL database driver that serves as a Python client for access to the PostgreSQL server. This post explains how to install PostgreSQL on [Ubuntu 16.04](/ubuntu.html) and run a few basic SQL queries within a Python program. @@ -110,7 +110,7 @@ found in the ## Installing psycopg2 Now that PostgreSQL is installed and we have a non-superuser account, we -can install the [psycopg2](http://initd.org/psycopg/) package. Let's +can install the [psycopg2](https://www.psycopg.org/) package. Let's figure out where our `python3` executable is located, create a virtualenv with `python3`, activate the virtualenv and then install the psycopg2 package with `pip`. Find your `python3` executable using the `which` command. diff --git a/content/posts/170723-monitor-flask-apps.markdown b/content/posts/170723-monitor-flask-apps.markdown index b3cd8b760..4ef02bfc6 100644 --- a/content/posts/170723-monitor-flask-apps.markdown +++ b/content/posts/170723-monitor-flask-apps.markdown @@ -165,7 +165,7 @@ The above [Jinja2](/jinja2.html) template is basic HTML without any [embedded template tags](http://jinja.pocoo.org/docs/latest/templates/). The template creates a very plain page with a header description of "PUBG so good" and a GIF from this -[excellent computer game](http://store.steampowered.com/app/578080/PLAYERUNKNOWNS_BATTLEGROUNDS/). +[excellent computer game](https://store.steampowered.com/app/578080/PUBG_BATTLEGROUNDS/). Time to run and test our code. Change into the base directory of your project where `app.py` file is located. Execute `app.py` using the `python` diff --git a/content/posts/200308-financial-resources-developers.markdown b/content/posts/200308-financial-resources-developers.markdown index fb0619334..80f2560d0 100644 --- a/content/posts/200308-financial-resources-developers.markdown +++ b/content/posts/200308-financial-resources-developers.markdown @@ -77,7 +77,7 @@ macroeconomic data trends. is well-written, straightforward and accessible, particularly because it clearly targets its software developer audience. -* [Don't Quit Your Day Job](https://dqydj.com/) uses a ton of metrics +* [Don't Quit Your Day Job](https://dqydj.com) uses a ton of metrics and statistics to ground their articles on financial topics that are often relevant specifically to software developers. For example, the article on From daa9782d1a42b282a5c4489ecdb3aad19bb9aaa8 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 14 Apr 2023 20:44:27 -0400 Subject: [PATCH 302/302] removing malicious link --- content/pages/02-development-environments/02-vim.markdown | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/pages/02-development-environments/02-vim.markdown b/content/pages/02-development-environments/02-vim.markdown index 10acf60ef..f37c04a5d 100644 --- a/content/pages/02-development-environments/02-vim.markdown +++ b/content/pages/02-development-environments/02-vim.markdown @@ -108,10 +108,6 @@ you are unfamiliar with. * [Vim and Python](https://justin.abrah.ms/vim/vim_and_python.html) shows and explains many Python-specific .vimrc options. -* [Vim as a Python IDE](http://liuchengxu.org/posts/use-vim-as-a-python-ide/) - shows a slew of plugins and configuration options for coding with Python - in Vim. - * This [repository's folder with Vimrc files](https://github.com/amix/vimrc/tree/master/vimrcs) has example configurations that are well commented and easy to learn from.

    k{&-Yj?^uqxx;+l5zvmchHLFzT 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≻?G}SI?<8OdnGoXb?(+GaS{XwcBBfW!G*^{8VDhw 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 literal 0 HcmV?d00001 diff --git a/static/img/200823-django-sentry/exception-thrown-debug-page.jpg b/static/img/200823-django-sentry/exception-thrown-debug-page.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68ba1a8889b4479a9537ca78dca5a4b242307422 GIT binary patch literal 174207 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 z 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

  • kaBeWd0##sD=UIs$^^bX!vY9{gOUGK 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�PVgYDsD2p`#$<)uG$u(RK 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�XdVI4JYq}pc?^H)*zhXzpV_;Cq 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

    diff --git a/theme/templates/sponsor.html b/theme/templates/sponsor.html index 6997c5df5..6485b9e0a 100644 --- a/theme/templates/sponsor.html +++ b/theme/templates/sponsor.html @@ -1,5 +1,5 @@ {% if page.sortorder[0:2] == "01" or page.sortorder[0:2] == "02" or page.sortorder[0:2] == "03" or page.sortorder[0:2] == "04" or page.sortorder[0:2] == "05" or page.sortorder[0:2] == "06" or page.sortorder[0:2] == "50" %} -{% include "sponsor/sentry.html" %} +{% include "sponsor/sentry-assemblyai.html" %} {% include "sponsor/carbon.html" %} {% endif %} {% if false %} diff --git a/theme/templates/sponsor/sentry-assemblyai.html b/theme/templates/sponsor/sentry-assemblyai.html new file mode 100644 index 000000000..a67cdaacf --- /dev/null +++ b/theme/templates/sponsor/sentry-assemblyai.html @@ -0,0 +1,10 @@ +
    +

    Sponsored By

    +
    + Sentry logo +

    Software errors are inevitable. Chaos is not. Try Sentry for free.

    +
    + AssemblyAI logo +

    The most accurate speech-to-text API. Built for Python developers.

    +
    +
    From 5d7dc3d106401afb2b5ee59aaec22b3c5fe83d47 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 2 Aug 2020 21:27:39 -0400 Subject: [PATCH 213/302] update changelog --- content/pages/meta/00-change-log.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 34b82c08f..0f2dfd40d 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2020 +### August +* Added new [GPT-3 page](/gpt-3.html). +* Updated [debugging](/debugging.html) page with some additional descriptions. + ### July * Updated [webhooks](/webhooks.html) page with additional resources. * New blog posts: From b2a317223dfc136447e73ce3830f76d3634a25d2 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 2 Aug 2020 21:35:08 -0400 Subject: [PATCH 214/302] replace subnav for b&v with supporters edition --- theme/templates/css/base.css | 2 +- theme/templates/subnav.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/theme/templates/css/base.css b/theme/templates/css/base.css index af6976909..a982788e7 100644 --- a/theme/templates/css/base.css +++ b/theme/templates/css/base.css @@ -1 +1 @@ -{% raw %}hr,img{border:0}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:18px;background:#fefefe}body{margin:0;font:18px Georgia,serif;line-height:1.4;color:#222;padding:0}img{vertical-align:middle}hr{height:0;box-sizing:content-box;margin:21px 0;border-top:1px solid #eee}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",sans-serif;font-weight:500;line-height:1.1;color:#000}h1,h2,h3{margin:32px 0 6px}h1{font-size:40px}h2{font-size:28px}h3{font-size:22px}h4,h5,h6{margin:11px 0;font-size:18px}p{margin:0 0 12px}ol,ul{margin:0 0 10px}code,pre{font:"Courier New",monospace;border-radius:4px;background-color:#f4f9ff;font-size:12px}code{padding:2px 4px;white-space:nowrap}pre{overflow:scroll;white-space:pre;display:block;padding:10px;margin:0 0 11px;line-height:1.4;word-break:break-all;word-wrap:break-word;border:1px solid #ccc}.cn{padding:0 15px 0 15px;margin-right:auto;margin-left:auto}.cn:before,.cn:after{display:table;content:" "}.cn:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.c2,.c3,.c4,.c5,.c6,.c7,.c8,.c9,.c10,.c11,.c12{position:relative;min-height:1px;padding:0 15px 0 15px}a{background:transparent;text-decoration:none;border-bottom:1px dotted;color:#444}a:hover{text-decoration:none;color:#000}.ft{padding:0 0 24px;float:right}.sns{font-family:"Helvetica Neue",sans-serif}.sps{font-size:14px}.hd{margin:20px 0 15px 0}.hd>a{border-bottom:none}img.hdr{vertical-align:middle;border:none;height:52px;width:52px;padding:1px}.hdt a,.hdt a:hover{font:72px "Helvetica Neue",sans-serif;font-weight:normal;letter-spacing:.03em;vertical-align:middle;margin-left:5px;color:#000;text-decoration:none;border-bottom:none;line-height:.9em}.bk{margin:0 7px 0 7px}img.nob{border:none}p.banner{font-weight:500;line-height:1.1;color:#fff;font-size:22px;margin:14px 0 18px 0}.bp{line-height:1.3em}{% endraw %} +{% raw %}hr,img{border:0}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size:18px;background:#fefefe}body{margin:0;font:18px Georgia,serif;line-height:1.4;color:#222;padding:0}img{vertical-align:middle}hr{height:0;box-sizing:content-box;margin:21px 0;border-top:1px solid #eee}h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",sans-serif;font-weight:500;line-height:1.1;color:#000}h1,h2,h3{margin:32px 0 6px}h1{font-size:40px}h2{font-size:28px}h3{font-size:22px}h4,h5,h6{margin:11px 0;font-size:18px}p{margin:0 0 12px}ol,ul{margin:0 0 10px}code,pre{font:"Courier New",monospace;border-radius:4px;background-color:#f4f9ff;font-size:12px}code{padding:2px 4px;white-space:nowrap}pre{overflow:scroll;white-space:pre;display:block;padding:10px;margin:0 0 11px;line-height:1.4;word-break:break-all;word-wrap:break-word;border:1px solid #ccc}.cn{padding:0 15px 0 15px;margin-right:auto;margin-left:auto}.cn:before,.cn:after{display:table;content:" "}.cn:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.c2,.c3,.c4,.c5,.c6,.c7,.c8,.c9,.c10,.c11,.c12{position:relative;min-height:1px;padding:0 15px 0 15px}a{background:transparent;text-decoration:none;border-bottom:1px dotted;color:#444}a:hover{text-decoration:none;color:#000}.ft{padding:0 0 24px;float:right}.sns{font-family:"Helvetica Neue",sans-serif}.sps{font-size:14px}.hd{margin:20px 0 15px 0}.hd>a{border-bottom:none}img.hdr{vertical-align:middle;border:none;height:52px;width:52px;padding:1px}.hdt a,.hdt a:hover{font:72px "Helvetica Neue",sans-serif;font-weight:normal;letter-spacing:.03em;vertical-align:middle;margin-left:5px;color:#000;text-decoration:none;border-bottom:none;line-height:.9em}.bk{margin:0 5px 0 5px}img.nob{border:none}p.banner{font-weight:500;line-height:1.1;color:#fff;font-size:22px;margin:14px 0 18px 0}.bp{line-height:1.3em}{% endraw %} diff --git a/theme/templates/subnav.html b/theme/templates/subnav.html index f62d56cee..cbf4e08e9 100644 --- a/theme/templates/subnav.html +++ b/theme/templates/subnav.html @@ -2,9 +2,9 @@ All topics | Blog | +Supporter's Edition | @fullstackpython | Facebook | -Books & Videos | What's new?